From 4f5db9ab26d22f725779e7de79ae849b6c3a9608 Mon Sep 17 00:00:00 2001 From: rui hildt Date: Mon, 12 Oct 2020 11:27:15 +0200 Subject: [PATCH] Add initial version of dijkstra backend cloudron image --- .dockerignore | 5 + CloudronManifest.json | 16 + Dockerfile | 13 + README.md | 10 + api/models/citiesModel.js | 22 + api/models/countriesModel.js | 16 + api/models/roadsModel.js | 9 + api/routes/citiesRouter.js | 14 + api/routes/countriesRouter.js | 14 + api/routes/pathRouter.js | 43 + api/routes/roadsRouter.js | 13 + api/server.js | 21 + data/dbConfig.js | 7 + data/migrations/20200207155645_countries.js | 13 + data/migrations/20200207160031_cities.js | 20 + data/migrations/20200207160304_roads.js | 32 + data/seeds/01-countries.js | 12 + data/seeds/02-cities.js | 58 + data/seeds/03-roads.js | 92 + helpers/dijkstra_algo.js | 55 + helpers/graph.js | 18 + helpers/queue.js | 21 + index.js | 12 + knexfile.js | 23 + node_modules/.bin/atob | 1 + node_modules/.bin/detect-libc | 1 + node_modules/.bin/is-ci | 1 + node_modules/.bin/knex | 1 + node_modules/.bin/mime | 1 + node_modules/.bin/mkdirp | 1 + node_modules/.bin/needle | 1 + node_modules/.bin/node-pre-gyp | 1 + node_modules/.bin/nodemon | 1 + node_modules/.bin/nodetouch | 1 + node_modules/.bin/nopt | 1 + node_modules/.bin/rc | 1 + node_modules/.bin/rimraf | 1 + node_modules/.bin/semver | 1 + node_modules/.bin/sshpk-conv | 1 + node_modules/.bin/sshpk-sign | 1 + node_modules/.bin/sshpk-verify | 1 + node_modules/.bin/uuid | 1 + node_modules/.bin/which | 1 + ...22317bd6047fa74fae07b2d225b8d12d13f59a2fd9 | 1 + ...16260e736a4bb680508347463b756b6f36981e164c | 2 + node_modules/abbrev/LICENSE | 46 + node_modules/abbrev/README.md | 23 + node_modules/abbrev/abbrev.js | 61 + node_modules/abbrev/package.json | 60 + node_modules/accepts/HISTORY.md | 236 + node_modules/accepts/LICENSE | 23 + node_modules/accepts/README.md | 142 + node_modules/accepts/index.js | 238 + node_modules/accepts/package.json | 89 + node_modules/ajv/.tonic_example.js | 20 + node_modules/ajv/LICENSE | 22 + node_modules/ajv/README.md | 1380 ++ node_modules/ajv/dist/ajv.bundle.js | 7163 +++++++ node_modules/ajv/dist/ajv.min.js | 3 + node_modules/ajv/dist/ajv.min.js.map | 1 + node_modules/ajv/lib/ajv.d.ts | 391 + node_modules/ajv/lib/ajv.js | 497 + node_modules/ajv/lib/cache.js | 26 + node_modules/ajv/lib/compile/async.js | 90 + node_modules/ajv/lib/compile/equal.js | 5 + node_modules/ajv/lib/compile/error_classes.js | 34 + node_modules/ajv/lib/compile/formats.js | 149 + node_modules/ajv/lib/compile/index.js | 387 + node_modules/ajv/lib/compile/resolve.js | 270 + node_modules/ajv/lib/compile/rules.js | 66 + node_modules/ajv/lib/compile/schema_obj.js | 9 + node_modules/ajv/lib/compile/ucs2length.js | 20 + node_modules/ajv/lib/compile/util.js | 274 + node_modules/ajv/lib/data.js | 49 + node_modules/ajv/lib/definition_schema.js | 37 + node_modules/ajv/lib/dot/_limit.jst | 104 + node_modules/ajv/lib/dot/_limitItems.jst | 10 + node_modules/ajv/lib/dot/_limitLength.jst | 10 + node_modules/ajv/lib/dot/_limitProperties.jst | 10 + node_modules/ajv/lib/dot/allOf.jst | 34 + node_modules/ajv/lib/dot/anyOf.jst | 48 + node_modules/ajv/lib/dot/coerce.def | 61 + node_modules/ajv/lib/dot/comment.jst | 9 + node_modules/ajv/lib/dot/const.jst | 11 + node_modules/ajv/lib/dot/contains.jst | 57 + node_modules/ajv/lib/dot/custom.jst | 191 + node_modules/ajv/lib/dot/defaults.def | 47 + node_modules/ajv/lib/dot/definitions.def | 201 + node_modules/ajv/lib/dot/dependencies.jst | 80 + node_modules/ajv/lib/dot/enum.jst | 30 + node_modules/ajv/lib/dot/errors.def | 194 + node_modules/ajv/lib/dot/format.jst | 106 + node_modules/ajv/lib/dot/if.jst | 75 + node_modules/ajv/lib/dot/items.jst | 100 + node_modules/ajv/lib/dot/missing.def | 39 + node_modules/ajv/lib/dot/multipleOf.jst | 20 + node_modules/ajv/lib/dot/not.jst | 43 + node_modules/ajv/lib/dot/oneOf.jst | 54 + node_modules/ajv/lib/dot/pattern.jst | 14 + node_modules/ajv/lib/dot/properties.jst | 244 + node_modules/ajv/lib/dot/propertyNames.jst | 54 + node_modules/ajv/lib/dot/ref.jst | 85 + node_modules/ajv/lib/dot/required.jst | 108 + node_modules/ajv/lib/dot/uniqueItems.jst | 62 + node_modules/ajv/lib/dot/validate.jst | 282 + node_modules/ajv/lib/dotjs/README.md | 3 + node_modules/ajv/lib/dotjs/_limit.js | 157 + node_modules/ajv/lib/dotjs/_limitItems.js | 77 + node_modules/ajv/lib/dotjs/_limitLength.js | 82 + .../ajv/lib/dotjs/_limitProperties.js | 77 + node_modules/ajv/lib/dotjs/allOf.js | 43 + node_modules/ajv/lib/dotjs/anyOf.js | 74 + node_modules/ajv/lib/dotjs/comment.js | 14 + node_modules/ajv/lib/dotjs/const.js | 56 + node_modules/ajv/lib/dotjs/contains.js | 82 + node_modules/ajv/lib/dotjs/custom.js | 228 + node_modules/ajv/lib/dotjs/dependencies.js | 168 + node_modules/ajv/lib/dotjs/enum.js | 66 + node_modules/ajv/lib/dotjs/format.js | 150 + node_modules/ajv/lib/dotjs/if.js | 104 + node_modules/ajv/lib/dotjs/index.js | 33 + node_modules/ajv/lib/dotjs/items.js | 141 + node_modules/ajv/lib/dotjs/multipleOf.js | 77 + node_modules/ajv/lib/dotjs/not.js | 84 + node_modules/ajv/lib/dotjs/oneOf.js | 73 + node_modules/ajv/lib/dotjs/pattern.js | 75 + node_modules/ajv/lib/dotjs/properties.js | 330 + node_modules/ajv/lib/dotjs/propertyNames.js | 82 + node_modules/ajv/lib/dotjs/ref.js | 124 + node_modules/ajv/lib/dotjs/required.js | 270 + node_modules/ajv/lib/dotjs/uniqueItems.js | 86 + node_modules/ajv/lib/dotjs/validate.js | 494 + node_modules/ajv/lib/keyword.js | 146 + node_modules/ajv/lib/refs/data.json | 17 + .../ajv/lib/refs/json-schema-draft-04.json | 149 + .../ajv/lib/refs/json-schema-draft-06.json | 154 + .../ajv/lib/refs/json-schema-draft-07.json | 168 + .../ajv/lib/refs/json-schema-secure.json | 94 + node_modules/ajv/package.json | 128 + node_modules/ajv/scripts/.eslintrc.yml | 3 + node_modules/ajv/scripts/bundle.js | 61 + node_modules/ajv/scripts/compile-dots.js | 73 + node_modules/ajv/scripts/info | 10 + node_modules/ajv/scripts/prepare-tests | 12 + .../ajv/scripts/publish-built-version | 32 + node_modules/ajv/scripts/travis-gh-pages | 23 + node_modules/ansi-align/CHANGELOG.md | 36 + node_modules/ansi-align/LICENSE | 13 + node_modules/ansi-align/README.md | 79 + node_modules/ansi-align/index.js | 61 + .../node_modules/ansi-regex/index.js | 10 + .../node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 89 + .../node_modules/ansi-regex/readme.md | 46 + .../is-fullwidth-code-point/index.js | 46 + .../is-fullwidth-code-point/license | 21 + .../is-fullwidth-code-point/package.json | 81 + .../is-fullwidth-code-point/readme.md | 39 + .../node_modules/string-width/index.js | 36 + .../node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 91 + .../node_modules/string-width/readme.md | 42 + .../node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 88 + .../node_modules/strip-ansi/readme.md | 39 + node_modules/ansi-align/package.json | 74 + node_modules/ansi-regex/index.js | 4 + node_modules/ansi-regex/license | 21 + node_modules/ansi-regex/package.json | 111 + node_modules/ansi-regex/readme.md | 39 + node_modules/ansi-styles/index.js | 165 + node_modules/ansi-styles/license | 9 + node_modules/ansi-styles/package.json | 92 + node_modules/ansi-styles/readme.md | 147 + node_modules/anymatch/LICENSE | 15 + node_modules/anymatch/README.md | 87 + node_modules/anymatch/index.d.ts | 19 + node_modules/anymatch/index.js | 102 + node_modules/anymatch/package.json | 80 + node_modules/aproba/LICENSE | 14 + node_modules/aproba/README.md | 94 + node_modules/aproba/index.js | 105 + node_modules/aproba/package.json | 65 + node_modules/are-we-there-yet/CHANGES.md | 37 + node_modules/are-we-there-yet/LICENSE | 5 + node_modules/are-we-there-yet/README.md | 195 + node_modules/are-we-there-yet/index.js | 4 + node_modules/are-we-there-yet/package.json | 66 + node_modules/are-we-there-yet/tracker-base.js | 11 + .../are-we-there-yet/tracker-group.js | 107 + .../are-we-there-yet/tracker-stream.js | 36 + node_modules/are-we-there-yet/tracker.js | 30 + node_modules/arr-diff/LICENSE | 21 + node_modules/arr-diff/README.md | 130 + node_modules/arr-diff/index.js | 47 + node_modules/arr-diff/package.json | 112 + node_modules/arr-flatten/LICENSE | 21 + node_modules/arr-flatten/README.md | 86 + node_modules/arr-flatten/index.js | 22 + node_modules/arr-flatten/package.json | 116 + node_modules/arr-union/LICENSE | 21 + node_modules/arr-union/README.md | 99 + node_modules/arr-union/index.js | 29 + node_modules/arr-union/package.json | 111 + node_modules/array-each/LICENSE | 21 + node_modules/array-each/README.md | 84 + node_modules/array-each/index.js | 46 + node_modules/array-each/package.json | 84 + node_modules/array-flatten/LICENSE | 21 + node_modules/array-flatten/README.md | 43 + node_modules/array-flatten/array-flatten.js | 64 + node_modules/array-flatten/package.json | 67 + node_modules/array-slice/LICENSE | 21 + node_modules/array-slice/README.md | 82 + node_modules/array-slice/index.js | 33 + node_modules/array-slice/package.json | 88 + node_modules/array-unique/LICENSE | 21 + node_modules/array-unique/README.md | 77 + node_modules/array-unique/index.js | 43 + node_modules/array-unique/package.json | 99 + node_modules/asn1/LICENSE | 19 + node_modules/asn1/README.md | 50 + node_modules/asn1/lib/ber/errors.js | 13 + node_modules/asn1/lib/ber/index.js | 27 + node_modules/asn1/lib/ber/reader.js | 262 + node_modules/asn1/lib/ber/types.js | 36 + node_modules/asn1/lib/ber/writer.js | 317 + node_modules/asn1/lib/index.js | 20 + node_modules/asn1/package.json | 78 + node_modules/assert-plus/AUTHORS | 6 + node_modules/assert-plus/CHANGES.md | 14 + node_modules/assert-plus/README.md | 162 + node_modules/assert-plus/assert.js | 211 + node_modules/assert-plus/package.json | 90 + node_modules/assign-symbols/LICENSE | 21 + node_modules/assign-symbols/README.md | 73 + node_modules/assign-symbols/index.js | 40 + node_modules/assign-symbols/package.json | 74 + node_modules/asynckit/LICENSE | 21 + node_modules/asynckit/README.md | 233 + node_modules/asynckit/bench.js | 76 + node_modules/asynckit/index.js | 6 + node_modules/asynckit/lib/abort.js | 29 + node_modules/asynckit/lib/async.js | 34 + node_modules/asynckit/lib/defer.js | 26 + node_modules/asynckit/lib/iterate.js | 75 + .../asynckit/lib/readable_asynckit.js | 91 + .../asynckit/lib/readable_parallel.js | 25 + node_modules/asynckit/lib/readable_serial.js | 25 + .../asynckit/lib/readable_serial_ordered.js | 29 + node_modules/asynckit/lib/state.js | 37 + node_modules/asynckit/lib/streamify.js | 141 + node_modules/asynckit/lib/terminator.js | 29 + node_modules/asynckit/package.json | 94 + node_modules/asynckit/parallel.js | 43 + node_modules/asynckit/serial.js | 17 + node_modules/asynckit/serialOrdered.js | 75 + node_modules/asynckit/stream.js | 21 + node_modules/atob/LICENSE | 230 + node_modules/atob/LICENSE.DOCS | 319 + node_modules/atob/README.md | 49 + node_modules/atob/bin/atob.js | 6 + node_modules/atob/bower.json | 24 + node_modules/atob/browser-atob.js | 44 + node_modules/atob/node-atob.js | 7 + node_modules/atob/package.json | 56 + node_modules/atob/test.js | 18 + node_modules/aws-sign2/LICENSE | 55 + node_modules/aws-sign2/README.md | 4 + node_modules/aws-sign2/index.js | 212 + node_modules/aws-sign2/package.json | 53 + node_modules/aws4/.travis.yml | 9 + node_modules/aws4/LICENSE | 19 + node_modules/aws4/README.md | 523 + node_modules/aws4/aws4.js | 345 + node_modules/aws4/lru.js | 96 + node_modules/aws4/package.json | 108 + node_modules/balanced-match/.npmignore | 5 + node_modules/balanced-match/LICENSE.md | 21 + node_modules/balanced-match/README.md | 91 + node_modules/balanced-match/index.js | 59 + node_modules/balanced-match/package.json | 80 + node_modules/base/LICENSE | 21 + node_modules/base/README.md | 491 + node_modules/base/index.js | 435 + .../base/node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 95 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 96 + .../is-accessor-descriptor/LICENSE | 21 + .../is-accessor-descriptor/README.md | 144 + .../is-accessor-descriptor/index.js | 69 + .../is-accessor-descriptor/package.json | 113 + .../node_modules/is-data-descriptor/LICENSE | 21 + .../node_modules/is-data-descriptor/README.md | 161 + .../node_modules/is-data-descriptor/index.js | 49 + .../is-data-descriptor/package.json | 112 + .../base/node_modules/is-descriptor/LICENSE | 21 + .../base/node_modules/is-descriptor/README.md | 193 + .../base/node_modules/is-descriptor/index.js | 22 + .../node_modules/is-descriptor/package.json | 117 + node_modules/base/package.json | 167 + node_modules/bcrypt-pbkdf/CONTRIBUTING.md | 13 + node_modules/bcrypt-pbkdf/LICENSE | 66 + node_modules/bcrypt-pbkdf/README.md | 45 + node_modules/bcrypt-pbkdf/index.js | 556 + node_modules/bcrypt-pbkdf/package.json | 47 + .../binary-extensions/binary-extensions.json | 252 + .../binary-extensions.json.d.ts | 3 + node_modules/binary-extensions/index.d.ts | 14 + node_modules/binary-extensions/index.js | 1 + node_modules/binary-extensions/license | 9 + node_modules/binary-extensions/package.json | 74 + node_modules/binary-extensions/readme.md | 33 + node_modules/bluebird/LICENSE | 21 + node_modules/bluebird/README.md | 57 + node_modules/bluebird/changelog.md | 1 + .../bluebird/js/browser/bluebird.core.js | 3914 ++++ .../bluebird/js/browser/bluebird.core.min.js | 31 + node_modules/bluebird/js/browser/bluebird.js | 5778 ++++++ .../bluebird/js/browser/bluebird.min.js | 31 + node_modules/bluebird/js/release/any.js | 21 + node_modules/bluebird/js/release/assert.js | 55 + node_modules/bluebird/js/release/async.js | 120 + node_modules/bluebird/js/release/bind.js | 67 + node_modules/bluebird/js/release/bluebird.js | 11 + node_modules/bluebird/js/release/call_get.js | 123 + node_modules/bluebird/js/release/cancel.js | 129 + .../bluebird/js/release/catch_filter.js | 42 + node_modules/bluebird/js/release/context.js | 69 + .../bluebird/js/release/debuggability.js | 1009 + .../bluebird/js/release/direct_resolve.js | 46 + node_modules/bluebird/js/release/each.js | 30 + node_modules/bluebird/js/release/errors.js | 116 + node_modules/bluebird/js/release/es5.js | 80 + node_modules/bluebird/js/release/filter.js | 12 + node_modules/bluebird/js/release/finally.js | 146 + .../bluebird/js/release/generators.js | 223 + node_modules/bluebird/js/release/join.js | 165 + node_modules/bluebird/js/release/map.js | 175 + node_modules/bluebird/js/release/method.js | 55 + node_modules/bluebird/js/release/nodeback.js | 51 + node_modules/bluebird/js/release/nodeify.js | 58 + node_modules/bluebird/js/release/promise.js | 819 + .../bluebird/js/release/promise_array.js | 186 + node_modules/bluebird/js/release/promisify.js | 314 + node_modules/bluebird/js/release/props.js | 118 + node_modules/bluebird/js/release/queue.js | 73 + node_modules/bluebird/js/release/race.js | 49 + node_modules/bluebird/js/release/reduce.js | 183 + node_modules/bluebird/js/release/schedule.js | 62 + node_modules/bluebird/js/release/settle.js | 47 + node_modules/bluebird/js/release/some.js | 148 + .../js/release/synchronous_inspection.js | 103 + node_modules/bluebird/js/release/thenables.js | 86 + node_modules/bluebird/js/release/timers.js | 93 + node_modules/bluebird/js/release/using.js | 226 + node_modules/bluebird/js/release/util.js | 421 + node_modules/bluebird/package.json | 105 + node_modules/body-parser/HISTORY.md | 609 + node_modules/body-parser/LICENSE | 23 + node_modules/body-parser/README.md | 443 + node_modules/body-parser/index.js | 157 + node_modules/body-parser/lib/read.js | 181 + node_modules/body-parser/lib/types/json.js | 230 + node_modules/body-parser/lib/types/raw.js | 101 + node_modules/body-parser/lib/types/text.js | 121 + .../body-parser/lib/types/urlencoded.js | 284 + node_modules/body-parser/package.json | 94 + node_modules/bowser/CHANGELOG.md | 208 + node_modules/bowser/LICENSE | 39 + node_modules/bowser/README.md | 179 + node_modules/bowser/bundled.js | 1 + node_modules/bowser/bundled.js.gz | Bin 0 -> 35085 bytes node_modules/bowser/es5.js | 1 + node_modules/bowser/es5.js.gz | Bin 0 -> 5711 bytes node_modules/bowser/index.d.ts | 241 + node_modules/bowser/jsdoc.json | 24 + node_modules/bowser/package.json | 116 + node_modules/bowser/src/bowser.js | 77 + node_modules/bowser/src/constants.js | 116 + node_modules/bowser/src/parser-browsers.js | 670 + node_modules/bowser/src/parser-engines.js | 120 + node_modules/bowser/src/parser-os.js | 196 + node_modules/bowser/src/parser-platforms.js | 266 + node_modules/bowser/src/parser.js | 493 + node_modules/bowser/src/utils.js | 309 + node_modules/bowser/webpack.config.js | 43 + node_modules/boxen/index.js | 138 + node_modules/boxen/license | 9 + .../boxen/node_modules/ansi-regex/index.js | 10 + .../boxen/node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 89 + .../boxen/node_modules/ansi-regex/readme.md | 46 + .../is-fullwidth-code-point/index.js | 46 + .../is-fullwidth-code-point/license | 21 + .../is-fullwidth-code-point/package.json | 81 + .../is-fullwidth-code-point/readme.md | 39 + .../boxen/node_modules/string-width/index.js | 36 + .../boxen/node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 91 + .../boxen/node_modules/string-width/readme.md | 42 + .../boxen/node_modules/strip-ansi/index.js | 4 + .../boxen/node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 88 + .../boxen/node_modules/strip-ansi/readme.md | 39 + node_modules/boxen/package.json | 83 + node_modules/boxen/readme.md | 175 + node_modules/brace-expansion/LICENSE | 21 + node_modules/brace-expansion/README.md | 129 + node_modules/brace-expansion/index.js | 201 + node_modules/brace-expansion/package.json | 78 + node_modules/braces/LICENSE | 21 + node_modules/braces/README.md | 640 + node_modules/braces/index.js | 318 + node_modules/braces/lib/braces.js | 104 + node_modules/braces/lib/compilers.js | 282 + node_modules/braces/lib/parsers.js | 360 + node_modules/braces/lib/utils.js | 343 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 61 + .../node_modules/extend-shallow/index.js | 33 + .../node_modules/extend-shallow/package.json | 90 + node_modules/braces/package.json | 159 + node_modules/bytes/History.md | 87 + node_modules/bytes/LICENSE | 23 + node_modules/bytes/Readme.md | 126 + node_modules/bytes/index.js | 162 + node_modules/bytes/package.json | 87 + node_modules/cache-base/LICENSE | 21 + node_modules/cache-base/README.md | 291 + node_modules/cache-base/index.js | 261 + node_modules/cache-base/package.json | 121 + node_modules/camelcase/index.js | 64 + node_modules/camelcase/license | 21 + node_modules/camelcase/package.json | 78 + node_modules/camelcase/readme.md | 57 + node_modules/camelize/.travis.yml | 4 + node_modules/camelize/LICENSE | 18 + node_modules/camelize/example/camel.js | 10 + node_modules/camelize/index.js | 59 + node_modules/camelize/package.json | 83 + node_modules/camelize/readme.markdown | 62 + node_modules/camelize/test/camel.js | 46 + node_modules/capture-stack-trace/index.js | 18 + node_modules/capture-stack-trace/license | 21 + node_modules/capture-stack-trace/package.json | 65 + node_modules/capture-stack-trace/readme.md | 36 + node_modules/caseless/LICENSE | 28 + node_modules/caseless/README.md | 45 + node_modules/caseless/index.js | 67 + node_modules/caseless/package.json | 59 + node_modules/caseless/test.js | 67 + node_modules/chalk/index.js | 228 + node_modules/chalk/index.js.flow | 93 + node_modules/chalk/license | 9 + node_modules/chalk/package.json | 108 + node_modules/chalk/readme.md | 314 + node_modules/chalk/templates.js | 128 + node_modules/chalk/types/index.d.ts | 97 + node_modules/chokidar/LICENSE | 21 + node_modules/chokidar/README.md | 300 + node_modules/chokidar/index.js | 936 + node_modules/chokidar/lib/constants.js | 60 + node_modules/chokidar/lib/fsevents-handler.js | 516 + node_modules/chokidar/lib/nodefs-handler.js | 637 + .../chokidar/node_modules/braces/CHANGELOG.md | 184 + .../chokidar/node_modules/braces/LICENSE | 21 + .../chokidar/node_modules/braces/README.md | 593 + .../chokidar/node_modules/braces/index.js | 170 + .../node_modules/braces/lib/compile.js | 57 + .../node_modules/braces/lib/constants.js | 57 + .../node_modules/braces/lib/expand.js | 113 + .../chokidar/node_modules/braces/lib/parse.js | 333 + .../node_modules/braces/lib/stringify.js | 32 + .../chokidar/node_modules/braces/lib/utils.js | 112 + .../chokidar/node_modules/braces/package.json | 127 + .../chokidar/node_modules/fill-range/LICENSE | 21 + .../node_modules/fill-range/README.md | 237 + .../chokidar/node_modules/fill-range/index.js | 249 + .../node_modules/fill-range/package.json | 118 + .../chokidar/node_modules/is-number/LICENSE | 21 + .../chokidar/node_modules/is-number/README.md | 187 + .../chokidar/node_modules/is-number/index.js | 18 + .../node_modules/is-number/package.json | 126 + .../node_modules/to-regex-range/LICENSE | 21 + .../node_modules/to-regex-range/README.md | 305 + .../node_modules/to-regex-range/index.js | 288 + .../node_modules/to-regex-range/package.json | 129 + node_modules/chokidar/package.json | 166 + node_modules/chokidar/types/index.d.ts | 187 + node_modules/chownr/LICENSE | 15 + node_modules/chownr/README.md | 3 + node_modules/chownr/chownr.js | 125 + node_modules/chownr/package.json | 62 + node_modules/ci-info/CHANGELOG.md | 62 + node_modules/ci-info/LICENSE | 21 + node_modules/ci-info/README.md | 107 + node_modules/ci-info/index.js | 66 + node_modules/ci-info/package.json | 69 + node_modules/ci-info/vendors.json | 152 + node_modules/class-utils/LICENSE | 21 + node_modules/class-utils/README.md | 300 + node_modules/class-utils/index.js | 370 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 77 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 85 + node_modules/class-utils/package.json | 134 + node_modules/cli-boxes/boxes.json | 50 + node_modules/cli-boxes/index.js | 2 + node_modules/cli-boxes/license | 21 + node_modules/cli-boxes/package.json | 75 + node_modules/cli-boxes/readme.md | 94 + node_modules/code-point-at/index.js | 32 + node_modules/code-point-at/license | 21 + node_modules/code-point-at/package.json | 73 + node_modules/code-point-at/readme.md | 32 + node_modules/collection-visit/LICENSE | 21 + node_modules/collection-visit/README.md | 89 + node_modules/collection-visit/index.js | 30 + node_modules/collection-visit/package.json | 118 + node_modules/color-convert/CHANGELOG.md | 54 + node_modules/color-convert/LICENSE | 21 + node_modules/color-convert/README.md | 68 + node_modules/color-convert/conversions.js | 868 + node_modules/color-convert/index.js | 78 + node_modules/color-convert/package.json | 85 + node_modules/color-convert/route.js | 97 + node_modules/color-name/.eslintrc.json | 43 + node_modules/color-name/.npmignore | 107 + node_modules/color-name/LICENSE | 8 + node_modules/color-name/README.md | 11 + node_modules/color-name/index.js | 152 + node_modules/color-name/package.json | 57 + node_modules/color-name/test.js | 7 + node_modules/colorette/LICENSE.md | 7 + node_modules/colorette/README.md | 117 + node_modules/colorette/colorette.d.ts | 48 + node_modules/colorette/index.js | 76 + node_modules/colorette/package.json | 66 + node_modules/combined-stream/License | 19 + node_modules/combined-stream/Readme.md | 138 + .../combined-stream/lib/combined_stream.js | 208 + node_modules/combined-stream/package.json | 61 + node_modules/combined-stream/yarn.lock | 17 + node_modules/commander/CHANGELOG.md | 436 + node_modules/commander/LICENSE | 22 + node_modules/commander/Readme.md | 713 + node_modules/commander/index.js | 1649 ++ node_modules/commander/package.json | 76 + node_modules/commander/typings/index.d.ts | 311 + node_modules/component-emitter/History.md | 75 + node_modules/component-emitter/LICENSE | 24 + node_modules/component-emitter/Readme.md | 74 + node_modules/component-emitter/index.js | 175 + node_modules/component-emitter/package.json | 60 + node_modules/concat-map/.travis.yml | 4 + node_modules/concat-map/LICENSE | 18 + node_modules/concat-map/README.markdown | 62 + node_modules/concat-map/example/map.js | 6 + node_modules/concat-map/index.js | 13 + node_modules/concat-map/package.json | 91 + node_modules/concat-map/test/map.js | 39 + node_modules/configstore/index.js | 106 + node_modules/configstore/license | 9 + node_modules/configstore/package.json | 83 + node_modules/configstore/readme.md | 116 + node_modules/console-control-strings/LICENSE | 13 + .../console-control-strings/README.md | 145 + .../console-control-strings/README.md~ | 140 + node_modules/console-control-strings/index.js | 125 + .../console-control-strings/package.json | 64 + node_modules/content-disposition/HISTORY.md | 55 + node_modules/content-disposition/LICENSE | 22 + node_modules/content-disposition/README.md | 148 + node_modules/content-disposition/index.js | 458 + node_modules/content-disposition/package.json | 82 + .../CHANGELOG.md | 11 + .../content-security-policy-builder/LICENSE | 21 + .../content-security-policy-builder/README.md | 23 + .../dist/index.d.ts | 7 + .../dist/index.js | 33 + .../package.json | 86 + node_modules/content-type/HISTORY.md | 24 + node_modules/content-type/LICENSE | 22 + node_modules/content-type/README.md | 92 + node_modules/content-type/index.js | 222 + node_modules/content-type/package.json | 79 + node_modules/cookie-signature/.npmignore | 4 + node_modules/cookie-signature/History.md | 38 + node_modules/cookie-signature/Readme.md | 42 + node_modules/cookie-signature/index.js | 51 + node_modules/cookie-signature/package.json | 60 + node_modules/cookie/HISTORY.md | 123 + node_modules/cookie/LICENSE | 24 + node_modules/cookie/README.md | 253 + node_modules/cookie/index.js | 198 + node_modules/cookie/package.json | 81 + node_modules/copy-descriptor/LICENSE | 21 + node_modules/copy-descriptor/index.js | 81 + node_modules/copy-descriptor/package.json | 90 + node_modules/core-util-is/LICENSE | 19 + 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 | 66 + node_modules/core-util-is/test.js | 68 + node_modules/cors/CONTRIBUTING.md | 33 + node_modules/cors/HISTORY.md | 58 + node_modules/cors/LICENSE | 22 + node_modules/cors/README.md | 243 + node_modules/cors/lib/index.js | 238 + node_modules/cors/package.json | 80 + node_modules/create-error-class/index.js | 44 + node_modules/create-error-class/license | 21 + node_modules/create-error-class/package.json | 64 + node_modules/create-error-class/readme.md | 54 + node_modules/cross-spawn/CHANGELOG.md | 6 + node_modules/cross-spawn/LICENSE | 19 + node_modules/cross-spawn/README.md | 85 + node_modules/cross-spawn/index.js | 59 + node_modules/cross-spawn/lib/enoent.js | 73 + node_modules/cross-spawn/lib/parse.js | 113 + .../cross-spawn/lib/util/escapeArgument.js | 30 + .../cross-spawn/lib/util/escapeCommand.js | 12 + .../lib/util/hasEmptyArgumentBug.js | 18 + .../cross-spawn/lib/util/readShebang.js | 37 + .../cross-spawn/lib/util/resolveCommand.js | 31 + node_modules/cross-spawn/package.json | 87 + node_modules/crypto-random-string/index.js | 10 + node_modules/crypto-random-string/license | 21 + .../crypto-random-string/package.json | 79 + node_modules/crypto-random-string/readme.md | 49 + node_modules/dashdash/CHANGES.md | 364 + node_modules/dashdash/LICENSE.txt | 24 + node_modules/dashdash/README.md | 574 + .../dashdash/etc/dashdash.bash_completion.in | 389 + node_modules/dashdash/lib/dashdash.js | 1055 + node_modules/dashdash/package.json | 70 + node_modules/dasherize/.jshintrc | 27 + node_modules/dasherize/.travis.yml | 4 + node_modules/dasherize/LICENSE | 18 + node_modules/dasherize/example/dash.js | 12 + node_modules/dasherize/index.js | 75 + node_modules/dasherize/package.json | 81 + node_modules/dasherize/readme.markdown | 68 + node_modules/dasherize/test/dash.js | 64 + node_modules/debug/.coveralls.yml | 1 + node_modules/debug/.eslintrc | 11 + node_modules/debug/.npmignore | 9 + node_modules/debug/.travis.yml | 14 + node_modules/debug/CHANGELOG.md | 362 + node_modules/debug/LICENSE | 19 + node_modules/debug/Makefile | 50 + node_modules/debug/README.md | 312 + node_modules/debug/component.json | 19 + node_modules/debug/karma.conf.js | 70 + node_modules/debug/node.js | 1 + node_modules/debug/package.json | 97 + node_modules/debug/src/browser.js | 185 + node_modules/debug/src/debug.js | 202 + node_modules/debug/src/index.js | 10 + node_modules/debug/src/inspector-log.js | 15 + node_modules/debug/src/node.js | 248 + node_modules/decode-uri-component/index.js | 94 + node_modules/decode-uri-component/license | 21 + .../decode-uri-component/package.json | 72 + node_modules/decode-uri-component/readme.md | 70 + node_modules/deep-extend/CHANGELOG.md | 46 + node_modules/deep-extend/LICENSE | 20 + node_modules/deep-extend/README.md | 91 + node_modules/deep-extend/index.js | 1 + node_modules/deep-extend/lib/deep-extend.js | 150 + node_modules/deep-extend/package.json | 95 + node_modules/define-property/CHANGELOG.md | 82 + node_modules/define-property/LICENSE | 21 + node_modules/define-property/README.md | 117 + node_modules/define-property/index.js | 38 + .../is-accessor-descriptor/LICENSE | 21 + .../is-accessor-descriptor/README.md | 144 + .../is-accessor-descriptor/index.js | 69 + .../is-accessor-descriptor/package.json | 113 + .../node_modules/is-data-descriptor/LICENSE | 21 + .../node_modules/is-data-descriptor/README.md | 161 + .../node_modules/is-data-descriptor/index.js | 49 + .../is-data-descriptor/package.json | 112 + .../node_modules/is-descriptor/LICENSE | 21 + .../node_modules/is-descriptor/README.md | 193 + .../node_modules/is-descriptor/index.js | 22 + .../node_modules/is-descriptor/package.json | 117 + node_modules/define-property/package.json | 111 + node_modules/delayed-stream/.npmignore | 1 + node_modules/delayed-stream/License | 19 + node_modules/delayed-stream/Makefile | 7 + node_modules/delayed-stream/Readme.md | 141 + .../delayed-stream/lib/delayed_stream.js | 107 + node_modules/delayed-stream/package.json | 65 + node_modules/delegates/.npmignore | 1 + node_modules/delegates/History.md | 22 + node_modules/delegates/License | 20 + node_modules/delegates/Makefile | 8 + node_modules/delegates/Readme.md | 94 + node_modules/delegates/index.js | 121 + node_modules/delegates/package.json | 51 + node_modules/delegates/test/index.js | 94 + node_modules/depd/History.md | 96 + node_modules/depd/LICENSE | 22 + node_modules/depd/Readme.md | 280 + node_modules/depd/index.js | 522 + node_modules/depd/lib/browser/index.js | 77 + .../depd/lib/compat/callsite-tostring.js | 103 + .../depd/lib/compat/event-listener-count.js | 22 + node_modules/depd/lib/compat/index.js | 79 + node_modules/depd/package.json | 82 + node_modules/destroy/LICENSE | 22 + node_modules/destroy/README.md | 60 + node_modules/destroy/index.js | 75 + node_modules/destroy/package.json | 74 + node_modules/detect-file/LICENSE | 21 + node_modules/detect-file/README.md | 99 + node_modules/detect-file/index.js | 109 + node_modules/detect-file/package.json | 94 + node_modules/detect-libc/.npmignore | 7 + node_modules/detect-libc/LICENSE | 201 + node_modules/detect-libc/README.md | 78 + node_modules/detect-libc/bin/detect-libc.js | 18 + node_modules/detect-libc/lib/detect-libc.js | 92 + node_modules/detect-libc/package.json | 73 + .../dns-prefetch-control/CHANGELOG.md | 12 + node_modules/dns-prefetch-control/LICENSE | 21 + node_modules/dns-prefetch-control/README.md | 20 + .../dns-prefetch-control/dist/index.d.ts | 7 + .../dns-prefetch-control/dist/index.js | 16 + .../dns-prefetch-control/package.json | 91 + node_modules/dont-sniff-mimetype/CHANGELOG.md | 12 + node_modules/dont-sniff-mimetype/LICENSE | 21 + node_modules/dont-sniff-mimetype/README.md | 18 + .../dont-sniff-mimetype/dist/index.d.ts | 4 + .../dont-sniff-mimetype/dist/index.js | 7 + node_modules/dont-sniff-mimetype/package.json | 97 + node_modules/dot-prop/index.js | 141 + node_modules/dot-prop/license | 21 + node_modules/dot-prop/package.json | 84 + node_modules/dot-prop/readme.md | 105 + node_modules/duplexer3/LICENSE.md | 26 + node_modules/duplexer3/README.md | 115 + node_modules/duplexer3/index.js | 76 + node_modules/duplexer3/package.json | 68 + node_modules/ecc-jsbn/LICENSE | 21 + node_modules/ecc-jsbn/README.md | 8 + node_modules/ecc-jsbn/index.js | 58 + node_modules/ecc-jsbn/lib/LICENSE-jsbn | 40 + node_modules/ecc-jsbn/lib/ec.js | 561 + node_modules/ecc-jsbn/lib/sec.js | 170 + node_modules/ecc-jsbn/package.json | 68 + node_modules/ecc-jsbn/test.js | 14 + node_modules/ee-first/LICENSE | 22 + node_modules/ee-first/README.md | 80 + node_modules/ee-first/index.js | 95 + node_modules/ee-first/package.json | 66 + node_modules/encodeurl/HISTORY.md | 14 + node_modules/encodeurl/LICENSE | 22 + node_modules/encodeurl/README.md | 128 + node_modules/encodeurl/index.js | 60 + node_modules/encodeurl/package.json | 81 + node_modules/escape-html/LICENSE | 24 + node_modules/escape-html/Readme.md | 43 + node_modules/escape-html/index.js | 78 + node_modules/escape-html/package.json | 62 + node_modules/escape-string-regexp/index.js | 11 + node_modules/escape-string-regexp/license | 21 + .../escape-string-regexp/package.json | 85 + node_modules/escape-string-regexp/readme.md | 27 + node_modules/esm/LICENSE | 23 + node_modules/esm/README.md | 137 + node_modules/esm/esm.js | 1 + node_modules/esm/esm/loader.js | 1 + node_modules/esm/index.js | 1 + node_modules/esm/package.json | 73 + node_modules/etag/HISTORY.md | 83 + node_modules/etag/LICENSE | 22 + node_modules/etag/README.md | 159 + node_modules/etag/index.js | 131 + node_modules/etag/package.json | 89 + node_modules/execa/index.js | 309 + node_modules/execa/lib/errname.js | 37 + node_modules/execa/lib/stdio.js | 41 + node_modules/execa/license | 9 + node_modules/execa/package.json | 112 + node_modules/execa/readme.md | 279 + node_modules/expand-brackets/LICENSE | 21 + node_modules/expand-brackets/README.md | 302 + node_modules/expand-brackets/changelog.md | 35 + node_modules/expand-brackets/index.js | 211 + node_modules/expand-brackets/lib/compilers.js | 87 + node_modules/expand-brackets/lib/parsers.js | 219 + node_modules/expand-brackets/lib/utils.js | 34 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 77 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 85 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 61 + .../node_modules/extend-shallow/index.js | 33 + .../node_modules/extend-shallow/package.json | 90 + node_modules/expand-brackets/package.json | 136 + node_modules/expand-tilde/LICENSE | 21 + node_modules/expand-tilde/README.md | 80 + node_modules/expand-tilde/index.js | 22 + node_modules/expand-tilde/package.json | 103 + node_modules/expect-ct/CHANGELOG.md | 11 + node_modules/expect-ct/LICENSE | 21 + node_modules/expect-ct/README.md | 27 + node_modules/expect-ct/dist/index.d.ts | 9 + node_modules/expect-ct/dist/index.js | 29 + node_modules/expect-ct/package.json | 90 + node_modules/express/History.md | 3477 ++++ node_modules/express/LICENSE | 24 + node_modules/express/Readme.md | 155 + node_modules/express/index.js | 11 + node_modules/express/lib/application.js | 644 + node_modules/express/lib/express.js | 116 + node_modules/express/lib/middleware/init.js | 43 + node_modules/express/lib/middleware/query.js | 47 + node_modules/express/lib/request.js | 525 + node_modules/express/lib/response.js | 1142 + node_modules/express/lib/router/index.js | 662 + node_modules/express/lib/router/layer.js | 181 + node_modules/express/lib/router/route.js | 216 + node_modules/express/lib/utils.js | 306 + node_modules/express/lib/view.js | 182 + node_modules/express/package.json | 156 + node_modules/extend-shallow/LICENSE | 21 + node_modules/extend-shallow/README.md | 97 + node_modules/extend-shallow/index.js | 60 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 101 + node_modules/extend-shallow/package.json | 129 + node_modules/extend/.editorconfig | 20 + node_modules/extend/.eslintrc | 17 + node_modules/extend/.jscs.json | 175 + node_modules/extend/.travis.yml | 230 + node_modules/extend/CHANGELOG.md | 83 + node_modules/extend/LICENSE | 23 + node_modules/extend/README.md | 81 + node_modules/extend/component.json | 32 + node_modules/extend/index.js | 117 + node_modules/extend/package.json | 79 + node_modules/extglob/LICENSE | 21 + node_modules/extglob/README.md | 362 + node_modules/extglob/changelog.md | 25 + node_modules/extglob/index.js | 331 + node_modules/extglob/lib/.DS_Store | Bin 0 -> 6148 bytes node_modules/extglob/lib/compilers.js | 169 + node_modules/extglob/lib/extglob.js | 78 + node_modules/extglob/lib/parsers.js | 156 + node_modules/extglob/lib/utils.js | 69 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 95 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 96 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 61 + .../node_modules/extend-shallow/index.js | 33 + .../node_modules/extend-shallow/package.json | 90 + .../is-accessor-descriptor/LICENSE | 21 + .../is-accessor-descriptor/README.md | 144 + .../is-accessor-descriptor/index.js | 69 + .../is-accessor-descriptor/package.json | 113 + .../node_modules/is-data-descriptor/LICENSE | 21 + .../node_modules/is-data-descriptor/README.md | 161 + .../node_modules/is-data-descriptor/index.js | 49 + .../is-data-descriptor/package.json | 112 + .../node_modules/is-descriptor/LICENSE | 21 + .../node_modules/is-descriptor/README.md | 193 + .../node_modules/is-descriptor/index.js | 22 + .../node_modules/is-descriptor/package.json | 117 + node_modules/extglob/package.json | 163 + node_modules/extsprintf/.gitmodules | 0 node_modules/extsprintf/.npmignore | 2 + node_modules/extsprintf/LICENSE | 19 + node_modules/extsprintf/Makefile | 24 + node_modules/extsprintf/Makefile.targ | 285 + node_modules/extsprintf/README.md | 46 + node_modules/extsprintf/jsl.node.conf | 137 + node_modules/extsprintf/lib/extsprintf.js | 183 + node_modules/extsprintf/package.json | 47 + node_modules/fast-deep-equal/LICENSE | 21 + node_modules/fast-deep-equal/README.md | 96 + node_modules/fast-deep-equal/es6/index.d.ts | 2 + node_modules/fast-deep-equal/es6/index.js | 72 + node_modules/fast-deep-equal/es6/react.d.ts | 2 + node_modules/fast-deep-equal/es6/react.js | 79 + node_modules/fast-deep-equal/index.d.ts | 4 + node_modules/fast-deep-equal/index.js | 46 + node_modules/fast-deep-equal/package.json | 91 + node_modules/fast-deep-equal/react.d.ts | 2 + node_modules/fast-deep-equal/react.js | 53 + .../fast-json-stable-stringify/.eslintrc.yml | 26 + .../.github/FUNDING.yml | 1 + .../fast-json-stable-stringify/.travis.yml | 8 + .../fast-json-stable-stringify/LICENSE | 21 + .../fast-json-stable-stringify/README.md | 131 + .../benchmark/index.js | 31 + .../benchmark/test.json | 137 + .../example/key_cmp.js | 7 + .../example/nested.js | 3 + .../fast-json-stable-stringify/example/str.js | 3 + .../example/value_cmp.js | 7 + .../fast-json-stable-stringify/index.d.ts | 4 + .../fast-json-stable-stringify/index.js | 59 + .../fast-json-stable-stringify/package.json | 83 + .../fast-json-stable-stringify/test/cmp.js | 13 + .../fast-json-stable-stringify/test/nested.js | 44 + .../fast-json-stable-stringify/test/str.js | 46 + .../test/to-json.js | 22 + node_modules/feature-policy/CHANGELOG.md | 12 + node_modules/feature-policy/LICENSE | 21 + node_modules/feature-policy/README.md | 59 + node_modules/feature-policy/dist/index.d.ts | 9 + node_modules/feature-policy/dist/index.js | 99 + node_modules/feature-policy/package.json | 92 + node_modules/fill-range/LICENSE | 21 + node_modules/fill-range/README.md | 250 + node_modules/fill-range/index.js | 208 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 61 + .../node_modules/extend-shallow/index.js | 33 + .../node_modules/extend-shallow/package.json | 90 + node_modules/fill-range/package.json | 133 + node_modules/finalhandler/HISTORY.md | 187 + node_modules/finalhandler/LICENSE | 22 + node_modules/finalhandler/README.md | 148 + node_modules/finalhandler/index.js | 331 + node_modules/finalhandler/package.json | 83 + node_modules/findup-sync/LICENSE | 21 + node_modules/findup-sync/README.md | 57 + node_modules/findup-sync/index.js | 87 + node_modules/findup-sync/package.json | 108 + node_modules/fined/LICENSE | 21 + node_modules/fined/README.md | 81 + node_modules/fined/index.js | 174 + node_modules/fined/package.json | 92 + node_modules/flagged-respawn/LICENSE | 21 + node_modules/flagged-respawn/README.md | 111 + node_modules/flagged-respawn/index.js | 52 + .../flagged-respawn/lib/is-v8flags.js | 13 + node_modules/flagged-respawn/lib/remover.js | 13 + node_modules/flagged-respawn/lib/reorder.js | 18 + node_modules/flagged-respawn/lib/respawn.js | 16 + node_modules/flagged-respawn/package.json | 98 + node_modules/for-in/LICENSE | 21 + node_modules/for-in/README.md | 85 + node_modules/for-in/index.js | 16 + node_modules/for-in/package.json | 110 + node_modules/for-own/LICENSE | 21 + node_modules/for-own/README.md | 85 + node_modules/for-own/index.js | 19 + node_modules/for-own/package.json | 113 + node_modules/forever-agent/LICENSE | 55 + node_modules/forever-agent/README.md | 4 + node_modules/forever-agent/index.js | 138 + node_modules/forever-agent/package.json | 53 + node_modules/form-data/License | 19 + node_modules/form-data/README.md | 234 + node_modules/form-data/README.md.bak | 234 + node_modules/form-data/lib/browser.js | 2 + node_modules/form-data/lib/form_data.js | 457 + node_modules/form-data/lib/populate.js | 10 + node_modules/form-data/package.json | 101 + node_modules/form-data/yarn.lock | 2662 +++ node_modules/forwarded/HISTORY.md | 16 + node_modules/forwarded/LICENSE | 22 + node_modules/forwarded/README.md | 57 + node_modules/forwarded/index.js | 76 + node_modules/forwarded/package.json | 81 + node_modules/fragment-cache/LICENSE | 21 + node_modules/fragment-cache/README.md | 156 + node_modules/fragment-cache/index.js | 128 + node_modules/fragment-cache/package.json | 96 + node_modules/frameguard/CHANGELOG.md | 13 + node_modules/frameguard/LICENSE | 21 + node_modules/frameguard/README.md | 26 + node_modules/frameguard/dist/index.d.ts | 8 + node_modules/frameguard/dist/index.js | 57 + node_modules/frameguard/package.json | 98 + node_modules/fresh/HISTORY.md | 70 + node_modules/fresh/LICENSE | 23 + node_modules/fresh/README.md | 119 + node_modules/fresh/index.js | 137 + node_modules/fresh/package.json | 93 + node_modules/fs-minipass/LICENSE | 15 + node_modules/fs-minipass/README.md | 70 + node_modules/fs-minipass/index.js | 387 + node_modules/fs-minipass/package.json | 68 + node_modules/fs.realpath/LICENSE | 43 + node_modules/fs.realpath/README.md | 33 + node_modules/fs.realpath/index.js | 66 + node_modules/fs.realpath/old.js | 303 + node_modules/fs.realpath/package.json | 62 + node_modules/gauge/CHANGELOG.md | 160 + node_modules/gauge/LICENSE | 13 + node_modules/gauge/README.md | 399 + node_modules/gauge/base-theme.js | 14 + node_modules/gauge/error.js | 24 + node_modules/gauge/has-color.js | 12 + node_modules/gauge/index.js | 233 + node_modules/gauge/package.json | 94 + node_modules/gauge/plumbing.js | 48 + node_modules/gauge/process.js | 3 + node_modules/gauge/progress-bar.js | 35 + node_modules/gauge/render-template.js | 181 + node_modules/gauge/set-immediate.js | 7 + node_modules/gauge/set-interval.js | 3 + node_modules/gauge/spin.js | 5 + node_modules/gauge/template-item.js | 73 + node_modules/gauge/theme-set.js | 115 + node_modules/gauge/themes.js | 54 + node_modules/gauge/wide-truncate.js | 25 + node_modules/get-stream/buffer-stream.js | 51 + node_modules/get-stream/index.js | 51 + node_modules/get-stream/license | 21 + node_modules/get-stream/package.json | 85 + node_modules/get-stream/readme.md | 117 + node_modules/get-value/LICENSE | 21 + node_modules/get-value/index.js | 50 + node_modules/get-value/package.json | 116 + node_modules/getopts/LICENSE.md | 7 + node_modules/getopts/README.md | 313 + node_modules/getopts/getopts.d.ts | 27 + node_modules/getopts/index.js | 205 + node_modules/getopts/package.json | 70 + node_modules/getpass/.npmignore | 8 + node_modules/getpass/.travis.yml | 9 + node_modules/getpass/LICENSE | 18 + node_modules/getpass/README.md | 32 + node_modules/getpass/lib/index.js | 123 + node_modules/getpass/package.json | 53 + node_modules/glob-parent/LICENSE | 15 + node_modules/glob-parent/README.md | 137 + node_modules/glob-parent/index.js | 41 + node_modules/glob-parent/package.json | 94 + node_modules/glob/LICENSE | 21 + node_modules/glob/README.md | 375 + node_modules/glob/changelog.md | 67 + node_modules/glob/common.js | 240 + node_modules/glob/glob.js | 790 + node_modules/glob/package.json | 82 + node_modules/glob/sync.js | 486 + node_modules/global-dirs/index.js | 90 + node_modules/global-dirs/license | 9 + node_modules/global-dirs/package.json | 88 + node_modules/global-dirs/readme.md | 69 + node_modules/global-modules/LICENSE | 21 + node_modules/global-modules/README.md | 75 + node_modules/global-modules/index.js | 31 + node_modules/global-modules/package.json | 115 + node_modules/global-prefix/LICENSE | 21 + node_modules/global-prefix/README.md | 78 + node_modules/global-prefix/index.js | 96 + node_modules/global-prefix/package.json | 133 + node_modules/got/index.js | 364 + node_modules/got/license | 21 + node_modules/got/package.json | 114 + node_modules/got/readme.md | 335 + node_modules/graceful-fs/LICENSE | 15 + node_modules/graceful-fs/README.md | 133 + node_modules/graceful-fs/clone.js | 19 + node_modules/graceful-fs/graceful-fs.js | 346 + node_modules/graceful-fs/legacy-streams.js | 118 + node_modules/graceful-fs/package.json | 84 + node_modules/graceful-fs/polyfills.js | 342 + node_modules/har-schema/LICENSE | 13 + node_modules/har-schema/README.md | 49 + node_modules/har-schema/lib/afterRequest.json | 30 + .../har-schema/lib/beforeRequest.json | 30 + node_modules/har-schema/lib/browser.json | 20 + node_modules/har-schema/lib/cache.json | 21 + node_modules/har-schema/lib/content.json | 29 + node_modules/har-schema/lib/cookie.json | 36 + node_modules/har-schema/lib/creator.json | 20 + node_modules/har-schema/lib/entry.json | 53 + node_modules/har-schema/lib/har.json | 13 + node_modules/har-schema/lib/header.json | 20 + node_modules/har-schema/lib/index.js | 22 + node_modules/har-schema/lib/log.json | 36 + node_modules/har-schema/lib/page.json | 32 + node_modules/har-schema/lib/pageTimings.json | 18 + node_modules/har-schema/lib/postData.json | 43 + node_modules/har-schema/lib/query.json | 20 + node_modules/har-schema/lib/request.json | 57 + node_modules/har-schema/lib/response.json | 54 + node_modules/har-schema/lib/timings.json | 42 + node_modules/har-schema/package.json | 89 + node_modules/har-validator/LICENSE | 9 + node_modules/har-validator/README.md | 37 + node_modules/har-validator/lib/async.js | 105 + node_modules/har-validator/lib/error.js | 17 + node_modules/har-validator/lib/promise.js | 102 + node_modules/har-validator/package.json | 79 + node_modules/has-flag/index.js | 8 + node_modules/has-flag/license | 9 + node_modules/has-flag/package.json | 80 + node_modules/has-flag/readme.md | 70 + node_modules/has-unicode/LICENSE | 14 + node_modules/has-unicode/README.md | 43 + node_modules/has-unicode/index.js | 16 + node_modules/has-unicode/package.json | 61 + node_modules/has-value/LICENSE | 21 + node_modules/has-value/README.md | 149 + node_modules/has-value/index.js | 16 + node_modules/has-value/package.json | 123 + node_modules/has-values/LICENSE | 21 + node_modules/has-values/README.md | 129 + node_modules/has-values/index.js | 60 + .../has-values/node_modules/kind-of/LICENSE | 21 + .../has-values/node_modules/kind-of/README.md | 267 + .../has-values/node_modules/kind-of/index.js | 119 + .../node_modules/kind-of/package.json | 142 + node_modules/has-values/package.json | 118 + node_modules/helmet-crossdomain/CHANGELOG.md | 12 + node_modules/helmet-crossdomain/LICENSE | 21 + node_modules/helmet-crossdomain/README.md | 24 + .../helmet-crossdomain/dist/index.d.ts | 7 + node_modules/helmet-crossdomain/dist/index.js | 29 + node_modules/helmet-crossdomain/package.json | 90 + node_modules/helmet-csp/CHANGELOG.md | 42 + node_modules/helmet-csp/LICENSE | 21 + node_modules/helmet-csp/README.md | 145 + node_modules/helmet-csp/dist/index.d.ts | 5 + node_modules/helmet-csp/dist/index.js | 82 + .../check-options/check-directive/boolean.js | 10 + .../check-options/check-directive/index.js | 30 + .../check-directive/plugin-types.js | 33 + .../check-directive/report-uri.js | 17 + .../check-directive/require-sri-for.js | 22 + .../check-options/check-directive/sandbox.js | 28 + .../check-directive/source-list.js | 37 + .../dist/lib/check-options/index.js | 22 + node_modules/helmet-csp/dist/lib/config.js | 63 + .../helmet-csp/dist/lib/contains-function.js | 17 + .../dist/lib/get-header-keys-for-browser.js | 113 + .../helmet-csp/dist/lib/is-boolean.js | 4 + .../helmet-csp/dist/lib/is-function.js | 4 + node_modules/helmet-csp/dist/lib/is-string.js | 4 + .../dist/lib/parse-dynamic-directives.js | 30 + .../lib/transform-directives-for-browser.js | 64 + node_modules/helmet-csp/dist/lib/types.d.ts | 69 + node_modules/helmet-csp/dist/lib/types.js | 2 + node_modules/helmet-csp/package.json | 114 + node_modules/helmet/CHANGELOG.md | 466 + node_modules/helmet/CODE_OF_CONDUCT.md | 27 + node_modules/helmet/CONTRIBUTING.md | 18 + node_modules/helmet/LICENSE | 23 + node_modules/helmet/README.md | 79 + node_modules/helmet/SECURITY.md | 9 + node_modules/helmet/index.js | 76 + .../helmet/node_modules/depd/History.md | 103 + node_modules/helmet/node_modules/depd/LICENSE | 22 + .../helmet/node_modules/depd/Readme.md | 280 + .../helmet/node_modules/depd/index.js | 538 + .../node_modules/depd/lib/browser/index.js | 77 + .../helmet/node_modules/depd/package.json | 83 + node_modules/helmet/package.json | 115 + node_modules/hide-powered-by/CHANGELOG.md | 11 + node_modules/hide-powered-by/LICENSE | 21 + node_modules/hide-powered-by/README.md | 24 + node_modules/hide-powered-by/dist/index.d.ts | 7 + node_modules/hide-powered-by/dist/index.js | 16 + node_modules/hide-powered-by/package.json | 97 + node_modules/homedir-polyfill/LICENSE | 21 + node_modules/homedir-polyfill/README.md | 96 + node_modules/homedir-polyfill/index.js | 9 + node_modules/homedir-polyfill/package.json | 98 + node_modules/homedir-polyfill/polyfill.js | 81 + node_modules/hpkp/.npmignore | 2 + node_modules/hpkp/LICENSE | 21 + node_modules/hpkp/README.md | 36 + node_modules/hpkp/index.js | 71 + node_modules/hpkp/package.json | 86 + node_modules/hsts/CHANGELOG.md | 18 + node_modules/hsts/LICENSE | 21 + node_modules/hsts/README.md | 56 + node_modules/hsts/index.js | 58 + .../hsts/node_modules/depd/History.md | 103 + node_modules/hsts/node_modules/depd/LICENSE | 22 + node_modules/hsts/node_modules/depd/Readme.md | 280 + node_modules/hsts/node_modules/depd/index.js | 538 + .../node_modules/depd/lib/browser/index.js | 77 + .../hsts/node_modules/depd/package.json | 83 + node_modules/hsts/package.json | 86 + node_modules/http-errors/HISTORY.md | 149 + node_modules/http-errors/LICENSE | 23 + node_modules/http-errors/README.md | 163 + node_modules/http-errors/index.js | 266 + node_modules/http-errors/package.json | 96 + node_modules/http-signature/.dir-locals.el | 6 + node_modules/http-signature/.npmignore | 7 + node_modules/http-signature/CHANGES.md | 46 + node_modules/http-signature/LICENSE | 18 + node_modules/http-signature/README.md | 79 + node_modules/http-signature/http_signing.md | 363 + node_modules/http-signature/lib/index.js | 29 + node_modules/http-signature/lib/parser.js | 315 + node_modules/http-signature/lib/signer.js | 401 + node_modules/http-signature/lib/utils.js | 112 + node_modules/http-signature/lib/verify.js | 88 + node_modules/http-signature/package.json | 80 + node_modules/iconv-lite/Changelog.md | 162 + node_modules/iconv-lite/LICENSE | 21 + node_modules/iconv-lite/README.md | 156 + .../iconv-lite/encodings/dbcs-codec.js | 555 + .../iconv-lite/encodings/dbcs-data.js | 176 + node_modules/iconv-lite/encodings/index.js | 22 + node_modules/iconv-lite/encodings/internal.js | 188 + .../iconv-lite/encodings/sbcs-codec.js | 72 + .../encodings/sbcs-data-generated.js | 451 + .../iconv-lite/encodings/sbcs-data.js | 174 + .../encodings/tables/big5-added.json | 122 + .../iconv-lite/encodings/tables/cp936.json | 264 + .../iconv-lite/encodings/tables/cp949.json | 273 + .../iconv-lite/encodings/tables/cp950.json | 177 + .../iconv-lite/encodings/tables/eucjp.json | 182 + .../encodings/tables/gb18030-ranges.json | 1 + .../encodings/tables/gbk-added.json | 55 + .../iconv-lite/encodings/tables/shiftjis.json | 125 + node_modules/iconv-lite/encodings/utf16.js | 177 + node_modules/iconv-lite/encodings/utf7.js | 290 + node_modules/iconv-lite/lib/bom-handling.js | 52 + node_modules/iconv-lite/lib/extend-node.js | 217 + node_modules/iconv-lite/lib/index.d.ts | 24 + node_modules/iconv-lite/lib/index.js | 153 + node_modules/iconv-lite/lib/streams.js | 121 + node_modules/iconv-lite/package.json | 81 + node_modules/ienoopen/CHANGELOG.md | 12 + node_modules/ienoopen/LICENSE | 21 + node_modules/ienoopen/README.md | 14 + node_modules/ienoopen/dist/index.d.ts | 4 + node_modules/ienoopen/dist/index.js | 7 + node_modules/ienoopen/package.json | 88 + node_modules/ignore-by-default/LICENSE | 14 + node_modules/ignore-by-default/README.md | 26 + node_modules/ignore-by-default/index.js | 12 + node_modules/ignore-by-default/package.json | 66 + node_modules/ignore-walk/LICENSE | 15 + node_modules/ignore-walk/README.md | 60 + node_modules/ignore-walk/index.js | 269 + node_modules/ignore-walk/package.json | 77 + node_modules/import-lazy/index.js | 53 + node_modules/import-lazy/license | 21 + node_modules/import-lazy/package.json | 80 + node_modules/import-lazy/readme.md | 64 + node_modules/imurmurhash/README.md | 122 + node_modules/imurmurhash/imurmurhash.js | 138 + node_modules/imurmurhash/imurmurhash.min.js | 12 + node_modules/imurmurhash/package.json | 67 + node_modules/inflight/LICENSE | 15 + node_modules/inflight/README.md | 37 + node_modules/inflight/inflight.js | 54 + node_modules/inflight/package.json | 61 + node_modules/inherits/LICENSE | 16 + node_modules/inherits/README.md | 42 + node_modules/inherits/inherits.js | 7 + node_modules/inherits/inherits_browser.js | 23 + node_modules/inherits/package.json | 66 + node_modules/ini/LICENSE | 15 + node_modules/ini/README.md | 102 + node_modules/ini/ini.js | 194 + node_modules/ini/package.json | 68 + node_modules/interpret/CHANGELOG | 115 + node_modules/interpret/LICENSE | 22 + node_modules/interpret/README.md | 226 + node_modules/interpret/index.js | 205 + node_modules/interpret/package.json | 119 + node_modules/ipaddr.js/LICENSE | 19 + node_modules/ipaddr.js/README.md | 233 + node_modules/ipaddr.js/ipaddr.min.js | 1 + node_modules/ipaddr.js/lib/ipaddr.js | 673 + node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 71 + node_modules/ipaddr.js/package.json | 72 + node_modules/is-absolute/LICENSE | 22 + node_modules/is-absolute/README.md | 114 + node_modules/is-absolute/index.js | 47 + node_modules/is-absolute/package.json | 136 + node_modules/is-accessor-descriptor/LICENSE | 21 + node_modules/is-accessor-descriptor/README.md | 123 + node_modules/is-accessor-descriptor/index.js | 69 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 142 + .../is-accessor-descriptor/package.json | 97 + node_modules/is-binary-path/index.d.ts | 17 + node_modules/is-binary-path/index.js | 7 + node_modules/is-binary-path/license | 9 + node_modules/is-binary-path/package.json | 76 + node_modules/is-binary-path/readme.md | 34 + node_modules/is-buffer/LICENSE | 21 + node_modules/is-buffer/README.md | 53 + node_modules/is-buffer/index.js | 21 + node_modules/is-buffer/package.json | 86 + node_modules/is-buffer/test/basic.js | 24 + node_modules/is-ci/LICENSE | 21 + node_modules/is-ci/README.md | 50 + node_modules/is-ci/bin.js | 4 + node_modules/is-ci/index.js | 3 + node_modules/is-ci/package.json | 73 + node_modules/is-data-descriptor/LICENSE | 21 + node_modules/is-data-descriptor/README.md | 128 + node_modules/is-data-descriptor/index.js | 55 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 142 + node_modules/is-data-descriptor/package.json | 96 + node_modules/is-descriptor/LICENSE | 21 + node_modules/is-descriptor/README.md | 193 + node_modules/is-descriptor/index.js | 22 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 342 + .../node_modules/kind-of/index.js | 147 + .../node_modules/kind-of/package.json | 149 + node_modules/is-descriptor/package.json | 121 + node_modules/is-extendable/LICENSE | 21 + node_modules/is-extendable/README.md | 72 + node_modules/is-extendable/index.js | 13 + node_modules/is-extendable/package.json | 92 + node_modules/is-extglob/LICENSE | 21 + node_modules/is-extglob/README.md | 107 + node_modules/is-extglob/index.js | 20 + node_modules/is-extglob/package.json | 103 + node_modules/is-fullwidth-code-point/index.js | 46 + node_modules/is-fullwidth-code-point/license | 21 + .../is-fullwidth-code-point/package.json | 80 + .../is-fullwidth-code-point/readme.md | 39 + node_modules/is-glob/LICENSE | 21 + node_modules/is-glob/README.md | 206 + node_modules/is-glob/index.js | 48 + node_modules/is-glob/package.json | 126 + node_modules/is-installed-globally/index.js | 5 + node_modules/is-installed-globally/license | 9 + .../is-installed-globally/package.json | 84 + node_modules/is-installed-globally/readme.md | 39 + node_modules/is-npm/index.js | 4 + node_modules/is-npm/package.json | 68 + node_modules/is-npm/readme.md | 30 + node_modules/is-number/LICENSE | 21 + node_modules/is-number/README.md | 115 + node_modules/is-number/index.js | 22 + .../is-number/node_modules/kind-of/LICENSE | 21 + .../is-number/node_modules/kind-of/README.md | 261 + .../is-number/node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 142 + node_modules/is-number/package.json | 128 + node_modules/is-obj/index.js | 5 + node_modules/is-obj/license | 21 + node_modules/is-obj/package.json | 69 + node_modules/is-obj/readme.md | 34 + node_modules/is-path-inside/index.js | 14 + node_modules/is-path-inside/license | 21 + node_modules/is-path-inside/package.json | 73 + node_modules/is-path-inside/readme.md | 34 + node_modules/is-plain-object/LICENSE | 21 + node_modules/is-plain-object/README.md | 104 + node_modules/is-plain-object/index.d.ts | 5 + node_modules/is-plain-object/index.js | 37 + node_modules/is-plain-object/package.json | 128 + node_modules/is-redirect/index.js | 14 + node_modules/is-redirect/license | 21 + node_modules/is-redirect/package.json | 71 + node_modules/is-redirect/readme.md | 28 + node_modules/is-relative/LICENSE | 21 + node_modules/is-relative/README.md | 77 + node_modules/is-relative/index.js | 12 + node_modules/is-relative/package.json | 111 + node_modules/is-retry-allowed/index.js | 62 + node_modules/is-retry-allowed/license | 21 + node_modules/is-retry-allowed/package.json | 63 + node_modules/is-retry-allowed/readme.md | 42 + node_modules/is-stream/index.js | 21 + node_modules/is-stream/license | 21 + node_modules/is-stream/package.json | 75 + node_modules/is-stream/readme.md | 42 + node_modules/is-typedarray/LICENSE.md | 18 + node_modules/is-typedarray/README.md | 16 + node_modules/is-typedarray/index.js | 41 + node_modules/is-typedarray/package.json | 62 + node_modules/is-typedarray/test.js | 34 + node_modules/is-unc-path/LICENSE | 21 + node_modules/is-unc-path/README.md | 115 + node_modules/is-unc-path/index.js | 10 + node_modules/is-unc-path/package.json | 99 + node_modules/is-windows/LICENSE | 21 + node_modules/is-windows/README.md | 95 + node_modules/is-windows/index.js | 27 + node_modules/is-windows/package.json | 117 + node_modules/isarray/.npmignore | 1 + node_modules/isarray/.travis.yml | 4 + node_modules/isarray/Makefile | 6 + node_modules/isarray/README.md | 60 + node_modules/isarray/component.json | 19 + node_modules/isarray/index.js | 5 + node_modules/isarray/package.json | 77 + node_modules/isarray/test.js | 20 + node_modules/isexe/.npmignore | 2 + node_modules/isexe/LICENSE | 15 + node_modules/isexe/README.md | 51 + node_modules/isexe/index.js | 57 + node_modules/isexe/mode.js | 41 + node_modules/isexe/package.json | 63 + node_modules/isexe/test/basic.js | 221 + node_modules/isexe/windows.js | 42 + node_modules/isobject/LICENSE | 21 + node_modules/isobject/README.md | 122 + node_modules/isobject/index.d.ts | 5 + node_modules/isobject/index.js | 12 + node_modules/isobject/package.json | 133 + node_modules/isstream/.jshintrc | 59 + node_modules/isstream/.npmignore | 1 + node_modules/isstream/.travis.yml | 12 + node_modules/isstream/LICENSE.md | 11 + node_modules/isstream/README.md | 66 + node_modules/isstream/isstream.js | 27 + node_modules/isstream/package.json | 64 + node_modules/isstream/test.js | 168 + node_modules/jsbn/.npmignore | 2 + node_modules/jsbn/LICENSE | 40 + node_modules/jsbn/README.md | 175 + node_modules/jsbn/example.html | 12 + node_modules/jsbn/example.js | 3 + node_modules/jsbn/index.js | 1357 ++ node_modules/jsbn/package.json | 56 + .../json-schema-traverse/.eslintrc.yml | 27 + node_modules/json-schema-traverse/.travis.yml | 8 + node_modules/json-schema-traverse/LICENSE | 21 + node_modules/json-schema-traverse/README.md | 83 + node_modules/json-schema-traverse/index.js | 89 + .../json-schema-traverse/package.json | 73 + .../json-schema-traverse/spec/.eslintrc.yml | 6 + .../spec/fixtures/schema.js | 125 + .../json-schema-traverse/spec/index.spec.js | 171 + node_modules/json-schema/README.md | 5 + .../json-schema/draft-00/hyper-schema | 68 + node_modules/json-schema/draft-00/json-ref | 26 + node_modules/json-schema/draft-00/links | 33 + node_modules/json-schema/draft-00/schema | 155 + .../json-schema/draft-01/hyper-schema | 68 + node_modules/json-schema/draft-01/json-ref | 26 + node_modules/json-schema/draft-01/links | 33 + node_modules/json-schema/draft-01/schema | 155 + .../json-schema/draft-02/hyper-schema | 68 + node_modules/json-schema/draft-02/json-ref | 26 + node_modules/json-schema/draft-02/links | 35 + node_modules/json-schema/draft-02/schema | 166 + .../json-schema/draft-03/examples/address | 20 + .../json-schema/draft-03/examples/calendar | 53 + .../json-schema/draft-03/examples/card | 105 + .../json-schema/draft-03/examples/geo | 8 + .../json-schema/draft-03/examples/interfaces | 23 + .../json-schema/draft-03/hyper-schema | 60 + node_modules/json-schema/draft-03/json-ref | 26 + node_modules/json-schema/draft-03/links | 35 + node_modules/json-schema/draft-03/schema | 174 + .../json-schema/draft-04/hyper-schema | 60 + node_modules/json-schema/draft-04/links | 41 + node_modules/json-schema/draft-04/schema | 189 + .../json-schema/draft-zyp-json-schema-03.xml | 1120 + .../json-schema/draft-zyp-json-schema-04.xml | 1072 + node_modules/json-schema/lib/links.js | 66 + node_modules/json-schema/lib/validate.js | 273 + node_modules/json-schema/package.json | 74 + node_modules/json-schema/test/tests.js | 95 + node_modules/json-stringify-safe/.npmignore | 1 + node_modules/json-stringify-safe/CHANGELOG.md | 14 + node_modules/json-stringify-safe/LICENSE | 15 + node_modules/json-stringify-safe/Makefile | 35 + node_modules/json-stringify-safe/README.md | 52 + node_modules/json-stringify-safe/package.json | 69 + node_modules/json-stringify-safe/stringify.js | 27 + .../json-stringify-safe/test/mocha.opts | 2 + .../test/stringify_test.js | 246 + node_modules/jsprim/CHANGES.md | 49 + node_modules/jsprim/CONTRIBUTING.md | 19 + node_modules/jsprim/LICENSE | 19 + node_modules/jsprim/README.md | 287 + node_modules/jsprim/lib/jsprim.js | 735 + node_modules/jsprim/package.json | 52 + node_modules/kind-of/CHANGELOG.md | 160 + node_modules/kind-of/LICENSE | 21 + node_modules/kind-of/README.md | 367 + node_modules/kind-of/index.js | 129 + node_modules/kind-of/package.json | 160 + node_modules/knex/CHANGELOG.md | 1394 ++ node_modules/knex/CONTRIBUTING.md | 182 + node_modules/knex/LICENSE | 22 + node_modules/knex/README.md | 93 + node_modules/knex/bin/cli.js | 380 + .../knex/bin/utils/cli-config-utils.js | 167 + node_modules/knex/bin/utils/constants.js | 7 + .../knex/bin/utils/migrationsLister.js | 37 + node_modules/knex/knex.js | 8 + node_modules/knex/lib/client.js | 414 + node_modules/knex/lib/constants.js | 38 + node_modules/knex/lib/dialects/mssql/index.js | 384 + .../knex/lib/dialects/mssql/query/compiler.js | 264 + .../dialects/mssql/schema/columncompiler.js | 103 + .../lib/dialects/mssql/schema/compiler.js | 59 + .../dialects/mssql/schema/tablecompiler.js | 228 + .../knex/lib/dialects/mssql/transaction.js | 107 + node_modules/knex/lib/dialects/mysql/index.js | 198 + .../knex/lib/dialects/mysql/query/compiler.js | 105 + .../dialects/mysql/schema/columncompiler.js | 170 + .../lib/dialects/mysql/schema/compiler.js | 60 + .../dialects/mysql/schema/tablecompiler.js | 262 + .../knex/lib/dialects/mysql/transaction.js | 50 + .../knex/lib/dialects/mysql2/index.js | 35 + .../knex/lib/dialects/mysql2/transaction.js | 49 + .../knex/lib/dialects/oracle/formatter.js | 20 + .../knex/lib/dialects/oracle/index.js | 196 + .../lib/dialects/oracle/query/compiler.js | 325 + .../dialects/oracle/schema/columnbuilder.js | 18 + .../dialects/oracle/schema/columncompiler.js | 139 + .../lib/dialects/oracle/schema/compiler.js | 81 + .../dialects/oracle/schema/tablecompiler.js | 167 + .../lib/dialects/oracle/schema/trigger.js | 126 + .../knex/lib/dialects/oracle/transaction.js | 77 + .../knex/lib/dialects/oracle/utils.js | 86 + .../knex/lib/dialects/oracledb/index.js | 454 + .../lib/dialects/oracledb/query/compiler.js | 360 + .../oracledb/schema/columncompiler.js | 36 + .../knex/lib/dialects/oracledb/transaction.js | 87 + .../knex/lib/dialects/oracledb/utils.js | 14 + .../knex/lib/dialects/postgres/index.js | 321 + .../lib/dialects/postgres/query/compiler.js | 166 + .../postgres/schema/columncompiler.js | 122 + .../lib/dialects/postgres/schema/compiler.js | 109 + .../dialects/postgres/schema/tablecompiler.js | 183 + .../knex/lib/dialects/redshift/index.js | 73 + .../lib/dialects/redshift/query/compiler.js | 122 + .../dialects/redshift/schema/columnbuilder.js | 20 + .../redshift/schema/columncompiler.js | 60 + .../lib/dialects/redshift/schema/compiler.js | 14 + .../dialects/redshift/schema/tablecompiler.js | 123 + .../knex/lib/dialects/redshift/transaction.js | 18 + .../knex/lib/dialects/sqlite3/formatter.js | 21 + .../knex/lib/dialects/sqlite3/index.js | 171 + .../lib/dialects/sqlite3/query/compiler.js | 176 + .../dialects/sqlite3/schema/columncompiler.js | 27 + .../lib/dialects/sqlite3/schema/compiler.js | 49 + .../knex/lib/dialects/sqlite3/schema/ddl.js | 330 + .../dialects/sqlite3/schema/tablecompiler.js | 156 + node_modules/knex/lib/formatter.js | 295 + node_modules/knex/lib/functionhelper.js | 14 + node_modules/knex/lib/helpers.js | 98 + node_modules/knex/lib/index.js | 3 + node_modules/knex/lib/interface.js | 111 + node_modules/knex/lib/knex.js | 79 + node_modules/knex/lib/logger.js | 78 + .../knex/lib/migrate/MigrationGenerator.js | 106 + node_modules/knex/lib/migrate/Migrator.js | 600 + .../knex/lib/migrate/configuration-merger.js | 53 + node_modules/knex/lib/migrate/migrate-stub.js | 17 + .../lib/migrate/migration-list-resolver.js | 40 + .../knex/lib/migrate/sources/fs-migrations.js | 98 + .../knex/lib/migrate/stub/coffee.stub | 13 + node_modules/knex/lib/migrate/stub/eg.stub | 14 + node_modules/knex/lib/migrate/stub/js.stub | 15 + .../lib/migrate/stub/knexfile-coffee.stub | 34 + .../knex/lib/migrate/stub/knexfile-eg.stub | 43 + .../knex/lib/migrate/stub/knexfile-js.stub | 44 + .../knex/lib/migrate/stub/knexfile-ls.stub | 35 + .../knex/lib/migrate/stub/knexfile-ts.stub | 44 + node_modules/knex/lib/migrate/stub/ls.stub | 14 + node_modules/knex/lib/migrate/stub/ts.stub | 21 + .../knex/lib/migrate/table-creator.js | 67 + .../knex/lib/migrate/table-resolver.js | 27 + node_modules/knex/lib/query/builder.js | 1308 ++ node_modules/knex/lib/query/compiler.js | 888 + node_modules/knex/lib/query/constants.js | 13 + node_modules/knex/lib/query/joinclause.js | 271 + node_modules/knex/lib/query/methods.js | 91 + node_modules/knex/lib/query/string.js | 190 + node_modules/knex/lib/raw.js | 192 + node_modules/knex/lib/ref.js | 39 + node_modules/knex/lib/runner.js | 261 + node_modules/knex/lib/schema/builder.js | 85 + node_modules/knex/lib/schema/columnbuilder.js | 116 + .../knex/lib/schema/columncompiler.js | 173 + node_modules/knex/lib/schema/compiler.js | 103 + node_modules/knex/lib/schema/helpers.js | 50 + node_modules/knex/lib/schema/tablebuilder.js | 285 + node_modules/knex/lib/schema/tablecompiler.js | 306 + node_modules/knex/lib/seed/Seeder.js | 163 + node_modules/knex/lib/seed/seed-stub.js | 13 + node_modules/knex/lib/seed/stub/coffee.stub | 9 + node_modules/knex/lib/seed/stub/eg.stub | 11 + node_modules/knex/lib/seed/stub/js.stub | 13 + node_modules/knex/lib/seed/stub/ls.stub | 11 + node_modules/knex/lib/seed/stub/ts.stub | 14 + node_modules/knex/lib/transaction.js | 397 + node_modules/knex/lib/util/batchInsert.js | 57 + node_modules/knex/lib/util/delay.js | 3 + node_modules/knex/lib/util/fake-client.js | 9 + node_modules/knex/lib/util/make-knex.js | 282 + node_modules/knex/lib/util/noop.js | 1 + .../knex/lib/util/parse-connection.js | 64 + .../knex/lib/util/save-async-stack.js | 9 + node_modules/knex/lib/util/template.js | 55 + .../knex/node_modules/debug/CHANGELOG.md | 395 + node_modules/knex/node_modules/debug/LICENSE | 19 + .../knex/node_modules/debug/README.md | 455 + .../knex/node_modules/debug/dist/debug.js | 912 + .../knex/node_modules/debug/package.json | 105 + .../knex/node_modules/debug/src/browser.js | 264 + .../knex/node_modules/debug/src/common.js | 266 + .../knex/node_modules/debug/src/index.js | 10 + .../knex/node_modules/debug/src/node.js | 257 + .../knex/node_modules/inherits/LICENSE | 16 + .../knex/node_modules/inherits/README.md | 42 + .../knex/node_modules/inherits/inherits.js | 9 + .../node_modules/inherits/inherits_browser.js | 27 + .../knex/node_modules/inherits/package.json | 64 + node_modules/knex/node_modules/ms/index.js | 162 + node_modules/knex/node_modules/ms/license.md | 21 + .../knex/node_modules/ms/package.json | 72 + node_modules/knex/node_modules/ms/readme.md | 60 + node_modules/knex/package.json | 230 + node_modules/knex/scripts/build.js | 126 + node_modules/knex/scripts/docker-compose.yml | 97 + .../knex/scripts/next-release-howto.md | 24 + node_modules/knex/scripts/release.sh | 34 + node_modules/knex/scripts/runkit-example.js | 34 + .../knex/scripts/stress-test/README.txt | 18 + .../scripts/stress-test/docker-compose.yml | 47 + .../scripts/stress-test/knex-stress-test.js | 196 + ...ysql2-random-hanging-every-now-and-then.js | 145 + .../mysql2-sudden-exit-without-error.js | 100 + .../reconnect-test-mysql-based-drivers.js | 184 + node_modules/knex/types/index.d.ts | 1994 ++ node_modules/knex/types/result.d.ts | 27 + node_modules/latest-version/index.js | 4 + node_modules/latest-version/license | 21 + node_modules/latest-version/package.json | 75 + node_modules/latest-version/readme.md | 40 + node_modules/liftoff/CHANGELOG | 127 + node_modules/liftoff/LICENSE | 22 + node_modules/liftoff/README.md | 535 + node_modules/liftoff/index.js | 231 + node_modules/liftoff/lib/build_config_name.js | 17 + node_modules/liftoff/lib/file_search.js | 14 + node_modules/liftoff/lib/find_config.js | 25 + node_modules/liftoff/lib/find_cwd.js | 18 + node_modules/liftoff/lib/get_node_flags.js | 30 + node_modules/liftoff/lib/parse_options.js | 35 + node_modules/liftoff/lib/register_loader.js | 24 + node_modules/liftoff/lib/silent_require.js | 5 + node_modules/liftoff/package.json | 84 + node_modules/lodash/LICENSE | 47 + node_modules/lodash/README.md | 39 + node_modules/lodash/_DataView.js | 7 + node_modules/lodash/_Hash.js | 32 + node_modules/lodash/_LazyWrapper.js | 28 + node_modules/lodash/_ListCache.js | 32 + node_modules/lodash/_LodashWrapper.js | 22 + node_modules/lodash/_Map.js | 7 + node_modules/lodash/_MapCache.js | 32 + node_modules/lodash/_Promise.js | 7 + node_modules/lodash/_Set.js | 7 + node_modules/lodash/_SetCache.js | 27 + node_modules/lodash/_Stack.js | 27 + node_modules/lodash/_Symbol.js | 6 + node_modules/lodash/_Uint8Array.js | 6 + node_modules/lodash/_WeakMap.js | 7 + node_modules/lodash/_apply.js | 21 + node_modules/lodash/_arrayAggregator.js | 22 + node_modules/lodash/_arrayEach.js | 22 + node_modules/lodash/_arrayEachRight.js | 21 + node_modules/lodash/_arrayEvery.js | 23 + node_modules/lodash/_arrayFilter.js | 25 + node_modules/lodash/_arrayIncludes.js | 17 + node_modules/lodash/_arrayIncludesWith.js | 22 + node_modules/lodash/_arrayLikeKeys.js | 49 + node_modules/lodash/_arrayMap.js | 21 + node_modules/lodash/_arrayPush.js | 20 + node_modules/lodash/_arrayReduce.js | 26 + node_modules/lodash/_arrayReduceRight.js | 24 + node_modules/lodash/_arraySample.js | 15 + node_modules/lodash/_arraySampleSize.js | 17 + node_modules/lodash/_arrayShuffle.js | 15 + node_modules/lodash/_arraySome.js | 23 + node_modules/lodash/_asciiSize.js | 12 + node_modules/lodash/_asciiToArray.js | 12 + node_modules/lodash/_asciiWords.js | 15 + node_modules/lodash/_assignMergeValue.js | 20 + node_modules/lodash/_assignValue.js | 28 + node_modules/lodash/_assocIndexOf.js | 21 + node_modules/lodash/_baseAggregator.js | 21 + node_modules/lodash/_baseAssign.js | 17 + node_modules/lodash/_baseAssignIn.js | 17 + node_modules/lodash/_baseAssignValue.js | 25 + node_modules/lodash/_baseAt.js | 23 + node_modules/lodash/_baseClamp.js | 22 + node_modules/lodash/_baseClone.js | 166 + node_modules/lodash/_baseConforms.js | 18 + node_modules/lodash/_baseConformsTo.js | 27 + node_modules/lodash/_baseCreate.js | 30 + node_modules/lodash/_baseDelay.js | 21 + node_modules/lodash/_baseDifference.js | 67 + node_modules/lodash/_baseEach.js | 14 + node_modules/lodash/_baseEachRight.js | 14 + node_modules/lodash/_baseEvery.js | 21 + node_modules/lodash/_baseExtremum.js | 32 + node_modules/lodash/_baseFill.js | 32 + node_modules/lodash/_baseFilter.js | 21 + node_modules/lodash/_baseFindIndex.js | 24 + node_modules/lodash/_baseFindKey.js | 23 + node_modules/lodash/_baseFlatten.js | 38 + node_modules/lodash/_baseFor.js | 16 + node_modules/lodash/_baseForOwn.js | 16 + node_modules/lodash/_baseForOwnRight.js | 16 + node_modules/lodash/_baseForRight.js | 15 + node_modules/lodash/_baseFunctions.js | 19 + node_modules/lodash/_baseGet.js | 24 + node_modules/lodash/_baseGetAllKeys.js | 20 + node_modules/lodash/_baseGetTag.js | 28 + node_modules/lodash/_baseGt.js | 14 + node_modules/lodash/_baseHas.js | 19 + node_modules/lodash/_baseHasIn.js | 13 + node_modules/lodash/_baseInRange.js | 18 + node_modules/lodash/_baseIndexOf.js | 20 + node_modules/lodash/_baseIndexOfWith.js | 23 + node_modules/lodash/_baseIntersection.js | 74 + node_modules/lodash/_baseInverter.js | 21 + node_modules/lodash/_baseInvoke.js | 24 + node_modules/lodash/_baseIsArguments.js | 18 + node_modules/lodash/_baseIsArrayBuffer.js | 17 + node_modules/lodash/_baseIsDate.js | 18 + node_modules/lodash/_baseIsEqual.js | 28 + node_modules/lodash/_baseIsEqualDeep.js | 83 + node_modules/lodash/_baseIsMap.js | 18 + node_modules/lodash/_baseIsMatch.js | 62 + node_modules/lodash/_baseIsNaN.js | 12 + node_modules/lodash/_baseIsNative.js | 47 + node_modules/lodash/_baseIsRegExp.js | 18 + node_modules/lodash/_baseIsSet.js | 18 + node_modules/lodash/_baseIsTypedArray.js | 60 + node_modules/lodash/_baseIteratee.js | 31 + node_modules/lodash/_baseKeys.js | 30 + node_modules/lodash/_baseKeysIn.js | 33 + node_modules/lodash/_baseLodash.js | 10 + node_modules/lodash/_baseLt.js | 14 + node_modules/lodash/_baseMap.js | 22 + node_modules/lodash/_baseMatches.js | 22 + node_modules/lodash/_baseMatchesProperty.js | 33 + node_modules/lodash/_baseMean.js | 20 + node_modules/lodash/_baseMerge.js | 42 + node_modules/lodash/_baseMergeDeep.js | 94 + node_modules/lodash/_baseNth.js | 20 + node_modules/lodash/_baseOrderBy.js | 49 + node_modules/lodash/_basePick.js | 19 + node_modules/lodash/_basePickBy.js | 30 + node_modules/lodash/_baseProperty.js | 14 + node_modules/lodash/_basePropertyDeep.js | 16 + node_modules/lodash/_basePropertyOf.js | 14 + node_modules/lodash/_basePullAll.js | 51 + node_modules/lodash/_basePullAt.js | 37 + node_modules/lodash/_baseRandom.js | 18 + node_modules/lodash/_baseRange.js | 28 + node_modules/lodash/_baseReduce.js | 23 + node_modules/lodash/_baseRepeat.js | 35 + node_modules/lodash/_baseRest.js | 17 + node_modules/lodash/_baseSample.js | 15 + node_modules/lodash/_baseSampleSize.js | 18 + node_modules/lodash/_baseSet.js | 51 + node_modules/lodash/_baseSetData.js | 17 + node_modules/lodash/_baseSetToString.js | 22 + node_modules/lodash/_baseShuffle.js | 15 + node_modules/lodash/_baseSlice.js | 31 + node_modules/lodash/_baseSome.js | 22 + node_modules/lodash/_baseSortBy.js | 21 + node_modules/lodash/_baseSortedIndex.js | 42 + node_modules/lodash/_baseSortedIndexBy.js | 67 + node_modules/lodash/_baseSortedUniq.js | 30 + node_modules/lodash/_baseSum.js | 24 + node_modules/lodash/_baseTimes.js | 20 + node_modules/lodash/_baseToNumber.js | 24 + node_modules/lodash/_baseToPairs.js | 18 + node_modules/lodash/_baseToString.js | 37 + node_modules/lodash/_baseUnary.js | 14 + node_modules/lodash/_baseUniq.js | 72 + node_modules/lodash/_baseUnset.js | 20 + node_modules/lodash/_baseUpdate.js | 18 + node_modules/lodash/_baseValues.js | 19 + node_modules/lodash/_baseWhile.js | 26 + node_modules/lodash/_baseWrapperValue.js | 25 + node_modules/lodash/_baseXor.js | 36 + node_modules/lodash/_baseZipObject.js | 23 + node_modules/lodash/_cacheHas.js | 13 + node_modules/lodash/_castArrayLikeObject.js | 14 + node_modules/lodash/_castFunction.js | 14 + node_modules/lodash/_castPath.js | 21 + node_modules/lodash/_castRest.js | 14 + node_modules/lodash/_castSlice.js | 18 + node_modules/lodash/_charsEndIndex.js | 19 + node_modules/lodash/_charsStartIndex.js | 20 + node_modules/lodash/_cloneArrayBuffer.js | 16 + node_modules/lodash/_cloneBuffer.js | 35 + node_modules/lodash/_cloneDataView.js | 16 + node_modules/lodash/_cloneRegExp.js | 17 + node_modules/lodash/_cloneSymbol.js | 18 + node_modules/lodash/_cloneTypedArray.js | 16 + node_modules/lodash/_compareAscending.js | 41 + node_modules/lodash/_compareMultiple.js | 44 + node_modules/lodash/_composeArgs.js | 39 + node_modules/lodash/_composeArgsRight.js | 41 + node_modules/lodash/_copyArray.js | 20 + node_modules/lodash/_copyObject.js | 40 + node_modules/lodash/_copySymbols.js | 16 + node_modules/lodash/_copySymbolsIn.js | 16 + node_modules/lodash/_coreJsData.js | 6 + node_modules/lodash/_countHolders.js | 21 + node_modules/lodash/_createAggregator.js | 23 + node_modules/lodash/_createAssigner.js | 37 + node_modules/lodash/_createBaseEach.js | 32 + node_modules/lodash/_createBaseFor.js | 25 + node_modules/lodash/_createBind.js | 28 + node_modules/lodash/_createCaseFirst.js | 33 + node_modules/lodash/_createCompounder.js | 24 + node_modules/lodash/_createCtor.js | 37 + node_modules/lodash/_createCurry.js | 46 + node_modules/lodash/_createFind.js | 25 + node_modules/lodash/_createFlow.js | 78 + node_modules/lodash/_createHybrid.js | 92 + node_modules/lodash/_createInverter.js | 17 + node_modules/lodash/_createMathOperation.js | 38 + node_modules/lodash/_createOver.js | 27 + node_modules/lodash/_createPadding.js | 33 + node_modules/lodash/_createPartial.js | 43 + node_modules/lodash/_createRange.js | 30 + node_modules/lodash/_createRecurry.js | 56 + .../lodash/_createRelationalOperation.js | 20 + node_modules/lodash/_createRound.js | 35 + node_modules/lodash/_createSet.js | 19 + node_modules/lodash/_createToPairs.js | 30 + node_modules/lodash/_createWrap.js | 106 + .../lodash/_customDefaultsAssignIn.js | 29 + node_modules/lodash/_customDefaultsMerge.js | 28 + node_modules/lodash/_customOmitClone.js | 16 + node_modules/lodash/_deburrLetter.js | 71 + node_modules/lodash/_defineProperty.js | 11 + node_modules/lodash/_equalArrays.js | 84 + node_modules/lodash/_equalByTag.js | 112 + node_modules/lodash/_equalObjects.js | 90 + node_modules/lodash/_escapeHtmlChar.js | 21 + node_modules/lodash/_escapeStringChar.js | 22 + node_modules/lodash/_flatRest.js | 16 + node_modules/lodash/_freeGlobal.js | 4 + node_modules/lodash/_getAllKeys.js | 16 + node_modules/lodash/_getAllKeysIn.js | 17 + node_modules/lodash/_getData.js | 15 + node_modules/lodash/_getFuncName.js | 31 + node_modules/lodash/_getHolder.js | 13 + node_modules/lodash/_getMapData.js | 18 + node_modules/lodash/_getMatchData.js | 24 + node_modules/lodash/_getNative.js | 17 + node_modules/lodash/_getPrototype.js | 6 + node_modules/lodash/_getRawTag.js | 46 + node_modules/lodash/_getSymbols.js | 30 + node_modules/lodash/_getSymbolsIn.js | 25 + node_modules/lodash/_getTag.js | 58 + node_modules/lodash/_getValue.js | 13 + node_modules/lodash/_getView.js | 33 + node_modules/lodash/_getWrapDetails.js | 17 + node_modules/lodash/_hasPath.js | 39 + node_modules/lodash/_hasUnicode.js | 26 + node_modules/lodash/_hasUnicodeWord.js | 15 + node_modules/lodash/_hashClear.js | 15 + node_modules/lodash/_hashDelete.js | 17 + node_modules/lodash/_hashGet.js | 30 + node_modules/lodash/_hashHas.js | 23 + node_modules/lodash/_hashSet.js | 23 + node_modules/lodash/_initCloneArray.js | 26 + node_modules/lodash/_initCloneByTag.js | 77 + node_modules/lodash/_initCloneObject.js | 18 + node_modules/lodash/_insertWrapDetails.js | 23 + node_modules/lodash/_isFlattenable.js | 20 + node_modules/lodash/_isIndex.js | 25 + node_modules/lodash/_isIterateeCall.js | 30 + node_modules/lodash/_isKey.js | 29 + node_modules/lodash/_isKeyable.js | 15 + node_modules/lodash/_isLaziable.js | 28 + node_modules/lodash/_isMaskable.js | 14 + node_modules/lodash/_isMasked.js | 20 + node_modules/lodash/_isPrototype.js | 18 + node_modules/lodash/_isStrictComparable.js | 15 + node_modules/lodash/_iteratorToArray.js | 18 + node_modules/lodash/_lazyClone.js | 23 + node_modules/lodash/_lazyReverse.js | 23 + node_modules/lodash/_lazyValue.js | 69 + node_modules/lodash/_listCacheClear.js | 13 + node_modules/lodash/_listCacheDelete.js | 35 + node_modules/lodash/_listCacheGet.js | 19 + node_modules/lodash/_listCacheHas.js | 16 + node_modules/lodash/_listCacheSet.js | 26 + node_modules/lodash/_mapCacheClear.js | 21 + node_modules/lodash/_mapCacheDelete.js | 18 + node_modules/lodash/_mapCacheGet.js | 16 + node_modules/lodash/_mapCacheHas.js | 16 + node_modules/lodash/_mapCacheSet.js | 22 + node_modules/lodash/_mapToArray.js | 18 + .../lodash/_matchesStrictComparable.js | 20 + node_modules/lodash/_memoizeCapped.js | 26 + node_modules/lodash/_mergeData.js | 90 + node_modules/lodash/_metaMap.js | 6 + node_modules/lodash/_nativeCreate.js | 6 + node_modules/lodash/_nativeKeys.js | 6 + node_modules/lodash/_nativeKeysIn.js | 20 + node_modules/lodash/_nodeUtil.js | 30 + node_modules/lodash/_objectToString.js | 22 + node_modules/lodash/_overArg.js | 15 + node_modules/lodash/_overRest.js | 36 + node_modules/lodash/_parent.js | 16 + node_modules/lodash/_reEscape.js | 4 + node_modules/lodash/_reEvaluate.js | 4 + node_modules/lodash/_reInterpolate.js | 4 + node_modules/lodash/_realNames.js | 4 + node_modules/lodash/_reorder.js | 29 + node_modules/lodash/_replaceHolders.js | 29 + node_modules/lodash/_root.js | 9 + node_modules/lodash/_safeGet.js | 21 + node_modules/lodash/_setCacheAdd.js | 19 + node_modules/lodash/_setCacheHas.js | 14 + node_modules/lodash/_setData.js | 20 + node_modules/lodash/_setToArray.js | 18 + node_modules/lodash/_setToPairs.js | 18 + node_modules/lodash/_setToString.js | 14 + node_modules/lodash/_setWrapToString.js | 21 + node_modules/lodash/_shortOut.js | 37 + node_modules/lodash/_shuffleSelf.js | 28 + node_modules/lodash/_stackClear.js | 15 + node_modules/lodash/_stackDelete.js | 18 + node_modules/lodash/_stackGet.js | 14 + node_modules/lodash/_stackHas.js | 14 + node_modules/lodash/_stackSet.js | 34 + node_modules/lodash/_strictIndexOf.js | 23 + node_modules/lodash/_strictLastIndexOf.js | 21 + node_modules/lodash/_stringSize.js | 18 + node_modules/lodash/_stringToArray.js | 18 + node_modules/lodash/_stringToPath.js | 27 + node_modules/lodash/_toKey.js | 21 + node_modules/lodash/_toSource.js | 26 + node_modules/lodash/_unescapeHtmlChar.js | 21 + node_modules/lodash/_unicodeSize.js | 44 + node_modules/lodash/_unicodeToArray.js | 40 + node_modules/lodash/_unicodeWords.js | 69 + node_modules/lodash/_updateWrapDetails.js | 46 + node_modules/lodash/_wrapperClone.js | 23 + node_modules/lodash/add.js | 22 + node_modules/lodash/after.js | 42 + node_modules/lodash/array.js | 67 + node_modules/lodash/ary.js | 29 + node_modules/lodash/assign.js | 58 + node_modules/lodash/assignIn.js | 40 + node_modules/lodash/assignInWith.js | 38 + node_modules/lodash/assignWith.js | 37 + node_modules/lodash/at.js | 23 + node_modules/lodash/attempt.js | 35 + node_modules/lodash/before.js | 40 + node_modules/lodash/bind.js | 57 + node_modules/lodash/bindAll.js | 41 + node_modules/lodash/bindKey.js | 68 + node_modules/lodash/camelCase.js | 29 + node_modules/lodash/capitalize.js | 23 + node_modules/lodash/castArray.js | 44 + node_modules/lodash/ceil.js | 26 + node_modules/lodash/chain.js | 38 + node_modules/lodash/chunk.js | 50 + node_modules/lodash/clamp.js | 39 + node_modules/lodash/clone.js | 36 + node_modules/lodash/cloneDeep.js | 29 + node_modules/lodash/cloneDeepWith.js | 40 + node_modules/lodash/cloneWith.js | 42 + node_modules/lodash/collection.js | 30 + node_modules/lodash/commit.js | 33 + node_modules/lodash/compact.js | 31 + node_modules/lodash/concat.js | 43 + node_modules/lodash/cond.js | 60 + node_modules/lodash/conforms.js | 35 + node_modules/lodash/conformsTo.js | 32 + node_modules/lodash/constant.js | 26 + node_modules/lodash/core.js | 3877 ++++ node_modules/lodash/core.min.js | 30 + node_modules/lodash/countBy.js | 40 + node_modules/lodash/create.js | 43 + node_modules/lodash/curry.js | 57 + node_modules/lodash/curryRight.js | 54 + node_modules/lodash/date.js | 3 + node_modules/lodash/debounce.js | 191 + node_modules/lodash/deburr.js | 45 + node_modules/lodash/defaultTo.js | 25 + node_modules/lodash/defaults.js | 64 + node_modules/lodash/defaultsDeep.js | 30 + node_modules/lodash/defer.js | 26 + node_modules/lodash/delay.js | 28 + node_modules/lodash/difference.js | 33 + node_modules/lodash/differenceBy.js | 44 + node_modules/lodash/differenceWith.js | 40 + node_modules/lodash/divide.js | 22 + node_modules/lodash/drop.js | 38 + node_modules/lodash/dropRight.js | 39 + node_modules/lodash/dropRightWhile.js | 45 + node_modules/lodash/dropWhile.js | 45 + node_modules/lodash/each.js | 1 + node_modules/lodash/eachRight.js | 1 + node_modules/lodash/endsWith.js | 43 + node_modules/lodash/entries.js | 1 + node_modules/lodash/entriesIn.js | 1 + node_modules/lodash/eq.js | 37 + node_modules/lodash/escape.js | 43 + node_modules/lodash/escapeRegExp.js | 32 + node_modules/lodash/every.js | 56 + node_modules/lodash/extend.js | 1 + node_modules/lodash/extendWith.js | 1 + node_modules/lodash/fill.js | 45 + node_modules/lodash/filter.js | 52 + node_modules/lodash/find.js | 42 + node_modules/lodash/findIndex.js | 55 + node_modules/lodash/findKey.js | 44 + node_modules/lodash/findLast.js | 25 + node_modules/lodash/findLastIndex.js | 59 + node_modules/lodash/findLastKey.js | 44 + node_modules/lodash/first.js | 1 + node_modules/lodash/flatMap.js | 29 + node_modules/lodash/flatMapDeep.js | 31 + node_modules/lodash/flatMapDepth.js | 31 + node_modules/lodash/flatten.js | 22 + node_modules/lodash/flattenDeep.js | 25 + node_modules/lodash/flattenDepth.js | 33 + node_modules/lodash/flip.js | 28 + node_modules/lodash/floor.js | 26 + node_modules/lodash/flow.js | 27 + node_modules/lodash/flowRight.js | 26 + node_modules/lodash/forEach.js | 41 + node_modules/lodash/forEachRight.js | 31 + node_modules/lodash/forIn.js | 39 + node_modules/lodash/forInRight.js | 37 + node_modules/lodash/forOwn.js | 36 + node_modules/lodash/forOwnRight.js | 34 + node_modules/lodash/fp.js | 2 + node_modules/lodash/fp/F.js | 1 + node_modules/lodash/fp/T.js | 1 + node_modules/lodash/fp/__.js | 1 + node_modules/lodash/fp/_baseConvert.js | 569 + node_modules/lodash/fp/_convertBrowser.js | 18 + node_modules/lodash/fp/_falseOptions.js | 7 + node_modules/lodash/fp/_mapping.js | 358 + node_modules/lodash/fp/_util.js | 16 + node_modules/lodash/fp/add.js | 5 + node_modules/lodash/fp/after.js | 5 + node_modules/lodash/fp/all.js | 1 + node_modules/lodash/fp/allPass.js | 1 + node_modules/lodash/fp/always.js | 1 + node_modules/lodash/fp/any.js | 1 + node_modules/lodash/fp/anyPass.js | 1 + node_modules/lodash/fp/apply.js | 1 + node_modules/lodash/fp/array.js | 2 + node_modules/lodash/fp/ary.js | 5 + node_modules/lodash/fp/assign.js | 5 + node_modules/lodash/fp/assignAll.js | 5 + node_modules/lodash/fp/assignAllWith.js | 5 + node_modules/lodash/fp/assignIn.js | 5 + node_modules/lodash/fp/assignInAll.js | 5 + node_modules/lodash/fp/assignInAllWith.js | 5 + node_modules/lodash/fp/assignInWith.js | 5 + node_modules/lodash/fp/assignWith.js | 5 + node_modules/lodash/fp/assoc.js | 1 + node_modules/lodash/fp/assocPath.js | 1 + node_modules/lodash/fp/at.js | 5 + node_modules/lodash/fp/attempt.js | 5 + node_modules/lodash/fp/before.js | 5 + node_modules/lodash/fp/bind.js | 5 + node_modules/lodash/fp/bindAll.js | 5 + node_modules/lodash/fp/bindKey.js | 5 + node_modules/lodash/fp/camelCase.js | 5 + node_modules/lodash/fp/capitalize.js | 5 + node_modules/lodash/fp/castArray.js | 5 + node_modules/lodash/fp/ceil.js | 5 + node_modules/lodash/fp/chain.js | 5 + node_modules/lodash/fp/chunk.js | 5 + node_modules/lodash/fp/clamp.js | 5 + node_modules/lodash/fp/clone.js | 5 + node_modules/lodash/fp/cloneDeep.js | 5 + node_modules/lodash/fp/cloneDeepWith.js | 5 + node_modules/lodash/fp/cloneWith.js | 5 + node_modules/lodash/fp/collection.js | 2 + node_modules/lodash/fp/commit.js | 5 + node_modules/lodash/fp/compact.js | 5 + node_modules/lodash/fp/complement.js | 1 + node_modules/lodash/fp/compose.js | 1 + node_modules/lodash/fp/concat.js | 5 + node_modules/lodash/fp/cond.js | 5 + node_modules/lodash/fp/conforms.js | 1 + node_modules/lodash/fp/conformsTo.js | 5 + node_modules/lodash/fp/constant.js | 5 + node_modules/lodash/fp/contains.js | 1 + node_modules/lodash/fp/convert.js | 18 + node_modules/lodash/fp/countBy.js | 5 + node_modules/lodash/fp/create.js | 5 + node_modules/lodash/fp/curry.js | 5 + node_modules/lodash/fp/curryN.js | 5 + node_modules/lodash/fp/curryRight.js | 5 + node_modules/lodash/fp/curryRightN.js | 5 + node_modules/lodash/fp/date.js | 2 + node_modules/lodash/fp/debounce.js | 5 + node_modules/lodash/fp/deburr.js | 5 + node_modules/lodash/fp/defaultTo.js | 5 + node_modules/lodash/fp/defaults.js | 5 + node_modules/lodash/fp/defaultsAll.js | 5 + node_modules/lodash/fp/defaultsDeep.js | 5 + node_modules/lodash/fp/defaultsDeepAll.js | 5 + node_modules/lodash/fp/defer.js | 5 + node_modules/lodash/fp/delay.js | 5 + node_modules/lodash/fp/difference.js | 5 + node_modules/lodash/fp/differenceBy.js | 5 + node_modules/lodash/fp/differenceWith.js | 5 + node_modules/lodash/fp/dissoc.js | 1 + node_modules/lodash/fp/dissocPath.js | 1 + node_modules/lodash/fp/divide.js | 5 + node_modules/lodash/fp/drop.js | 5 + node_modules/lodash/fp/dropLast.js | 1 + node_modules/lodash/fp/dropLastWhile.js | 1 + node_modules/lodash/fp/dropRight.js | 5 + node_modules/lodash/fp/dropRightWhile.js | 5 + node_modules/lodash/fp/dropWhile.js | 5 + node_modules/lodash/fp/each.js | 1 + node_modules/lodash/fp/eachRight.js | 1 + node_modules/lodash/fp/endsWith.js | 5 + node_modules/lodash/fp/entries.js | 1 + node_modules/lodash/fp/entriesIn.js | 1 + node_modules/lodash/fp/eq.js | 5 + node_modules/lodash/fp/equals.js | 1 + node_modules/lodash/fp/escape.js | 5 + node_modules/lodash/fp/escapeRegExp.js | 5 + node_modules/lodash/fp/every.js | 5 + node_modules/lodash/fp/extend.js | 1 + node_modules/lodash/fp/extendAll.js | 1 + node_modules/lodash/fp/extendAllWith.js | 1 + node_modules/lodash/fp/extendWith.js | 1 + node_modules/lodash/fp/fill.js | 5 + node_modules/lodash/fp/filter.js | 5 + node_modules/lodash/fp/find.js | 5 + node_modules/lodash/fp/findFrom.js | 5 + node_modules/lodash/fp/findIndex.js | 5 + node_modules/lodash/fp/findIndexFrom.js | 5 + node_modules/lodash/fp/findKey.js | 5 + node_modules/lodash/fp/findLast.js | 5 + node_modules/lodash/fp/findLastFrom.js | 5 + node_modules/lodash/fp/findLastIndex.js | 5 + node_modules/lodash/fp/findLastIndexFrom.js | 5 + node_modules/lodash/fp/findLastKey.js | 5 + node_modules/lodash/fp/first.js | 1 + node_modules/lodash/fp/flatMap.js | 5 + node_modules/lodash/fp/flatMapDeep.js | 5 + node_modules/lodash/fp/flatMapDepth.js | 5 + node_modules/lodash/fp/flatten.js | 5 + node_modules/lodash/fp/flattenDeep.js | 5 + node_modules/lodash/fp/flattenDepth.js | 5 + node_modules/lodash/fp/flip.js | 5 + node_modules/lodash/fp/floor.js | 5 + node_modules/lodash/fp/flow.js | 5 + node_modules/lodash/fp/flowRight.js | 5 + node_modules/lodash/fp/forEach.js | 5 + node_modules/lodash/fp/forEachRight.js | 5 + node_modules/lodash/fp/forIn.js | 5 + node_modules/lodash/fp/forInRight.js | 5 + node_modules/lodash/fp/forOwn.js | 5 + node_modules/lodash/fp/forOwnRight.js | 5 + node_modules/lodash/fp/fromPairs.js | 5 + node_modules/lodash/fp/function.js | 2 + node_modules/lodash/fp/functions.js | 5 + node_modules/lodash/fp/functionsIn.js | 5 + node_modules/lodash/fp/get.js | 5 + node_modules/lodash/fp/getOr.js | 5 + node_modules/lodash/fp/groupBy.js | 5 + node_modules/lodash/fp/gt.js | 5 + node_modules/lodash/fp/gte.js | 5 + node_modules/lodash/fp/has.js | 5 + node_modules/lodash/fp/hasIn.js | 5 + node_modules/lodash/fp/head.js | 5 + node_modules/lodash/fp/identical.js | 1 + node_modules/lodash/fp/identity.js | 5 + node_modules/lodash/fp/inRange.js | 5 + node_modules/lodash/fp/includes.js | 5 + node_modules/lodash/fp/includesFrom.js | 5 + node_modules/lodash/fp/indexBy.js | 1 + node_modules/lodash/fp/indexOf.js | 5 + node_modules/lodash/fp/indexOfFrom.js | 5 + node_modules/lodash/fp/init.js | 1 + node_modules/lodash/fp/initial.js | 5 + node_modules/lodash/fp/intersection.js | 5 + node_modules/lodash/fp/intersectionBy.js | 5 + node_modules/lodash/fp/intersectionWith.js | 5 + node_modules/lodash/fp/invert.js | 5 + node_modules/lodash/fp/invertBy.js | 5 + node_modules/lodash/fp/invertObj.js | 1 + node_modules/lodash/fp/invoke.js | 5 + node_modules/lodash/fp/invokeArgs.js | 5 + node_modules/lodash/fp/invokeArgsMap.js | 5 + node_modules/lodash/fp/invokeMap.js | 5 + node_modules/lodash/fp/isArguments.js | 5 + node_modules/lodash/fp/isArray.js | 5 + node_modules/lodash/fp/isArrayBuffer.js | 5 + node_modules/lodash/fp/isArrayLike.js | 5 + node_modules/lodash/fp/isArrayLikeObject.js | 5 + node_modules/lodash/fp/isBoolean.js | 5 + node_modules/lodash/fp/isBuffer.js | 5 + node_modules/lodash/fp/isDate.js | 5 + node_modules/lodash/fp/isElement.js | 5 + node_modules/lodash/fp/isEmpty.js | 5 + node_modules/lodash/fp/isEqual.js | 5 + node_modules/lodash/fp/isEqualWith.js | 5 + node_modules/lodash/fp/isError.js | 5 + node_modules/lodash/fp/isFinite.js | 5 + node_modules/lodash/fp/isFunction.js | 5 + node_modules/lodash/fp/isInteger.js | 5 + node_modules/lodash/fp/isLength.js | 5 + node_modules/lodash/fp/isMap.js | 5 + node_modules/lodash/fp/isMatch.js | 5 + node_modules/lodash/fp/isMatchWith.js | 5 + node_modules/lodash/fp/isNaN.js | 5 + node_modules/lodash/fp/isNative.js | 5 + node_modules/lodash/fp/isNil.js | 5 + node_modules/lodash/fp/isNull.js | 5 + node_modules/lodash/fp/isNumber.js | 5 + node_modules/lodash/fp/isObject.js | 5 + node_modules/lodash/fp/isObjectLike.js | 5 + node_modules/lodash/fp/isPlainObject.js | 5 + node_modules/lodash/fp/isRegExp.js | 5 + node_modules/lodash/fp/isSafeInteger.js | 5 + node_modules/lodash/fp/isSet.js | 5 + node_modules/lodash/fp/isString.js | 5 + node_modules/lodash/fp/isSymbol.js | 5 + node_modules/lodash/fp/isTypedArray.js | 5 + node_modules/lodash/fp/isUndefined.js | 5 + node_modules/lodash/fp/isWeakMap.js | 5 + node_modules/lodash/fp/isWeakSet.js | 5 + node_modules/lodash/fp/iteratee.js | 5 + node_modules/lodash/fp/join.js | 5 + node_modules/lodash/fp/juxt.js | 1 + node_modules/lodash/fp/kebabCase.js | 5 + node_modules/lodash/fp/keyBy.js | 5 + node_modules/lodash/fp/keys.js | 5 + node_modules/lodash/fp/keysIn.js | 5 + node_modules/lodash/fp/lang.js | 2 + node_modules/lodash/fp/last.js | 5 + node_modules/lodash/fp/lastIndexOf.js | 5 + node_modules/lodash/fp/lastIndexOfFrom.js | 5 + node_modules/lodash/fp/lowerCase.js | 5 + node_modules/lodash/fp/lowerFirst.js | 5 + node_modules/lodash/fp/lt.js | 5 + node_modules/lodash/fp/lte.js | 5 + node_modules/lodash/fp/map.js | 5 + node_modules/lodash/fp/mapKeys.js | 5 + node_modules/lodash/fp/mapValues.js | 5 + node_modules/lodash/fp/matches.js | 1 + node_modules/lodash/fp/matchesProperty.js | 5 + node_modules/lodash/fp/math.js | 2 + node_modules/lodash/fp/max.js | 5 + node_modules/lodash/fp/maxBy.js | 5 + node_modules/lodash/fp/mean.js | 5 + node_modules/lodash/fp/meanBy.js | 5 + node_modules/lodash/fp/memoize.js | 5 + node_modules/lodash/fp/merge.js | 5 + node_modules/lodash/fp/mergeAll.js | 5 + node_modules/lodash/fp/mergeAllWith.js | 5 + node_modules/lodash/fp/mergeWith.js | 5 + node_modules/lodash/fp/method.js | 5 + node_modules/lodash/fp/methodOf.js | 5 + node_modules/lodash/fp/min.js | 5 + node_modules/lodash/fp/minBy.js | 5 + node_modules/lodash/fp/mixin.js | 5 + node_modules/lodash/fp/multiply.js | 5 + node_modules/lodash/fp/nAry.js | 1 + node_modules/lodash/fp/negate.js | 5 + node_modules/lodash/fp/next.js | 5 + node_modules/lodash/fp/noop.js | 5 + node_modules/lodash/fp/now.js | 5 + node_modules/lodash/fp/nth.js | 5 + node_modules/lodash/fp/nthArg.js | 5 + node_modules/lodash/fp/number.js | 2 + node_modules/lodash/fp/object.js | 2 + node_modules/lodash/fp/omit.js | 5 + node_modules/lodash/fp/omitAll.js | 1 + node_modules/lodash/fp/omitBy.js | 5 + node_modules/lodash/fp/once.js | 5 + node_modules/lodash/fp/orderBy.js | 5 + node_modules/lodash/fp/over.js | 5 + node_modules/lodash/fp/overArgs.js | 5 + node_modules/lodash/fp/overEvery.js | 5 + node_modules/lodash/fp/overSome.js | 5 + node_modules/lodash/fp/pad.js | 5 + node_modules/lodash/fp/padChars.js | 5 + node_modules/lodash/fp/padCharsEnd.js | 5 + node_modules/lodash/fp/padCharsStart.js | 5 + node_modules/lodash/fp/padEnd.js | 5 + node_modules/lodash/fp/padStart.js | 5 + node_modules/lodash/fp/parseInt.js | 5 + node_modules/lodash/fp/partial.js | 5 + node_modules/lodash/fp/partialRight.js | 5 + node_modules/lodash/fp/partition.js | 5 + node_modules/lodash/fp/path.js | 1 + node_modules/lodash/fp/pathEq.js | 1 + node_modules/lodash/fp/pathOr.js | 1 + node_modules/lodash/fp/paths.js | 1 + node_modules/lodash/fp/pick.js | 5 + node_modules/lodash/fp/pickAll.js | 1 + node_modules/lodash/fp/pickBy.js | 5 + node_modules/lodash/fp/pipe.js | 1 + node_modules/lodash/fp/placeholder.js | 6 + node_modules/lodash/fp/plant.js | 5 + node_modules/lodash/fp/pluck.js | 1 + node_modules/lodash/fp/prop.js | 1 + node_modules/lodash/fp/propEq.js | 1 + node_modules/lodash/fp/propOr.js | 1 + node_modules/lodash/fp/property.js | 1 + node_modules/lodash/fp/propertyOf.js | 5 + node_modules/lodash/fp/props.js | 1 + node_modules/lodash/fp/pull.js | 5 + node_modules/lodash/fp/pullAll.js | 5 + node_modules/lodash/fp/pullAllBy.js | 5 + node_modules/lodash/fp/pullAllWith.js | 5 + node_modules/lodash/fp/pullAt.js | 5 + node_modules/lodash/fp/random.js | 5 + node_modules/lodash/fp/range.js | 5 + node_modules/lodash/fp/rangeRight.js | 5 + node_modules/lodash/fp/rangeStep.js | 5 + node_modules/lodash/fp/rangeStepRight.js | 5 + node_modules/lodash/fp/rearg.js | 5 + node_modules/lodash/fp/reduce.js | 5 + node_modules/lodash/fp/reduceRight.js | 5 + node_modules/lodash/fp/reject.js | 5 + node_modules/lodash/fp/remove.js | 5 + node_modules/lodash/fp/repeat.js | 5 + node_modules/lodash/fp/replace.js | 5 + node_modules/lodash/fp/rest.js | 5 + node_modules/lodash/fp/restFrom.js | 5 + node_modules/lodash/fp/result.js | 5 + node_modules/lodash/fp/reverse.js | 5 + node_modules/lodash/fp/round.js | 5 + node_modules/lodash/fp/sample.js | 5 + node_modules/lodash/fp/sampleSize.js | 5 + node_modules/lodash/fp/seq.js | 2 + node_modules/lodash/fp/set.js | 5 + node_modules/lodash/fp/setWith.js | 5 + node_modules/lodash/fp/shuffle.js | 5 + node_modules/lodash/fp/size.js | 5 + node_modules/lodash/fp/slice.js | 5 + node_modules/lodash/fp/snakeCase.js | 5 + node_modules/lodash/fp/some.js | 5 + node_modules/lodash/fp/sortBy.js | 5 + node_modules/lodash/fp/sortedIndex.js | 5 + node_modules/lodash/fp/sortedIndexBy.js | 5 + node_modules/lodash/fp/sortedIndexOf.js | 5 + node_modules/lodash/fp/sortedLastIndex.js | 5 + node_modules/lodash/fp/sortedLastIndexBy.js | 5 + node_modules/lodash/fp/sortedLastIndexOf.js | 5 + node_modules/lodash/fp/sortedUniq.js | 5 + node_modules/lodash/fp/sortedUniqBy.js | 5 + node_modules/lodash/fp/split.js | 5 + node_modules/lodash/fp/spread.js | 5 + node_modules/lodash/fp/spreadFrom.js | 5 + node_modules/lodash/fp/startCase.js | 5 + node_modules/lodash/fp/startsWith.js | 5 + node_modules/lodash/fp/string.js | 2 + node_modules/lodash/fp/stubArray.js | 5 + node_modules/lodash/fp/stubFalse.js | 5 + node_modules/lodash/fp/stubObject.js | 5 + node_modules/lodash/fp/stubString.js | 5 + node_modules/lodash/fp/stubTrue.js | 5 + node_modules/lodash/fp/subtract.js | 5 + node_modules/lodash/fp/sum.js | 5 + node_modules/lodash/fp/sumBy.js | 5 + node_modules/lodash/fp/symmetricDifference.js | 1 + .../lodash/fp/symmetricDifferenceBy.js | 1 + .../lodash/fp/symmetricDifferenceWith.js | 1 + node_modules/lodash/fp/tail.js | 5 + node_modules/lodash/fp/take.js | 5 + node_modules/lodash/fp/takeLast.js | 1 + node_modules/lodash/fp/takeLastWhile.js | 1 + node_modules/lodash/fp/takeRight.js | 5 + node_modules/lodash/fp/takeRightWhile.js | 5 + node_modules/lodash/fp/takeWhile.js | 5 + node_modules/lodash/fp/tap.js | 5 + node_modules/lodash/fp/template.js | 5 + node_modules/lodash/fp/templateSettings.js | 5 + node_modules/lodash/fp/throttle.js | 5 + node_modules/lodash/fp/thru.js | 5 + node_modules/lodash/fp/times.js | 5 + node_modules/lodash/fp/toArray.js | 5 + node_modules/lodash/fp/toFinite.js | 5 + node_modules/lodash/fp/toInteger.js | 5 + node_modules/lodash/fp/toIterator.js | 5 + node_modules/lodash/fp/toJSON.js | 5 + node_modules/lodash/fp/toLength.js | 5 + node_modules/lodash/fp/toLower.js | 5 + node_modules/lodash/fp/toNumber.js | 5 + node_modules/lodash/fp/toPairs.js | 5 + node_modules/lodash/fp/toPairsIn.js | 5 + node_modules/lodash/fp/toPath.js | 5 + node_modules/lodash/fp/toPlainObject.js | 5 + node_modules/lodash/fp/toSafeInteger.js | 5 + node_modules/lodash/fp/toString.js | 5 + node_modules/lodash/fp/toUpper.js | 5 + node_modules/lodash/fp/transform.js | 5 + node_modules/lodash/fp/trim.js | 5 + node_modules/lodash/fp/trimChars.js | 5 + node_modules/lodash/fp/trimCharsEnd.js | 5 + node_modules/lodash/fp/trimCharsStart.js | 5 + node_modules/lodash/fp/trimEnd.js | 5 + node_modules/lodash/fp/trimStart.js | 5 + node_modules/lodash/fp/truncate.js | 5 + node_modules/lodash/fp/unapply.js | 1 + node_modules/lodash/fp/unary.js | 5 + node_modules/lodash/fp/unescape.js | 5 + node_modules/lodash/fp/union.js | 5 + node_modules/lodash/fp/unionBy.js | 5 + node_modules/lodash/fp/unionWith.js | 5 + node_modules/lodash/fp/uniq.js | 5 + node_modules/lodash/fp/uniqBy.js | 5 + node_modules/lodash/fp/uniqWith.js | 5 + node_modules/lodash/fp/uniqueId.js | 5 + node_modules/lodash/fp/unnest.js | 1 + node_modules/lodash/fp/unset.js | 5 + node_modules/lodash/fp/unzip.js | 5 + node_modules/lodash/fp/unzipWith.js | 5 + node_modules/lodash/fp/update.js | 5 + node_modules/lodash/fp/updateWith.js | 5 + node_modules/lodash/fp/upperCase.js | 5 + node_modules/lodash/fp/upperFirst.js | 5 + node_modules/lodash/fp/useWith.js | 1 + node_modules/lodash/fp/util.js | 2 + node_modules/lodash/fp/value.js | 5 + node_modules/lodash/fp/valueOf.js | 5 + node_modules/lodash/fp/values.js | 5 + node_modules/lodash/fp/valuesIn.js | 5 + node_modules/lodash/fp/where.js | 1 + node_modules/lodash/fp/whereEq.js | 1 + node_modules/lodash/fp/without.js | 5 + node_modules/lodash/fp/words.js | 5 + node_modules/lodash/fp/wrap.js | 5 + node_modules/lodash/fp/wrapperAt.js | 5 + node_modules/lodash/fp/wrapperChain.js | 5 + node_modules/lodash/fp/wrapperLodash.js | 5 + node_modules/lodash/fp/wrapperReverse.js | 5 + node_modules/lodash/fp/wrapperValue.js | 5 + node_modules/lodash/fp/xor.js | 5 + node_modules/lodash/fp/xorBy.js | 5 + node_modules/lodash/fp/xorWith.js | 5 + node_modules/lodash/fp/zip.js | 5 + node_modules/lodash/fp/zipAll.js | 5 + node_modules/lodash/fp/zipObj.js | 1 + node_modules/lodash/fp/zipObject.js | 5 + node_modules/lodash/fp/zipObjectDeep.js | 5 + node_modules/lodash/fp/zipWith.js | 5 + node_modules/lodash/fromPairs.js | 28 + node_modules/lodash/function.js | 25 + node_modules/lodash/functions.js | 31 + node_modules/lodash/functionsIn.js | 31 + node_modules/lodash/get.js | 33 + node_modules/lodash/groupBy.js | 41 + node_modules/lodash/gt.js | 29 + node_modules/lodash/gte.js | 30 + node_modules/lodash/has.js | 35 + node_modules/lodash/hasIn.js | 34 + node_modules/lodash/head.js | 23 + node_modules/lodash/identity.js | 21 + node_modules/lodash/inRange.js | 55 + node_modules/lodash/includes.js | 53 + node_modules/lodash/index.js | 1 + node_modules/lodash/indexOf.js | 42 + node_modules/lodash/initial.js | 22 + node_modules/lodash/intersection.js | 30 + node_modules/lodash/intersectionBy.js | 45 + node_modules/lodash/intersectionWith.js | 41 + node_modules/lodash/invert.js | 42 + node_modules/lodash/invertBy.js | 56 + node_modules/lodash/invoke.js | 24 + node_modules/lodash/invokeMap.js | 41 + node_modules/lodash/isArguments.js | 36 + node_modules/lodash/isArray.js | 26 + node_modules/lodash/isArrayBuffer.js | 27 + node_modules/lodash/isArrayLike.js | 33 + node_modules/lodash/isArrayLikeObject.js | 33 + node_modules/lodash/isBoolean.js | 29 + node_modules/lodash/isBuffer.js | 38 + node_modules/lodash/isDate.js | 27 + node_modules/lodash/isElement.js | 25 + node_modules/lodash/isEmpty.js | 77 + node_modules/lodash/isEqual.js | 35 + node_modules/lodash/isEqualWith.js | 41 + node_modules/lodash/isError.js | 36 + node_modules/lodash/isFinite.js | 36 + node_modules/lodash/isFunction.js | 37 + node_modules/lodash/isInteger.js | 33 + node_modules/lodash/isLength.js | 35 + node_modules/lodash/isMap.js | 27 + node_modules/lodash/isMatch.js | 36 + node_modules/lodash/isMatchWith.js | 41 + node_modules/lodash/isNaN.js | 38 + node_modules/lodash/isNative.js | 40 + node_modules/lodash/isNil.js | 25 + node_modules/lodash/isNull.js | 22 + node_modules/lodash/isNumber.js | 38 + node_modules/lodash/isObject.js | 31 + node_modules/lodash/isObjectLike.js | 29 + node_modules/lodash/isPlainObject.js | 62 + node_modules/lodash/isRegExp.js | 27 + node_modules/lodash/isSafeInteger.js | 37 + node_modules/lodash/isSet.js | 27 + node_modules/lodash/isString.js | 30 + node_modules/lodash/isSymbol.js | 29 + node_modules/lodash/isTypedArray.js | 27 + node_modules/lodash/isUndefined.js | 22 + node_modules/lodash/isWeakMap.js | 28 + node_modules/lodash/isWeakSet.js | 28 + node_modules/lodash/iteratee.js | 53 + node_modules/lodash/join.js | 26 + node_modules/lodash/kebabCase.js | 28 + node_modules/lodash/keyBy.js | 36 + node_modules/lodash/keys.js | 37 + node_modules/lodash/keysIn.js | 32 + node_modules/lodash/lang.js | 58 + node_modules/lodash/last.js | 20 + node_modules/lodash/lastIndexOf.js | 46 + node_modules/lodash/lodash.js | 17161 ++++++++++++++++ node_modules/lodash/lodash.min.js | 139 + node_modules/lodash/lowerCase.js | 27 + node_modules/lodash/lowerFirst.js | 22 + node_modules/lodash/lt.js | 29 + node_modules/lodash/lte.js | 30 + node_modules/lodash/map.js | 53 + node_modules/lodash/mapKeys.js | 36 + node_modules/lodash/mapValues.js | 43 + node_modules/lodash/matches.js | 46 + node_modules/lodash/matchesProperty.js | 44 + node_modules/lodash/math.js | 17 + node_modules/lodash/max.js | 29 + node_modules/lodash/maxBy.js | 34 + node_modules/lodash/mean.js | 22 + node_modules/lodash/meanBy.js | 31 + node_modules/lodash/memoize.js | 73 + node_modules/lodash/merge.js | 39 + node_modules/lodash/mergeWith.js | 39 + node_modules/lodash/method.js | 34 + node_modules/lodash/methodOf.js | 33 + node_modules/lodash/min.js | 29 + node_modules/lodash/minBy.js | 34 + node_modules/lodash/mixin.js | 74 + node_modules/lodash/multiply.js | 22 + node_modules/lodash/negate.js | 40 + node_modules/lodash/next.js | 35 + node_modules/lodash/noop.js | 17 + node_modules/lodash/now.js | 23 + node_modules/lodash/nth.js | 29 + node_modules/lodash/nthArg.js | 32 + node_modules/lodash/number.js | 5 + node_modules/lodash/object.js | 49 + node_modules/lodash/omit.js | 57 + node_modules/lodash/omitBy.js | 29 + node_modules/lodash/once.js | 25 + node_modules/lodash/orderBy.js | 47 + node_modules/lodash/over.js | 24 + node_modules/lodash/overArgs.js | 61 + node_modules/lodash/overEvery.js | 34 + node_modules/lodash/overSome.js | 37 + node_modules/lodash/package.json | 66 + node_modules/lodash/pad.js | 49 + node_modules/lodash/padEnd.js | 39 + node_modules/lodash/padStart.js | 39 + node_modules/lodash/parseInt.js | 43 + node_modules/lodash/partial.js | 50 + node_modules/lodash/partialRight.js | 49 + node_modules/lodash/partition.js | 43 + node_modules/lodash/pick.js | 25 + node_modules/lodash/pickBy.js | 37 + node_modules/lodash/plant.js | 48 + node_modules/lodash/property.js | 32 + node_modules/lodash/propertyOf.js | 30 + node_modules/lodash/pull.js | 29 + node_modules/lodash/pullAll.js | 29 + node_modules/lodash/pullAllBy.js | 33 + node_modules/lodash/pullAllWith.js | 32 + node_modules/lodash/pullAt.js | 43 + node_modules/lodash/random.js | 82 + node_modules/lodash/range.js | 46 + node_modules/lodash/rangeRight.js | 41 + node_modules/lodash/rearg.js | 33 + node_modules/lodash/reduce.js | 51 + node_modules/lodash/reduceRight.js | 36 + node_modules/lodash/reject.js | 46 + node_modules/lodash/remove.js | 53 + node_modules/lodash/repeat.js | 37 + node_modules/lodash/replace.js | 29 + node_modules/lodash/rest.js | 40 + node_modules/lodash/result.js | 56 + node_modules/lodash/reverse.js | 34 + node_modules/lodash/round.js | 26 + node_modules/lodash/sample.js | 24 + node_modules/lodash/sampleSize.js | 37 + node_modules/lodash/seq.js | 16 + node_modules/lodash/set.js | 35 + node_modules/lodash/setWith.js | 32 + node_modules/lodash/shuffle.js | 25 + node_modules/lodash/size.js | 46 + node_modules/lodash/slice.js | 37 + node_modules/lodash/snakeCase.js | 28 + node_modules/lodash/some.js | 51 + node_modules/lodash/sortBy.js | 48 + node_modules/lodash/sortedIndex.js | 24 + node_modules/lodash/sortedIndexBy.js | 33 + node_modules/lodash/sortedIndexOf.js | 31 + node_modules/lodash/sortedLastIndex.js | 25 + node_modules/lodash/sortedLastIndexBy.js | 33 + node_modules/lodash/sortedLastIndexOf.js | 31 + node_modules/lodash/sortedUniq.js | 24 + node_modules/lodash/sortedUniqBy.js | 26 + node_modules/lodash/split.js | 52 + node_modules/lodash/spread.js | 63 + node_modules/lodash/startCase.js | 29 + node_modules/lodash/startsWith.js | 39 + node_modules/lodash/string.js | 33 + node_modules/lodash/stubArray.js | 23 + node_modules/lodash/stubFalse.js | 18 + node_modules/lodash/stubObject.js | 23 + node_modules/lodash/stubString.js | 18 + node_modules/lodash/stubTrue.js | 18 + node_modules/lodash/subtract.js | 22 + node_modules/lodash/sum.js | 24 + node_modules/lodash/sumBy.js | 33 + node_modules/lodash/tail.js | 22 + node_modules/lodash/take.js | 37 + node_modules/lodash/takeRight.js | 39 + node_modules/lodash/takeRightWhile.js | 45 + node_modules/lodash/takeWhile.js | 45 + node_modules/lodash/tap.js | 29 + node_modules/lodash/template.js | 251 + node_modules/lodash/templateSettings.js | 67 + node_modules/lodash/throttle.js | 69 + node_modules/lodash/thru.js | 28 + node_modules/lodash/times.js | 51 + node_modules/lodash/toArray.js | 58 + node_modules/lodash/toFinite.js | 42 + node_modules/lodash/toInteger.js | 36 + node_modules/lodash/toIterator.js | 23 + node_modules/lodash/toJSON.js | 1 + node_modules/lodash/toLength.js | 38 + node_modules/lodash/toLower.js | 28 + node_modules/lodash/toNumber.js | 66 + node_modules/lodash/toPairs.js | 30 + node_modules/lodash/toPairsIn.js | 30 + node_modules/lodash/toPath.js | 33 + node_modules/lodash/toPlainObject.js | 32 + node_modules/lodash/toSafeInteger.js | 37 + node_modules/lodash/toString.js | 28 + node_modules/lodash/toUpper.js | 28 + node_modules/lodash/transform.js | 65 + node_modules/lodash/trim.js | 49 + node_modules/lodash/trimEnd.js | 43 + node_modules/lodash/trimStart.js | 43 + node_modules/lodash/truncate.js | 111 + node_modules/lodash/unary.js | 22 + node_modules/lodash/unescape.js | 34 + node_modules/lodash/union.js | 26 + node_modules/lodash/unionBy.js | 39 + node_modules/lodash/unionWith.js | 34 + node_modules/lodash/uniq.js | 25 + node_modules/lodash/uniqBy.js | 31 + node_modules/lodash/uniqWith.js | 28 + node_modules/lodash/uniqueId.js | 28 + node_modules/lodash/unset.js | 34 + node_modules/lodash/unzip.js | 45 + node_modules/lodash/unzipWith.js | 39 + node_modules/lodash/update.js | 35 + node_modules/lodash/updateWith.js | 33 + node_modules/lodash/upperCase.js | 27 + node_modules/lodash/upperFirst.js | 22 + node_modules/lodash/util.js | 34 + node_modules/lodash/value.js | 1 + node_modules/lodash/valueOf.js | 1 + node_modules/lodash/values.js | 34 + node_modules/lodash/valuesIn.js | 32 + node_modules/lodash/without.js | 31 + node_modules/lodash/words.js | 35 + node_modules/lodash/wrap.js | 30 + node_modules/lodash/wrapperAt.js | 48 + node_modules/lodash/wrapperChain.js | 34 + node_modules/lodash/wrapperLodash.js | 147 + node_modules/lodash/wrapperReverse.js | 44 + node_modules/lodash/wrapperValue.js | 21 + node_modules/lodash/xor.js | 28 + node_modules/lodash/xorBy.js | 39 + node_modules/lodash/xorWith.js | 34 + node_modules/lodash/zip.js | 22 + node_modules/lodash/zipObject.js | 24 + node_modules/lodash/zipObjectDeep.js | 23 + node_modules/lodash/zipWith.js | 32 + node_modules/lowercase-keys/index.js | 11 + node_modules/lowercase-keys/license | 21 + node_modules/lowercase-keys/package.json | 71 + node_modules/lowercase-keys/readme.md | 33 + node_modules/lru-cache/LICENSE | 15 + node_modules/lru-cache/README.md | 158 + node_modules/lru-cache/index.js | 468 + .../lru-cache/node_modules/yallist/LICENSE | 15 + .../lru-cache/node_modules/yallist/README.md | 204 + .../node_modules/yallist/iterator.js | 7 + .../node_modules/yallist/package.json | 66 + .../lru-cache/node_modules/yallist/yallist.js | 370 + node_modules/lru-cache/package.json | 75 + node_modules/make-dir/index.js | 85 + node_modules/make-dir/license | 9 + node_modules/make-dir/package.json | 90 + node_modules/make-dir/readme.md | 116 + node_modules/make-iterator/LICENSE | 21 + node_modules/make-iterator/README.md | 102 + node_modules/make-iterator/index.js | 99 + node_modules/make-iterator/package.json | 102 + node_modules/map-cache/LICENSE | 21 + node_modules/map-cache/README.md | 145 + node_modules/map-cache/index.js | 100 + node_modules/map-cache/package.json | 95 + node_modules/map-visit/LICENSE | 21 + node_modules/map-visit/README.md | 155 + node_modules/map-visit/index.js | 37 + node_modules/map-visit/package.json | 116 + node_modules/media-typer/HISTORY.md | 22 + node_modules/media-typer/LICENSE | 22 + node_modules/media-typer/README.md | 81 + node_modules/media-typer/index.js | 270 + node_modules/media-typer/package.json | 64 + node_modules/merge-descriptors/HISTORY.md | 21 + node_modules/merge-descriptors/LICENSE | 23 + node_modules/merge-descriptors/README.md | 48 + node_modules/merge-descriptors/index.js | 60 + node_modules/merge-descriptors/package.json | 72 + node_modules/methods/HISTORY.md | 29 + node_modules/methods/LICENSE | 24 + node_modules/methods/README.md | 51 + node_modules/methods/index.js | 69 + node_modules/methods/package.json | 82 + node_modules/micromatch/CHANGELOG.md | 37 + node_modules/micromatch/LICENSE | 21 + node_modules/micromatch/README.md | 1150 ++ node_modules/micromatch/index.js | 877 + node_modules/micromatch/lib/.DS_Store | Bin 0 -> 6148 bytes node_modules/micromatch/lib/cache.js | 1 + node_modules/micromatch/lib/compilers.js | 77 + node_modules/micromatch/lib/parsers.js | 83 + node_modules/micromatch/lib/utils.js | 309 + node_modules/micromatch/package.json | 219 + node_modules/mime-db/HISTORY.md | 439 + node_modules/mime-db/LICENSE | 22 + node_modules/mime-db/README.md | 100 + node_modules/mime-db/db.json | 8060 ++++++++ node_modules/mime-db/index.js | 11 + node_modules/mime-db/package.json | 104 + node_modules/mime-types/HISTORY.md | 325 + node_modules/mime-types/LICENSE | 23 + node_modules/mime-types/README.md | 113 + node_modules/mime-types/index.js | 188 + node_modules/mime-types/package.json | 92 + node_modules/mime/.npmignore | 0 node_modules/mime/CHANGELOG.md | 164 + node_modules/mime/LICENSE | 21 + node_modules/mime/README.md | 90 + node_modules/mime/cli.js | 8 + node_modules/mime/mime.js | 108 + node_modules/mime/package.json | 76 + node_modules/mime/src/build.js | 53 + node_modules/mime/src/test.js | 60 + node_modules/mime/types.json | 1 + node_modules/minimatch/LICENSE | 15 + node_modules/minimatch/README.md | 209 + node_modules/minimatch/minimatch.js | 923 + node_modules/minimatch/package.json | 68 + node_modules/minimist/.travis.yml | 8 + node_modules/minimist/LICENSE | 18 + node_modules/minimist/example/parse.js | 2 + node_modules/minimist/index.js | 245 + node_modules/minimist/package.json | 76 + node_modules/minimist/readme.markdown | 95 + node_modules/minimist/test/all_bool.js | 32 + node_modules/minimist/test/bool.js | 178 + node_modules/minimist/test/dash.js | 31 + node_modules/minimist/test/default_bool.js | 35 + node_modules/minimist/test/dotted.js | 22 + node_modules/minimist/test/kv_short.js | 16 + node_modules/minimist/test/long.js | 31 + node_modules/minimist/test/num.js | 36 + node_modules/minimist/test/parse.js | 197 + node_modules/minimist/test/parse_modified.js | 9 + node_modules/minimist/test/proto.js | 44 + node_modules/minimist/test/short.js | 67 + node_modules/minimist/test/stop_early.js | 15 + node_modules/minimist/test/unknown.js | 102 + node_modules/minimist/test/whitespace.js | 8 + node_modules/minipass/LICENSE | 15 + node_modules/minipass/README.md | 606 + node_modules/minipass/index.js | 537 + node_modules/minipass/package.json | 75 + node_modules/minizlib/LICENSE | 26 + node_modules/minizlib/README.md | 53 + node_modules/minizlib/constants.js | 115 + node_modules/minizlib/index.js | 320 + node_modules/minizlib/package.json | 74 + node_modules/mixin-deep/LICENSE | 21 + node_modules/mixin-deep/README.md | 80 + node_modules/mixin-deep/index.js | 64 + .../node_modules/is-extendable/LICENSE | 21 + .../node_modules/is-extendable/README.md | 88 + .../node_modules/is-extendable/index.d.ts | 5 + .../node_modules/is-extendable/index.js | 14 + .../node_modules/is-extendable/package.json | 101 + node_modules/mixin-deep/package.json | 101 + node_modules/mkdirp/LICENSE | 21 + node_modules/mkdirp/bin/cmd.js | 33 + node_modules/mkdirp/bin/usage.txt | 12 + node_modules/mkdirp/index.js | 99 + node_modules/mkdirp/package.json | 74 + node_modules/mkdirp/readme.markdown | 100 + node_modules/ms/index.js | 152 + node_modules/ms/license.md | 21 + node_modules/ms/package.json | 72 + node_modules/ms/readme.md | 51 + node_modules/nan/CHANGELOG.md | 529 + node_modules/nan/LICENSE.md | 13 + node_modules/nan/README.md | 456 + node_modules/nan/doc/asyncworker.md | 146 + node_modules/nan/doc/buffers.md | 54 + node_modules/nan/doc/callback.md | 76 + node_modules/nan/doc/converters.md | 41 + node_modules/nan/doc/errors.md | 226 + node_modules/nan/doc/json.md | 62 + node_modules/nan/doc/maybe_types.md | 583 + node_modules/nan/doc/methods.md | 661 + node_modules/nan/doc/new.md | 147 + node_modules/nan/doc/node_misc.md | 123 + node_modules/nan/doc/object_wrappers.md | 263 + node_modules/nan/doc/persistent.md | 296 + node_modules/nan/doc/scopes.md | 73 + node_modules/nan/doc/script.md | 38 + node_modules/nan/doc/string_bytes.md | 62 + node_modules/nan/doc/v8_internals.md | 199 + node_modules/nan/doc/v8_misc.md | 85 + node_modules/nan/include_dirs.js | 1 + node_modules/nan/nan.h | 2892 +++ node_modules/nan/nan_callbacks.h | 88 + node_modules/nan/nan_callbacks_12_inl.h | 514 + node_modules/nan/nan_callbacks_pre_12_inl.h | 520 + node_modules/nan/nan_converters.h | 72 + node_modules/nan/nan_converters_43_inl.h | 68 + node_modules/nan/nan_converters_pre_43_inl.h | 42 + .../nan/nan_define_own_property_helper.h | 29 + node_modules/nan/nan_implementation_12_inl.h | 430 + .../nan/nan_implementation_pre_12_inl.h | 263 + node_modules/nan/nan_json.h | 166 + node_modules/nan/nan_maybe_43_inl.h | 356 + node_modules/nan/nan_maybe_pre_43_inl.h | 268 + node_modules/nan/nan_new.h | 340 + node_modules/nan/nan_object_wrap.h | 156 + node_modules/nan/nan_persistent_12_inl.h | 132 + node_modules/nan/nan_persistent_pre_12_inl.h | 242 + node_modules/nan/nan_private.h | 73 + node_modules/nan/nan_string_bytes.h | 305 + node_modules/nan/nan_typedarray_contents.h | 90 + node_modules/nan/nan_weak.h | 437 + node_modules/nan/package.json | 101 + node_modules/nan/tools/1to2.js | 412 + node_modules/nan/tools/README.md | 14 + node_modules/nan/tools/package.json | 19 + node_modules/nanomatch/CHANGELOG.md | 57 + node_modules/nanomatch/LICENSE | 21 + node_modules/nanomatch/README.md | 1148 ++ node_modules/nanomatch/index.js | 838 + node_modules/nanomatch/lib/cache.js | 1 + node_modules/nanomatch/lib/compilers.js | 339 + node_modules/nanomatch/lib/parsers.js | 386 + node_modules/nanomatch/lib/utils.js | 379 + node_modules/nanomatch/package.json | 174 + .../needle/.github/workflows/nodejs.yml | 27 + node_modules/needle/README.md | 593 + node_modules/needle/bin/needle | 40 + .../needle/examples/deflated-stream.js | 22 + node_modules/needle/examples/digest-auth.js | 16 + .../needle/examples/download-to-file.js | 18 + .../needle/examples/multipart-stream.js | 25 + node_modules/needle/examples/parsed-stream.js | 23 + .../needle/examples/parsed-stream2.js | 21 + node_modules/needle/examples/stream-events.js | 23 + .../needle/examples/stream-to-file.js | 14 + node_modules/needle/examples/upload-image.js | 51 + node_modules/needle/lib/auth.js | 110 + node_modules/needle/lib/cookies.js | 79 + node_modules/needle/lib/decoder.js | 53 + node_modules/needle/lib/multipart.js | 98 + node_modules/needle/lib/needle.js | 803 + node_modules/needle/lib/parsers.js | 120 + node_modules/needle/lib/querystring.js | 49 + node_modules/needle/license.txt | 19 + .../needle/node_modules/debug/CHANGELOG.md | 395 + .../needle/node_modules/debug/LICENSE | 19 + .../needle/node_modules/debug/README.md | 437 + .../needle/node_modules/debug/dist/debug.js | 886 + .../needle/node_modules/debug/node.js | 1 + .../needle/node_modules/debug/package.json | 93 + .../needle/node_modules/debug/src/browser.js | 180 + .../needle/node_modules/debug/src/common.js | 249 + .../needle/node_modules/debug/src/index.js | 12 + .../needle/node_modules/debug/src/node.js | 174 + node_modules/needle/node_modules/ms/index.js | 162 + .../needle/node_modules/ms/license.md | 21 + .../needle/node_modules/ms/package.json | 72 + node_modules/needle/node_modules/ms/readme.md | 60 + node_modules/needle/package.json | 105 + node_modules/needle/test/basic_auth_spec.js | 196 + node_modules/needle/test/compression_spec.js | 112 + node_modules/needle/test/cookies_spec.js | 305 + node_modules/needle/test/decoder_spec.js | 86 + node_modules/needle/test/errors_spec.js | 286 + node_modules/needle/test/headers_spec.js | 198 + node_modules/needle/test/helpers.js | 72 + node_modules/needle/test/long_string_spec.js | 34 + node_modules/needle/test/output_spec.js | 254 + node_modules/needle/test/parsing_spec.js | 494 + node_modules/needle/test/post_data_spec.js | 1021 + node_modules/needle/test/proxy_spec.js | 202 + node_modules/needle/test/querystring_spec.js | 128 + node_modules/needle/test/redirect_spec.js | 392 + .../needle/test/redirect_with_timeout.js | 45 + .../needle/test/request_stream_spec.js | 202 + .../needle/test/response_stream_spec.js | 139 + node_modules/needle/test/socket_pool_spec.js | 66 + node_modules/needle/test/url_spec.js | 155 + node_modules/needle/test/utils/formidable.js | 17 + node_modules/needle/test/utils/proxy.js | 62 + node_modules/needle/test/utils/test.js | 104 + node_modules/negotiator/HISTORY.md | 103 + node_modules/negotiator/LICENSE | 24 + node_modules/negotiator/README.md | 203 + node_modules/negotiator/index.js | 124 + node_modules/negotiator/lib/charset.js | 169 + node_modules/negotiator/lib/encoding.js | 184 + node_modules/negotiator/lib/language.js | 179 + node_modules/negotiator/lib/mediaType.js | 294 + node_modules/negotiator/package.json | 87 + node_modules/nocache/CHANGELOG.md | 12 + node_modules/nocache/LICENSE | 21 + node_modules/nocache/README.md | 19 + node_modules/nocache/dist/index.d.ts | 4 + node_modules/nocache/dist/index.js | 10 + node_modules/nocache/package.json | 98 + node_modules/node-pre-gyp/CHANGELOG.md | 427 + node_modules/node-pre-gyp/LICENSE | 27 + node_modules/node-pre-gyp/README.md | 693 + node_modules/node-pre-gyp/appveyor.yml | 30 + node_modules/node-pre-gyp/bin/node-pre-gyp | 134 + .../node-pre-gyp/bin/node-pre-gyp.cmd | 2 + node_modules/node-pre-gyp/contributing.md | 10 + node_modules/node-pre-gyp/lib/build.js | 51 + node_modules/node-pre-gyp/lib/clean.js | 32 + node_modules/node-pre-gyp/lib/configure.js | 52 + node_modules/node-pre-gyp/lib/info.js | 40 + node_modules/node-pre-gyp/lib/install.js | 245 + node_modules/node-pre-gyp/lib/node-pre-gyp.js | 203 + node_modules/node-pre-gyp/lib/package.js | 56 + node_modules/node-pre-gyp/lib/pre-binding.js | 30 + node_modules/node-pre-gyp/lib/publish.js | 79 + node_modules/node-pre-gyp/lib/rebuild.js | 21 + node_modules/node-pre-gyp/lib/reinstall.js | 20 + node_modules/node-pre-gyp/lib/reveal.js | 33 + node_modules/node-pre-gyp/lib/testbinary.js | 81 + node_modules/node-pre-gyp/lib/testpackage.js | 55 + node_modules/node-pre-gyp/lib/unpublish.js | 43 + .../node-pre-gyp/lib/util/abi_crosswalk.json | 1790 ++ node_modules/node-pre-gyp/lib/util/compile.js | 87 + .../node-pre-gyp/lib/util/handle_gyp_opts.js | 103 + node_modules/node-pre-gyp/lib/util/napi.js | 204 + .../lib/util/nw-pre-gyp/index.html | 26 + .../lib/util/nw-pre-gyp/package.json | 9 + .../node-pre-gyp/lib/util/s3_setup.js | 27 + .../node-pre-gyp/lib/util/versioning.js | 331 + node_modules/node-pre-gyp/package.json | 89 + node_modules/nodejs/1/getmodule.js | 4 + node_modules/nodejs/1/module.js | 8 + node_modules/nodejs/1/singleobject.js | 14 + node_modules/nodejs/package.json | 39 + node_modules/nodemon/.jscsrc | 13 + node_modules/nodemon/.jshintrc | 16 + node_modules/nodemon/.travis.yml | 18 + node_modules/nodemon/LICENSE | 21 + node_modules/nodemon/README.md | 379 + node_modules/nodemon/bin/nodemon.js | 16 + node_modules/nodemon/bin/postinstall.js | 29 + node_modules/nodemon/commitlint.config.js | 7 + node_modules/nodemon/doc/cli/authors.txt | 8 + node_modules/nodemon/doc/cli/config.txt | 44 + node_modules/nodemon/doc/cli/help.txt | 29 + node_modules/nodemon/doc/cli/logo.txt | 20 + node_modules/nodemon/doc/cli/options.txt | 36 + node_modules/nodemon/doc/cli/topics.txt | 8 + node_modules/nodemon/doc/cli/usage.txt | 3 + node_modules/nodemon/doc/cli/whoami.txt | 9 + node_modules/nodemon/lib/cli/index.js | 49 + node_modules/nodemon/lib/cli/parse.js | 230 + node_modules/nodemon/lib/config/command.js | 43 + node_modules/nodemon/lib/config/defaults.js | 28 + node_modules/nodemon/lib/config/exec.js | 225 + node_modules/nodemon/lib/config/index.js | 93 + node_modules/nodemon/lib/config/load.js | 254 + node_modules/nodemon/lib/help/index.js | 27 + node_modules/nodemon/lib/index.js | 1 + node_modules/nodemon/lib/monitor/index.js | 4 + node_modules/nodemon/lib/monitor/match.js | 269 + node_modules/nodemon/lib/monitor/run.js | 459 + node_modules/nodemon/lib/monitor/signals.js | 34 + node_modules/nodemon/lib/monitor/watch.js | 239 + node_modules/nodemon/lib/nodemon.js | 309 + node_modules/nodemon/lib/rules/add.js | 89 + node_modules/nodemon/lib/rules/index.js | 53 + node_modules/nodemon/lib/rules/parse.js | 43 + node_modules/nodemon/lib/spawn.js | 55 + node_modules/nodemon/lib/utils/bus.js | 44 + node_modules/nodemon/lib/utils/clone.js | 40 + node_modules/nodemon/lib/utils/colour.js | 26 + node_modules/nodemon/lib/utils/index.js | 102 + node_modules/nodemon/lib/utils/log.js | 82 + node_modules/nodemon/lib/utils/merge.js | 47 + node_modules/nodemon/lib/version.js | 100 + .../nodemon/node_modules/debug/CHANGELOG.md | 395 + .../nodemon/node_modules/debug/LICENSE | 19 + .../nodemon/node_modules/debug/README.md | 437 + .../nodemon/node_modules/debug/dist/debug.js | 886 + .../nodemon/node_modules/debug/node.js | 1 + .../nodemon/node_modules/debug/package.json | 94 + .../nodemon/node_modules/debug/src/browser.js | 180 + .../nodemon/node_modules/debug/src/common.js | 249 + .../nodemon/node_modules/debug/src/index.js | 12 + .../nodemon/node_modules/debug/src/node.js | 174 + node_modules/nodemon/node_modules/ms/index.js | 162 + .../nodemon/node_modules/ms/license.md | 21 + .../nodemon/node_modules/ms/package.json | 73 + .../nodemon/node_modules/ms/readme.md | 60 + node_modules/nodemon/package.json | 102 + node_modules/nopt/.npmignore | 1 + node_modules/nopt/.travis.yml | 8 + node_modules/nopt/CHANGELOG.md | 58 + node_modules/nopt/LICENSE | 15 + node_modules/nopt/README.md | 213 + node_modules/nopt/bin/nopt.js | 54 + node_modules/nopt/examples/my-program.js | 30 + node_modules/nopt/lib/nopt.js | 436 + node_modules/nopt/package.json | 61 + node_modules/nopt/test/basic.js | 303 + node_modules/normalize-path/LICENSE | 21 + node_modules/normalize-path/README.md | 127 + node_modules/normalize-path/index.js | 35 + node_modules/normalize-path/package.json | 119 + node_modules/npm-bundled/LICENSE | 15 + node_modules/npm-bundled/README.md | 48 + node_modules/npm-bundled/index.js | 249 + node_modules/npm-bundled/package.json | 66 + .../.github/settings.yml | 2 + .../npm-normalize-package-bin/.npmignore | 24 + .../npm-normalize-package-bin/LICENSE | 15 + .../npm-normalize-package-bin/README.md | 14 + .../npm-normalize-package-bin/index.js | 60 + .../package-lock.json | 3529 ++++ .../npm-normalize-package-bin/package.json | 61 + .../npm-normalize-package-bin/test/array.js | 37 + .../npm-normalize-package-bin/test/nobin.js | 35 + .../npm-normalize-package-bin/test/object.js | 141 + .../npm-normalize-package-bin/test/string.js | 37 + node_modules/npm-packlist/LICENSE | 15 + node_modules/npm-packlist/README.md | 68 + node_modules/npm-packlist/index.js | 289 + node_modules/npm-packlist/package.json | 77 + node_modules/npm-run-path/index.js | 39 + node_modules/npm-run-path/license | 21 + node_modules/npm-run-path/package.json | 81 + node_modules/npm-run-path/readme.md | 81 + node_modules/npmlog/CHANGELOG.md | 49 + node_modules/npmlog/LICENSE | 15 + node_modules/npmlog/README.md | 216 + node_modules/npmlog/log.js | 309 + node_modules/npmlog/package.json | 64 + node_modules/number-is-nan/index.js | 4 + node_modules/number-is-nan/license | 21 + node_modules/number-is-nan/package.json | 70 + node_modules/number-is-nan/readme.md | 28 + node_modules/oauth-sign/LICENSE | 55 + node_modules/oauth-sign/README.md | 11 + node_modules/oauth-sign/index.js | 146 + node_modules/oauth-sign/package.json | 59 + node_modules/object-assign/index.js | 90 + node_modules/object-assign/license | 21 + node_modules/object-assign/package.json | 78 + node_modules/object-assign/readme.md | 61 + node_modules/object-copy/LICENSE | 21 + node_modules/object-copy/index.js | 174 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 77 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 85 + .../object-copy/node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../object-copy/node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 142 + node_modules/object-copy/package.json | 84 + node_modules/object-visit/LICENSE | 21 + node_modules/object-visit/README.md | 83 + node_modules/object-visit/index.js | 33 + node_modules/object-visit/package.json | 100 + node_modules/object.defaults/LICENSE | 21 + node_modules/object.defaults/README.md | 85 + node_modules/object.defaults/immutable.js | 20 + node_modules/object.defaults/index.js | 11 + node_modules/object.defaults/mutable.js | 35 + node_modules/object.defaults/package.json | 109 + node_modules/object.map/LICENSE | 24 + node_modules/object.map/README.md | 87 + node_modules/object.map/index.js | 22 + node_modules/object.map/package.json | 102 + node_modules/object.pick/LICENSE | 21 + node_modules/object.pick/README.md | 76 + node_modules/object.pick/index.js | 35 + node_modules/object.pick/package.json | 96 + node_modules/on-finished/HISTORY.md | 88 + node_modules/on-finished/LICENSE | 23 + node_modules/on-finished/README.md | 154 + node_modules/on-finished/index.js | 196 + node_modules/on-finished/package.json | 76 + node_modules/once/LICENSE | 15 + node_modules/once/README.md | 79 + node_modules/once/once.js | 42 + node_modules/once/package.json | 70 + node_modules/os-homedir/index.js | 24 + node_modules/os-homedir/license | 21 + node_modules/os-homedir/package.json | 76 + node_modules/os-homedir/readme.md | 31 + node_modules/os-tmpdir/index.js | 25 + node_modules/os-tmpdir/license | 21 + node_modules/os-tmpdir/package.json | 76 + node_modules/os-tmpdir/readme.md | 32 + node_modules/osenv/LICENSE | 15 + node_modules/osenv/README.md | 63 + node_modules/osenv/osenv.js | 72 + node_modules/osenv/package.json | 76 + node_modules/p-finally/index.js | 15 + node_modules/p-finally/license | 21 + node_modules/p-finally/package.json | 78 + node_modules/p-finally/readme.md | 47 + node_modules/package-json/index.js | 67 + node_modules/package-json/license | 21 + node_modules/package-json/package.json | 79 + node_modules/package-json/readme.md | 91 + node_modules/parse-filepath/LICENSE | 21 + node_modules/parse-filepath/README.md | 111 + node_modules/parse-filepath/index.js | 95 + node_modules/parse-filepath/package.json | 113 + node_modules/parse-passwd/LICENSE | 21 + node_modules/parse-passwd/README.md | 86 + node_modules/parse-passwd/index.js | 56 + node_modules/parse-passwd/package.json | 89 + node_modules/parseurl/HISTORY.md | 58 + node_modules/parseurl/LICENSE | 24 + node_modules/parseurl/README.md | 133 + node_modules/parseurl/index.js | 158 + node_modules/parseurl/package.json | 84 + node_modules/pascalcase/LICENSE | 21 + node_modules/pascalcase/README.md | 80 + node_modules/pascalcase/index.js | 21 + node_modules/pascalcase/package.json | 80 + node_modules/path-is-absolute/index.js | 20 + node_modules/path-is-absolute/license | 21 + node_modules/path-is-absolute/package.json | 78 + node_modules/path-is-absolute/readme.md | 59 + node_modules/path-is-inside/LICENSE.txt | 47 + .../path-is-inside/lib/path-is-inside.js | 28 + node_modules/path-is-inside/package.json | 67 + node_modules/path-key/index.js | 13 + node_modules/path-key/license | 21 + node_modules/path-key/package.json | 75 + node_modules/path-key/readme.md | 51 + node_modules/path-parse/.travis.yml | 9 + node_modules/path-parse/LICENSE | 21 + node_modules/path-parse/README.md | 42 + node_modules/path-parse/index.js | 93 + node_modules/path-parse/package.json | 64 + node_modules/path-parse/test.js | 77 + node_modules/path-root-regex/LICENSE | 21 + node_modules/path-root-regex/README.md | 53 + node_modules/path-root-regex/index.js | 13 + node_modules/path-root-regex/package.json | 99 + node_modules/path-root/LICENSE | 21 + node_modules/path-root/README.md | 94 + node_modules/path-root/index.js | 21 + node_modules/path-root/package.json | 92 + node_modules/path-to-regexp/History.md | 36 + node_modules/path-to-regexp/LICENSE | 21 + node_modules/path-to-regexp/Readme.md | 35 + node_modules/path-to-regexp/index.js | 129 + node_modules/path-to-regexp/package.json | 62 + node_modules/performance-now/.npmignore | 1 + node_modules/performance-now/.tm_properties | 7 + node_modules/performance-now/.travis.yml | 6 + node_modules/performance-now/README.md | 30 + .../performance-now/lib/performance-now.js | 36 + .../lib/performance-now.js.map | 10 + node_modules/performance-now/license.txt | 7 + node_modules/performance-now/package.json | 68 + node_modules/performance-now/src/index.d.ts | 8 + .../src/performance-now.coffee | 17 + node_modules/performance-now/test/mocha.opts | 3 + .../test/performance-now.coffee | 43 + .../performance-now/test/scripts.coffee | 27 + .../test/scripts/delayed-call.coffee | 11 + .../test/scripts/delayed-require.coffee | 12 + .../test/scripts/difference.coffee | 6 + .../test/scripts/initial-value.coffee | 10 + node_modules/pg-connection-string/LICENSE | 21 + node_modules/pg-connection-string/README.md | 21 + node_modules/pg-connection-string/index.d.ts | 14 + node_modules/pg-connection-string/index.js | 78 + .../pg-connection-string/package.json | 70 + node_modules/picomatch/CHANGELOG.md | 107 + node_modules/picomatch/LICENSE | 21 + node_modules/picomatch/README.md | 690 + node_modules/picomatch/index.js | 3 + node_modules/picomatch/lib/.DS_Store | Bin 0 -> 6148 bytes node_modules/picomatch/lib/constants.js | 179 + node_modules/picomatch/lib/parse.js | 1080 + node_modules/picomatch/lib/picomatch.js | 338 + node_modules/picomatch/lib/scan.js | 382 + node_modules/picomatch/lib/utils.js | 64 + node_modules/picomatch/package.json | 117 + node_modules/pify/index.js | 84 + node_modules/pify/license | 9 + node_modules/pify/package.json | 87 + node_modules/pify/readme.md | 131 + node_modules/posix-character-classes/LICENSE | 21 + .../posix-character-classes/README.md | 103 + node_modules/posix-character-classes/index.js | 22 + .../posix-character-classes/package.json | 88 + node_modules/prepend-http/index.js | 14 + node_modules/prepend-http/license | 21 + node_modules/prepend-http/package.json | 71 + node_modules/prepend-http/readme.md | 31 + node_modules/process-nextick-args/index.js | 45 + node_modules/process-nextick-args/license.md | 19 + .../process-nextick-args/package.json | 53 + node_modules/process-nextick-args/readme.md | 18 + node_modules/proxy-addr/HISTORY.md | 150 + node_modules/proxy-addr/LICENSE | 22 + node_modules/proxy-addr/README.md | 155 + node_modules/proxy-addr/index.js | 327 + node_modules/proxy-addr/package.json | 85 + node_modules/pseudomap/LICENSE | 15 + node_modules/pseudomap/README.md | 60 + node_modules/pseudomap/map.js | 9 + node_modules/pseudomap/package.json | 58 + node_modules/pseudomap/pseudomap.js | 113 + node_modules/pseudomap/test/basic.js | 86 + node_modules/psl/LICENSE | 9 + node_modules/psl/README.md | 215 + node_modules/psl/browserstack-logo.svg | 90 + node_modules/psl/data/rules.json | 8812 ++++++++ node_modules/psl/dist/psl.js | 9623 +++++++++ node_modules/psl/dist/psl.min.js | 1 + node_modules/psl/index.js | 269 + node_modules/psl/package.json | 80 + node_modules/pstree.remy/.travis.yml | 8 + node_modules/pstree.remy/LICENSE | 7 + node_modules/pstree.remy/lib/index.js | 32 + node_modules/pstree.remy/lib/tree.js | 34 + node_modules/pstree.remy/lib/utils.js | 56 + node_modules/pstree.remy/package.json | 55 + .../pstree.remy/tests/fixtures/index.js | 8 + node_modules/pstree.remy/tests/fixtures/out1 | 10 + node_modules/pstree.remy/tests/fixtures/out2 | 29 + node_modules/pstree.remy/tests/index.test.js | 40 + node_modules/punycode/LICENSE-MIT.txt | 20 + node_modules/punycode/README.md | 122 + node_modules/punycode/package.json | 88 + node_modules/punycode/punycode.es6.js | 441 + node_modules/punycode/punycode.js | 440 + node_modules/qs/.editorconfig | 30 + node_modules/qs/.eslintignore | 1 + node_modules/qs/.eslintrc | 21 + node_modules/qs/CHANGELOG.md | 256 + node_modules/qs/LICENSE | 28 + node_modules/qs/README.md | 570 + node_modules/qs/dist/qs.js | 782 + node_modules/qs/lib/formats.js | 18 + node_modules/qs/lib/index.js | 11 + node_modules/qs/lib/parse.js | 242 + node_modules/qs/lib/stringify.js | 269 + node_modules/qs/lib/utils.js | 230 + node_modules/qs/package.json | 90 + node_modules/qs/test/.eslintrc | 17 + node_modules/qs/test/index.js | 7 + node_modules/qs/test/parse.js | 676 + node_modules/qs/test/stringify.js | 679 + node_modules/qs/test/utils.js | 136 + node_modules/range-parser/HISTORY.md | 56 + node_modules/range-parser/LICENSE | 23 + node_modules/range-parser/README.md | 84 + node_modules/range-parser/index.js | 162 + node_modules/range-parser/package.json | 94 + node_modules/raw-body/HISTORY.md | 270 + node_modules/raw-body/LICENSE | 22 + node_modules/raw-body/README.md | 219 + node_modules/raw-body/index.d.ts | 87 + node_modules/raw-body/index.js | 286 + node_modules/raw-body/package.json | 93 + node_modules/rc/LICENSE.APACHE2 | 15 + node_modules/rc/LICENSE.BSD | 26 + node_modules/rc/LICENSE.MIT | 24 + node_modules/rc/README.md | 227 + node_modules/rc/browser.js | 7 + node_modules/rc/cli.js | 4 + node_modules/rc/index.js | 53 + node_modules/rc/lib/utils.js | 104 + .../rc/node_modules/minimist/.travis.yml | 8 + node_modules/rc/node_modules/minimist/LICENSE | 18 + .../rc/node_modules/minimist/example/parse.js | 2 + .../rc/node_modules/minimist/index.js | 245 + .../rc/node_modules/minimist/package.json | 76 + .../rc/node_modules/minimist/readme.markdown | 95 + .../rc/node_modules/minimist/test/all_bool.js | 32 + .../rc/node_modules/minimist/test/bool.js | 178 + .../rc/node_modules/minimist/test/dash.js | 31 + .../minimist/test/default_bool.js | 35 + .../rc/node_modules/minimist/test/dotted.js | 22 + .../rc/node_modules/minimist/test/kv_short.js | 16 + .../rc/node_modules/minimist/test/long.js | 31 + .../rc/node_modules/minimist/test/num.js | 36 + .../rc/node_modules/minimist/test/parse.js | 197 + .../minimist/test/parse_modified.js | 9 + .../rc/node_modules/minimist/test/proto.js | 44 + .../rc/node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/stop_early.js | 15 + .../rc/node_modules/minimist/test/unknown.js | 102 + .../node_modules/minimist/test/whitespace.js | 8 + node_modules/rc/package.json | 69 + node_modules/rc/test/ini.js | 16 + node_modules/rc/test/nested-env-vars.js | 50 + node_modules/rc/test/test.js | 59 + node_modules/readable-stream/.travis.yml | 34 + node_modules/readable-stream/CONTRIBUTING.md | 38 + node_modules/readable-stream/GOVERNANCE.md | 136 + node_modules/readable-stream/LICENSE | 47 + node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 + .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 687 + .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + node_modules/readable-stream/package.json | 84 + node_modules/readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + node_modules/readable-stream/readable.js | 19 + node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + node_modules/readable-stream/writable.js | 8 + node_modules/readdirp/LICENSE | 21 + node_modules/readdirp/README.md | 120 + node_modules/readdirp/index.d.ts | 43 + node_modules/readdirp/index.js | 254 + node_modules/readdirp/package.json | 161 + node_modules/rechoir/.npmignore | 1 + node_modules/rechoir/.travis.yml | 24 + node_modules/rechoir/CHANGELOG | 38 + node_modules/rechoir/LICENSE | 22 + node_modules/rechoir/README.md | 42 + node_modules/rechoir/index.js | 59 + node_modules/rechoir/lib/extension.js | 11 + node_modules/rechoir/lib/normalize.js | 15 + node_modules/rechoir/lib/register.js | 15 + node_modules/rechoir/package.json | 116 + node_modules/referrer-policy/CHANGELOG.md | 12 + node_modules/referrer-policy/LICENSE | 21 + node_modules/referrer-policy/README.md | 22 + node_modules/referrer-policy/dist/index.d.ts | 7 + node_modules/referrer-policy/dist/index.js | 53 + node_modules/referrer-policy/package.json | 89 + node_modules/regex-not/LICENSE | 21 + node_modules/regex-not/README.md | 133 + node_modules/regex-not/index.js | 72 + node_modules/regex-not/package.json | 101 + node_modules/registry-auth-token/.npmignore | 6 + node_modules/registry-auth-token/CHANGELOG.md | 112 + node_modules/registry-auth-token/LICENSE | 21 + node_modules/registry-auth-token/README.md | 65 + node_modules/registry-auth-token/base64.js | 14 + node_modules/registry-auth-token/index.js | 123 + node_modules/registry-auth-token/package.json | 78 + .../registry-auth-token/registry-url.js | 5 + .../test/auth-token.test.js | 455 + .../test/registry-url.test.js | 64 + node_modules/registry-auth-token/yarn.lock | 1516 ++ node_modules/registry-url/index.js | 6 + node_modules/registry-url/license | 21 + node_modules/registry-url/package.json | 76 + node_modules/registry-url/readme.md | 50 + node_modules/repeat-element/LICENSE | 21 + node_modules/repeat-element/README.md | 99 + node_modules/repeat-element/index.js | 18 + node_modules/repeat-element/package.json | 83 + node_modules/repeat-string/LICENSE | 21 + node_modules/repeat-string/README.md | 136 + node_modules/repeat-string/index.js | 70 + node_modules/repeat-string/package.json | 132 + node_modules/request/CHANGELOG.md | 709 + node_modules/request/LICENSE | 55 + node_modules/request/README.md | 1097 + node_modules/request/index.js | 155 + node_modules/request/lib/auth.js | 167 + node_modules/request/lib/cookies.js | 38 + node_modules/request/lib/getProxyFromURI.js | 79 + node_modules/request/lib/har.js | 205 + node_modules/request/lib/hawk.js | 89 + node_modules/request/lib/helpers.js | 66 + node_modules/request/lib/multipart.js | 112 + node_modules/request/lib/oauth.js | 148 + node_modules/request/lib/querystring.js | 50 + node_modules/request/lib/redirect.js | 154 + node_modules/request/lib/tunnel.js | 175 + .../request/node_modules/qs/.editorconfig | 30 + .../request/node_modules/qs/.eslintignore | 1 + .../request/node_modules/qs/.eslintrc | 19 + .../request/node_modules/qs/CHANGELOG.md | 226 + node_modules/request/node_modules/qs/LICENSE | 28 + .../request/node_modules/qs/README.md | 475 + .../request/node_modules/qs/dist/qs.js | 638 + .../request/node_modules/qs/lib/formats.js | 18 + .../request/node_modules/qs/lib/index.js | 11 + .../request/node_modules/qs/lib/parse.js | 174 + .../request/node_modules/qs/lib/stringify.js | 210 + .../request/node_modules/qs/lib/utils.js | 213 + .../request/node_modules/qs/package.json | 83 + .../request/node_modules/qs/test/.eslintrc | 15 + .../request/node_modules/qs/test/index.js | 7 + .../request/node_modules/qs/test/parse.js | 574 + .../request/node_modules/qs/test/stringify.js | 597 + .../request/node_modules/qs/test/utils.js | 34 + node_modules/request/package.json | 118 + node_modules/request/request.js | 1551 ++ node_modules/resolve-dir/LICENSE | 21 + node_modules/resolve-dir/README.md | 88 + node_modules/resolve-dir/index.js | 22 + node_modules/resolve-dir/package.json | 108 + node_modules/resolve-url/.jshintrc | 44 + node_modules/resolve-url/LICENSE | 21 + node_modules/resolve-url/bower.json | 15 + node_modules/resolve-url/changelog.md | 15 + node_modules/resolve-url/component.json | 15 + node_modules/resolve-url/package.json | 71 + node_modules/resolve-url/readme.md | 83 + node_modules/resolve-url/resolve-url.js | 47 + node_modules/resolve-url/test/resolve-url.js | 70 + node_modules/resolve/.eslintignore | 1 + node_modules/resolve/.eslintrc | 39 + node_modules/resolve/.travis.yml | 8 + node_modules/resolve/LICENSE | 21 + node_modules/resolve/appveyor.yml | 54 + node_modules/resolve/example/async.js | 5 + node_modules/resolve/example/sync.js | 3 + node_modules/resolve/index.js | 6 + node_modules/resolve/lib/async.js | 290 + node_modules/resolve/lib/caller.js | 8 + node_modules/resolve/lib/core.js | 53 + node_modules/resolve/lib/core.json | 75 + node_modules/resolve/lib/is-core.js | 5 + .../resolve/lib/node-modules-paths.js | 42 + node_modules/resolve/lib/normalize-options.js | 10 + node_modules/resolve/lib/sync.js | 183 + node_modules/resolve/package.json | 80 + node_modules/resolve/readme.markdown | 220 + node_modules/resolve/test/.eslintrc | 5 + node_modules/resolve/test/core.js | 85 + node_modules/resolve/test/dotdot.js | 29 + node_modules/resolve/test/dotdot/abc/index.js | 2 + node_modules/resolve/test/dotdot/index.js | 1 + node_modules/resolve/test/faulty_basedir.js | 29 + node_modules/resolve/test/filter.js | 34 + node_modules/resolve/test/filter_sync.js | 33 + node_modules/resolve/test/mock.js | 169 + node_modules/resolve/test/mock_sync.js | 80 + node_modules/resolve/test/module_dir.js | 56 + .../test/module_dir/xmodules/aaa/index.js | 1 + .../test/module_dir/ymodules/aaa/index.js | 1 + .../test/module_dir/zmodules/bbb/main.js | 1 + .../test/module_dir/zmodules/bbb/package.json | 3 + .../resolve/test/node-modules-paths.js | 143 + node_modules/resolve/test/node_path.js | 70 + .../resolve/test/node_path/x/aaa/index.js | 1 + .../resolve/test/node_path/x/ccc/index.js | 1 + .../resolve/test/node_path/y/bbb/index.js | 1 + .../resolve/test/node_path/y/ccc/index.js | 1 + node_modules/resolve/test/nonstring.js | 9 + node_modules/resolve/test/pathfilter.js | 75 + .../resolve/test/pathfilter/deep_ref/main.js | 0 node_modules/resolve/test/precedence.js | 23 + node_modules/resolve/test/precedence/aaa.js | 1 + .../resolve/test/precedence/aaa/index.js | 1 + .../resolve/test/precedence/aaa/main.js | 1 + node_modules/resolve/test/precedence/bbb.js | 1 + .../resolve/test/precedence/bbb/main.js | 1 + node_modules/resolve/test/resolver.js | 450 + .../resolve/test/resolver/baz/doom.js | 0 .../resolve/test/resolver/baz/package.json | 4 + .../resolve/test/resolver/baz/quux.js | 1 + .../resolve/test/resolver/browser_field/a.js | 0 .../resolve/test/resolver/browser_field/b.js | 0 .../test/resolver/browser_field/package.json | 5 + node_modules/resolve/test/resolver/cup.coffee | 1 + .../resolve/test/resolver/dot_main/index.js | 1 + .../test/resolver/dot_main/package.json | 3 + .../test/resolver/dot_slash_main/index.js | 1 + .../test/resolver/dot_slash_main/package.json | 3 + node_modules/resolve/test/resolver/foo.js | 1 + .../test/resolver/incorrect_main/index.js | 2 + .../test/resolver/incorrect_main/package.json | 3 + .../test/resolver/invalid_main/package.json | 7 + node_modules/resolve/test/resolver/mug.coffee | 0 node_modules/resolve/test/resolver/mug.js | 0 .../test/resolver/multirepo/lerna.json | 6 + .../test/resolver/multirepo/package.json | 20 + .../multirepo/packages/package-a/index.js | 35 + .../multirepo/packages/package-a/package.json | 14 + .../multirepo/packages/package-b/index.js | 0 .../multirepo/packages/package-b/package.json | 14 + .../resolver/nested_symlinks/mylib/async.js | 26 + .../nested_symlinks/mylib/package.json | 15 + .../resolver/nested_symlinks/mylib/sync.js | 12 + .../test/resolver/other_path/lib/other-lib.js | 0 .../resolve/test/resolver/other_path/root.js | 0 .../resolve/test/resolver/quux/foo/index.js | 1 + .../resolve/test/resolver/same_names/foo.js | 1 + .../test/resolver/same_names/foo/index.js | 1 + .../resolver/symlinked/_/node_modules/foo.js | 0 .../symlinked/_/symlink_target/.gitkeep | 0 .../test/resolver/symlinked/package/bar.js | 1 + .../resolver/symlinked/package/package.json | 3 + .../test/resolver/without_basedir/main.js | 5 + node_modules/resolve/test/resolver_sync.js | 358 + node_modules/resolve/test/shadowed_core.js | 38 + .../shadowed_core/node_modules/util/index.js | 0 node_modules/resolve/test/subdirs.js | 13 + node_modules/resolve/test/symlinks.js | 173 + node_modules/ret/LICENSE | 19 + node_modules/ret/README.md | 183 + node_modules/ret/lib/index.js | 282 + node_modules/ret/lib/positions.js | 17 + node_modules/ret/lib/sets.js | 82 + node_modules/ret/lib/types.js | 10 + node_modules/ret/lib/util.js | 111 + node_modules/ret/package.json | 70 + node_modules/rimraf/LICENSE | 15 + node_modules/rimraf/README.md | 101 + node_modules/rimraf/bin.js | 50 + node_modules/rimraf/package.json | 70 + node_modules/rimraf/rimraf.js | 372 + node_modules/safe-buffer/LICENSE | 21 + node_modules/safe-buffer/README.md | 584 + node_modules/safe-buffer/index.d.ts | 187 + node_modules/safe-buffer/index.js | 62 + node_modules/safe-buffer/package.json | 74 + node_modules/safe-regex/.travis.yml | 4 + node_modules/safe-regex/LICENSE | 18 + node_modules/safe-regex/example/safe.js | 3 + node_modules/safe-regex/index.js | 43 + node_modules/safe-regex/package.json | 77 + node_modules/safe-regex/readme.markdown | 65 + node_modules/safe-regex/test/regex.js | 50 + node_modules/safer-buffer/LICENSE | 21 + node_modules/safer-buffer/Porting-Buffer.md | 268 + node_modules/safer-buffer/Readme.md | 156 + node_modules/safer-buffer/dangerous.js | 58 + node_modules/safer-buffer/package.json | 66 + node_modules/safer-buffer/safer.js | 77 + node_modules/safer-buffer/tests.js | 406 + node_modules/sax/LICENSE | 41 + node_modules/sax/README.md | 225 + node_modules/sax/lib/sax.js | 1565 ++ node_modules/sax/package.json | 64 + node_modules/semver-diff/index.js | 27 + node_modules/semver-diff/license | 21 + node_modules/semver-diff/package.json | 70 + node_modules/semver-diff/readme.md | 52 + node_modules/semver/CHANGELOG.md | 39 + node_modules/semver/LICENSE | 15 + node_modules/semver/README.md | 412 + node_modules/semver/bin/semver | 160 + node_modules/semver/package.json | 66 + node_modules/semver/range.bnf | 16 + node_modules/semver/semver.js | 1483 ++ node_modules/send/HISTORY.md | 496 + node_modules/send/LICENSE | 23 + node_modules/send/README.md | 329 + node_modules/send/index.js | 1129 + node_modules/send/node_modules/ms/index.js | 162 + node_modules/send/node_modules/ms/license.md | 21 + .../send/node_modules/ms/package.json | 72 + node_modules/send/node_modules/ms/readme.md | 60 + node_modules/send/package.json | 109 + node_modules/serve-static/HISTORY.md | 451 + node_modules/serve-static/LICENSE | 25 + node_modules/serve-static/README.md | 259 + node_modules/serve-static/index.js | 210 + node_modules/serve-static/package.json | 80 + node_modules/set-blocking/CHANGELOG.md | 26 + node_modules/set-blocking/LICENSE.txt | 14 + node_modules/set-blocking/README.md | 31 + node_modules/set-blocking/index.js | 7 + node_modules/set-blocking/package.json | 73 + node_modules/set-value/LICENSE | 21 + node_modules/set-value/README.md | 150 + node_modules/set-value/index.js | 55 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 61 + .../node_modules/extend-shallow/index.js | 33 + .../node_modules/extend-shallow/package.json | 90 + node_modules/set-value/package.json | 124 + node_modules/setprototypeof/LICENSE | 13 + node_modules/setprototypeof/README.md | 31 + node_modules/setprototypeof/index.d.ts | 2 + node_modules/setprototypeof/index.js | 17 + node_modules/setprototypeof/package.json | 67 + node_modules/setprototypeof/test/index.js | 24 + node_modules/shebang-command/index.js | 19 + node_modules/shebang-command/license | 21 + node_modules/shebang-command/package.json | 75 + node_modules/shebang-command/readme.md | 39 + node_modules/shebang-regex/index.js | 2 + node_modules/shebang-regex/license | 21 + node_modules/shebang-regex/package.json | 68 + node_modules/shebang-regex/readme.md | 29 + node_modules/signal-exit/CHANGELOG.md | 27 + node_modules/signal-exit/LICENSE.txt | 16 + node_modules/signal-exit/README.md | 40 + node_modules/signal-exit/index.js | 157 + node_modules/signal-exit/package.json | 71 + node_modules/signal-exit/signals.js | 53 + node_modules/snapdragon-node/LICENSE | 21 + node_modules/snapdragon-node/README.md | 453 + node_modules/snapdragon-node/index.js | 492 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 95 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 96 + .../is-accessor-descriptor/LICENSE | 21 + .../is-accessor-descriptor/README.md | 144 + .../is-accessor-descriptor/index.js | 69 + .../is-accessor-descriptor/package.json | 113 + .../node_modules/is-data-descriptor/LICENSE | 21 + .../node_modules/is-data-descriptor/README.md | 161 + .../node_modules/is-data-descriptor/index.js | 49 + .../is-data-descriptor/package.json | 112 + .../node_modules/is-descriptor/LICENSE | 21 + .../node_modules/is-descriptor/README.md | 193 + .../node_modules/is-descriptor/index.js | 22 + .../node_modules/is-descriptor/package.json | 117 + node_modules/snapdragon-node/package.json | 112 + node_modules/snapdragon-util/LICENSE | 21 + node_modules/snapdragon-util/README.md | 807 + node_modules/snapdragon-util/index.js | 1019 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 142 + node_modules/snapdragon-util/package.json | 101 + node_modules/snapdragon/LICENSE | 21 + node_modules/snapdragon/README.md | 321 + node_modules/snapdragon/index.js | 174 + node_modules/snapdragon/lib/compiler.js | 177 + node_modules/snapdragon/lib/parser.js | 533 + node_modules/snapdragon/lib/position.js | 14 + node_modules/snapdragon/lib/source-maps.js | 145 + node_modules/snapdragon/lib/utils.js | 48 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 77 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 85 + .../node_modules/extend-shallow/LICENSE | 21 + .../node_modules/extend-shallow/README.md | 61 + .../node_modules/extend-shallow/index.js | 33 + .../node_modules/extend-shallow/package.json | 90 + node_modules/snapdragon/package.json | 129 + node_modules/source-map-resolve/LICENSE | 22 + node_modules/source-map-resolve/changelog.md | 108 + .../lib/decode-uri-component.js | 8 + .../source-map-resolve/lib/resolve-url.js | 9 + .../lib/source-map-resolve-node.js | 342 + node_modules/source-map-resolve/package.json | 84 + node_modules/source-map-resolve/readme.md | 231 + .../source-map-resolve/source-map-resolve.js | 348 + node_modules/source-map-url/.jshintrc | 43 + node_modules/source-map-url/LICENSE | 21 + node_modules/source-map-url/bower.json | 20 + node_modules/source-map-url/changelog.md | 52 + node_modules/source-map-url/component.json | 18 + node_modules/source-map-url/package.json | 76 + node_modules/source-map-url/readme.md | 97 + node_modules/source-map-url/source-map-url.js | 57 + .../source-map-url/test/source-map-url.js | 402 + node_modules/source-map-url/x-package.json5 | 55 + node_modules/source-map/CHANGELOG.md | 301 + node_modules/source-map/LICENSE | 28 + node_modules/source-map/README.md | 729 + .../source-map/dist/source-map.debug.js | 3091 +++ node_modules/source-map/dist/source-map.js | 3090 +++ .../source-map/dist/source-map.min.js | 2 + .../source-map/dist/source-map.min.js.map | 1 + node_modules/source-map/lib/array-set.js | 121 + node_modules/source-map/lib/base64-vlq.js | 140 + node_modules/source-map/lib/base64.js | 67 + node_modules/source-map/lib/binary-search.js | 111 + node_modules/source-map/lib/mapping-list.js | 79 + node_modules/source-map/lib/quick-sort.js | 114 + .../source-map/lib/source-map-consumer.js | 1082 + .../source-map/lib/source-map-generator.js | 416 + node_modules/source-map/lib/source-node.js | 413 + node_modules/source-map/lib/util.js | 417 + node_modules/source-map/package.json | 214 + node_modules/source-map/source-map.js | 8 + node_modules/split-string/LICENSE | 21 + node_modules/split-string/README.md | 321 + node_modules/split-string/index.js | 171 + node_modules/split-string/package.json | 106 + node_modules/sqlite3/.dockerignore | 33 + node_modules/sqlite3/CHANGELOG.md | 282 + node_modules/sqlite3/CONTRIBUTING.md | 57 + node_modules/sqlite3/Dockerfile | 76 + node_modules/sqlite3/LICENSE | 25 + node_modules/sqlite3/README.md | 227 + node_modules/sqlite3/binding.gyp | 53 + node_modules/sqlite3/deps/common-sqlite.gypi | 60 + node_modules/sqlite3/deps/extract.py | 9 + .../deps/sqlite-autoconf-3300100.tar.gz | Bin 0 -> 2848951 bytes node_modules/sqlite3/deps/sqlite3.gyp | 119 + .../node-v72-linux-x64/node_sqlite3.node | Bin 0 -> 2016340 bytes node_modules/sqlite3/lib/index.js | 1 + node_modules/sqlite3/lib/sqlite3.js | 207 + node_modules/sqlite3/lib/trace.js | 41 + node_modules/sqlite3/package.json | 142 + node_modules/sqlite3/sqlite3.js | 1 + node_modules/sqlite3/src/async.h | 78 + node_modules/sqlite3/src/backup.cc | 416 + node_modules/sqlite3/src/backup.h | 223 + node_modules/sqlite3/src/database.cc | 692 + node_modules/sqlite3/src/database.h | 193 + node_modules/sqlite3/src/gcc-preinclude.h | 6 + node_modules/sqlite3/src/macros.h | 183 + node_modules/sqlite3/src/node_sqlite3.cc | 111 + node_modules/sqlite3/src/statement.cc | 901 + node_modules/sqlite3/src/statement.h | 248 + node_modules/sqlite3/src/threading.h | 48 + .../docker/architecture/linux-arm/Dockerfile | 81 + .../docker/architecture/linux-arm/run.sh | 53 + .../architecture/linux-arm64/Dockerfile | 80 + .../docker/architecture/linux-arm64/run.sh | 53 + node_modules/sshpk/.npmignore | 9 + node_modules/sshpk/.travis.yml | 11 + node_modules/sshpk/LICENSE | 18 + node_modules/sshpk/README.md | 804 + node_modules/sshpk/bin/sshpk-conv | 243 + node_modules/sshpk/bin/sshpk-sign | 191 + node_modules/sshpk/bin/sshpk-verify | 167 + node_modules/sshpk/lib/algs.js | 168 + node_modules/sshpk/lib/certificate.js | 410 + node_modules/sshpk/lib/dhe.js | 397 + node_modules/sshpk/lib/ed-compat.js | 92 + node_modules/sshpk/lib/errors.js | 84 + node_modules/sshpk/lib/fingerprint.js | 220 + node_modules/sshpk/lib/formats/auto.js | 124 + node_modules/sshpk/lib/formats/dnssec.js | 287 + .../sshpk/lib/formats/openssh-cert.js | 352 + node_modules/sshpk/lib/formats/pem.js | 290 + node_modules/sshpk/lib/formats/pkcs1.js | 373 + node_modules/sshpk/lib/formats/pkcs8.js | 631 + node_modules/sshpk/lib/formats/putty.js | 99 + node_modules/sshpk/lib/formats/rfc4253.js | 166 + node_modules/sshpk/lib/formats/ssh-private.js | 262 + node_modules/sshpk/lib/formats/ssh.js | 115 + node_modules/sshpk/lib/formats/x509-pem.js | 88 + node_modules/sshpk/lib/formats/x509.js | 752 + node_modules/sshpk/lib/identity.js | 373 + node_modules/sshpk/lib/index.js | 40 + node_modules/sshpk/lib/key.js | 294 + node_modules/sshpk/lib/private-key.js | 246 + node_modules/sshpk/lib/signature.js | 314 + node_modules/sshpk/lib/ssh-buffer.js | 149 + node_modules/sshpk/lib/utils.js | 404 + node_modules/sshpk/man/man1/sshpk-conv.1 | 135 + node_modules/sshpk/man/man1/sshpk-sign.1 | 81 + node_modules/sshpk/man/man1/sshpk-verify.1 | 68 + node_modules/sshpk/package.json | 99 + node_modules/static-extend/LICENSE | 21 + node_modules/static-extend/index.js | 90 + .../node_modules/define-property/LICENSE | 21 + .../node_modules/define-property/README.md | 77 + .../node_modules/define-property/index.js | 31 + .../node_modules/define-property/package.json | 85 + node_modules/static-extend/package.json | 99 + node_modules/statuses/HISTORY.md | 65 + node_modules/statuses/LICENSE | 23 + node_modules/statuses/README.md | 127 + node_modules/statuses/codes.json | 66 + node_modules/statuses/index.js | 113 + node_modules/statuses/package.json | 93 + node_modules/string-width/index.js | 37 + node_modules/string-width/license | 21 + node_modules/string-width/package.json | 92 + node_modules/string-width/readme.md | 42 + node_modules/string_decoder/.travis.yml | 50 + node_modules/string_decoder/LICENSE | 48 + node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + node_modules/string_decoder/package.json | 62 + node_modules/strip-ansi/index.js | 6 + node_modules/strip-ansi/license | 21 + node_modules/strip-ansi/package.json | 105 + node_modules/strip-ansi/readme.md | 33 + node_modules/strip-eof/index.js | 15 + node_modules/strip-eof/license | 21 + node_modules/strip-eof/package.json | 75 + node_modules/strip-eof/readme.md | 28 + node_modules/strip-json-comments/index.js | 70 + node_modules/strip-json-comments/license | 21 + node_modules/strip-json-comments/package.json | 77 + node_modules/strip-json-comments/readme.md | 64 + node_modules/supports-color/browser.js | 5 + node_modules/supports-color/index.js | 131 + node_modules/supports-color/license | 9 + node_modules/supports-color/package.json | 90 + node_modules/supports-color/readme.md | 66 + node_modules/tar/LICENSE | 15 + node_modules/tar/README.md | 954 + node_modules/tar/index.js | 18 + node_modules/tar/lib/buffer.js | 11 + node_modules/tar/lib/create.js | 105 + node_modules/tar/lib/extract.js | 112 + node_modules/tar/lib/header.js | 289 + node_modules/tar/lib/high-level-opt.js | 29 + node_modules/tar/lib/large-numbers.js | 97 + node_modules/tar/lib/list.js | 130 + node_modules/tar/lib/mkdir.js | 206 + node_modules/tar/lib/mode-fix.js | 14 + node_modules/tar/lib/pack.js | 404 + node_modules/tar/lib/parse.js | 428 + node_modules/tar/lib/pax.js | 146 + node_modules/tar/lib/read-entry.js | 98 + node_modules/tar/lib/replace.js | 220 + node_modules/tar/lib/types.js | 44 + node_modules/tar/lib/unpack.js | 621 + node_modules/tar/lib/update.js | 36 + node_modules/tar/lib/warn-mixin.js | 14 + node_modules/tar/lib/winchars.js | 23 + node_modules/tar/lib/write-entry.js | 422 + node_modules/tar/package.json | 85 + node_modules/tarn/LICENSE | 22 + node_modules/tarn/README.md | 178 + node_modules/tarn/lib/PendingOperation.d.ts | 11 + node_modules/tarn/lib/PendingOperation.js | 46 + node_modules/tarn/lib/Pool.d.ts | 83 + node_modules/tarn/lib/Pool.js | 402 + node_modules/tarn/lib/PromiseInspection.d.ts | 16 + node_modules/tarn/lib/PromiseInspection.js | 21 + node_modules/tarn/lib/Resource.d.ts | 9 + node_modules/tarn/lib/Resource.js | 19 + node_modules/tarn/lib/TimeoutError.d.ts | 2 + node_modules/tarn/lib/TimeoutError.js | 5 + node_modules/tarn/lib/tarn.d.ts | 3 + node_modules/tarn/lib/tarn.js | 10 + node_modules/tarn/lib/utils.d.ts | 14 + node_modules/tarn/lib/utils.js | 60 + node_modules/tarn/package.json | 92 + node_modules/term-size/index.js | 70 + node_modules/term-size/license | 21 + node_modules/term-size/package.json | 79 + node_modules/term-size/readme.md | 41 + node_modules/term-size/vendor/macos/term-size | Bin 0 -> 8760 bytes .../term-size/vendor/windows/term-size.exe | Bin 0 -> 17408 bytes node_modules/tildify/index.d.ts | 14 + node_modules/tildify/index.js | 13 + node_modules/tildify/license | 9 + node_modules/tildify/package.json | 75 + node_modules/tildify/readme.md | 30 + node_modules/timed-out/index.js | 55 + node_modules/timed-out/license | 21 + node_modules/timed-out/package.json | 72 + node_modules/timed-out/readme.md | 42 + node_modules/to-object-path/LICENSE | 21 + node_modules/to-object-path/README.md | 71 + node_modules/to-object-path/index.js | 33 + .../node_modules/kind-of/LICENSE | 21 + .../node_modules/kind-of/README.md | 261 + .../node_modules/kind-of/index.js | 116 + .../node_modules/kind-of/package.json | 142 + node_modules/to-object-path/package.json | 84 + node_modules/to-regex-range/LICENSE | 21 + node_modules/to-regex-range/README.md | 281 + node_modules/to-regex-range/index.js | 294 + node_modules/to-regex-range/package.json | 120 + node_modules/to-regex/LICENSE | 21 + node_modules/to-regex/README.md | 205 + node_modules/to-regex/index.js | 155 + node_modules/to-regex/package.json | 100 + node_modules/toidentifier/LICENSE | 21 + node_modules/toidentifier/README.md | 61 + node_modules/toidentifier/index.js | 30 + node_modules/toidentifier/package.json | 79 + node_modules/touch/LICENSE | 15 + node_modules/touch/README.md | 52 + node_modules/touch/bin/nodetouch.js | 112 + node_modules/touch/index.js | 224 + node_modules/touch/node_modules/.bin/nopt | 1 + .../touch/node_modules/nopt/.npmignore | 0 node_modules/touch/node_modules/nopt/LICENSE | 23 + .../touch/node_modules/nopt/README.md | 208 + .../touch/node_modules/nopt/bin/nopt.js | 44 + .../node_modules/nopt/examples/my-program.js | 30 + .../touch/node_modules/nopt/lib/nopt.js | 552 + .../touch/node_modules/nopt/package.json | 61 + node_modules/touch/package.json | 70 + node_modules/tough-cookie/LICENSE | 12 + node_modules/tough-cookie/README.md | 507 + node_modules/tough-cookie/lib/cookie.js | 1431 ++ node_modules/tough-cookie/lib/memstore.js | 176 + node_modules/tough-cookie/lib/pathMatch.js | 61 + .../tough-cookie/lib/permuteDomain.js | 56 + .../tough-cookie/lib/pubsuffix-psl.js | 38 + node_modules/tough-cookie/lib/store.js | 71 + .../node_modules/punycode/LICENSE-MIT.txt | 20 + .../node_modules/punycode/README.md | 176 + .../node_modules/punycode/package.json | 90 + .../node_modules/punycode/punycode.js | 533 + node_modules/tough-cookie/package.json | 97 + node_modules/tunnel-agent/LICENSE | 55 + node_modules/tunnel-agent/README.md | 4 + node_modules/tunnel-agent/index.js | 244 + node_modules/tunnel-agent/package.json | 58 + node_modules/tweetnacl/.npmignore | 4 + node_modules/tweetnacl/AUTHORS.md | 28 + node_modules/tweetnacl/CHANGELOG.md | 221 + node_modules/tweetnacl/LICENSE | 24 + .../tweetnacl/PULL_REQUEST_TEMPLATE.md | 20 + node_modules/tweetnacl/README.md | 459 + node_modules/tweetnacl/nacl-fast.js | 2388 +++ node_modules/tweetnacl/nacl-fast.min.js | 2 + node_modules/tweetnacl/nacl.d.ts | 98 + node_modules/tweetnacl/nacl.js | 1175 ++ node_modules/tweetnacl/nacl.min.js | 1 + node_modules/tweetnacl/package.json | 89 + node_modules/type-is/HISTORY.md | 259 + node_modules/type-is/LICENSE | 23 + node_modules/type-is/README.md | 170 + node_modules/type-is/index.js | 266 + node_modules/type-is/package.json | 88 + node_modules/unc-path-regex/LICENSE | 21 + node_modules/unc-path-regex/README.md | 88 + node_modules/unc-path-regex/index.js | 5 + node_modules/unc-path-regex/package.json | 87 + node_modules/undefsafe/.jscsrc | 13 + node_modules/undefsafe/.jshintrc | 16 + node_modules/undefsafe/.npmignore | 2 + node_modules/undefsafe/.travis.yml | 18 + node_modules/undefsafe/LICENSE | 22 + node_modules/undefsafe/README.md | 63 + node_modules/undefsafe/example.js | 14 + node_modules/undefsafe/lib/undefsafe.js | 113 + node_modules/undefsafe/package.json | 67 + node_modules/union-value/LICENSE | 21 + node_modules/union-value/README.md | 73 + node_modules/union-value/index.js | 30 + node_modules/union-value/package.json | 104 + node_modules/unique-string/index.js | 4 + node_modules/unique-string/license | 21 + node_modules/unique-string/package.json | 80 + node_modules/unique-string/readme.md | 32 + node_modules/unpipe/HISTORY.md | 4 + node_modules/unpipe/LICENSE | 22 + node_modules/unpipe/README.md | 43 + node_modules/unpipe/index.js | 69 + node_modules/unpipe/package.json | 66 + node_modules/unset-value/LICENSE | 21 + node_modules/unset-value/README.md | 131 + node_modules/unset-value/index.js | 32 + .../node_modules/has-value/LICENSE | 21 + .../node_modules/has-value/README.md | 130 + .../node_modules/has-value/index.js | 19 + .../has-value/node_modules/isobject/LICENSE | 21 + .../has-value/node_modules/isobject/README.md | 112 + .../has-value/node_modules/isobject/index.js | 14 + .../node_modules/isobject/package.json | 101 + .../node_modules/has-value/package.json | 117 + .../node_modules/has-values/LICENSE | 21 + .../node_modules/has-values/README.md | 114 + .../node_modules/has-values/index.js | 36 + .../node_modules/has-values/package.json | 109 + node_modules/unset-value/package.json | 115 + node_modules/unzip-response/index.js | 36 + node_modules/unzip-response/license | 21 + node_modules/unzip-response/package.json | 85 + node_modules/unzip-response/readme.md | 29 + node_modules/update-notifier/check.js | 22 + node_modules/update-notifier/index.js | 155 + node_modules/update-notifier/license | 9 + node_modules/update-notifier/package.json | 91 + node_modules/update-notifier/readme.md | 193 + node_modules/uri-js/README.md | 199 + node_modules/uri-js/bower.json | 47 + node_modules/uri-js/dist/es5/uri.all.d.ts | 59 + node_modules/uri-js/dist/es5/uri.all.js | 1389 ++ node_modules/uri-js/dist/es5/uri.all.js.map | 1 + node_modules/uri-js/dist/es5/uri.all.min.d.ts | 59 + node_modules/uri-js/dist/es5/uri.all.min.js | 3 + .../uri-js/dist/es5/uri.all.min.js.map | 1 + node_modules/uri-js/dist/esnext/index.d.ts | 1 + node_modules/uri-js/dist/esnext/index.js | 13 + node_modules/uri-js/dist/esnext/index.js.map | 1 + .../uri-js/dist/esnext/regexps-iri.d.ts | 3 + .../uri-js/dist/esnext/regexps-iri.js | 3 + .../uri-js/dist/esnext/regexps-iri.js.map | 1 + .../uri-js/dist/esnext/regexps-uri.d.ts | 4 + .../uri-js/dist/esnext/regexps-uri.js | 42 + .../uri-js/dist/esnext/regexps-uri.js.map | 1 + .../uri-js/dist/esnext/schemes/http.d.ts | 3 + .../uri-js/dist/esnext/schemes/http.js | 27 + .../uri-js/dist/esnext/schemes/http.js.map | 1 + .../uri-js/dist/esnext/schemes/https.d.ts | 3 + .../uri-js/dist/esnext/schemes/https.js | 9 + .../uri-js/dist/esnext/schemes/https.js.map | 1 + .../uri-js/dist/esnext/schemes/mailto.d.ts | 12 + .../uri-js/dist/esnext/schemes/mailto.js | 148 + .../uri-js/dist/esnext/schemes/mailto.js.map | 1 + .../uri-js/dist/esnext/schemes/urn-uuid.d.ts | 7 + .../uri-js/dist/esnext/schemes/urn-uuid.js | 23 + .../dist/esnext/schemes/urn-uuid.js.map | 1 + .../uri-js/dist/esnext/schemes/urn.d.ts | 10 + .../uri-js/dist/esnext/schemes/urn.js | 49 + .../uri-js/dist/esnext/schemes/urn.js.map | 1 + node_modules/uri-js/dist/esnext/uri.d.ts | 59 + node_modules/uri-js/dist/esnext/uri.js | 480 + node_modules/uri-js/dist/esnext/uri.js.map | 1 + node_modules/uri-js/dist/esnext/util.d.ts | 6 + node_modules/uri-js/dist/esnext/util.js | 36 + node_modules/uri-js/dist/esnext/util.js.map | 1 + node_modules/uri-js/package.json | 96 + node_modules/uri-js/rollup.config.js | 32 + node_modules/uri-js/src/index.ts | 18 + node_modules/uri-js/src/punycode.d.ts | 24 + node_modules/uri-js/src/regexps-iri.ts | 4 + node_modules/uri-js/src/regexps-uri.ts | 89 + node_modules/uri-js/src/schemes/http.ts | 36 + node_modules/uri-js/src/schemes/https.ts | 11 + node_modules/uri-js/src/schemes/mailto.ts | 182 + node_modules/uri-js/src/schemes/urn-uuid.ts | 36 + node_modules/uri-js/src/schemes/urn.ts | 69 + node_modules/uri-js/src/uri.ts | 556 + node_modules/uri-js/src/util.ts | 40 + node_modules/uri-js/tests/qunit.css | 118 + node_modules/uri-js/tests/qunit.js | 1042 + node_modules/uri-js/tests/test-es5-min.html | 17 + node_modules/uri-js/tests/test-es5.html | 17 + node_modules/uri-js/tests/tests.js | 774 + node_modules/uri-js/tsconfig.json | 20 + node_modules/uri-js/yarn.lock | 1902 ++ node_modules/urix/.jshintrc | 42 + node_modules/urix/LICENSE | 21 + node_modules/urix/index.js | 17 + node_modules/urix/package.json | 62 + node_modules/urix/readme.md | 46 + node_modules/urix/test/index.js | 43 + node_modules/url-parse-lax/index.js | 14 + node_modules/url-parse-lax/license | 21 + node_modules/url-parse-lax/package.json | 77 + node_modules/url-parse-lax/readme.md | 100 + node_modules/use/LICENSE | 21 + node_modules/use/README.md | 90 + node_modules/use/index.js | 155 + node_modules/use/package.json | 111 + node_modules/util-deprecate/History.md | 16 + node_modules/util-deprecate/LICENSE | 24 + node_modules/util-deprecate/README.md | 53 + node_modules/util-deprecate/browser.js | 67 + node_modules/util-deprecate/node.js | 6 + node_modules/util-deprecate/package.json | 59 + node_modules/utils-merge/.npmignore | 9 + node_modules/utils-merge/LICENSE | 20 + node_modules/utils-merge/README.md | 34 + node_modules/utils-merge/index.js | 23 + node_modules/utils-merge/package.json | 69 + node_modules/uuid/AUTHORS | 5 + node_modules/uuid/CHANGELOG.md | 119 + node_modules/uuid/LICENSE.md | 21 + node_modules/uuid/README.md | 276 + node_modules/uuid/bin/uuid | 65 + node_modules/uuid/index.js | 8 + node_modules/uuid/lib/bytesToUuid.js | 26 + node_modules/uuid/lib/md5-browser.js | 216 + node_modules/uuid/lib/md5.js | 25 + node_modules/uuid/lib/rng-browser.js | 34 + node_modules/uuid/lib/rng.js | 8 + node_modules/uuid/lib/sha1-browser.js | 89 + node_modules/uuid/lib/sha1.js | 25 + node_modules/uuid/lib/v35.js | 57 + node_modules/uuid/package.json | 104 + node_modules/uuid/v1.js | 109 + node_modules/uuid/v3.js | 4 + node_modules/uuid/v4.js | 29 + node_modules/uuid/v5.js | 3 + node_modules/v8flags/LICENSE | 21 + node_modules/v8flags/README.md | 64 + node_modules/v8flags/config-path.js | 38 + node_modules/v8flags/index.js | 162 + node_modules/v8flags/package.json | 102 + node_modules/vary/HISTORY.md | 39 + node_modules/vary/LICENSE | 22 + node_modules/vary/README.md | 101 + node_modules/vary/index.js | 149 + node_modules/vary/package.json | 82 + node_modules/verror/.npmignore | 9 + node_modules/verror/CHANGES.md | 28 + node_modules/verror/CONTRIBUTING.md | 19 + node_modules/verror/LICENSE | 19 + node_modules/verror/README.md | 528 + node_modules/verror/lib/verror.js | 451 + node_modules/verror/package.json | 54 + node_modules/which/CHANGELOG.md | 152 + node_modules/which/LICENSE | 15 + node_modules/which/README.md | 51 + node_modules/which/bin/which | 52 + node_modules/which/package.json | 69 + node_modules/which/which.js | 135 + node_modules/wide-align/LICENSE | 14 + node_modules/wide-align/README.md | 47 + node_modules/wide-align/align.js | 65 + node_modules/wide-align/package.json | 69 + node_modules/widest-line/index.js | 8 + node_modules/widest-line/license | 9 + .../node_modules/ansi-regex/index.js | 10 + .../node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 89 + .../node_modules/ansi-regex/readme.md | 46 + .../is-fullwidth-code-point/index.js | 46 + .../is-fullwidth-code-point/license | 21 + .../is-fullwidth-code-point/package.json | 81 + .../is-fullwidth-code-point/readme.md | 39 + .../node_modules/string-width/index.js | 36 + .../node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 91 + .../node_modules/string-width/readme.md | 42 + .../node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 88 + .../node_modules/strip-ansi/readme.md | 39 + node_modules/widest-line/package.json | 90 + node_modules/widest-line/readme.md | 34 + node_modules/wrappy/LICENSE | 15 + node_modules/wrappy/README.md | 36 + node_modules/wrappy/package.json | 62 + node_modules/wrappy/wrappy.js | 33 + node_modules/write-file-atomic/CHANGELOG.md | 25 + node_modules/write-file-atomic/LICENSE | 6 + node_modules/write-file-atomic/README.md | 56 + node_modules/write-file-atomic/index.js | 238 + node_modules/write-file-atomic/package.json | 74 + node_modules/x-xss-protection/CHANGELOG.md | 20 + node_modules/x-xss-protection/LICENSE | 21 + node_modules/x-xss-protection/README.md | 33 + node_modules/x-xss-protection/dist/index.d.ts | 9 + node_modules/x-xss-protection/dist/index.js | 50 + node_modules/x-xss-protection/package.json | 97 + node_modules/xdg-basedir/index.js | 28 + node_modules/xdg-basedir/license | 21 + node_modules/xdg-basedir/package.json | 77 + node_modules/xdg-basedir/readme.md | 60 + node_modules/yallist/LICENSE | 15 + node_modules/yallist/README.md | 204 + node_modules/yallist/iterator.js | 8 + node_modules/yallist/package.json | 66 + node_modules/yallist/yallist.js | 426 + package-lock.json | 3367 +++ package.json | 24 + start.sh | 25 + 4209 files changed, 448228 insertions(+) create mode 100644 .dockerignore create mode 100644 CloudronManifest.json create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 api/models/citiesModel.js create mode 100644 api/models/countriesModel.js create mode 100644 api/models/roadsModel.js create mode 100644 api/routes/citiesRouter.js create mode 100644 api/routes/countriesRouter.js create mode 100644 api/routes/pathRouter.js create mode 100644 api/routes/roadsRouter.js create mode 100644 api/server.js create mode 100644 data/dbConfig.js create mode 100644 data/migrations/20200207155645_countries.js create mode 100644 data/migrations/20200207160031_cities.js create mode 100644 data/migrations/20200207160304_roads.js create mode 100644 data/seeds/01-countries.js create mode 100644 data/seeds/02-cities.js create mode 100644 data/seeds/03-roads.js create mode 100644 helpers/dijkstra_algo.js create mode 100644 helpers/graph.js create mode 100644 helpers/queue.js create mode 100644 index.js create mode 100644 knexfile.js create mode 120000 node_modules/.bin/atob create mode 120000 node_modules/.bin/detect-libc create mode 120000 node_modules/.bin/is-ci create mode 120000 node_modules/.bin/knex create mode 120000 node_modules/.bin/mime create mode 120000 node_modules/.bin/mkdirp create mode 120000 node_modules/.bin/needle create mode 120000 node_modules/.bin/node-pre-gyp create mode 120000 node_modules/.bin/nodemon create mode 120000 node_modules/.bin/nodetouch create mode 120000 node_modules/.bin/nopt create mode 120000 node_modules/.bin/rc create mode 120000 node_modules/.bin/rimraf create mode 120000 node_modules/.bin/semver create mode 120000 node_modules/.bin/sshpk-conv create mode 120000 node_modules/.bin/sshpk-sign create mode 120000 node_modules/.bin/sshpk-verify create mode 120000 node_modules/.bin/uuid create mode 120000 node_modules/.bin/which create mode 100644 node_modules/.cache/terser-webpack-plugin/content-v2/sha512/74/3a/d9818eab8969925dd823cd7eafb3c28e56bf688e561a30ab61866b5c13f9e0509722805176481c6ab122317bd6047fa74fae07b2d225b8d12d13f59a2fd9 create mode 100644 node_modules/.cache/terser-webpack-plugin/index-v5/4c/05/7eea19d89972a5155d16260e736a4bb680508347463b756b6f36981e164c create mode 100644 node_modules/abbrev/LICENSE create mode 100644 node_modules/abbrev/README.md create mode 100644 node_modules/abbrev/abbrev.js create mode 100644 node_modules/abbrev/package.json create mode 100644 node_modules/accepts/HISTORY.md create mode 100644 node_modules/accepts/LICENSE create mode 100644 node_modules/accepts/README.md create mode 100644 node_modules/accepts/index.js create mode 100644 node_modules/accepts/package.json create mode 100644 node_modules/ajv/.tonic_example.js create mode 100644 node_modules/ajv/LICENSE create mode 100644 node_modules/ajv/README.md create mode 100644 node_modules/ajv/dist/ajv.bundle.js create mode 100644 node_modules/ajv/dist/ajv.min.js create mode 100644 node_modules/ajv/dist/ajv.min.js.map create mode 100644 node_modules/ajv/lib/ajv.d.ts create mode 100644 node_modules/ajv/lib/ajv.js create mode 100644 node_modules/ajv/lib/cache.js create mode 100644 node_modules/ajv/lib/compile/async.js create mode 100644 node_modules/ajv/lib/compile/equal.js create mode 100644 node_modules/ajv/lib/compile/error_classes.js create mode 100644 node_modules/ajv/lib/compile/formats.js create mode 100644 node_modules/ajv/lib/compile/index.js create mode 100644 node_modules/ajv/lib/compile/resolve.js create mode 100644 node_modules/ajv/lib/compile/rules.js create mode 100644 node_modules/ajv/lib/compile/schema_obj.js create mode 100644 node_modules/ajv/lib/compile/ucs2length.js create mode 100644 node_modules/ajv/lib/compile/util.js create mode 100644 node_modules/ajv/lib/data.js create mode 100644 node_modules/ajv/lib/definition_schema.js create mode 100644 node_modules/ajv/lib/dot/_limit.jst create mode 100644 node_modules/ajv/lib/dot/_limitItems.jst create mode 100644 node_modules/ajv/lib/dot/_limitLength.jst create mode 100644 node_modules/ajv/lib/dot/_limitProperties.jst create mode 100644 node_modules/ajv/lib/dot/allOf.jst create mode 100644 node_modules/ajv/lib/dot/anyOf.jst create mode 100644 node_modules/ajv/lib/dot/coerce.def create mode 100644 node_modules/ajv/lib/dot/comment.jst create mode 100644 node_modules/ajv/lib/dot/const.jst create mode 100644 node_modules/ajv/lib/dot/contains.jst create mode 100644 node_modules/ajv/lib/dot/custom.jst create mode 100644 node_modules/ajv/lib/dot/defaults.def create mode 100644 node_modules/ajv/lib/dot/definitions.def create mode 100644 node_modules/ajv/lib/dot/dependencies.jst create mode 100644 node_modules/ajv/lib/dot/enum.jst create mode 100644 node_modules/ajv/lib/dot/errors.def create mode 100644 node_modules/ajv/lib/dot/format.jst create mode 100644 node_modules/ajv/lib/dot/if.jst create mode 100644 node_modules/ajv/lib/dot/items.jst create mode 100644 node_modules/ajv/lib/dot/missing.def create mode 100644 node_modules/ajv/lib/dot/multipleOf.jst create mode 100644 node_modules/ajv/lib/dot/not.jst create mode 100644 node_modules/ajv/lib/dot/oneOf.jst create mode 100644 node_modules/ajv/lib/dot/pattern.jst create mode 100644 node_modules/ajv/lib/dot/properties.jst create mode 100644 node_modules/ajv/lib/dot/propertyNames.jst create mode 100644 node_modules/ajv/lib/dot/ref.jst create mode 100644 node_modules/ajv/lib/dot/required.jst create mode 100644 node_modules/ajv/lib/dot/uniqueItems.jst create mode 100644 node_modules/ajv/lib/dot/validate.jst create mode 100644 node_modules/ajv/lib/dotjs/README.md create mode 100644 node_modules/ajv/lib/dotjs/_limit.js create mode 100644 node_modules/ajv/lib/dotjs/_limitItems.js create mode 100644 node_modules/ajv/lib/dotjs/_limitLength.js create mode 100644 node_modules/ajv/lib/dotjs/_limitProperties.js create mode 100644 node_modules/ajv/lib/dotjs/allOf.js create mode 100644 node_modules/ajv/lib/dotjs/anyOf.js create mode 100644 node_modules/ajv/lib/dotjs/comment.js create mode 100644 node_modules/ajv/lib/dotjs/const.js create mode 100644 node_modules/ajv/lib/dotjs/contains.js create mode 100644 node_modules/ajv/lib/dotjs/custom.js create mode 100644 node_modules/ajv/lib/dotjs/dependencies.js create mode 100644 node_modules/ajv/lib/dotjs/enum.js create mode 100644 node_modules/ajv/lib/dotjs/format.js create mode 100644 node_modules/ajv/lib/dotjs/if.js create mode 100644 node_modules/ajv/lib/dotjs/index.js create mode 100644 node_modules/ajv/lib/dotjs/items.js create mode 100644 node_modules/ajv/lib/dotjs/multipleOf.js create mode 100644 node_modules/ajv/lib/dotjs/not.js create mode 100644 node_modules/ajv/lib/dotjs/oneOf.js create mode 100644 node_modules/ajv/lib/dotjs/pattern.js create mode 100644 node_modules/ajv/lib/dotjs/properties.js create mode 100644 node_modules/ajv/lib/dotjs/propertyNames.js create mode 100644 node_modules/ajv/lib/dotjs/ref.js create mode 100644 node_modules/ajv/lib/dotjs/required.js create mode 100644 node_modules/ajv/lib/dotjs/uniqueItems.js create mode 100644 node_modules/ajv/lib/dotjs/validate.js create mode 100644 node_modules/ajv/lib/keyword.js create mode 100644 node_modules/ajv/lib/refs/data.json create mode 100644 node_modules/ajv/lib/refs/json-schema-draft-04.json create mode 100644 node_modules/ajv/lib/refs/json-schema-draft-06.json create mode 100644 node_modules/ajv/lib/refs/json-schema-draft-07.json create mode 100644 node_modules/ajv/lib/refs/json-schema-secure.json create mode 100644 node_modules/ajv/package.json create mode 100644 node_modules/ajv/scripts/.eslintrc.yml create mode 100644 node_modules/ajv/scripts/bundle.js create mode 100644 node_modules/ajv/scripts/compile-dots.js create mode 100755 node_modules/ajv/scripts/info create mode 100755 node_modules/ajv/scripts/prepare-tests create mode 100755 node_modules/ajv/scripts/publish-built-version create mode 100755 node_modules/ajv/scripts/travis-gh-pages create mode 100644 node_modules/ansi-align/CHANGELOG.md create mode 100644 node_modules/ansi-align/LICENSE create mode 100644 node_modules/ansi-align/README.md create mode 100644 node_modules/ansi-align/index.js create mode 100644 node_modules/ansi-align/node_modules/ansi-regex/index.js create mode 100644 node_modules/ansi-align/node_modules/ansi-regex/license create mode 100644 node_modules/ansi-align/node_modules/ansi-regex/package.json create mode 100644 node_modules/ansi-align/node_modules/ansi-regex/readme.md create mode 100644 node_modules/ansi-align/node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/ansi-align/node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/ansi-align/node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/ansi-align/node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/ansi-align/node_modules/string-width/index.js create mode 100644 node_modules/ansi-align/node_modules/string-width/license create mode 100644 node_modules/ansi-align/node_modules/string-width/package.json create mode 100644 node_modules/ansi-align/node_modules/string-width/readme.md create mode 100644 node_modules/ansi-align/node_modules/strip-ansi/index.js create mode 100644 node_modules/ansi-align/node_modules/strip-ansi/license create mode 100644 node_modules/ansi-align/node_modules/strip-ansi/package.json create mode 100644 node_modules/ansi-align/node_modules/strip-ansi/readme.md create mode 100644 node_modules/ansi-align/package.json create mode 100644 node_modules/ansi-regex/index.js create mode 100644 node_modules/ansi-regex/license create mode 100644 node_modules/ansi-regex/package.json create mode 100644 node_modules/ansi-regex/readme.md create mode 100644 node_modules/ansi-styles/index.js create mode 100644 node_modules/ansi-styles/license create mode 100644 node_modules/ansi-styles/package.json create mode 100644 node_modules/ansi-styles/readme.md create mode 100644 node_modules/anymatch/LICENSE create mode 100644 node_modules/anymatch/README.md create mode 100644 node_modules/anymatch/index.d.ts create mode 100644 node_modules/anymatch/index.js create mode 100644 node_modules/anymatch/package.json create mode 100644 node_modules/aproba/LICENSE create mode 100644 node_modules/aproba/README.md create mode 100644 node_modules/aproba/index.js create mode 100644 node_modules/aproba/package.json create mode 100644 node_modules/are-we-there-yet/CHANGES.md create mode 100644 node_modules/are-we-there-yet/LICENSE create mode 100644 node_modules/are-we-there-yet/README.md create mode 100644 node_modules/are-we-there-yet/index.js create mode 100644 node_modules/are-we-there-yet/package.json create mode 100644 node_modules/are-we-there-yet/tracker-base.js create mode 100644 node_modules/are-we-there-yet/tracker-group.js create mode 100644 node_modules/are-we-there-yet/tracker-stream.js create mode 100644 node_modules/are-we-there-yet/tracker.js create mode 100755 node_modules/arr-diff/LICENSE create mode 100644 node_modules/arr-diff/README.md create mode 100644 node_modules/arr-diff/index.js create mode 100644 node_modules/arr-diff/package.json create mode 100755 node_modules/arr-flatten/LICENSE create mode 100755 node_modules/arr-flatten/README.md create mode 100644 node_modules/arr-flatten/index.js create mode 100644 node_modules/arr-flatten/package.json create mode 100644 node_modules/arr-union/LICENSE create mode 100644 node_modules/arr-union/README.md create mode 100644 node_modules/arr-union/index.js create mode 100644 node_modules/arr-union/package.json create mode 100644 node_modules/array-each/LICENSE create mode 100644 node_modules/array-each/README.md create mode 100644 node_modules/array-each/index.js create mode 100644 node_modules/array-each/package.json create mode 100644 node_modules/array-flatten/LICENSE create mode 100644 node_modules/array-flatten/README.md create mode 100644 node_modules/array-flatten/array-flatten.js create mode 100644 node_modules/array-flatten/package.json create mode 100755 node_modules/array-slice/LICENSE create mode 100755 node_modules/array-slice/README.md create mode 100644 node_modules/array-slice/index.js create mode 100644 node_modules/array-slice/package.json create mode 100755 node_modules/array-unique/LICENSE create mode 100755 node_modules/array-unique/README.md create mode 100644 node_modules/array-unique/index.js create mode 100644 node_modules/array-unique/package.json create mode 100644 node_modules/asn1/LICENSE create mode 100644 node_modules/asn1/README.md create mode 100644 node_modules/asn1/lib/ber/errors.js create mode 100644 node_modules/asn1/lib/ber/index.js create mode 100644 node_modules/asn1/lib/ber/reader.js create mode 100644 node_modules/asn1/lib/ber/types.js create mode 100644 node_modules/asn1/lib/ber/writer.js create mode 100644 node_modules/asn1/lib/index.js create mode 100644 node_modules/asn1/package.json create mode 100644 node_modules/assert-plus/AUTHORS create mode 100644 node_modules/assert-plus/CHANGES.md create mode 100644 node_modules/assert-plus/README.md create mode 100644 node_modules/assert-plus/assert.js create mode 100644 node_modules/assert-plus/package.json create mode 100644 node_modules/assign-symbols/LICENSE create mode 100644 node_modules/assign-symbols/README.md create mode 100644 node_modules/assign-symbols/index.js create mode 100644 node_modules/assign-symbols/package.json create mode 100644 node_modules/asynckit/LICENSE create mode 100644 node_modules/asynckit/README.md create mode 100644 node_modules/asynckit/bench.js create mode 100644 node_modules/asynckit/index.js create mode 100644 node_modules/asynckit/lib/abort.js create mode 100644 node_modules/asynckit/lib/async.js create mode 100644 node_modules/asynckit/lib/defer.js create mode 100644 node_modules/asynckit/lib/iterate.js create mode 100644 node_modules/asynckit/lib/readable_asynckit.js create mode 100644 node_modules/asynckit/lib/readable_parallel.js create mode 100644 node_modules/asynckit/lib/readable_serial.js create mode 100644 node_modules/asynckit/lib/readable_serial_ordered.js create mode 100644 node_modules/asynckit/lib/state.js create mode 100644 node_modules/asynckit/lib/streamify.js create mode 100644 node_modules/asynckit/lib/terminator.js create mode 100644 node_modules/asynckit/package.json create mode 100644 node_modules/asynckit/parallel.js create mode 100644 node_modules/asynckit/serial.js create mode 100644 node_modules/asynckit/serialOrdered.js create mode 100644 node_modules/asynckit/stream.js create mode 100644 node_modules/atob/LICENSE create mode 100644 node_modules/atob/LICENSE.DOCS create mode 100644 node_modules/atob/README.md create mode 100755 node_modules/atob/bin/atob.js create mode 100644 node_modules/atob/bower.json create mode 100644 node_modules/atob/browser-atob.js create mode 100644 node_modules/atob/node-atob.js create mode 100644 node_modules/atob/package.json create mode 100644 node_modules/atob/test.js create mode 100644 node_modules/aws-sign2/LICENSE create mode 100644 node_modules/aws-sign2/README.md create mode 100644 node_modules/aws-sign2/index.js create mode 100644 node_modules/aws-sign2/package.json create mode 100644 node_modules/aws4/.travis.yml create mode 100644 node_modules/aws4/LICENSE create mode 100644 node_modules/aws4/README.md create mode 100644 node_modules/aws4/aws4.js create mode 100644 node_modules/aws4/lru.js create mode 100644 node_modules/aws4/package.json create mode 100644 node_modules/balanced-match/.npmignore create mode 100644 node_modules/balanced-match/LICENSE.md create mode 100644 node_modules/balanced-match/README.md create mode 100644 node_modules/balanced-match/index.js create mode 100644 node_modules/balanced-match/package.json create mode 100644 node_modules/base/LICENSE create mode 100644 node_modules/base/README.md create mode 100644 node_modules/base/index.js create mode 100644 node_modules/base/node_modules/define-property/LICENSE create mode 100644 node_modules/base/node_modules/define-property/README.md create mode 100644 node_modules/base/node_modules/define-property/index.js create mode 100644 node_modules/base/node_modules/define-property/package.json create mode 100644 node_modules/base/node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/base/node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/base/node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/base/node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/base/node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/base/node_modules/is-data-descriptor/README.md create mode 100644 node_modules/base/node_modules/is-data-descriptor/index.js create mode 100644 node_modules/base/node_modules/is-data-descriptor/package.json create mode 100644 node_modules/base/node_modules/is-descriptor/LICENSE create mode 100644 node_modules/base/node_modules/is-descriptor/README.md create mode 100644 node_modules/base/node_modules/is-descriptor/index.js create mode 100644 node_modules/base/node_modules/is-descriptor/package.json create mode 100644 node_modules/base/package.json create mode 100644 node_modules/bcrypt-pbkdf/CONTRIBUTING.md create mode 100644 node_modules/bcrypt-pbkdf/LICENSE create mode 100644 node_modules/bcrypt-pbkdf/README.md create mode 100644 node_modules/bcrypt-pbkdf/index.js create mode 100644 node_modules/bcrypt-pbkdf/package.json create mode 100644 node_modules/binary-extensions/binary-extensions.json create mode 100644 node_modules/binary-extensions/binary-extensions.json.d.ts create mode 100644 node_modules/binary-extensions/index.d.ts create mode 100644 node_modules/binary-extensions/index.js create mode 100644 node_modules/binary-extensions/license create mode 100644 node_modules/binary-extensions/package.json create mode 100644 node_modules/binary-extensions/readme.md create mode 100644 node_modules/bluebird/LICENSE create mode 100644 node_modules/bluebird/README.md create mode 100644 node_modules/bluebird/changelog.md create mode 100644 node_modules/bluebird/js/browser/bluebird.core.js create mode 100644 node_modules/bluebird/js/browser/bluebird.core.min.js create mode 100644 node_modules/bluebird/js/browser/bluebird.js create mode 100644 node_modules/bluebird/js/browser/bluebird.min.js create mode 100644 node_modules/bluebird/js/release/any.js create mode 100644 node_modules/bluebird/js/release/assert.js create mode 100644 node_modules/bluebird/js/release/async.js create mode 100644 node_modules/bluebird/js/release/bind.js create mode 100644 node_modules/bluebird/js/release/bluebird.js create mode 100644 node_modules/bluebird/js/release/call_get.js create mode 100644 node_modules/bluebird/js/release/cancel.js create mode 100644 node_modules/bluebird/js/release/catch_filter.js create mode 100644 node_modules/bluebird/js/release/context.js create mode 100644 node_modules/bluebird/js/release/debuggability.js create mode 100644 node_modules/bluebird/js/release/direct_resolve.js create mode 100644 node_modules/bluebird/js/release/each.js create mode 100644 node_modules/bluebird/js/release/errors.js create mode 100644 node_modules/bluebird/js/release/es5.js create mode 100644 node_modules/bluebird/js/release/filter.js create mode 100644 node_modules/bluebird/js/release/finally.js create mode 100644 node_modules/bluebird/js/release/generators.js create mode 100644 node_modules/bluebird/js/release/join.js create mode 100644 node_modules/bluebird/js/release/map.js create mode 100644 node_modules/bluebird/js/release/method.js create mode 100644 node_modules/bluebird/js/release/nodeback.js create mode 100644 node_modules/bluebird/js/release/nodeify.js create mode 100644 node_modules/bluebird/js/release/promise.js create mode 100644 node_modules/bluebird/js/release/promise_array.js create mode 100644 node_modules/bluebird/js/release/promisify.js create mode 100644 node_modules/bluebird/js/release/props.js create mode 100644 node_modules/bluebird/js/release/queue.js create mode 100644 node_modules/bluebird/js/release/race.js create mode 100644 node_modules/bluebird/js/release/reduce.js create mode 100644 node_modules/bluebird/js/release/schedule.js create mode 100644 node_modules/bluebird/js/release/settle.js create mode 100644 node_modules/bluebird/js/release/some.js create mode 100644 node_modules/bluebird/js/release/synchronous_inspection.js create mode 100644 node_modules/bluebird/js/release/thenables.js create mode 100644 node_modules/bluebird/js/release/timers.js create mode 100644 node_modules/bluebird/js/release/using.js create mode 100644 node_modules/bluebird/js/release/util.js create mode 100644 node_modules/bluebird/package.json create mode 100644 node_modules/body-parser/HISTORY.md create mode 100644 node_modules/body-parser/LICENSE create mode 100644 node_modules/body-parser/README.md create mode 100644 node_modules/body-parser/index.js create mode 100644 node_modules/body-parser/lib/read.js create mode 100644 node_modules/body-parser/lib/types/json.js create mode 100644 node_modules/body-parser/lib/types/raw.js create mode 100644 node_modules/body-parser/lib/types/text.js create mode 100644 node_modules/body-parser/lib/types/urlencoded.js create mode 100644 node_modules/body-parser/package.json create mode 100644 node_modules/bowser/CHANGELOG.md create mode 100644 node_modules/bowser/LICENSE create mode 100644 node_modules/bowser/README.md create mode 100644 node_modules/bowser/bundled.js create mode 100644 node_modules/bowser/bundled.js.gz create mode 100644 node_modules/bowser/es5.js create mode 100644 node_modules/bowser/es5.js.gz create mode 100644 node_modules/bowser/index.d.ts create mode 100644 node_modules/bowser/jsdoc.json create mode 100644 node_modules/bowser/package.json create mode 100644 node_modules/bowser/src/bowser.js create mode 100644 node_modules/bowser/src/constants.js create mode 100644 node_modules/bowser/src/parser-browsers.js create mode 100644 node_modules/bowser/src/parser-engines.js create mode 100644 node_modules/bowser/src/parser-os.js create mode 100644 node_modules/bowser/src/parser-platforms.js create mode 100644 node_modules/bowser/src/parser.js create mode 100644 node_modules/bowser/src/utils.js create mode 100644 node_modules/bowser/webpack.config.js create mode 100644 node_modules/boxen/index.js create mode 100644 node_modules/boxen/license create mode 100644 node_modules/boxen/node_modules/ansi-regex/index.js create mode 100644 node_modules/boxen/node_modules/ansi-regex/license create mode 100644 node_modules/boxen/node_modules/ansi-regex/package.json create mode 100644 node_modules/boxen/node_modules/ansi-regex/readme.md create mode 100644 node_modules/boxen/node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/boxen/node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/boxen/node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/boxen/node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/boxen/node_modules/string-width/index.js create mode 100644 node_modules/boxen/node_modules/string-width/license create mode 100644 node_modules/boxen/node_modules/string-width/package.json create mode 100644 node_modules/boxen/node_modules/string-width/readme.md create mode 100644 node_modules/boxen/node_modules/strip-ansi/index.js create mode 100644 node_modules/boxen/node_modules/strip-ansi/license create mode 100644 node_modules/boxen/node_modules/strip-ansi/package.json create mode 100644 node_modules/boxen/node_modules/strip-ansi/readme.md create mode 100644 node_modules/boxen/package.json create mode 100644 node_modules/boxen/readme.md create mode 100644 node_modules/brace-expansion/LICENSE create mode 100644 node_modules/brace-expansion/README.md create mode 100644 node_modules/brace-expansion/index.js create mode 100644 node_modules/brace-expansion/package.json create mode 100644 node_modules/braces/LICENSE create mode 100644 node_modules/braces/README.md create mode 100644 node_modules/braces/index.js create mode 100644 node_modules/braces/lib/braces.js create mode 100644 node_modules/braces/lib/compilers.js create mode 100644 node_modules/braces/lib/parsers.js create mode 100644 node_modules/braces/lib/utils.js create mode 100644 node_modules/braces/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/braces/node_modules/extend-shallow/README.md create mode 100644 node_modules/braces/node_modules/extend-shallow/index.js create mode 100644 node_modules/braces/node_modules/extend-shallow/package.json create mode 100644 node_modules/braces/package.json create mode 100644 node_modules/bytes/History.md create mode 100644 node_modules/bytes/LICENSE create mode 100644 node_modules/bytes/Readme.md create mode 100644 node_modules/bytes/index.js create mode 100644 node_modules/bytes/package.json create mode 100644 node_modules/cache-base/LICENSE create mode 100644 node_modules/cache-base/README.md create mode 100644 node_modules/cache-base/index.js create mode 100644 node_modules/cache-base/package.json create mode 100644 node_modules/camelcase/index.js create mode 100644 node_modules/camelcase/license create mode 100644 node_modules/camelcase/package.json create mode 100644 node_modules/camelcase/readme.md create mode 100644 node_modules/camelize/.travis.yml create mode 100644 node_modules/camelize/LICENSE create mode 100644 node_modules/camelize/example/camel.js create mode 100644 node_modules/camelize/index.js create mode 100644 node_modules/camelize/package.json create mode 100644 node_modules/camelize/readme.markdown create mode 100644 node_modules/camelize/test/camel.js create mode 100644 node_modules/capture-stack-trace/index.js create mode 100644 node_modules/capture-stack-trace/license create mode 100644 node_modules/capture-stack-trace/package.json create mode 100644 node_modules/capture-stack-trace/readme.md create mode 100644 node_modules/caseless/LICENSE create mode 100644 node_modules/caseless/README.md create mode 100644 node_modules/caseless/index.js create mode 100644 node_modules/caseless/package.json create mode 100644 node_modules/caseless/test.js create mode 100644 node_modules/chalk/index.js create mode 100644 node_modules/chalk/index.js.flow create mode 100644 node_modules/chalk/license create mode 100644 node_modules/chalk/package.json create mode 100644 node_modules/chalk/readme.md create mode 100644 node_modules/chalk/templates.js create mode 100644 node_modules/chalk/types/index.d.ts create mode 100644 node_modules/chokidar/LICENSE create mode 100644 node_modules/chokidar/README.md create mode 100644 node_modules/chokidar/index.js create mode 100644 node_modules/chokidar/lib/constants.js create mode 100644 node_modules/chokidar/lib/fsevents-handler.js create mode 100644 node_modules/chokidar/lib/nodefs-handler.js create mode 100644 node_modules/chokidar/node_modules/braces/CHANGELOG.md create mode 100644 node_modules/chokidar/node_modules/braces/LICENSE create mode 100644 node_modules/chokidar/node_modules/braces/README.md create mode 100644 node_modules/chokidar/node_modules/braces/index.js create mode 100644 node_modules/chokidar/node_modules/braces/lib/compile.js create mode 100644 node_modules/chokidar/node_modules/braces/lib/constants.js create mode 100644 node_modules/chokidar/node_modules/braces/lib/expand.js create mode 100644 node_modules/chokidar/node_modules/braces/lib/parse.js create mode 100644 node_modules/chokidar/node_modules/braces/lib/stringify.js create mode 100644 node_modules/chokidar/node_modules/braces/lib/utils.js create mode 100644 node_modules/chokidar/node_modules/braces/package.json create mode 100644 node_modules/chokidar/node_modules/fill-range/LICENSE create mode 100644 node_modules/chokidar/node_modules/fill-range/README.md create mode 100644 node_modules/chokidar/node_modules/fill-range/index.js create mode 100644 node_modules/chokidar/node_modules/fill-range/package.json create mode 100644 node_modules/chokidar/node_modules/is-number/LICENSE create mode 100644 node_modules/chokidar/node_modules/is-number/README.md create mode 100644 node_modules/chokidar/node_modules/is-number/index.js create mode 100644 node_modules/chokidar/node_modules/is-number/package.json create mode 100644 node_modules/chokidar/node_modules/to-regex-range/LICENSE create mode 100644 node_modules/chokidar/node_modules/to-regex-range/README.md create mode 100644 node_modules/chokidar/node_modules/to-regex-range/index.js create mode 100644 node_modules/chokidar/node_modules/to-regex-range/package.json create mode 100644 node_modules/chokidar/package.json create mode 100644 node_modules/chokidar/types/index.d.ts create mode 100644 node_modules/chownr/LICENSE create mode 100644 node_modules/chownr/README.md create mode 100644 node_modules/chownr/chownr.js create mode 100644 node_modules/chownr/package.json create mode 100644 node_modules/ci-info/CHANGELOG.md create mode 100644 node_modules/ci-info/LICENSE create mode 100644 node_modules/ci-info/README.md create mode 100644 node_modules/ci-info/index.js create mode 100644 node_modules/ci-info/package.json create mode 100644 node_modules/ci-info/vendors.json create mode 100644 node_modules/class-utils/LICENSE create mode 100644 node_modules/class-utils/README.md create mode 100644 node_modules/class-utils/index.js create mode 100644 node_modules/class-utils/node_modules/define-property/LICENSE create mode 100644 node_modules/class-utils/node_modules/define-property/README.md create mode 100644 node_modules/class-utils/node_modules/define-property/index.js create mode 100644 node_modules/class-utils/node_modules/define-property/package.json create mode 100644 node_modules/class-utils/package.json create mode 100644 node_modules/cli-boxes/boxes.json create mode 100644 node_modules/cli-boxes/index.js create mode 100644 node_modules/cli-boxes/license create mode 100644 node_modules/cli-boxes/package.json create mode 100644 node_modules/cli-boxes/readme.md create mode 100644 node_modules/code-point-at/index.js create mode 100644 node_modules/code-point-at/license create mode 100644 node_modules/code-point-at/package.json create mode 100644 node_modules/code-point-at/readme.md create mode 100644 node_modules/collection-visit/LICENSE create mode 100644 node_modules/collection-visit/README.md create mode 100644 node_modules/collection-visit/index.js create mode 100644 node_modules/collection-visit/package.json create mode 100644 node_modules/color-convert/CHANGELOG.md create mode 100644 node_modules/color-convert/LICENSE create mode 100644 node_modules/color-convert/README.md create mode 100644 node_modules/color-convert/conversions.js create mode 100644 node_modules/color-convert/index.js create mode 100644 node_modules/color-convert/package.json create mode 100644 node_modules/color-convert/route.js create mode 100644 node_modules/color-name/.eslintrc.json create mode 100644 node_modules/color-name/.npmignore create mode 100644 node_modules/color-name/LICENSE create mode 100644 node_modules/color-name/README.md create mode 100644 node_modules/color-name/index.js create mode 100644 node_modules/color-name/package.json create mode 100644 node_modules/color-name/test.js create mode 100644 node_modules/colorette/LICENSE.md create mode 100644 node_modules/colorette/README.md create mode 100644 node_modules/colorette/colorette.d.ts create mode 100644 node_modules/colorette/index.js create mode 100644 node_modules/colorette/package.json create mode 100644 node_modules/combined-stream/License create mode 100644 node_modules/combined-stream/Readme.md create mode 100644 node_modules/combined-stream/lib/combined_stream.js create mode 100644 node_modules/combined-stream/package.json create mode 100644 node_modules/combined-stream/yarn.lock create mode 100644 node_modules/commander/CHANGELOG.md create mode 100644 node_modules/commander/LICENSE create mode 100644 node_modules/commander/Readme.md create mode 100644 node_modules/commander/index.js create mode 100644 node_modules/commander/package.json create mode 100644 node_modules/commander/typings/index.d.ts create mode 100644 node_modules/component-emitter/History.md create mode 100644 node_modules/component-emitter/LICENSE create mode 100644 node_modules/component-emitter/Readme.md create mode 100644 node_modules/component-emitter/index.js create mode 100644 node_modules/component-emitter/package.json create mode 100644 node_modules/concat-map/.travis.yml create mode 100644 node_modules/concat-map/LICENSE create mode 100644 node_modules/concat-map/README.markdown create mode 100644 node_modules/concat-map/example/map.js create mode 100644 node_modules/concat-map/index.js create mode 100644 node_modules/concat-map/package.json create mode 100644 node_modules/concat-map/test/map.js create mode 100644 node_modules/configstore/index.js create mode 100644 node_modules/configstore/license create mode 100644 node_modules/configstore/package.json create mode 100644 node_modules/configstore/readme.md create mode 100644 node_modules/console-control-strings/LICENSE create mode 100644 node_modules/console-control-strings/README.md create mode 100644 node_modules/console-control-strings/README.md~ create mode 100644 node_modules/console-control-strings/index.js create mode 100644 node_modules/console-control-strings/package.json create mode 100644 node_modules/content-disposition/HISTORY.md create mode 100644 node_modules/content-disposition/LICENSE create mode 100644 node_modules/content-disposition/README.md create mode 100644 node_modules/content-disposition/index.js create mode 100644 node_modules/content-disposition/package.json create mode 100644 node_modules/content-security-policy-builder/CHANGELOG.md create mode 100644 node_modules/content-security-policy-builder/LICENSE create mode 100644 node_modules/content-security-policy-builder/README.md create mode 100644 node_modules/content-security-policy-builder/dist/index.d.ts create mode 100644 node_modules/content-security-policy-builder/dist/index.js create mode 100644 node_modules/content-security-policy-builder/package.json create mode 100644 node_modules/content-type/HISTORY.md create mode 100644 node_modules/content-type/LICENSE create mode 100644 node_modules/content-type/README.md create mode 100644 node_modules/content-type/index.js create mode 100644 node_modules/content-type/package.json create mode 100644 node_modules/cookie-signature/.npmignore create mode 100644 node_modules/cookie-signature/History.md create mode 100644 node_modules/cookie-signature/Readme.md create mode 100644 node_modules/cookie-signature/index.js create mode 100644 node_modules/cookie-signature/package.json create mode 100644 node_modules/cookie/HISTORY.md create mode 100644 node_modules/cookie/LICENSE create mode 100644 node_modules/cookie/README.md create mode 100644 node_modules/cookie/index.js create mode 100644 node_modules/cookie/package.json create mode 100644 node_modules/copy-descriptor/LICENSE create mode 100644 node_modules/copy-descriptor/index.js create mode 100644 node_modules/copy-descriptor/package.json create mode 100644 node_modules/core-util-is/LICENSE create mode 100644 node_modules/core-util-is/README.md create mode 100644 node_modules/core-util-is/float.patch create mode 100644 node_modules/core-util-is/lib/util.js create mode 100644 node_modules/core-util-is/package.json create mode 100644 node_modules/core-util-is/test.js create mode 100644 node_modules/cors/CONTRIBUTING.md create mode 100644 node_modules/cors/HISTORY.md create mode 100644 node_modules/cors/LICENSE create mode 100644 node_modules/cors/README.md create mode 100644 node_modules/cors/lib/index.js create mode 100644 node_modules/cors/package.json create mode 100644 node_modules/create-error-class/index.js create mode 100644 node_modules/create-error-class/license create mode 100644 node_modules/create-error-class/package.json create mode 100644 node_modules/create-error-class/readme.md create mode 100644 node_modules/cross-spawn/CHANGELOG.md create mode 100644 node_modules/cross-spawn/LICENSE create mode 100644 node_modules/cross-spawn/README.md create mode 100644 node_modules/cross-spawn/index.js create mode 100644 node_modules/cross-spawn/lib/enoent.js create mode 100644 node_modules/cross-spawn/lib/parse.js create mode 100644 node_modules/cross-spawn/lib/util/escapeArgument.js create mode 100644 node_modules/cross-spawn/lib/util/escapeCommand.js create mode 100644 node_modules/cross-spawn/lib/util/hasEmptyArgumentBug.js create mode 100644 node_modules/cross-spawn/lib/util/readShebang.js create mode 100644 node_modules/cross-spawn/lib/util/resolveCommand.js create mode 100644 node_modules/cross-spawn/package.json create mode 100644 node_modules/crypto-random-string/index.js create mode 100644 node_modules/crypto-random-string/license create mode 100644 node_modules/crypto-random-string/package.json create mode 100644 node_modules/crypto-random-string/readme.md create mode 100644 node_modules/dashdash/CHANGES.md create mode 100644 node_modules/dashdash/LICENSE.txt create mode 100644 node_modules/dashdash/README.md create mode 100644 node_modules/dashdash/etc/dashdash.bash_completion.in create mode 100644 node_modules/dashdash/lib/dashdash.js create mode 100644 node_modules/dashdash/package.json create mode 100644 node_modules/dasherize/.jshintrc create mode 100644 node_modules/dasherize/.travis.yml create mode 100644 node_modules/dasherize/LICENSE create mode 100644 node_modules/dasherize/example/dash.js create mode 100644 node_modules/dasherize/index.js create mode 100644 node_modules/dasherize/package.json create mode 100644 node_modules/dasherize/readme.markdown create mode 100644 node_modules/dasherize/test/dash.js create mode 100644 node_modules/debug/.coveralls.yml create mode 100644 node_modules/debug/.eslintrc create mode 100644 node_modules/debug/.npmignore create mode 100644 node_modules/debug/.travis.yml create mode 100644 node_modules/debug/CHANGELOG.md create mode 100644 node_modules/debug/LICENSE create mode 100644 node_modules/debug/Makefile create mode 100644 node_modules/debug/README.md create mode 100644 node_modules/debug/component.json create mode 100644 node_modules/debug/karma.conf.js create mode 100644 node_modules/debug/node.js create mode 100644 node_modules/debug/package.json create mode 100644 node_modules/debug/src/browser.js create mode 100644 node_modules/debug/src/debug.js create mode 100644 node_modules/debug/src/index.js create mode 100644 node_modules/debug/src/inspector-log.js create mode 100644 node_modules/debug/src/node.js create mode 100644 node_modules/decode-uri-component/index.js create mode 100644 node_modules/decode-uri-component/license create mode 100644 node_modules/decode-uri-component/package.json create mode 100644 node_modules/decode-uri-component/readme.md create mode 100644 node_modules/deep-extend/CHANGELOG.md create mode 100644 node_modules/deep-extend/LICENSE create mode 100644 node_modules/deep-extend/README.md create mode 100644 node_modules/deep-extend/index.js create mode 100644 node_modules/deep-extend/lib/deep-extend.js create mode 100644 node_modules/deep-extend/package.json create mode 100644 node_modules/define-property/CHANGELOG.md create mode 100644 node_modules/define-property/LICENSE create mode 100644 node_modules/define-property/README.md create mode 100644 node_modules/define-property/index.js create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/define-property/node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/README.md create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/index.js create mode 100644 node_modules/define-property/node_modules/is-data-descriptor/package.json create mode 100644 node_modules/define-property/node_modules/is-descriptor/LICENSE create mode 100644 node_modules/define-property/node_modules/is-descriptor/README.md create mode 100644 node_modules/define-property/node_modules/is-descriptor/index.js create mode 100644 node_modules/define-property/node_modules/is-descriptor/package.json create mode 100644 node_modules/define-property/package.json create mode 100644 node_modules/delayed-stream/.npmignore create mode 100644 node_modules/delayed-stream/License create mode 100644 node_modules/delayed-stream/Makefile create mode 100644 node_modules/delayed-stream/Readme.md create mode 100644 node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 node_modules/delayed-stream/package.json create mode 100644 node_modules/delegates/.npmignore create mode 100644 node_modules/delegates/History.md create mode 100644 node_modules/delegates/License create mode 100644 node_modules/delegates/Makefile create mode 100644 node_modules/delegates/Readme.md create mode 100644 node_modules/delegates/index.js create mode 100644 node_modules/delegates/package.json create mode 100644 node_modules/delegates/test/index.js create mode 100644 node_modules/depd/History.md create mode 100644 node_modules/depd/LICENSE create mode 100644 node_modules/depd/Readme.md create mode 100644 node_modules/depd/index.js create mode 100644 node_modules/depd/lib/browser/index.js create mode 100644 node_modules/depd/lib/compat/callsite-tostring.js create mode 100644 node_modules/depd/lib/compat/event-listener-count.js create mode 100644 node_modules/depd/lib/compat/index.js create mode 100644 node_modules/depd/package.json create mode 100644 node_modules/destroy/LICENSE create mode 100644 node_modules/destroy/README.md create mode 100644 node_modules/destroy/index.js create mode 100644 node_modules/destroy/package.json create mode 100644 node_modules/detect-file/LICENSE create mode 100644 node_modules/detect-file/README.md create mode 100644 node_modules/detect-file/index.js create mode 100644 node_modules/detect-file/package.json create mode 100644 node_modules/detect-libc/.npmignore create mode 100644 node_modules/detect-libc/LICENSE create mode 100644 node_modules/detect-libc/README.md create mode 100755 node_modules/detect-libc/bin/detect-libc.js create mode 100644 node_modules/detect-libc/lib/detect-libc.js create mode 100644 node_modules/detect-libc/package.json create mode 100644 node_modules/dns-prefetch-control/CHANGELOG.md create mode 100644 node_modules/dns-prefetch-control/LICENSE create mode 100644 node_modules/dns-prefetch-control/README.md create mode 100644 node_modules/dns-prefetch-control/dist/index.d.ts create mode 100644 node_modules/dns-prefetch-control/dist/index.js create mode 100644 node_modules/dns-prefetch-control/package.json create mode 100644 node_modules/dont-sniff-mimetype/CHANGELOG.md create mode 100644 node_modules/dont-sniff-mimetype/LICENSE create mode 100644 node_modules/dont-sniff-mimetype/README.md create mode 100644 node_modules/dont-sniff-mimetype/dist/index.d.ts create mode 100644 node_modules/dont-sniff-mimetype/dist/index.js create mode 100644 node_modules/dont-sniff-mimetype/package.json create mode 100644 node_modules/dot-prop/index.js create mode 100644 node_modules/dot-prop/license create mode 100644 node_modules/dot-prop/package.json create mode 100644 node_modules/dot-prop/readme.md create mode 100644 node_modules/duplexer3/LICENSE.md create mode 100644 node_modules/duplexer3/README.md create mode 100644 node_modules/duplexer3/index.js create mode 100644 node_modules/duplexer3/package.json create mode 100755 node_modules/ecc-jsbn/LICENSE create mode 100755 node_modules/ecc-jsbn/README.md create mode 100755 node_modules/ecc-jsbn/index.js create mode 100755 node_modules/ecc-jsbn/lib/LICENSE-jsbn create mode 100755 node_modules/ecc-jsbn/lib/ec.js create mode 100755 node_modules/ecc-jsbn/lib/sec.js create mode 100755 node_modules/ecc-jsbn/package.json create mode 100755 node_modules/ecc-jsbn/test.js create mode 100644 node_modules/ee-first/LICENSE create mode 100644 node_modules/ee-first/README.md create mode 100644 node_modules/ee-first/index.js create mode 100644 node_modules/ee-first/package.json create mode 100644 node_modules/encodeurl/HISTORY.md create mode 100644 node_modules/encodeurl/LICENSE create mode 100644 node_modules/encodeurl/README.md create mode 100644 node_modules/encodeurl/index.js create mode 100644 node_modules/encodeurl/package.json create mode 100644 node_modules/escape-html/LICENSE create mode 100644 node_modules/escape-html/Readme.md create mode 100644 node_modules/escape-html/index.js create mode 100644 node_modules/escape-html/package.json create mode 100644 node_modules/escape-string-regexp/index.js create mode 100644 node_modules/escape-string-regexp/license create mode 100644 node_modules/escape-string-regexp/package.json create mode 100644 node_modules/escape-string-regexp/readme.md create mode 100644 node_modules/esm/LICENSE create mode 100644 node_modules/esm/README.md create mode 100644 node_modules/esm/esm.js create mode 100644 node_modules/esm/esm/loader.js create mode 100644 node_modules/esm/index.js create mode 100644 node_modules/esm/package.json create mode 100644 node_modules/etag/HISTORY.md create mode 100644 node_modules/etag/LICENSE create mode 100644 node_modules/etag/README.md create mode 100644 node_modules/etag/index.js create mode 100644 node_modules/etag/package.json create mode 100644 node_modules/execa/index.js create mode 100644 node_modules/execa/lib/errname.js create mode 100644 node_modules/execa/lib/stdio.js create mode 100644 node_modules/execa/license create mode 100644 node_modules/execa/package.json create mode 100644 node_modules/execa/readme.md create mode 100644 node_modules/expand-brackets/LICENSE create mode 100644 node_modules/expand-brackets/README.md create mode 100644 node_modules/expand-brackets/changelog.md create mode 100644 node_modules/expand-brackets/index.js create mode 100644 node_modules/expand-brackets/lib/compilers.js create mode 100644 node_modules/expand-brackets/lib/parsers.js create mode 100644 node_modules/expand-brackets/lib/utils.js create mode 100644 node_modules/expand-brackets/node_modules/define-property/LICENSE create mode 100644 node_modules/expand-brackets/node_modules/define-property/README.md create mode 100644 node_modules/expand-brackets/node_modules/define-property/index.js create mode 100644 node_modules/expand-brackets/node_modules/define-property/package.json create mode 100644 node_modules/expand-brackets/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/expand-brackets/node_modules/extend-shallow/README.md create mode 100644 node_modules/expand-brackets/node_modules/extend-shallow/index.js create mode 100644 node_modules/expand-brackets/node_modules/extend-shallow/package.json create mode 100644 node_modules/expand-brackets/package.json create mode 100644 node_modules/expand-tilde/LICENSE create mode 100644 node_modules/expand-tilde/README.md create mode 100644 node_modules/expand-tilde/index.js create mode 100644 node_modules/expand-tilde/package.json create mode 100644 node_modules/expect-ct/CHANGELOG.md create mode 100644 node_modules/expect-ct/LICENSE create mode 100644 node_modules/expect-ct/README.md create mode 100644 node_modules/expect-ct/dist/index.d.ts create mode 100644 node_modules/expect-ct/dist/index.js create mode 100644 node_modules/expect-ct/package.json create mode 100644 node_modules/express/History.md create mode 100644 node_modules/express/LICENSE create mode 100644 node_modules/express/Readme.md 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/init.js create mode 100644 node_modules/express/lib/middleware/query.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/layer.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/package.json create mode 100644 node_modules/extend-shallow/LICENSE create mode 100644 node_modules/extend-shallow/README.md create mode 100644 node_modules/extend-shallow/index.js create mode 100644 node_modules/extend-shallow/node_modules/is-extendable/LICENSE create mode 100644 node_modules/extend-shallow/node_modules/is-extendable/README.md create mode 100644 node_modules/extend-shallow/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/extend-shallow/node_modules/is-extendable/index.js create mode 100644 node_modules/extend-shallow/node_modules/is-extendable/package.json create mode 100644 node_modules/extend-shallow/package.json create mode 100644 node_modules/extend/.editorconfig create mode 100644 node_modules/extend/.eslintrc create mode 100644 node_modules/extend/.jscs.json create mode 100644 node_modules/extend/.travis.yml create mode 100644 node_modules/extend/CHANGELOG.md create mode 100644 node_modules/extend/LICENSE create mode 100644 node_modules/extend/README.md create mode 100644 node_modules/extend/component.json create mode 100644 node_modules/extend/index.js create mode 100644 node_modules/extend/package.json create mode 100644 node_modules/extglob/LICENSE create mode 100644 node_modules/extglob/README.md create mode 100644 node_modules/extglob/changelog.md create mode 100644 node_modules/extglob/index.js create mode 100644 node_modules/extglob/lib/.DS_Store create mode 100644 node_modules/extglob/lib/compilers.js create mode 100644 node_modules/extglob/lib/extglob.js create mode 100644 node_modules/extglob/lib/parsers.js create mode 100644 node_modules/extglob/lib/utils.js create mode 100644 node_modules/extglob/node_modules/define-property/LICENSE create mode 100644 node_modules/extglob/node_modules/define-property/README.md create mode 100644 node_modules/extglob/node_modules/define-property/index.js create mode 100644 node_modules/extglob/node_modules/define-property/package.json create mode 100644 node_modules/extglob/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/extglob/node_modules/extend-shallow/README.md create mode 100644 node_modules/extglob/node_modules/extend-shallow/index.js create mode 100644 node_modules/extglob/node_modules/extend-shallow/package.json create mode 100644 node_modules/extglob/node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/extglob/node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/extglob/node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/extglob/node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/extglob/node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/extglob/node_modules/is-data-descriptor/README.md create mode 100644 node_modules/extglob/node_modules/is-data-descriptor/index.js create mode 100644 node_modules/extglob/node_modules/is-data-descriptor/package.json create mode 100644 node_modules/extglob/node_modules/is-descriptor/LICENSE create mode 100644 node_modules/extglob/node_modules/is-descriptor/README.md create mode 100644 node_modules/extglob/node_modules/is-descriptor/index.js create mode 100644 node_modules/extglob/node_modules/is-descriptor/package.json create mode 100644 node_modules/extglob/package.json create mode 100644 node_modules/extsprintf/.gitmodules create mode 100644 node_modules/extsprintf/.npmignore create mode 100644 node_modules/extsprintf/LICENSE create mode 100644 node_modules/extsprintf/Makefile create mode 100644 node_modules/extsprintf/Makefile.targ create mode 100644 node_modules/extsprintf/README.md create mode 100644 node_modules/extsprintf/jsl.node.conf create mode 100644 node_modules/extsprintf/lib/extsprintf.js create mode 100644 node_modules/extsprintf/package.json create mode 100644 node_modules/fast-deep-equal/LICENSE create mode 100644 node_modules/fast-deep-equal/README.md create mode 100644 node_modules/fast-deep-equal/es6/index.d.ts create mode 100644 node_modules/fast-deep-equal/es6/index.js create mode 100644 node_modules/fast-deep-equal/es6/react.d.ts create mode 100644 node_modules/fast-deep-equal/es6/react.js create mode 100644 node_modules/fast-deep-equal/index.d.ts create mode 100644 node_modules/fast-deep-equal/index.js create mode 100644 node_modules/fast-deep-equal/package.json create mode 100644 node_modules/fast-deep-equal/react.d.ts create mode 100644 node_modules/fast-deep-equal/react.js create mode 100644 node_modules/fast-json-stable-stringify/.eslintrc.yml create mode 100644 node_modules/fast-json-stable-stringify/.github/FUNDING.yml create mode 100644 node_modules/fast-json-stable-stringify/.travis.yml create mode 100644 node_modules/fast-json-stable-stringify/LICENSE create mode 100644 node_modules/fast-json-stable-stringify/README.md create mode 100644 node_modules/fast-json-stable-stringify/benchmark/index.js create mode 100644 node_modules/fast-json-stable-stringify/benchmark/test.json create mode 100644 node_modules/fast-json-stable-stringify/example/key_cmp.js create mode 100644 node_modules/fast-json-stable-stringify/example/nested.js create mode 100644 node_modules/fast-json-stable-stringify/example/str.js create mode 100644 node_modules/fast-json-stable-stringify/example/value_cmp.js create mode 100644 node_modules/fast-json-stable-stringify/index.d.ts create mode 100644 node_modules/fast-json-stable-stringify/index.js create mode 100644 node_modules/fast-json-stable-stringify/package.json create mode 100644 node_modules/fast-json-stable-stringify/test/cmp.js create mode 100644 node_modules/fast-json-stable-stringify/test/nested.js create mode 100644 node_modules/fast-json-stable-stringify/test/str.js create mode 100644 node_modules/fast-json-stable-stringify/test/to-json.js create mode 100644 node_modules/feature-policy/CHANGELOG.md create mode 100644 node_modules/feature-policy/LICENSE create mode 100644 node_modules/feature-policy/README.md create mode 100644 node_modules/feature-policy/dist/index.d.ts create mode 100644 node_modules/feature-policy/dist/index.js create mode 100644 node_modules/feature-policy/package.json create mode 100644 node_modules/fill-range/LICENSE create mode 100644 node_modules/fill-range/README.md create mode 100644 node_modules/fill-range/index.js create mode 100644 node_modules/fill-range/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/fill-range/node_modules/extend-shallow/README.md create mode 100644 node_modules/fill-range/node_modules/extend-shallow/index.js create mode 100644 node_modules/fill-range/node_modules/extend-shallow/package.json create mode 100644 node_modules/fill-range/package.json create mode 100644 node_modules/finalhandler/HISTORY.md create mode 100644 node_modules/finalhandler/LICENSE create mode 100644 node_modules/finalhandler/README.md create mode 100644 node_modules/finalhandler/index.js create mode 100644 node_modules/finalhandler/package.json create mode 100644 node_modules/findup-sync/LICENSE create mode 100644 node_modules/findup-sync/README.md create mode 100644 node_modules/findup-sync/index.js create mode 100644 node_modules/findup-sync/package.json create mode 100644 node_modules/fined/LICENSE create mode 100644 node_modules/fined/README.md create mode 100644 node_modules/fined/index.js create mode 100644 node_modules/fined/package.json create mode 100644 node_modules/flagged-respawn/LICENSE create mode 100644 node_modules/flagged-respawn/README.md create mode 100644 node_modules/flagged-respawn/index.js create mode 100644 node_modules/flagged-respawn/lib/is-v8flags.js create mode 100644 node_modules/flagged-respawn/lib/remover.js create mode 100644 node_modules/flagged-respawn/lib/reorder.js create mode 100644 node_modules/flagged-respawn/lib/respawn.js create mode 100644 node_modules/flagged-respawn/package.json create mode 100644 node_modules/for-in/LICENSE create mode 100644 node_modules/for-in/README.md create mode 100644 node_modules/for-in/index.js create mode 100644 node_modules/for-in/package.json create mode 100644 node_modules/for-own/LICENSE create mode 100644 node_modules/for-own/README.md create mode 100644 node_modules/for-own/index.js create mode 100644 node_modules/for-own/package.json create mode 100644 node_modules/forever-agent/LICENSE create mode 100644 node_modules/forever-agent/README.md create mode 100644 node_modules/forever-agent/index.js create mode 100644 node_modules/forever-agent/package.json create mode 100644 node_modules/form-data/License create mode 100644 node_modules/form-data/README.md create mode 100644 node_modules/form-data/README.md.bak create mode 100644 node_modules/form-data/lib/browser.js create mode 100644 node_modules/form-data/lib/form_data.js create mode 100644 node_modules/form-data/lib/populate.js create mode 100644 node_modules/form-data/package.json create mode 100644 node_modules/form-data/yarn.lock create mode 100644 node_modules/forwarded/HISTORY.md create mode 100644 node_modules/forwarded/LICENSE create mode 100644 node_modules/forwarded/README.md create mode 100644 node_modules/forwarded/index.js create mode 100644 node_modules/forwarded/package.json create mode 100644 node_modules/fragment-cache/LICENSE create mode 100644 node_modules/fragment-cache/README.md create mode 100644 node_modules/fragment-cache/index.js create mode 100644 node_modules/fragment-cache/package.json create mode 100644 node_modules/frameguard/CHANGELOG.md create mode 100644 node_modules/frameguard/LICENSE create mode 100644 node_modules/frameguard/README.md create mode 100644 node_modules/frameguard/dist/index.d.ts create mode 100644 node_modules/frameguard/dist/index.js create mode 100644 node_modules/frameguard/package.json create mode 100644 node_modules/fresh/HISTORY.md create mode 100644 node_modules/fresh/LICENSE create mode 100644 node_modules/fresh/README.md create mode 100644 node_modules/fresh/index.js create mode 100644 node_modules/fresh/package.json create mode 100644 node_modules/fs-minipass/LICENSE create mode 100644 node_modules/fs-minipass/README.md create mode 100644 node_modules/fs-minipass/index.js create mode 100644 node_modules/fs-minipass/package.json create mode 100644 node_modules/fs.realpath/LICENSE create mode 100644 node_modules/fs.realpath/README.md create mode 100644 node_modules/fs.realpath/index.js create mode 100644 node_modules/fs.realpath/old.js create mode 100644 node_modules/fs.realpath/package.json create mode 100644 node_modules/gauge/CHANGELOG.md create mode 100644 node_modules/gauge/LICENSE create mode 100644 node_modules/gauge/README.md create mode 100644 node_modules/gauge/base-theme.js create mode 100644 node_modules/gauge/error.js create mode 100644 node_modules/gauge/has-color.js create mode 100644 node_modules/gauge/index.js create mode 100644 node_modules/gauge/package.json create mode 100644 node_modules/gauge/plumbing.js create mode 100644 node_modules/gauge/process.js create mode 100644 node_modules/gauge/progress-bar.js create mode 100644 node_modules/gauge/render-template.js create mode 100644 node_modules/gauge/set-immediate.js create mode 100644 node_modules/gauge/set-interval.js create mode 100644 node_modules/gauge/spin.js create mode 100644 node_modules/gauge/template-item.js create mode 100644 node_modules/gauge/theme-set.js create mode 100644 node_modules/gauge/themes.js create mode 100644 node_modules/gauge/wide-truncate.js create mode 100644 node_modules/get-stream/buffer-stream.js create mode 100644 node_modules/get-stream/index.js create mode 100644 node_modules/get-stream/license create mode 100644 node_modules/get-stream/package.json create mode 100644 node_modules/get-stream/readme.md create mode 100644 node_modules/get-value/LICENSE create mode 100644 node_modules/get-value/index.js create mode 100644 node_modules/get-value/package.json create mode 100644 node_modules/getopts/LICENSE.md create mode 100644 node_modules/getopts/README.md create mode 100644 node_modules/getopts/getopts.d.ts create mode 100644 node_modules/getopts/index.js create mode 100644 node_modules/getopts/package.json create mode 100644 node_modules/getpass/.npmignore create mode 100644 node_modules/getpass/.travis.yml create mode 100644 node_modules/getpass/LICENSE create mode 100644 node_modules/getpass/README.md create mode 100644 node_modules/getpass/lib/index.js create mode 100644 node_modules/getpass/package.json create mode 100644 node_modules/glob-parent/LICENSE create mode 100644 node_modules/glob-parent/README.md create mode 100644 node_modules/glob-parent/index.js create mode 100644 node_modules/glob-parent/package.json create mode 100644 node_modules/glob/LICENSE create mode 100644 node_modules/glob/README.md create mode 100644 node_modules/glob/changelog.md create mode 100644 node_modules/glob/common.js create mode 100644 node_modules/glob/glob.js create mode 100644 node_modules/glob/package.json create mode 100644 node_modules/glob/sync.js create mode 100644 node_modules/global-dirs/index.js create mode 100644 node_modules/global-dirs/license create mode 100644 node_modules/global-dirs/package.json create mode 100644 node_modules/global-dirs/readme.md create mode 100644 node_modules/global-modules/LICENSE create mode 100644 node_modules/global-modules/README.md create mode 100644 node_modules/global-modules/index.js create mode 100644 node_modules/global-modules/package.json create mode 100644 node_modules/global-prefix/LICENSE create mode 100644 node_modules/global-prefix/README.md create mode 100644 node_modules/global-prefix/index.js create mode 100644 node_modules/global-prefix/package.json create mode 100644 node_modules/got/index.js create mode 100644 node_modules/got/license create mode 100644 node_modules/got/package.json create mode 100644 node_modules/got/readme.md create mode 100644 node_modules/graceful-fs/LICENSE create mode 100644 node_modules/graceful-fs/README.md create mode 100644 node_modules/graceful-fs/clone.js create mode 100644 node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/graceful-fs/legacy-streams.js create mode 100644 node_modules/graceful-fs/package.json create mode 100644 node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/har-schema/LICENSE create mode 100644 node_modules/har-schema/README.md create mode 100644 node_modules/har-schema/lib/afterRequest.json create mode 100644 node_modules/har-schema/lib/beforeRequest.json create mode 100644 node_modules/har-schema/lib/browser.json create mode 100644 node_modules/har-schema/lib/cache.json create mode 100644 node_modules/har-schema/lib/content.json create mode 100644 node_modules/har-schema/lib/cookie.json create mode 100644 node_modules/har-schema/lib/creator.json create mode 100644 node_modules/har-schema/lib/entry.json create mode 100644 node_modules/har-schema/lib/har.json create mode 100644 node_modules/har-schema/lib/header.json create mode 100644 node_modules/har-schema/lib/index.js create mode 100644 node_modules/har-schema/lib/log.json create mode 100644 node_modules/har-schema/lib/page.json create mode 100644 node_modules/har-schema/lib/pageTimings.json create mode 100644 node_modules/har-schema/lib/postData.json create mode 100644 node_modules/har-schema/lib/query.json create mode 100644 node_modules/har-schema/lib/request.json create mode 100644 node_modules/har-schema/lib/response.json create mode 100644 node_modules/har-schema/lib/timings.json create mode 100644 node_modules/har-schema/package.json create mode 100644 node_modules/har-validator/LICENSE create mode 100644 node_modules/har-validator/README.md create mode 100644 node_modules/har-validator/lib/async.js create mode 100644 node_modules/har-validator/lib/error.js create mode 100644 node_modules/har-validator/lib/promise.js create mode 100644 node_modules/har-validator/package.json create mode 100644 node_modules/has-flag/index.js create mode 100644 node_modules/has-flag/license create mode 100644 node_modules/has-flag/package.json create mode 100644 node_modules/has-flag/readme.md create mode 100644 node_modules/has-unicode/LICENSE create mode 100644 node_modules/has-unicode/README.md create mode 100644 node_modules/has-unicode/index.js create mode 100644 node_modules/has-unicode/package.json create mode 100644 node_modules/has-value/LICENSE create mode 100644 node_modules/has-value/README.md create mode 100644 node_modules/has-value/index.js create mode 100644 node_modules/has-value/package.json create mode 100644 node_modules/has-values/LICENSE create mode 100644 node_modules/has-values/README.md create mode 100644 node_modules/has-values/index.js create mode 100644 node_modules/has-values/node_modules/kind-of/LICENSE create mode 100644 node_modules/has-values/node_modules/kind-of/README.md create mode 100644 node_modules/has-values/node_modules/kind-of/index.js create mode 100644 node_modules/has-values/node_modules/kind-of/package.json create mode 100644 node_modules/has-values/package.json create mode 100644 node_modules/helmet-crossdomain/CHANGELOG.md create mode 100644 node_modules/helmet-crossdomain/LICENSE create mode 100644 node_modules/helmet-crossdomain/README.md create mode 100644 node_modules/helmet-crossdomain/dist/index.d.ts create mode 100644 node_modules/helmet-crossdomain/dist/index.js create mode 100644 node_modules/helmet-crossdomain/package.json create mode 100644 node_modules/helmet-csp/CHANGELOG.md create mode 100644 node_modules/helmet-csp/LICENSE create mode 100644 node_modules/helmet-csp/README.md create mode 100644 node_modules/helmet-csp/dist/index.d.ts create mode 100644 node_modules/helmet-csp/dist/index.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/boolean.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/index.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/plugin-types.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/report-uri.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/require-sri-for.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/sandbox.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/check-directive/source-list.js create mode 100644 node_modules/helmet-csp/dist/lib/check-options/index.js create mode 100644 node_modules/helmet-csp/dist/lib/config.js create mode 100644 node_modules/helmet-csp/dist/lib/contains-function.js create mode 100644 node_modules/helmet-csp/dist/lib/get-header-keys-for-browser.js create mode 100644 node_modules/helmet-csp/dist/lib/is-boolean.js create mode 100644 node_modules/helmet-csp/dist/lib/is-function.js create mode 100644 node_modules/helmet-csp/dist/lib/is-string.js create mode 100644 node_modules/helmet-csp/dist/lib/parse-dynamic-directives.js create mode 100644 node_modules/helmet-csp/dist/lib/transform-directives-for-browser.js create mode 100644 node_modules/helmet-csp/dist/lib/types.d.ts create mode 100644 node_modules/helmet-csp/dist/lib/types.js create mode 100644 node_modules/helmet-csp/package.json create mode 100644 node_modules/helmet/CHANGELOG.md create mode 100644 node_modules/helmet/CODE_OF_CONDUCT.md create mode 100644 node_modules/helmet/CONTRIBUTING.md create mode 100644 node_modules/helmet/LICENSE create mode 100644 node_modules/helmet/README.md create mode 100644 node_modules/helmet/SECURITY.md create mode 100644 node_modules/helmet/index.js create mode 100644 node_modules/helmet/node_modules/depd/History.md create mode 100644 node_modules/helmet/node_modules/depd/LICENSE create mode 100644 node_modules/helmet/node_modules/depd/Readme.md create mode 100644 node_modules/helmet/node_modules/depd/index.js create mode 100644 node_modules/helmet/node_modules/depd/lib/browser/index.js create mode 100644 node_modules/helmet/node_modules/depd/package.json create mode 100644 node_modules/helmet/package.json create mode 100644 node_modules/hide-powered-by/CHANGELOG.md create mode 100644 node_modules/hide-powered-by/LICENSE create mode 100644 node_modules/hide-powered-by/README.md create mode 100644 node_modules/hide-powered-by/dist/index.d.ts create mode 100644 node_modules/hide-powered-by/dist/index.js create mode 100644 node_modules/hide-powered-by/package.json create mode 100644 node_modules/homedir-polyfill/LICENSE create mode 100644 node_modules/homedir-polyfill/README.md create mode 100644 node_modules/homedir-polyfill/index.js create mode 100644 node_modules/homedir-polyfill/package.json create mode 100644 node_modules/homedir-polyfill/polyfill.js create mode 100644 node_modules/hpkp/.npmignore create mode 100644 node_modules/hpkp/LICENSE create mode 100644 node_modules/hpkp/README.md create mode 100644 node_modules/hpkp/index.js create mode 100644 node_modules/hpkp/package.json create mode 100644 node_modules/hsts/CHANGELOG.md create mode 100644 node_modules/hsts/LICENSE create mode 100644 node_modules/hsts/README.md create mode 100644 node_modules/hsts/index.js create mode 100644 node_modules/hsts/node_modules/depd/History.md create mode 100644 node_modules/hsts/node_modules/depd/LICENSE create mode 100644 node_modules/hsts/node_modules/depd/Readme.md create mode 100644 node_modules/hsts/node_modules/depd/index.js create mode 100644 node_modules/hsts/node_modules/depd/lib/browser/index.js create mode 100644 node_modules/hsts/node_modules/depd/package.json create mode 100644 node_modules/hsts/package.json create mode 100644 node_modules/http-errors/HISTORY.md create mode 100644 node_modules/http-errors/LICENSE create mode 100644 node_modules/http-errors/README.md create mode 100644 node_modules/http-errors/index.js create mode 100644 node_modules/http-errors/package.json create mode 100644 node_modules/http-signature/.dir-locals.el create mode 100644 node_modules/http-signature/.npmignore create mode 100644 node_modules/http-signature/CHANGES.md create mode 100644 node_modules/http-signature/LICENSE create mode 100644 node_modules/http-signature/README.md create mode 100644 node_modules/http-signature/http_signing.md create mode 100644 node_modules/http-signature/lib/index.js create mode 100644 node_modules/http-signature/lib/parser.js create mode 100644 node_modules/http-signature/lib/signer.js create mode 100644 node_modules/http-signature/lib/utils.js create mode 100644 node_modules/http-signature/lib/verify.js create mode 100644 node_modules/http-signature/package.json create mode 100644 node_modules/iconv-lite/Changelog.md create mode 100644 node_modules/iconv-lite/LICENSE create mode 100644 node_modules/iconv-lite/README.md create mode 100644 node_modules/iconv-lite/encodings/dbcs-codec.js create mode 100644 node_modules/iconv-lite/encodings/dbcs-data.js create mode 100644 node_modules/iconv-lite/encodings/index.js create mode 100644 node_modules/iconv-lite/encodings/internal.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-codec.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-data-generated.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-data.js create mode 100644 node_modules/iconv-lite/encodings/tables/big5-added.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp936.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp949.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp950.json create mode 100644 node_modules/iconv-lite/encodings/tables/eucjp.json create mode 100644 node_modules/iconv-lite/encodings/tables/gb18030-ranges.json create mode 100644 node_modules/iconv-lite/encodings/tables/gbk-added.json create mode 100644 node_modules/iconv-lite/encodings/tables/shiftjis.json create mode 100644 node_modules/iconv-lite/encodings/utf16.js create mode 100644 node_modules/iconv-lite/encodings/utf7.js create mode 100644 node_modules/iconv-lite/lib/bom-handling.js create mode 100644 node_modules/iconv-lite/lib/extend-node.js create mode 100644 node_modules/iconv-lite/lib/index.d.ts create mode 100644 node_modules/iconv-lite/lib/index.js create mode 100644 node_modules/iconv-lite/lib/streams.js create mode 100644 node_modules/iconv-lite/package.json create mode 100644 node_modules/ienoopen/CHANGELOG.md create mode 100644 node_modules/ienoopen/LICENSE create mode 100644 node_modules/ienoopen/README.md create mode 100644 node_modules/ienoopen/dist/index.d.ts create mode 100644 node_modules/ienoopen/dist/index.js create mode 100644 node_modules/ienoopen/package.json create mode 100644 node_modules/ignore-by-default/LICENSE create mode 100644 node_modules/ignore-by-default/README.md create mode 100644 node_modules/ignore-by-default/index.js create mode 100644 node_modules/ignore-by-default/package.json create mode 100644 node_modules/ignore-walk/LICENSE create mode 100644 node_modules/ignore-walk/README.md create mode 100644 node_modules/ignore-walk/index.js create mode 100644 node_modules/ignore-walk/package.json create mode 100644 node_modules/import-lazy/index.js create mode 100644 node_modules/import-lazy/license create mode 100644 node_modules/import-lazy/package.json create mode 100644 node_modules/import-lazy/readme.md create mode 100644 node_modules/imurmurhash/README.md create mode 100644 node_modules/imurmurhash/imurmurhash.js create mode 100644 node_modules/imurmurhash/imurmurhash.min.js create mode 100644 node_modules/imurmurhash/package.json create mode 100644 node_modules/inflight/LICENSE create mode 100644 node_modules/inflight/README.md create mode 100644 node_modules/inflight/inflight.js create mode 100644 node_modules/inflight/package.json create mode 100644 node_modules/inherits/LICENSE create mode 100644 node_modules/inherits/README.md create mode 100644 node_modules/inherits/inherits.js create mode 100644 node_modules/inherits/inherits_browser.js create mode 100644 node_modules/inherits/package.json create mode 100644 node_modules/ini/LICENSE create mode 100644 node_modules/ini/README.md create mode 100644 node_modules/ini/ini.js create mode 100644 node_modules/ini/package.json create mode 100644 node_modules/interpret/CHANGELOG create mode 100644 node_modules/interpret/LICENSE create mode 100644 node_modules/interpret/README.md create mode 100644 node_modules/interpret/index.js create mode 100644 node_modules/interpret/package.json create mode 100644 node_modules/ipaddr.js/LICENSE create mode 100644 node_modules/ipaddr.js/README.md create mode 100644 node_modules/ipaddr.js/ipaddr.min.js create mode 100644 node_modules/ipaddr.js/lib/ipaddr.js create mode 100644 node_modules/ipaddr.js/lib/ipaddr.js.d.ts create mode 100644 node_modules/ipaddr.js/package.json create mode 100644 node_modules/is-absolute/LICENSE create mode 100644 node_modules/is-absolute/README.md create mode 100644 node_modules/is-absolute/index.js create mode 100644 node_modules/is-absolute/package.json create mode 100644 node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/is-accessor-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/is-binary-path/index.d.ts create mode 100644 node_modules/is-binary-path/index.js create mode 100644 node_modules/is-binary-path/license create mode 100644 node_modules/is-binary-path/package.json create mode 100644 node_modules/is-binary-path/readme.md create mode 100644 node_modules/is-buffer/LICENSE create mode 100644 node_modules/is-buffer/README.md create mode 100644 node_modules/is-buffer/index.js create mode 100644 node_modules/is-buffer/package.json create mode 100644 node_modules/is-buffer/test/basic.js create mode 100644 node_modules/is-ci/LICENSE create mode 100644 node_modules/is-ci/README.md create mode 100755 node_modules/is-ci/bin.js create mode 100644 node_modules/is-ci/index.js create mode 100644 node_modules/is-ci/package.json create mode 100644 node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/is-data-descriptor/README.md create mode 100644 node_modules/is-data-descriptor/index.js create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/is-data-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/is-data-descriptor/package.json create mode 100644 node_modules/is-descriptor/LICENSE create mode 100644 node_modules/is-descriptor/README.md create mode 100644 node_modules/is-descriptor/index.js create mode 100644 node_modules/is-descriptor/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-descriptor/node_modules/kind-of/README.md create mode 100644 node_modules/is-descriptor/node_modules/kind-of/index.js create mode 100644 node_modules/is-descriptor/node_modules/kind-of/package.json create mode 100644 node_modules/is-descriptor/package.json create mode 100644 node_modules/is-extendable/LICENSE create mode 100644 node_modules/is-extendable/README.md create mode 100644 node_modules/is-extendable/index.js create mode 100644 node_modules/is-extendable/package.json create mode 100644 node_modules/is-extglob/LICENSE create mode 100644 node_modules/is-extglob/README.md create mode 100644 node_modules/is-extglob/index.js create mode 100644 node_modules/is-extglob/package.json create mode 100644 node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/is-glob/LICENSE create mode 100644 node_modules/is-glob/README.md create mode 100644 node_modules/is-glob/index.js create mode 100644 node_modules/is-glob/package.json create mode 100644 node_modules/is-installed-globally/index.js create mode 100644 node_modules/is-installed-globally/license create mode 100644 node_modules/is-installed-globally/package.json create mode 100644 node_modules/is-installed-globally/readme.md create mode 100644 node_modules/is-npm/index.js create mode 100644 node_modules/is-npm/package.json create mode 100644 node_modules/is-npm/readme.md create mode 100644 node_modules/is-number/LICENSE create mode 100644 node_modules/is-number/README.md create mode 100644 node_modules/is-number/index.js create mode 100644 node_modules/is-number/node_modules/kind-of/LICENSE create mode 100644 node_modules/is-number/node_modules/kind-of/README.md create mode 100644 node_modules/is-number/node_modules/kind-of/index.js create mode 100644 node_modules/is-number/node_modules/kind-of/package.json create mode 100644 node_modules/is-number/package.json create mode 100644 node_modules/is-obj/index.js create mode 100644 node_modules/is-obj/license create mode 100644 node_modules/is-obj/package.json create mode 100644 node_modules/is-obj/readme.md create mode 100644 node_modules/is-path-inside/index.js create mode 100644 node_modules/is-path-inside/license create mode 100644 node_modules/is-path-inside/package.json create mode 100644 node_modules/is-path-inside/readme.md create mode 100644 node_modules/is-plain-object/LICENSE create mode 100644 node_modules/is-plain-object/README.md create mode 100644 node_modules/is-plain-object/index.d.ts create mode 100644 node_modules/is-plain-object/index.js create mode 100644 node_modules/is-plain-object/package.json create mode 100644 node_modules/is-redirect/index.js create mode 100644 node_modules/is-redirect/license create mode 100644 node_modules/is-redirect/package.json create mode 100644 node_modules/is-redirect/readme.md create mode 100644 node_modules/is-relative/LICENSE create mode 100644 node_modules/is-relative/README.md create mode 100644 node_modules/is-relative/index.js create mode 100644 node_modules/is-relative/package.json create mode 100644 node_modules/is-retry-allowed/index.js create mode 100644 node_modules/is-retry-allowed/license create mode 100644 node_modules/is-retry-allowed/package.json create mode 100644 node_modules/is-retry-allowed/readme.md create mode 100644 node_modules/is-stream/index.js create mode 100644 node_modules/is-stream/license create mode 100644 node_modules/is-stream/package.json create mode 100644 node_modules/is-stream/readme.md create mode 100644 node_modules/is-typedarray/LICENSE.md create mode 100644 node_modules/is-typedarray/README.md create mode 100644 node_modules/is-typedarray/index.js create mode 100644 node_modules/is-typedarray/package.json create mode 100644 node_modules/is-typedarray/test.js create mode 100644 node_modules/is-unc-path/LICENSE create mode 100644 node_modules/is-unc-path/README.md create mode 100644 node_modules/is-unc-path/index.js create mode 100644 node_modules/is-unc-path/package.json create mode 100644 node_modules/is-windows/LICENSE create mode 100644 node_modules/is-windows/README.md create mode 100644 node_modules/is-windows/index.js create mode 100644 node_modules/is-windows/package.json create mode 100644 node_modules/isarray/.npmignore create mode 100644 node_modules/isarray/.travis.yml create mode 100644 node_modules/isarray/Makefile create mode 100644 node_modules/isarray/README.md create mode 100644 node_modules/isarray/component.json create mode 100644 node_modules/isarray/index.js create mode 100644 node_modules/isarray/package.json create mode 100644 node_modules/isarray/test.js create mode 100644 node_modules/isexe/.npmignore create mode 100644 node_modules/isexe/LICENSE create mode 100644 node_modules/isexe/README.md create mode 100644 node_modules/isexe/index.js create mode 100644 node_modules/isexe/mode.js create mode 100644 node_modules/isexe/package.json create mode 100644 node_modules/isexe/test/basic.js create mode 100644 node_modules/isexe/windows.js create mode 100644 node_modules/isobject/LICENSE create mode 100644 node_modules/isobject/README.md create mode 100644 node_modules/isobject/index.d.ts create mode 100644 node_modules/isobject/index.js create mode 100644 node_modules/isobject/package.json create mode 100644 node_modules/isstream/.jshintrc create mode 100644 node_modules/isstream/.npmignore create mode 100644 node_modules/isstream/.travis.yml create mode 100644 node_modules/isstream/LICENSE.md create mode 100644 node_modules/isstream/README.md create mode 100644 node_modules/isstream/isstream.js create mode 100644 node_modules/isstream/package.json create mode 100644 node_modules/isstream/test.js create mode 100644 node_modules/jsbn/.npmignore create mode 100644 node_modules/jsbn/LICENSE create mode 100644 node_modules/jsbn/README.md create mode 100644 node_modules/jsbn/example.html create mode 100644 node_modules/jsbn/example.js create mode 100644 node_modules/jsbn/index.js create mode 100644 node_modules/jsbn/package.json create mode 100644 node_modules/json-schema-traverse/.eslintrc.yml create mode 100644 node_modules/json-schema-traverse/.travis.yml create mode 100644 node_modules/json-schema-traverse/LICENSE create mode 100644 node_modules/json-schema-traverse/README.md create mode 100644 node_modules/json-schema-traverse/index.js create mode 100644 node_modules/json-schema-traverse/package.json create mode 100644 node_modules/json-schema-traverse/spec/.eslintrc.yml create mode 100644 node_modules/json-schema-traverse/spec/fixtures/schema.js create mode 100644 node_modules/json-schema-traverse/spec/index.spec.js create mode 100644 node_modules/json-schema/README.md create mode 100644 node_modules/json-schema/draft-00/hyper-schema create mode 100644 node_modules/json-schema/draft-00/json-ref create mode 100644 node_modules/json-schema/draft-00/links create mode 100644 node_modules/json-schema/draft-00/schema create mode 100644 node_modules/json-schema/draft-01/hyper-schema create mode 100644 node_modules/json-schema/draft-01/json-ref create mode 100644 node_modules/json-schema/draft-01/links create mode 100644 node_modules/json-schema/draft-01/schema create mode 100644 node_modules/json-schema/draft-02/hyper-schema create mode 100644 node_modules/json-schema/draft-02/json-ref create mode 100644 node_modules/json-schema/draft-02/links create mode 100644 node_modules/json-schema/draft-02/schema create mode 100644 node_modules/json-schema/draft-03/examples/address create mode 100644 node_modules/json-schema/draft-03/examples/calendar create mode 100644 node_modules/json-schema/draft-03/examples/card create mode 100644 node_modules/json-schema/draft-03/examples/geo create mode 100644 node_modules/json-schema/draft-03/examples/interfaces create mode 100644 node_modules/json-schema/draft-03/hyper-schema create mode 100644 node_modules/json-schema/draft-03/json-ref create mode 100644 node_modules/json-schema/draft-03/links create mode 100644 node_modules/json-schema/draft-03/schema create mode 100644 node_modules/json-schema/draft-04/hyper-schema create mode 100644 node_modules/json-schema/draft-04/links create mode 100644 node_modules/json-schema/draft-04/schema create mode 100644 node_modules/json-schema/draft-zyp-json-schema-03.xml create mode 100644 node_modules/json-schema/draft-zyp-json-schema-04.xml create mode 100644 node_modules/json-schema/lib/links.js create mode 100644 node_modules/json-schema/lib/validate.js create mode 100644 node_modules/json-schema/package.json create mode 100644 node_modules/json-schema/test/tests.js create mode 100644 node_modules/json-stringify-safe/.npmignore create mode 100644 node_modules/json-stringify-safe/CHANGELOG.md create mode 100644 node_modules/json-stringify-safe/LICENSE create mode 100644 node_modules/json-stringify-safe/Makefile create mode 100644 node_modules/json-stringify-safe/README.md create mode 100644 node_modules/json-stringify-safe/package.json create mode 100644 node_modules/json-stringify-safe/stringify.js create mode 100644 node_modules/json-stringify-safe/test/mocha.opts create mode 100644 node_modules/json-stringify-safe/test/stringify_test.js create mode 100644 node_modules/jsprim/CHANGES.md create mode 100644 node_modules/jsprim/CONTRIBUTING.md create mode 100644 node_modules/jsprim/LICENSE create mode 100644 node_modules/jsprim/README.md create mode 100644 node_modules/jsprim/lib/jsprim.js create mode 100644 node_modules/jsprim/package.json create mode 100644 node_modules/kind-of/CHANGELOG.md create mode 100644 node_modules/kind-of/LICENSE create mode 100644 node_modules/kind-of/README.md create mode 100644 node_modules/kind-of/index.js create mode 100644 node_modules/kind-of/package.json create mode 100644 node_modules/knex/CHANGELOG.md create mode 100644 node_modules/knex/CONTRIBUTING.md create mode 100644 node_modules/knex/LICENSE create mode 100644 node_modules/knex/README.md create mode 100755 node_modules/knex/bin/cli.js create mode 100644 node_modules/knex/bin/utils/cli-config-utils.js create mode 100644 node_modules/knex/bin/utils/constants.js create mode 100644 node_modules/knex/bin/utils/migrationsLister.js create mode 100644 node_modules/knex/knex.js create mode 100644 node_modules/knex/lib/client.js create mode 100644 node_modules/knex/lib/constants.js create mode 100644 node_modules/knex/lib/dialects/mssql/index.js create mode 100644 node_modules/knex/lib/dialects/mssql/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/mssql/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/mssql/schema/compiler.js create mode 100644 node_modules/knex/lib/dialects/mssql/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/dialects/mssql/transaction.js create mode 100644 node_modules/knex/lib/dialects/mysql/index.js create mode 100644 node_modules/knex/lib/dialects/mysql/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/mysql/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/mysql/schema/compiler.js create mode 100644 node_modules/knex/lib/dialects/mysql/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/dialects/mysql/transaction.js create mode 100644 node_modules/knex/lib/dialects/mysql2/index.js create mode 100644 node_modules/knex/lib/dialects/mysql2/transaction.js create mode 100644 node_modules/knex/lib/dialects/oracle/formatter.js create mode 100644 node_modules/knex/lib/dialects/oracle/index.js create mode 100644 node_modules/knex/lib/dialects/oracle/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/oracle/schema/columnbuilder.js create mode 100644 node_modules/knex/lib/dialects/oracle/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/oracle/schema/compiler.js create mode 100644 node_modules/knex/lib/dialects/oracle/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/dialects/oracle/schema/trigger.js create mode 100644 node_modules/knex/lib/dialects/oracle/transaction.js create mode 100644 node_modules/knex/lib/dialects/oracle/utils.js create mode 100644 node_modules/knex/lib/dialects/oracledb/index.js create mode 100644 node_modules/knex/lib/dialects/oracledb/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/oracledb/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/oracledb/transaction.js create mode 100644 node_modules/knex/lib/dialects/oracledb/utils.js create mode 100644 node_modules/knex/lib/dialects/postgres/index.js create mode 100644 node_modules/knex/lib/dialects/postgres/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/postgres/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/postgres/schema/compiler.js create mode 100644 node_modules/knex/lib/dialects/postgres/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/dialects/redshift/index.js create mode 100644 node_modules/knex/lib/dialects/redshift/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/redshift/schema/columnbuilder.js create mode 100644 node_modules/knex/lib/dialects/redshift/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/redshift/schema/compiler.js create mode 100644 node_modules/knex/lib/dialects/redshift/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/dialects/redshift/transaction.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/formatter.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/index.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/query/compiler.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/schema/columncompiler.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/schema/compiler.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/schema/ddl.js create mode 100644 node_modules/knex/lib/dialects/sqlite3/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/formatter.js create mode 100644 node_modules/knex/lib/functionhelper.js create mode 100644 node_modules/knex/lib/helpers.js create mode 100644 node_modules/knex/lib/index.js create mode 100644 node_modules/knex/lib/interface.js create mode 100644 node_modules/knex/lib/knex.js create mode 100644 node_modules/knex/lib/logger.js create mode 100644 node_modules/knex/lib/migrate/MigrationGenerator.js create mode 100644 node_modules/knex/lib/migrate/Migrator.js create mode 100644 node_modules/knex/lib/migrate/configuration-merger.js create mode 100644 node_modules/knex/lib/migrate/migrate-stub.js create mode 100644 node_modules/knex/lib/migrate/migration-list-resolver.js create mode 100644 node_modules/knex/lib/migrate/sources/fs-migrations.js create mode 100644 node_modules/knex/lib/migrate/stub/coffee.stub create mode 100644 node_modules/knex/lib/migrate/stub/eg.stub create mode 100644 node_modules/knex/lib/migrate/stub/js.stub create mode 100644 node_modules/knex/lib/migrate/stub/knexfile-coffee.stub create mode 100644 node_modules/knex/lib/migrate/stub/knexfile-eg.stub create mode 100644 node_modules/knex/lib/migrate/stub/knexfile-js.stub create mode 100644 node_modules/knex/lib/migrate/stub/knexfile-ls.stub create mode 100644 node_modules/knex/lib/migrate/stub/knexfile-ts.stub create mode 100644 node_modules/knex/lib/migrate/stub/ls.stub create mode 100644 node_modules/knex/lib/migrate/stub/ts.stub create mode 100644 node_modules/knex/lib/migrate/table-creator.js create mode 100644 node_modules/knex/lib/migrate/table-resolver.js create mode 100644 node_modules/knex/lib/query/builder.js create mode 100644 node_modules/knex/lib/query/compiler.js create mode 100644 node_modules/knex/lib/query/constants.js create mode 100644 node_modules/knex/lib/query/joinclause.js create mode 100644 node_modules/knex/lib/query/methods.js create mode 100644 node_modules/knex/lib/query/string.js create mode 100644 node_modules/knex/lib/raw.js create mode 100644 node_modules/knex/lib/ref.js create mode 100644 node_modules/knex/lib/runner.js create mode 100644 node_modules/knex/lib/schema/builder.js create mode 100644 node_modules/knex/lib/schema/columnbuilder.js create mode 100644 node_modules/knex/lib/schema/columncompiler.js create mode 100644 node_modules/knex/lib/schema/compiler.js create mode 100644 node_modules/knex/lib/schema/helpers.js create mode 100644 node_modules/knex/lib/schema/tablebuilder.js create mode 100644 node_modules/knex/lib/schema/tablecompiler.js create mode 100644 node_modules/knex/lib/seed/Seeder.js create mode 100644 node_modules/knex/lib/seed/seed-stub.js create mode 100644 node_modules/knex/lib/seed/stub/coffee.stub create mode 100644 node_modules/knex/lib/seed/stub/eg.stub create mode 100644 node_modules/knex/lib/seed/stub/js.stub create mode 100644 node_modules/knex/lib/seed/stub/ls.stub create mode 100644 node_modules/knex/lib/seed/stub/ts.stub create mode 100644 node_modules/knex/lib/transaction.js create mode 100644 node_modules/knex/lib/util/batchInsert.js create mode 100644 node_modules/knex/lib/util/delay.js create mode 100644 node_modules/knex/lib/util/fake-client.js create mode 100644 node_modules/knex/lib/util/make-knex.js create mode 100644 node_modules/knex/lib/util/noop.js create mode 100644 node_modules/knex/lib/util/parse-connection.js create mode 100644 node_modules/knex/lib/util/save-async-stack.js create mode 100644 node_modules/knex/lib/util/template.js create mode 100644 node_modules/knex/node_modules/debug/CHANGELOG.md create mode 100644 node_modules/knex/node_modules/debug/LICENSE create mode 100644 node_modules/knex/node_modules/debug/README.md create mode 100644 node_modules/knex/node_modules/debug/dist/debug.js create mode 100644 node_modules/knex/node_modules/debug/package.json create mode 100644 node_modules/knex/node_modules/debug/src/browser.js create mode 100644 node_modules/knex/node_modules/debug/src/common.js create mode 100644 node_modules/knex/node_modules/debug/src/index.js create mode 100644 node_modules/knex/node_modules/debug/src/node.js create mode 100644 node_modules/knex/node_modules/inherits/LICENSE create mode 100644 node_modules/knex/node_modules/inherits/README.md create mode 100644 node_modules/knex/node_modules/inherits/inherits.js create mode 100644 node_modules/knex/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/knex/node_modules/inherits/package.json create mode 100644 node_modules/knex/node_modules/ms/index.js create mode 100644 node_modules/knex/node_modules/ms/license.md create mode 100644 node_modules/knex/node_modules/ms/package.json create mode 100644 node_modules/knex/node_modules/ms/readme.md create mode 100644 node_modules/knex/package.json create mode 100644 node_modules/knex/scripts/build.js create mode 100644 node_modules/knex/scripts/docker-compose.yml create mode 100644 node_modules/knex/scripts/next-release-howto.md create mode 100644 node_modules/knex/scripts/release.sh create mode 100644 node_modules/knex/scripts/runkit-example.js create mode 100644 node_modules/knex/scripts/stress-test/README.txt create mode 100644 node_modules/knex/scripts/stress-test/docker-compose.yml create mode 100644 node_modules/knex/scripts/stress-test/knex-stress-test.js create mode 100644 node_modules/knex/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js create mode 100644 node_modules/knex/scripts/stress-test/mysql2-sudden-exit-without-error.js create mode 100644 node_modules/knex/scripts/stress-test/reconnect-test-mysql-based-drivers.js create mode 100644 node_modules/knex/types/index.d.ts create mode 100644 node_modules/knex/types/result.d.ts create mode 100644 node_modules/latest-version/index.js create mode 100644 node_modules/latest-version/license create mode 100644 node_modules/latest-version/package.json create mode 100644 node_modules/latest-version/readme.md create mode 100644 node_modules/liftoff/CHANGELOG create mode 100644 node_modules/liftoff/LICENSE create mode 100644 node_modules/liftoff/README.md create mode 100644 node_modules/liftoff/index.js create mode 100644 node_modules/liftoff/lib/build_config_name.js create mode 100644 node_modules/liftoff/lib/file_search.js create mode 100644 node_modules/liftoff/lib/find_config.js create mode 100644 node_modules/liftoff/lib/find_cwd.js create mode 100644 node_modules/liftoff/lib/get_node_flags.js create mode 100644 node_modules/liftoff/lib/parse_options.js create mode 100644 node_modules/liftoff/lib/register_loader.js create mode 100644 node_modules/liftoff/lib/silent_require.js create mode 100644 node_modules/liftoff/package.json create mode 100644 node_modules/lodash/LICENSE create mode 100644 node_modules/lodash/README.md create mode 100644 node_modules/lodash/_DataView.js create mode 100644 node_modules/lodash/_Hash.js create mode 100644 node_modules/lodash/_LazyWrapper.js create mode 100644 node_modules/lodash/_ListCache.js create mode 100644 node_modules/lodash/_LodashWrapper.js create mode 100644 node_modules/lodash/_Map.js create mode 100644 node_modules/lodash/_MapCache.js create mode 100644 node_modules/lodash/_Promise.js create mode 100644 node_modules/lodash/_Set.js create mode 100644 node_modules/lodash/_SetCache.js create mode 100644 node_modules/lodash/_Stack.js create mode 100644 node_modules/lodash/_Symbol.js create mode 100644 node_modules/lodash/_Uint8Array.js create mode 100644 node_modules/lodash/_WeakMap.js create mode 100644 node_modules/lodash/_apply.js create mode 100644 node_modules/lodash/_arrayAggregator.js create mode 100644 node_modules/lodash/_arrayEach.js create mode 100644 node_modules/lodash/_arrayEachRight.js create mode 100644 node_modules/lodash/_arrayEvery.js create mode 100644 node_modules/lodash/_arrayFilter.js create mode 100644 node_modules/lodash/_arrayIncludes.js create mode 100644 node_modules/lodash/_arrayIncludesWith.js create mode 100644 node_modules/lodash/_arrayLikeKeys.js create mode 100644 node_modules/lodash/_arrayMap.js create mode 100644 node_modules/lodash/_arrayPush.js create mode 100644 node_modules/lodash/_arrayReduce.js create mode 100644 node_modules/lodash/_arrayReduceRight.js create mode 100644 node_modules/lodash/_arraySample.js create mode 100644 node_modules/lodash/_arraySampleSize.js create mode 100644 node_modules/lodash/_arrayShuffle.js create mode 100644 node_modules/lodash/_arraySome.js create mode 100644 node_modules/lodash/_asciiSize.js create mode 100644 node_modules/lodash/_asciiToArray.js create mode 100644 node_modules/lodash/_asciiWords.js create mode 100644 node_modules/lodash/_assignMergeValue.js create mode 100644 node_modules/lodash/_assignValue.js create mode 100644 node_modules/lodash/_assocIndexOf.js create mode 100644 node_modules/lodash/_baseAggregator.js create mode 100644 node_modules/lodash/_baseAssign.js create mode 100644 node_modules/lodash/_baseAssignIn.js create mode 100644 node_modules/lodash/_baseAssignValue.js create mode 100644 node_modules/lodash/_baseAt.js create mode 100644 node_modules/lodash/_baseClamp.js create mode 100644 node_modules/lodash/_baseClone.js create mode 100644 node_modules/lodash/_baseConforms.js create mode 100644 node_modules/lodash/_baseConformsTo.js create mode 100644 node_modules/lodash/_baseCreate.js create mode 100644 node_modules/lodash/_baseDelay.js create mode 100644 node_modules/lodash/_baseDifference.js create mode 100644 node_modules/lodash/_baseEach.js create mode 100644 node_modules/lodash/_baseEachRight.js create mode 100644 node_modules/lodash/_baseEvery.js create mode 100644 node_modules/lodash/_baseExtremum.js create mode 100644 node_modules/lodash/_baseFill.js create mode 100644 node_modules/lodash/_baseFilter.js create mode 100644 node_modules/lodash/_baseFindIndex.js create mode 100644 node_modules/lodash/_baseFindKey.js create mode 100644 node_modules/lodash/_baseFlatten.js create mode 100644 node_modules/lodash/_baseFor.js create mode 100644 node_modules/lodash/_baseForOwn.js create mode 100644 node_modules/lodash/_baseForOwnRight.js create mode 100644 node_modules/lodash/_baseForRight.js create mode 100644 node_modules/lodash/_baseFunctions.js create mode 100644 node_modules/lodash/_baseGet.js create mode 100644 node_modules/lodash/_baseGetAllKeys.js create mode 100644 node_modules/lodash/_baseGetTag.js create mode 100644 node_modules/lodash/_baseGt.js create mode 100644 node_modules/lodash/_baseHas.js create mode 100644 node_modules/lodash/_baseHasIn.js create mode 100644 node_modules/lodash/_baseInRange.js create mode 100644 node_modules/lodash/_baseIndexOf.js create mode 100644 node_modules/lodash/_baseIndexOfWith.js create mode 100644 node_modules/lodash/_baseIntersection.js create mode 100644 node_modules/lodash/_baseInverter.js create mode 100644 node_modules/lodash/_baseInvoke.js create mode 100644 node_modules/lodash/_baseIsArguments.js create mode 100644 node_modules/lodash/_baseIsArrayBuffer.js create mode 100644 node_modules/lodash/_baseIsDate.js create mode 100644 node_modules/lodash/_baseIsEqual.js create mode 100644 node_modules/lodash/_baseIsEqualDeep.js create mode 100644 node_modules/lodash/_baseIsMap.js create mode 100644 node_modules/lodash/_baseIsMatch.js create mode 100644 node_modules/lodash/_baseIsNaN.js create mode 100644 node_modules/lodash/_baseIsNative.js create mode 100644 node_modules/lodash/_baseIsRegExp.js create mode 100644 node_modules/lodash/_baseIsSet.js create mode 100644 node_modules/lodash/_baseIsTypedArray.js create mode 100644 node_modules/lodash/_baseIteratee.js create mode 100644 node_modules/lodash/_baseKeys.js create mode 100644 node_modules/lodash/_baseKeysIn.js create mode 100644 node_modules/lodash/_baseLodash.js create mode 100644 node_modules/lodash/_baseLt.js create mode 100644 node_modules/lodash/_baseMap.js create mode 100644 node_modules/lodash/_baseMatches.js create mode 100644 node_modules/lodash/_baseMatchesProperty.js create mode 100644 node_modules/lodash/_baseMean.js create mode 100644 node_modules/lodash/_baseMerge.js create mode 100644 node_modules/lodash/_baseMergeDeep.js create mode 100644 node_modules/lodash/_baseNth.js create mode 100644 node_modules/lodash/_baseOrderBy.js create mode 100644 node_modules/lodash/_basePick.js create mode 100644 node_modules/lodash/_basePickBy.js create mode 100644 node_modules/lodash/_baseProperty.js create mode 100644 node_modules/lodash/_basePropertyDeep.js create mode 100644 node_modules/lodash/_basePropertyOf.js create mode 100644 node_modules/lodash/_basePullAll.js create mode 100644 node_modules/lodash/_basePullAt.js create mode 100644 node_modules/lodash/_baseRandom.js create mode 100644 node_modules/lodash/_baseRange.js create mode 100644 node_modules/lodash/_baseReduce.js create mode 100644 node_modules/lodash/_baseRepeat.js create mode 100644 node_modules/lodash/_baseRest.js create mode 100644 node_modules/lodash/_baseSample.js create mode 100644 node_modules/lodash/_baseSampleSize.js create mode 100644 node_modules/lodash/_baseSet.js create mode 100644 node_modules/lodash/_baseSetData.js create mode 100644 node_modules/lodash/_baseSetToString.js create mode 100644 node_modules/lodash/_baseShuffle.js create mode 100644 node_modules/lodash/_baseSlice.js create mode 100644 node_modules/lodash/_baseSome.js create mode 100644 node_modules/lodash/_baseSortBy.js create mode 100644 node_modules/lodash/_baseSortedIndex.js create mode 100644 node_modules/lodash/_baseSortedIndexBy.js create mode 100644 node_modules/lodash/_baseSortedUniq.js create mode 100644 node_modules/lodash/_baseSum.js create mode 100644 node_modules/lodash/_baseTimes.js create mode 100644 node_modules/lodash/_baseToNumber.js create mode 100644 node_modules/lodash/_baseToPairs.js create mode 100644 node_modules/lodash/_baseToString.js create mode 100644 node_modules/lodash/_baseUnary.js create mode 100644 node_modules/lodash/_baseUniq.js create mode 100644 node_modules/lodash/_baseUnset.js create mode 100644 node_modules/lodash/_baseUpdate.js create mode 100644 node_modules/lodash/_baseValues.js create mode 100644 node_modules/lodash/_baseWhile.js create mode 100644 node_modules/lodash/_baseWrapperValue.js create mode 100644 node_modules/lodash/_baseXor.js create mode 100644 node_modules/lodash/_baseZipObject.js create mode 100644 node_modules/lodash/_cacheHas.js create mode 100644 node_modules/lodash/_castArrayLikeObject.js create mode 100644 node_modules/lodash/_castFunction.js create mode 100644 node_modules/lodash/_castPath.js create mode 100644 node_modules/lodash/_castRest.js create mode 100644 node_modules/lodash/_castSlice.js create mode 100644 node_modules/lodash/_charsEndIndex.js create mode 100644 node_modules/lodash/_charsStartIndex.js create mode 100644 node_modules/lodash/_cloneArrayBuffer.js create mode 100644 node_modules/lodash/_cloneBuffer.js create mode 100644 node_modules/lodash/_cloneDataView.js create mode 100644 node_modules/lodash/_cloneRegExp.js create mode 100644 node_modules/lodash/_cloneSymbol.js create mode 100644 node_modules/lodash/_cloneTypedArray.js create mode 100644 node_modules/lodash/_compareAscending.js create mode 100644 node_modules/lodash/_compareMultiple.js create mode 100644 node_modules/lodash/_composeArgs.js create mode 100644 node_modules/lodash/_composeArgsRight.js create mode 100644 node_modules/lodash/_copyArray.js create mode 100644 node_modules/lodash/_copyObject.js create mode 100644 node_modules/lodash/_copySymbols.js create mode 100644 node_modules/lodash/_copySymbolsIn.js create mode 100644 node_modules/lodash/_coreJsData.js create mode 100644 node_modules/lodash/_countHolders.js create mode 100644 node_modules/lodash/_createAggregator.js create mode 100644 node_modules/lodash/_createAssigner.js create mode 100644 node_modules/lodash/_createBaseEach.js create mode 100644 node_modules/lodash/_createBaseFor.js create mode 100644 node_modules/lodash/_createBind.js create mode 100644 node_modules/lodash/_createCaseFirst.js create mode 100644 node_modules/lodash/_createCompounder.js create mode 100644 node_modules/lodash/_createCtor.js create mode 100644 node_modules/lodash/_createCurry.js create mode 100644 node_modules/lodash/_createFind.js create mode 100644 node_modules/lodash/_createFlow.js create mode 100644 node_modules/lodash/_createHybrid.js create mode 100644 node_modules/lodash/_createInverter.js create mode 100644 node_modules/lodash/_createMathOperation.js create mode 100644 node_modules/lodash/_createOver.js create mode 100644 node_modules/lodash/_createPadding.js create mode 100644 node_modules/lodash/_createPartial.js create mode 100644 node_modules/lodash/_createRange.js create mode 100644 node_modules/lodash/_createRecurry.js create mode 100644 node_modules/lodash/_createRelationalOperation.js create mode 100644 node_modules/lodash/_createRound.js create mode 100644 node_modules/lodash/_createSet.js create mode 100644 node_modules/lodash/_createToPairs.js create mode 100644 node_modules/lodash/_createWrap.js create mode 100644 node_modules/lodash/_customDefaultsAssignIn.js create mode 100644 node_modules/lodash/_customDefaultsMerge.js create mode 100644 node_modules/lodash/_customOmitClone.js create mode 100644 node_modules/lodash/_deburrLetter.js create mode 100644 node_modules/lodash/_defineProperty.js create mode 100644 node_modules/lodash/_equalArrays.js create mode 100644 node_modules/lodash/_equalByTag.js create mode 100644 node_modules/lodash/_equalObjects.js create mode 100644 node_modules/lodash/_escapeHtmlChar.js create mode 100644 node_modules/lodash/_escapeStringChar.js create mode 100644 node_modules/lodash/_flatRest.js create mode 100644 node_modules/lodash/_freeGlobal.js create mode 100644 node_modules/lodash/_getAllKeys.js create mode 100644 node_modules/lodash/_getAllKeysIn.js create mode 100644 node_modules/lodash/_getData.js create mode 100644 node_modules/lodash/_getFuncName.js create mode 100644 node_modules/lodash/_getHolder.js create mode 100644 node_modules/lodash/_getMapData.js create mode 100644 node_modules/lodash/_getMatchData.js create mode 100644 node_modules/lodash/_getNative.js create mode 100644 node_modules/lodash/_getPrototype.js create mode 100644 node_modules/lodash/_getRawTag.js create mode 100644 node_modules/lodash/_getSymbols.js create mode 100644 node_modules/lodash/_getSymbolsIn.js create mode 100644 node_modules/lodash/_getTag.js create mode 100644 node_modules/lodash/_getValue.js create mode 100644 node_modules/lodash/_getView.js create mode 100644 node_modules/lodash/_getWrapDetails.js create mode 100644 node_modules/lodash/_hasPath.js create mode 100644 node_modules/lodash/_hasUnicode.js create mode 100644 node_modules/lodash/_hasUnicodeWord.js create mode 100644 node_modules/lodash/_hashClear.js create mode 100644 node_modules/lodash/_hashDelete.js create mode 100644 node_modules/lodash/_hashGet.js create mode 100644 node_modules/lodash/_hashHas.js create mode 100644 node_modules/lodash/_hashSet.js create mode 100644 node_modules/lodash/_initCloneArray.js create mode 100644 node_modules/lodash/_initCloneByTag.js create mode 100644 node_modules/lodash/_initCloneObject.js create mode 100644 node_modules/lodash/_insertWrapDetails.js create mode 100644 node_modules/lodash/_isFlattenable.js create mode 100644 node_modules/lodash/_isIndex.js create mode 100644 node_modules/lodash/_isIterateeCall.js create mode 100644 node_modules/lodash/_isKey.js create mode 100644 node_modules/lodash/_isKeyable.js create mode 100644 node_modules/lodash/_isLaziable.js create mode 100644 node_modules/lodash/_isMaskable.js create mode 100644 node_modules/lodash/_isMasked.js create mode 100644 node_modules/lodash/_isPrototype.js create mode 100644 node_modules/lodash/_isStrictComparable.js create mode 100644 node_modules/lodash/_iteratorToArray.js create mode 100644 node_modules/lodash/_lazyClone.js create mode 100644 node_modules/lodash/_lazyReverse.js create mode 100644 node_modules/lodash/_lazyValue.js create mode 100644 node_modules/lodash/_listCacheClear.js create mode 100644 node_modules/lodash/_listCacheDelete.js create mode 100644 node_modules/lodash/_listCacheGet.js create mode 100644 node_modules/lodash/_listCacheHas.js create mode 100644 node_modules/lodash/_listCacheSet.js create mode 100644 node_modules/lodash/_mapCacheClear.js create mode 100644 node_modules/lodash/_mapCacheDelete.js create mode 100644 node_modules/lodash/_mapCacheGet.js create mode 100644 node_modules/lodash/_mapCacheHas.js create mode 100644 node_modules/lodash/_mapCacheSet.js create mode 100644 node_modules/lodash/_mapToArray.js create mode 100644 node_modules/lodash/_matchesStrictComparable.js create mode 100644 node_modules/lodash/_memoizeCapped.js create mode 100644 node_modules/lodash/_mergeData.js create mode 100644 node_modules/lodash/_metaMap.js create mode 100644 node_modules/lodash/_nativeCreate.js create mode 100644 node_modules/lodash/_nativeKeys.js create mode 100644 node_modules/lodash/_nativeKeysIn.js create mode 100644 node_modules/lodash/_nodeUtil.js create mode 100644 node_modules/lodash/_objectToString.js create mode 100644 node_modules/lodash/_overArg.js create mode 100644 node_modules/lodash/_overRest.js create mode 100644 node_modules/lodash/_parent.js create mode 100644 node_modules/lodash/_reEscape.js create mode 100644 node_modules/lodash/_reEvaluate.js create mode 100644 node_modules/lodash/_reInterpolate.js create mode 100644 node_modules/lodash/_realNames.js create mode 100644 node_modules/lodash/_reorder.js create mode 100644 node_modules/lodash/_replaceHolders.js create mode 100644 node_modules/lodash/_root.js create mode 100644 node_modules/lodash/_safeGet.js create mode 100644 node_modules/lodash/_setCacheAdd.js create mode 100644 node_modules/lodash/_setCacheHas.js create mode 100644 node_modules/lodash/_setData.js create mode 100644 node_modules/lodash/_setToArray.js create mode 100644 node_modules/lodash/_setToPairs.js create mode 100644 node_modules/lodash/_setToString.js create mode 100644 node_modules/lodash/_setWrapToString.js create mode 100644 node_modules/lodash/_shortOut.js create mode 100644 node_modules/lodash/_shuffleSelf.js create mode 100644 node_modules/lodash/_stackClear.js create mode 100644 node_modules/lodash/_stackDelete.js create mode 100644 node_modules/lodash/_stackGet.js create mode 100644 node_modules/lodash/_stackHas.js create mode 100644 node_modules/lodash/_stackSet.js create mode 100644 node_modules/lodash/_strictIndexOf.js create mode 100644 node_modules/lodash/_strictLastIndexOf.js create mode 100644 node_modules/lodash/_stringSize.js create mode 100644 node_modules/lodash/_stringToArray.js create mode 100644 node_modules/lodash/_stringToPath.js create mode 100644 node_modules/lodash/_toKey.js create mode 100644 node_modules/lodash/_toSource.js create mode 100644 node_modules/lodash/_unescapeHtmlChar.js create mode 100644 node_modules/lodash/_unicodeSize.js create mode 100644 node_modules/lodash/_unicodeToArray.js create mode 100644 node_modules/lodash/_unicodeWords.js create mode 100644 node_modules/lodash/_updateWrapDetails.js create mode 100644 node_modules/lodash/_wrapperClone.js create mode 100644 node_modules/lodash/add.js create mode 100644 node_modules/lodash/after.js create mode 100644 node_modules/lodash/array.js create mode 100644 node_modules/lodash/ary.js create mode 100644 node_modules/lodash/assign.js create mode 100644 node_modules/lodash/assignIn.js create mode 100644 node_modules/lodash/assignInWith.js create mode 100644 node_modules/lodash/assignWith.js create mode 100644 node_modules/lodash/at.js create mode 100644 node_modules/lodash/attempt.js create mode 100644 node_modules/lodash/before.js create mode 100644 node_modules/lodash/bind.js create mode 100644 node_modules/lodash/bindAll.js create mode 100644 node_modules/lodash/bindKey.js create mode 100644 node_modules/lodash/camelCase.js create mode 100644 node_modules/lodash/capitalize.js create mode 100644 node_modules/lodash/castArray.js create mode 100644 node_modules/lodash/ceil.js create mode 100644 node_modules/lodash/chain.js create mode 100644 node_modules/lodash/chunk.js create mode 100644 node_modules/lodash/clamp.js create mode 100644 node_modules/lodash/clone.js create mode 100644 node_modules/lodash/cloneDeep.js create mode 100644 node_modules/lodash/cloneDeepWith.js create mode 100644 node_modules/lodash/cloneWith.js create mode 100644 node_modules/lodash/collection.js create mode 100644 node_modules/lodash/commit.js create mode 100644 node_modules/lodash/compact.js create mode 100644 node_modules/lodash/concat.js create mode 100644 node_modules/lodash/cond.js create mode 100644 node_modules/lodash/conforms.js create mode 100644 node_modules/lodash/conformsTo.js create mode 100644 node_modules/lodash/constant.js create mode 100644 node_modules/lodash/core.js create mode 100644 node_modules/lodash/core.min.js create mode 100644 node_modules/lodash/countBy.js create mode 100644 node_modules/lodash/create.js create mode 100644 node_modules/lodash/curry.js create mode 100644 node_modules/lodash/curryRight.js create mode 100644 node_modules/lodash/date.js create mode 100644 node_modules/lodash/debounce.js create mode 100644 node_modules/lodash/deburr.js create mode 100644 node_modules/lodash/defaultTo.js create mode 100644 node_modules/lodash/defaults.js create mode 100644 node_modules/lodash/defaultsDeep.js create mode 100644 node_modules/lodash/defer.js create mode 100644 node_modules/lodash/delay.js create mode 100644 node_modules/lodash/difference.js create mode 100644 node_modules/lodash/differenceBy.js create mode 100644 node_modules/lodash/differenceWith.js create mode 100644 node_modules/lodash/divide.js create mode 100644 node_modules/lodash/drop.js create mode 100644 node_modules/lodash/dropRight.js create mode 100644 node_modules/lodash/dropRightWhile.js create mode 100644 node_modules/lodash/dropWhile.js create mode 100644 node_modules/lodash/each.js create mode 100644 node_modules/lodash/eachRight.js create mode 100644 node_modules/lodash/endsWith.js create mode 100644 node_modules/lodash/entries.js create mode 100644 node_modules/lodash/entriesIn.js create mode 100644 node_modules/lodash/eq.js create mode 100644 node_modules/lodash/escape.js create mode 100644 node_modules/lodash/escapeRegExp.js create mode 100644 node_modules/lodash/every.js create mode 100644 node_modules/lodash/extend.js create mode 100644 node_modules/lodash/extendWith.js create mode 100644 node_modules/lodash/fill.js create mode 100644 node_modules/lodash/filter.js create mode 100644 node_modules/lodash/find.js create mode 100644 node_modules/lodash/findIndex.js create mode 100644 node_modules/lodash/findKey.js create mode 100644 node_modules/lodash/findLast.js create mode 100644 node_modules/lodash/findLastIndex.js create mode 100644 node_modules/lodash/findLastKey.js create mode 100644 node_modules/lodash/first.js create mode 100644 node_modules/lodash/flatMap.js create mode 100644 node_modules/lodash/flatMapDeep.js create mode 100644 node_modules/lodash/flatMapDepth.js create mode 100644 node_modules/lodash/flatten.js create mode 100644 node_modules/lodash/flattenDeep.js create mode 100644 node_modules/lodash/flattenDepth.js create mode 100644 node_modules/lodash/flip.js create mode 100644 node_modules/lodash/floor.js create mode 100644 node_modules/lodash/flow.js create mode 100644 node_modules/lodash/flowRight.js create mode 100644 node_modules/lodash/forEach.js create mode 100644 node_modules/lodash/forEachRight.js create mode 100644 node_modules/lodash/forIn.js create mode 100644 node_modules/lodash/forInRight.js create mode 100644 node_modules/lodash/forOwn.js create mode 100644 node_modules/lodash/forOwnRight.js create mode 100644 node_modules/lodash/fp.js create mode 100644 node_modules/lodash/fp/F.js create mode 100644 node_modules/lodash/fp/T.js create mode 100644 node_modules/lodash/fp/__.js create mode 100644 node_modules/lodash/fp/_baseConvert.js create mode 100644 node_modules/lodash/fp/_convertBrowser.js create mode 100644 node_modules/lodash/fp/_falseOptions.js create mode 100644 node_modules/lodash/fp/_mapping.js create mode 100644 node_modules/lodash/fp/_util.js create mode 100644 node_modules/lodash/fp/add.js create mode 100644 node_modules/lodash/fp/after.js create mode 100644 node_modules/lodash/fp/all.js create mode 100644 node_modules/lodash/fp/allPass.js create mode 100644 node_modules/lodash/fp/always.js create mode 100644 node_modules/lodash/fp/any.js create mode 100644 node_modules/lodash/fp/anyPass.js create mode 100644 node_modules/lodash/fp/apply.js create mode 100644 node_modules/lodash/fp/array.js create mode 100644 node_modules/lodash/fp/ary.js create mode 100644 node_modules/lodash/fp/assign.js create mode 100644 node_modules/lodash/fp/assignAll.js create mode 100644 node_modules/lodash/fp/assignAllWith.js create mode 100644 node_modules/lodash/fp/assignIn.js create mode 100644 node_modules/lodash/fp/assignInAll.js create mode 100644 node_modules/lodash/fp/assignInAllWith.js create mode 100644 node_modules/lodash/fp/assignInWith.js create mode 100644 node_modules/lodash/fp/assignWith.js create mode 100644 node_modules/lodash/fp/assoc.js create mode 100644 node_modules/lodash/fp/assocPath.js create mode 100644 node_modules/lodash/fp/at.js create mode 100644 node_modules/lodash/fp/attempt.js create mode 100644 node_modules/lodash/fp/before.js create mode 100644 node_modules/lodash/fp/bind.js create mode 100644 node_modules/lodash/fp/bindAll.js create mode 100644 node_modules/lodash/fp/bindKey.js create mode 100644 node_modules/lodash/fp/camelCase.js create mode 100644 node_modules/lodash/fp/capitalize.js create mode 100644 node_modules/lodash/fp/castArray.js create mode 100644 node_modules/lodash/fp/ceil.js create mode 100644 node_modules/lodash/fp/chain.js create mode 100644 node_modules/lodash/fp/chunk.js create mode 100644 node_modules/lodash/fp/clamp.js create mode 100644 node_modules/lodash/fp/clone.js create mode 100644 node_modules/lodash/fp/cloneDeep.js create mode 100644 node_modules/lodash/fp/cloneDeepWith.js create mode 100644 node_modules/lodash/fp/cloneWith.js create mode 100644 node_modules/lodash/fp/collection.js create mode 100644 node_modules/lodash/fp/commit.js create mode 100644 node_modules/lodash/fp/compact.js create mode 100644 node_modules/lodash/fp/complement.js create mode 100644 node_modules/lodash/fp/compose.js create mode 100644 node_modules/lodash/fp/concat.js create mode 100644 node_modules/lodash/fp/cond.js create mode 100644 node_modules/lodash/fp/conforms.js create mode 100644 node_modules/lodash/fp/conformsTo.js create mode 100644 node_modules/lodash/fp/constant.js create mode 100644 node_modules/lodash/fp/contains.js create mode 100644 node_modules/lodash/fp/convert.js create mode 100644 node_modules/lodash/fp/countBy.js create mode 100644 node_modules/lodash/fp/create.js create mode 100644 node_modules/lodash/fp/curry.js create mode 100644 node_modules/lodash/fp/curryN.js create mode 100644 node_modules/lodash/fp/curryRight.js create mode 100644 node_modules/lodash/fp/curryRightN.js create mode 100644 node_modules/lodash/fp/date.js create mode 100644 node_modules/lodash/fp/debounce.js create mode 100644 node_modules/lodash/fp/deburr.js create mode 100644 node_modules/lodash/fp/defaultTo.js create mode 100644 node_modules/lodash/fp/defaults.js create mode 100644 node_modules/lodash/fp/defaultsAll.js create mode 100644 node_modules/lodash/fp/defaultsDeep.js create mode 100644 node_modules/lodash/fp/defaultsDeepAll.js create mode 100644 node_modules/lodash/fp/defer.js create mode 100644 node_modules/lodash/fp/delay.js create mode 100644 node_modules/lodash/fp/difference.js create mode 100644 node_modules/lodash/fp/differenceBy.js create mode 100644 node_modules/lodash/fp/differenceWith.js create mode 100644 node_modules/lodash/fp/dissoc.js create mode 100644 node_modules/lodash/fp/dissocPath.js create mode 100644 node_modules/lodash/fp/divide.js create mode 100644 node_modules/lodash/fp/drop.js create mode 100644 node_modules/lodash/fp/dropLast.js create mode 100644 node_modules/lodash/fp/dropLastWhile.js create mode 100644 node_modules/lodash/fp/dropRight.js create mode 100644 node_modules/lodash/fp/dropRightWhile.js create mode 100644 node_modules/lodash/fp/dropWhile.js create mode 100644 node_modules/lodash/fp/each.js create mode 100644 node_modules/lodash/fp/eachRight.js create mode 100644 node_modules/lodash/fp/endsWith.js create mode 100644 node_modules/lodash/fp/entries.js create mode 100644 node_modules/lodash/fp/entriesIn.js create mode 100644 node_modules/lodash/fp/eq.js create mode 100644 node_modules/lodash/fp/equals.js create mode 100644 node_modules/lodash/fp/escape.js create mode 100644 node_modules/lodash/fp/escapeRegExp.js create mode 100644 node_modules/lodash/fp/every.js create mode 100644 node_modules/lodash/fp/extend.js create mode 100644 node_modules/lodash/fp/extendAll.js create mode 100644 node_modules/lodash/fp/extendAllWith.js create mode 100644 node_modules/lodash/fp/extendWith.js create mode 100644 node_modules/lodash/fp/fill.js create mode 100644 node_modules/lodash/fp/filter.js create mode 100644 node_modules/lodash/fp/find.js create mode 100644 node_modules/lodash/fp/findFrom.js create mode 100644 node_modules/lodash/fp/findIndex.js create mode 100644 node_modules/lodash/fp/findIndexFrom.js create mode 100644 node_modules/lodash/fp/findKey.js create mode 100644 node_modules/lodash/fp/findLast.js create mode 100644 node_modules/lodash/fp/findLastFrom.js create mode 100644 node_modules/lodash/fp/findLastIndex.js create mode 100644 node_modules/lodash/fp/findLastIndexFrom.js create mode 100644 node_modules/lodash/fp/findLastKey.js create mode 100644 node_modules/lodash/fp/first.js create mode 100644 node_modules/lodash/fp/flatMap.js create mode 100644 node_modules/lodash/fp/flatMapDeep.js create mode 100644 node_modules/lodash/fp/flatMapDepth.js create mode 100644 node_modules/lodash/fp/flatten.js create mode 100644 node_modules/lodash/fp/flattenDeep.js create mode 100644 node_modules/lodash/fp/flattenDepth.js create mode 100644 node_modules/lodash/fp/flip.js create mode 100644 node_modules/lodash/fp/floor.js create mode 100644 node_modules/lodash/fp/flow.js create mode 100644 node_modules/lodash/fp/flowRight.js create mode 100644 node_modules/lodash/fp/forEach.js create mode 100644 node_modules/lodash/fp/forEachRight.js create mode 100644 node_modules/lodash/fp/forIn.js create mode 100644 node_modules/lodash/fp/forInRight.js create mode 100644 node_modules/lodash/fp/forOwn.js create mode 100644 node_modules/lodash/fp/forOwnRight.js create mode 100644 node_modules/lodash/fp/fromPairs.js create mode 100644 node_modules/lodash/fp/function.js create mode 100644 node_modules/lodash/fp/functions.js create mode 100644 node_modules/lodash/fp/functionsIn.js create mode 100644 node_modules/lodash/fp/get.js create mode 100644 node_modules/lodash/fp/getOr.js create mode 100644 node_modules/lodash/fp/groupBy.js create mode 100644 node_modules/lodash/fp/gt.js create mode 100644 node_modules/lodash/fp/gte.js create mode 100644 node_modules/lodash/fp/has.js create mode 100644 node_modules/lodash/fp/hasIn.js create mode 100644 node_modules/lodash/fp/head.js create mode 100644 node_modules/lodash/fp/identical.js create mode 100644 node_modules/lodash/fp/identity.js create mode 100644 node_modules/lodash/fp/inRange.js create mode 100644 node_modules/lodash/fp/includes.js create mode 100644 node_modules/lodash/fp/includesFrom.js create mode 100644 node_modules/lodash/fp/indexBy.js create mode 100644 node_modules/lodash/fp/indexOf.js create mode 100644 node_modules/lodash/fp/indexOfFrom.js create mode 100644 node_modules/lodash/fp/init.js create mode 100644 node_modules/lodash/fp/initial.js create mode 100644 node_modules/lodash/fp/intersection.js create mode 100644 node_modules/lodash/fp/intersectionBy.js create mode 100644 node_modules/lodash/fp/intersectionWith.js create mode 100644 node_modules/lodash/fp/invert.js create mode 100644 node_modules/lodash/fp/invertBy.js create mode 100644 node_modules/lodash/fp/invertObj.js create mode 100644 node_modules/lodash/fp/invoke.js create mode 100644 node_modules/lodash/fp/invokeArgs.js create mode 100644 node_modules/lodash/fp/invokeArgsMap.js create mode 100644 node_modules/lodash/fp/invokeMap.js create mode 100644 node_modules/lodash/fp/isArguments.js create mode 100644 node_modules/lodash/fp/isArray.js create mode 100644 node_modules/lodash/fp/isArrayBuffer.js create mode 100644 node_modules/lodash/fp/isArrayLike.js create mode 100644 node_modules/lodash/fp/isArrayLikeObject.js create mode 100644 node_modules/lodash/fp/isBoolean.js create mode 100644 node_modules/lodash/fp/isBuffer.js create mode 100644 node_modules/lodash/fp/isDate.js create mode 100644 node_modules/lodash/fp/isElement.js create mode 100644 node_modules/lodash/fp/isEmpty.js create mode 100644 node_modules/lodash/fp/isEqual.js create mode 100644 node_modules/lodash/fp/isEqualWith.js create mode 100644 node_modules/lodash/fp/isError.js create mode 100644 node_modules/lodash/fp/isFinite.js create mode 100644 node_modules/lodash/fp/isFunction.js create mode 100644 node_modules/lodash/fp/isInteger.js create mode 100644 node_modules/lodash/fp/isLength.js create mode 100644 node_modules/lodash/fp/isMap.js create mode 100644 node_modules/lodash/fp/isMatch.js create mode 100644 node_modules/lodash/fp/isMatchWith.js create mode 100644 node_modules/lodash/fp/isNaN.js create mode 100644 node_modules/lodash/fp/isNative.js create mode 100644 node_modules/lodash/fp/isNil.js create mode 100644 node_modules/lodash/fp/isNull.js create mode 100644 node_modules/lodash/fp/isNumber.js create mode 100644 node_modules/lodash/fp/isObject.js create mode 100644 node_modules/lodash/fp/isObjectLike.js create mode 100644 node_modules/lodash/fp/isPlainObject.js create mode 100644 node_modules/lodash/fp/isRegExp.js create mode 100644 node_modules/lodash/fp/isSafeInteger.js create mode 100644 node_modules/lodash/fp/isSet.js create mode 100644 node_modules/lodash/fp/isString.js create mode 100644 node_modules/lodash/fp/isSymbol.js create mode 100644 node_modules/lodash/fp/isTypedArray.js create mode 100644 node_modules/lodash/fp/isUndefined.js create mode 100644 node_modules/lodash/fp/isWeakMap.js create mode 100644 node_modules/lodash/fp/isWeakSet.js create mode 100644 node_modules/lodash/fp/iteratee.js create mode 100644 node_modules/lodash/fp/join.js create mode 100644 node_modules/lodash/fp/juxt.js create mode 100644 node_modules/lodash/fp/kebabCase.js create mode 100644 node_modules/lodash/fp/keyBy.js create mode 100644 node_modules/lodash/fp/keys.js create mode 100644 node_modules/lodash/fp/keysIn.js create mode 100644 node_modules/lodash/fp/lang.js create mode 100644 node_modules/lodash/fp/last.js create mode 100644 node_modules/lodash/fp/lastIndexOf.js create mode 100644 node_modules/lodash/fp/lastIndexOfFrom.js create mode 100644 node_modules/lodash/fp/lowerCase.js create mode 100644 node_modules/lodash/fp/lowerFirst.js create mode 100644 node_modules/lodash/fp/lt.js create mode 100644 node_modules/lodash/fp/lte.js create mode 100644 node_modules/lodash/fp/map.js create mode 100644 node_modules/lodash/fp/mapKeys.js create mode 100644 node_modules/lodash/fp/mapValues.js create mode 100644 node_modules/lodash/fp/matches.js create mode 100644 node_modules/lodash/fp/matchesProperty.js create mode 100644 node_modules/lodash/fp/math.js create mode 100644 node_modules/lodash/fp/max.js create mode 100644 node_modules/lodash/fp/maxBy.js create mode 100644 node_modules/lodash/fp/mean.js create mode 100644 node_modules/lodash/fp/meanBy.js create mode 100644 node_modules/lodash/fp/memoize.js create mode 100644 node_modules/lodash/fp/merge.js create mode 100644 node_modules/lodash/fp/mergeAll.js create mode 100644 node_modules/lodash/fp/mergeAllWith.js create mode 100644 node_modules/lodash/fp/mergeWith.js create mode 100644 node_modules/lodash/fp/method.js create mode 100644 node_modules/lodash/fp/methodOf.js create mode 100644 node_modules/lodash/fp/min.js create mode 100644 node_modules/lodash/fp/minBy.js create mode 100644 node_modules/lodash/fp/mixin.js create mode 100644 node_modules/lodash/fp/multiply.js create mode 100644 node_modules/lodash/fp/nAry.js create mode 100644 node_modules/lodash/fp/negate.js create mode 100644 node_modules/lodash/fp/next.js create mode 100644 node_modules/lodash/fp/noop.js create mode 100644 node_modules/lodash/fp/now.js create mode 100644 node_modules/lodash/fp/nth.js create mode 100644 node_modules/lodash/fp/nthArg.js create mode 100644 node_modules/lodash/fp/number.js create mode 100644 node_modules/lodash/fp/object.js create mode 100644 node_modules/lodash/fp/omit.js create mode 100644 node_modules/lodash/fp/omitAll.js create mode 100644 node_modules/lodash/fp/omitBy.js create mode 100644 node_modules/lodash/fp/once.js create mode 100644 node_modules/lodash/fp/orderBy.js create mode 100644 node_modules/lodash/fp/over.js create mode 100644 node_modules/lodash/fp/overArgs.js create mode 100644 node_modules/lodash/fp/overEvery.js create mode 100644 node_modules/lodash/fp/overSome.js create mode 100644 node_modules/lodash/fp/pad.js create mode 100644 node_modules/lodash/fp/padChars.js create mode 100644 node_modules/lodash/fp/padCharsEnd.js create mode 100644 node_modules/lodash/fp/padCharsStart.js create mode 100644 node_modules/lodash/fp/padEnd.js create mode 100644 node_modules/lodash/fp/padStart.js create mode 100644 node_modules/lodash/fp/parseInt.js create mode 100644 node_modules/lodash/fp/partial.js create mode 100644 node_modules/lodash/fp/partialRight.js create mode 100644 node_modules/lodash/fp/partition.js create mode 100644 node_modules/lodash/fp/path.js create mode 100644 node_modules/lodash/fp/pathEq.js create mode 100644 node_modules/lodash/fp/pathOr.js create mode 100644 node_modules/lodash/fp/paths.js create mode 100644 node_modules/lodash/fp/pick.js create mode 100644 node_modules/lodash/fp/pickAll.js create mode 100644 node_modules/lodash/fp/pickBy.js create mode 100644 node_modules/lodash/fp/pipe.js create mode 100644 node_modules/lodash/fp/placeholder.js create mode 100644 node_modules/lodash/fp/plant.js create mode 100644 node_modules/lodash/fp/pluck.js create mode 100644 node_modules/lodash/fp/prop.js create mode 100644 node_modules/lodash/fp/propEq.js create mode 100644 node_modules/lodash/fp/propOr.js create mode 100644 node_modules/lodash/fp/property.js create mode 100644 node_modules/lodash/fp/propertyOf.js create mode 100644 node_modules/lodash/fp/props.js create mode 100644 node_modules/lodash/fp/pull.js create mode 100644 node_modules/lodash/fp/pullAll.js create mode 100644 node_modules/lodash/fp/pullAllBy.js create mode 100644 node_modules/lodash/fp/pullAllWith.js create mode 100644 node_modules/lodash/fp/pullAt.js create mode 100644 node_modules/lodash/fp/random.js create mode 100644 node_modules/lodash/fp/range.js create mode 100644 node_modules/lodash/fp/rangeRight.js create mode 100644 node_modules/lodash/fp/rangeStep.js create mode 100644 node_modules/lodash/fp/rangeStepRight.js create mode 100644 node_modules/lodash/fp/rearg.js create mode 100644 node_modules/lodash/fp/reduce.js create mode 100644 node_modules/lodash/fp/reduceRight.js create mode 100644 node_modules/lodash/fp/reject.js create mode 100644 node_modules/lodash/fp/remove.js create mode 100644 node_modules/lodash/fp/repeat.js create mode 100644 node_modules/lodash/fp/replace.js create mode 100644 node_modules/lodash/fp/rest.js create mode 100644 node_modules/lodash/fp/restFrom.js create mode 100644 node_modules/lodash/fp/result.js create mode 100644 node_modules/lodash/fp/reverse.js create mode 100644 node_modules/lodash/fp/round.js create mode 100644 node_modules/lodash/fp/sample.js create mode 100644 node_modules/lodash/fp/sampleSize.js create mode 100644 node_modules/lodash/fp/seq.js create mode 100644 node_modules/lodash/fp/set.js create mode 100644 node_modules/lodash/fp/setWith.js create mode 100644 node_modules/lodash/fp/shuffle.js create mode 100644 node_modules/lodash/fp/size.js create mode 100644 node_modules/lodash/fp/slice.js create mode 100644 node_modules/lodash/fp/snakeCase.js create mode 100644 node_modules/lodash/fp/some.js create mode 100644 node_modules/lodash/fp/sortBy.js create mode 100644 node_modules/lodash/fp/sortedIndex.js create mode 100644 node_modules/lodash/fp/sortedIndexBy.js create mode 100644 node_modules/lodash/fp/sortedIndexOf.js create mode 100644 node_modules/lodash/fp/sortedLastIndex.js create mode 100644 node_modules/lodash/fp/sortedLastIndexBy.js create mode 100644 node_modules/lodash/fp/sortedLastIndexOf.js create mode 100644 node_modules/lodash/fp/sortedUniq.js create mode 100644 node_modules/lodash/fp/sortedUniqBy.js create mode 100644 node_modules/lodash/fp/split.js create mode 100644 node_modules/lodash/fp/spread.js create mode 100644 node_modules/lodash/fp/spreadFrom.js create mode 100644 node_modules/lodash/fp/startCase.js create mode 100644 node_modules/lodash/fp/startsWith.js create mode 100644 node_modules/lodash/fp/string.js create mode 100644 node_modules/lodash/fp/stubArray.js create mode 100644 node_modules/lodash/fp/stubFalse.js create mode 100644 node_modules/lodash/fp/stubObject.js create mode 100644 node_modules/lodash/fp/stubString.js create mode 100644 node_modules/lodash/fp/stubTrue.js create mode 100644 node_modules/lodash/fp/subtract.js create mode 100644 node_modules/lodash/fp/sum.js create mode 100644 node_modules/lodash/fp/sumBy.js create mode 100644 node_modules/lodash/fp/symmetricDifference.js create mode 100644 node_modules/lodash/fp/symmetricDifferenceBy.js create mode 100644 node_modules/lodash/fp/symmetricDifferenceWith.js create mode 100644 node_modules/lodash/fp/tail.js create mode 100644 node_modules/lodash/fp/take.js create mode 100644 node_modules/lodash/fp/takeLast.js create mode 100644 node_modules/lodash/fp/takeLastWhile.js create mode 100644 node_modules/lodash/fp/takeRight.js create mode 100644 node_modules/lodash/fp/takeRightWhile.js create mode 100644 node_modules/lodash/fp/takeWhile.js create mode 100644 node_modules/lodash/fp/tap.js create mode 100644 node_modules/lodash/fp/template.js create mode 100644 node_modules/lodash/fp/templateSettings.js create mode 100644 node_modules/lodash/fp/throttle.js create mode 100644 node_modules/lodash/fp/thru.js create mode 100644 node_modules/lodash/fp/times.js create mode 100644 node_modules/lodash/fp/toArray.js create mode 100644 node_modules/lodash/fp/toFinite.js create mode 100644 node_modules/lodash/fp/toInteger.js create mode 100644 node_modules/lodash/fp/toIterator.js create mode 100644 node_modules/lodash/fp/toJSON.js create mode 100644 node_modules/lodash/fp/toLength.js create mode 100644 node_modules/lodash/fp/toLower.js create mode 100644 node_modules/lodash/fp/toNumber.js create mode 100644 node_modules/lodash/fp/toPairs.js create mode 100644 node_modules/lodash/fp/toPairsIn.js create mode 100644 node_modules/lodash/fp/toPath.js create mode 100644 node_modules/lodash/fp/toPlainObject.js create mode 100644 node_modules/lodash/fp/toSafeInteger.js create mode 100644 node_modules/lodash/fp/toString.js create mode 100644 node_modules/lodash/fp/toUpper.js create mode 100644 node_modules/lodash/fp/transform.js create mode 100644 node_modules/lodash/fp/trim.js create mode 100644 node_modules/lodash/fp/trimChars.js create mode 100644 node_modules/lodash/fp/trimCharsEnd.js create mode 100644 node_modules/lodash/fp/trimCharsStart.js create mode 100644 node_modules/lodash/fp/trimEnd.js create mode 100644 node_modules/lodash/fp/trimStart.js create mode 100644 node_modules/lodash/fp/truncate.js create mode 100644 node_modules/lodash/fp/unapply.js create mode 100644 node_modules/lodash/fp/unary.js create mode 100644 node_modules/lodash/fp/unescape.js create mode 100644 node_modules/lodash/fp/union.js create mode 100644 node_modules/lodash/fp/unionBy.js create mode 100644 node_modules/lodash/fp/unionWith.js create mode 100644 node_modules/lodash/fp/uniq.js create mode 100644 node_modules/lodash/fp/uniqBy.js create mode 100644 node_modules/lodash/fp/uniqWith.js create mode 100644 node_modules/lodash/fp/uniqueId.js create mode 100644 node_modules/lodash/fp/unnest.js create mode 100644 node_modules/lodash/fp/unset.js create mode 100644 node_modules/lodash/fp/unzip.js create mode 100644 node_modules/lodash/fp/unzipWith.js create mode 100644 node_modules/lodash/fp/update.js create mode 100644 node_modules/lodash/fp/updateWith.js create mode 100644 node_modules/lodash/fp/upperCase.js create mode 100644 node_modules/lodash/fp/upperFirst.js create mode 100644 node_modules/lodash/fp/useWith.js create mode 100644 node_modules/lodash/fp/util.js create mode 100644 node_modules/lodash/fp/value.js create mode 100644 node_modules/lodash/fp/valueOf.js create mode 100644 node_modules/lodash/fp/values.js create mode 100644 node_modules/lodash/fp/valuesIn.js create mode 100644 node_modules/lodash/fp/where.js create mode 100644 node_modules/lodash/fp/whereEq.js create mode 100644 node_modules/lodash/fp/without.js create mode 100644 node_modules/lodash/fp/words.js create mode 100644 node_modules/lodash/fp/wrap.js create mode 100644 node_modules/lodash/fp/wrapperAt.js create mode 100644 node_modules/lodash/fp/wrapperChain.js create mode 100644 node_modules/lodash/fp/wrapperLodash.js create mode 100644 node_modules/lodash/fp/wrapperReverse.js create mode 100644 node_modules/lodash/fp/wrapperValue.js create mode 100644 node_modules/lodash/fp/xor.js create mode 100644 node_modules/lodash/fp/xorBy.js create mode 100644 node_modules/lodash/fp/xorWith.js create mode 100644 node_modules/lodash/fp/zip.js create mode 100644 node_modules/lodash/fp/zipAll.js create mode 100644 node_modules/lodash/fp/zipObj.js create mode 100644 node_modules/lodash/fp/zipObject.js create mode 100644 node_modules/lodash/fp/zipObjectDeep.js create mode 100644 node_modules/lodash/fp/zipWith.js create mode 100644 node_modules/lodash/fromPairs.js create mode 100644 node_modules/lodash/function.js create mode 100644 node_modules/lodash/functions.js create mode 100644 node_modules/lodash/functionsIn.js create mode 100644 node_modules/lodash/get.js create mode 100644 node_modules/lodash/groupBy.js create mode 100644 node_modules/lodash/gt.js create mode 100644 node_modules/lodash/gte.js create mode 100644 node_modules/lodash/has.js create mode 100644 node_modules/lodash/hasIn.js create mode 100644 node_modules/lodash/head.js create mode 100644 node_modules/lodash/identity.js create mode 100644 node_modules/lodash/inRange.js create mode 100644 node_modules/lodash/includes.js create mode 100644 node_modules/lodash/index.js create mode 100644 node_modules/lodash/indexOf.js create mode 100644 node_modules/lodash/initial.js create mode 100644 node_modules/lodash/intersection.js create mode 100644 node_modules/lodash/intersectionBy.js create mode 100644 node_modules/lodash/intersectionWith.js create mode 100644 node_modules/lodash/invert.js create mode 100644 node_modules/lodash/invertBy.js create mode 100644 node_modules/lodash/invoke.js create mode 100644 node_modules/lodash/invokeMap.js create mode 100644 node_modules/lodash/isArguments.js create mode 100644 node_modules/lodash/isArray.js create mode 100644 node_modules/lodash/isArrayBuffer.js create mode 100644 node_modules/lodash/isArrayLike.js create mode 100644 node_modules/lodash/isArrayLikeObject.js create mode 100644 node_modules/lodash/isBoolean.js create mode 100644 node_modules/lodash/isBuffer.js create mode 100644 node_modules/lodash/isDate.js create mode 100644 node_modules/lodash/isElement.js create mode 100644 node_modules/lodash/isEmpty.js create mode 100644 node_modules/lodash/isEqual.js create mode 100644 node_modules/lodash/isEqualWith.js create mode 100644 node_modules/lodash/isError.js create mode 100644 node_modules/lodash/isFinite.js create mode 100644 node_modules/lodash/isFunction.js create mode 100644 node_modules/lodash/isInteger.js create mode 100644 node_modules/lodash/isLength.js create mode 100644 node_modules/lodash/isMap.js create mode 100644 node_modules/lodash/isMatch.js create mode 100644 node_modules/lodash/isMatchWith.js create mode 100644 node_modules/lodash/isNaN.js create mode 100644 node_modules/lodash/isNative.js create mode 100644 node_modules/lodash/isNil.js create mode 100644 node_modules/lodash/isNull.js create mode 100644 node_modules/lodash/isNumber.js create mode 100644 node_modules/lodash/isObject.js create mode 100644 node_modules/lodash/isObjectLike.js create mode 100644 node_modules/lodash/isPlainObject.js create mode 100644 node_modules/lodash/isRegExp.js create mode 100644 node_modules/lodash/isSafeInteger.js create mode 100644 node_modules/lodash/isSet.js create mode 100644 node_modules/lodash/isString.js create mode 100644 node_modules/lodash/isSymbol.js create mode 100644 node_modules/lodash/isTypedArray.js create mode 100644 node_modules/lodash/isUndefined.js create mode 100644 node_modules/lodash/isWeakMap.js create mode 100644 node_modules/lodash/isWeakSet.js create mode 100644 node_modules/lodash/iteratee.js create mode 100644 node_modules/lodash/join.js create mode 100644 node_modules/lodash/kebabCase.js create mode 100644 node_modules/lodash/keyBy.js create mode 100644 node_modules/lodash/keys.js create mode 100644 node_modules/lodash/keysIn.js create mode 100644 node_modules/lodash/lang.js create mode 100644 node_modules/lodash/last.js create mode 100644 node_modules/lodash/lastIndexOf.js create mode 100644 node_modules/lodash/lodash.js create mode 100644 node_modules/lodash/lodash.min.js create mode 100644 node_modules/lodash/lowerCase.js create mode 100644 node_modules/lodash/lowerFirst.js create mode 100644 node_modules/lodash/lt.js create mode 100644 node_modules/lodash/lte.js create mode 100644 node_modules/lodash/map.js create mode 100644 node_modules/lodash/mapKeys.js create mode 100644 node_modules/lodash/mapValues.js create mode 100644 node_modules/lodash/matches.js create mode 100644 node_modules/lodash/matchesProperty.js create mode 100644 node_modules/lodash/math.js create mode 100644 node_modules/lodash/max.js create mode 100644 node_modules/lodash/maxBy.js create mode 100644 node_modules/lodash/mean.js create mode 100644 node_modules/lodash/meanBy.js create mode 100644 node_modules/lodash/memoize.js create mode 100644 node_modules/lodash/merge.js create mode 100644 node_modules/lodash/mergeWith.js create mode 100644 node_modules/lodash/method.js create mode 100644 node_modules/lodash/methodOf.js create mode 100644 node_modules/lodash/min.js create mode 100644 node_modules/lodash/minBy.js create mode 100644 node_modules/lodash/mixin.js create mode 100644 node_modules/lodash/multiply.js create mode 100644 node_modules/lodash/negate.js create mode 100644 node_modules/lodash/next.js create mode 100644 node_modules/lodash/noop.js create mode 100644 node_modules/lodash/now.js create mode 100644 node_modules/lodash/nth.js create mode 100644 node_modules/lodash/nthArg.js create mode 100644 node_modules/lodash/number.js create mode 100644 node_modules/lodash/object.js create mode 100644 node_modules/lodash/omit.js create mode 100644 node_modules/lodash/omitBy.js create mode 100644 node_modules/lodash/once.js create mode 100644 node_modules/lodash/orderBy.js create mode 100644 node_modules/lodash/over.js create mode 100644 node_modules/lodash/overArgs.js create mode 100644 node_modules/lodash/overEvery.js create mode 100644 node_modules/lodash/overSome.js create mode 100644 node_modules/lodash/package.json create mode 100644 node_modules/lodash/pad.js create mode 100644 node_modules/lodash/padEnd.js create mode 100644 node_modules/lodash/padStart.js create mode 100644 node_modules/lodash/parseInt.js create mode 100644 node_modules/lodash/partial.js create mode 100644 node_modules/lodash/partialRight.js create mode 100644 node_modules/lodash/partition.js create mode 100644 node_modules/lodash/pick.js create mode 100644 node_modules/lodash/pickBy.js create mode 100644 node_modules/lodash/plant.js create mode 100644 node_modules/lodash/property.js create mode 100644 node_modules/lodash/propertyOf.js create mode 100644 node_modules/lodash/pull.js create mode 100644 node_modules/lodash/pullAll.js create mode 100644 node_modules/lodash/pullAllBy.js create mode 100644 node_modules/lodash/pullAllWith.js create mode 100644 node_modules/lodash/pullAt.js create mode 100644 node_modules/lodash/random.js create mode 100644 node_modules/lodash/range.js create mode 100644 node_modules/lodash/rangeRight.js create mode 100644 node_modules/lodash/rearg.js create mode 100644 node_modules/lodash/reduce.js create mode 100644 node_modules/lodash/reduceRight.js create mode 100644 node_modules/lodash/reject.js create mode 100644 node_modules/lodash/remove.js create mode 100644 node_modules/lodash/repeat.js create mode 100644 node_modules/lodash/replace.js create mode 100644 node_modules/lodash/rest.js create mode 100644 node_modules/lodash/result.js create mode 100644 node_modules/lodash/reverse.js create mode 100644 node_modules/lodash/round.js create mode 100644 node_modules/lodash/sample.js create mode 100644 node_modules/lodash/sampleSize.js create mode 100644 node_modules/lodash/seq.js create mode 100644 node_modules/lodash/set.js create mode 100644 node_modules/lodash/setWith.js create mode 100644 node_modules/lodash/shuffle.js create mode 100644 node_modules/lodash/size.js create mode 100644 node_modules/lodash/slice.js create mode 100644 node_modules/lodash/snakeCase.js create mode 100644 node_modules/lodash/some.js create mode 100644 node_modules/lodash/sortBy.js create mode 100644 node_modules/lodash/sortedIndex.js create mode 100644 node_modules/lodash/sortedIndexBy.js create mode 100644 node_modules/lodash/sortedIndexOf.js create mode 100644 node_modules/lodash/sortedLastIndex.js create mode 100644 node_modules/lodash/sortedLastIndexBy.js create mode 100644 node_modules/lodash/sortedLastIndexOf.js create mode 100644 node_modules/lodash/sortedUniq.js create mode 100644 node_modules/lodash/sortedUniqBy.js create mode 100644 node_modules/lodash/split.js create mode 100644 node_modules/lodash/spread.js create mode 100644 node_modules/lodash/startCase.js create mode 100644 node_modules/lodash/startsWith.js create mode 100644 node_modules/lodash/string.js create mode 100644 node_modules/lodash/stubArray.js create mode 100644 node_modules/lodash/stubFalse.js create mode 100644 node_modules/lodash/stubObject.js create mode 100644 node_modules/lodash/stubString.js create mode 100644 node_modules/lodash/stubTrue.js create mode 100644 node_modules/lodash/subtract.js create mode 100644 node_modules/lodash/sum.js create mode 100644 node_modules/lodash/sumBy.js create mode 100644 node_modules/lodash/tail.js create mode 100644 node_modules/lodash/take.js create mode 100644 node_modules/lodash/takeRight.js create mode 100644 node_modules/lodash/takeRightWhile.js create mode 100644 node_modules/lodash/takeWhile.js create mode 100644 node_modules/lodash/tap.js create mode 100644 node_modules/lodash/template.js create mode 100644 node_modules/lodash/templateSettings.js create mode 100644 node_modules/lodash/throttle.js create mode 100644 node_modules/lodash/thru.js create mode 100644 node_modules/lodash/times.js create mode 100644 node_modules/lodash/toArray.js create mode 100644 node_modules/lodash/toFinite.js create mode 100644 node_modules/lodash/toInteger.js create mode 100644 node_modules/lodash/toIterator.js create mode 100644 node_modules/lodash/toJSON.js create mode 100644 node_modules/lodash/toLength.js create mode 100644 node_modules/lodash/toLower.js create mode 100644 node_modules/lodash/toNumber.js create mode 100644 node_modules/lodash/toPairs.js create mode 100644 node_modules/lodash/toPairsIn.js create mode 100644 node_modules/lodash/toPath.js create mode 100644 node_modules/lodash/toPlainObject.js create mode 100644 node_modules/lodash/toSafeInteger.js create mode 100644 node_modules/lodash/toString.js create mode 100644 node_modules/lodash/toUpper.js create mode 100644 node_modules/lodash/transform.js create mode 100644 node_modules/lodash/trim.js create mode 100644 node_modules/lodash/trimEnd.js create mode 100644 node_modules/lodash/trimStart.js create mode 100644 node_modules/lodash/truncate.js create mode 100644 node_modules/lodash/unary.js create mode 100644 node_modules/lodash/unescape.js create mode 100644 node_modules/lodash/union.js create mode 100644 node_modules/lodash/unionBy.js create mode 100644 node_modules/lodash/unionWith.js create mode 100644 node_modules/lodash/uniq.js create mode 100644 node_modules/lodash/uniqBy.js create mode 100644 node_modules/lodash/uniqWith.js create mode 100644 node_modules/lodash/uniqueId.js create mode 100644 node_modules/lodash/unset.js create mode 100644 node_modules/lodash/unzip.js create mode 100644 node_modules/lodash/unzipWith.js create mode 100644 node_modules/lodash/update.js create mode 100644 node_modules/lodash/updateWith.js create mode 100644 node_modules/lodash/upperCase.js create mode 100644 node_modules/lodash/upperFirst.js create mode 100644 node_modules/lodash/util.js create mode 100644 node_modules/lodash/value.js create mode 100644 node_modules/lodash/valueOf.js create mode 100644 node_modules/lodash/values.js create mode 100644 node_modules/lodash/valuesIn.js create mode 100644 node_modules/lodash/without.js create mode 100644 node_modules/lodash/words.js create mode 100644 node_modules/lodash/wrap.js create mode 100644 node_modules/lodash/wrapperAt.js create mode 100644 node_modules/lodash/wrapperChain.js create mode 100644 node_modules/lodash/wrapperLodash.js create mode 100644 node_modules/lodash/wrapperReverse.js create mode 100644 node_modules/lodash/wrapperValue.js create mode 100644 node_modules/lodash/xor.js create mode 100644 node_modules/lodash/xorBy.js create mode 100644 node_modules/lodash/xorWith.js create mode 100644 node_modules/lodash/zip.js create mode 100644 node_modules/lodash/zipObject.js create mode 100644 node_modules/lodash/zipObjectDeep.js create mode 100644 node_modules/lodash/zipWith.js create mode 100644 node_modules/lowercase-keys/index.js create mode 100644 node_modules/lowercase-keys/license create mode 100644 node_modules/lowercase-keys/package.json create mode 100644 node_modules/lowercase-keys/readme.md create mode 100644 node_modules/lru-cache/LICENSE create mode 100644 node_modules/lru-cache/README.md create mode 100644 node_modules/lru-cache/index.js create mode 100644 node_modules/lru-cache/node_modules/yallist/LICENSE create mode 100644 node_modules/lru-cache/node_modules/yallist/README.md create mode 100644 node_modules/lru-cache/node_modules/yallist/iterator.js create mode 100644 node_modules/lru-cache/node_modules/yallist/package.json create mode 100644 node_modules/lru-cache/node_modules/yallist/yallist.js create mode 100644 node_modules/lru-cache/package.json create mode 100644 node_modules/make-dir/index.js create mode 100644 node_modules/make-dir/license create mode 100644 node_modules/make-dir/package.json create mode 100644 node_modules/make-dir/readme.md create mode 100644 node_modules/make-iterator/LICENSE create mode 100644 node_modules/make-iterator/README.md create mode 100644 node_modules/make-iterator/index.js create mode 100644 node_modules/make-iterator/package.json create mode 100644 node_modules/map-cache/LICENSE create mode 100644 node_modules/map-cache/README.md create mode 100644 node_modules/map-cache/index.js create mode 100644 node_modules/map-cache/package.json create mode 100644 node_modules/map-visit/LICENSE create mode 100644 node_modules/map-visit/README.md create mode 100644 node_modules/map-visit/index.js create mode 100644 node_modules/map-visit/package.json create mode 100644 node_modules/media-typer/HISTORY.md create mode 100644 node_modules/media-typer/LICENSE create mode 100644 node_modules/media-typer/README.md create mode 100644 node_modules/media-typer/index.js create mode 100644 node_modules/media-typer/package.json create mode 100644 node_modules/merge-descriptors/HISTORY.md create mode 100644 node_modules/merge-descriptors/LICENSE create mode 100644 node_modules/merge-descriptors/README.md create mode 100644 node_modules/merge-descriptors/index.js create mode 100644 node_modules/merge-descriptors/package.json create mode 100644 node_modules/methods/HISTORY.md create mode 100644 node_modules/methods/LICENSE create mode 100644 node_modules/methods/README.md create mode 100644 node_modules/methods/index.js create mode 100644 node_modules/methods/package.json create mode 100644 node_modules/micromatch/CHANGELOG.md create mode 100755 node_modules/micromatch/LICENSE create mode 100644 node_modules/micromatch/README.md create mode 100644 node_modules/micromatch/index.js create mode 100644 node_modules/micromatch/lib/.DS_Store create mode 100644 node_modules/micromatch/lib/cache.js create mode 100644 node_modules/micromatch/lib/compilers.js create mode 100644 node_modules/micromatch/lib/parsers.js create mode 100644 node_modules/micromatch/lib/utils.js create mode 100644 node_modules/micromatch/package.json create mode 100644 node_modules/mime-db/HISTORY.md create mode 100644 node_modules/mime-db/LICENSE create mode 100644 node_modules/mime-db/README.md create mode 100644 node_modules/mime-db/db.json create mode 100644 node_modules/mime-db/index.js create mode 100644 node_modules/mime-db/package.json create mode 100644 node_modules/mime-types/HISTORY.md create mode 100644 node_modules/mime-types/LICENSE create mode 100644 node_modules/mime-types/README.md create mode 100644 node_modules/mime-types/index.js create mode 100644 node_modules/mime-types/package.json create mode 100644 node_modules/mime/.npmignore create mode 100644 node_modules/mime/CHANGELOG.md create mode 100644 node_modules/mime/LICENSE create mode 100644 node_modules/mime/README.md create mode 100755 node_modules/mime/cli.js create mode 100644 node_modules/mime/mime.js create mode 100644 node_modules/mime/package.json create mode 100755 node_modules/mime/src/build.js create mode 100644 node_modules/mime/src/test.js create mode 100644 node_modules/mime/types.json create mode 100644 node_modules/minimatch/LICENSE create mode 100644 node_modules/minimatch/README.md create mode 100644 node_modules/minimatch/minimatch.js create mode 100644 node_modules/minimatch/package.json create mode 100644 node_modules/minimist/.travis.yml create mode 100644 node_modules/minimist/LICENSE create mode 100644 node_modules/minimist/example/parse.js create mode 100644 node_modules/minimist/index.js create mode 100644 node_modules/minimist/package.json create mode 100644 node_modules/minimist/readme.markdown create mode 100644 node_modules/minimist/test/all_bool.js create mode 100644 node_modules/minimist/test/bool.js create mode 100644 node_modules/minimist/test/dash.js create mode 100644 node_modules/minimist/test/default_bool.js create mode 100644 node_modules/minimist/test/dotted.js create mode 100644 node_modules/minimist/test/kv_short.js create mode 100644 node_modules/minimist/test/long.js create mode 100644 node_modules/minimist/test/num.js create mode 100644 node_modules/minimist/test/parse.js create mode 100644 node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/minimist/test/proto.js create mode 100644 node_modules/minimist/test/short.js create mode 100644 node_modules/minimist/test/stop_early.js create mode 100644 node_modules/minimist/test/unknown.js create mode 100644 node_modules/minimist/test/whitespace.js create mode 100644 node_modules/minipass/LICENSE create mode 100644 node_modules/minipass/README.md create mode 100644 node_modules/minipass/index.js create mode 100644 node_modules/minipass/package.json create mode 100644 node_modules/minizlib/LICENSE create mode 100644 node_modules/minizlib/README.md create mode 100644 node_modules/minizlib/constants.js create mode 100644 node_modules/minizlib/index.js create mode 100644 node_modules/minizlib/package.json create mode 100644 node_modules/mixin-deep/LICENSE create mode 100644 node_modules/mixin-deep/README.md create mode 100644 node_modules/mixin-deep/index.js create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/LICENSE create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/README.md create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/index.d.ts create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/index.js create mode 100644 node_modules/mixin-deep/node_modules/is-extendable/package.json create mode 100644 node_modules/mixin-deep/package.json create mode 100644 node_modules/mkdirp/LICENSE create mode 100755 node_modules/mkdirp/bin/cmd.js create mode 100644 node_modules/mkdirp/bin/usage.txt create mode 100644 node_modules/mkdirp/index.js create mode 100644 node_modules/mkdirp/package.json create mode 100644 node_modules/mkdirp/readme.markdown create mode 100644 node_modules/ms/index.js create mode 100644 node_modules/ms/license.md create mode 100644 node_modules/ms/package.json create mode 100644 node_modules/ms/readme.md create mode 100644 node_modules/nan/CHANGELOG.md create mode 100644 node_modules/nan/LICENSE.md create mode 100644 node_modules/nan/README.md create mode 100644 node_modules/nan/doc/asyncworker.md create mode 100644 node_modules/nan/doc/buffers.md create mode 100644 node_modules/nan/doc/callback.md create mode 100644 node_modules/nan/doc/converters.md create mode 100644 node_modules/nan/doc/errors.md create mode 100644 node_modules/nan/doc/json.md create mode 100644 node_modules/nan/doc/maybe_types.md create mode 100644 node_modules/nan/doc/methods.md create mode 100644 node_modules/nan/doc/new.md create mode 100644 node_modules/nan/doc/node_misc.md create mode 100644 node_modules/nan/doc/object_wrappers.md create mode 100644 node_modules/nan/doc/persistent.md create mode 100644 node_modules/nan/doc/scopes.md create mode 100644 node_modules/nan/doc/script.md create mode 100644 node_modules/nan/doc/string_bytes.md create mode 100644 node_modules/nan/doc/v8_internals.md create mode 100644 node_modules/nan/doc/v8_misc.md create mode 100644 node_modules/nan/include_dirs.js create mode 100644 node_modules/nan/nan.h create mode 100644 node_modules/nan/nan_callbacks.h create mode 100644 node_modules/nan/nan_callbacks_12_inl.h create mode 100644 node_modules/nan/nan_callbacks_pre_12_inl.h create mode 100644 node_modules/nan/nan_converters.h create mode 100644 node_modules/nan/nan_converters_43_inl.h create mode 100644 node_modules/nan/nan_converters_pre_43_inl.h create mode 100644 node_modules/nan/nan_define_own_property_helper.h create mode 100644 node_modules/nan/nan_implementation_12_inl.h create mode 100644 node_modules/nan/nan_implementation_pre_12_inl.h create mode 100644 node_modules/nan/nan_json.h create mode 100644 node_modules/nan/nan_maybe_43_inl.h create mode 100644 node_modules/nan/nan_maybe_pre_43_inl.h create mode 100644 node_modules/nan/nan_new.h create mode 100644 node_modules/nan/nan_object_wrap.h create mode 100644 node_modules/nan/nan_persistent_12_inl.h create mode 100644 node_modules/nan/nan_persistent_pre_12_inl.h create mode 100644 node_modules/nan/nan_private.h create mode 100644 node_modules/nan/nan_string_bytes.h create mode 100644 node_modules/nan/nan_typedarray_contents.h create mode 100644 node_modules/nan/nan_weak.h create mode 100644 node_modules/nan/package.json create mode 100755 node_modules/nan/tools/1to2.js create mode 100644 node_modules/nan/tools/README.md create mode 100644 node_modules/nan/tools/package.json create mode 100644 node_modules/nanomatch/CHANGELOG.md create mode 100644 node_modules/nanomatch/LICENSE create mode 100644 node_modules/nanomatch/README.md create mode 100644 node_modules/nanomatch/index.js create mode 100644 node_modules/nanomatch/lib/cache.js create mode 100644 node_modules/nanomatch/lib/compilers.js create mode 100644 node_modules/nanomatch/lib/parsers.js create mode 100644 node_modules/nanomatch/lib/utils.js create mode 100644 node_modules/nanomatch/package.json create mode 100644 node_modules/needle/.github/workflows/nodejs.yml create mode 100644 node_modules/needle/README.md create mode 100755 node_modules/needle/bin/needle create mode 100644 node_modules/needle/examples/deflated-stream.js create mode 100644 node_modules/needle/examples/digest-auth.js create mode 100644 node_modules/needle/examples/download-to-file.js create mode 100644 node_modules/needle/examples/multipart-stream.js create mode 100644 node_modules/needle/examples/parsed-stream.js create mode 100644 node_modules/needle/examples/parsed-stream2.js create mode 100644 node_modules/needle/examples/stream-events.js create mode 100644 node_modules/needle/examples/stream-to-file.js create mode 100644 node_modules/needle/examples/upload-image.js create mode 100644 node_modules/needle/lib/auth.js create mode 100644 node_modules/needle/lib/cookies.js create mode 100644 node_modules/needle/lib/decoder.js create mode 100644 node_modules/needle/lib/multipart.js create mode 100644 node_modules/needle/lib/needle.js create mode 100644 node_modules/needle/lib/parsers.js create mode 100644 node_modules/needle/lib/querystring.js create mode 100644 node_modules/needle/license.txt create mode 100644 node_modules/needle/node_modules/debug/CHANGELOG.md create mode 100644 node_modules/needle/node_modules/debug/LICENSE create mode 100644 node_modules/needle/node_modules/debug/README.md create mode 100644 node_modules/needle/node_modules/debug/dist/debug.js create mode 100644 node_modules/needle/node_modules/debug/node.js create mode 100644 node_modules/needle/node_modules/debug/package.json create mode 100644 node_modules/needle/node_modules/debug/src/browser.js create mode 100644 node_modules/needle/node_modules/debug/src/common.js create mode 100644 node_modules/needle/node_modules/debug/src/index.js create mode 100644 node_modules/needle/node_modules/debug/src/node.js create mode 100644 node_modules/needle/node_modules/ms/index.js create mode 100644 node_modules/needle/node_modules/ms/license.md create mode 100644 node_modules/needle/node_modules/ms/package.json create mode 100644 node_modules/needle/node_modules/ms/readme.md create mode 100644 node_modules/needle/package.json create mode 100644 node_modules/needle/test/basic_auth_spec.js create mode 100644 node_modules/needle/test/compression_spec.js create mode 100644 node_modules/needle/test/cookies_spec.js create mode 100644 node_modules/needle/test/decoder_spec.js create mode 100644 node_modules/needle/test/errors_spec.js create mode 100644 node_modules/needle/test/headers_spec.js create mode 100644 node_modules/needle/test/helpers.js create mode 100644 node_modules/needle/test/long_string_spec.js create mode 100644 node_modules/needle/test/output_spec.js create mode 100644 node_modules/needle/test/parsing_spec.js create mode 100644 node_modules/needle/test/post_data_spec.js create mode 100644 node_modules/needle/test/proxy_spec.js create mode 100644 node_modules/needle/test/querystring_spec.js create mode 100644 node_modules/needle/test/redirect_spec.js create mode 100644 node_modules/needle/test/redirect_with_timeout.js create mode 100644 node_modules/needle/test/request_stream_spec.js create mode 100644 node_modules/needle/test/response_stream_spec.js create mode 100644 node_modules/needle/test/socket_pool_spec.js create mode 100644 node_modules/needle/test/url_spec.js create mode 100644 node_modules/needle/test/utils/formidable.js create mode 100644 node_modules/needle/test/utils/proxy.js create mode 100644 node_modules/needle/test/utils/test.js create mode 100644 node_modules/negotiator/HISTORY.md create mode 100644 node_modules/negotiator/LICENSE create mode 100644 node_modules/negotiator/README.md create mode 100644 node_modules/negotiator/index.js create mode 100644 node_modules/negotiator/lib/charset.js create mode 100644 node_modules/negotiator/lib/encoding.js create mode 100644 node_modules/negotiator/lib/language.js create mode 100644 node_modules/negotiator/lib/mediaType.js create mode 100644 node_modules/negotiator/package.json create mode 100644 node_modules/nocache/CHANGELOG.md create mode 100644 node_modules/nocache/LICENSE create mode 100644 node_modules/nocache/README.md create mode 100644 node_modules/nocache/dist/index.d.ts create mode 100644 node_modules/nocache/dist/index.js create mode 100644 node_modules/nocache/package.json create mode 100644 node_modules/node-pre-gyp/CHANGELOG.md create mode 100644 node_modules/node-pre-gyp/LICENSE create mode 100644 node_modules/node-pre-gyp/README.md create mode 100644 node_modules/node-pre-gyp/appveyor.yml create mode 100755 node_modules/node-pre-gyp/bin/node-pre-gyp create mode 100644 node_modules/node-pre-gyp/bin/node-pre-gyp.cmd create mode 100644 node_modules/node-pre-gyp/contributing.md create mode 100644 node_modules/node-pre-gyp/lib/build.js create mode 100644 node_modules/node-pre-gyp/lib/clean.js create mode 100644 node_modules/node-pre-gyp/lib/configure.js create mode 100644 node_modules/node-pre-gyp/lib/info.js create mode 100644 node_modules/node-pre-gyp/lib/install.js create mode 100644 node_modules/node-pre-gyp/lib/node-pre-gyp.js create mode 100644 node_modules/node-pre-gyp/lib/package.js create mode 100644 node_modules/node-pre-gyp/lib/pre-binding.js create mode 100644 node_modules/node-pre-gyp/lib/publish.js create mode 100644 node_modules/node-pre-gyp/lib/rebuild.js create mode 100644 node_modules/node-pre-gyp/lib/reinstall.js create mode 100644 node_modules/node-pre-gyp/lib/reveal.js create mode 100644 node_modules/node-pre-gyp/lib/testbinary.js create mode 100644 node_modules/node-pre-gyp/lib/testpackage.js create mode 100644 node_modules/node-pre-gyp/lib/unpublish.js create mode 100644 node_modules/node-pre-gyp/lib/util/abi_crosswalk.json create mode 100644 node_modules/node-pre-gyp/lib/util/compile.js create mode 100644 node_modules/node-pre-gyp/lib/util/handle_gyp_opts.js create mode 100644 node_modules/node-pre-gyp/lib/util/napi.js create mode 100644 node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html create mode 100644 node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json create mode 100644 node_modules/node-pre-gyp/lib/util/s3_setup.js create mode 100644 node_modules/node-pre-gyp/lib/util/versioning.js create mode 100644 node_modules/node-pre-gyp/package.json create mode 100644 node_modules/nodejs/1/getmodule.js create mode 100644 node_modules/nodejs/1/module.js create mode 100644 node_modules/nodejs/1/singleobject.js create mode 100644 node_modules/nodejs/package.json create mode 100644 node_modules/nodemon/.jscsrc create mode 100644 node_modules/nodemon/.jshintrc create mode 100644 node_modules/nodemon/.travis.yml create mode 100644 node_modules/nodemon/LICENSE create mode 100644 node_modules/nodemon/README.md create mode 100755 node_modules/nodemon/bin/nodemon.js create mode 100755 node_modules/nodemon/bin/postinstall.js create mode 100644 node_modules/nodemon/commitlint.config.js create mode 100644 node_modules/nodemon/doc/cli/authors.txt create mode 100644 node_modules/nodemon/doc/cli/config.txt create mode 100644 node_modules/nodemon/doc/cli/help.txt create mode 100644 node_modules/nodemon/doc/cli/logo.txt create mode 100644 node_modules/nodemon/doc/cli/options.txt create mode 100644 node_modules/nodemon/doc/cli/topics.txt create mode 100644 node_modules/nodemon/doc/cli/usage.txt create mode 100644 node_modules/nodemon/doc/cli/whoami.txt create mode 100644 node_modules/nodemon/lib/cli/index.js create mode 100644 node_modules/nodemon/lib/cli/parse.js create mode 100644 node_modules/nodemon/lib/config/command.js create mode 100644 node_modules/nodemon/lib/config/defaults.js create mode 100644 node_modules/nodemon/lib/config/exec.js create mode 100644 node_modules/nodemon/lib/config/index.js create mode 100644 node_modules/nodemon/lib/config/load.js create mode 100644 node_modules/nodemon/lib/help/index.js create mode 100644 node_modules/nodemon/lib/index.js create mode 100644 node_modules/nodemon/lib/monitor/index.js create mode 100644 node_modules/nodemon/lib/monitor/match.js create mode 100644 node_modules/nodemon/lib/monitor/run.js create mode 100644 node_modules/nodemon/lib/monitor/signals.js create mode 100644 node_modules/nodemon/lib/monitor/watch.js create mode 100644 node_modules/nodemon/lib/nodemon.js create mode 100644 node_modules/nodemon/lib/rules/add.js create mode 100644 node_modules/nodemon/lib/rules/index.js create mode 100644 node_modules/nodemon/lib/rules/parse.js create mode 100644 node_modules/nodemon/lib/spawn.js create mode 100644 node_modules/nodemon/lib/utils/bus.js create mode 100644 node_modules/nodemon/lib/utils/clone.js create mode 100644 node_modules/nodemon/lib/utils/colour.js create mode 100644 node_modules/nodemon/lib/utils/index.js create mode 100644 node_modules/nodemon/lib/utils/log.js create mode 100644 node_modules/nodemon/lib/utils/merge.js create mode 100644 node_modules/nodemon/lib/version.js create mode 100644 node_modules/nodemon/node_modules/debug/CHANGELOG.md create mode 100644 node_modules/nodemon/node_modules/debug/LICENSE create mode 100644 node_modules/nodemon/node_modules/debug/README.md create mode 100644 node_modules/nodemon/node_modules/debug/dist/debug.js create mode 100644 node_modules/nodemon/node_modules/debug/node.js create mode 100644 node_modules/nodemon/node_modules/debug/package.json create mode 100644 node_modules/nodemon/node_modules/debug/src/browser.js create mode 100644 node_modules/nodemon/node_modules/debug/src/common.js create mode 100644 node_modules/nodemon/node_modules/debug/src/index.js create mode 100644 node_modules/nodemon/node_modules/debug/src/node.js create mode 100644 node_modules/nodemon/node_modules/ms/index.js create mode 100644 node_modules/nodemon/node_modules/ms/license.md create mode 100644 node_modules/nodemon/node_modules/ms/package.json create mode 100644 node_modules/nodemon/node_modules/ms/readme.md create mode 100644 node_modules/nodemon/package.json create mode 100644 node_modules/nopt/.npmignore create mode 100644 node_modules/nopt/.travis.yml create mode 100644 node_modules/nopt/CHANGELOG.md create mode 100644 node_modules/nopt/LICENSE create mode 100644 node_modules/nopt/README.md create mode 100755 node_modules/nopt/bin/nopt.js create mode 100755 node_modules/nopt/examples/my-program.js create mode 100644 node_modules/nopt/lib/nopt.js create mode 100644 node_modules/nopt/package.json create mode 100644 node_modules/nopt/test/basic.js create mode 100644 node_modules/normalize-path/LICENSE create mode 100644 node_modules/normalize-path/README.md create mode 100644 node_modules/normalize-path/index.js create mode 100644 node_modules/normalize-path/package.json create mode 100644 node_modules/npm-bundled/LICENSE create mode 100644 node_modules/npm-bundled/README.md create mode 100644 node_modules/npm-bundled/index.js create mode 100644 node_modules/npm-bundled/package.json create mode 100644 node_modules/npm-normalize-package-bin/.github/settings.yml create mode 100644 node_modules/npm-normalize-package-bin/.npmignore create mode 100644 node_modules/npm-normalize-package-bin/LICENSE create mode 100644 node_modules/npm-normalize-package-bin/README.md create mode 100644 node_modules/npm-normalize-package-bin/index.js create mode 100644 node_modules/npm-normalize-package-bin/package-lock.json create mode 100644 node_modules/npm-normalize-package-bin/package.json create mode 100644 node_modules/npm-normalize-package-bin/test/array.js create mode 100644 node_modules/npm-normalize-package-bin/test/nobin.js create mode 100644 node_modules/npm-normalize-package-bin/test/object.js create mode 100644 node_modules/npm-normalize-package-bin/test/string.js create mode 100644 node_modules/npm-packlist/LICENSE create mode 100644 node_modules/npm-packlist/README.md create mode 100644 node_modules/npm-packlist/index.js create mode 100644 node_modules/npm-packlist/package.json create mode 100644 node_modules/npm-run-path/index.js create mode 100644 node_modules/npm-run-path/license create mode 100644 node_modules/npm-run-path/package.json create mode 100644 node_modules/npm-run-path/readme.md create mode 100644 node_modules/npmlog/CHANGELOG.md create mode 100644 node_modules/npmlog/LICENSE create mode 100644 node_modules/npmlog/README.md create mode 100644 node_modules/npmlog/log.js create mode 100644 node_modules/npmlog/package.json create mode 100644 node_modules/number-is-nan/index.js create mode 100644 node_modules/number-is-nan/license create mode 100644 node_modules/number-is-nan/package.json create mode 100644 node_modules/number-is-nan/readme.md create mode 100644 node_modules/oauth-sign/LICENSE create mode 100644 node_modules/oauth-sign/README.md create mode 100644 node_modules/oauth-sign/index.js create mode 100644 node_modules/oauth-sign/package.json create mode 100644 node_modules/object-assign/index.js create mode 100644 node_modules/object-assign/license create mode 100644 node_modules/object-assign/package.json create mode 100644 node_modules/object-assign/readme.md create mode 100644 node_modules/object-copy/LICENSE create mode 100644 node_modules/object-copy/index.js create mode 100644 node_modules/object-copy/node_modules/define-property/LICENSE create mode 100644 node_modules/object-copy/node_modules/define-property/README.md create mode 100644 node_modules/object-copy/node_modules/define-property/index.js create mode 100644 node_modules/object-copy/node_modules/define-property/package.json create mode 100644 node_modules/object-copy/node_modules/kind-of/LICENSE create mode 100644 node_modules/object-copy/node_modules/kind-of/README.md create mode 100644 node_modules/object-copy/node_modules/kind-of/index.js create mode 100644 node_modules/object-copy/node_modules/kind-of/package.json create mode 100644 node_modules/object-copy/package.json create mode 100644 node_modules/object-visit/LICENSE create mode 100644 node_modules/object-visit/README.md create mode 100644 node_modules/object-visit/index.js create mode 100644 node_modules/object-visit/package.json create mode 100644 node_modules/object.defaults/LICENSE create mode 100644 node_modules/object.defaults/README.md create mode 100644 node_modules/object.defaults/immutable.js create mode 100644 node_modules/object.defaults/index.js create mode 100644 node_modules/object.defaults/mutable.js create mode 100644 node_modules/object.defaults/package.json create mode 100644 node_modules/object.map/LICENSE create mode 100644 node_modules/object.map/README.md create mode 100644 node_modules/object.map/index.js create mode 100644 node_modules/object.map/package.json create mode 100644 node_modules/object.pick/LICENSE create mode 100644 node_modules/object.pick/README.md create mode 100644 node_modules/object.pick/index.js create mode 100644 node_modules/object.pick/package.json create mode 100644 node_modules/on-finished/HISTORY.md create mode 100644 node_modules/on-finished/LICENSE create mode 100644 node_modules/on-finished/README.md create mode 100644 node_modules/on-finished/index.js create mode 100644 node_modules/on-finished/package.json create mode 100644 node_modules/once/LICENSE create mode 100644 node_modules/once/README.md create mode 100644 node_modules/once/once.js create mode 100644 node_modules/once/package.json create mode 100644 node_modules/os-homedir/index.js create mode 100644 node_modules/os-homedir/license create mode 100644 node_modules/os-homedir/package.json create mode 100644 node_modules/os-homedir/readme.md create mode 100644 node_modules/os-tmpdir/index.js create mode 100644 node_modules/os-tmpdir/license create mode 100644 node_modules/os-tmpdir/package.json create mode 100644 node_modules/os-tmpdir/readme.md create mode 100644 node_modules/osenv/LICENSE create mode 100644 node_modules/osenv/README.md create mode 100644 node_modules/osenv/osenv.js create mode 100644 node_modules/osenv/package.json create mode 100644 node_modules/p-finally/index.js create mode 100644 node_modules/p-finally/license create mode 100644 node_modules/p-finally/package.json create mode 100644 node_modules/p-finally/readme.md create mode 100644 node_modules/package-json/index.js create mode 100644 node_modules/package-json/license create mode 100644 node_modules/package-json/package.json create mode 100644 node_modules/package-json/readme.md create mode 100644 node_modules/parse-filepath/LICENSE create mode 100644 node_modules/parse-filepath/README.md create mode 100644 node_modules/parse-filepath/index.js create mode 100644 node_modules/parse-filepath/package.json create mode 100644 node_modules/parse-passwd/LICENSE create mode 100644 node_modules/parse-passwd/README.md create mode 100644 node_modules/parse-passwd/index.js create mode 100644 node_modules/parse-passwd/package.json create mode 100644 node_modules/parseurl/HISTORY.md create mode 100644 node_modules/parseurl/LICENSE create mode 100644 node_modules/parseurl/README.md create mode 100644 node_modules/parseurl/index.js create mode 100644 node_modules/parseurl/package.json create mode 100644 node_modules/pascalcase/LICENSE create mode 100644 node_modules/pascalcase/README.md create mode 100644 node_modules/pascalcase/index.js create mode 100644 node_modules/pascalcase/package.json create mode 100644 node_modules/path-is-absolute/index.js create mode 100644 node_modules/path-is-absolute/license create mode 100644 node_modules/path-is-absolute/package.json create mode 100644 node_modules/path-is-absolute/readme.md create mode 100644 node_modules/path-is-inside/LICENSE.txt create mode 100644 node_modules/path-is-inside/lib/path-is-inside.js create mode 100644 node_modules/path-is-inside/package.json create mode 100644 node_modules/path-key/index.js create mode 100644 node_modules/path-key/license create mode 100644 node_modules/path-key/package.json create mode 100644 node_modules/path-key/readme.md create mode 100644 node_modules/path-parse/.travis.yml create mode 100644 node_modules/path-parse/LICENSE create mode 100644 node_modules/path-parse/README.md create mode 100644 node_modules/path-parse/index.js create mode 100644 node_modules/path-parse/package.json create mode 100644 node_modules/path-parse/test.js create mode 100644 node_modules/path-root-regex/LICENSE create mode 100644 node_modules/path-root-regex/README.md create mode 100644 node_modules/path-root-regex/index.js create mode 100644 node_modules/path-root-regex/package.json create mode 100644 node_modules/path-root/LICENSE create mode 100644 node_modules/path-root/README.md create mode 100644 node_modules/path-root/index.js create mode 100644 node_modules/path-root/package.json create mode 100644 node_modules/path-to-regexp/History.md create mode 100644 node_modules/path-to-regexp/LICENSE create mode 100644 node_modules/path-to-regexp/Readme.md create mode 100644 node_modules/path-to-regexp/index.js create mode 100644 node_modules/path-to-regexp/package.json create mode 100644 node_modules/performance-now/.npmignore create mode 100644 node_modules/performance-now/.tm_properties create mode 100644 node_modules/performance-now/.travis.yml create mode 100644 node_modules/performance-now/README.md create mode 100644 node_modules/performance-now/lib/performance-now.js create mode 100644 node_modules/performance-now/lib/performance-now.js.map create mode 100644 node_modules/performance-now/license.txt create mode 100644 node_modules/performance-now/package.json create mode 100644 node_modules/performance-now/src/index.d.ts create mode 100644 node_modules/performance-now/src/performance-now.coffee create mode 100644 node_modules/performance-now/test/mocha.opts create mode 100644 node_modules/performance-now/test/performance-now.coffee create mode 100644 node_modules/performance-now/test/scripts.coffee create mode 100755 node_modules/performance-now/test/scripts/delayed-call.coffee create mode 100755 node_modules/performance-now/test/scripts/delayed-require.coffee create mode 100755 node_modules/performance-now/test/scripts/difference.coffee create mode 100755 node_modules/performance-now/test/scripts/initial-value.coffee create mode 100644 node_modules/pg-connection-string/LICENSE create mode 100644 node_modules/pg-connection-string/README.md create mode 100644 node_modules/pg-connection-string/index.d.ts create mode 100644 node_modules/pg-connection-string/index.js create mode 100644 node_modules/pg-connection-string/package.json create mode 100644 node_modules/picomatch/CHANGELOG.md create mode 100644 node_modules/picomatch/LICENSE create mode 100644 node_modules/picomatch/README.md create mode 100644 node_modules/picomatch/index.js create mode 100644 node_modules/picomatch/lib/.DS_Store create mode 100644 node_modules/picomatch/lib/constants.js create mode 100644 node_modules/picomatch/lib/parse.js create mode 100644 node_modules/picomatch/lib/picomatch.js create mode 100644 node_modules/picomatch/lib/scan.js create mode 100644 node_modules/picomatch/lib/utils.js create mode 100644 node_modules/picomatch/package.json create mode 100644 node_modules/pify/index.js create mode 100644 node_modules/pify/license create mode 100644 node_modules/pify/package.json create mode 100644 node_modules/pify/readme.md create mode 100644 node_modules/posix-character-classes/LICENSE create mode 100644 node_modules/posix-character-classes/README.md create mode 100644 node_modules/posix-character-classes/index.js create mode 100644 node_modules/posix-character-classes/package.json create mode 100644 node_modules/prepend-http/index.js create mode 100644 node_modules/prepend-http/license create mode 100644 node_modules/prepend-http/package.json create mode 100644 node_modules/prepend-http/readme.md create mode 100644 node_modules/process-nextick-args/index.js create mode 100644 node_modules/process-nextick-args/license.md create mode 100644 node_modules/process-nextick-args/package.json create mode 100644 node_modules/process-nextick-args/readme.md create mode 100644 node_modules/proxy-addr/HISTORY.md create mode 100644 node_modules/proxy-addr/LICENSE create mode 100644 node_modules/proxy-addr/README.md create mode 100644 node_modules/proxy-addr/index.js create mode 100644 node_modules/proxy-addr/package.json create mode 100644 node_modules/pseudomap/LICENSE create mode 100644 node_modules/pseudomap/README.md create mode 100644 node_modules/pseudomap/map.js create mode 100644 node_modules/pseudomap/package.json create mode 100644 node_modules/pseudomap/pseudomap.js create mode 100644 node_modules/pseudomap/test/basic.js create mode 100644 node_modules/psl/LICENSE create mode 100644 node_modules/psl/README.md create mode 100644 node_modules/psl/browserstack-logo.svg create mode 100644 node_modules/psl/data/rules.json create mode 100644 node_modules/psl/dist/psl.js create mode 100644 node_modules/psl/dist/psl.min.js create mode 100644 node_modules/psl/index.js create mode 100644 node_modules/psl/package.json create mode 100644 node_modules/pstree.remy/.travis.yml create mode 100644 node_modules/pstree.remy/LICENSE create mode 100644 node_modules/pstree.remy/lib/index.js create mode 100644 node_modules/pstree.remy/lib/tree.js create mode 100644 node_modules/pstree.remy/lib/utils.js create mode 100644 node_modules/pstree.remy/package.json create mode 100644 node_modules/pstree.remy/tests/fixtures/index.js create mode 100644 node_modules/pstree.remy/tests/fixtures/out1 create mode 100644 node_modules/pstree.remy/tests/fixtures/out2 create mode 100644 node_modules/pstree.remy/tests/index.test.js create mode 100644 node_modules/punycode/LICENSE-MIT.txt create mode 100644 node_modules/punycode/README.md create mode 100644 node_modules/punycode/package.json create mode 100644 node_modules/punycode/punycode.es6.js create mode 100644 node_modules/punycode/punycode.js create mode 100644 node_modules/qs/.editorconfig create mode 100644 node_modules/qs/.eslintignore create mode 100644 node_modules/qs/.eslintrc create mode 100644 node_modules/qs/CHANGELOG.md create mode 100644 node_modules/qs/LICENSE create mode 100644 node_modules/qs/README.md create mode 100644 node_modules/qs/dist/qs.js create mode 100644 node_modules/qs/lib/formats.js create mode 100644 node_modules/qs/lib/index.js create mode 100644 node_modules/qs/lib/parse.js create mode 100644 node_modules/qs/lib/stringify.js create mode 100644 node_modules/qs/lib/utils.js create mode 100644 node_modules/qs/package.json create mode 100644 node_modules/qs/test/.eslintrc create mode 100644 node_modules/qs/test/index.js create mode 100644 node_modules/qs/test/parse.js create mode 100644 node_modules/qs/test/stringify.js create mode 100644 node_modules/qs/test/utils.js create mode 100644 node_modules/range-parser/HISTORY.md create mode 100644 node_modules/range-parser/LICENSE create mode 100644 node_modules/range-parser/README.md create mode 100644 node_modules/range-parser/index.js create mode 100644 node_modules/range-parser/package.json create mode 100644 node_modules/raw-body/HISTORY.md create mode 100644 node_modules/raw-body/LICENSE create mode 100644 node_modules/raw-body/README.md create mode 100644 node_modules/raw-body/index.d.ts create mode 100644 node_modules/raw-body/index.js create mode 100644 node_modules/raw-body/package.json create mode 100644 node_modules/rc/LICENSE.APACHE2 create mode 100644 node_modules/rc/LICENSE.BSD create mode 100644 node_modules/rc/LICENSE.MIT create mode 100644 node_modules/rc/README.md create mode 100644 node_modules/rc/browser.js create mode 100755 node_modules/rc/cli.js create mode 100755 node_modules/rc/index.js create mode 100644 node_modules/rc/lib/utils.js create mode 100644 node_modules/rc/node_modules/minimist/.travis.yml create mode 100644 node_modules/rc/node_modules/minimist/LICENSE create mode 100644 node_modules/rc/node_modules/minimist/example/parse.js create mode 100644 node_modules/rc/node_modules/minimist/index.js create mode 100644 node_modules/rc/node_modules/minimist/package.json create mode 100644 node_modules/rc/node_modules/minimist/readme.markdown create mode 100644 node_modules/rc/node_modules/minimist/test/all_bool.js create mode 100644 node_modules/rc/node_modules/minimist/test/bool.js create mode 100644 node_modules/rc/node_modules/minimist/test/dash.js create mode 100644 node_modules/rc/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/rc/node_modules/minimist/test/dotted.js create mode 100644 node_modules/rc/node_modules/minimist/test/kv_short.js create mode 100644 node_modules/rc/node_modules/minimist/test/long.js create mode 100644 node_modules/rc/node_modules/minimist/test/num.js create mode 100644 node_modules/rc/node_modules/minimist/test/parse.js create mode 100644 node_modules/rc/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/rc/node_modules/minimist/test/proto.js create mode 100644 node_modules/rc/node_modules/minimist/test/short.js create mode 100644 node_modules/rc/node_modules/minimist/test/stop_early.js create mode 100644 node_modules/rc/node_modules/minimist/test/unknown.js create mode 100644 node_modules/rc/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/rc/package.json create mode 100644 node_modules/rc/test/ini.js create mode 100644 node_modules/rc/test/nested-env-vars.js create mode 100644 node_modules/rc/test/test.js create mode 100644 node_modules/readable-stream/.travis.yml create mode 100644 node_modules/readable-stream/CONTRIBUTING.md create mode 100644 node_modules/readable-stream/GOVERNANCE.md create mode 100644 node_modules/readable-stream/LICENSE create mode 100644 node_modules/readable-stream/README.md create mode 100644 node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 node_modules/readable-stream/duplex-browser.js create mode 100644 node_modules/readable-stream/duplex.js create mode 100644 node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 node_modules/readable-stream/package.json create mode 100644 node_modules/readable-stream/passthrough.js create mode 100644 node_modules/readable-stream/readable-browser.js create mode 100644 node_modules/readable-stream/readable.js create mode 100644 node_modules/readable-stream/transform.js create mode 100644 node_modules/readable-stream/writable-browser.js create mode 100644 node_modules/readable-stream/writable.js create mode 100644 node_modules/readdirp/LICENSE create mode 100644 node_modules/readdirp/README.md create mode 100644 node_modules/readdirp/index.d.ts create mode 100644 node_modules/readdirp/index.js create mode 100644 node_modules/readdirp/package.json create mode 100644 node_modules/rechoir/.npmignore create mode 100644 node_modules/rechoir/.travis.yml create mode 100644 node_modules/rechoir/CHANGELOG create mode 100644 node_modules/rechoir/LICENSE create mode 100644 node_modules/rechoir/README.md create mode 100644 node_modules/rechoir/index.js create mode 100644 node_modules/rechoir/lib/extension.js create mode 100644 node_modules/rechoir/lib/normalize.js create mode 100644 node_modules/rechoir/lib/register.js create mode 100644 node_modules/rechoir/package.json create mode 100644 node_modules/referrer-policy/CHANGELOG.md create mode 100644 node_modules/referrer-policy/LICENSE create mode 100644 node_modules/referrer-policy/README.md create mode 100644 node_modules/referrer-policy/dist/index.d.ts create mode 100644 node_modules/referrer-policy/dist/index.js create mode 100644 node_modules/referrer-policy/package.json create mode 100644 node_modules/regex-not/LICENSE create mode 100644 node_modules/regex-not/README.md create mode 100644 node_modules/regex-not/index.js create mode 100644 node_modules/regex-not/package.json create mode 100644 node_modules/registry-auth-token/.npmignore create mode 100644 node_modules/registry-auth-token/CHANGELOG.md create mode 100644 node_modules/registry-auth-token/LICENSE create mode 100644 node_modules/registry-auth-token/README.md create mode 100644 node_modules/registry-auth-token/base64.js create mode 100644 node_modules/registry-auth-token/index.js create mode 100644 node_modules/registry-auth-token/package.json create mode 100644 node_modules/registry-auth-token/registry-url.js create mode 100644 node_modules/registry-auth-token/test/auth-token.test.js create mode 100644 node_modules/registry-auth-token/test/registry-url.test.js create mode 100644 node_modules/registry-auth-token/yarn.lock create mode 100644 node_modules/registry-url/index.js create mode 100644 node_modules/registry-url/license create mode 100644 node_modules/registry-url/package.json create mode 100644 node_modules/registry-url/readme.md create mode 100644 node_modules/repeat-element/LICENSE create mode 100644 node_modules/repeat-element/README.md create mode 100644 node_modules/repeat-element/index.js create mode 100644 node_modules/repeat-element/package.json create mode 100644 node_modules/repeat-string/LICENSE create mode 100644 node_modules/repeat-string/README.md create mode 100644 node_modules/repeat-string/index.js create mode 100644 node_modules/repeat-string/package.json create mode 100644 node_modules/request/CHANGELOG.md create mode 100644 node_modules/request/LICENSE create mode 100644 node_modules/request/README.md create mode 100755 node_modules/request/index.js create mode 100644 node_modules/request/lib/auth.js create mode 100644 node_modules/request/lib/cookies.js create mode 100644 node_modules/request/lib/getProxyFromURI.js create mode 100644 node_modules/request/lib/har.js create mode 100644 node_modules/request/lib/hawk.js create mode 100644 node_modules/request/lib/helpers.js create mode 100644 node_modules/request/lib/multipart.js create mode 100644 node_modules/request/lib/oauth.js create mode 100644 node_modules/request/lib/querystring.js create mode 100644 node_modules/request/lib/redirect.js create mode 100644 node_modules/request/lib/tunnel.js create mode 100644 node_modules/request/node_modules/qs/.editorconfig create mode 100644 node_modules/request/node_modules/qs/.eslintignore create mode 100644 node_modules/request/node_modules/qs/.eslintrc create mode 100644 node_modules/request/node_modules/qs/CHANGELOG.md create mode 100644 node_modules/request/node_modules/qs/LICENSE create mode 100644 node_modules/request/node_modules/qs/README.md create mode 100644 node_modules/request/node_modules/qs/dist/qs.js create mode 100644 node_modules/request/node_modules/qs/lib/formats.js create mode 100644 node_modules/request/node_modules/qs/lib/index.js create mode 100644 node_modules/request/node_modules/qs/lib/parse.js create mode 100644 node_modules/request/node_modules/qs/lib/stringify.js create mode 100644 node_modules/request/node_modules/qs/lib/utils.js create mode 100644 node_modules/request/node_modules/qs/package.json create mode 100644 node_modules/request/node_modules/qs/test/.eslintrc create mode 100644 node_modules/request/node_modules/qs/test/index.js create mode 100644 node_modules/request/node_modules/qs/test/parse.js create mode 100644 node_modules/request/node_modules/qs/test/stringify.js create mode 100644 node_modules/request/node_modules/qs/test/utils.js create mode 100644 node_modules/request/package.json create mode 100644 node_modules/request/request.js create mode 100644 node_modules/resolve-dir/LICENSE create mode 100644 node_modules/resolve-dir/README.md create mode 100644 node_modules/resolve-dir/index.js create mode 100644 node_modules/resolve-dir/package.json create mode 100644 node_modules/resolve-url/.jshintrc create mode 100644 node_modules/resolve-url/LICENSE create mode 100644 node_modules/resolve-url/bower.json create mode 100644 node_modules/resolve-url/changelog.md create mode 100644 node_modules/resolve-url/component.json create mode 100644 node_modules/resolve-url/package.json create mode 100644 node_modules/resolve-url/readme.md create mode 100644 node_modules/resolve-url/resolve-url.js create mode 100644 node_modules/resolve-url/test/resolve-url.js create mode 100644 node_modules/resolve/.eslintignore create mode 100644 node_modules/resolve/.eslintrc create mode 100644 node_modules/resolve/.travis.yml create mode 100644 node_modules/resolve/LICENSE create mode 100644 node_modules/resolve/appveyor.yml create mode 100644 node_modules/resolve/example/async.js create mode 100644 node_modules/resolve/example/sync.js create mode 100644 node_modules/resolve/index.js create mode 100644 node_modules/resolve/lib/async.js create mode 100644 node_modules/resolve/lib/caller.js create mode 100644 node_modules/resolve/lib/core.js create mode 100644 node_modules/resolve/lib/core.json create mode 100644 node_modules/resolve/lib/is-core.js create mode 100644 node_modules/resolve/lib/node-modules-paths.js create mode 100644 node_modules/resolve/lib/normalize-options.js create mode 100644 node_modules/resolve/lib/sync.js create mode 100644 node_modules/resolve/package.json create mode 100644 node_modules/resolve/readme.markdown create mode 100644 node_modules/resolve/test/.eslintrc create mode 100644 node_modules/resolve/test/core.js create mode 100644 node_modules/resolve/test/dotdot.js create mode 100644 node_modules/resolve/test/dotdot/abc/index.js create mode 100644 node_modules/resolve/test/dotdot/index.js create mode 100644 node_modules/resolve/test/faulty_basedir.js create mode 100644 node_modules/resolve/test/filter.js create mode 100644 node_modules/resolve/test/filter_sync.js create mode 100644 node_modules/resolve/test/mock.js create mode 100644 node_modules/resolve/test/mock_sync.js create mode 100644 node_modules/resolve/test/module_dir.js create mode 100644 node_modules/resolve/test/module_dir/xmodules/aaa/index.js create mode 100644 node_modules/resolve/test/module_dir/ymodules/aaa/index.js create mode 100644 node_modules/resolve/test/module_dir/zmodules/bbb/main.js create mode 100644 node_modules/resolve/test/module_dir/zmodules/bbb/package.json create mode 100644 node_modules/resolve/test/node-modules-paths.js create mode 100644 node_modules/resolve/test/node_path.js create mode 100644 node_modules/resolve/test/node_path/x/aaa/index.js create mode 100644 node_modules/resolve/test/node_path/x/ccc/index.js create mode 100644 node_modules/resolve/test/node_path/y/bbb/index.js create mode 100644 node_modules/resolve/test/node_path/y/ccc/index.js create mode 100644 node_modules/resolve/test/nonstring.js create mode 100644 node_modules/resolve/test/pathfilter.js create mode 100644 node_modules/resolve/test/pathfilter/deep_ref/main.js create mode 100644 node_modules/resolve/test/precedence.js create mode 100644 node_modules/resolve/test/precedence/aaa.js create mode 100644 node_modules/resolve/test/precedence/aaa/index.js create mode 100644 node_modules/resolve/test/precedence/aaa/main.js create mode 100644 node_modules/resolve/test/precedence/bbb.js create mode 100644 node_modules/resolve/test/precedence/bbb/main.js create mode 100644 node_modules/resolve/test/resolver.js create mode 100644 node_modules/resolve/test/resolver/baz/doom.js create mode 100644 node_modules/resolve/test/resolver/baz/package.json create mode 100644 node_modules/resolve/test/resolver/baz/quux.js create mode 100644 node_modules/resolve/test/resolver/browser_field/a.js create mode 100644 node_modules/resolve/test/resolver/browser_field/b.js create mode 100644 node_modules/resolve/test/resolver/browser_field/package.json create mode 100644 node_modules/resolve/test/resolver/cup.coffee create mode 100644 node_modules/resolve/test/resolver/dot_main/index.js create mode 100644 node_modules/resolve/test/resolver/dot_main/package.json create mode 100644 node_modules/resolve/test/resolver/dot_slash_main/index.js create mode 100644 node_modules/resolve/test/resolver/dot_slash_main/package.json create mode 100644 node_modules/resolve/test/resolver/foo.js create mode 100644 node_modules/resolve/test/resolver/incorrect_main/index.js create mode 100644 node_modules/resolve/test/resolver/incorrect_main/package.json create mode 100644 node_modules/resolve/test/resolver/invalid_main/package.json create mode 100644 node_modules/resolve/test/resolver/mug.coffee create mode 100644 node_modules/resolve/test/resolver/mug.js create mode 100644 node_modules/resolve/test/resolver/multirepo/lerna.json create mode 100644 node_modules/resolve/test/resolver/multirepo/package.json create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js create mode 100644 node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json create mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js create mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json create mode 100644 node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js create mode 100644 node_modules/resolve/test/resolver/other_path/lib/other-lib.js create mode 100644 node_modules/resolve/test/resolver/other_path/root.js create mode 100644 node_modules/resolve/test/resolver/quux/foo/index.js create mode 100644 node_modules/resolve/test/resolver/same_names/foo.js create mode 100644 node_modules/resolve/test/resolver/same_names/foo/index.js create mode 100644 node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js create mode 100644 node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep create mode 100644 node_modules/resolve/test/resolver/symlinked/package/bar.js create mode 100644 node_modules/resolve/test/resolver/symlinked/package/package.json create mode 100644 node_modules/resolve/test/resolver/without_basedir/main.js create mode 100644 node_modules/resolve/test/resolver_sync.js create mode 100644 node_modules/resolve/test/shadowed_core.js create mode 100644 node_modules/resolve/test/shadowed_core/node_modules/util/index.js create mode 100644 node_modules/resolve/test/subdirs.js create mode 100644 node_modules/resolve/test/symlinks.js create mode 100644 node_modules/ret/LICENSE create mode 100644 node_modules/ret/README.md create mode 100644 node_modules/ret/lib/index.js create mode 100644 node_modules/ret/lib/positions.js create mode 100644 node_modules/ret/lib/sets.js create mode 100644 node_modules/ret/lib/types.js create mode 100644 node_modules/ret/lib/util.js create mode 100644 node_modules/ret/package.json create mode 100644 node_modules/rimraf/LICENSE create mode 100644 node_modules/rimraf/README.md create mode 100755 node_modules/rimraf/bin.js create mode 100644 node_modules/rimraf/package.json create mode 100644 node_modules/rimraf/rimraf.js create mode 100644 node_modules/safe-buffer/LICENSE create mode 100644 node_modules/safe-buffer/README.md create mode 100644 node_modules/safe-buffer/index.d.ts create mode 100644 node_modules/safe-buffer/index.js create mode 100644 node_modules/safe-buffer/package.json create mode 100644 node_modules/safe-regex/.travis.yml create mode 100644 node_modules/safe-regex/LICENSE create mode 100644 node_modules/safe-regex/example/safe.js create mode 100644 node_modules/safe-regex/index.js create mode 100644 node_modules/safe-regex/package.json create mode 100644 node_modules/safe-regex/readme.markdown create mode 100644 node_modules/safe-regex/test/regex.js create mode 100644 node_modules/safer-buffer/LICENSE create mode 100644 node_modules/safer-buffer/Porting-Buffer.md create mode 100644 node_modules/safer-buffer/Readme.md create mode 100644 node_modules/safer-buffer/dangerous.js create mode 100644 node_modules/safer-buffer/package.json create mode 100644 node_modules/safer-buffer/safer.js create mode 100644 node_modules/safer-buffer/tests.js create mode 100644 node_modules/sax/LICENSE create mode 100644 node_modules/sax/README.md create mode 100644 node_modules/sax/lib/sax.js create mode 100644 node_modules/sax/package.json create mode 100644 node_modules/semver-diff/index.js create mode 100644 node_modules/semver-diff/license create mode 100644 node_modules/semver-diff/package.json create mode 100644 node_modules/semver-diff/readme.md create mode 100644 node_modules/semver/CHANGELOG.md create mode 100644 node_modules/semver/LICENSE create mode 100644 node_modules/semver/README.md create mode 100755 node_modules/semver/bin/semver create mode 100644 node_modules/semver/package.json create mode 100644 node_modules/semver/range.bnf create mode 100644 node_modules/semver/semver.js create mode 100644 node_modules/send/HISTORY.md create mode 100644 node_modules/send/LICENSE create mode 100644 node_modules/send/README.md create mode 100644 node_modules/send/index.js create mode 100644 node_modules/send/node_modules/ms/index.js create mode 100644 node_modules/send/node_modules/ms/license.md create mode 100644 node_modules/send/node_modules/ms/package.json create mode 100644 node_modules/send/node_modules/ms/readme.md create mode 100644 node_modules/send/package.json create mode 100644 node_modules/serve-static/HISTORY.md create mode 100644 node_modules/serve-static/LICENSE create mode 100644 node_modules/serve-static/README.md create mode 100644 node_modules/serve-static/index.js create mode 100644 node_modules/serve-static/package.json create mode 100644 node_modules/set-blocking/CHANGELOG.md create mode 100644 node_modules/set-blocking/LICENSE.txt create mode 100644 node_modules/set-blocking/README.md create mode 100644 node_modules/set-blocking/index.js create mode 100644 node_modules/set-blocking/package.json create mode 100644 node_modules/set-value/LICENSE create mode 100644 node_modules/set-value/README.md create mode 100644 node_modules/set-value/index.js create mode 100644 node_modules/set-value/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/set-value/node_modules/extend-shallow/README.md create mode 100644 node_modules/set-value/node_modules/extend-shallow/index.js create mode 100644 node_modules/set-value/node_modules/extend-shallow/package.json create mode 100644 node_modules/set-value/package.json create mode 100644 node_modules/setprototypeof/LICENSE create mode 100644 node_modules/setprototypeof/README.md create mode 100644 node_modules/setprototypeof/index.d.ts create mode 100644 node_modules/setprototypeof/index.js create mode 100644 node_modules/setprototypeof/package.json create mode 100644 node_modules/setprototypeof/test/index.js create mode 100644 node_modules/shebang-command/index.js create mode 100644 node_modules/shebang-command/license create mode 100644 node_modules/shebang-command/package.json create mode 100644 node_modules/shebang-command/readme.md create mode 100644 node_modules/shebang-regex/index.js create mode 100644 node_modules/shebang-regex/license create mode 100644 node_modules/shebang-regex/package.json create mode 100644 node_modules/shebang-regex/readme.md create mode 100644 node_modules/signal-exit/CHANGELOG.md create mode 100644 node_modules/signal-exit/LICENSE.txt create mode 100644 node_modules/signal-exit/README.md create mode 100644 node_modules/signal-exit/index.js create mode 100644 node_modules/signal-exit/package.json create mode 100644 node_modules/signal-exit/signals.js create mode 100644 node_modules/snapdragon-node/LICENSE create mode 100644 node_modules/snapdragon-node/README.md create mode 100644 node_modules/snapdragon-node/index.js create mode 100644 node_modules/snapdragon-node/node_modules/define-property/LICENSE create mode 100644 node_modules/snapdragon-node/node_modules/define-property/README.md create mode 100644 node_modules/snapdragon-node/node_modules/define-property/index.js create mode 100644 node_modules/snapdragon-node/node_modules/define-property/package.json create mode 100644 node_modules/snapdragon-node/node_modules/is-accessor-descriptor/LICENSE create mode 100644 node_modules/snapdragon-node/node_modules/is-accessor-descriptor/README.md create mode 100644 node_modules/snapdragon-node/node_modules/is-accessor-descriptor/index.js create mode 100644 node_modules/snapdragon-node/node_modules/is-accessor-descriptor/package.json create mode 100644 node_modules/snapdragon-node/node_modules/is-data-descriptor/LICENSE create mode 100644 node_modules/snapdragon-node/node_modules/is-data-descriptor/README.md create mode 100644 node_modules/snapdragon-node/node_modules/is-data-descriptor/index.js create mode 100644 node_modules/snapdragon-node/node_modules/is-data-descriptor/package.json create mode 100644 node_modules/snapdragon-node/node_modules/is-descriptor/LICENSE create mode 100644 node_modules/snapdragon-node/node_modules/is-descriptor/README.md create mode 100644 node_modules/snapdragon-node/node_modules/is-descriptor/index.js create mode 100644 node_modules/snapdragon-node/node_modules/is-descriptor/package.json create mode 100644 node_modules/snapdragon-node/package.json create mode 100644 node_modules/snapdragon-util/LICENSE create mode 100644 node_modules/snapdragon-util/README.md create mode 100644 node_modules/snapdragon-util/index.js create mode 100644 node_modules/snapdragon-util/node_modules/kind-of/LICENSE create mode 100644 node_modules/snapdragon-util/node_modules/kind-of/README.md create mode 100644 node_modules/snapdragon-util/node_modules/kind-of/index.js create mode 100644 node_modules/snapdragon-util/node_modules/kind-of/package.json create mode 100644 node_modules/snapdragon-util/package.json create mode 100644 node_modules/snapdragon/LICENSE create mode 100644 node_modules/snapdragon/README.md create mode 100644 node_modules/snapdragon/index.js create mode 100644 node_modules/snapdragon/lib/compiler.js create mode 100644 node_modules/snapdragon/lib/parser.js create mode 100644 node_modules/snapdragon/lib/position.js create mode 100644 node_modules/snapdragon/lib/source-maps.js create mode 100644 node_modules/snapdragon/lib/utils.js create mode 100644 node_modules/snapdragon/node_modules/define-property/LICENSE create mode 100644 node_modules/snapdragon/node_modules/define-property/README.md create mode 100644 node_modules/snapdragon/node_modules/define-property/index.js create mode 100644 node_modules/snapdragon/node_modules/define-property/package.json create mode 100644 node_modules/snapdragon/node_modules/extend-shallow/LICENSE create mode 100644 node_modules/snapdragon/node_modules/extend-shallow/README.md create mode 100644 node_modules/snapdragon/node_modules/extend-shallow/index.js create mode 100644 node_modules/snapdragon/node_modules/extend-shallow/package.json create mode 100644 node_modules/snapdragon/package.json create mode 100644 node_modules/source-map-resolve/LICENSE create mode 100644 node_modules/source-map-resolve/changelog.md create mode 100644 node_modules/source-map-resolve/lib/decode-uri-component.js create mode 100644 node_modules/source-map-resolve/lib/resolve-url.js create mode 100644 node_modules/source-map-resolve/lib/source-map-resolve-node.js create mode 100644 node_modules/source-map-resolve/package.json create mode 100644 node_modules/source-map-resolve/readme.md create mode 100644 node_modules/source-map-resolve/source-map-resolve.js create mode 100644 node_modules/source-map-url/.jshintrc create mode 100644 node_modules/source-map-url/LICENSE create mode 100644 node_modules/source-map-url/bower.json create mode 100644 node_modules/source-map-url/changelog.md create mode 100644 node_modules/source-map-url/component.json create mode 100644 node_modules/source-map-url/package.json create mode 100644 node_modules/source-map-url/readme.md create mode 100644 node_modules/source-map-url/source-map-url.js create mode 100644 node_modules/source-map-url/test/source-map-url.js create mode 100644 node_modules/source-map-url/x-package.json5 create mode 100644 node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/source-map/LICENSE create mode 100644 node_modules/source-map/README.md create mode 100644 node_modules/source-map/dist/source-map.debug.js create mode 100644 node_modules/source-map/dist/source-map.js create mode 100644 node_modules/source-map/dist/source-map.min.js create mode 100644 node_modules/source-map/dist/source-map.min.js.map create mode 100644 node_modules/source-map/lib/array-set.js create mode 100644 node_modules/source-map/lib/base64-vlq.js create mode 100644 node_modules/source-map/lib/base64.js create mode 100644 node_modules/source-map/lib/binary-search.js create mode 100644 node_modules/source-map/lib/mapping-list.js create mode 100644 node_modules/source-map/lib/quick-sort.js create mode 100644 node_modules/source-map/lib/source-map-consumer.js create mode 100644 node_modules/source-map/lib/source-map-generator.js create mode 100644 node_modules/source-map/lib/source-node.js create mode 100644 node_modules/source-map/lib/util.js create mode 100644 node_modules/source-map/package.json create mode 100644 node_modules/source-map/source-map.js create mode 100644 node_modules/split-string/LICENSE create mode 100644 node_modules/split-string/README.md create mode 100644 node_modules/split-string/index.js create mode 100644 node_modules/split-string/package.json create mode 100644 node_modules/sqlite3/.dockerignore create mode 100644 node_modules/sqlite3/CHANGELOG.md create mode 100644 node_modules/sqlite3/CONTRIBUTING.md create mode 100755 node_modules/sqlite3/Dockerfile create mode 100644 node_modules/sqlite3/LICENSE create mode 100644 node_modules/sqlite3/README.md create mode 100644 node_modules/sqlite3/binding.gyp create mode 100644 node_modules/sqlite3/deps/common-sqlite.gypi create mode 100644 node_modules/sqlite3/deps/extract.py create mode 100644 node_modules/sqlite3/deps/sqlite-autoconf-3300100.tar.gz create mode 100755 node_modules/sqlite3/deps/sqlite3.gyp create mode 100755 node_modules/sqlite3/lib/binding/node-v72-linux-x64/node_sqlite3.node create mode 100644 node_modules/sqlite3/lib/index.js create mode 100644 node_modules/sqlite3/lib/sqlite3.js create mode 100644 node_modules/sqlite3/lib/trace.js create mode 100644 node_modules/sqlite3/package.json create mode 100644 node_modules/sqlite3/sqlite3.js create mode 100644 node_modules/sqlite3/src/async.h create mode 100644 node_modules/sqlite3/src/backup.cc create mode 100644 node_modules/sqlite3/src/backup.h create mode 100644 node_modules/sqlite3/src/database.cc create mode 100644 node_modules/sqlite3/src/database.h create mode 100644 node_modules/sqlite3/src/gcc-preinclude.h create mode 100644 node_modules/sqlite3/src/macros.h create mode 100644 node_modules/sqlite3/src/node_sqlite3.cc create mode 100644 node_modules/sqlite3/src/statement.cc create mode 100644 node_modules/sqlite3/src/statement.h create mode 100644 node_modules/sqlite3/src/threading.h create mode 100755 node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile create mode 100755 node_modules/sqlite3/tools/docker/architecture/linux-arm/run.sh create mode 100755 node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile create mode 100755 node_modules/sqlite3/tools/docker/architecture/linux-arm64/run.sh create mode 100644 node_modules/sshpk/.npmignore create mode 100644 node_modules/sshpk/.travis.yml create mode 100644 node_modules/sshpk/LICENSE create mode 100644 node_modules/sshpk/README.md create mode 100755 node_modules/sshpk/bin/sshpk-conv create mode 100755 node_modules/sshpk/bin/sshpk-sign create mode 100755 node_modules/sshpk/bin/sshpk-verify create mode 100644 node_modules/sshpk/lib/algs.js create mode 100644 node_modules/sshpk/lib/certificate.js create mode 100644 node_modules/sshpk/lib/dhe.js create mode 100644 node_modules/sshpk/lib/ed-compat.js create mode 100644 node_modules/sshpk/lib/errors.js create mode 100644 node_modules/sshpk/lib/fingerprint.js create mode 100644 node_modules/sshpk/lib/formats/auto.js create mode 100644 node_modules/sshpk/lib/formats/dnssec.js create mode 100644 node_modules/sshpk/lib/formats/openssh-cert.js create mode 100644 node_modules/sshpk/lib/formats/pem.js create mode 100644 node_modules/sshpk/lib/formats/pkcs1.js create mode 100644 node_modules/sshpk/lib/formats/pkcs8.js create mode 100644 node_modules/sshpk/lib/formats/putty.js create mode 100644 node_modules/sshpk/lib/formats/rfc4253.js create mode 100644 node_modules/sshpk/lib/formats/ssh-private.js create mode 100644 node_modules/sshpk/lib/formats/ssh.js create mode 100644 node_modules/sshpk/lib/formats/x509-pem.js create mode 100644 node_modules/sshpk/lib/formats/x509.js create mode 100644 node_modules/sshpk/lib/identity.js create mode 100644 node_modules/sshpk/lib/index.js create mode 100644 node_modules/sshpk/lib/key.js create mode 100644 node_modules/sshpk/lib/private-key.js create mode 100644 node_modules/sshpk/lib/signature.js create mode 100644 node_modules/sshpk/lib/ssh-buffer.js create mode 100644 node_modules/sshpk/lib/utils.js create mode 100644 node_modules/sshpk/man/man1/sshpk-conv.1 create mode 100644 node_modules/sshpk/man/man1/sshpk-sign.1 create mode 100644 node_modules/sshpk/man/man1/sshpk-verify.1 create mode 100644 node_modules/sshpk/package.json create mode 100644 node_modules/static-extend/LICENSE create mode 100644 node_modules/static-extend/index.js create mode 100644 node_modules/static-extend/node_modules/define-property/LICENSE create mode 100644 node_modules/static-extend/node_modules/define-property/README.md create mode 100644 node_modules/static-extend/node_modules/define-property/index.js create mode 100644 node_modules/static-extend/node_modules/define-property/package.json create mode 100644 node_modules/static-extend/package.json create mode 100644 node_modules/statuses/HISTORY.md create mode 100644 node_modules/statuses/LICENSE create mode 100644 node_modules/statuses/README.md create mode 100644 node_modules/statuses/codes.json create mode 100644 node_modules/statuses/index.js create mode 100644 node_modules/statuses/package.json create mode 100644 node_modules/string-width/index.js create mode 100644 node_modules/string-width/license create mode 100644 node_modules/string-width/package.json create mode 100644 node_modules/string-width/readme.md create mode 100644 node_modules/string_decoder/.travis.yml create mode 100644 node_modules/string_decoder/LICENSE create mode 100644 node_modules/string_decoder/README.md create mode 100644 node_modules/string_decoder/lib/string_decoder.js create mode 100644 node_modules/string_decoder/package.json create mode 100644 node_modules/strip-ansi/index.js create mode 100644 node_modules/strip-ansi/license create mode 100644 node_modules/strip-ansi/package.json create mode 100644 node_modules/strip-ansi/readme.md create mode 100644 node_modules/strip-eof/index.js create mode 100644 node_modules/strip-eof/license create mode 100644 node_modules/strip-eof/package.json create mode 100644 node_modules/strip-eof/readme.md create mode 100644 node_modules/strip-json-comments/index.js create mode 100644 node_modules/strip-json-comments/license create mode 100644 node_modules/strip-json-comments/package.json create mode 100644 node_modules/strip-json-comments/readme.md create mode 100644 node_modules/supports-color/browser.js create mode 100644 node_modules/supports-color/index.js create mode 100644 node_modules/supports-color/license create mode 100644 node_modules/supports-color/package.json create mode 100644 node_modules/supports-color/readme.md create mode 100644 node_modules/tar/LICENSE create mode 100644 node_modules/tar/README.md create mode 100644 node_modules/tar/index.js create mode 100644 node_modules/tar/lib/buffer.js create mode 100644 node_modules/tar/lib/create.js create mode 100644 node_modules/tar/lib/extract.js create mode 100644 node_modules/tar/lib/header.js create mode 100644 node_modules/tar/lib/high-level-opt.js create mode 100644 node_modules/tar/lib/large-numbers.js create mode 100644 node_modules/tar/lib/list.js create mode 100644 node_modules/tar/lib/mkdir.js create mode 100644 node_modules/tar/lib/mode-fix.js create mode 100644 node_modules/tar/lib/pack.js create mode 100644 node_modules/tar/lib/parse.js create mode 100644 node_modules/tar/lib/pax.js create mode 100644 node_modules/tar/lib/read-entry.js create mode 100644 node_modules/tar/lib/replace.js create mode 100644 node_modules/tar/lib/types.js create mode 100644 node_modules/tar/lib/unpack.js create mode 100644 node_modules/tar/lib/update.js create mode 100644 node_modules/tar/lib/warn-mixin.js create mode 100644 node_modules/tar/lib/winchars.js create mode 100644 node_modules/tar/lib/write-entry.js create mode 100644 node_modules/tar/package.json create mode 100644 node_modules/tarn/LICENSE create mode 100644 node_modules/tarn/README.md create mode 100644 node_modules/tarn/lib/PendingOperation.d.ts create mode 100644 node_modules/tarn/lib/PendingOperation.js create mode 100644 node_modules/tarn/lib/Pool.d.ts create mode 100644 node_modules/tarn/lib/Pool.js create mode 100644 node_modules/tarn/lib/PromiseInspection.d.ts create mode 100644 node_modules/tarn/lib/PromiseInspection.js create mode 100644 node_modules/tarn/lib/Resource.d.ts create mode 100644 node_modules/tarn/lib/Resource.js create mode 100644 node_modules/tarn/lib/TimeoutError.d.ts create mode 100644 node_modules/tarn/lib/TimeoutError.js create mode 100644 node_modules/tarn/lib/tarn.d.ts create mode 100644 node_modules/tarn/lib/tarn.js create mode 100644 node_modules/tarn/lib/utils.d.ts create mode 100644 node_modules/tarn/lib/utils.js create mode 100644 node_modules/tarn/package.json create mode 100644 node_modules/term-size/index.js create mode 100644 node_modules/term-size/license create mode 100644 node_modules/term-size/package.json create mode 100644 node_modules/term-size/readme.md create mode 100755 node_modules/term-size/vendor/macos/term-size create mode 100644 node_modules/term-size/vendor/windows/term-size.exe create mode 100644 node_modules/tildify/index.d.ts create mode 100644 node_modules/tildify/index.js create mode 100644 node_modules/tildify/license create mode 100644 node_modules/tildify/package.json create mode 100644 node_modules/tildify/readme.md create mode 100644 node_modules/timed-out/index.js create mode 100644 node_modules/timed-out/license create mode 100644 node_modules/timed-out/package.json create mode 100644 node_modules/timed-out/readme.md create mode 100644 node_modules/to-object-path/LICENSE create mode 100644 node_modules/to-object-path/README.md create mode 100644 node_modules/to-object-path/index.js create mode 100644 node_modules/to-object-path/node_modules/kind-of/LICENSE create mode 100644 node_modules/to-object-path/node_modules/kind-of/README.md create mode 100644 node_modules/to-object-path/node_modules/kind-of/index.js create mode 100644 node_modules/to-object-path/node_modules/kind-of/package.json create mode 100644 node_modules/to-object-path/package.json create mode 100644 node_modules/to-regex-range/LICENSE create mode 100644 node_modules/to-regex-range/README.md create mode 100644 node_modules/to-regex-range/index.js create mode 100644 node_modules/to-regex-range/package.json create mode 100644 node_modules/to-regex/LICENSE create mode 100644 node_modules/to-regex/README.md create mode 100644 node_modules/to-regex/index.js create mode 100644 node_modules/to-regex/package.json create mode 100644 node_modules/toidentifier/LICENSE create mode 100644 node_modules/toidentifier/README.md create mode 100644 node_modules/toidentifier/index.js create mode 100644 node_modules/toidentifier/package.json create mode 100644 node_modules/touch/LICENSE create mode 100644 node_modules/touch/README.md create mode 100755 node_modules/touch/bin/nodetouch.js create mode 100644 node_modules/touch/index.js create mode 120000 node_modules/touch/node_modules/.bin/nopt create mode 100644 node_modules/touch/node_modules/nopt/.npmignore create mode 100644 node_modules/touch/node_modules/nopt/LICENSE create mode 100644 node_modules/touch/node_modules/nopt/README.md create mode 100755 node_modules/touch/node_modules/nopt/bin/nopt.js create mode 100755 node_modules/touch/node_modules/nopt/examples/my-program.js create mode 100644 node_modules/touch/node_modules/nopt/lib/nopt.js create mode 100644 node_modules/touch/node_modules/nopt/package.json create mode 100644 node_modules/touch/package.json create mode 100644 node_modules/tough-cookie/LICENSE create mode 100644 node_modules/tough-cookie/README.md create mode 100644 node_modules/tough-cookie/lib/cookie.js create mode 100644 node_modules/tough-cookie/lib/memstore.js create mode 100644 node_modules/tough-cookie/lib/pathMatch.js create mode 100644 node_modules/tough-cookie/lib/permuteDomain.js create mode 100644 node_modules/tough-cookie/lib/pubsuffix-psl.js create mode 100644 node_modules/tough-cookie/lib/store.js create mode 100644 node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt create mode 100644 node_modules/tough-cookie/node_modules/punycode/README.md create mode 100644 node_modules/tough-cookie/node_modules/punycode/package.json create mode 100644 node_modules/tough-cookie/node_modules/punycode/punycode.js create mode 100644 node_modules/tough-cookie/package.json create mode 100644 node_modules/tunnel-agent/LICENSE create mode 100644 node_modules/tunnel-agent/README.md create mode 100644 node_modules/tunnel-agent/index.js create mode 100644 node_modules/tunnel-agent/package.json create mode 100644 node_modules/tweetnacl/.npmignore create mode 100644 node_modules/tweetnacl/AUTHORS.md create mode 100644 node_modules/tweetnacl/CHANGELOG.md create mode 100644 node_modules/tweetnacl/LICENSE create mode 100644 node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/tweetnacl/README.md create mode 100644 node_modules/tweetnacl/nacl-fast.js create mode 100644 node_modules/tweetnacl/nacl-fast.min.js create mode 100644 node_modules/tweetnacl/nacl.d.ts create mode 100644 node_modules/tweetnacl/nacl.js create mode 100644 node_modules/tweetnacl/nacl.min.js create mode 100644 node_modules/tweetnacl/package.json create mode 100644 node_modules/type-is/HISTORY.md create mode 100644 node_modules/type-is/LICENSE create mode 100644 node_modules/type-is/README.md create mode 100644 node_modules/type-is/index.js create mode 100644 node_modules/type-is/package.json create mode 100644 node_modules/unc-path-regex/LICENSE create mode 100644 node_modules/unc-path-regex/README.md create mode 100644 node_modules/unc-path-regex/index.js create mode 100644 node_modules/unc-path-regex/package.json create mode 100644 node_modules/undefsafe/.jscsrc create mode 100644 node_modules/undefsafe/.jshintrc create mode 100644 node_modules/undefsafe/.npmignore create mode 100644 node_modules/undefsafe/.travis.yml create mode 100644 node_modules/undefsafe/LICENSE create mode 100644 node_modules/undefsafe/README.md create mode 100644 node_modules/undefsafe/example.js create mode 100644 node_modules/undefsafe/lib/undefsafe.js create mode 100644 node_modules/undefsafe/package.json create mode 100644 node_modules/union-value/LICENSE create mode 100644 node_modules/union-value/README.md create mode 100644 node_modules/union-value/index.js create mode 100644 node_modules/union-value/package.json create mode 100644 node_modules/unique-string/index.js create mode 100644 node_modules/unique-string/license create mode 100644 node_modules/unique-string/package.json create mode 100644 node_modules/unique-string/readme.md create mode 100644 node_modules/unpipe/HISTORY.md create mode 100644 node_modules/unpipe/LICENSE create mode 100644 node_modules/unpipe/README.md create mode 100644 node_modules/unpipe/index.js create mode 100644 node_modules/unpipe/package.json create mode 100644 node_modules/unset-value/LICENSE create mode 100644 node_modules/unset-value/README.md create mode 100644 node_modules/unset-value/index.js create mode 100644 node_modules/unset-value/node_modules/has-value/LICENSE create mode 100644 node_modules/unset-value/node_modules/has-value/README.md create mode 100644 node_modules/unset-value/node_modules/has-value/index.js create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js create mode 100644 node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json create mode 100644 node_modules/unset-value/node_modules/has-value/package.json create mode 100644 node_modules/unset-value/node_modules/has-values/LICENSE create mode 100644 node_modules/unset-value/node_modules/has-values/README.md create mode 100644 node_modules/unset-value/node_modules/has-values/index.js create mode 100644 node_modules/unset-value/node_modules/has-values/package.json create mode 100644 node_modules/unset-value/package.json create mode 100644 node_modules/unzip-response/index.js create mode 100644 node_modules/unzip-response/license create mode 100644 node_modules/unzip-response/package.json create mode 100644 node_modules/unzip-response/readme.md create mode 100644 node_modules/update-notifier/check.js create mode 100644 node_modules/update-notifier/index.js create mode 100644 node_modules/update-notifier/license create mode 100644 node_modules/update-notifier/package.json create mode 100644 node_modules/update-notifier/readme.md create mode 100644 node_modules/uri-js/README.md create mode 100644 node_modules/uri-js/bower.json create mode 100644 node_modules/uri-js/dist/es5/uri.all.d.ts create mode 100644 node_modules/uri-js/dist/es5/uri.all.js create mode 100644 node_modules/uri-js/dist/es5/uri.all.js.map create mode 100644 node_modules/uri-js/dist/es5/uri.all.min.d.ts create mode 100644 node_modules/uri-js/dist/es5/uri.all.min.js create mode 100644 node_modules/uri-js/dist/es5/uri.all.min.js.map create mode 100644 node_modules/uri-js/dist/esnext/index.d.ts create mode 100644 node_modules/uri-js/dist/esnext/index.js create mode 100644 node_modules/uri-js/dist/esnext/index.js.map create mode 100644 node_modules/uri-js/dist/esnext/regexps-iri.d.ts create mode 100644 node_modules/uri-js/dist/esnext/regexps-iri.js create mode 100644 node_modules/uri-js/dist/esnext/regexps-iri.js.map create mode 100644 node_modules/uri-js/dist/esnext/regexps-uri.d.ts create mode 100644 node_modules/uri-js/dist/esnext/regexps-uri.js create mode 100644 node_modules/uri-js/dist/esnext/regexps-uri.js.map create mode 100644 node_modules/uri-js/dist/esnext/schemes/http.d.ts create mode 100644 node_modules/uri-js/dist/esnext/schemes/http.js create mode 100644 node_modules/uri-js/dist/esnext/schemes/http.js.map create mode 100644 node_modules/uri-js/dist/esnext/schemes/https.d.ts create mode 100644 node_modules/uri-js/dist/esnext/schemes/https.js create mode 100644 node_modules/uri-js/dist/esnext/schemes/https.js.map create mode 100644 node_modules/uri-js/dist/esnext/schemes/mailto.d.ts create mode 100644 node_modules/uri-js/dist/esnext/schemes/mailto.js create mode 100644 node_modules/uri-js/dist/esnext/schemes/mailto.js.map create mode 100644 node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts create mode 100644 node_modules/uri-js/dist/esnext/schemes/urn-uuid.js create mode 100644 node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map create mode 100644 node_modules/uri-js/dist/esnext/schemes/urn.d.ts create mode 100644 node_modules/uri-js/dist/esnext/schemes/urn.js create mode 100644 node_modules/uri-js/dist/esnext/schemes/urn.js.map create mode 100644 node_modules/uri-js/dist/esnext/uri.d.ts create mode 100644 node_modules/uri-js/dist/esnext/uri.js create mode 100644 node_modules/uri-js/dist/esnext/uri.js.map create mode 100644 node_modules/uri-js/dist/esnext/util.d.ts create mode 100644 node_modules/uri-js/dist/esnext/util.js create mode 100644 node_modules/uri-js/dist/esnext/util.js.map create mode 100644 node_modules/uri-js/package.json create mode 100644 node_modules/uri-js/rollup.config.js create mode 100644 node_modules/uri-js/src/index.ts create mode 100644 node_modules/uri-js/src/punycode.d.ts create mode 100644 node_modules/uri-js/src/regexps-iri.ts create mode 100644 node_modules/uri-js/src/regexps-uri.ts create mode 100644 node_modules/uri-js/src/schemes/http.ts create mode 100644 node_modules/uri-js/src/schemes/https.ts create mode 100644 node_modules/uri-js/src/schemes/mailto.ts create mode 100644 node_modules/uri-js/src/schemes/urn-uuid.ts create mode 100644 node_modules/uri-js/src/schemes/urn.ts create mode 100644 node_modules/uri-js/src/uri.ts create mode 100644 node_modules/uri-js/src/util.ts create mode 100644 node_modules/uri-js/tests/qunit.css create mode 100644 node_modules/uri-js/tests/qunit.js create mode 100644 node_modules/uri-js/tests/test-es5-min.html create mode 100644 node_modules/uri-js/tests/test-es5.html create mode 100644 node_modules/uri-js/tests/tests.js create mode 100644 node_modules/uri-js/tsconfig.json create mode 100644 node_modules/uri-js/yarn.lock create mode 100644 node_modules/urix/.jshintrc create mode 100644 node_modules/urix/LICENSE create mode 100644 node_modules/urix/index.js create mode 100644 node_modules/urix/package.json create mode 100644 node_modules/urix/readme.md create mode 100644 node_modules/urix/test/index.js create mode 100644 node_modules/url-parse-lax/index.js create mode 100644 node_modules/url-parse-lax/license create mode 100644 node_modules/url-parse-lax/package.json create mode 100644 node_modules/url-parse-lax/readme.md create mode 100644 node_modules/use/LICENSE create mode 100644 node_modules/use/README.md create mode 100644 node_modules/use/index.js create mode 100644 node_modules/use/package.json create mode 100644 node_modules/util-deprecate/History.md create mode 100644 node_modules/util-deprecate/LICENSE create mode 100644 node_modules/util-deprecate/README.md create mode 100644 node_modules/util-deprecate/browser.js create mode 100644 node_modules/util-deprecate/node.js create mode 100644 node_modules/util-deprecate/package.json create mode 100644 node_modules/utils-merge/.npmignore create mode 100644 node_modules/utils-merge/LICENSE create mode 100644 node_modules/utils-merge/README.md create mode 100644 node_modules/utils-merge/index.js create mode 100644 node_modules/utils-merge/package.json create mode 100644 node_modules/uuid/AUTHORS create mode 100644 node_modules/uuid/CHANGELOG.md create mode 100644 node_modules/uuid/LICENSE.md create mode 100644 node_modules/uuid/README.md create mode 100755 node_modules/uuid/bin/uuid create mode 100644 node_modules/uuid/index.js create mode 100644 node_modules/uuid/lib/bytesToUuid.js create mode 100644 node_modules/uuid/lib/md5-browser.js create mode 100644 node_modules/uuid/lib/md5.js create mode 100644 node_modules/uuid/lib/rng-browser.js create mode 100644 node_modules/uuid/lib/rng.js create mode 100644 node_modules/uuid/lib/sha1-browser.js create mode 100644 node_modules/uuid/lib/sha1.js create mode 100644 node_modules/uuid/lib/v35.js create mode 100644 node_modules/uuid/package.json create mode 100644 node_modules/uuid/v1.js create mode 100644 node_modules/uuid/v3.js create mode 100644 node_modules/uuid/v4.js create mode 100644 node_modules/uuid/v5.js create mode 100644 node_modules/v8flags/LICENSE create mode 100644 node_modules/v8flags/README.md create mode 100644 node_modules/v8flags/config-path.js create mode 100644 node_modules/v8flags/index.js create mode 100644 node_modules/v8flags/package.json create mode 100644 node_modules/vary/HISTORY.md create mode 100644 node_modules/vary/LICENSE create mode 100644 node_modules/vary/README.md create mode 100644 node_modules/vary/index.js create mode 100644 node_modules/vary/package.json create mode 100644 node_modules/verror/.npmignore create mode 100644 node_modules/verror/CHANGES.md create mode 100644 node_modules/verror/CONTRIBUTING.md create mode 100644 node_modules/verror/LICENSE create mode 100644 node_modules/verror/README.md create mode 100644 node_modules/verror/lib/verror.js create mode 100644 node_modules/verror/package.json create mode 100644 node_modules/which/CHANGELOG.md create mode 100644 node_modules/which/LICENSE create mode 100644 node_modules/which/README.md create mode 100755 node_modules/which/bin/which create mode 100644 node_modules/which/package.json create mode 100644 node_modules/which/which.js create mode 100644 node_modules/wide-align/LICENSE create mode 100644 node_modules/wide-align/README.md create mode 100644 node_modules/wide-align/align.js create mode 100644 node_modules/wide-align/package.json create mode 100644 node_modules/widest-line/index.js create mode 100644 node_modules/widest-line/license create mode 100644 node_modules/widest-line/node_modules/ansi-regex/index.js create mode 100644 node_modules/widest-line/node_modules/ansi-regex/license create mode 100644 node_modules/widest-line/node_modules/ansi-regex/package.json create mode 100644 node_modules/widest-line/node_modules/ansi-regex/readme.md create mode 100644 node_modules/widest-line/node_modules/is-fullwidth-code-point/index.js create mode 100644 node_modules/widest-line/node_modules/is-fullwidth-code-point/license create mode 100644 node_modules/widest-line/node_modules/is-fullwidth-code-point/package.json create mode 100644 node_modules/widest-line/node_modules/is-fullwidth-code-point/readme.md create mode 100644 node_modules/widest-line/node_modules/string-width/index.js create mode 100644 node_modules/widest-line/node_modules/string-width/license create mode 100644 node_modules/widest-line/node_modules/string-width/package.json create mode 100644 node_modules/widest-line/node_modules/string-width/readme.md create mode 100644 node_modules/widest-line/node_modules/strip-ansi/index.js create mode 100644 node_modules/widest-line/node_modules/strip-ansi/license create mode 100644 node_modules/widest-line/node_modules/strip-ansi/package.json create mode 100644 node_modules/widest-line/node_modules/strip-ansi/readme.md create mode 100644 node_modules/widest-line/package.json create mode 100644 node_modules/widest-line/readme.md create mode 100644 node_modules/wrappy/LICENSE create mode 100644 node_modules/wrappy/README.md create mode 100644 node_modules/wrappy/package.json create mode 100644 node_modules/wrappy/wrappy.js create mode 100644 node_modules/write-file-atomic/CHANGELOG.md create mode 100644 node_modules/write-file-atomic/LICENSE create mode 100644 node_modules/write-file-atomic/README.md create mode 100644 node_modules/write-file-atomic/index.js create mode 100644 node_modules/write-file-atomic/package.json create mode 100644 node_modules/x-xss-protection/CHANGELOG.md create mode 100644 node_modules/x-xss-protection/LICENSE create mode 100644 node_modules/x-xss-protection/README.md create mode 100644 node_modules/x-xss-protection/dist/index.d.ts create mode 100644 node_modules/x-xss-protection/dist/index.js create mode 100644 node_modules/x-xss-protection/package.json create mode 100644 node_modules/xdg-basedir/index.js create mode 100644 node_modules/xdg-basedir/license create mode 100644 node_modules/xdg-basedir/package.json create mode 100644 node_modules/xdg-basedir/readme.md create mode 100644 node_modules/yallist/LICENSE create mode 100644 node_modules/yallist/README.md create mode 100644 node_modules/yallist/iterator.js create mode 100644 node_modules/yallist/package.json create mode 100644 node_modules/yallist/yallist.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 start.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5a8e712 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +test/* +.git/* +Dockerfile +CloudronManifest.json +README.MD \ No newline at end of file diff --git a/CloudronManifest.json b/CloudronManifest.json new file mode 100644 index 0000000..e997b12 --- /dev/null +++ b/CloudronManifest.json @@ -0,0 +1,16 @@ +{ + "id": "xyz.ruihildt.cloudronapp", + "version": "1.0.0", + "healthCheckPath": "/", + "httpPort": 4000, + "website": "https://git.ruihildt.xyz", + "title": "Wiki.js", + "author": "Rui Hildt", + "contactEmail": "support@cloudron.io", + "tagline": "Find the shortest path between different cities.", + "documentationUrl": "https://git.ruihildt.xyz/ruihildt/dijkstra-backend", + "addons": { + "localstorage": {} + }, + "manifestVersion": 2 +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..78d2235 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM cloudron/base:2.0.0@sha256:f9fea80513aa7c92fe2e7bf3978b54c8ac5222f47a9a32a7f8833edf0eb5a4f4 + +RUN mkdir -p /app/code +RUN mkdir -p /app/data +WORKDIR /app/code + +# copy code +ADD / /app/code/ + +# install packages +RUN npm install + +CMD [ "/app/code/start.sh" ] diff --git a/README.md b/README.md new file mode 100644 index 0000000..8485455 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# dijkstra-backend +Find the the shortest path between different cities in Belgium with Dijkstra algorithm. + +This is the cloudron app version. + +- Deployed Frontend: https://dijkstra.ruihildt.xyz/ +- Deployed Backend: https://dijkstra-backend.ruihildt.xyz + +- Frontend Source: https://git.ruihildt.xyz/ruihildt/dijkstra-frontend +- Backend Source: https://git.ruihildt.xyz/ruihildt/dijkstra-backend \ No newline at end of file diff --git a/api/models/citiesModel.js b/api/models/citiesModel.js new file mode 100644 index 0000000..1072e35 --- /dev/null +++ b/api/models/citiesModel.js @@ -0,0 +1,22 @@ +const db = require('../../data/dbConfig'); + +module.exports = { + getCities, + getCitiesByCountry + // getCity, +}; + +function getCities() { + return db('cities') +} + +function getCitiesByCountry(country_id) { + return db('cities') + .where({ country_id }) +} + +// function getCity(name) { +// return db('cities') +// .where({ name }) +// .first() +// } \ No newline at end of file diff --git a/api/models/countriesModel.js b/api/models/countriesModel.js new file mode 100644 index 0000000..919de9d --- /dev/null +++ b/api/models/countriesModel.js @@ -0,0 +1,16 @@ +const db = require('../../data/dbConfig'); + +module.exports = { + getCountries, + getCountryByName, +}; + +function getCountries() { + return db('countries') +} + +function getCountryByName(name) { + return db('countries') + .where({ name }) + .first() +} \ No newline at end of file diff --git a/api/models/roadsModel.js b/api/models/roadsModel.js new file mode 100644 index 0000000..cbff16b --- /dev/null +++ b/api/models/roadsModel.js @@ -0,0 +1,9 @@ +const db = require('../../data/dbConfig'); + +module.exports = { + getRoads +}; + +function getRoads() { + return db('roads') +} \ No newline at end of file diff --git a/api/routes/citiesRouter.js b/api/routes/citiesRouter.js new file mode 100644 index 0000000..6ac07ed --- /dev/null +++ b/api/routes/citiesRouter.js @@ -0,0 +1,14 @@ +const router = require('express').Router(); + +const Cities = require('../models/citiesModel'); + +router.get('', async (req, res) => { + try { + const cities = await Cities.getCities(); + res.status(200).json(cities); + } catch (e) { + res.status(500).json(e); + } +}) + +module.exports = router; diff --git a/api/routes/countriesRouter.js b/api/routes/countriesRouter.js new file mode 100644 index 0000000..ea0a831 --- /dev/null +++ b/api/routes/countriesRouter.js @@ -0,0 +1,14 @@ +const router = require('express').Router(); +const Cities = require('../models/citiesModel'); + +router.get('/:country_id', async (req, res) => { + const { country_id } = req.params; + try { + const cities = await Cities.getCitiesByCountry(country_id); + res.status(200).json(cities); + } catch (e) { + res.status(500).json(e); + } +}) + +module.exports = router; diff --git a/api/routes/pathRouter.js b/api/routes/pathRouter.js new file mode 100644 index 0000000..74342cc --- /dev/null +++ b/api/routes/pathRouter.js @@ -0,0 +1,43 @@ +const router = require('express').Router(); + +const Roads = require('../models/roadsModel'); +const Cities = require('../models/citiesModel'); + +const findShortestPath = require('../../helpers/dijkstra_algo'); + +router.get('', async (req, res) => { + const { start_city_id, end_city_id } = req.query; + + start = Math.floor(start_city_id); + end = Math.floor(end_city_id); + + try { + const cities = await Cities.getCities(); + const roads = await Roads.getRoads(); + + let { path, distance } = findShortestPath(cities, roads, start, end); + const shortestPath = formatPath(path, cities) + + let response = { path: shortestPath, distance } + + res.status(200).json(response); + } catch (e) { + res.status(500).json(e); + } +}) + +function formatPath(path, cities) { + const complete_path = [] + + for (let path_city of path) { + for (let city of cities) { + if (city.id == path_city) { + complete_path.push({ id: city.id, name: city.name }); + } + } + } + + return complete_path +} + +module.exports = router; diff --git a/api/routes/roadsRouter.js b/api/routes/roadsRouter.js new file mode 100644 index 0000000..591c98f --- /dev/null +++ b/api/routes/roadsRouter.js @@ -0,0 +1,13 @@ +const router = require('express').Router(); +const Roads = require('../models/roadsModel'); + +router.get('', async (req, res) => { + try { + const roads = await Roads.getRoads(); + res.status(200).json(roads); + } catch (e) { + res.status(500).json(e); + } +}) + +module.exports = router; diff --git a/api/server.js b/api/server.js new file mode 100644 index 0000000..6b28834 --- /dev/null +++ b/api/server.js @@ -0,0 +1,21 @@ +const express = require("express"); +const helmet = require('helmet'); +const cors = require('cors'); + +const citiesRouter = require('./routes/citiesRouter'); +const roadsRouter = require('./routes/roadsRouter'); +const countriesRouter = require('./routes/countriesRouter'); +const pathRouter = require('./routes/pathRouter') + +const server = express(); + +server.use(helmet()); +server.use(express.json()); +server.use(cors()); + +server.use('/api/cities', citiesRouter); +server.use('/api/roads', roadsRouter); +server.use('/api/countries', countriesRouter); +server.use('/api/path', pathRouter); + +module.exports = server; diff --git a/data/dbConfig.js b/data/dbConfig.js new file mode 100644 index 0000000..22be333 --- /dev/null +++ b/data/dbConfig.js @@ -0,0 +1,7 @@ + +const knex = require('knex'); +const config = require('../knexfile'); + +const environment = 'development'; + +module.exports = knex(config[environment]); diff --git a/data/migrations/20200207155645_countries.js b/data/migrations/20200207155645_countries.js new file mode 100644 index 0000000..f8d622d --- /dev/null +++ b/data/migrations/20200207155645_countries.js @@ -0,0 +1,13 @@ +exports.up = function(knex, Promise) { + return knex.schema.createTable('countries', function(countries) { + countries.increments(); + countries + .string('name', 128) + .notNullable() + .unique(); + }); + }; + + exports.down = function(knex, Promise) { + return knex.schema.dropTableIfExists('countries'); + }; diff --git a/data/migrations/20200207160031_cities.js b/data/migrations/20200207160031_cities.js new file mode 100644 index 0000000..44e7167 --- /dev/null +++ b/data/migrations/20200207160031_cities.js @@ -0,0 +1,20 @@ +exports.up = function(knex) { + return knex.schema.createTable('cities', function(cities) { + cities.increments(); + + cities.string('name', 128).notNullable(); + cities + .integer('country_id') + .unsigned() + .notNullable() + .references('id') + .inTable('countries') + .onDelete('CASCADE') + .onUpdate('CASCADE'); + }); + }; + + exports.down = function(knex) { + return knex.schema.dropTableIfExists('cities'); + }; + \ No newline at end of file diff --git a/data/migrations/20200207160304_roads.js b/data/migrations/20200207160304_roads.js new file mode 100644 index 0000000..b89afa2 --- /dev/null +++ b/data/migrations/20200207160304_roads.js @@ -0,0 +1,32 @@ +exports.up = function(knex) { + return knex.schema.createTable('roads', function(roads) { + roads.increments(); + + roads + .integer('start_city_id') + .unsigned() + .notNullable() + .references('id') + .inTable('cities') + .onDelete('CASCADE') + .onUpdate('CASCADE'); + + roads + .integer('end_city_id') + .unsigned() + .notNullable() + .references('id') + .inTable('cities') + .onDelete('CASCADE') + .onUpdate('CASCADE'); + + roads + .integer('distance') + .unsigned() + .notNullable() + }); +}; + +exports.down = function(knex) { + return knex.schema.dropTableIfExists('roads'); +}; diff --git a/data/seeds/01-countries.js b/data/seeds/01-countries.js new file mode 100644 index 0000000..7af7f6b --- /dev/null +++ b/data/seeds/01-countries.js @@ -0,0 +1,12 @@ + +exports.seed = function(knex) { + return knex('countries').truncate() + .then(function () { + return knex('countries').insert([ + { + id: 1, + name: 'Belgium', + } + ]); + }); +}; diff --git a/data/seeds/02-cities.js b/data/seeds/02-cities.js new file mode 100644 index 0000000..ed9a6d1 --- /dev/null +++ b/data/seeds/02-cities.js @@ -0,0 +1,58 @@ +exports.seed = function (knex) { + return knex('cities') + .truncate() + .then(function () { + return knex('cities').insert([ + { + id: 1, + name: 'bruges', + country_id: 1, + }, + { + id: 2, + name: 'antwerp', + country_id: 1, + }, + { + id: 3, + name: 'ghent', + country_id: 1, + }, + { + id: 4, + name: 'mechelen', + country_id: 1, + }, + { + id: 5, + name: 'brussels', + country_id: 1, + }, + { + id: 6, + name: 'mons', + country_id: 1, + }, + { + id: 7, + name: 'namur', + country_id: 1, + }, + { + id: 8, + name: 'liege', + country_id: 1, + }, + { + id: 9, + name: 'arlon', + country_id: 1, + }, + { + id: 10, + name: 'tournai', + country_id: 1, + }, + ]); + }); +}; diff --git a/data/seeds/03-roads.js b/data/seeds/03-roads.js new file mode 100644 index 0000000..eb8dbc4 --- /dev/null +++ b/data/seeds/03-roads.js @@ -0,0 +1,92 @@ +exports.seed = function (knex) { + return knex('roads') + .truncate() + .then(function () { + return knex('roads').insert([ + { + id: 1, + start_city_id: 1, + end_city_id: 3, + distance: 40, + }, + { + id: 2, + start_city_id: 3, + end_city_id: 10, + distance: 60, + }, + { + id: 3, + start_city_id: 10, + end_city_id: 5, + distance: 70, + }, + { + id: 4, + start_city_id: 3, + end_city_id: 5, + distance: 50, + }, + { + id: 5, + start_city_id: 3, + end_city_id: 2, + distance: 50, + }, + { + id: 6, + start_city_id: 2, + end_city_id: 4, + distance: 20, + }, + { + id: 7, + start_city_id: 4, + end_city_id: 5, + distance: 20, + }, + { + id: 8, + start_city_id: 5, + end_city_id: 6, + distance: 50, + }, + { + id: 9, + start_city_id: 6, + end_city_id: 7, + distance: 60, + }, + { + id: 10, + start_city_id: 6, + end_city_id: 10, + distance: 40, + }, + { + id: 11, + start_city_id: 7, + end_city_id: 9, + distance: 110, + }, + { + id: 12, + start_city_id: 9, + end_city_id: 7, + distance: 110, + }, + { + id: 13, + start_city_id: 8, + end_city_id: 7, + distance: 50, + }, + { + id: 14, + start_city_id: 8, + end_city_id: 5, + distance: 90, + }, + ]); + }); +}; diff --git a/helpers/dijkstra_algo.js b/helpers/dijkstra_algo.js new file mode 100644 index 0000000..3048463 --- /dev/null +++ b/helpers/dijkstra_algo.js @@ -0,0 +1,55 @@ +const Queue = require('./queue'); +const Graph = require('./graph'); + +function findPathWithDijkstra(cities, roads, startNode, endNode) { + const graph = new Graph(); + + // Add cities and roads to graph + for (let city of cities) { + graph.addNode(city.id) + } + + for (let { start_city_id, end_city_id, distance } of roads) { + graph.addEdge(start_city_id, end_city_id, distance) + } + + // Dijkstra path search algo + let times = {}; + let backtrace = {}; + let queue = new Queue(); + + times[startNode] = 0; + + graph.nodes.forEach(node => { + if (node !== startNode) { + times[node] = Infinity + } + }); + + queue.enqueue([startNode, 0]); + + while (queue.size()) { + let shortestStep = queue.dequeue(); + let currentNode = shortestStep[0]; + graph.adjacencyList[currentNode].forEach(neighbor => { + let time = times[currentNode] + neighbor.distance; + + if (time < times[neighbor.node]) { + times[neighbor.node] = time; + backtrace[neighbor.node] = currentNode; + queue.enqueue([neighbor.node, time]); + } + }); + } + + let path = [endNode]; + let lastStep = endNode; while(lastStep !== startNode) { + path.unshift(backtrace[lastStep]) + lastStep = backtrace[lastStep] + } + + // return `Path is ${path} and time is ${times[endNode]}` + return {path, distance: times[endNode]} +} + +module.exports = findPathWithDijkstra; diff --git a/helpers/graph.js b/helpers/graph.js new file mode 100644 index 0000000..ee42b64 --- /dev/null +++ b/helpers/graph.js @@ -0,0 +1,18 @@ +class Graph { + constructor() { + this.nodes = []; + this.adjacencyList = {}; + } + + addNode(node) { + this.nodes.push(node); + this.adjacencyList[node] = []; + } + + addEdge(node1, node2, distance) { + this.adjacencyList[node1].push({node:node2, distance}); + this.adjacencyList[node2].push({node:node1, distance}); + } +} + +module.exports = Graph; \ No newline at end of file diff --git a/helpers/queue.js b/helpers/queue.js new file mode 100644 index 0000000..6d3335e --- /dev/null +++ b/helpers/queue.js @@ -0,0 +1,21 @@ +class Queue { + constructor() { + this.store = []; + } + + size() { + return this.store.length + } + + enqueue(node) { + this.store.push(node); + } + + dequeue() { + if (this.size() > 0) { + return this.store.shift(); + } + } +} + +module.exports = Queue; \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..1709cc7 --- /dev/null +++ b/index.js @@ -0,0 +1,12 @@ +const server = require("./api/server"); + +server.get("/", (req, res) => { + res.json({ + message: `API server for Dijkstra. :)`, + documentation: `Check out: https://git.ruihildt.xyz/ruihildt/dijkstra-backend` + }); +}); + +server.listen(4000, () => { + console.log(`Listening on port 4000...`); +}); diff --git a/knexfile.js b/knexfile.js new file mode 100644 index 0000000..3448ebb --- /dev/null +++ b/knexfile.js @@ -0,0 +1,23 @@ +module.exports = { + + development: { + client: 'sqlite3', + connection: { + filename: '/app/data/database_file.db3', + }, + useNullAsDefault: true, + migrations: { + directory: './data/migrations' + }, + seeds: { + directory: './data/seeds' + }, + pool: { + afterCreate: (conn, done) => { + // runs after a connection is made to the sqlite engine + conn.run('PRAGMA foreign_keys = ON', done); // turn on FK enforcement + }, + }, + } + +}; diff --git a/node_modules/.bin/atob b/node_modules/.bin/atob new file mode 120000 index 0000000..a68344a --- /dev/null +++ b/node_modules/.bin/atob @@ -0,0 +1 @@ +../atob/bin/atob.js \ No newline at end of file diff --git a/node_modules/.bin/detect-libc b/node_modules/.bin/detect-libc new file mode 120000 index 0000000..b4c4b76 --- /dev/null +++ b/node_modules/.bin/detect-libc @@ -0,0 +1 @@ +../detect-libc/bin/detect-libc.js \ No newline at end of file diff --git a/node_modules/.bin/is-ci b/node_modules/.bin/is-ci new file mode 120000 index 0000000..fe6aca6 --- /dev/null +++ b/node_modules/.bin/is-ci @@ -0,0 +1 @@ +../is-ci/bin.js \ No newline at end of file diff --git a/node_modules/.bin/knex b/node_modules/.bin/knex new file mode 120000 index 0000000..c52596d --- /dev/null +++ b/node_modules/.bin/knex @@ -0,0 +1 @@ +../knex/bin/cli.js \ No newline at end of file diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime new file mode 120000 index 0000000..fbb7ee0 --- /dev/null +++ b/node_modules/.bin/mime @@ -0,0 +1 @@ +../mime/cli.js \ No newline at end of file diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp new file mode 120000 index 0000000..017896c --- /dev/null +++ b/node_modules/.bin/mkdirp @@ -0,0 +1 @@ +../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/node_modules/.bin/needle b/node_modules/.bin/needle new file mode 120000 index 0000000..8280969 --- /dev/null +++ b/node_modules/.bin/needle @@ -0,0 +1 @@ +../needle/bin/needle \ No newline at end of file diff --git a/node_modules/.bin/node-pre-gyp b/node_modules/.bin/node-pre-gyp new file mode 120000 index 0000000..47a90a5 --- /dev/null +++ b/node_modules/.bin/node-pre-gyp @@ -0,0 +1 @@ +../node-pre-gyp/bin/node-pre-gyp \ No newline at end of file diff --git a/node_modules/.bin/nodemon b/node_modules/.bin/nodemon new file mode 120000 index 0000000..1056ddc --- /dev/null +++ b/node_modules/.bin/nodemon @@ -0,0 +1 @@ +../nodemon/bin/nodemon.js \ No newline at end of file diff --git a/node_modules/.bin/nodetouch b/node_modules/.bin/nodetouch new file mode 120000 index 0000000..3409fdb --- /dev/null +++ b/node_modules/.bin/nodetouch @@ -0,0 +1 @@ +../touch/bin/nodetouch.js \ No newline at end of file diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt new file mode 120000 index 0000000..6b6566e --- /dev/null +++ b/node_modules/.bin/nopt @@ -0,0 +1 @@ +../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/.bin/rc b/node_modules/.bin/rc new file mode 120000 index 0000000..48b3cda --- /dev/null +++ b/node_modules/.bin/rc @@ -0,0 +1 @@ +../rc/cli.js \ No newline at end of file diff --git a/node_modules/.bin/rimraf b/node_modules/.bin/rimraf new file mode 120000 index 0000000..4cd49a4 --- /dev/null +++ b/node_modules/.bin/rimraf @@ -0,0 +1 @@ +../rimraf/bin.js \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver new file mode 120000 index 0000000..317eb29 --- /dev/null +++ b/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver \ No newline at end of file diff --git a/node_modules/.bin/sshpk-conv b/node_modules/.bin/sshpk-conv new file mode 120000 index 0000000..a2a295c --- /dev/null +++ b/node_modules/.bin/sshpk-conv @@ -0,0 +1 @@ +../sshpk/bin/sshpk-conv \ No newline at end of file diff --git a/node_modules/.bin/sshpk-sign b/node_modules/.bin/sshpk-sign new file mode 120000 index 0000000..766b9b3 --- /dev/null +++ b/node_modules/.bin/sshpk-sign @@ -0,0 +1 @@ +../sshpk/bin/sshpk-sign \ No newline at end of file diff --git a/node_modules/.bin/sshpk-verify b/node_modules/.bin/sshpk-verify new file mode 120000 index 0000000..bfd7e3a --- /dev/null +++ b/node_modules/.bin/sshpk-verify @@ -0,0 +1 @@ +../sshpk/bin/sshpk-verify \ No newline at end of file diff --git a/node_modules/.bin/uuid b/node_modules/.bin/uuid new file mode 120000 index 0000000..b3e45bc --- /dev/null +++ b/node_modules/.bin/uuid @@ -0,0 +1 @@ +../uuid/bin/uuid \ No newline at end of file diff --git a/node_modules/.bin/which b/node_modules/.bin/which new file mode 120000 index 0000000..f62471c --- /dev/null +++ b/node_modules/.bin/which @@ -0,0 +1 @@ +../which/bin/which \ No newline at end of file diff --git a/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/74/3a/d9818eab8969925dd823cd7eafb3c28e56bf688e561a30ab61866b5c13f9e0509722805176481c6ab122317bd6047fa74fae07b2d225b8d12d13f59a2fd9 b/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/74/3a/d9818eab8969925dd823cd7eafb3c28e56bf688e561a30ab61866b5c13f9e0509722805176481c6ab122317bd6047fa74fae07b2d225b8d12d13f59a2fd9 new file mode 100644 index 0000000..35e600e --- /dev/null +++ b/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/74/3a/d9818eab8969925dd823cd7eafb3c28e56bf688e561a30ab61866b5c13f9e0509722805176481c6ab122317bd6047fa74fae07b2d225b8d12d13f59a2fd9 @@ -0,0 +1 @@ +{"code":"!function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var i in t)r.d(n,i,function(e){return t[e]}.bind(null,i));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,\"a\",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p=\"\",r(r.s=120)}([function(t,e){\"function\"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}},function(t,e){t.exports=lodash},function(t,e,r){var n=r(3),i=n.Buffer;function o(t,e){for(var r in t)e[r]=t[r]}function s(t,e,r){return i(t,e,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=n:(o(n,e),e.Buffer=s),o(i,s),s.from=function(t,e,r){if(\"number\"==typeof t)throw new TypeError(\"Argument must not be a number\");return i(t,e,r)},s.alloc=function(t,e,r){if(\"number\"!=typeof t)throw new TypeError(\"Argument must be a number\");var n=i(t);return void 0!==e?\"string\"==typeof r?n.fill(e,r):n.fill(e):n.fill(0),n},s.allocUnsafe=function(t){if(\"number\"!=typeof t)throw new TypeError(\"Argument must be a number\");return i(t)},s.allocUnsafeSlow=function(t){if(\"number\"!=typeof t)throw new TypeError(\"Argument must be a number\");return n.SlowBuffer(t)}},function(t,e,r){\"use strict\";(function(t){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\nvar n=r(131),i=r(132),o=r(66);function s(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(s()=s())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+s().toString(16)+\" bytes\");return 0|t}function p(t,e){if(c.isBuffer(t))return t.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;\"string\"!=typeof t&&(t=\"\"+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":case void 0:return U(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return D(t).length;default:if(n)return U(t).length;e=(\"\"+e).toLowerCase(),n=!0}}function m(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function b(t,e,r,n,i){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof e&&(e=c.from(e,n)),c.isBuffer(e))return 0===e.length?-1:g(t,e,r,n,i);if(\"number\"==typeof e)return e&=255,c.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):g(t,[e],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function g(t,e,r,n,i){var o,s=1,a=t.length,c=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,c/=2,r/=2}function u(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var h=-1;for(o=r;oa&&(r=a-c),o=r;o>=0;o--){for(var f=!0,l=0;li&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError(\"Invalid hex string\");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function S(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function A(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:u>223?3:u>191?2:1;if(i+f<=r)switch(f){case 1:u<128&&(h=u);break;case 2:128==(192&(o=t[i+1]))&&(c=(31&u)<<6|63&o)>127&&(h=c);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&(c=(15&u)<<12|(63&o)<<6|63&s)>2047&&(c<55296||c>57343)&&(h=c);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(c=(15&u)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&c<1114112&&(h=c)}null===h?(h=65533,f=1):h>65535&&(h-=65536,n.push(h>>>10&1023|55296),h=56320|1023&h),n.push(h),i+=f}return function(t){var e=t.length;if(e<=C)return String.fromCharCode.apply(String,t);var r=\"\",n=0;for(;nthis.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return R(this,e,r);case\"utf8\":case\"utf-8\":return A(this,e,r);case\"ascii\":return k(this,e,r);case\"latin1\":case\"binary\":return T(this,e,r);case\"base64\":return S(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return M(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}.apply(this,arguments)},c.prototype.equals=function(t){if(!c.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");return this===t||0===c.compare(this,t)},c.prototype.inspect=function(){var t=\"\",r=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString(\"hex\",0,r).match(/.{2}/g).join(\" \"),this.length>r&&(t+=\" ... \")),\"\"},c.prototype.compare=function(t,e,r,n,i){if(!c.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0),a=Math.min(o,s),u=this.slice(n,i),h=t.slice(e,r),f=0;fi)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var o=!1;;)switch(n){case\"hex\":return y(this,t,e,r);case\"utf8\":case\"utf-8\":return _(this,t,e,r);case\"ascii\":return v(this,t,e,r);case\"latin1\":case\"binary\":return w(this,t,e,r);case\"base64\":return E(this,t,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return x(this,t,e,r);default:if(o)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),o=!0}},c.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function k(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i=\"\",o=e;or)throw new RangeError(\"Trying to access beyond buffer length\")}function I(t,e,r,n,i,o){if(!c.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError(\"Index out of range\")}function N(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function O(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function B(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function q(t,e,r,n,o){return o||B(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function P(t,e,r,n,o){return o||B(t,0,r,8),i.write(t,e,r,n,52,8),r+8}c.prototype.slice=function(t,e){var r,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},c.prototype.readUInt8=function(t,e){return e||j(t,1,this.length),this[t]},c.prototype.readUInt16LE=function(t,e){return e||j(t,2,this.length),this[t]|this[t+1]<<8},c.prototype.readUInt16BE=function(t,e){return e||j(t,2,this.length),this[t]<<8|this[t+1]},c.prototype.readUInt32LE=function(t,e){return e||j(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},c.prototype.readUInt32BE=function(t,e){return e||j(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},c.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||j(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},c.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||j(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},c.prototype.readInt8=function(t,e){return e||j(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},c.prototype.readInt16LE=function(t,e){e||j(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt16BE=function(t,e){e||j(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt32LE=function(t,e){return e||j(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},c.prototype.readInt32BE=function(t,e){return e||j(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},c.prototype.readFloatLE=function(t,e){return e||j(t,4,this.length),i.read(this,t,!0,23,4)},c.prototype.readFloatBE=function(t,e){return e||j(t,4,this.length),i.read(this,t,!1,23,4)},c.prototype.readDoubleLE=function(t,e){return e||j(t,8,this.length),i.read(this,t,!0,52,8)},c.prototype.readDoubleBE=function(t,e){return e||j(t,8,this.length),i.read(this,t,!1,52,8)},c.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||I(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},c.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,1,255,0),c.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},c.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):N(this,t,e,!0),e+2},c.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):N(this,t,e,!1),e+2},c.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):O(this,t,e,!0),e+4},c.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):O(this,t,e,!1),e+4},c.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);I(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},c.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);I(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},c.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,1,127,-128),c.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},c.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):N(this,t,e,!0),e+2},c.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):N(this,t,e,!1),e+2},c.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):O(this,t,e,!0),e+4},c.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||I(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),c.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):O(this,t,e,!1),e+4},c.prototype.writeFloatLE=function(t,e,r){return q(this,t,e,!0,r)},c.prototype.writeFloatBE=function(t,e,r){return q(this,t,e,!1,r)},c.prototype.writeDoubleLE=function(t,e,r){return P(this,t,e,!0,r)},c.prototype.writeDoubleBE=function(t,e,r){return P(this,t,e,!1,r)},c.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError(\"sourceStart out of bounds\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3||!c.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),\"number\"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function D(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\\s+|\\s+$/g,\"\")}(t).replace(L,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function F(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(this,r(8))},function(t,e,r){(function(t){!function(t,e){\"use strict\";function n(t,e){if(!t)throw new Error(e||\"Assertion failed\")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function o(t,e,r){if(o.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&(\"le\"!==e&&\"be\"!==e||(r=e,e=10),this._init(t||0,e||10,r||\"be\"))}var s;\"object\"==typeof t?t.exports=o:e.BN=o,o.BN=o,o.wordSize=26;try{s=r(210).Buffer}catch(t){}function a(t,e,r){for(var n=0,i=Math.min(t.length,r),o=e;o=49&&s<=54?s-49+10:s>=17&&s<=22?s-17+10:15&s}return n}function c(t,e,r,n){for(var i=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return i}o.isBN=function(t){return t instanceof o||null!==t&&\"object\"==typeof t&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if(\"number\"==typeof t)return this._initNumber(t,e,r);if(\"object\"==typeof t)return this._initArray(t,e,r);\"hex\"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;\"-\"===(t=t.toString().replace(/\\s+/g,\"\"))[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),\"-\"===t[0]&&(this.negative=1),this.strip(),\"le\"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),\"le\"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n(\"number\"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)s=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if(\"le\"===r)for(i=0,o=0;i>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=a(t,r,r+6),this.words[n]|=i<>>26-o&4194303,(o+=24)>=26&&(o-=26,n++);r+6!==e&&(i=a(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,s=o%n,a=Math.min(o,o-s)+r,u=0,h=r;h1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?\"\"};var u=[\"\",\"0\",\"00\",\"000\",\"0000\",\"00000\",\"000000\",\"0000000\",\"00000000\",\"000000000\",\"0000000000\",\"00000000000\",\"000000000000\",\"0000000000000\",\"00000000000000\",\"000000000000000\",\"0000000000000000\",\"00000000000000000\",\"000000000000000000\",\"0000000000000000000\",\"00000000000000000000\",\"000000000000000000000\",\"0000000000000000000000\",\"00000000000000000000000\",\"000000000000000000000000\",\"0000000000000000000000000\"],h=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],f=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function l(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],s=i*o,a=67108863&s,c=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,f=67108863&c,l=Math.min(u,e.length-1),d=Math.max(0,u-t.length+1);d<=l;d++){var p=u-d|0;h+=(s=(i=0|t.words[p])*(o=0|e.words[d])+f)/67108864|0,f=67108863&s}r.words[u]=0|f,c=0|h}return 0!==c?r.words[u]=0|c:r.length--,r.strip()}o.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||\"hex\"===t){r=\"\";for(var i=0,o=0,s=0;s>>24-i&16777215)||s!==this.length-1?u[6-c.length]+c+r:c+r,(i+=2)>=26&&(i-=26,s--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}if(t===(0|t)&&t>=2&&t<=36){var l=h[t],d=f[t];r=\"\";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(d).toString(t);r=(p=p.idivn(d)).isZero()?m+r:u[l-m.length]+m+r}for(this.isZero()&&(r=\"0\"+r);r.length%e!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}n(!1,\"Base should be between 2 and 36\")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,\"Number can only safely store up to 53 bits\"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n(void 0!==s),this.toArrayLike(s,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,\"byte array longer than desired length\"),n(o>0,\"Requested array length <= 0\"),this.strip();var s,a,c=\"le\"===e,u=new t(o),h=this.clone();if(c){for(a=0;!h.isZero();a++)s=h.andln(255),h.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n(\"number\"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n(\"number\"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,d=0|s[1],p=8191&d,m=d>>>13,b=0|s[2],g=8191&b,y=b>>>13,_=0|s[3],v=8191&_,w=_>>>13,E=0|s[4],x=8191&E,S=E>>>13,A=0|s[5],C=8191&A,k=A>>>13,T=0|s[6],R=8191&T,M=T>>>13,j=0|s[7],I=8191&j,N=j>>>13,O=0|s[8],B=8191&O,q=O>>>13,P=0|s[9],L=8191&P,$=P>>>13,U=0|a[0],D=8191&U,F=U>>>13,z=0|a[1],H=8191&z,Q=z>>>13,W=0|a[2],K=8191&W,V=W>>>13,Y=0|a[3],G=8191&Y,X=Y>>>13,J=0|a[4],Z=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,nt=et>>>13,it=0|a[6],ot=8191&it,st=it>>>13,at=0|a[7],ct=8191&at,ut=at>>>13,ht=0|a[8],ft=8191&ht,lt=ht>>>13,dt=0|a[9],pt=8191&dt,mt=dt>>>13;r.negative=t.negative^e.negative,r.length=19;var bt=(u+(n=Math.imul(f,D))|0)+((8191&(i=(i=Math.imul(f,F))+Math.imul(l,D)|0))<<13)|0;u=((o=Math.imul(l,F))+(i>>>13)|0)+(bt>>>26)|0,bt&=67108863,n=Math.imul(p,D),i=(i=Math.imul(p,F))+Math.imul(m,D)|0,o=Math.imul(m,F);var gt=(u+(n=n+Math.imul(f,H)|0)|0)+((8191&(i=(i=i+Math.imul(f,Q)|0)+Math.imul(l,H)|0))<<13)|0;u=((o=o+Math.imul(l,Q)|0)+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(g,D),i=(i=Math.imul(g,F))+Math.imul(y,D)|0,o=Math.imul(y,F),n=n+Math.imul(p,H)|0,i=(i=i+Math.imul(p,Q)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,Q)|0;var yt=(u+(n=n+Math.imul(f,K)|0)|0)+((8191&(i=(i=i+Math.imul(f,V)|0)+Math.imul(l,K)|0))<<13)|0;u=((o=o+Math.imul(l,V)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(v,D),i=(i=Math.imul(v,F))+Math.imul(w,D)|0,o=Math.imul(w,F),n=n+Math.imul(g,H)|0,i=(i=i+Math.imul(g,Q)|0)+Math.imul(y,H)|0,o=o+Math.imul(y,Q)|0,n=n+Math.imul(p,K)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(m,K)|0,o=o+Math.imul(m,V)|0;var _t=(u+(n=n+Math.imul(f,G)|0)|0)+((8191&(i=(i=i+Math.imul(f,X)|0)+Math.imul(l,G)|0))<<13)|0;u=((o=o+Math.imul(l,X)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(x,D),i=(i=Math.imul(x,F))+Math.imul(S,D)|0,o=Math.imul(S,F),n=n+Math.imul(v,H)|0,i=(i=i+Math.imul(v,Q)|0)+Math.imul(w,H)|0,o=o+Math.imul(w,Q)|0,n=n+Math.imul(g,K)|0,i=(i=i+Math.imul(g,V)|0)+Math.imul(y,K)|0,o=o+Math.imul(y,V)|0,n=n+Math.imul(p,G)|0,i=(i=i+Math.imul(p,X)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,X)|0;var vt=(u+(n=n+Math.imul(f,Z)|0)|0)+((8191&(i=(i=i+Math.imul(f,tt)|0)+Math.imul(l,Z)|0))<<13)|0;u=((o=o+Math.imul(l,tt)|0)+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(C,D),i=(i=Math.imul(C,F))+Math.imul(k,D)|0,o=Math.imul(k,F),n=n+Math.imul(x,H)|0,i=(i=i+Math.imul(x,Q)|0)+Math.imul(S,H)|0,o=o+Math.imul(S,Q)|0,n=n+Math.imul(v,K)|0,i=(i=i+Math.imul(v,V)|0)+Math.imul(w,K)|0,o=o+Math.imul(w,V)|0,n=n+Math.imul(g,G)|0,i=(i=i+Math.imul(g,X)|0)+Math.imul(y,G)|0,o=o+Math.imul(y,X)|0,n=n+Math.imul(p,Z)|0,i=(i=i+Math.imul(p,tt)|0)+Math.imul(m,Z)|0,o=o+Math.imul(m,tt)|0;var wt=(u+(n=n+Math.imul(f,rt)|0)|0)+((8191&(i=(i=i+Math.imul(f,nt)|0)+Math.imul(l,rt)|0))<<13)|0;u=((o=o+Math.imul(l,nt)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(R,D),i=(i=Math.imul(R,F))+Math.imul(M,D)|0,o=Math.imul(M,F),n=n+Math.imul(C,H)|0,i=(i=i+Math.imul(C,Q)|0)+Math.imul(k,H)|0,o=o+Math.imul(k,Q)|0,n=n+Math.imul(x,K)|0,i=(i=i+Math.imul(x,V)|0)+Math.imul(S,K)|0,o=o+Math.imul(S,V)|0,n=n+Math.imul(v,G)|0,i=(i=i+Math.imul(v,X)|0)+Math.imul(w,G)|0,o=o+Math.imul(w,X)|0,n=n+Math.imul(g,Z)|0,i=(i=i+Math.imul(g,tt)|0)+Math.imul(y,Z)|0,o=o+Math.imul(y,tt)|0,n=n+Math.imul(p,rt)|0,i=(i=i+Math.imul(p,nt)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,nt)|0;var Et=(u+(n=n+Math.imul(f,ot)|0)|0)+((8191&(i=(i=i+Math.imul(f,st)|0)+Math.imul(l,ot)|0))<<13)|0;u=((o=o+Math.imul(l,st)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(I,D),i=(i=Math.imul(I,F))+Math.imul(N,D)|0,o=Math.imul(N,F),n=n+Math.imul(R,H)|0,i=(i=i+Math.imul(R,Q)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,Q)|0,n=n+Math.imul(C,K)|0,i=(i=i+Math.imul(C,V)|0)+Math.imul(k,K)|0,o=o+Math.imul(k,V)|0,n=n+Math.imul(x,G)|0,i=(i=i+Math.imul(x,X)|0)+Math.imul(S,G)|0,o=o+Math.imul(S,X)|0,n=n+Math.imul(v,Z)|0,i=(i=i+Math.imul(v,tt)|0)+Math.imul(w,Z)|0,o=o+Math.imul(w,tt)|0,n=n+Math.imul(g,rt)|0,i=(i=i+Math.imul(g,nt)|0)+Math.imul(y,rt)|0,o=o+Math.imul(y,nt)|0,n=n+Math.imul(p,ot)|0,i=(i=i+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var xt=(u+(n=n+Math.imul(f,ct)|0)|0)+((8191&(i=(i=i+Math.imul(f,ut)|0)+Math.imul(l,ct)|0))<<13)|0;u=((o=o+Math.imul(l,ut)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(B,D),i=(i=Math.imul(B,F))+Math.imul(q,D)|0,o=Math.imul(q,F),n=n+Math.imul(I,H)|0,i=(i=i+Math.imul(I,Q)|0)+Math.imul(N,H)|0,o=o+Math.imul(N,Q)|0,n=n+Math.imul(R,K)|0,i=(i=i+Math.imul(R,V)|0)+Math.imul(M,K)|0,o=o+Math.imul(M,V)|0,n=n+Math.imul(C,G)|0,i=(i=i+Math.imul(C,X)|0)+Math.imul(k,G)|0,o=o+Math.imul(k,X)|0,n=n+Math.imul(x,Z)|0,i=(i=i+Math.imul(x,tt)|0)+Math.imul(S,Z)|0,o=o+Math.imul(S,tt)|0,n=n+Math.imul(v,rt)|0,i=(i=i+Math.imul(v,nt)|0)+Math.imul(w,rt)|0,o=o+Math.imul(w,nt)|0,n=n+Math.imul(g,ot)|0,i=(i=i+Math.imul(g,st)|0)+Math.imul(y,ot)|0,o=o+Math.imul(y,st)|0,n=n+Math.imul(p,ct)|0,i=(i=i+Math.imul(p,ut)|0)+Math.imul(m,ct)|0,o=o+Math.imul(m,ut)|0;var St=(u+(n=n+Math.imul(f,ft)|0)|0)+((8191&(i=(i=i+Math.imul(f,lt)|0)+Math.imul(l,ft)|0))<<13)|0;u=((o=o+Math.imul(l,lt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(L,D),i=(i=Math.imul(L,F))+Math.imul($,D)|0,o=Math.imul($,F),n=n+Math.imul(B,H)|0,i=(i=i+Math.imul(B,Q)|0)+Math.imul(q,H)|0,o=o+Math.imul(q,Q)|0,n=n+Math.imul(I,K)|0,i=(i=i+Math.imul(I,V)|0)+Math.imul(N,K)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(R,G)|0,i=(i=i+Math.imul(R,X)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,X)|0,n=n+Math.imul(C,Z)|0,i=(i=i+Math.imul(C,tt)|0)+Math.imul(k,Z)|0,o=o+Math.imul(k,tt)|0,n=n+Math.imul(x,rt)|0,i=(i=i+Math.imul(x,nt)|0)+Math.imul(S,rt)|0,o=o+Math.imul(S,nt)|0,n=n+Math.imul(v,ot)|0,i=(i=i+Math.imul(v,st)|0)+Math.imul(w,ot)|0,o=o+Math.imul(w,st)|0,n=n+Math.imul(g,ct)|0,i=(i=i+Math.imul(g,ut)|0)+Math.imul(y,ct)|0,o=o+Math.imul(y,ut)|0,n=n+Math.imul(p,ft)|0,i=(i=i+Math.imul(p,lt)|0)+Math.imul(m,ft)|0,o=o+Math.imul(m,lt)|0;var At=(u+(n=n+Math.imul(f,pt)|0)|0)+((8191&(i=(i=i+Math.imul(f,mt)|0)+Math.imul(l,pt)|0))<<13)|0;u=((o=o+Math.imul(l,mt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(L,H),i=(i=Math.imul(L,Q))+Math.imul($,H)|0,o=Math.imul($,Q),n=n+Math.imul(B,K)|0,i=(i=i+Math.imul(B,V)|0)+Math.imul(q,K)|0,o=o+Math.imul(q,V)|0,n=n+Math.imul(I,G)|0,i=(i=i+Math.imul(I,X)|0)+Math.imul(N,G)|0,o=o+Math.imul(N,X)|0,n=n+Math.imul(R,Z)|0,i=(i=i+Math.imul(R,tt)|0)+Math.imul(M,Z)|0,o=o+Math.imul(M,tt)|0,n=n+Math.imul(C,rt)|0,i=(i=i+Math.imul(C,nt)|0)+Math.imul(k,rt)|0,o=o+Math.imul(k,nt)|0,n=n+Math.imul(x,ot)|0,i=(i=i+Math.imul(x,st)|0)+Math.imul(S,ot)|0,o=o+Math.imul(S,st)|0,n=n+Math.imul(v,ct)|0,i=(i=i+Math.imul(v,ut)|0)+Math.imul(w,ct)|0,o=o+Math.imul(w,ut)|0,n=n+Math.imul(g,ft)|0,i=(i=i+Math.imul(g,lt)|0)+Math.imul(y,ft)|0,o=o+Math.imul(y,lt)|0;var Ct=(u+(n=n+Math.imul(p,pt)|0)|0)+((8191&(i=(i=i+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(L,K),i=(i=Math.imul(L,V))+Math.imul($,K)|0,o=Math.imul($,V),n=n+Math.imul(B,G)|0,i=(i=i+Math.imul(B,X)|0)+Math.imul(q,G)|0,o=o+Math.imul(q,X)|0,n=n+Math.imul(I,Z)|0,i=(i=i+Math.imul(I,tt)|0)+Math.imul(N,Z)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(R,rt)|0,i=(i=i+Math.imul(R,nt)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,nt)|0,n=n+Math.imul(C,ot)|0,i=(i=i+Math.imul(C,st)|0)+Math.imul(k,ot)|0,o=o+Math.imul(k,st)|0,n=n+Math.imul(x,ct)|0,i=(i=i+Math.imul(x,ut)|0)+Math.imul(S,ct)|0,o=o+Math.imul(S,ut)|0,n=n+Math.imul(v,ft)|0,i=(i=i+Math.imul(v,lt)|0)+Math.imul(w,ft)|0,o=o+Math.imul(w,lt)|0;var kt=(u+(n=n+Math.imul(g,pt)|0)|0)+((8191&(i=(i=i+Math.imul(g,mt)|0)+Math.imul(y,pt)|0))<<13)|0;u=((o=o+Math.imul(y,mt)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(L,G),i=(i=Math.imul(L,X))+Math.imul($,G)|0,o=Math.imul($,X),n=n+Math.imul(B,Z)|0,i=(i=i+Math.imul(B,tt)|0)+Math.imul(q,Z)|0,o=o+Math.imul(q,tt)|0,n=n+Math.imul(I,rt)|0,i=(i=i+Math.imul(I,nt)|0)+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(R,ot)|0,i=(i=i+Math.imul(R,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,n=n+Math.imul(C,ct)|0,i=(i=i+Math.imul(C,ut)|0)+Math.imul(k,ct)|0,o=o+Math.imul(k,ut)|0,n=n+Math.imul(x,ft)|0,i=(i=i+Math.imul(x,lt)|0)+Math.imul(S,ft)|0,o=o+Math.imul(S,lt)|0;var Tt=(u+(n=n+Math.imul(v,pt)|0)|0)+((8191&(i=(i=i+Math.imul(v,mt)|0)+Math.imul(w,pt)|0))<<13)|0;u=((o=o+Math.imul(w,mt)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(L,Z),i=(i=Math.imul(L,tt))+Math.imul($,Z)|0,o=Math.imul($,tt),n=n+Math.imul(B,rt)|0,i=(i=i+Math.imul(B,nt)|0)+Math.imul(q,rt)|0,o=o+Math.imul(q,nt)|0,n=n+Math.imul(I,ot)|0,i=(i=i+Math.imul(I,st)|0)+Math.imul(N,ot)|0,o=o+Math.imul(N,st)|0,n=n+Math.imul(R,ct)|0,i=(i=i+Math.imul(R,ut)|0)+Math.imul(M,ct)|0,o=o+Math.imul(M,ut)|0,n=n+Math.imul(C,ft)|0,i=(i=i+Math.imul(C,lt)|0)+Math.imul(k,ft)|0,o=o+Math.imul(k,lt)|0;var Rt=(u+(n=n+Math.imul(x,pt)|0)|0)+((8191&(i=(i=i+Math.imul(x,mt)|0)+Math.imul(S,pt)|0))<<13)|0;u=((o=o+Math.imul(S,mt)|0)+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,n=Math.imul(L,rt),i=(i=Math.imul(L,nt))+Math.imul($,rt)|0,o=Math.imul($,nt),n=n+Math.imul(B,ot)|0,i=(i=i+Math.imul(B,st)|0)+Math.imul(q,ot)|0,o=o+Math.imul(q,st)|0,n=n+Math.imul(I,ct)|0,i=(i=i+Math.imul(I,ut)|0)+Math.imul(N,ct)|0,o=o+Math.imul(N,ut)|0,n=n+Math.imul(R,ft)|0,i=(i=i+Math.imul(R,lt)|0)+Math.imul(M,ft)|0,o=o+Math.imul(M,lt)|0;var Mt=(u+(n=n+Math.imul(C,pt)|0)|0)+((8191&(i=(i=i+Math.imul(C,mt)|0)+Math.imul(k,pt)|0))<<13)|0;u=((o=o+Math.imul(k,mt)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(L,ot),i=(i=Math.imul(L,st))+Math.imul($,ot)|0,o=Math.imul($,st),n=n+Math.imul(B,ct)|0,i=(i=i+Math.imul(B,ut)|0)+Math.imul(q,ct)|0,o=o+Math.imul(q,ut)|0,n=n+Math.imul(I,ft)|0,i=(i=i+Math.imul(I,lt)|0)+Math.imul(N,ft)|0,o=o+Math.imul(N,lt)|0;var jt=(u+(n=n+Math.imul(R,pt)|0)|0)+((8191&(i=(i=i+Math.imul(R,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,n=Math.imul(L,ct),i=(i=Math.imul(L,ut))+Math.imul($,ct)|0,o=Math.imul($,ut),n=n+Math.imul(B,ft)|0,i=(i=i+Math.imul(B,lt)|0)+Math.imul(q,ft)|0,o=o+Math.imul(q,lt)|0;var It=(u+(n=n+Math.imul(I,pt)|0)|0)+((8191&(i=(i=i+Math.imul(I,mt)|0)+Math.imul(N,pt)|0))<<13)|0;u=((o=o+Math.imul(N,mt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(L,ft),i=(i=Math.imul(L,lt))+Math.imul($,ft)|0,o=Math.imul($,lt);var Nt=(u+(n=n+Math.imul(B,pt)|0)|0)+((8191&(i=(i=i+Math.imul(B,mt)|0)+Math.imul(q,pt)|0))<<13)|0;u=((o=o+Math.imul(q,mt)|0)+(i>>>13)|0)+(Nt>>>26)|0,Nt&=67108863;var Ot=(u+(n=Math.imul(L,pt))|0)+((8191&(i=(i=Math.imul(L,mt))+Math.imul($,pt)|0))<<13)|0;return u=((o=Math.imul($,mt))+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,c[0]=bt,c[1]=gt,c[2]=yt,c[3]=_t,c[4]=vt,c[5]=wt,c[6]=Et,c[7]=xt,c[8]=St,c[9]=At,c[10]=Ct,c[11]=kt,c[12]=Tt,c[13]=Rt,c[14]=Mt,c[15]=jt,c[16]=It,c[17]=Nt,c[18]=Ot,0!==u&&(c[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(d=l),o.prototype.mulTo=function(t,e){var r=this.length+t.length;return 10===this.length&&10===t.length?d(this,t,e):r<63?l(this,t,e):r<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,n=s,s=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}(this,t,e):p(this,t,e)},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n},m.prototype.permute=function(t,e,r,n,i,o){for(var s=0;s>>=1)i++;return 1<>>=13,r[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var s=0;for(e=0;e>>26-r}s&&(this.words[e]=s,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0),i=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==h||u>=i);u--){var f=0|this.words[u];this.words[u]=h<<26-o|f>>>o,h=f&a}return c&&0!==h&&(c.words[c.length++]=h),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n(\"number\"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,\"imaskn works only with positive numbers\"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n(\"number\"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(c/67108864|0),this.words[i+r]=67108863&o}for(;i>26,this.words[i+r]=67108863&o;if(0===a)return this.strip();for(n(-1===a),a=0,i=0;i>26,this.words[i]=67108863&o;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,s=0|i.words[i.length-1];0!==(r=26-this._countBits(s))&&(i=i.ushln(r),n.iushln(r),s=0|i.words[i.length-1]);var a,c=n.length-i.length;if(\"mod\"!==e){(a=new o(null)).length=c+1,a.words=new Array(a.length);for(var u=0;u=0;f--){var l=67108864*(0|n.words[i.length+f])+(0|n.words[i.length+f-1]);for(l=Math.min(l/s|0,67108863),n._ishlnsubmul(i,l,f);0!==n.negative;)l--,n.negative=0,n._ishlnsubmul(i,1,f),n.isZero()||(n.negative^=1);a&&(a.words[f]=l)}return a&&a.strip(),n.strip(),\"div\"!==e&&0!==r&&n.iushrn(r),{div:a||null,mod:n}},o.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new o(0),mod:new o(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),\"mod\"!==e&&(i=a.div.neg()),\"div\"!==e&&(s=a.mod.neg(),r&&0!==s.negative&&s.iadd(t)),{div:i,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),\"mod\"!==e&&(i=a.div.neg()),{div:i,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),\"div\"!==e&&(s=a.mod.neg(),r&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?\"div\"===e?{div:this.divn(t.words[0]),mod:null}:\"mod\"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,s,a},o.prototype.div=function(t){return this.divmod(t,\"div\",!1).div},o.prototype.mod=function(t){return this.divmod(t,\"mod\",!1).mod},o.prototype.umod=function(t){return this.divmod(t,\"mod\",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),s=new o(0),a=new o(0),c=new o(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var h=r.clone(),f=e.clone();!e.isZero();){for(var l=0,d=1;0==(e.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(e.iushrn(l);l-- >0;)(i.isOdd()||s.isOdd())&&(i.iadd(h),s.isub(f)),i.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(r.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(a.isOdd()||c.isOdd())&&(a.iadd(h),c.isub(f)),a.iushrn(1),c.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(a),s.isub(c)):(r.isub(e),a.isub(i),c.isub(s))}return{a:a,b:c,gcd:r.iushln(u)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,s=new o(1),a=new o(0),c=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var u=0,h=1;0==(e.words[0]&h)&&u<26;++u,h<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(c),s.iushrn(1);for(var f=0,l=1;0==(r.words[0]&l)&&f<26;++f,l<<=1);if(f>0)for(r.iushrn(f);f-- >0;)a.isOdd()&&a.iadd(c),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),s.isub(a)):(r.isub(e),a.isub(s))}return(i=0===e.cmpn(1)?s:a).cmpn(0)<0&&i.iadd(t),i},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0==(1&this.words[0])},o.prototype.isOdd=function(){return 1==(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n(\"number\"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,\"Number is too big\");var i=0|this.words[0];e=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return-1===this.cmpn(t)},o.prototype.lt=function(t){return-1===this.cmp(t)},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new E(t)},o.prototype.toRed=function(t){return n(!this.red,\"Already a number in reduction context\"),n(0===this.negative,\"red works only with positives\"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,\"fromRed works only with numbers in reduction context\"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,\"Already a number in reduction context\"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,\"redAdd works only with red numbers\"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,\"redIAdd works only with red numbers\"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,\"redSub works only with red numbers\"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,\"redISub works only with red numbers\"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,\"redShl works only with red numbers\"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,\"redSqr works only with red numbers\"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,\"redISqr works only with red numbers\"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,\"redSqrt works only with red numbers\"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,\"redInvm works only with red numbers\"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,\"redNeg works only with red numbers\"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,\"redPow(normalNum)\"),this.red._verify1(this),this.red.pow(this,t)};var b={k256:null,p224:null,p192:null,p25519:null};function g(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function y(){g.call(this,\"k256\",\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\")}function _(){g.call(this,\"p224\",\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\")}function v(){g.call(this,\"p192\",\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\")}function w(){g.call(this,\"25519\",\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\")}function E(t){if(\"string\"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),\"modulus must be greater than 1\"),this.m=t,this.prime=null}function x(t){E.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}g.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},g.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},g.prototype.split=function(t,e){t.iushrn(this.n,0,e)},g.prototype.imulK=function(t){return t.imul(this.k)},i(y,g),y.prototype.split=function(t,e){for(var r=Math.min(t.length,9),n=0;n>>22,i=o}i>>>=22,t.words[n-10]=i,0===i&&t.length>10?t.length-=10:t.length-=9},y.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function(t){if(b[t])return b[t];var e;if(\"k256\"===t)e=new y;else if(\"p224\"===t)e=new _;else if(\"p192\"===t)e=new v;else{if(\"p25519\"!==t)throw new Error(\"Unknown prime \"+t);e=new w}return b[t]=e,e},E.prototype._verify1=function(t){n(0===t.negative,\"red works only with positives\"),n(t.red,\"red works only with red numbers\")},E.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),\"red works only with positives\"),n(t.red&&t.red===e.red,\"red works only with red numbers\")},E.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},E.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},E.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},E.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},E.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},E.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},E.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},E.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},E.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},E.prototype.isqr=function(t){return this.imul(t,t.clone())},E.prototype.sqr=function(t){return this.mul(t,t)},E.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),s=0;!i.isZero()&&0===i.andln(1);)s++,i.iushrn(1);n(!i.isZero());var a=new o(1).toRed(this),c=a.redNeg(),u=this.m.subn(1).iushrn(1),h=this.m.bitLength();for(h=new o(2*h*h).toRed(this);0!==this.pow(h,u).cmp(c);)h.redIAdd(c);for(var f=this.pow(h,i),l=this.pow(t,i.addn(1).iushrn(1)),d=this.pow(t,i),p=s;0!==d.cmp(a);){for(var m=d,b=0;0!==m.cmp(a);b++)m=m.redSqr();n(b=0;n--){for(var u=e.words[n],h=c-1;h>=0;h--){var f=u>>h&1;i!==r[0]&&(i=this.sqr(i)),0!==f||0!==s?(s<<=1,s|=f,(4===++a||0===n&&0===h)&&(i=this.mul(i,r[s]),a=0,s=0)):a=0}c=26}return i},E.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},E.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new x(t)},i(x,E),x.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},x.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},x.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},x.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},x.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t,this)}).call(this,r(77)(t))},function(t,e){var r,n,i=t.exports={};function o(){throw new Error(\"setTimeout has not been defined\")}function s(){throw new Error(\"clearTimeout has not been defined\")}function a(t){if(r===setTimeout)return setTimeout(t,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r=\"function\"==typeof setTimeout?setTimeout:o}catch(t){r=o}try{n=\"function\"==typeof clearTimeout?clearTimeout:s}catch(t){n=s}}();var c,u=[],h=!1,f=-1;function l(){h&&c&&(h=!1,c.length?u=c.concat(u):f=-1,u.length&&d())}function d(){if(!h){var t=a(l);h=!0;for(var e=u.length;e;){for(c=u,u=[];++f1)for(var r=1;r0;)u(t)}function u(t){var e=t.shift();if(\"function\"!=typeof e)e._settlePromises();else{var r=t.shift(),n=t.shift();e.call(r,n)}}a.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},a.prototype.hasCustomScheduler=function(){return this._customScheduler},a.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},a.prototype.fatalError=function(t,r){r?(e.stderr.write(\"Fatal \"+(t instanceof Error?t.stack:t)+\"\\n\"),e.exit(2)):this.throwLater(t)},a.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),\"undefined\"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(t){throw new Error(\"No async scheduler available\\n\\n See http://goo.gl/MqrFmX\\n\")}},a.prototype.invokeLater=function(t,e,r){this._lateQueue.push(t,e,r),this._queueTick()},a.prototype.invoke=function(t,e,r){this._normalQueue.push(t,e,r),this._queueTick()},a.prototype.settlePromises=function(t){this._normalQueue._pushOne(t),this._queueTick()},a.prototype._drainQueues=function(){c(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,c(this._lateQueue)},a.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},a.prototype._reset=function(){this._isTickUsed=!1},r.exports=a,r.exports.firstLineError=i},{\"./queue\":26,\"./schedule\":29}],3:[function(t,e,r){\"use strict\";e.exports=function(t,e,r,n){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0==(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=n.propagateFromFunction(),t.prototype._boundValue=n.boundValueFunction());var u=r(o),h=new t(e);h._propagateFrom(this,1);var f=this._target();if(h._setBoundTo(u),u instanceof t){var l={promiseRejectionQueued:!1,promise:h,target:f,bindingPromise:u};f._then(e,s,void 0,h,l),u._then(a,c,void 0,h,l),h._setOnCancel(u)}else h._resolveCallback(f);return h},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152==(2097152&this._bitField)},t.bind=function(e,r){return t.resolve(r).bind(e)}}},{}],4:[function(t,e,r){\"use strict\";var n;\"undefined\"!=typeof Promise&&(n=Promise);var i=t(\"./promise\")();i.noConflict=function(){try{Promise===i&&(Promise=n)}catch(t){}return i},e.exports=i},{\"./promise\":22}],5:[function(t,e,r){\"use strict\";var n=Object.create;if(n){var i=n(null),o=n(null);i[\" size\"]=o[\" size\"]=0}e.exports=function(e){var r=t(\"./util\"),n=r.canEvaluate;r.isIdentifier;function i(t){return function(t,n){var i;if(null!=t&&(i=t[n]),\"function\"!=typeof i){var o=\"Object \"+r.classString(t)+\" has no method '\"+r.toString(n)+\"'\";throw new e.TypeError(o)}return i}(t,this.pop()).apply(t,this)}function o(t){return t[this]}function s(t){var e=+this;return e<0&&(e=Math.max(0,e+t.length)),t[e]}e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(i,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e;if(\"number\"==typeof t)e=s;else if(n){var r=(void 0)(t);e=null!==r?r:o}else e=o;return this._then(e,void 0,void 0,t,void 0)}}},{\"./util\":36}],6:[function(t,e,r){\"use strict\";e.exports=function(e,r,n,i){var o=t(\"./util\"),s=o.tryCatch,a=o.errorObj,c=e._async;e.prototype.break=e.prototype.cancel=function(){if(!i.cancellation())return this._warn(\"cancellation is disabled\");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var r=t._cancellationParent;if(null==r||!r._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=r}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),!!this._enoughBranchesHaveCancelled()&&(this._invokeOnCancel(),!0))},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var r=0;r=0)return r[t]}return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},n.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,r.push(this._trace))},n.prototype._popContext=function(){if(void 0!==this._trace){var t=r.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},n.CapturedTrace=null,n.create=function(){if(e)return new n},n.deactivateLongStackTraces=function(){},n.activateLongStackTraces=function(){var r=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;n.deactivateLongStackTraces=function(){t.prototype._pushContext=r,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,e=!1},e=!0,t.prototype._pushContext=n.prototype._pushContext,t.prototype._popContext=n.prototype._popContext,t._peekContext=t.prototype._peekContext=i,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},n}},{}],9:[function(t,r,n){\"use strict\";r.exports=function(r,n,i,o){var s,a,c,u,h=r._async,f=t(\"./errors\").Warning,l=t(\"./util\"),d=t(\"./es5\"),p=l.canAttachTrace,m=/[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](release|debug|instrumented)/,b=/\\((?:timers\\.js):\\d+:\\d+\\)/,g=/[\\/<\\(](.+?):(\\d+):(\\d+)\\)?\\s*$/,y=null,_=null,v=!1,w=!(0==l.env(\"BLUEBIRD_DEBUG\")),E=!(0==l.env(\"BLUEBIRD_WARNINGS\")||!w&&!l.env(\"BLUEBIRD_WARNINGS\")),x=!(0==l.env(\"BLUEBIRD_LONG_STACK_TRACES\")||!w&&!l.env(\"BLUEBIRD_LONG_STACK_TRACES\")),S=0!=l.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\")&&(E||!!l.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\"));!function(){var t=[];function e(){for(var e=0;e0},r.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},r.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},r.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},r.prototype._warn=function(t,e,r){return H(t,e,r||this)},r.onPossiblyUnhandledRejection=function(t){var e=r._getContext();a=l.contextBind(e,t)},r.onUnhandledRejectionHandled=function(t){var e=r._getContext();s=l.contextBind(e,t)};var A=function(){};r.longStackTraces=function(){if(h.haveItemsQueued()&&!rt.longStackTraces)throw new Error(\"cannot enable long stack traces after promises have been created\\n\\n See http://goo.gl/MqrFmX\\n\");if(!rt.longStackTraces&&G()){var t=r.prototype._captureStackTrace,e=r.prototype._attachExtraTrace,i=r.prototype._dereferenceTrace;rt.longStackTraces=!0,A=function(){if(h.haveItemsQueued()&&!rt.longStackTraces)throw new Error(\"cannot enable long stack traces after promises have been created\\n\\n See http://goo.gl/MqrFmX\\n\");r.prototype._captureStackTrace=t,r.prototype._attachExtraTrace=e,r.prototype._dereferenceTrace=i,n.deactivateLongStackTraces(),rt.longStackTraces=!1},r.prototype._captureStackTrace=D,r.prototype._attachExtraTrace=F,r.prototype._dereferenceTrace=z,n.activateLongStackTraces()}},r.hasLongStackTraces=function(){return rt.longStackTraces&&G()};var C={unhandledrejection:{before:function(){var t=l.global.onunhandledrejection;return l.global.onunhandledrejection=null,t},after:function(t){l.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=l.global.onrejectionhandled;return l.global.onrejectionhandled=null,t},after:function(t){l.global.onrejectionhandled=t}}},k=function(){var t=function(t,e){if(!t)return!l.global.dispatchEvent(e);var r;try{return r=t.before(),!l.global.dispatchEvent(e)}finally{t.after(r)}};try{if(\"function\"==typeof CustomEvent){var e=new CustomEvent(\"CustomEvent\");return l.global.dispatchEvent(e),function(e,r){e=e.toLowerCase();var n=new CustomEvent(e,{detail:r,cancelable:!0});return d.defineProperty(n,\"promise\",{value:r.promise}),d.defineProperty(n,\"reason\",{value:r.reason}),t(C[e],n)}}if(\"function\"==typeof Event){e=new Event(\"CustomEvent\");return l.global.dispatchEvent(e),function(e,r){e=e.toLowerCase();var n=new Event(e,{cancelable:!0});return n.detail=r,d.defineProperty(n,\"promise\",{value:r.promise}),d.defineProperty(n,\"reason\",{value:r.reason}),t(C[e],n)}}return(e=document.createEvent(\"CustomEvent\")).initCustomEvent(\"testingtheevent\",!1,!0,{}),l.global.dispatchEvent(e),function(e,r){e=e.toLowerCase();var n=document.createEvent(\"CustomEvent\");return n.initCustomEvent(e,!1,!0,r),t(C[e],n)}}catch(t){}return function(){return!1}}(),T=l.isNode?function(){return e.emit.apply(e,arguments)}:l.global?function(t){var e=\"on\"+t.toLowerCase(),r=l.global[e];return!!r&&(r.apply(l.global,[].slice.call(arguments,1)),!0)}:function(){return!1};function R(t,e){return{promise:e}}var M={promiseCreated:R,promiseFulfilled:R,promiseRejected:R,promiseResolved:R,promiseCancelled:R,promiseChained:function(t,e,r){return{promise:e,child:r}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,r){return{reason:e,promise:r}},rejectionHandled:R},j=function(t){var e=!1;try{e=T.apply(null,arguments)}catch(t){h.throwLater(t),e=!0}var r=!1;try{r=k(t,M[t].apply(null,arguments))}catch(t){h.throwLater(t),r=!0}return r||e};function I(){return!1}function N(t,e,r){var n=this;try{t(e,r,function(t){if(\"function\"!=typeof t)throw new TypeError(\"onCancel must be a function, got: \"+l.toString(t));n._attachCancellationCallback(t)})}catch(t){return t}}function O(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?l.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function B(){return this._onCancelField}function q(t){this._onCancelField=t}function P(){this._cancellationParent=void 0,this._onCancelField=void 0}function L(t,e){if(0!=(1&e)){this._cancellationParent=t;var r=t._branchesRemainingToCancel;void 0===r&&(r=0),t._branchesRemainingToCancel=r+1}0!=(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}r.config=function(t){if(\"longStackTraces\"in(t=Object(t))&&(t.longStackTraces?r.longStackTraces():!t.longStackTraces&&r.hasLongStackTraces()&&A()),\"warnings\"in t){var e=t.warnings;rt.warnings=!!e,S=rt.warnings,l.isObject(e)&&\"wForgottenReturn\"in e&&(S=!!e.wForgottenReturn)}if(\"cancellation\"in t&&t.cancellation&&!rt.cancellation){if(h.haveItemsQueued())throw new Error(\"cannot enable cancellation after promises are in use\");r.prototype._clearCancellationData=P,r.prototype._propagateFrom=L,r.prototype._onCancel=B,r.prototype._setOnCancel=q,r.prototype._attachCancellationCallback=O,r.prototype._execute=N,$=L,rt.cancellation=!0}if(\"monitoring\"in t&&(t.monitoring&&!rt.monitoring?(rt.monitoring=!0,r.prototype._fireEvent=j):!t.monitoring&&rt.monitoring&&(rt.monitoring=!1,r.prototype._fireEvent=I)),\"asyncHooks\"in t&&l.nodeSupportsAsyncResource){var n=rt.asyncHooks,s=!!t.asyncHooks;n!==s&&(rt.asyncHooks=s,s?i():o())}return r},r.prototype._fireEvent=I,r.prototype._execute=function(t,e,r){try{t(e,r)}catch(t){return t}},r.prototype._onCancel=function(){},r.prototype._setOnCancel=function(t){},r.prototype._attachCancellationCallback=function(t){},r.prototype._captureStackTrace=function(){},r.prototype._attachExtraTrace=function(){},r.prototype._dereferenceTrace=function(){},r.prototype._clearCancellationData=function(){},r.prototype._propagateFrom=function(t,e){};var $=function(t,e){0!=(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)};function U(){var t=this._boundTo;return void 0!==t&&t instanceof r?t.isFulfilled()?t.value():void 0:t}function D(){this._trace=new tt(this._peekContext())}function F(t,e){if(p(t)){var r=this._trace;if(void 0!==r&&e&&(r=r._parent),void 0!==r)r.attachExtraTrace(t);else if(!t.__stackCleaned__){var n=W(t);l.notEnumerableProp(t,\"stack\",n.message+\"\\n\"+n.stack.join(\"\\n\")),l.notEnumerableProp(t,\"__stackCleaned__\",!0)}}}function z(){this._trace=void 0}function H(t,e,n){if(rt.warnings){var i,o=new f(t);if(e)n._attachExtraTrace(o);else if(rt.longStackTraces&&(i=r._peekContext()))i.attachExtraTrace(o);else{var s=W(o);o.stack=s.message+\"\\n\"+s.stack.join(\"\\n\")}j(\"warning\",o)||K(o,\"\",!0)}}function Q(t){for(var e=[],r=0;r0?function(t){for(var e=t.stack.replace(/\\s+$/g,\"\").split(\"\\n\"),r=0;r0&&\"SyntaxError\"!=t.name&&(e=e.slice(r)),e}(t):[\" (No stack trace)\"],{message:r,stack:\"SyntaxError\"==t.name?e:Q(e)}}function K(t,e,r){if(\"undefined\"!=typeof console){var n;if(l.isObject(t)){var i=t.stack;n=e+_(i,t)}else n=e+String(t);\"function\"==typeof c?c(n,r):\"function\"!=typeof console.log&&\"object\"!=typeof console.log||console.log(n)}}function V(t,e,r,n){var i=!1;try{\"function\"==typeof e&&(i=!0,\"rejectionHandled\"===t?e(n):e(r,n))}catch(t){h.throwLater(t)}\"unhandledRejection\"===t?j(t,r,n)||i||K(r,\"Unhandled rejection \"):j(t,n)}function Y(t){var e;if(\"function\"==typeof t)e=\"[function \"+(t.name||\"anonymous\")+\"]\";else{e=t&&\"function\"==typeof t.toString?t.toString():l.toString(t);if(/\\[object [a-zA-Z0-9$_]+\\]/.test(e))try{e=JSON.stringify(t)}catch(t){}0===e.length&&(e=\"(empty array)\")}return\"(<\"+function(t){if(t.length<41)return t;return t.substr(0,38)+\"...\"}(e)+\">, no stack trace)\"}function G(){return\"function\"==typeof et}var X=function(){return!1},J=/[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;function Z(t){var e=t.match(J);if(e)return{fileName:e[1],line:parseInt(e[2],10)}}function tt(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);et(this,tt),e>32&&this.uncycle()}l.inherits(tt,Error),n.CapturedTrace=tt,tt.prototype.uncycle=function(){var t=this._length;if(!(t<2)){for(var e=[],r={},n=0,i=this;void 0!==i;++n)e.push(i),i=i._parent;for(n=(t=this._length=n)-1;n>=0;--n){var o=e[n].stack;void 0===r[o]&&(r[o]=n)}for(n=0;n0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[n]._parent=void 0,e[n]._length=1;var a=n>0?e[n-1]:this;s=0;--u)e[u]._length=c,c++;return}}}},tt.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=W(t),r=e.message,n=[e.stack],i=this;void 0!==i;)n.push(Q(i.stack.split(\"\\n\"))),i=i._parent;!function(t){for(var e=t[0],r=1;r=0;--a)if(n[a]===o){s=a;break}for(a=s;a>=0;--a){var c=n[a];if(e[i]!==c)break;e.pop(),i--}e=n}}(n),function(t){for(var e=0;e=0)return y=/@/,_=e,v=!0,function(t){t.stack=(new Error).stack};try{throw new Error}catch(t){n=\"stack\"in t}return\"stack\"in i||!n||\"number\"!=typeof Error.stackTraceLimit?(_=function(t,e){return\"string\"==typeof t?t:\"object\"!=typeof e&&\"function\"!=typeof e||void 0===e.name||void 0===e.message?Y(e):e.toString()},null):(y=t,_=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}();\"undefined\"!=typeof console&&void 0!==console.warn&&(c=function(t){console.warn(t)},l.isNode&&e.stderr.isTTY?c=function(t,e){var r=e?\"\u001b[33m\":\"\u001b[31m\";console.warn(r+t+\"\u001b[0m\\n\")}:l.isNode||\"string\"!=typeof(new Error).stack||(c=function(t,e){console.warn(\"%c\"+t,e?\"color: darkorange\":\"color: red\")}));var rt={warnings:E,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return x&&r.longStackTraces(),{asyncHooks:function(){return rt.asyncHooks},longStackTraces:function(){return rt.longStackTraces},warnings:function(){return rt.warnings},cancellation:function(){return rt.cancellation},monitoring:function(){return rt.monitoring},propagateFromFunction:function(){return $},boundValueFunction:function(){return U},checkForgottenReturns:function(t,e,r,n,i){if(void 0===t&&null!==e&&S){if(void 0!==i&&i._returnedNonUndefined())return;if(0==(65535&n._bitField))return;r&&(r+=\" \");var o=\"\",s=\"\";if(e._trace){for(var a=e._trace.stack.split(\"\\n\"),c=Q(a),u=c.length-1;u>=0;--u){var h=c[u];if(!b.test(h)){var f=h.match(g);f&&(o=\"at \"+f[1]+\":\"+f[2]+\":\"+f[3]+\" \");break}}if(c.length>0){var l=c[0];for(u=0;u0&&(s=\"\\n\"+a[u-1]);break}}}var d=\"a promise was created in a \"+r+\"handler \"+o+\"but was not returned from it, see http://goo.gl/rRqMUw\"+s;n._warn(d,!0,e)}},setBounds:function(t,e){if(G()){for(var r,n,i=(t.stack||\"\").split(\"\\n\"),o=(e.stack||\"\").split(\"\\n\"),s=-1,a=-1,c=0;c=a||(X=function(t){if(m.test(t))return!0;var e=Z(t);return!!(e&&e.fileName===r&&s<=e.line&&e.line<=a)})}},warn:H,deprecated:function(t,e){var r=t+\" is deprecated and will be removed in a future version.\";return e&&(r+=\" Use \"+e+\" instead.\"),H(r)},CapturedTrace:tt,fireDomEvent:k,fireGlobalEvent:T}}},{\"./errors\":12,\"./es5\":13,\"./util\":36}],10:[function(t,e,r){\"use strict\";e.exports=function(t){function e(){return this.value}function r(){throw this.reason}t.prototype.return=t.prototype.thenReturn=function(r){return r instanceof t&&r.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:r},void 0)},t.prototype.throw=t.prototype.thenThrow=function(t){return this._then(r,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,r,void 0,{reason:t},void 0);var e=arguments[1];return this.caught(t,function(){throw e})},t.prototype.catchReturn=function(r){if(arguments.length<=1)return r instanceof t&&r.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:r},void 0);var n=arguments[1];n instanceof t&&n.suppressUnhandledRejections();return this.caught(r,function(){return n})}}},{}],11:[function(t,e,r){\"use strict\";e.exports=function(t,e){var r=t.reduce,n=t.all;function i(){return n(this)}t.prototype.each=function(t){return r(this,t,e,0)._then(i,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return r(this,t,e,e)},t.each=function(t,n){return r(t,n,e,0)._then(i,void 0,void 0,t,void 0)},t.mapSeries=function(t,n){return r(t,n,e,e)}}},{}],12:[function(t,e,r){\"use strict\";var n,i,o=t(\"./es5\"),s=o.freeze,a=t(\"./util\"),c=a.inherits,u=a.notEnumerableProp;function h(t,e){function r(n){if(!(this instanceof r))return new r(n);u(this,\"message\",\"string\"==typeof n?n:e),u(this,\"name\",t),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this)}return c(r,Error),r}var f=h(\"Warning\",\"warning\"),l=h(\"CancellationError\",\"cancellation error\"),d=h(\"TimeoutError\",\"timeout error\"),p=h(\"AggregateError\",\"aggregate error\");try{n=TypeError,i=RangeError}catch(t){n=h(\"TypeError\",\"type error\"),i=h(\"RangeError\",\"range error\")}for(var m=\"join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse\".split(\" \"),b=0;b1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0)}function f(){return d.call(this,this.promise._target()._settledValue())}function l(t){if(!h(this,t))return s.e=t,s}function d(t){var i=this.promise,a=this.handler;if(!this.called){this.called=!0;var c=this.isFinallyHandler()?a.call(i._boundValue()):a.call(i._boundValue(),t);if(c===n)return c;if(void 0!==c){i._setReturnedNonUndefined();var d=r(c,i);if(d instanceof e){if(null!=this.cancelPromise){if(d._isCancelled()){var p=new o(\"late cancellation observer\");return i._attachExtraTrace(p),s.e=p,s}d.isPending()&&d._attachCancellationCallback(new u(this))}return d._then(f,l,void 0,this,void 0)}}}return i.isRejected()?(h(this),s.e=t,s):(h(this),t)}return c.prototype.isFinallyHandler=function(){return 0===this.type},u.prototype._resultCancelled=function(){h(this.finallyHandler)},e.prototype._passThrough=function(t,e,r,n){return\"function\"!=typeof t?this.then():this._then(r,n,void 0,new c(this,e,t),void 0)},e.prototype.lastly=e.prototype.finally=function(t){return this._passThrough(t,0,d,d)},e.prototype.tap=function(t){return this._passThrough(t,1,d)},e.prototype.tapCatch=function(t){var r=arguments.length;if(1===r)return this._passThrough(t,1,void 0,d);var n,o=new Array(r-1),s=0;for(n=0;n0&&\"function\"==typeof arguments[e]&&(t=arguments[e]);var n=[].slice.call(arguments);t&&n.pop();var i=new r(n).promise();return void 0!==t?i.spread(t):i}}},{\"./util\":36}],18:[function(t,e,r){\"use strict\";e.exports=function(e,r,n,i,o,s){var a=t(\"./util\"),c=a.tryCatch,u=a.errorObj,h=e._async;function f(t,r,n,i){this.constructor$(t),this._promise._captureStackTrace();var s=e._getContext();if(this._callback=a.contextBind(s,r),this._preservedValues=i===o?new Array(this.length()):null,this._limit=n,this._inFlight=0,this._queue=[],h.invoke(this._asyncInit,this,void 0),a.isArray(t))for(var c=0;c=1?s:0,o).promise()}a.inherits(f,r),f.prototype._asyncInit=function(){this._init$(void 0,-2)},f.prototype._init=function(){},f.prototype._promiseFulfilled=function(t,r){var n=this._values,o=this.length(),a=this._preservedValues,h=this._limit;if(r<0){if(n[r=-1*r-1]=t,h>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(h>=1&&this._inFlight>=h)return n[r]=t,this._queue.push(r),!1;null!==a&&(a[r]=t);var f=this._promise,l=this._callback,d=f._boundValue();f._pushContext();var p=c(l).call(d,t,r,o),m=f._popContext();if(s.checkForgottenReturns(p,m,null!==a?\"Promise.filter\":\"Promise.map\",f),p===u)return this._reject(p.e),!0;var b=i(p,this._promise);if(b instanceof e){var g=(b=b._target())._bitField;if(0==(50397184&g))return h>=1&&this._inFlight++,n[r]=b,b._proxy(this,-1*(r+1)),!1;if(0==(33554432&g))return 0!=(16777216&g)?(this._reject(b._reason()),!0):(this._cancel(),!0);p=b._value()}n[r]=p}return++this._totalResolved>=o&&(null!==a?this._filter(n,a):this._resolve(n),!0)},f.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,r=this._values;t.length>0&&this._inFlight1){o.deprecated(\"calling Promise.try with more than 1 argument\");var u=arguments[1],h=arguments[2];n=s.isArray(u)?a(t).apply(h,u):a(t).call(h,u)}else n=a(t)();var f=c._popContext();return o.checkForgottenReturns(n,f,\"Promise.try\",c),c._resolveFromSyncValue(n),c},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{\"./util\":36}],20:[function(t,e,r){\"use strict\";var n=t(\"./util\"),i=n.maybeWrapAsError,o=t(\"./errors\").OperationalError,s=t(\"./es5\");var a=/^(?:name|message|stack|cause)$/;function c(t){var e;if(function(t){return t instanceof Error&&s.getPrototypeOf(t)===Error.prototype}(t)){(e=new o(t)).name=t.name,e.message=t.message,e.stack=t.stack;for(var r=s.keys(t),i=0;i1){var r,n=new Array(e-1),i=0;for(r=0;r0&&\"function\"!=typeof t&&\"function\"!=typeof e){var r=\".then() only accepts functions but was passed: \"+c.classString(t);arguments.length>1&&(r+=\", \"+c.classString(e)),this._warn(r)}return this._then(t,e,void 0,void 0,void 0)},N.prototype.done=function(t,e){this._then(t,e,void 0,void 0,void 0)._setIsFinal()},N.prototype.spread=function(t){return\"function\"!=typeof t?o(\"expecting a function but got \"+c.classString(t)):this.all()._then(t,void 0,void 0,w,void 0)},N.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},N.prototype.all=function(){return arguments.length>0&&this._warn(\".all() was passed arguments but it does not take any\"),new S(this).promise()},N.prototype.error=function(t){return this.caught(c.originatesFromRejection,t)},N.getNewLibraryCopy=r.exports,N.is=function(t){return t instanceof N},N.fromNode=N.fromCallback=function(t){var e=new N(v);e._captureStackTrace();var r=arguments.length>1&&!!Object(arguments[1]).multiArgs,n=I(t)(M(e,r));return n===j&&e._rejectCallback(n.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},N.all=function(t){return new S(t).promise()},N.cast=function(t){var e=x(t);return e instanceof N||((e=new N(v))._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},N.resolve=N.fulfilled=N.cast,N.reject=N.rejected=function(t){var e=new N(v);return e._captureStackTrace(),e._rejectCallback(t,!0),e},N.setScheduler=function(t){if(\"function\"!=typeof t)throw new y(\"expecting a function but got \"+c.classString(t));return b.setScheduler(t)},N.prototype._then=function(t,e,r,n,i){var o=void 0!==i,s=o?i:new N(v),a=this._target(),u=a._bitField;o||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===n&&0!=(2097152&this._bitField)&&(n=0!=(50397184&u)?this._boundValue():a===this?void 0:this._boundTo),this._fireEvent(\"promiseChained\",this,s));var h=d();if(0!=(50397184&u)){var f,l,p=a._settlePromiseCtx;0!=(33554432&u)?(l=a._rejectionHandler0,f=t):0!=(16777216&u)?(l=a._fulfillmentHandler0,f=e,a._unsetRejectionIsUnhandled()):(p=a._settlePromiseLateCancellationObserver,l=new _(\"late cancellation observer\"),a._attachExtraTrace(l),f=e),b.invoke(p,a,{handler:c.contextBind(h,f),promise:s,receiver:n,value:l})}else a._addCallbacks(t,e,s,n,h);return s},N.prototype._length=function(){return 65535&this._bitField},N.prototype._isFateSealed=function(){return 0!=(117506048&this._bitField)},N.prototype._isFollowing=function(){return 67108864==(67108864&this._bitField)},N.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},N.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent(\"promiseFulfilled\",this)},N.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent(\"promiseRejected\",this)},N.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent(\"promiseResolved\",this)},N.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},N.prototype._isFinal=function(){return(4194304&this._bitField)>0},N.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},N.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent(\"promiseCancelled\",this)},N.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},N.prototype._setAsyncGuaranteed=function(){if(!b.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},N.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},N.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];if(e!==a)return void 0===e&&this._isBound()?this._boundValue():e},N.prototype._promiseAt=function(t){return this[4*t-4+2]},N.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},N.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},N.prototype._boundValue=function(){},N.prototype._migrateCallback0=function(t){t._bitField;var e=t._fulfillmentHandler0,r=t._rejectionHandler0,n=t._promise0,i=t._receiverAt(0);void 0===i&&(i=a),this._addCallbacks(e,r,n,i,null)},N.prototype._migrateCallbackAt=function(t,e){var r=t._fulfillmentHandlerAt(e),n=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=a),this._addCallbacks(r,n,i,o,null)},N.prototype._addCallbacks=function(t,e,r,n,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=r,this._receiver0=n,\"function\"==typeof t&&(this._fulfillmentHandler0=c.contextBind(i,t)),\"function\"==typeof e&&(this._rejectionHandler0=c.contextBind(i,e));else{var s=4*o-4;this[s+2]=r,this[s+3]=n,\"function\"==typeof t&&(this[s+0]=c.contextBind(i,t)),\"function\"==typeof e&&(this[s+1]=c.contextBind(i,e))}return this._setLength(o+1),o},N.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},N.prototype._resolveCallback=function(t,e){if(0==(117506048&this._bitField)){if(t===this)return this._rejectCallback(n(),!1);var r=x(t,this);if(!(r instanceof N))return this._fulfill(t);e&&this._propagateFrom(r,2);var i=r._target();if(i!==this){var o=i._bitField;if(0==(50397184&o)){var s=this._length();s>0&&i._migrateCallback0(this);for(var a=1;a>>16)){if(t===this){var r=n();return this._attachExtraTrace(r),this._reject(r)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!=(134217728&e)?this._settlePromises():b.settlePromises(this),this._dereferenceTrace())}},N.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(this._setRejected(),this._fulfillmentHandler0=t,this._isFinal())return b.fatalError(t,c.isNode);(65535&e)>0?b.settlePromises(this):this._ensurePossibleRejectionHandled()}},N.prototype._fulfillPromises=function(t,e){for(var r=1;r0){if(0!=(16842752&t)){var r=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,r,t),this._rejectPromises(e,r)}else{var n=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,n,t),this._fulfillPromises(e,n)}this._setLength(0)}this._clearCancellationData()},N.prototype._settledValue=function(){var t=this._bitField;return 0!=(33554432&t)?this._rejectionHandler0:0!=(16777216&t)?this._fulfillmentHandler0:void 0},\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&p.defineProperty(N.prototype,Symbol.toStringTag,{get:function(){return\"Object\"}}),N.defer=N.pending=function(){return k.deprecated(\"Promise.defer\",\"new Promise\"),{promise:new N(v),resolve:O,reject:B}},c.notEnumerableProp(N,\"_makeSelfResolutionError\",n),t(\"./method\")(N,v,x,o,k),t(\"./bind\")(N,v,x,k),t(\"./cancel\")(N,S,o,k),t(\"./direct_resolve\")(N),t(\"./synchronous_inspection\")(N),t(\"./join\")(N,S,x,v,b),N.Promise=N,N.version=\"3.7.2\",t(\"./call_get.js\")(N),t(\"./generators.js\")(N,o,v,x,s,k),t(\"./map.js\")(N,S,o,x,v,k),t(\"./nodeify.js\")(N),t(\"./promisify.js\")(N,v),t(\"./props.js\")(N,S,x,o),t(\"./race.js\")(N,v,x,o),t(\"./reduce.js\")(N,S,o,x,v,k),t(\"./settle.js\")(N,S,k),t(\"./some.js\")(N,S,o),t(\"./timers.js\")(N,v,k),t(\"./using.js\")(N,o,x,C,v,k),t(\"./any.js\")(N),t(\"./each.js\")(N,v),t(\"./filter.js\")(N,v),c.toFastProperties(N),c.toFastProperties(N.prototype),q({a:1}),q({b:2}),q({c:3}),q(1),q(function(){}),q(void 0),q(!1),q(new N(v)),k.setBounds(m.firstLineError,c.lastLineError),N}},{\"./any.js\":1,\"./async\":2,\"./bind\":3,\"./call_get.js\":5,\"./cancel\":6,\"./catch_filter\":7,\"./context\":8,\"./debuggability\":9,\"./direct_resolve\":10,\"./each.js\":11,\"./errors\":12,\"./es5\":13,\"./filter.js\":14,\"./finally\":15,\"./generators.js\":16,\"./join\":17,\"./map.js\":18,\"./method\":19,\"./nodeback\":20,\"./nodeify.js\":21,\"./promise_array\":23,\"./promisify.js\":24,\"./props.js\":25,\"./race.js\":27,\"./reduce.js\":28,\"./settle.js\":30,\"./some.js\":31,\"./synchronous_inspection\":32,\"./thenables\":33,\"./timers.js\":34,\"./using.js\":35,\"./util\":36,async_hooks:void 0}],23:[function(t,e,r){\"use strict\";e.exports=function(e,r,n,i,o){var s=t(\"./util\");s.isArray;function a(t){var n=this._promise=new e(r);t instanceof e&&(n._propagateFrom(t,3),t.suppressUnhandledRejections()),n._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}return s.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function t(r,o){var a=n(this._values,this._promise);if(a instanceof e){var c=(a=a._target())._bitField;if(this._values=a,0==(50397184&c))return this._promise._setAsyncGuaranteed(),a._then(t,this._reject,void 0,this,o);if(0==(33554432&c))return 0!=(16777216&c)?this._reject(a._reason()):this._cancel();a=a._value()}if(null!==(a=s.asArray(a)))0!==a.length?this._iterate(a):-5===o?this._resolveEmptyArray():this._resolve(function(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}(o));else{var u=i(\"expecting an array or an iterable object but got \"+s.classString(a)).reason();this._promise._rejectCallback(u,!1)}},a.prototype._iterate=function(t){var r=this.getActualLength(t.length);this._length=r,this._values=this.shouldCopyValues()?new Array(r):this._values;for(var i=this._promise,o=!1,s=null,a=0;a=this._length&&(this._resolve(this._values),!0)},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var r=0;r=this._length){var r;if(this._isMap)r=function(t){for(var e=new o,r=t.length/2|0,n=0;n>1},e.prototype.props=function(){return f(this)},e.props=function(t){return f(t)}}},{\"./es5\":13,\"./util\":36}],26:[function(t,e,r){\"use strict\";function n(t){this._capacity=t,this._length=0,this._front=0}n.prototype._willBeOverCapacity=function(t){return this._capacity=this._length&&(this._resolve(this._values),!0)},o.prototype._promiseFulfilled=function(t,e){var r=new i;return r._bitField=33554432,r._settledValueField=t,this._promiseResolved(e,r)},o.prototype._promiseRejected=function(t,e){var r=new i;return r._bitField=16777216,r._settledValueField=t,this._promiseResolved(e,r)},e.settle=function(t){return n.deprecated(\".settle()\",\".reflect()\"),new o(t).promise()},e.allSettled=function(t){return new o(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{\"./util\":36}],31:[function(t,e,r){\"use strict\";e.exports=function(e,r,n){var i=t(\"./util\"),o=t(\"./errors\").RangeError,s=t(\"./errors\").AggregateError,a=i.isArray,c={};function u(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function h(t,e){if((0|e)!==e||e<0)return n(\"expecting a positive integer\\n\\n See http://goo.gl/MqrFmX\\n\");var r=new u(t),i=r.promise();return r.setHowMany(e),r.init(),i}i.inherits(u,r),u.prototype._init=function(){if(this._initialized)if(0!==this._howMany){this._init$(void 0,-5);var t=a(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}else this._resolve([])},u.prototype.init=function(){this._initialized=!0,this._init()},u.prototype.setUnwrap=function(){this._unwrap=!0},u.prototype.howMany=function(){return this._howMany},u.prototype.setHowMany=function(t){this._howMany=t},u.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0)},u.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},u.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(c),this._checkOutcome())},u.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new s,e=this.length();e0?this._reject(t):this._cancel(),!0}return!1},u.prototype._fulfilled=function(){return this._totalResolved},u.prototype._rejected=function(){return this._values.length-this.length()},u.prototype._addRejected=function(t){this._values.push(t)},u.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},u.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},u.prototype._getRangeError=function(t){var e=\"Input array must contain at least \"+this._howMany+\" items but contains only \"+t+\" items\";return new o(e)},u.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return h(t,e)},e.prototype.some=function(t){return h(this,t)},e._SomePromiseArray=u}},{\"./errors\":12,\"./util\":36}],32:[function(t,e,r){\"use strict\";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var r=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\n\\n See http://goo.gl/MqrFmX\\n\");return this._settledValue()},n=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\n\\n See http://goo.gl/MqrFmX\\n\");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!=(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!=(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0==(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!=(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!=(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536==(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!=(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return r.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),n.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,r){\"use strict\";e.exports=function(e,r){var n=t(\"./util\"),i=n.errorObj,o=n.isObject;var s={}.hasOwnProperty;return function(t,a){if(o(t)){if(t instanceof e)return t;var c=function(t){try{return function(t){return t.then}(t)}catch(t){return i.e=t,i}}(t);if(c===i){a&&a._pushContext();var u=e.reject(c.e);return a&&a._popContext(),u}if(\"function\"==typeof c)return function(t){try{return s.call(t,\"_promise0\")}catch(t){return!1}}(t)?(u=new e(r),t._then(u._fulfill,u._reject,void 0,u,null),u):function(t,o,s){var a=new e(r),c=a;s&&s._pushContext(),a._captureStackTrace(),s&&s._popContext();var u=!0,h=n.tryCatch(o).call(t,function(t){a&&(a._resolveCallback(t),a=null)},function(t){a&&(a._rejectCallback(t,u,!0),a=null)});return u=!1,a&&h===i&&(a._rejectCallback(h.e,!0,!0),a=null),c}(t,c,a)}return t}}},{\"./util\":36}],34:[function(t,e,r){\"use strict\";e.exports=function(e,r,n){var i=t(\"./util\"),o=e.TimeoutError;function s(t){this.handle=t}s.prototype._resultCancelled=function(){clearTimeout(this.handle)};var a=function(t){return c(+this).thenReturn(t)},c=e.delay=function(t,i){var o,c;return void 0!==i?(o=e.resolve(i)._then(a,null,null,t,void 0),n.cancellation()&&i instanceof e&&o._setOnCancel(i)):(o=new e(r),c=setTimeout(function(){o._fulfill()},+t),n.cancellation()&&o._setOnCancel(new s(c)),o._captureStackTrace()),o._setAsyncGuaranteed(),o};e.prototype.delay=function(t){return c(t,this)};function u(t){return clearTimeout(this.handle),t}function h(t){throw clearTimeout(this.handle),t}e.prototype.timeout=function(t,e){var r,a;t=+t;var c=new s(setTimeout(function(){r.isPending()&&function(t,e,r){var n;n=\"string\"!=typeof e?e instanceof Error?e:new o(\"operation timed out\"):new o(e),i.markAsOriginatingFromRejection(n),t._attachExtraTrace(n),t._reject(n),null!=r&&r.cancel()}(r,e,a)},t));return n.cancellation()?(a=this.then(),(r=a._then(u,h,void 0,c,void 0))._setOnCancel(c)):r=this._then(u,h,void 0,c,void 0),r}}},{\"./util\":36}],35:[function(t,e,r){\"use strict\";e.exports=function(e,r,n,i,o,s){var a=t(\"./util\"),c=t(\"./errors\").TypeError,u=t(\"./util\").inherits,h=a.errorObj,f=a.tryCatch,l={};function d(t){setTimeout(function(){throw t},0)}function p(t,r){var i=0,s=t.length,a=new e(o);return function o(){if(i>=s)return a._fulfill();var c=function(t){var e=n(t);return e!==t&&\"function\"==typeof t._isDisposable&&\"function\"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}(t[i++]);if(c instanceof e&&c._isDisposable()){try{c=n(c._getDisposer().tryDispose(r),t.promise)}catch(t){return d(t)}if(c instanceof e)return c._then(o,d,null,null,null)}o()}(),a}function m(t,e,r){this._data=t,this._promise=e,this._context=r}function b(t,e,r){this.constructor$(t,e,r)}function g(t){return m.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function y(t){this.length=t,this.promise=null,this[t-1]=null}m.prototype.data=function(){return this._data},m.prototype.promise=function(){return this._promise},m.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():l},m.prototype.tryDispose=function(t){var e=this.resource(),r=this._context;void 0!==r&&r._pushContext();var n=e!==l?this.doDispose(e,t):null;return void 0!==r&&r._popContext(),this._promise._unsetDisposable(),this._data=null,n},m.isDisposer=function(t){return null!=t&&\"function\"==typeof t.resource&&\"function\"==typeof t.tryDispose},u(b,m),b.prototype.doDispose=function(t,e){return this.data().call(t,t,e)},y.prototype._resultCancelled=function(){for(var t=this.length,r=0;r0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if(\"function\"==typeof t)return new b(t,this,i());throw new c}}},{\"./errors\":12,\"./util\":36}],36:[function(t,n,i){\"use strict\";var o=t(\"./es5\"),s=\"undefined\"==typeof navigator,a={e:{}},c,u=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==r?r:void 0!==this?this:null;function h(){try{var t=c;return c=null,t.apply(this,arguments)}catch(t){return a.e=t,a}}function f(t){return c=t,h}var l=function(t,e){var r={}.hasOwnProperty;function n(){for(var n in this.constructor=t,this.constructor$=e,e.prototype)r.call(e.prototype,n)&&\"$\"!==n.charAt(n.length-1)&&(this[n+\"$\"]=e.prototype[n])}return n.prototype=e.prototype,t.prototype=new n,t.prototype};function d(t){return null==t||!0===t||!1===t||\"string\"==typeof t||\"number\"==typeof t}function p(t){return\"function\"==typeof t||\"object\"==typeof t&&null!==t}function m(t){return d(t)?new Error(k(t)):t}function b(t,e){var r,n=t.length,i=new Array(n+1);for(r=0;r1,n=e.length>0&&!(1===e.length&&\"constructor\"===e[0]),i=w.test(t+\"\")&&o.names(t).length>0;if(r||n||i)return!0}return!1}catch(t){return!1}}function x(t){function e(){}e.prototype=t;var r=new e;function n(){return typeof r.foo}return n(),n(),t}var S=/^[a-z$_][a-z$_0-9]*$/i;function A(t){return S.test(t)}function C(t,e,r){for(var n=new Array(t),i=0;i10||H[0]>0),z.nodeSupportsAsyncResource=z.isNode&&function(){var e=!1;try{e=\"function\"==typeof t(\"async_hooks\").AsyncResource.prototype.runInAsyncScope}catch(t){e=!1}return e}(),z.isNode&&z.toFastProperties(e);try{throw new Error}catch(t){z.lastLineError=t}n.exports=z},{\"./es5\":13,async_hooks:void 0}]},{},[4])(4)},t.exports=i(),\"undefined\"!=typeof window&&null!==window?window.P=window.Promise:\"undefined\"!=typeof self&&null!==self&&(self.P=self.Promise)}).call(this,r(5),r(8),r(64).setImmediate)},function(t,e){var r;r=function(){return this}();try{r=r||new Function(\"return this\")()}catch(t){\"object\"==typeof window&&(r=window)}t.exports=r},function(t,e){function r(t,e){if(!t)throw new Error(e||\"Assertion failed\")}t.exports=r,r.equal=function(t,e,r){if(t!=e)throw new Error(r||\"Assertion failed: \"+t+\" != \"+e)}},function(t,e,r){(function(n){function i(){var t;try{t=e.storage.debug}catch(t){}return!t&&void 0!==n&&\"env\"in n&&(t=n.env.DEBUG),t}(e=t.exports=r(124)).log=function(){return\"object\"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},e.formatArgs=function(t){var r=this.useColors;if(t[0]=(r?\"%c\":\"\")+this.namespace+(r?\" %c\":\" \")+t[0]+(r?\"%c \":\" \")+\"+\"+e.humanize(this.diff),!r)return;var n=\"color: \"+this.color;t.splice(1,0,n,\"color: inherit\");var i=0,o=0;t[0].replace(/%[a-zA-Z%]/g,function(t){\"%%\"!==t&&(i++,\"%c\"===t&&(o=i))}),t.splice(o,0,n)},e.save=function(t){try{null==t?e.storage.removeItem(\"debug\"):e.storage.debug=t}catch(t){}},e.load=i,e.useColors=function(){if(\"undefined\"!=typeof window&&window.process&&\"renderer\"===window.process.type)return!0;return\"undefined\"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||\"undefined\"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/)},e.storage=\"undefined\"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=[\"lightseagreen\",\"forestgreen\",\"goldenrod\",\"dodgerblue\",\"darkorchid\",\"crimson\"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return\"[UnexpectedJSONParseError]: \"+t.message}},e.enable(i())}).call(this,r(5))},function(t,e,r){const{isFunction:n,isUndefined:i,isPlainObject:o,isArray:s,isTypedArray:a}=r(1),{CLIENT_ALIASES:c}=r(42);function u(t){let e=!1;if(a(t))return!1;if(t&&n(t.toSQL))return e;if(s(t))for(let r=0;r{e||(e=u(t[r]))}):e=i(t);return e}t.exports={addQueryContext:function(t){t.prototype.queryContext=function(t){return i(t)?this._queryContext:(this._queryContext=t,this)}},containsUndefined:u,normalizeArr:function(){const t=new Array(arguments.length);for(let e=0;e{u(t)&&e.push(r)}):o(t)?Object.keys(t).forEach(r=>{u(t[r])&&e.push(r)}):e.push(0),e}}},function(t,e){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return\"function\"==typeof t}function i(t){return\"object\"==typeof t&&null!==t}function o(t){return void 0===t}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||isNaN(t))throw TypeError(\"n must be a positive number\");return this._maxListeners=t,this},r.prototype.emit=function(t){var e,r,s,a,c,u;if(this._events||(this._events={}),\"error\"===t&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var h=new Error('Uncaught, unspecified \"error\" event. ('+e+\")\");throw h.context=e,h}if(o(r=this._events[t]))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(i(r))for(a=Array.prototype.slice.call(arguments,1),s=(u=r.slice()).length,c=0;c0&&this._events[t].length>s&&(this._events[t].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[t].length),\"function\"==typeof console.trace&&console.trace()),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){if(!n(e))throw TypeError(\"listener must be a function\");var r=!1;function i(){this.removeListener(t,i),r||(r=!0,e.apply(this,arguments))}return i.listener=e,this.on(t,i),this},r.prototype.removeListener=function(t,e){var r,o,s,a;if(!n(e))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[t])return this;if(s=(r=this._events[t]).length,o=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit(\"removeListener\",t,e);else if(i(r)){for(a=s;a-- >0;)if(r[a]===e||r[a].listener&&r[a].listener===e){o=a;break}if(o<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(o,1),this._events.removeListener&&this.emit(\"removeListener\",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)\"removeListener\"!==e&&this.removeAllListeners(e);return this.removeAllListeners(\"removeListener\"),this._events={},this}if(n(r=this._events[t]))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},r.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e,r){\"use strict\";var n=r(9),i=r(0);function o(t){return(t>>>24|t>>>8&65280|t<<8&16711680|(255&t)<<24)>>>0}function s(t){return 1===t.length?\"0\"+t:t}function a(t){return 7===t.length?\"0\"+t:6===t.length?\"00\"+t:5===t.length?\"000\"+t:4===t.length?\"0000\"+t:3===t.length?\"00000\"+t:2===t.length?\"000000\"+t:1===t.length?\"0000000\"+t:t}e.inherits=i,e.toArray=function(t,e){if(Array.isArray(t))return t.slice();if(!t)return[];var r=[];if(\"string\"==typeof t)if(e){if(\"hex\"===e)for((t=t.replace(/[^a-z0-9]+/gi,\"\")).length%2!=0&&(t=\"0\"+t),n=0;n>8,s=255&i;o?r.push(o,s):r.push(s)}else for(n=0;n>>0}return s},e.split32=function(t,e){for(var r=new Array(4*t.length),n=0,i=0;n>>24,r[i+1]=o>>>16&255,r[i+2]=o>>>8&255,r[i+3]=255&o):(r[i+3]=o>>>24,r[i+2]=o>>>16&255,r[i+1]=o>>>8&255,r[i]=255&o)}return r},e.rotr32=function(t,e){return t>>>e|t<<32-e},e.rotl32=function(t,e){return t<>>32-e},e.sum32=function(t,e){return t+e>>>0},e.sum32_3=function(t,e,r){return t+e+r>>>0},e.sum32_4=function(t,e,r,n){return t+e+r+n>>>0},e.sum32_5=function(t,e,r,n,i){return t+e+r+n+i>>>0},e.sum64=function(t,e,r,n){var i=t[e],o=n+t[e+1]>>>0,s=(o>>0,t[e+1]=o},e.sum64_hi=function(t,e,r,n){return(e+n>>>0>>0},e.sum64_lo=function(t,e,r,n){return e+n>>>0},e.sum64_4_hi=function(t,e,r,n,i,o,s,a){var c=0,u=e;return c+=(u=u+n>>>0)>>0)>>0)>>0},e.sum64_4_lo=function(t,e,r,n,i,o,s,a){return e+n+o+a>>>0},e.sum64_5_hi=function(t,e,r,n,i,o,s,a,c,u){var h=0,f=e;return h+=(f=f+n>>>0)>>0)>>0)>>0)>>0},e.sum64_5_lo=function(t,e,r,n,i,o,s,a,c,u){return e+n+o+a+u>>>0},e.rotr64_hi=function(t,e,r){return(e<<32-r|t>>>r)>>>0},e.rotr64_lo=function(t,e,r){return(t<<32-r|e>>>r)>>>0},e.shr64_hi=function(t,e,r){return t>>>r},e.shr64_lo=function(t,e,r){return(t<<32-r|e>>>r)>>>0}},function(t,e,r){const n=r(0),i=r(11),{EventEmitter:o}=r(12),s=r(10),{assign:a,reduce:c,isPlainObject:u,isObject:h,isUndefined:f,isNumber:l}=r(1),d=r(43),p=r(61),m=s(\"knex:bindings\");function b(t){this.client=t,this.sql=\"\",this.bindings=[],this._wrappedBefore=void 0,this._wrappedAfter=void 0,t&&t.config&&(this._debug=t.config.debug,d(this,4))}n(b,o),a(b.prototype,{set(t,e){return this.sql=t,this.bindings=h(e)&&!e.toSQL||f(e)?e:[e],this},timeout(t,{cancel:e}={}){return l(t)&&t>0&&(this._timeout=t,e&&(this.client.assertCanCancelQuery(),this._cancelOnTimeout=!0)),this},wrap(t,e){return this._wrappedBefore=t,this._wrappedAfter=e,this},toString(){return this.toQuery()},toSQL(t,e){let r;const n=this.client.formatter(this);if(r=Array.isArray(this.bindings)?function(t,e){const r=t.bindings.length,n=t.bindings;let i=0;const o=t.sql.replace(/\\\\?\\?\\??/g,function(t){if(\"\\\\?\"===t)return t;const r=n[i++];return\"??\"===t?e.columnize(r):e.parameter(r)});if(r!==i)throw new Error(`Expected ${r} bindings, saw ${i}`);return{method:\"raw\",sql:o,bindings:e.bindings}}(this,n):this.bindings&&u(this.bindings)?function(t,e){const r=t.bindings;return{method:\"raw\",sql:t.sql.replace(/\\\\?(:(\\w+):(?=::)|:(\\w+):(?!:)|:(\\w+))/g,function(t,n,i,o,s){if(t!==n)return n;const a=i||o||s,c=t.trim(),u=\":\"===c[c.length-1],h=r[a];return void 0===h?(Object.prototype.hasOwnProperty.call(r,a)&&e.bindings.push(h),t):u?t.replace(n,e.columnize(h)):t.replace(n,e.parameter(h))}),bindings:e.bindings}}(this,n):{method:\"raw\",sql:this.sql,bindings:f(this.bindings)?[]:[this.bindings]},this._wrappedBefore&&(r.sql=this._wrappedBefore+r.sql),this._wrappedAfter&&(r.sql=r.sql+this._wrappedAfter),r.options=c(this._options,a,{}),this._timeout&&(r.timeout=this._timeout,this._cancelOnTimeout&&(r.cancelOnTimeout=this._cancelOnTimeout)),r.bindings=r.bindings||[],i.containsUndefined(r.bindings)){const t=i.getUndefinedIndices(this.bindings);throw m(r.bindings),new Error(`Undefined binding(s) detected for keys [${t}] when compiling RAW query: ${r.sql}`)}return r.__knexQueryUid=p.v1(),r}}),r(44)(b),i.addQueryContext(b),t.exports=b},function(t,e,r){(function(t,n){var i=/%[sdj%]/g;e.format=function(t){if(!g(t)){for(var e=[],r=0;r=o)return t;switch(t){case\"%s\":return String(n[r++]);case\"%d\":return Number(n[r++]);case\"%j\":try{return JSON.stringify(n[r++])}catch(t){return\"[Circular]\"}default:return t}}),c=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),p(r)?n.showHidden=r:r&&e._extend(n,r),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=c),h(n,t,n.depth)}function c(t,e){var r=a.styles[e];return r?\"\u001b[\"+a.colors[r][0]+\"m\"+t+\"\u001b[\"+a.colors[r][1]+\"m\":t}function u(t,e){return t}function h(t,r,n){if(t.customInspect&&r&&x(r.inspect)&&r.inspect!==e.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,t);return g(i)||(i=h(t,i,n)),i}var o=function(t,e){if(y(e))return t.stylize(\"undefined\",\"undefined\");if(g(e)){var r=\"'\"+JSON.stringify(e).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return t.stylize(r,\"string\")}if(b(e))return t.stylize(\"\"+e,\"number\");if(p(e))return t.stylize(\"\"+e,\"boolean\");if(m(e))return t.stylize(\"null\",\"null\")}(t,r);if(o)return o;var s=Object.keys(r),a=function(t){var e={};return t.forEach(function(t,r){e[t]=!0}),e}(s);if(t.showHidden&&(s=Object.getOwnPropertyNames(r)),E(r)&&(s.indexOf(\"message\")>=0||s.indexOf(\"description\")>=0))return f(r);if(0===s.length){if(x(r)){var c=r.name?\": \"+r.name:\"\";return t.stylize(\"[Function\"+c+\"]\",\"special\")}if(_(r))return t.stylize(RegExp.prototype.toString.call(r),\"regexp\");if(w(r))return t.stylize(Date.prototype.toString.call(r),\"date\");if(E(r))return f(r)}var u,v=\"\",S=!1,A=[\"{\",\"}\"];(d(r)&&(S=!0,A=[\"[\",\"]\"]),x(r))&&(v=\" [Function\"+(r.name?\": \"+r.name:\"\")+\"]\");return _(r)&&(v=\" \"+RegExp.prototype.toString.call(r)),w(r)&&(v=\" \"+Date.prototype.toUTCString.call(r)),E(r)&&(v=\" \"+f(r)),0!==s.length||S&&0!=r.length?n<0?_(r)?t.stylize(RegExp.prototype.toString.call(r),\"regexp\"):t.stylize(\"[Object]\",\"special\"):(t.seen.push(r),u=S?function(t,e,r,n,i){for(var o=[],s=0,a=e.length;s=0&&0,t+e.replace(/\\u001b\\[\\d\\d?m/g,\"\").length+1},0)>60)return r[0]+(\"\"===e?\"\":e+\"\\n \")+\" \"+t.join(\",\\n \")+\" \"+r[1];return r[0]+e+\" \"+t.join(\", \")+\" \"+r[1]}(u,v,A)):A[0]+v+A[1]}function f(t){return\"[\"+Error.prototype.toString.call(t)+\"]\"}function l(t,e,r,n,i,o){var s,a,c;if((c=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?a=c.set?t.stylize(\"[Getter/Setter]\",\"special\"):t.stylize(\"[Getter]\",\"special\"):c.set&&(a=t.stylize(\"[Setter]\",\"special\")),k(n,i)||(s=\"[\"+i+\"]\"),a||(t.seen.indexOf(c.value)<0?(a=m(r)?h(t,c.value,null):h(t,c.value,r-1)).indexOf(\"\\n\")>-1&&(a=o?a.split(\"\\n\").map(function(t){return\" \"+t}).join(\"\\n\").substr(2):\"\\n\"+a.split(\"\\n\").map(function(t){return\" \"+t}).join(\"\\n\")):a=t.stylize(\"[Circular]\",\"special\")),y(s)){if(o&&i.match(/^\\d+$/))return a;(s=JSON.stringify(\"\"+i)).match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(s=s.substr(1,s.length-2),s=t.stylize(s,\"name\")):(s=s.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),s=t.stylize(s,\"string\"))}return s+\": \"+a}function d(t){return Array.isArray(t)}function p(t){return\"boolean\"==typeof t}function m(t){return null===t}function b(t){return\"number\"==typeof t}function g(t){return\"string\"==typeof t}function y(t){return void 0===t}function _(t){return v(t)&&\"[object RegExp]\"===S(t)}function v(t){return\"object\"==typeof t&&null!==t}function w(t){return v(t)&&\"[object Date]\"===S(t)}function E(t){return v(t)&&(\"[object Error]\"===S(t)||t instanceof Error)}function x(t){return\"function\"==typeof t}function S(t){return Object.prototype.toString.call(t)}function A(t){return t<10?\"0\"+t.toString(10):t.toString(10)}e.debuglog=function(t){if(y(o)&&(o=n.env.NODE_DEBUG||\"\"),t=t.toUpperCase(),!s[t])if(new RegExp(\"\\\\b\"+t+\"\\\\b\",\"i\").test(o)){var r=n.pid;s[t]=function(){var n=e.format.apply(e,arguments);console.error(\"%s %d: %s\",t,r,n)}}else s[t]=function(){};return s[t]},e.inspect=a,a.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]},a.styles={special:\"cyan\",number:\"yellow\",boolean:\"yellow\",undefined:\"grey\",null:\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},e.isArray=d,e.isBoolean=p,e.isNull=m,e.isNullOrUndefined=function(t){return null==t},e.isNumber=b,e.isString=g,e.isSymbol=function(t){return\"symbol\"==typeof t},e.isUndefined=y,e.isRegExp=_,e.isObject=v,e.isDate=w,e.isError=E,e.isFunction=x,e.isPrimitive=function(t){return null===t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||\"symbol\"==typeof t||void 0===t},e.isBuffer=r(142);var C=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];function k(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.log=function(){var t,r;console.log(\"%s - %s\",(t=new Date,r=[A(t.getHours()),A(t.getMinutes()),A(t.getSeconds())].join(\":\"),[t.getDate(),C[t.getMonth()],r].join(\" \")),e.format.apply(e,arguments))},e.inherits=r(0),e._extend=function(t,e){if(!e||!v(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t}}).call(this,r(8),r(5))},function(t,e,r){var n=r(2).Buffer,i=r(27).Transform,o=r(47).StringDecoder;function s(t){i.call(this),this.hashMode=\"string\"==typeof t,this.hashMode?this[t]=this._finalOrDigest:this.final=this._finalOrDigest,this._final&&(this.__final=this._final,this._final=null),this._decoder=null,this._encoding=null}r(0)(s,i),s.prototype.update=function(t,e,r){\"string\"==typeof t&&(t=n.from(t,e));var i=this._update(t);return this.hashMode?this:(r&&(i=this._toString(i,r)),i)},s.prototype.setAutoPadding=function(){},s.prototype.getAuthTag=function(){throw new Error(\"trying to get auth tag in unsupported state\")},s.prototype.setAuthTag=function(){throw new Error(\"trying to set auth tag in unsupported state\")},s.prototype.setAAD=function(){throw new Error(\"trying to set aad in unsupported state\")},s.prototype._transform=function(t,e,r){var n;try{this.hashMode?this._update(t):this.push(this._update(t))}catch(t){n=t}finally{r(n)}},s.prototype._flush=function(t){var e;try{this.push(this.__final())}catch(t){e=t}t(e)},s.prototype._finalOrDigest=function(t){var e=this.__final()||n.alloc(0);return t&&(e=this._toString(e,t,!0)),e},s.prototype._toString=function(t,e,r){if(this._decoder||(this._decoder=new o(e),this._encoding=e),this._encoding!==e)throw new Error(\"can't switch encodings\");var n=this._decoder.write(t);return r&&(n+=this._decoder.end()),n},t.exports=s},function(t,e,r){\"use strict\";var n=r(35),i=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};t.exports=f;var o=Object.create(r(28));o.inherits=r(0);var s=r(65),a=r(46);o.inherits(f,s);for(var c=i(a.prototype),u=0;u{this.initRejectFn=r,e=(e=>{t(e)})})),this.client=t,this.logger=t.logger,this.outerTx=i,this.trxClient=void 0,this._debug=t.config&&t.config.debug,a(\"%s: Starting %s transaction\",o,i?\"nested\":\"top level\"),this._promise=this.acquireConnection(r,r=>{const i=this.trxClient=function(t,e,r){const i=Object.create(e.constructor.prototype);i.version=e.version,i.config=e.config,i.driver=e.driver,i.connectionSettings=e.connectionSettings,i.transacting=!0,i.valueForUndefined=e.valueForUndefined,i.logger=e.logger,i.on(\"query\",function(r){t.emit(\"query\",r),e.emit(\"query\",r)}),i.on(\"query-error\",function(r,n){t.emit(\"query-error\",r,n),e.emit(\"query-error\",r,n)}),i.on(\"query-response\",function(r,n,i){t.emit(\"query-response\",r,n,i),e.emit(\"query-response\",r,n,i)});const o=i.query;i.query=function(e,s){const a=t.isCompleted();return new n(function(n,c){try{if(e!==r)throw new Error(\"Invalid connection for transaction query.\");a&&f(t,s),n(o.call(i,e,s))}catch(t){c(t)}})};const s=i.stream;return i.stream=function(e,o,a,c){const u=t.isCompleted();return new n(function(n,h){try{if(e!==r)throw new Error(\"Invalid connection for transaction query.\");u&&f(t,o),n(s.call(i,e,o,a,c))}catch(t){h(t)}})},i.acquireConnection=function(){return n.resolve(r)},i.releaseConnection=function(){return n.resolve()},i}(this,t,r),o=t.transacting?this.savepoint(r):this.begin(r),a=new n((t,e)=>{this._resolver=t,this._rejecter=e});return o.then(()=>(function(t,e,r){const n=s(r);n.withUserParams=(()=>{throw new Error(\"Cannot set user params on a transaction - it can only inherit params from main knex instance\")}),n.isTransaction=!0,n.userParams=t.userParams||{},n.transaction=function(e,n){return n?u(n.doNotRejectOnRollback)&&(n.doNotRejectOnRollback=!0):n={doNotRejectOnRollback:!0},e?r.transaction(e,n,t):new Promise((e,i)=>{r.transaction(t=>{e(t)},n,t)})},n.savepoint=function(t,e){return n.transaction(t,e)},t.client.transacting?(n.commit=(r=>t.release(e,r)),n.rollback=(r=>t.rollbackTo(e,r))):(n.commit=(r=>t.commit(e,r)),n.rollback=(r=>t.rollback(e,r)));return n.isCompleted=(()=>t.isCompleted()),n})(this,r,i)).then(t=>{let r;this.initPromise?t.executionPromise=a.catch(t=>{throw t}):t.executionPromise=a;try{r=e(t)}catch(t){r=n.reject(t)}return r&&r.then&&\"function\"==typeof r.then&&r.then(e=>t.commit(e)).catch(e=>t.rollback(e)),null}).catch(t=>this._rejecter(t)),a}).catch(t=>{if(!this.initRejectFn)throw t;this.initRejectFn(t)}),this._completed=!1,this._previousSibling=n.resolve(!0),i&&(i._lastChild&&(this._previousSibling=i._lastChild),i._lastChild=this._promise)}isCompleted(){return this._completed||this.outerTx&&this.outerTx.isCompleted()||!1}begin(t){return this.query(t,\"BEGIN;\")}savepoint(t){return this.query(t,`SAVEPOINT ${this.txid};`)}commit(t,e){return this.query(t,\"COMMIT;\",1,e)}release(t,e){return this.query(t,`RELEASE SAVEPOINT ${this.txid};`,1,e)}rollback(t,e){return this.query(t,\"ROLLBACK\",2,e).timeout(5e3).catch(n.TimeoutError,()=>{this._rejecter(e)})}rollbackTo(t,e){return this.query(t,`ROLLBACK TO SAVEPOINT ${this.txid}`,2,e).timeout(5e3).catch(n.TimeoutError,()=>{this._rejecter(e)})}query(t,e,r,n){const i=this.trxClient.query(t,e).catch(t=>{r=2,n=t,this._completed=!0,a(\"%s error running transaction query\",this.txid)}).then(t=>{if(1===r&&this._resolver(n),2===r){if(u(n)){if(this.doNotRejectOnRollback&&/^ROLLBACK\\b/i.test(e))return void this._resolver();n=new Error(`Transaction rejected with non-error: ${n}`)}this._rejecter(n)}return t});return 1!==r&&2!==r||(this._completed=!0),i}debug(t){return this._debug=!arguments.length||t,this}acquireConnection(t,e){const r=t&&t.connection;return new n((t,e)=>{try{t(r||this.client.acquireConnection())}catch(t){e(t)}}).then(t=>(t.__knexTxId=this.txid,(this._previousSibling?this._previousSibling.catch(()=>{}):Promise.resolve()).then(function(){return t}))).then(async t=>{try{return await e(t)}finally{r?a(\"%s: not releasing external connection\",this.txid):(a(\"%s: releasing connection\",this.txid),this.client.releaseConnection(t))}})}}function f(t,e){const r=\"string\"==typeof e?e:e&&e.sql;throw a(\"%s: Transaction completed: %s\",t.txid,r),new Error(\"Transaction query already complete, run with DEBUG=knex:tx for more info\")}[\"then\",\"bind\",\"catch\",\"finally\",\"asCallback\",\"spread\",\"map\",\"reduce\",\"thenReturn\",\"return\",\"yield\",\"ensure\",\"exec\",\"reflect\",\"get\",\"mapSeries\",\"delay\"].forEach(function(t){h.prototype[t]=function(){return this._promise[t].apply(this._promise,arguments)}}),t.exports=h},function(t,e,r){const n=r(11),i=r(14),o=r(36),s=r(71),a=r(10),{assign:c,bind:u,compact:h,groupBy:f,isEmpty:l,isString:d,isUndefined:p,map:m,omitBy:b,reduce:g,has:y}=r(1),_=r(61),v=a(\"knex:bindings\");function w(t,e){this.client=t,this.method=e._method||\"select\",this.options=e._options,this.single=e._single,this.timeout=e._timeout||!1,this.cancelOnTimeout=e._cancelOnTimeout||!1,this.grouped=f(e._statements,\"grouping\"),this.formatter=t.formatter(e)}const E=[\"columns\",\"join\",\"where\",\"union\",\"group\",\"having\",\"order\",\"limit\",\"offset\",\"lock\",\"waitMode\"];c(w.prototype,{_emptyInsertValue:\"default values\",toSQL(t,e){this._undefinedInWhereClause=!1,this.undefinedBindingsInfo=[];const r=this[t=t||this.method]()||\"\",n={method:t,options:g(this.options,c,{}),timeout:this.timeout,cancelOnTimeout:this.cancelOnTimeout,bindings:this.formatter.bindings||[],__knexQueryUid:_.v1()};if(Object.defineProperties(n,{toNative:{value:()=>({sql:this.client.positionBindings(n.sql),bindings:this.client.prepBindings(n.bindings)}),enumerable:!1}}),d(r)?n.sql=r:c(n,r),\"select\"!==t&&\"first\"!==t||this.single.as&&(n.as=this.single.as),this._undefinedInWhereClause)throw v(n.bindings),new Error(\"Undefined binding(s) detected when compiling \"+`${t.toUpperCase()}. Undefined column(s): [${this.undefinedBindingsInfo.join(\", \")}] query: ${n.sql}`);return n},select(){let t=this.with();const e=E.map(t=>this[t](this));return t+=h(e).join(\" \")},pluck(){let t=this.single.pluck;return-1!==t.indexOf(\".\")&&(t=t.split(\".\").slice(-1)[0]),{sql:this.select(),pluck:t}},insert(){const t=this.single.insert||[];let e=this.with()+`insert into ${this.tableName} `;if(Array.isArray(t)){if(0===t.length)return\"\"}else if(\"object\"==typeof t&&l(t))return e+this._emptyInsertValue;const r=this._prepInsert(t);if(\"string\"==typeof r)e+=r;else if(r.columns.length){e+=`(${this.formatter.columnize(r.columns)}`,e+=\") values (\";let t=-1;for(;++t0&&n.push(this.formatter.columnize(i.value))}return 0===n.length&&(n=[\"*\"]),`select ${t}`+n.join(\", \")+(this.tableName?` from ${this.single.only?\"only \":\"\"}${this.tableName}`:\"\")},_aggregate(t,{aliasSeparator:e=\" as \",distinctParentheses:r}={}){const n=t.value,i=t.method,o=t.aggregateDistinct?\"distinct \":\"\",s=t=>this.formatter.wrap(t),a=(t,r)=>r?t+e+s(r):t,c=(t,e)=>{let n=t.map(s).join(\", \");if(o){const t=r?\"(\":\" \",e=r?\")\":\"\";n=o.trim()+t+n+e}return a(`${i}(${n})`,e)},u=(t,e)=>{const r=`${i}(${o+s(t)})`;return a(r,e)};if(Array.isArray(n))return[c(n)];if(\"object\"==typeof n){if(t.alias)throw new Error(\"When using an object explicit alias can not be used\");return Object.entries(n).map(([t,e])=>Array.isArray(e)?c(e,t):u(e,t))}const h=n.toLowerCase().indexOf(\" as \");let f=n,{alias:l}=t;if(-1!==h){if(f=n.slice(0,h),l)throw new Error(`Found multiple aliases for same column: ${f}`);l=n.slice(h+4)}return[u(f,l)]},aggregate(t){return this._aggregate(t)},aggregateRaw(t){const e=t.aggregateDistinct?\"distinct \":\"\";return`${t.method}(${e+this.formatter.unwrapRaw(t.value)})`},join(){let t=\"\",e=-1;const r=this.grouped.join;if(!r)return\"\";for(;++e0&&(t+=\" \"),\"raw\"===n.joinType)t+=this.formatter.unwrapRaw(n.table);else{t+=n.joinType+\" join \"+this.formatter.wrap(i);let e=-1;for(;++e0?` ${r.bool} `:` ${\"onUsing\"===r.type?\"using\":\"on\"} `;const i=this[r.type].call(this,r);i&&(t+=i)}}}return t},onBetween(t){return this.formatter.wrap(t.column)+\" \"+this._not(t,\"between\")+\" \"+m(t.value,u(this.formatter.parameter,this.formatter)).join(\" and \")},onNull(t){return this.formatter.wrap(t.column)+\" is \"+this._not(t,\"null\")},onExists(t){return this._not(t,\"exists\")+\" (\"+this.formatter.rawOrFn(t.value)+\")\"},onIn(t){return Array.isArray(t.column)?this.multiOnIn(t):this.formatter.wrap(t.column)+\" \"+this._not(t,\"in \")+this.wrap(this.formatter.parameterize(t.value))},multiOnIn(t){let e=-1,r=`(${this.formatter.columnize(t.column)}) `;for(r+=this._not(t,\"in \")+\"((\";++e1?e.join(\" \"):\"\"},group(){return this._groupsOrders(\"group\")},order(){return this._groupsOrders(\"order\")},having(){const t=this.grouped.having;if(!t)return\"\";const e=[\"having\"];for(let r=0,n=t.length;r1||1===e.length&&\"having\"!==e[0])&&e.push(n.bool),e.push(i))}return e.length>1?e.join(\" \"):\"\"},havingRaw(t){return this._not(t,\"\")+this.formatter.unwrapRaw(t.value)},havingWrapped(t){const e=this.formatter.rawOrFn(t.value,\"where\");return e&&this._not(t,\"\")+\"(\"+e.slice(6)+\")\"||\"\"},havingBasic(t){return this._not(t,\"\")+this.formatter.wrap(t.column)+\" \"+this.formatter.operator(t.operator)+\" \"+this.formatter.parameter(t.value)},havingNull(t){return this.formatter.wrap(t.column)+\" is \"+this._not(t,\"null\")},havingExists(t){return this._not(t,\"exists\")+\" (\"+this.formatter.rawOrFn(t.value)+\")\"},havingBetween(t){return this.formatter.wrap(t.column)+\" \"+this._not(t,\"between\")+\" \"+m(t.value,u(this.formatter.parameter,this.formatter)).join(\" and \")},havingIn(t){return Array.isArray(t.column)?this.multiHavingIn(t):this.formatter.wrap(t.column)+\" \"+this._not(t,\"in \")+this.wrap(this.formatter.parameterize(t.value))},multiHavingIn(t){let e=-1,r=`(${this.formatter.columnize(t.column)}) `;for(r+=this._not(t,\"in \")+\"((\";++e0&&(r+=\" \"),(n>0||!t)&&(r+=i.clause+\" \");const o=this.formatter.rawOrFn(i.value);o&&(i.wrap&&(r+=\"(\"),r+=o,i.wrap&&(r+=\")\"))}return r},onlyUnions(){return!this.grouped.columns&&this.grouped.union&&!this.tableName},limit(){return!this.single.limit&&0!==this.single.limit?\"\":`limit ${this.formatter.parameter(this.single.limit)}`},offset(){return this.single.offset?`offset ${this.formatter.parameter(this.single.offset)}`:\"\"},del(){const{tableName:t}=this,e=this.with(),r=this.where();return e+`delete from ${this.single.only?\"only \":\"\"}${t}`+(r?` ${r}`:\"\")},truncate(){return`truncate ${this.tableName}`},lock(){if(this.single.lock)return this[this.single.lock]()},waitMode(){if(this.single.waitMode)return this[this.single.waitMode]()},skipLocked(){throw new Error(\".skipLocked() is currently only supported on MySQL 8.0+ and PostgreSQL 9.5+\")},noWait(){throw new Error(\".noWait() is currently only supported on MySQL 8.0+, MariaDB 10.3.0+ and PostgreSQL 9.5+\")},distinctOn(t){throw new Error(\".distinctOn() is currently only supported on PostgreSQL\")},onWrapped(t){const e=this,r=new s;t.value.call(r,r);let n=\"\";return r.clauses.forEach(function(t,r){r>0&&(n+=` ${t.bool} `);const i=e[t.type](t);i&&(n+=i)}),n.length?`(${n})`:\"\"},onBasic(t){return this.formatter.wrap(t.column)+\" \"+this.formatter.operator(t.operator)+\" \"+this.formatter.wrap(t.value)},onVal(t){return this.formatter.wrap(t.column)+\" \"+this.formatter.operator(t.operator)+\" \"+this.formatter.parameter(t.value)},onRaw(t){return this.formatter.unwrapRaw(t.value)},onUsing(t){return\"(\"+this.formatter.columnize(t.column)+\")\"},whereIn(t){let e=null;e=Array.isArray(t.column)?`(${this.formatter.columnize(t.column)})`:this.formatter.wrap(t.column);const r=this.formatter.values(t.value);return`${e} ${this._not(t,\"in \")}${r}`},whereNull(t){return this.formatter.wrap(t.column)+\" is \"+this._not(t,\"null\")},whereBasic(t){return this._not(t,\"\")+this.formatter.wrap(t.column)+\" \"+this.formatter.operator(t.operator)+\" \"+(t.asColumn?this.formatter.wrap(t.value):this.formatter.parameter(t.value))},whereExists(t){return this._not(t,\"exists\")+\" (\"+this.formatter.rawOrFn(t.value)+\")\"},whereWrapped(t){const e=this.formatter.rawOrFn(t.value,\"where\");return e&&this._not(t,\"\")+\"(\"+e.slice(6)+\")\"||\"\"},whereBetween(t){return this.formatter.wrap(t.column)+\" \"+this._not(t,\"between\")+\" \"+m(t.value,u(this.formatter.parameter,this.formatter)).join(\" and \")},whereRaw(t){return this._not(t,\"\")+this.formatter.unwrapRaw(t.value)},wrap:t=>\"(\"!==t.charAt(0)?`(${t})`:t,with(){if(!this.grouped.with||!this.grouped.with.length)return\"\";const t=this.grouped.with;if(!t)return;const e=[];let r=-1,n=!1;for(;++rt.not?`not ${e}`:e,_prepInsert(t){const e=this.formatter.rawOrFn(t);if(e)return e;let r=[];const n=[];Array.isArray(t)||(t=t?[t]:[]);let i=-1;for(;++i{return this._formatGroupsItemValue(e.value)+(\"order\"===t&&\"orderByRaw\"!==e.type?` ${r.direction(e.direction)}`:\"\")});return n.length?t+\" by \"+n.join(\", \"):\"\"}}),w.prototype.first=w.prototype.select,Object.defineProperty(w.prototype,\"tableName\",{get(){if(!this._tableName){let t=this.single.table;const e=this.single.schema;t&&e&&(t=`${e}.${t}`),this._tableName=t?this.formatter.wrap(t,t instanceof o):\"\"}return this._tableName}}),t.exports=w},function(t,e,r){function n(t){this.columnName=t}n.prototype.toString=function(){return`[object ReturningHelper:${this.columnName}]`},t.exports={generateCombinedName:function(t,e,n,i){const o=r(184);Array.isArray(i)||(i=i?[i]:[]);const s=n.replace(/\\.|-/g,\"_\"),a=i.join(\"_\");let c=`${s}_${a.length?a+\"_\":\"\"}${e}`.toLowerCase();return c.length>30&&(t.warn(`Automatically generated name \"${c}\" exceeds 30 character `+\"limit for Oracle. Using base64 encoded sha1 of that name instead.\"),c=o.createHash(\"sha1\").update(c).digest(\"base64\").replace(\"=\",\"\")),c},isConnectionError:function(t){return[\"ORA-03114\",\"ORA-03113\",\"ORA-03135\",\"ORA-12514\",\"ORA-00022\",\"ORA-00028\",\"ORA-00031\",\"ORA-00045\",\"ORA-00378\",\"ORA-00602\",\"ORA-00603\",\"ORA-00609\",\"ORA-01012\",\"ORA-01041\",\"ORA-01043\",\"ORA-01089\",\"ORA-01092\",\"ORA-02396\",\"ORA-03122\",\"ORA-12153\",\"ORA-12537\",\"ORA-12547\",\"ORA-12570\",\"ORA-12583\",\"ORA-27146\",\"ORA-28511\",\"ORA-56600\",\"NJS-040\",\"NJS-024\",\"NJS-003\"].some(function(e){return 0===t.message.indexOf(e)})},wrapSqlWithCatch:function(t,e){return`begin execute immediate '${t.replace(/'/g,\"''\")}'; `+`exception when others then if sqlcode != ${e} then raise; `+\"end if; end;\"},ReturningHelper:n}},function(t,e,r){const n=r(7),i=r(14),o=r(129),s=r(130),a=r(29),c=r(18),u=r(36),h=r(19),f=r(147),l=r(22),d=r(148),p=r(23),m=r(49),b=r(24),{Pool:g,TimeoutError:y}=r(149),_=r(0),{EventEmitter:v}=r(12),{promisify:w}=r(15),{makeEscape:E}=r(37),{uniqueId:x,cloneDeep:S,defaults:A}=r(1),C=r(154),k=r(10)(\"knex:client\"),T=r(10)(\"knex:query\"),R=r(10)(\"knex:bindings\"),M=(t,e)=>T(t.replace(/%/g,\"%%\"),e),{POOL_CONFIG_OPTIONS:j}=r(42);function I(t={}){if(this.config=t,this.logger=new C(t),this.dialect&&!this.config.client&&this.logger.warn(\"Using 'this.dialect' to identify the client is deprecated and support for it will be removed in the future. Please use configuration option 'client' instead.\"),!(this.config.client||this.dialect))throw new Error(\"knex: Required configuration option 'client' is missing.\");t.version&&(this.version=t.version),t.connection&&t.connection instanceof Function?(this.connectionConfigProvider=t.connection,this.connectionConfigExpirationChecker=(()=>!0)):(this.connectionSettings=S(t.connection||{}),this.connectionConfigExpirationChecker=null),this.driverName&&t.connection&&(this.initializeDriver(),(!t.pool||t.pool&&0!==t.pool.max)&&this.initializePool(t)),this.valueForUndefined=this.raw(\"DEFAULT\"),t.useNullAsDefault&&(this.valueForUndefined=null)}_(I,v),Object.assign(I.prototype,{formatter(t){return new a(this,t)},queryBuilder(){return new u(this)},queryCompiler(t){return new h(this,t)},schemaBuilder(){return new f(this)},schemaCompiler(t){return new l(this,t)},tableBuilder(t,e,r){return new d(this,t,e,r)},tableCompiler(t){return new p(this,t)},columnBuilder(t,e,r){return new m(this,t,e,r)},columnCompiler(t,e){return new b(this,t,e)},runner(t){return new s(this,t)},transaction(t,e,r){return new c(this,t,e,r)},raw(){return new i(this).set(...arguments)},ref(){return new o(this,...arguments)},_formatQuery(t,e,r){e=null==e?[]:[].concat(e);let n=0;return t.replace(/\\\\?\\?/g,t=>{if(\"\\\\?\"===t)return\"?\";if(n===e.length)return t;const i=e[n++];return this._escapeBinding(i,{timeZone:r})})},_escapeBinding:E({escapeString:t=>`'${t.replace(/'/g,\"''\")}'`}),query(t,e){\"string\"==typeof e&&(e={sql:e}),e.bindings=this.prepBindings(e.bindings);const{__knexUid:r,__knexTxId:n}=t;return this.emit(\"query\",Object.assign({__knexUid:r,__knexTxId:n},e)),M(e.sql,n),R(e.bindings,n),e.sql=this.positionBindings(e.sql),this._query(t,e).catch(t=>{throw t.message=this._formatQuery(e.sql,e.bindings)+\" - \"+t.message,this.emit(\"query-error\",t,Object.assign({__knexUid:r,__knexTxId:n},e)),t})},stream(t,e,r,n){\"string\"==typeof e&&(e={sql:e}),e.bindings=this.prepBindings(e.bindings);const{__knexUid:i,__knexTxId:o}=t;return this.emit(\"query\",Object.assign({__knexUid:i,__knexTxId:o},e)),M(e.sql,o),R(e.bindings,o),e.sql=this.positionBindings(e.sql),this._stream(t,e,r,n)},prepBindings:t=>t,positionBindings:t=>t,postProcessResponse(t,e){return this.config.postProcessResponse?this.config.postProcessResponse(t,e):t},wrapIdentifier(t,e){return this.customWrapIdentifier(t,this.wrapIdentifierImpl,e)},customWrapIdentifier(t,e,r){return this.config.wrapIdentifier?this.config.wrapIdentifier(t,e,r):e(t)},wrapIdentifierImpl:t=>\"*\"!==t?`\"${t.replace(/\"/g,'\"\"')}\"`:\"*\",initializeDriver(){try{this.driver=this._driver()}catch(t){const e=`Knex: run\\n$ npm install ${this.driverName} --save`;throw this.logger.error(`${e}\\n${t.message}\\n${t.stack}`),new Error(`${e}\\n${t.message}`)}},poolDefaults:()=>({min:2,max:10,propagateCreateError:!0}),getPoolSettings(t){t=A({},t,this.poolDefaults()),j.forEach(e=>{e in t&&this.logger.warn([`Pool config option \"${e}\" is no longer supported.`,\"See https://github.com/Vincit/tarn.js for possible pool config options.\"].join(\" \"))});const e=[this.config.acquireConnectionTimeout||6e4,t.acquireTimeoutMillis].filter(t=>void 0!==t);t.acquireTimeoutMillis=Math.min(...e);const r=async()=>{if(!this.connectionConfigProvider)return;if(!this.connectionConfigExpirationChecker||!this.connectionConfigExpirationChecker())return;const t=await this.connectionConfigProvider();t.expirationChecker?(this.connectionConfigExpirationChecker=t.expirationChecker,delete t.expirationChecker):this.connectionConfigExpirationChecker=null,this.connectionSettings=t};return Object.assign(t,{create:async()=>{await r();const e=await this.acquireRawConnection();return e.__knexUid=x(\"__knexUid\"),t.afterCreate&&await w(t.afterCreate)(e),e},destroy:t=>{if(void 0!==t)return this.destroyRawConnection(t)},validate:t=>t.__knex__disposed?(this.logger.warn(`Connection Error: ${t.__knex__disposed}`),!1):this.validateConnection(t)})},initializePool(t=this.config){if(this.pool)return void this.logger.warn(\"The pool has already been initialized\");const e={...this.getPoolSettings(t.pool)};e.afterCreate&&delete e.afterCreate,this.pool=new g(e)},validateConnection:t=>!0,acquireConnection(){if(!this.pool)return n.reject(new Error(\"Unable to acquire a connection\"));try{return n.try(()=>this.pool.acquire().promise).then(t=>(k(\"acquired connection from pool: %s\",t.__knexUid),t)).catch(y,()=>{throw new n.TimeoutError(\"Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?\")})}catch(t){return n.reject(t)}},releaseConnection(t){return k(\"releasing connection to pool: %s\",t.__knexUid),this.pool.release(t)||k(\"pool refused connection: %s\",t.__knexUid),n.resolve()},destroy(t){const e=this.pool&&this.pool.destroy();return n.resolve(e).then(()=>{this.pool=void 0,\"function\"==typeof t&&t()}).catch(e=>(\"function\"==typeof t&&t(e),n.reject(e)))},database(){return this.connectionSettings.database},toString:()=>\"[object KnexClient]\",canCancelQuery:!1,assertCanCancelQuery(){if(!this.canCancelQuery)throw new Error(\"Query cancelling not supported for this dialect\")},cancelQuery(){throw new Error(\"Query cancelling not supported for this dialect\")}}),t.exports=I},function(t,e,r){const{pushQuery:n,pushAdditional:i,unshiftQuery:o}=r(48),{isUndefined:s}=r(1);function a(t,e){this.builder=e,this._commonBuilder=this.builder,this.client=t,this.schema=e._schema,this.formatter=t.formatter(e),this.sequence=[]}function c(t){throw new Error(`${t} is not supported for this dialect (only PostgreSQL supports it currently).`)}function u(t){return function(e,r){const n=this.client.tableBuilder(t,e,r),i=this.builder.queryContext();!s(i)&&s(n.queryContext())&&n.queryContext(i),n.setSchema(this.schema);const o=n.toSQL();for(let t=0,e=o.length;t{c(\"createSchema\")},createSchemaIfNotExists:()=>{c(\"createSchemaIfNotExists\")},dropSchema:()=>{c(\"dropSchema\")},dropSchemaIfExists:()=>{c(\"dropSchemaIfExists\")},alterTable:u(\"alter\"),dropTablePrefix:\"drop table \",dropTable(t){this.pushQuery(this.dropTablePrefix+this.formatter.wrap(h(this.schema,t)))},dropTableIfExists(t){this.pushQuery(this.dropTablePrefix+\"if exists \"+this.formatter.wrap(h(this.schema,t)))},raw(t,e){this.sequence.push(this.client.raw(t,e).toSQL())},toSQL(){const t=this.builder._sequence;for(let e=0,r=t.length;et.toSQL()),r=this.getColumnTypes(e);this.createAlterTableMethods&&this.alterTableForCreate(r),this.createQuery(r,t),this.columnQueries(e),delete this.single.comment,this.alterTable()},b.prototype.createIfNot=function(){this.create(!0)},b.prototype.alter=function(){const t=this.getColumns().map(t=>t.toSQL()),e=this.getColumns(\"alter\"),r=e.map(t=>t.toSQL()),n=this.getColumnTypes(t),i=this.getColumnTypes(r);this.addColumns(n),this.alterColumns(i,e),this.columnQueries(t),this.columnQueries(r),this.alterTable()},b.prototype.foreign=function(t){if(t.inTable&&t.references){const e=t.keyName?this.formatter.wrap(t.keyName):this._indexCommand(\"foreign\",this.tableNameRaw,t.column),r=this.formatter.columnize(t.column),n=this.formatter.columnize(t.references),i=this.formatter.wrap(t.inTable),o=t.onUpdate?(this.lowerCase?\" on update \":\" ON UPDATE \")+t.onUpdate:\"\",s=t.onDelete?(this.lowerCase?\" on delete \":\" ON DELETE \")+t.onDelete:\"\";this.lowerCase?this.pushQuery((this.forCreate?\"\":`alter table ${this.tableName()} add `)+\"constraint \"+e+\" foreign key (\"+r+\") references \"+i+\" (\"+n+\")\"+o+s):this.pushQuery((this.forCreate?\"\":`ALTER TABLE ${this.tableName()} ADD `)+\"CONSTRAINT \"+e+\" FOREIGN KEY (\"+r+\") REFERENCES \"+i+\" (\"+n+\")\"+o+s)}},b.prototype.getColumnTypes=(t=>c(u(t,h),function(t,e){return t.sql.push(e.sql),t.bindings.concat(e.bindings),t},{sql:[],bindings:[]})),b.prototype.columnQueries=function(t){const e=c(u(t,f),function(t,e){return l(e)?t:t.concat(e)},[]);for(const t of e)this.pushQuery(t)},b.prototype.addColumnsPrefix=\"add column \",b.prototype.addColumns=function(t,e){if(e=e||this.addColumnsPrefix,t.sql.length>0){const r=u(t.sql,t=>e+t);this.pushQuery({sql:(this.lowerCase?\"alter table \":\"ALTER TABLE \")+this.tableName()+\" \"+r.join(\", \"),bindings:t.bindings})}},b.prototype.alterColumnsPrefix=\"alter column \",b.prototype.alterColumns=function(t,e){t.sql.length>0&&this.addColumns(t,this.alterColumnsPrefix,e)},b.prototype.getColumns=function(t){const e=this.grouped.columns||[];t=t||\"add\";const r=this.tableBuilder.queryContext();return e.filter(e=>e.builder._method===t).map(t=>(!m(r)&&m(t.builder.queryContext())&&t.builder.queryContext(r),this.client.columnCompiler(this,t.builder)))},b.prototype.tableName=function(){const t=this.schemaNameRaw?`${this.schemaNameRaw}.${this.tableNameRaw}`:this.tableNameRaw;return this.formatter.wrap(t)},b.prototype.alterTable=function(){const t=this.grouped.alterTable||[];for(let e=0,r=t.length;ethis.dropColumnPrefix+this.formatter.wrap(t));this.pushQuery((this.lowerCase?\"alter table \":\"ALTER TABLE \")+this.tableName()+\" \"+e.join(\", \"))},b.prototype._indexCommand=function(t,e,r){p(r)||(r=r?[r]:[]);const n=(e.replace(/\\.|-/g,\"_\")+\"_\"+r.join(\"_\")+\"_\"+t).toLowerCase();return this.formatter.wrap(n)},t.exports=b},function(t,e,r){const n=r(14),i=r(48),{groupBy:o,first:s,tail:a,has:c,isObject:u}=r(1);function h(t,e,r){this.client=t,this.tableCompiler=e,this.columnBuilder=r,this._commonBuilder=this.columnBuilder,this.args=r._args,this.type=r._type.toLowerCase(),this.grouped=o(r._statements,\"grouping\"),this.modified=r._modifiers,this.isIncrements=-1!==this.type.indexOf(\"increments\"),this.formatter=t.formatter(r),this.sequence=[],this.modifiers=[]}h.prototype.pushQuery=i.pushQuery,h.prototype.pushAdditional=i.pushAdditional,h.prototype.unshiftQuery=i.unshiftQuery,h.prototype._defaultMap={columnName:function(){if(!this.isIncrements)throw new Error(`You did not specify a column name for the ${this.type} column.`);return\"id\"}},h.prototype.defaults=function(t){if(Object.prototype.hasOwnProperty.call(this._defaultMap,t))return this._defaultMap[t].bind(this)();throw new Error(`There is no default for the specified identifier ${t}`)},h.prototype.toSQL=function(){return this.pushQuery(this.compileColumn()),this.sequence.additional&&(this.sequence=this.sequence.concat(this.sequence.additional)),this.sequence},h.prototype.compileColumn=function(){return this.formatter.wrap(this.getColumnName())+\" \"+this.getColumnType()+this.getModifiers()},h.prototype.getColumnName=function(){return s(this.args)||this.defaults(\"columnName\")},h.prototype.getColumnType=function(){const t=this[this.type];return\"function\"==typeof t?t.apply(this,a(this.args)):t},h.prototype.getModifiers=function(){const t=[];for(let e=0,r=this.modifiers.length;e0?` ${t.join(\" \")}`:\"\"},h.prototype.increments=\"integer not null primary key autoincrement\",h.prototype.bigincrements=\"integer not null primary key autoincrement\",h.prototype.integer=h.prototype.smallint=h.prototype.mediumint=\"integer\",h.prototype.biginteger=\"bigint\",h.prototype.varchar=function(t){return`varchar(${this._num(t,255)})`},h.prototype.text=\"text\",h.prototype.tinyint=\"tinyint\",h.prototype.floating=function(t,e){return`float(${this._num(t,8)}, ${this._num(e,2)})`},h.prototype.decimal=function(t,e){if(null===t)throw new Error(\"Specifying no precision on decimal columns is not supported for that SQL dialect.\");return`decimal(${this._num(t,8)}, ${this._num(e,2)})`},h.prototype.binary=\"blob\",h.prototype.bool=\"boolean\",h.prototype.date=\"date\",h.prototype.datetime=\"datetime\",h.prototype.time=\"time\",h.prototype.timestamp=\"timestamp\",h.prototype.enu=\"varchar\",h.prototype.bit=h.prototype.json=\"text\",h.prototype.uuid=\"char(36)\",h.prototype.specifictype=(t=>t),h.prototype.nullable=(t=>!1===t?\"not null\":\"null\"),h.prototype.notNullable=function(){return this.nullable(!1)},h.prototype.defaultTo=function(t){return void 0===t?\"\":(null===t?t=\"null\":t instanceof n?t=t.toQuery():\"bool\"===this.type?(\"false\"===t&&(t=0),t=`'${t?1:0}'`):t=\"json\"!==this.type&&\"jsonb\"!==this.type||!u(t)?`'${t}'`:`'${JSON.stringify(t)}'`,`default ${t}`)},h.prototype._num=function(t,e){if(null==t)return e;const r=parseInt(t,10);return isNaN(r)?e:r},t.exports=h},function(t,e,r){\"use strict\";(function(e,n){var i=r(2).Buffer,o=e.crypto||e.msCrypto;o&&o.getRandomValues?t.exports=function(t,r){if(t>65536)throw new Error(\"requested too many random bytes\");var s=new e.Uint8Array(t);t>0&&o.getRandomValues(s);var a=i.from(s.buffer);if(\"function\"==typeof r)return n.nextTick(function(){r(null,a)});return a}:t.exports=function(){throw new Error(\"Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11\")}}).call(this,r(8),r(5))},function(t,e,r){var n=r(2).Buffer;function i(t,e){this._block=n.alloc(t),this._finalSize=e,this._blockSize=t,this._len=0}i.prototype.update=function(t,e){\"string\"==typeof t&&(e=e||\"utf8\",t=n.from(t,e));for(var r=this._block,i=this._blockSize,o=t.length,s=this._len,a=0;a=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(4294967295&r)>>>0,i=(r-n)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var o=this._hash();return t?o.toString(t):o},i.prototype._update=function(){throw new Error(\"_update must be implemented by subclass\")},t.exports=i},function(t,e,r){t.exports=i;var n=r(12).EventEmitter;function i(){n.call(this)}r(0)(i,n),i.Readable=r(45),i.Writable=r(138),i.Duplex=r(139),i.Transform=r(140),i.PassThrough=r(141),i.Stream=i,i.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function o(){r.readable&&r.resume&&r.resume()}r.on(\"data\",i),t.on(\"drain\",o),t._isStdio||e&&!1===e.end||(r.on(\"end\",a),r.on(\"close\",c));var s=!1;function a(){s||(s=!0,t.end())}function c(){s||(s=!0,\"function\"==typeof t.destroy&&t.destroy())}function u(t){if(h(),0===n.listenerCount(this,\"error\"))throw t}function h(){r.removeListener(\"data\",i),t.removeListener(\"drain\",o),r.removeListener(\"end\",a),r.removeListener(\"close\",c),r.removeListener(\"error\",u),t.removeListener(\"error\",u),r.removeListener(\"end\",h),r.removeListener(\"close\",h),t.removeListener(\"close\",h)}return r.on(\"error\",u),t.on(\"error\",u),r.on(\"end\",h),r.on(\"close\",h),t.on(\"close\",h),t.emit(\"pipe\",r),t}},function(t,e,r){(function(t){function r(t){return Object.prototype.toString.call(t)}e.isArray=function(t){return Array.isArray?Array.isArray(t):\"[object Array]\"===r(t)},e.isBoolean=function(t){return\"boolean\"==typeof t},e.isNull=function(t){return null===t},e.isNullOrUndefined=function(t){return null==t},e.isNumber=function(t){return\"number\"==typeof t},e.isString=function(t){return\"string\"==typeof t},e.isSymbol=function(t){return\"symbol\"==typeof t},e.isUndefined=function(t){return void 0===t},e.isRegExp=function(t){return\"[object RegExp]\"===r(t)},e.isObject=function(t){return\"object\"==typeof t&&null!==t},e.isDate=function(t){return\"[object Date]\"===r(t)},e.isError=function(t){return\"[object Error]\"===r(t)||t instanceof Error},e.isFunction=function(t){return\"function\"==typeof t},e.isPrimitive=function(t){return null===t||\"boolean\"==typeof t||\"number\"==typeof t||\"string\"==typeof t||\"symbol\"==typeof t||void 0===t},e.isBuffer=t.isBuffer}).call(this,r(3).Buffer)},function(t,e,r){const n=r(36),i=r(14),{transform:o}=r(1),s=[\"asc\",\"desc\"],a=o([\"=\",\"<\",\">\",\"<=\",\">=\",\"<>\",\"!=\",\"like\",\"not like\",\"between\",\"not between\",\"ilike\",\"not ilike\",\"exists\",\"not exist\",\"rlike\",\"not rlike\",\"regexp\",\"not regexp\",\"&\",\"|\",\"^\",\"<<\",\">>\",\"~\",\"~*\",\"!~\",\"!~*\",\"#\",\"&&\",\"@>\",\"<@\",\"||\",\"&<\",\"&>\",\"-|-\",\"@@\",\"!!\",[\"?\",\"\\\\?\"],[\"?|\",\"\\\\?|\"],[\"?&\",\"\\\\?&\"]],(t,e)=>{Array.isArray(e)?t[e[0]]=e[1]:t[e]=e},{});t.exports=class{constructor(t,e){this.client=t,this.builder=e,this.bindings=[]}columnize(t){const e=Array.isArray(t)?t:[t];let r=\"\",n=-1;for(;++n0&&(r+=\", \"),r+=this.wrap(e[n]);return r}parameterize(t,e){if(\"function\"==typeof t)return this.parameter(t);t=Array.isArray(t)?t:[t];let r=\"\",n=-1;for(;++n0&&(r+=\", \"),r+=this.parameter(void 0===t[n]?e:t[n]);return r}values(t){return Array.isArray(t)?Array.isArray(t[0])?`(${t.map(t=>`(${this.parameterize(t)})`).join(\", \")})`:`(${this.parameterize(t)})`:t instanceof i?`(${this.parameter(t)})`:this.parameter(t)}parameter(t){return\"function\"==typeof t?this.outputQuery(this.compileCallback(t),!0):this.unwrapRaw(t,!0)||\"?\"}unwrapRaw(t,e){let r;return t instanceof n?((r=this.client.queryCompiler(t).toSQL()).bindings&&(this.bindings=this.bindings.concat(r.bindings)),this.outputQuery(r,e)):t instanceof i?(t.client=this.client,this.builder._queryContext&&(t.queryContext=(()=>this.builder._queryContext)),(r=t.toSQL()).bindings&&(this.bindings=this.bindings.concat(r.bindings)),r.sql):void(e&&this.bindings.push(t))}rawOrFn(t,e){return\"function\"==typeof t?this.outputQuery(this.compileCallback(t,e)):this.unwrapRaw(t)||\"\"}wrap(t,e){const r=this.unwrapRaw(t,e);if(r)return r;switch(typeof t){case\"function\":return this.outputQuery(this.compileCallback(t),!0);case\"object\":return this.parseObject(t);case\"number\":return t;default:return this.wrapString(t+\"\")}}wrapAsIdentifier(t){const e=this.builder.queryContext();return this.client.wrapIdentifier((t||\"\").trim(),e)}alias(t,e){return t+\" as \"+e}operator(t){const e=this.unwrapRaw(t);if(e)return e;const r=a[(t||\"\").toLowerCase()];if(!r)throw new TypeError(`The operator \"${t}\" is not permitted`);return r}direction(t){const e=this.unwrapRaw(t);return e||(-1!==s.indexOf((t||\"\").toLowerCase())?t:\"asc\")}compileCallback(t,e){const{client:r}=this,n=r.queryBuilder();t.call(n,n);const i=r.queryCompiler(n);return i.formatter=this,i.toSQL(e||n._method||\"select\")}outputQuery(t,e){let r=t.sql||\"\";return r&&(\"select\"===t.method||\"first\"===t.method)&&(e||t.as)&&(r=`(${r})`,t.as)?this.alias(r,this.wrap(t.as)):r}parseObject(t){const e=[];for(const r in t){const i=t[r];if(\"function\"==typeof i){const t=this.compileCallback(i);t.as=r,e.push(this.outputQuery(t,!0))}else i instanceof n?e.push(this.alias(`(${this.wrap(i)})`,this.wrapAsIdentifier(r))):e.push(this.alias(this.wrap(i),this.wrapAsIdentifier(r)))}return e.join(\", \")}wrapString(t){const e=t.toLowerCase().indexOf(\" as \");if(-1!==e){const r=t.slice(0,e),n=t.slice(e+4);return this.alias(this.wrap(r),this.wrapAsIdentifier(n))}const r=[];let n=-1;const i=t.split(\".\");for(;++n1?r.push(this.wrap((t||\"\").trim())):r.push(this.wrapAsIdentifier(t));return r.join(\".\")}}},function(t,e,r){\"use strict\";var n=r(0),i=r(51),o=r(52),s=r(53),a=r(16);function c(t){a.call(this,\"digest\"),this._hash=t}n(c,a),c.prototype._update=function(t){this._hash.update(t)},c.prototype._final=function(){return this._hash.digest()},t.exports=function(t){return\"md5\"===(t=t.toLowerCase())?new i:\"rmd160\"===t||\"ripemd160\"===t?new o:new c(s(t))}},function(t,e,r){(function(e){t.exports=function(t,r){for(var n=Math.min(t.length,r.length),i=new e(n),o=0;o=this._delta8){var r=(t=this.pending).length%this._delta8;this.pending=t.slice(t.length-r,t.length),0===this.pending.length&&(this.pending=null),t=n.join32(t,0,t.length-r,this.endian);for(var i=0;i>>24&255,n[i++]=t>>>16&255,n[i++]=t>>>8&255,n[i++]=255&t}else for(n[i++]=255&t,n[i++]=t>>>8&255,n[i++]=t>>>16&255,n[i++]=t>>>24&255,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0,o=8;o0&&(this._timeout=t,e&&(this.client.assertCanCancelQuery(),this._cancelOnTimeout=!0)),this},with(t,e){return M(t,e,\"with\"),this.withWrapped(t,e)},withWrapped(t,e){return this._statements.push({grouping:\"with\",type:\"withWrapped\",alias:t,value:e}),this},withRecursive(t,e){return M(t,e,\"withRecursive\"),this.withRecursiveWrapped(t,e)},withRecursiveWrapped(t,e){return this.withWrapped(t,e),this._statements[this._statements.length-1].recursive=!0,this},columns(t){return t||0===t?(this._statements.push({grouping:\"columns\",value:a.normalizeArr.apply(null,arguments)}),this):this},as(t){return this._single.as=t,this},withSchema(t){return this._single.schema=t,this},table(t,e={}){return this._single.table=t,this._single.only=!0===e.only,this},distinct(){return this._statements.push({grouping:\"columns\",value:a.normalizeArr.apply(null,arguments),distinct:!0}),this},distinctOn(){const t=a.normalizeArr.apply(null,arguments);if(d(t))throw new Error(\"distinctOn requires atleast on argument\");return this._statements.push({grouping:\"columns\",value:t,distinctOn:!0}),this},join(t,e){let r;const{schema:n}=this._single,i=this._joinType();return\"function\"==typeof e?(r=new c(t,i,n),e.call(r,r)):\"raw\"===i?r=new c(this.client.raw(t,e),\"raw\"):(r=new c(t,i,t instanceof R?void 0:n),arguments.length>1&&r.on.apply(r,w(arguments).slice(1))),this._statements.push(r),this},innerJoin(){return this._joinType(\"inner\").join.apply(this,arguments)},leftJoin(){return this._joinType(\"left\").join.apply(this,arguments)},leftOuterJoin(){return this._joinType(\"left outer\").join.apply(this,arguments)},rightJoin(){return this._joinType(\"right\").join.apply(this,arguments)},rightOuterJoin(){return this._joinType(\"right outer\").join.apply(this,arguments)},outerJoin(){return this._joinType(\"outer\").join.apply(this,arguments)},fullOuterJoin(){return this._joinType(\"full outer\").join.apply(this,arguments)},crossJoin(){return this._joinType(\"cross\").join.apply(this,arguments)},joinRaw(){return this._joinType(\"raw\").join.apply(this,arguments)},where(t,e,r){if(!1===t||!0===t)return this.where(1,\"=\",t?1:0);if(\"function\"==typeof t)return this.whereWrapped(t);if(t instanceof s&&1===arguments.length)return this.whereRaw(t);if(g(t)&&!(t instanceof s))return this._objectWhere(t);if(2===arguments.length&&(r=e,e=\"=\",null===r))return this.whereNull(t);const n=`${e}`.toLowerCase().trim();if(3===arguments.length){if(\"in\"===n||\"not in\"===n)return this._not(\"not in\"===n).whereIn(arguments[0],arguments[2]);if(\"between\"===n||\"not between\"===n)return this._not(\"not between\"===n).whereBetween(arguments[0],arguments[2])}return null!==r||\"is\"!==n&&\"is not\"!==n?(this._statements.push({grouping:\"where\",type:\"whereBasic\",column:t,operator:e,value:r,not:this._not(),bool:this._bool(),asColumn:this._asColumnFlag}),this):this._not(\"is not\"===n).whereNull(t)},whereColumn(t,e,r){return this._asColumnFlag=!0,this.where.apply(this,arguments),this._asColumnFlag=!1,this},orWhere(){this._bool(\"or\");const t=arguments[0];return!g(t)||p(t)||t instanceof s?this.where.apply(this,arguments):this.whereWrapped(function(){for(const e in t)this.andWhere(e,t[e])})},orWhereColumn(){this._bool(\"or\");const t=arguments[0];return!g(t)||p(t)||t instanceof s?this.whereColumn.apply(this,arguments):this.whereWrapped(function(){for(const e in t)this.andWhereColumn(e,\"=\",t[e])})},whereNot(){return this._not(!0).where.apply(this,arguments)},whereNotColumn(){return this._not(!0).whereColumn.apply(this,arguments)},orWhereNot(){return this._bool(\"or\").whereNot.apply(this,arguments)},orWhereNotColumn(){return this._bool(\"or\").whereNotColumn.apply(this,arguments)},_objectWhere(t){const e=this._bool(),r=this._not()?\"Not\":\"\";for(const n in t)this[e+\"Where\"+r](n,t[n]);return this},whereRaw(t,e){const r=t instanceof s?t:this.client.raw(t,e);return this._statements.push({grouping:\"where\",type:\"whereRaw\",value:r,not:this._not(),bool:this._bool()}),this},orWhereRaw(t,e){return this._bool(\"or\").whereRaw(t,e)},whereWrapped(t){return this._statements.push({grouping:\"where\",type:\"whereWrapped\",value:t,not:this._not(),bool:this._bool()}),this},whereExists(t){return this._statements.push({grouping:\"where\",type:\"whereExists\",value:t,not:this._not(),bool:this._bool()}),this},orWhereExists(t){return this._bool(\"or\").whereExists(t)},whereNotExists(t){return this._not(!0).whereExists(t)},orWhereNotExists(t){return this._bool(\"or\").whereNotExists(t)},whereIn(t,e){return Array.isArray(e)&&d(e)?this.where(this._not()):(this._statements.push({grouping:\"where\",type:\"whereIn\",column:t,value:e,not:this._not(),bool:this._bool()}),this)},orWhereIn(t,e){return this._bool(\"or\").whereIn(t,e)},whereNotIn(t,e){return this._not(!0).whereIn(t,e)},orWhereNotIn(t,e){return this._bool(\"or\")._not(!0).whereIn(t,e)},whereNull(t){return this._statements.push({grouping:\"where\",type:\"whereNull\",column:t,not:this._not(),bool:this._bool()}),this},orWhereNull(t){return this._bool(\"or\").whereNull(t)},whereNotNull(t){return this._not(!0).whereNull(t)},orWhereNotNull(t){return this._bool(\"or\").whereNotNull(t)},whereBetween(t,e){return n(Array.isArray(e),\"The second argument to whereBetween must be an array.\"),n(2===e.length,\"You must specify 2 values for the whereBetween clause\"),this._statements.push({grouping:\"where\",type:\"whereBetween\",column:t,value:e,not:this._not(),bool:this._bool()}),this},whereNotBetween(t,e){return this._not(!0).whereBetween(t,e)},orWhereBetween(t,e){return this._bool(\"or\").whereBetween(t,e)},orWhereNotBetween(t,e){return this._bool(\"or\").whereNotBetween(t,e)},groupBy(t){return t instanceof s?this.groupByRaw.apply(this,arguments):(this._statements.push({grouping:\"group\",type:\"groupByBasic\",value:a.normalizeArr.apply(null,arguments)}),this)},groupByRaw(t,e){const r=t instanceof s?t:this.client.raw(t,e);return this._statements.push({grouping:\"group\",type:\"groupByRaw\",value:r}),this},orderBy(t,e){return Array.isArray(t)?this._orderByArray(t):(this._statements.push({grouping:\"order\",type:\"orderByBasic\",value:t,direction:e}),this)},_orderByArray(t){for(let e=0;e1&&A(S(e))&&([t]=e.splice(e.length-1,1)),e.length?1===e.length&&(e=e[0]):e=\"*\",this._aggregate(\"count\",e,{...t,distinct:!0})},sumDistinct(t,e){return this._aggregate(\"sum\",t,{...e,distinct:!0})},avgDistinct(t,e){return this._aggregate(\"avg\",t,{...e,distinct:!0})},increment(t,e=1){if(g(t)){for(const e in t)this._counter(e,t[e]);return this}return this._counter(t,e)},decrement(t,e=1){if(g(t)){for(const e in t)this._counter(e,-t[e]);return this}return this._counter(t,-e)},clearCounters(){return this._single.counter={},this},first(){if(!this._isSelectQuery())throw new Error(`Cannot chain .first() on \"${this._method}\" query!`);const t=new Array(arguments.length);for(let e=0;e2&&(r=arguments[2]);else{const e=Object.keys(t);this._single.update&&this.client.logger.warn(\"Update called multiple times with objects.\");let i=-1;for(;++i{\"function\"!=typeof this[e]&&this.client.logger.warn(`Knex Error: unknown key ${e}`),Array.isArray(t)?this[e].apply(this,t):this[e](t)}),this},modify(t){return t.apply(this,[this].concat(v(arguments))),this},_counter(t,e){return e=parseFloat(e),this._method=\"update\",this._single.counter=this._single.counter||{},this._single.counter[t]=e,this},_bool(t){if(1===arguments.length)return this._boolFlag=t,this;const e=this._boolFlag;return this._boolFlag=\"and\",e},_not(t){if(1===arguments.length)return this._notFlag=t,this;const e=this._notFlag;return this._notFlag=!1,e},_joinType(t){if(1===arguments.length)return this._joinFlag=t,this;const e=this._joinFlag||\"inner\";return this._joinFlag=\"inner\",e},_aggregate(t,e,r={}){return this._statements.push({grouping:\"columns\",type:e instanceof s?\"aggregateRaw\":\"aggregate\",method:t,value:e,aggregateDistinct:r.distinct||!1,alias:r.as}),this},_clearGrouping(t){this._statements=E(this._statements,{grouping:t})},_isSelectQuery(){return x([\"pluck\",\"first\",\"select\"],this._method)},_hasLockMode(){return x([k.forShare,k.forUpdate],this._single.lock)}}),Object.defineProperty(R.prototype,\"or\",{get(){return this._bool(\"or\")}}),Object.defineProperty(R.prototype,\"not\",{get(){return this._not(!0)}}),R.prototype.select=R.prototype.columns,R.prototype.column=R.prototype.columns,R.prototype.andWhereNot=R.prototype.whereNot,R.prototype.andWhereNotColumn=R.prototype.whereNotColumn,R.prototype.andWhere=R.prototype.where,R.prototype.andWhereColumn=R.prototype.whereColumn,R.prototype.andWhereRaw=R.prototype.whereRaw,R.prototype.andWhereBetween=R.prototype.whereBetween,R.prototype.andWhereNotBetween=R.prototype.whereNotBetween,R.prototype.andHaving=R.prototype.having,R.prototype.andHavingIn=R.prototype.havingIn,R.prototype.andHavingNotIn=R.prototype.havingNotIn,R.prototype.andHavingNull=R.prototype.havingNull,R.prototype.andHavingNotNull=R.prototype.havingNotNull,R.prototype.andHavingExists=R.prototype.havingExists,R.prototype.andHavingNotExists=R.prototype.havingNotExists,R.prototype.andHavingBetween=R.prototype.havingBetween,R.prototype.andHavingNotBetween=R.prototype.havingNotBetween,R.prototype.from=R.prototype.table,R.prototype.into=R.prototype.table,R.prototype.del=R.prototype.delete,r(44)(R),a.addQueryContext(R),R.extend=((t,e)=>{if(Object.prototype.hasOwnProperty.call(R.prototype,t))throw new Error(`Can't extend QueryBuilder with existing method ('${t}').`);u(R.prototype,{[t]:e})}),t.exports=R},function(t,e,r){(function(e){const r=/[\\0\\b\\t\\n\\r\\x1a\"'\\\\]/g,n={\"\\0\":\"\\\\0\",\"\\b\":\"\\\\b\",\"\\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\u001a\":\"\\\\Z\",'\"':'\\\\\"',\"'\":\"\\\\'\",\"\\\\\":\"\\\\\\\\\"};function i(t){return function e(r,n={}){return t(r,e,n)}}function o(t,e,r){return t&&\"function\"==typeof t.toSQL?t.toSQL(r):JSON.stringify(t)}function s(t,e,r){let n=\"\";for(let i=0;i>>24]^h[p>>>16&255]^f[m>>>8&255]^l[255&b]^e[g++],s=u[p>>>24]^h[m>>>16&255]^f[b>>>8&255]^l[255&d]^e[g++],a=u[m>>>24]^h[b>>>16&255]^f[d>>>8&255]^l[255&p]^e[g++],c=u[b>>>24]^h[d>>>16&255]^f[p>>>8&255]^l[255&m]^e[g++],d=o,p=s,m=a,b=c;return o=(n[d>>>24]<<24|n[p>>>16&255]<<16|n[m>>>8&255]<<8|n[255&b])^e[g++],s=(n[p>>>24]<<24|n[m>>>16&255]<<16|n[b>>>8&255]<<8|n[255&d])^e[g++],a=(n[m>>>24]<<24|n[b>>>16&255]<<16|n[d>>>8&255]<<8|n[255&p])^e[g++],c=(n[b>>>24]<<24|n[d>>>16&255]<<16|n[p>>>8&255]<<8|n[255&m])^e[g++],[o>>>=0,s>>>=0,a>>>=0,c>>>=0]}var a=[0,1,2,4,8,16,32,64,128,27,54],c=function(){for(var t=new Array(256),e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=[],n=[],i=[[],[],[],[]],o=[[],[],[],[]],s=0,a=0,c=0;c<256;++c){var u=a^a<<1^a<<2^a<<3^a<<4;u=u>>>8^255&u^99,r[s]=u,n[u]=s;var h=t[s],f=t[h],l=t[f],d=257*t[u]^16843008*u;i[0][s]=d<<24|d>>>8,i[1][s]=d<<16|d>>>16,i[2][s]=d<<8|d>>>24,i[3][s]=d,d=16843009*l^65537*f^257*h^16843008*s,o[0][u]=d<<24|d>>>8,o[1][u]=d<<16|d>>>16,o[2][u]=d<<8|d>>>24,o[3][u]=d,0===s?s=a=1:(s=h^t[t[t[l^h]]],a^=t[t[a]])}return{SBOX:r,INV_SBOX:n,SUB_MIX:i,INV_SUB_MIX:o}}();function u(t){this._key=i(t),this._reset()}u.blockSize=16,u.keySize=32,u.prototype.blockSize=u.blockSize,u.prototype.keySize=u.keySize,u.prototype._reset=function(){for(var t=this._key,e=t.length,r=e+6,n=4*(r+1),i=[],o=0;o>>24,s=c.SBOX[s>>>24]<<24|c.SBOX[s>>>16&255]<<16|c.SBOX[s>>>8&255]<<8|c.SBOX[255&s],s^=a[o/e|0]<<24):e>6&&o%e==4&&(s=c.SBOX[s>>>24]<<24|c.SBOX[s>>>16&255]<<16|c.SBOX[s>>>8&255]<<8|c.SBOX[255&s]),i[o]=i[o-e]^s}for(var u=[],h=0;h>>24]]^c.INV_SUB_MIX[1][c.SBOX[l>>>16&255]]^c.INV_SUB_MIX[2][c.SBOX[l>>>8&255]]^c.INV_SUB_MIX[3][c.SBOX[255&l]]}this._nRounds=r,this._keySchedule=i,this._invKeySchedule=u},u.prototype.encryptBlockRaw=function(t){return s(t=i(t),this._keySchedule,c.SUB_MIX,c.SBOX,this._nRounds)},u.prototype.encryptBlock=function(t){var e=this.encryptBlockRaw(t),r=n.allocUnsafe(16);return r.writeUInt32BE(e[0],0),r.writeUInt32BE(e[1],4),r.writeUInt32BE(e[2],8),r.writeUInt32BE(e[3],12),r},u.prototype.decryptBlock=function(t){var e=(t=i(t))[1];t[1]=t[3],t[3]=e;var r=s(t,this._invKeySchedule,c.INV_SUB_MIX,c.INV_SBOX,this._nRounds),o=n.allocUnsafe(16);return o.writeUInt32BE(r[0],0),o.writeUInt32BE(r[3],4),o.writeUInt32BE(r[2],8),o.writeUInt32BE(r[1],12),o},u.prototype.scrub=function(){o(this._keySchedule),o(this._invKeySchedule),o(this._key)},t.exports.AES=u},function(t,e,r){var n=r(2).Buffer,i=r(51);t.exports=function(t,e,r,o){if(n.isBuffer(t)||(t=n.from(t,\"binary\")),e&&(n.isBuffer(e)||(e=n.from(e,\"binary\")),8!==e.length))throw new RangeError(\"salt should be Buffer with 8 byte length\");for(var s=r/8,a=n.alloc(s),c=n.alloc(o||0),u=n.alloc(0);s>0||o>0;){var h=new i;h.update(u),h.update(t),e&&h.update(e),u=h.digest();var f=0;if(s>0){var l=a.length-s;f=Math.min(s,u.length),u.copy(a,l,0,f),s-=f}if(f0){var d=c.length-o,p=Math.min(o,u.length-f);u.copy(c,d,f,f+p),o-=p}}return u.fill(0),{key:a,iv:c}}},function(t,e,r){\"use strict\";var n=e;n.base=r(218),n.short=r(219),n.mont=r(220),n.edwards=r(221)},function(t,e,r){(function(e){var n=r(237),i=r(249),o=r(250),s=r(55),a=r(87);function c(t){var r;\"object\"!=typeof t||e.isBuffer(t)||(r=t.passphrase,t=t.key),\"string\"==typeof t&&(t=new e(t));var c,u,h=o(t,r),f=h.tag,l=h.data;switch(f){case\"CERTIFICATE\":u=n.certificate.decode(l,\"der\").tbsCertificate.subjectPublicKeyInfo;case\"PUBLIC KEY\":switch(u||(u=n.PublicKey.decode(l,\"der\")),c=u.algorithm.algorithm.join(\".\")){case\"1.2.840.113549.1.1.1\":return n.RSAPublicKey.decode(u.subjectPublicKey.data,\"der\");case\"1.2.840.10045.2.1\":return u.subjectPrivateKey=u.subjectPublicKey,{type:\"ec\",data:u};case\"1.2.840.10040.4.1\":return u.algorithm.params.pub_key=n.DSAparam.decode(u.subjectPublicKey.data,\"der\"),{type:\"dsa\",data:u.algorithm.params};default:throw new Error(\"unknown key id \"+c)}throw new Error(\"unknown key type \"+f);case\"ENCRYPTED PRIVATE KEY\":l=function(t,r){var n=t.algorithm.decrypt.kde.kdeparams.salt,o=parseInt(t.algorithm.decrypt.kde.kdeparams.iters.toString(),10),c=i[t.algorithm.decrypt.cipher.algo.join(\".\")],u=t.algorithm.decrypt.cipher.iv,h=t.subjectPrivateKey,f=parseInt(c.split(\"-\")[1],10)/8,l=a.pbkdf2Sync(r,n,o,f),d=s.createDecipheriv(c,l,u),p=[];return p.push(d.update(h)),p.push(d.final()),e.concat(p)}(l=n.EncryptedPrivateKey.decode(l,\"der\"),r);case\"PRIVATE KEY\":switch(c=(u=n.PrivateKey.decode(l,\"der\")).algorithm.algorithm.join(\".\")){case\"1.2.840.113549.1.1.1\":return n.RSAPrivateKey.decode(u.subjectPrivateKey,\"der\");case\"1.2.840.10045.2.1\":return{curve:u.algorithm.curve,privateKey:n.ECPrivateKey.decode(u.subjectPrivateKey,\"der\").privateKey};case\"1.2.840.10040.4.1\":return u.algorithm.params.priv_key=n.DSAparam.decode(u.subjectPrivateKey,\"der\"),{type:\"dsa\",params:u.algorithm.params};default:throw new Error(\"unknown key id \"+c)}throw new Error(\"unknown key type \"+f);case\"RSA PUBLIC KEY\":return n.RSAPublicKey.decode(l,\"der\");case\"RSA PRIVATE KEY\":return n.RSAPrivateKey.decode(l,\"der\");case\"DSA PRIVATE KEY\":return{type:\"dsa\",params:n.DSAPrivateKey.decode(l,\"der\")};case\"EC PRIVATE KEY\":return{curve:(l=n.ECPrivateKey.decode(l,\"der\")).parameters.value,privateKey:l.privateKey};default:throw new Error(\"unknown key type \"+f)}}t.exports=c,c.signature=n.signature}).call(this,r(3).Buffer)},function(t,e,r){const{keys:n}=r(1),i=Object.freeze({pg:\"postgres\",postgresql:\"postgres\",sqlite:\"sqlite3\"}),o=Object.freeze([\"mssql\",\"mysql\",\"mysql2\",\"oracledb\",\"postgres\",\"redshift\",\"sqlite3\"].concat(n(i))),s=Object.freeze([\"maxWaitingClients\",\"testOnBorrow\",\"fifo\",\"priorityRange\",\"autostart\",\"evictionRunIntervalMillis\",\"numTestsPerRun\",\"softIdleTimeoutMillis\",\"Promise\"]);t.exports={CLIENT_ALIASES:i,SUPPORTED_CLIENTS:o,POOL_CONFIG_OPTIONS:s}},function(t,e){t.exports=function(t,e){if(t.client.config.asyncStackTraces){const r=(new Error).stack.split(\"\\n\");r.splice(0,e),t._asyncStack=r}}},function(t,e,r){const{isEmpty:n,map:i,clone:o,each:s}=r(1),a=r(7);t.exports=function(t){t.prototype.toQuery=function(t){let e=this.toSQL(this._method,t);return Array.isArray(e)||(e=[e]),i(e,e=>this.client._formatQuery(e.sql,e.bindings,t)).join(\";\\n\")},t.prototype.then=function(){let t=this.client.runner(this).run();return this.client.config.asyncStackTraces&&(t=t.catch(t=>{t.originalStack=t.stack;const e=t.stack.split(\"\\n\")[0];throw this._asyncStack.unshift(e),t.stack=this._asyncStack.join(\"\\n\"),t})),a.resolve(t.then.apply(t,arguments))},t.prototype.options=function(t){return this._options=this._options||[],this._options.push(o(t)||{}),this},t.prototype.connection=function(t){return this._connection=t,this},t.prototype.debug=function(t){return this._debug=!arguments.length||t,this},t.prototype.transacting=function(t){if(t&&t.client&&(t.client.transacting?this.client=t.client:t.client.logger.warn(`Invalid transaction value: ${t.client}`)),n(t))throw this.client.logger.error(\"Invalid value on transacting call, potential bug\"),Error(\"Invalid transacting value (null, undefined or empty object)\");return this},t.prototype.stream=function(t){return this.client.runner(this).stream(t)},t.prototype.pipe=function(t,e){return this.client.runner(this).pipe(t,e)},s([\"bind\",\"catch\",\"finally\",\"asCallback\",\"spread\",\"map\",\"reduce\",\"thenReturn\",\"return\",\"yield\",\"ensure\",\"reflect\",\"get\",\"mapSeries\",\"delay\"],function(e){t.prototype[e]=function(){const t=this.then();return t[e].apply(t,arguments)}})}},function(t,e,r){(e=t.exports=r(65)).Stream=e,e.Readable=e,e.Writable=r(46),e.Duplex=r(17),e.Transform=r(69),e.PassThrough=r(137)},function(t,e,r){\"use strict\";(function(e,n,i){var o=r(35);function s(t){var e=this;this.next=null,this.entry=null,this.finish=function(){!function(t,e,r){var n=t.entry;t.entry=null;for(;n;){var i=n.callback;e.pendingcb--,i(r),n=n.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}(e,t)}}t.exports=y;var a,c=!e.browser&&[\"v0.10\",\"v0.9.\"].indexOf(e.version.slice(0,5))>-1?n:o.nextTick;y.WritableState=g;var u=Object.create(r(28));u.inherits=r(0);var h={deprecate:r(136)},f=r(67),l=r(2).Buffer,d=i.Uint8Array||function(){};var p,m=r(68);function b(){}function g(t,e){a=a||r(17),t=t||{};var n=e instanceof a;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,u=t.writableHighWaterMark,h=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(u||0===u)?u:h,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var f=!1===t.decodeStrings;this.decodeStrings=!f,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,n=r.sync,i=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,n,i){--e.pendingcb,r?(o.nextTick(i,n),o.nextTick(S,t,e),t._writableState.errorEmitted=!0,t.emit(\"error\",n)):(i(n),t._writableState.errorEmitted=!0,t.emit(\"error\",n),S(t,e))}(t,r,n,e,i);else{var s=E(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||w(t,r),n?c(v,t,r,s,i):v(t,r,s,i)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function y(t){if(a=a||r(17),!(p.call(y,this)||this instanceof a))return new y(t);this._writableState=new g(t,this),this.writable=!0,t&&(\"function\"==typeof t.write&&(this._write=t.write),\"function\"==typeof t.writev&&(this._writev=t.writev),\"function\"==typeof t.destroy&&(this._destroy=t.destroy),\"function\"==typeof t.final&&(this._final=t.final)),f.call(this)}function _(t,e,r,n,i,o,s){e.writelen=n,e.writecb=s,e.writing=!0,e.sync=!0,r?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function v(t,e,r,n){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit(\"drain\"))}(t,e),e.pendingcb--,n(),S(t,e)}function w(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var n=e.bufferedRequestCount,i=new Array(n),o=e.corkedRequestsFree;o.entry=r;for(var a=0,c=!0;r;)i[a]=r,r.isBuf||(c=!1),r=r.next,a+=1;i.allBuffers=c,_(t,e,!0,e.length,i,\"\",o.finish),e.pendingcb++,e.lastBufferedRequest=null,o.next?(e.corkedRequestsFree=o.next,o.next=null):e.corkedRequestsFree=new s(e),e.bufferedRequestCount=0}else{for(;r;){var u=r.chunk,h=r.encoding,f=r.callback;if(_(t,e,!1,e.objectMode?1:u.length,u,h,f),r=r.next,e.bufferedRequestCount--,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequest=r,e.bufferProcessing=!1}function E(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function x(t,e){t._final(function(r){e.pendingcb--,r&&t.emit(\"error\",r),e.prefinished=!0,t.emit(\"prefinish\"),S(t,e)})}function S(t,e){var r=E(e);return r&&(!function(t,e){e.prefinished||e.finalCalled||(\"function\"==typeof t._final?(e.pendingcb++,e.finalCalled=!0,o.nextTick(x,t,e)):(e.prefinished=!0,t.emit(\"prefinish\")))}(t,e),0===e.pendingcb&&(e.finished=!0,t.emit(\"finish\"))),r}u.inherits(y,f),g.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(g.prototype,\"buffer\",{get:h.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(t){}}(),\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(p=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(t){return!!p.call(this,t)||this===y&&(t&&t._writableState instanceof g)}})):p=function(t){return t instanceof this},y.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))},y.prototype.write=function(t,e,r){var n,i=this._writableState,s=!1,a=!i.objectMode&&(n=t,l.isBuffer(n)||n instanceof d);return a&&!l.isBuffer(t)&&(t=function(t){return l.from(t)}(t)),\"function\"==typeof e&&(r=e,e=null),a?e=\"buffer\":e||(e=i.defaultEncoding),\"function\"!=typeof r&&(r=b),i.ended?function(t,e){var r=new Error(\"write after end\");t.emit(\"error\",r),o.nextTick(e,r)}(this,r):(a||function(t,e,r,n){var i=!0,s=!1;return null===r?s=new TypeError(\"May not write null values to stream\"):\"string\"==typeof r||void 0===r||e.objectMode||(s=new TypeError(\"Invalid non-string/buffer chunk\")),s&&(t.emit(\"error\",s),o.nextTick(n,s),i=!1),i}(this,i,t,r))&&(i.pendingcb++,s=function(t,e,r,n,i,o){if(!r){var s=function(t,e,r){t.objectMode||!1===t.decodeStrings||\"string\"!=typeof e||(e=l.from(e,r));return e}(e,n,i);n!==s&&(r=!0,i=\"buffer\",n=s)}var a=e.objectMode?1:n.length;e.length+=a;var c=e.length-1))throw new TypeError(\"Unknown encoding: \"+t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(y.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(t,e,r){r(new Error(\"_write() is not implemented\"))},y.prototype._writev=null,y.prototype.end=function(t,e,r){var n=this._writableState;\"function\"==typeof t?(r=t,t=null,e=null):\"function\"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,S(t,e),r&&(e.finished?o.nextTick(r):t.once(\"finish\",r));e.ended=!0,t.writable=!1}(this,n,r)},Object.defineProperty(y.prototype,\"destroyed\",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),y.prototype.destroy=m.destroy,y.prototype._undestroy=m.undestroy,y.prototype._destroy=function(t,e){this.end(),e(t)}}).call(this,r(5),r(64).setImmediate,r(8))},function(t,e,r){\"use strict\";var n=r(2).Buffer,i=n.isEncoding||function(t){switch((t=\"\"+t)&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function o(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}(t);if(\"string\"!=typeof e&&(n.isEncoding===i||!i(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}(t),this.encoding){case\"utf16le\":this.text=c,this.end=u,e=4;break;case\"utf8\":this.fillLast=a,e=4;break;case\"base64\":this.text=h,this.end=f,e=3;break;default:return this.write=l,void(this.end=d)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(e)}function s(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function a(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,\"�\";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,\"�\";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,\"�\"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function c(t,e){if((t.length-e)%2==0){var r=t.toString(\"utf16le\",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}function u(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,r)}return e}function h(t,e){var r=(t.length-e)%3;return 0===r?t.toString(\"base64\",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-r))}function f(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function l(t){return t.toString(this.encoding)}function d(t){return t&&t.length?this.write(t):\"\"}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return\"\";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return\"\";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(t.lastNeed=i-1),i;if(--n=0)return i>0&&(t.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:t.lastNeed=i-3),i;return 0}(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString(\"utf8\",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,r){const{isString:n,tail:i}=r(1);t.exports={pushAdditional:function(t){const e=new this.constructor(this.client,this.tableCompiler,this.columnBuilder);t.call(e,i(arguments)),this.sequence.additional=(this.sequence.additional||[]).concat(e.sequence)},pushQuery:function(t){t&&(n(t)&&(t={sql:t}),t.bindings||(t.bindings=this.formatter.bindings),this.sequence.push(t),this.formatter=this.client.formatter(this._commonBuilder))},unshiftQuery:function(t){t&&(n(t)&&(t={sql:t}),t.bindings||(t.bindings=this.formatter.bindings),this.sequence.unshift(t),this.formatter=this.client.formatter(this._commonBuilder))}}},function(t,e,r){const{extend:n,each:i,toArray:o}=r(1),{addQueryContext:s}=r(11);function a(t,e,r,i){this.client=t,this._method=\"add\",this._single={},this._modifiers={},this._statements=[],this._type=h[r]||r,this._args=i,this._tableBuilder=e,\"alter\"===e._method&&n(this,u)}const c={default:\"defaultTo\",defaultsTo:\"defaultTo\"};i([\"default\",\"defaultsTo\",\"defaultTo\",\"unsigned\",\"nullable\",\"first\",\"after\",\"comment\",\"collate\"],function(t){const e=c[t]||t;a.prototype[t]=function(){return this._modifiers[e]=o(arguments),this}}),s(a),a.prototype.notNull=a.prototype.notNullable=function(){return this.nullable(!1)},i([\"index\",\"primary\",\"unique\"],function(t){a.prototype[t]=function(){return-1===this._type.toLowerCase().indexOf(\"increments\")&&this._tableBuilder[t].apply(this._tableBuilder,[this._args[0]].concat(o(arguments))),this}}),a.prototype.references=function(t){return this._tableBuilder.foreign.call(this._tableBuilder,this._args[0],void 0,this)._columnBuilder(this).references(t)};const u={drop:function(){return this._single.drop=!0,this},alterType:function(t){return this._statements.push({grouping:\"alterType\",value:t}),this},alter:function(){return this._method=\"alter\",this}},h={float:\"floating\",enum:\"enu\",boolean:\"bool\",string:\"varchar\",bigint:\"bigInteger\"};t.exports=a},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});const n=r(152);function i(t){return\"number\"==typeof t&&t===Math.round(t)&&t>0}e.defer=function(){let t=null,e=null;return{promise:new Promise((r,n)=>{t=r,e=n}),resolve:t,reject:e}},e.now=function(){return Date.now()},e.duration=function(t,e){return Math.abs(e-t)},e.checkOptionalTime=function(t){return void 0===t||i(t)},e.checkRequiredTime=i,e.delay=function(t){return new Promise(e=>setTimeout(e,t))},e.reflect=function(t){return t.then(t=>new n.PromiseInspection({value:t})).catch(t=>new n.PromiseInspection({error:t}))},e.tryPromise=function(t){try{const e=t();return Promise.resolve(e)}catch(t){return Promise.reject(t)}}},function(t,e,r){\"use strict\";var n=r(0),i=r(81),o=r(2).Buffer,s=new Array(16);function a(){i.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878}function c(t,e){return t<>>32-e}function u(t,e,r,n,i,o,s){return c(t+(e&r|~e&n)+i+o|0,s)+e|0}function h(t,e,r,n,i,o,s){return c(t+(e&n|r&~n)+i+o|0,s)+e|0}function f(t,e,r,n,i,o,s){return c(t+(e^r^n)+i+o|0,s)+e|0}function l(t,e,r,n,i,o,s){return c(t+(r^(e|~n))+i+o|0,s)+e|0}n(a,i),a.prototype._update=function(){for(var t=s,e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);var r=this._a,n=this._b,i=this._c,o=this._d;r=u(r,n,i,o,t[0],3614090360,7),o=u(o,r,n,i,t[1],3905402710,12),i=u(i,o,r,n,t[2],606105819,17),n=u(n,i,o,r,t[3],3250441966,22),r=u(r,n,i,o,t[4],4118548399,7),o=u(o,r,n,i,t[5],1200080426,12),i=u(i,o,r,n,t[6],2821735955,17),n=u(n,i,o,r,t[7],4249261313,22),r=u(r,n,i,o,t[8],1770035416,7),o=u(o,r,n,i,t[9],2336552879,12),i=u(i,o,r,n,t[10],4294925233,17),n=u(n,i,o,r,t[11],2304563134,22),r=u(r,n,i,o,t[12],1804603682,7),o=u(o,r,n,i,t[13],4254626195,12),i=u(i,o,r,n,t[14],2792965006,17),r=h(r,n=u(n,i,o,r,t[15],1236535329,22),i,o,t[1],4129170786,5),o=h(o,r,n,i,t[6],3225465664,9),i=h(i,o,r,n,t[11],643717713,14),n=h(n,i,o,r,t[0],3921069994,20),r=h(r,n,i,o,t[5],3593408605,5),o=h(o,r,n,i,t[10],38016083,9),i=h(i,o,r,n,t[15],3634488961,14),n=h(n,i,o,r,t[4],3889429448,20),r=h(r,n,i,o,t[9],568446438,5),o=h(o,r,n,i,t[14],3275163606,9),i=h(i,o,r,n,t[3],4107603335,14),n=h(n,i,o,r,t[8],1163531501,20),r=h(r,n,i,o,t[13],2850285829,5),o=h(o,r,n,i,t[2],4243563512,9),i=h(i,o,r,n,t[7],1735328473,14),r=f(r,n=h(n,i,o,r,t[12],2368359562,20),i,o,t[5],4294588738,4),o=f(o,r,n,i,t[8],2272392833,11),i=f(i,o,r,n,t[11],1839030562,16),n=f(n,i,o,r,t[14],4259657740,23),r=f(r,n,i,o,t[1],2763975236,4),o=f(o,r,n,i,t[4],1272893353,11),i=f(i,o,r,n,t[7],4139469664,16),n=f(n,i,o,r,t[10],3200236656,23),r=f(r,n,i,o,t[13],681279174,4),o=f(o,r,n,i,t[0],3936430074,11),i=f(i,o,r,n,t[3],3572445317,16),n=f(n,i,o,r,t[6],76029189,23),r=f(r,n,i,o,t[9],3654602809,4),o=f(o,r,n,i,t[12],3873151461,11),i=f(i,o,r,n,t[15],530742520,16),r=l(r,n=f(n,i,o,r,t[2],3299628645,23),i,o,t[0],4096336452,6),o=l(o,r,n,i,t[7],1126891415,10),i=l(i,o,r,n,t[14],2878612391,15),n=l(n,i,o,r,t[5],4237533241,21),r=l(r,n,i,o,t[12],1700485571,6),o=l(o,r,n,i,t[3],2399980690,10),i=l(i,o,r,n,t[10],4293915773,15),n=l(n,i,o,r,t[1],2240044497,21),r=l(r,n,i,o,t[8],1873313359,6),o=l(o,r,n,i,t[15],4264355552,10),i=l(i,o,r,n,t[6],2734768916,15),n=l(n,i,o,r,t[13],1309151649,21),r=l(r,n,i,o,t[4],4149444226,6),o=l(o,r,n,i,t[11],3174756917,10),i=l(i,o,r,n,t[2],718787259,15),n=l(n,i,o,r,t[9],3951481745,21),this._a=this._a+r|0,this._b=this._b+n|0,this._c=this._c+i|0,this._d=this._d+o|0},a.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=o.allocUnsafe(16);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t},t.exports=a},function(t,e,r){\"use strict\";var n=r(3).Buffer,i=r(0),o=r(81),s=new Array(16),a=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],c=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],u=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],h=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11],f=[0,1518500249,1859775393,2400959708,2840853838],l=[1352829926,1548603684,1836072691,2053994217,0];function d(){o.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}function p(t,e){return t<>>32-e}function m(t,e,r,n,i,o,s,a){return p(t+(e^r^n)+o+s|0,a)+i|0}function b(t,e,r,n,i,o,s,a){return p(t+(e&r|~e&n)+o+s|0,a)+i|0}function g(t,e,r,n,i,o,s,a){return p(t+((e|~r)^n)+o+s|0,a)+i|0}function y(t,e,r,n,i,o,s,a){return p(t+(e&n|r&~n)+o+s|0,a)+i|0}function _(t,e,r,n,i,o,s,a){return p(t+(e^(r|~n))+o+s|0,a)+i|0}i(d,o),d.prototype._update=function(){for(var t=s,e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);for(var r=0|this._a,n=0|this._b,i=0|this._c,o=0|this._d,d=0|this._e,v=0|this._a,w=0|this._b,E=0|this._c,x=0|this._d,S=0|this._e,A=0;A<80;A+=1){var C,k;A<16?(C=m(r,n,i,o,d,t[a[A]],f[0],u[A]),k=_(v,w,E,x,S,t[c[A]],l[0],h[A])):A<32?(C=b(r,n,i,o,d,t[a[A]],f[1],u[A]),k=y(v,w,E,x,S,t[c[A]],l[1],h[A])):A<48?(C=g(r,n,i,o,d,t[a[A]],f[2],u[A]),k=g(v,w,E,x,S,t[c[A]],l[2],h[A])):A<64?(C=y(r,n,i,o,d,t[a[A]],f[3],u[A]),k=b(v,w,E,x,S,t[c[A]],l[3],h[A])):(C=_(r,n,i,o,d,t[a[A]],f[4],u[A]),k=m(v,w,E,x,S,t[c[A]],l[4],h[A])),r=d,d=o,o=p(i,10),i=n,n=C,v=S,S=x,x=p(E,10),E=w,w=k}var T=this._b+i+x|0;this._b=this._c+o+S|0,this._c=this._d+d+v|0,this._d=this._e+r+w|0,this._e=this._a+n+E|0,this._a=T},d.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=n.alloc?n.alloc(20):new n(20);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t.writeInt32LE(this._e,16),t},t.exports=d},function(t,e,r){(e=t.exports=function(t){t=t.toLowerCase();var r=e[t];if(!r)throw new Error(t+\" is not supported (we accept pull requests)\");return new r}).sha=r(185),e.sha1=r(186),e.sha224=r(187),e.sha256=r(82),e.sha384=r(188),e.sha512=r(83)},function(t,e,r){\"use strict\";e.utils=r(194),e.Cipher=r(195),e.DES=r(196),e.CBC=r(197),e.EDE=r(198)},function(t,e,r){var n=r(199),i=r(207),o=r(93);e.createCipher=e.Cipher=n.createCipher,e.createCipheriv=e.Cipheriv=n.createCipheriv,e.createDecipher=e.Decipher=i.createDecipher,e.createDecipheriv=e.Decipheriv=i.createDecipheriv,e.listCiphers=e.getCiphers=function(){return Object.keys(o)}},function(t,e,r){var n={ECB:r(200),CBC:r(201),CFB:r(202),CFB8:r(203),CFB1:r(204),OFB:r(205),CTR:r(91),GCM:r(91)},i=r(93);for(var o in i)i[o].module=n[i[o].mode];t.exports=i},function(t,e,r){(function(e){var n=r(4),i=r(25);function o(t,r){var i=function(t){var e=s(t);return{blinder:e.toRed(n.mont(t.modulus)).redPow(new n(t.publicExponent)).fromRed(),unblinder:e.invm(t.modulus)}}(r),o=r.modulus.byteLength(),a=(n.mont(r.modulus),new n(t).mul(i.blinder).umod(r.modulus)),c=a.toRed(n.mont(r.prime1)),u=a.toRed(n.mont(r.prime2)),h=r.coefficient,f=r.prime1,l=r.prime2,d=c.redPow(r.exponent1),p=u.redPow(r.exponent2);d=d.fromRed(),p=p.fromRed();var m=d.isub(p).imul(h).umod(f);return m.imul(l),p.iadd(m),new e(p.imul(i.unblinder).umod(r.modulus).toArray(!1,o))}function s(t){for(var e=t.modulus.byteLength(),r=new n(i(e));r.cmp(t.modulus)>=0||!r.umod(t.prime1)||!r.umod(t.prime2);)r=new n(i(e));return r}t.exports=o,o.getr=s}).call(this,r(3).Buffer)},function(t,e,r){var n=e;n.utils=r(13),n.common=r(32),n.sha=r(223),n.ripemd=r(227),n.hmac=r(228),n.sha1=n.sha.sha1,n.sha256=n.sha.sha256,n.sha224=n.sha.sha224,n.sha384=n.sha.sha384,n.sha512=n.sha.sha512,n.ripemd160=n.ripemd.ripemd160},function(t,e,r){const n=r(20),i={renameColumnTrigger:function(t,e,r,i){const o=n.generateCombinedName(t,\"autoinc_trg\",e);return\"DECLARE PK_NAME VARCHAR(200); IS_AUTOINC NUMBER := 0; BEGIN\"+` EXECUTE IMMEDIATE ('ALTER TABLE \"${e}\" RENAME COLUMN \"${r}\" TO \"${i}\"');`+` SELECT COUNT(*) INTO IS_AUTOINC from \"USER_TRIGGERS\" where trigger_name = '${o}';`+\" IF (IS_AUTOINC > 0) THEN SELECT cols.column_name INTO PK_NAME FROM all_constraints cons, all_cons_columns cols WHERE cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner\"+` AND cols.table_name = '${e}';`+` IF ('${i}' = PK_NAME) THEN`+` EXECUTE IMMEDIATE ('DROP TRIGGER \"${o}\"');`+` EXECUTE IMMEDIATE ('create or replace trigger \"${o}\"`+` BEFORE INSERT on \"${e}\" for each row`+\" declare checking number := 1; begin\"+` if (:new.\"${i}\" is null) then`+\" while checking >= 1 loop\"+` select \"${n.generateCombinedName(t,\"seq\",e)}\".nextval into :new.\"${i}\" from dual;`+` select count(\"${i}\") into checking from \"${e}\"`+` where \"${i}\" = :new.\"${i}\";`+\" end loop; end if; end;'); end if; end if;END;\"},createAutoIncrementTrigger:function(t,e){const r=n.generateCombinedName(t,\"autoinc_trg\",e),i=n.generateCombinedName(t,\"seq\",e);return\"DECLARE PK_NAME VARCHAR(200); BEGIN\"+` EXECUTE IMMEDIATE ('CREATE SEQUENCE \"${i}\"');`+\" SELECT cols.column_name INTO PK_NAME FROM all_constraints cons, all_cons_columns cols WHERE cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner\"+` AND cols.table_name = '${e}';`+` execute immediate ('create or replace trigger \"${r}\"`+` BEFORE INSERT on \"${e}\"`+\" for each row declare checking number := 1; begin if (:new.\\\"' || PK_NAME || '\\\" is null) then while checking >= 1 loop\"+` select \"${i}\".nextval into :new.\"' || PK_NAME || '\" from dual;`+` select count(\"' || PK_NAME || '\") into checking from \"${e}\"`+\" where \\\"' || PK_NAME || '\\\" = :new.\\\"' || PK_NAME || '\\\"; end loop; end if; end;'); END;\"},renameTableAndAutoIncrementTrigger:function(t,e,r){const i=n.generateCombinedName(t,\"autoinc_trg\",e),o=n.generateCombinedName(t,\"seq\",e),s=n.generateCombinedName(t,\"autoinc_trg\",r),a=n.generateCombinedName(t,\"seq\",r);return\"DECLARE PK_NAME VARCHAR(200); IS_AUTOINC NUMBER := 0; BEGIN\"+` EXECUTE IMMEDIATE ('RENAME \"${e}\" TO \"${r}\"');`+` SELECT COUNT(*) INTO IS_AUTOINC from \"USER_TRIGGERS\" where trigger_name = '${i}';`+\" IF (IS_AUTOINC > 0) THEN\"+` EXECUTE IMMEDIATE ('DROP TRIGGER \"${i}\"');`+` EXECUTE IMMEDIATE ('RENAME \"${o}\" TO \"${a}\"');`+\" SELECT cols.column_name INTO PK_NAME FROM all_constraints cons, all_cons_columns cols WHERE cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner\"+` AND cols.table_name = '${r}';`+` EXECUTE IMMEDIATE ('create or replace trigger \"${s}\"`+` BEFORE INSERT on \"${r}\" for each row`+\" declare checking number := 1; begin if (:new.\\\"' || PK_NAME || '\\\" is null) then while checking >= 1 loop\"+` select \"${a}\".nextval into :new.\"' || PK_NAME || '\" from dual;`+` select count(\"' || PK_NAME || '\") into checking from \"${r}\"`+\" where \\\"' || PK_NAME || '\\\" = :new.\\\"' || PK_NAME || '\\\"; end loop; end if; end;'); end if;END;\"}};t.exports=i},function(t,e,r){const n=r(20);function i(t,e){this.columnName=t,this.value=e,this.returning=!1}i.prototype.toString=function(){return\"[object BlobHelper:\"+this.columnName+\"]\"},n.BlobHelper=i,t.exports=n},function(t,e,r){var n=r(126),i=r(127),o=i;o.v1=n,o.v4=i,t.exports=o},function(t,e){var r=\"undefined\"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||\"undefined\"!=typeof msCrypto&&\"function\"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(r){var n=new Uint8Array(16);t.exports=function(){return r(n),n}}else{var i=new Array(16);t.exports=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),i[e]=t>>>((3&e)<<3)&255;return i}}},function(t,e){for(var r=[],n=0;n<256;++n)r[n]=(n+256).toString(16).substr(1);t.exports=function(t,e){var n=e||0,i=r;return[i[t[n++]],i[t[n++]],i[t[n++]],i[t[n++]],\"-\",i[t[n++]],i[t[n++]],\"-\",i[t[n++]],i[t[n++]],\"-\",i[t[n++]],i[t[n++]],\"-\",i[t[n++]],i[t[n++]],i[t[n++]],i[t[n++]],i[t[n++]],i[t[n++]]].join(\"\")}},function(t,e,r){(function(t){var n=void 0!==t&&t||\"undefined\"!=typeof self&&self||window,i=Function.prototype.apply;function o(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new o(i.call(setTimeout,n,arguments),clearTimeout)},e.setInterval=function(){return new o(i.call(setInterval,n,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(n,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},r(128),e.setImmediate=\"undefined\"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate=\"undefined\"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,r(8))},function(t,e,r){\"use strict\";(function(e,n){var i=r(35);t.exports=_;var o,s=r(66);_.ReadableState=y;r(12).EventEmitter;var a=function(t,e){return t.listeners(e).length},c=r(67),u=r(2).Buffer,h=e.Uint8Array||function(){};var f=Object.create(r(28));f.inherits=r(0);var l=r(133),d=void 0;d=l&&l.debuglog?l.debuglog(\"stream\"):function(){};var p,m=r(134),b=r(68);f.inherits(_,c);var g=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function y(t,e){t=t||{};var n=e instanceof(o=o||r(17));this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var i=t.highWaterMark,s=t.readableHighWaterMark,a=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(s||0===s)?s:a,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new m,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(p||(p=r(47).StringDecoder),this.decoder=new p(t.encoding),this.encoding=t.encoding)}function _(t){if(o=o||r(17),!(this instanceof _))return new _(t);this._readableState=new y(t,this),this.readable=!0,t&&(\"function\"==typeof t.read&&(this._read=t.read),\"function\"==typeof t.destroy&&(this._destroy=t.destroy)),c.call(this)}function v(t,e,r,n,i){var o,s=t._readableState;null===e?(s.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,S(t)}(t,s)):(i||(o=function(t,e){var r;n=e,u.isBuffer(n)||n instanceof h||\"string\"==typeof e||void 0===e||t.objectMode||(r=new TypeError(\"Invalid non-string/buffer chunk\"));var n;return r}(s,e)),o?t.emit(\"error\",o):s.objectMode||e&&e.length>0?(\"string\"==typeof e||s.objectMode||Object.getPrototypeOf(e)===u.prototype||(e=function(t){return u.from(t)}(e)),n?s.endEmitted?t.emit(\"error\",new Error(\"stream.unshift() after end event\")):w(t,s,e,!0):s.ended?t.emit(\"error\",new Error(\"stream.push() after EOF\")):(s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?w(t,s,e,!1):C(t,s)):w(t,s,e,!1))):n||(s.reading=!1));return function(t){return!t.ended&&(t.needReadable||t.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=E?t=E:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function S(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(d(\"emitReadable\",e.flowing),e.emittedReadable=!0,e.sync?i.nextTick(A,t):A(t))}function A(t){d(\"emit readable\"),t.emit(\"readable\"),M(t)}function C(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(k,t,e))}function k(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(\"\"):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var n;to.length?o.length:t;if(s===o.length?i+=o:i+=o.slice(0,t),0===(t-=s)){s===o.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(s));break}++n}return e.length-=n,i}(t,e):function(t,e){var r=u.allocUnsafe(t),n=e.head,i=1;n.data.copy(r),t-=n.data.length;for(;n=n.next;){var o=n.data,s=t>o.length?o.length:t;if(o.copy(r,r.length-t,0,s),0===(t-=s)){s===o.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(s));break}++i}return e.length-=i,r}(t,e);return n}(t,e.buffer,e.decoder),r);var r}function I(t){var e=t._readableState;if(e.length>0)throw new Error('\"endReadable()\" called on non-empty stream');e.endEmitted||(e.ended=!0,i.nextTick(N,e,t))}function N(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"))}function O(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return d(\"read: emitReadable\",e.length,e.ended),0===e.length&&e.ended?I(this):S(this),null;if(0===(t=x(t,e))&&e.ended)return 0===e.length&&I(this),null;var n,i=e.needReadable;return d(\"need readable\",i),(0===e.length||e.length-t0?j(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&I(this)),null!==n&&this.emit(\"data\",n),n},_.prototype._read=function(t){this.emit(\"error\",new Error(\"_read() is not implemented\"))},_.prototype.pipe=function(t,e){var r=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=t;break;case 1:o.pipes=[o.pipes,t];break;default:o.pipes.push(t)}o.pipesCount+=1,d(\"pipe count=%d opts=%j\",o.pipesCount,e);var c=(!e||!1!==e.end)&&t!==n.stdout&&t!==n.stderr?h:_;function u(e,n){d(\"onunpipe\"),e===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,d(\"cleanup\"),t.removeListener(\"close\",g),t.removeListener(\"finish\",y),t.removeListener(\"drain\",f),t.removeListener(\"error\",b),t.removeListener(\"unpipe\",u),r.removeListener(\"end\",h),r.removeListener(\"end\",_),r.removeListener(\"data\",m),l=!0,!o.awaitDrain||t._writableState&&!t._writableState.needDrain||f())}function h(){d(\"onend\"),t.end()}o.endEmitted?i.nextTick(c):r.once(\"end\",c),t.on(\"unpipe\",u);var f=function(t){return function(){var e=t._readableState;d(\"pipeOnDrain\",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&a(t,\"data\")&&(e.flowing=!0,M(t))}}(r);t.on(\"drain\",f);var l=!1;var p=!1;function m(e){d(\"ondata\"),p=!1,!1!==t.write(e)||p||((1===o.pipesCount&&o.pipes===t||o.pipesCount>1&&-1!==O(o.pipes,t))&&!l&&(d(\"false write response, pause\",r._readableState.awaitDrain),r._readableState.awaitDrain++,p=!0),r.pause())}function b(e){d(\"onerror\",e),_(),t.removeListener(\"error\",b),0===a(t,\"error\")&&t.emit(\"error\",e)}function g(){t.removeListener(\"finish\",y),_()}function y(){d(\"onfinish\"),t.removeListener(\"close\",g),_()}function _(){d(\"unpipe\"),r.unpipe(t)}return r.on(\"data\",m),function(t,e,r){if(\"function\"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?s(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,\"error\",b),t.once(\"close\",g),t.once(\"finish\",y),t.emit(\"pipe\",r),o.flowing||(d(\"pipe resume\"),r.resume()),t},_.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,r),this);if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o \n * @license MIT\n */\nfunction n(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,o=Math.min(r,n);i=0;u--)if(h[u]!==f[u])return!1;for(u=h.length-1;u>=0;u--)if(c=h[u],!y(t[c],e[c],r,n))return!1;return!0}(t,e,r,s))}return r?t===e:t==e}function _(t){return\"[object Arguments]\"==Object.prototype.toString.call(t)}function v(t,e){if(!t||!e)return!1;if(\"[object RegExp]\"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&!0===e.call({},t)}function w(t,e,r,n){var i;if(\"function\"!=typeof e)throw new TypeError('\"block\" argument must be a function');\"string\"==typeof r&&(n=r,r=null),i=function(t){var e;try{t()}catch(t){e=t}return e}(e),n=(r&&r.name?\" (\"+r.name+\").\":\".\")+(n?\" \"+n:\".\"),t&&!i&&b(i,r,\"Missing expected exception\"+n);var s=\"string\"==typeof n,a=!t&&i&&!r;if((!t&&o.isError(i)&&s&&v(i,r)||a)&&b(i,r,\"Got unwanted exception\"+n),t&&i&&r&&!v(i,r)||!t&&i)throw i}f.AssertionError=function(t){var e;this.name=\"AssertionError\",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=p(m((e=this).actual),128)+\" \"+e.operator+\" \"+p(m(e.expected),128),this.generatedMessage=!0);var r=t.stackStartFunction||b;if(Error.captureStackTrace)Error.captureStackTrace(this,r);else{var n=new Error;if(n.stack){var i=n.stack,o=d(r),s=i.indexOf(\"\\n\"+o);if(s>=0){var a=i.indexOf(\"\\n\",s+1);i=i.substring(a+1)}this.stack=i}}},o.inherits(f.AssertionError,Error),f.fail=b,f.ok=g,f.equal=function(t,e,r){t!=e&&b(t,e,r,\"==\",f.equal)},f.notEqual=function(t,e,r){t==e&&b(t,e,r,\"!=\",f.notEqual)},f.deepEqual=function(t,e,r){y(t,e,!1)||b(t,e,r,\"deepEqual\",f.deepEqual)},f.deepStrictEqual=function(t,e,r){y(t,e,!0)||b(t,e,r,\"deepStrictEqual\",f.deepStrictEqual)},f.notDeepEqual=function(t,e,r){y(t,e,!1)&&b(t,e,r,\"notDeepEqual\",f.notDeepEqual)},f.notDeepStrictEqual=function t(e,r,n){y(e,r,!0)&&b(e,r,n,\"notDeepStrictEqual\",t)},f.strictEqual=function(t,e,r){t!==e&&b(t,e,r,\"===\",f.strictEqual)},f.notStrictEqual=function(t,e,r){t===e&&b(t,e,r,\"!==\",f.notStrictEqual)},f.throws=function(t,e,r){w(!0,t,e,r)},f.doesNotThrow=function(t,e,r){w(!1,t,e,r)},f.ifError=function(t){if(t)throw t};var E=Object.keys||function(t){var e=[];for(var r in t)s.call(t,r)&&e.push(r);return e}}).call(this,r(8))},function(t,e,r){const n=r(70);function i(t,e,r){this.schema=r,this.table=t,this.joinType=e,this.and=this,this.clauses=[]}function o(t,e,r,n,i){let o=null;if(\"function\"==typeof r)o={type:\"onWrapped\",value:r,bool:e};else switch(arguments.length){case 3:o={type:\"onRaw\",value:r,bool:e};break;case 4:o={type:t,column:r,operator:\"=\",value:n,bool:e};break;default:o={type:t,column:r,operator:n,value:i,bool:e}}return o}Object.assign(i.prototype,{grouping:\"join\",on(t){if(\"object\"==typeof t&&\"function\"!=typeof t.toSQL){const e=Object.keys(t);let r=-1;const n=\"or\"===this._bool()?\"orOn\":\"on\";for(;++r(e||(e=this.transaction(void 0,t)),e)},initialize(t){return this.client.initializePool(t)},destroy(t){return this.client.destroy(t)},ref(t){return this.client.ref(t)},disableProcessing(){this.userParams.isProcessingDisabled||(this.userParams.wrapIdentifier=this.client.config.wrapIdentifier,this.userParams.postProcessResponse=this.client.config.postProcessResponse,this.client.config.wrapIdentifier=null,this.client.config.postProcessResponse=null,this.userParams.isProcessingDisabled=!0)},enableProcessing(){this.userParams.isProcessingDisabled&&(this.client.config.wrapIdentifier=this.userParams.wrapIdentifier,this.client.config.postProcessResponse=this.userParams.postProcessResponse,this.userParams.isProcessingDisabled=!1)},withUserParams(e){const r=function(t){const e=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),r={},n=((t,e)=>m(r,t,e)).bind(e);return Object.assign(n,t),n._context=r,n}(t);return this.client&&(r.client=Object.create(this.client.constructor.prototype),c(r.client,this.client),r.client.config=Object.assign({},this.client.config)),d(r,r.client),l(\"query\",t,r),l(\"query-error\",t,r),l(\"query-response\",t,r),l(\"start\",t,r),r.userParams=e,r}}),t.context||(t.context=e)}function l(t,e,r){e.listeners(t).forEach(e=>{r.on(t,e)})}function d(t,e){a.forEach(function(e){t[e]=function(){const r=t.queryBuilder();return r[e].apply(r,arguments)}}),Object.defineProperties(t,{context:{get:()=>t._context,set(e){t._context=e,t.raw=e.raw,t.batchInsert=e.batchInsert,t.transaction=e.transaction,t.transactionProvider=e.transactionProvider,t.initialize=e.initialize,t.destroy=e.destroy,t.ref=e.ref,t.withUserParams=e.withUserParams,t.queryBuilder=e.queryBuilder,t.disableProcessing=e.disableProcessing,t.enableProcessing=e.enableProcessing},configurable:!0},client:{get:()=>t.context.client,set(e){t.context.client=e},configurable:!0},userParams:{get:()=>t.context.userParams,set(e){t.context.userParams=e},configurable:!0},schema:{get:()=>t.client.schemaBuilder(),configurable:!0},migrate:{get:()=>new i(t),configurable:!0},seed:{get:()=>new o(t),configurable:!0},fn:{get:()=>new s(t.client),configurable:!0}}),f(t),t.client=e,t.client.makeKnex=h,t.userParams={};const r=new n;for(const e in r)t[e]=r[e];t._internalListeners&&t._internalListeners.forEach(({eventName:e,listener:r})=>{t.client.removeListener(e,r)}),t._internalListeners=[],p(t,\"start\",e=>{t.emit(\"start\",e)}),p(t,\"query\",e=>{t.emit(\"query\",e)}),p(t,\"query-error\",(e,r)=>{t.emit(\"query-error\",e,r)}),p(t,\"query-response\",(e,r,n)=>{t.emit(\"query-response\",e,r,n)})}function p(t,e,r){t.client.on(e,r),t._internalListeners.push({eventName:e,listener:r})}function m(t,e,r){const n=t.queryBuilder();return e||t.client.logger.warn(\"calling knex without a tableName is deprecated. Use knex.queryBuilder() instead.\"),e?n.table(e,r):n}t.exports=h},function(t,e){t.exports=function(){}},function(t,e){t.exports=[\"with\",\"withRecursive\",\"select\",\"as\",\"columns\",\"column\",\"from\",\"fromJS\",\"into\",\"withSchema\",\"table\",\"distinct\",\"join\",\"joinRaw\",\"innerJoin\",\"leftJoin\",\"leftOuterJoin\",\"rightJoin\",\"rightOuterJoin\",\"outerJoin\",\"fullOuterJoin\",\"crossJoin\",\"where\",\"andWhere\",\"orWhere\",\"whereNot\",\"orWhereNot\",\"whereRaw\",\"whereWrapped\",\"havingWrapped\",\"orWhereRaw\",\"whereExists\",\"orWhereExists\",\"whereNotExists\",\"orWhereNotExists\",\"whereIn\",\"orWhereIn\",\"whereNotIn\",\"orWhereNotIn\",\"whereNull\",\"orWhereNull\",\"whereNotNull\",\"orWhereNotNull\",\"whereBetween\",\"whereNotBetween\",\"andWhereBetween\",\"andWhereNotBetween\",\"orWhereBetween\",\"orWhereNotBetween\",\"groupBy\",\"groupByRaw\",\"orderBy\",\"orderByRaw\",\"union\",\"unionAll\",\"intersect\",\"having\",\"havingRaw\",\"orHaving\",\"orHavingRaw\",\"offset\",\"limit\",\"count\",\"countDistinct\",\"min\",\"max\",\"sum\",\"sumDistinct\",\"avg\",\"avgDistinct\",\"increment\",\"decrement\",\"first\",\"debug\",\"pluck\",\"clearSelect\",\"clearWhere\",\"clearOrder\",\"clearHaving\",\"insert\",\"update\",\"returning\",\"del\",\"delete\",\"truncate\",\"transacting\",\"connection\"]},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.TimeoutError=class extends Error{}},function(t,e,r){\"use strict\";var n=r(157),i=r(158);function o(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}e.parse=_,e.resolve=function(t,e){return _(t,!1,!0).resolve(e)},e.resolveObject=function(t,e){return t?_(t,!1,!0).resolveObject(e):e},e.format=function(t){i.isString(t)&&(t=_(t));return t instanceof o?t.format():o.prototype.format.call(t)},e.Url=o;var s=/^([a-z0-9.+-]+:)/i,a=/:[0-9]*$/,c=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,u=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat([\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"]),h=[\"'\"].concat(u),f=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(h),l=[\"/\",\"?\",\"#\"],d=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,\"javascript:\":!0},b={javascript:!0,\"javascript:\":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},y=r(159);function _(t,e,r){if(t&&i.isObject(t)&&t instanceof o)return t;var n=new o;return n.parse(t,e,r),n}o.prototype.parse=function(t,e,r){if(!i.isString(t))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof t);var o=t.indexOf(\"?\"),a=-1!==o&&o127?N+=\"x\":N+=I[O];if(!N.match(d)){var q=M.slice(0,k),P=M.slice(k+1),L=I.match(p);L&&(q.push(L[1]),P.unshift(L[2])),P.length&&(_=\"/\"+P.join(\".\")+_),this.hostname=q.join(\".\");break}}}this.hostname.length>255?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),R||(this.hostname=n.toASCII(this.hostname));var $=this.port?\":\"+this.port:\"\",U=this.hostname||\"\";this.host=U+$,this.href+=this.host,R&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==_[0]&&(_=\"/\"+_))}if(!m[E])for(k=0,j=h.length;k0)&&r.host.split(\"@\"))&&(r.auth=R.shift(),r.host=r.hostname=R.shift());return r.search=t.search,r.query=t.query,i.isNull(r.pathname)&&i.isNull(r.search)||(r.path=(r.pathname?r.pathname:\"\")+(r.search?r.search:\"\")),r.href=r.format(),r}if(!x.length)return r.pathname=null,r.search?r.path=\"/\"+r.search:r.path=null,r.href=r.format(),r;for(var A=x.slice(-1)[0],C=(r.host||t.host||x.length>1)&&(\".\"===A||\"..\"===A)||\"\"===A,k=0,T=x.length;T>=0;T--)\".\"===(A=x[T])?x.splice(T,1):\"..\"===A?(x.splice(T,1),k++):k&&(x.splice(T,1),k--);if(!w&&!E)for(;k--;k)x.unshift(\"..\");!w||\"\"===x[0]||x[0]&&\"/\"===x[0].charAt(0)||x.unshift(\"\"),C&&\"/\"!==x.join(\"/\").substr(-1)&&x.push(\"\");var R,M=\"\"===x[0]||x[0]&&\"/\"===x[0].charAt(0);S&&(r.hostname=r.host=M?\"\":x.length?x.shift():\"\",(R=!!(r.host&&r.host.indexOf(\"@\")>0)&&r.host.split(\"@\"))&&(r.auth=R.shift(),r.host=r.hostname=R.shift()));return(w=w||r.host&&x.length)&&!M&&x.unshift(\"\"),x.length?r.pathname=x.join(\"/\"):(r.pathname=null,r.path=null),i.isNull(r.pathname)&&i.isNull(r.search)||(r.path=(r.pathname?r.pathname:\"\")+(r.search?r.search:\"\")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},o.prototype.parseHost=function(){var t=this.host,e=a.exec(t);e&&(\":\"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,\"loaded\",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,\"id\",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,r){const n=r(0),{map:i,defer:o}=r(1),{promisify:s}=r(15),a=r(21),c=r(7),u=r(175),h=r(176),f=r(177),l=r(178),d=r(179),{makeEscape:p}=r(37);function m(t){a.call(this,t)}n(m,a),Object.assign(m.prototype,{dialect:\"mysql\",driverName:\"mysql\",_driver:()=>r(180),queryCompiler(){return new h(this,...arguments)},schemaCompiler(){return new f(this,...arguments)},tableCompiler(){return new l(this,...arguments)},columnCompiler(){return new d(this,...arguments)},transaction(){return new u(this,...arguments)},_escapeBinding:p(),wrapIdentifierImpl:t=>\"*\"!==t?`\\`${t.replace(/`/g,\"``\")}\\``:\"*\",acquireRawConnection(){return new c((t,e)=>{const r=this.driver.createConnection(this.connectionSettings);r.on(\"error\",t=>{r.__knex__disposed=t}),r.connect(n=>{if(n)return r.removeAllListeners(),e(n);t(r)})})},async destroyRawConnection(t){try{const e=s(e=>t.end(e));return await e()}catch(e){t.__knex__disposed=e}finally{o(()=>t.removeAllListeners())}},validateConnection:t=>\"connected\"===t.state||\"authenticated\"===t.state,_stream(t,e,r,n){n=n||{};const i=Object.assign({sql:e.sql},e.options);return new c((o,s)=>{r.on(\"error\",s),r.on(\"end\",o);const a=t.query(i,e.bindings).stream(n);a.on(\"error\",t=>{s(t),r.emit(\"error\",t)}),a.pipe(r)})},_query:(t,e)=>(e&&\"string\"!=typeof e||(e={sql:e}),new c(function(r,n){if(!e.sql)return void r();const i=Object.assign({sql:e.sql},e.options);t.query(i,e.bindings,function(t,i,o){if(t)return n(t);e.response=[i,o],r(e)})})),processResponse(t,e){if(null==t)return;const{response:r}=t,{method:n}=t,o=r[0],s=r[1];if(t.output)return t.output.call(e,o,s);switch(n){case\"select\":case\"pluck\":case\"first\":return\"pluck\"===n?i(o,t.pluck):\"first\"===n?o[0]:o;case\"insert\":return[o.insertId];case\"del\":case\"update\":case\"counter\":return o.affectedRows;default:return r}},canCancelQuery:!0,cancelQuery(t){const e=this.acquireConnection();return e.timeout(100).then(e=>this.query(e,{method:\"raw\",sql:\"KILL QUERY ?\",bindings:[t.threadId],options:{}})).finally(()=>{e.then(t=>this.releaseConnection(t))})}}),t.exports=m},function(t,e,r){(function(e){const{map:n,flatten:i,values:o}=r(1),{promisify:s}=r(15),a=r(0),c=r(21),u=r(7),{bufferToString:h}=r(37),f=r(80),l=r(257),d=r(111),p=r(258),m=r(259),b=r(112),g=r(260),{ReturningHelper:y,isConnectionError:_}=r(20);function v(t){c.call(this,t)}a(v,c),Object.assign(v.prototype,{dialect:\"oracle\",driverName:\"oracle\",_driver:()=>r(261),transaction(){return new l(this,...arguments)},formatter(){return new f(this,...arguments)},queryCompiler(){return new d(this,...arguments)},schemaCompiler(){return new p(this,...arguments)},columnBuilder(){return new m(this,...arguments)},columnCompiler(){return new b(this,...arguments)},tableCompiler(){return new g(this,...arguments)},prepBindings(t){return n(t,t=>t instanceof y&&this.driver?new this.driver.OutParam(this.driver.OCCISTRING):\"boolean\"==typeof t?t?1:0:e.isBuffer(t)?h(t):t)},acquireRawConnection(){return new u((t,e)=>{this.driver.connect(this.connectionSettings,(r,n)=>{if(r)return e(r);u.promisifyAll(n),this.connectionSettings.prefetchRowCount&&n.setPrefetchRowCount(this.connectionSettings.prefetchRowCount),t(n)})})},destroyRawConnection:async t=>s(e=>t.close(e))(),database(){return this.connectionSettings.database},positionBindings(t){let e=0;return t.replace(/\\?/g,function(){return`:${e+=1}`})},_stream:(t,e,r,n)=>new u(function(i,o){r.on(\"error\",e=>{_(e)&&(t.__knex__disposed=e),o(e)}),r.on(\"end\",i);const s=t.queryStream(e.sql,e.bindings,n);s.pipe(r),s.on(\"error\",function(t){o(t),r.emit(\"error\",t)})}),_query(t,e){if(!e.sql)throw new Error(\"The query is empty\");return t.executeAsync(e.sql,e.bindings).then(function(r){if(!e.returning)return r;const n=e.outParams.map((t,e)=>r[`returnParam${e||\"\"}`]);return t.executeAsync(e.returningSql,n)}).then(function(t){return e.response=t,e.rowsAffected=t.updateCount,e}).catch(e=>{throw _(e)&&(t.__knex__disposed=e),e})},processResponse(t,e){let{response:r}=t;const{method:s}=t;if(t.output)return t.output.call(e,r);switch(s){case\"select\":case\"pluck\":case\"first\":return\"pluck\"===t.method&&(r=n(r,t.pluck)),\"first\"===t.method?r[0]:r;case\"insert\":case\"del\":case\"update\":case\"counter\":return t.returning?t.returning.length>1||\"*\"===t.returning[0]?r:i(n(r,o)):t.rowsAffected;default:return r}}}),t.exports=v}).call(this,r(3).Buffer)},function(t,e,r){const n=r(29),{ReturningHelper:i}=r(20);t.exports=class extends n{alias(t,e){return t+\" \"+e}parameter(t,e){return t instanceof i&&this.client.driver?t=new this.client.driver.OutParam(this.client.driver.OCCISTRING):\"boolean\"==typeof t&&(t=t?1:0),super.parameter(t,e)}}},function(t,e,r){\"use strict\";var n=r(2).Buffer,i=r(27).Transform;function o(t){i.call(this),this._block=n.allocUnsafe(t),this._blockSize=t,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}r(0)(o,i),o.prototype._transform=function(t,e,r){var n=null;try{this.update(t,e)}catch(t){n=t}r(n)},o.prototype._flush=function(t){var e=null;try{this.push(this.digest())}catch(t){e=t}t(e)},o.prototype.update=function(t,e){if(function(t,e){if(!n.isBuffer(t)&&\"string\"!=typeof t)throw new TypeError(e+\" must be a string or a buffer\")}(t,\"Data\"),this._finalized)throw new Error(\"Digest already called\");n.isBuffer(t)||(t=n.from(t,e));for(var r=this._block,i=0;this._blockOffset+t.length-i>=this._blockSize;){for(var o=this._blockOffset;o0;++s)this._length[s]+=a,(a=this._length[s]/4294967296|0)>0&&(this._length[s]-=4294967296*a);return this},o.prototype._update=function(){throw new Error(\"_update is not implemented\")},o.prototype.digest=function(t){if(this._finalized)throw new Error(\"Digest already called\");this._finalized=!0;var e=this._digest();void 0!==t&&(e=e.toString(t)),this._block.fill(0),this._blockOffset=0;for(var r=0;r<4;++r)this._length[r]=0;return e},o.prototype._digest=function(){throw new Error(\"_digest is not implemented\")},t.exports=o},function(t,e,r){var n=r(0),i=r(26),o=r(2).Buffer,s=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],a=new Array(64);function c(){this.init(),this._w=a,i.call(this,64,56)}function u(t,e,r){return r^t&(e^r)}function h(t,e,r){return t&e|r&(t|e)}function f(t){return(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function l(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function d(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}n(c,i),c.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},c.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,a=0|this._d,c=0|this._e,p=0|this._f,m=0|this._g,b=0|this._h,g=0;g<16;++g)r[g]=t.readInt32BE(4*g);for(;g<64;++g)r[g]=0|(((e=r[g-2])>>>17|e<<15)^(e>>>19|e<<13)^e>>>10)+r[g-7]+d(r[g-15])+r[g-16];for(var y=0;y<64;++y){var _=b+l(c)+u(c,p,m)+s[y]+r[y]|0,v=f(n)+h(n,i,o)|0;b=m,m=p,p=c,c=a+_|0,a=o,o=i,i=n,n=_+v|0}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=a+this._d|0,this._e=c+this._e|0,this._f=p+this._f|0,this._g=m+this._g|0,this._h=b+this._h|0},c.prototype._hash=function(){var t=o.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},t.exports=c},function(t,e,r){var n=r(0),i=r(26),o=r(2).Buffer,s=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],a=new Array(160);function c(){this.init(),this._w=a,i.call(this,128,112)}function u(t,e,r){return r^t&(e^r)}function h(t,e,r){return t&e|r&(t|e)}function f(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function l(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function d(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^t>>>7}function p(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^(t>>>7|e<<25)}function m(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^t>>>6}function b(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^(t>>>6|e<<26)}function g(t,e){return t>>>0>>0?1:0}n(c,i),c.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},c.prototype._update=function(t){for(var e=this._w,r=0|this._ah,n=0|this._bh,i=0|this._ch,o=0|this._dh,a=0|this._eh,c=0|this._fh,y=0|this._gh,_=0|this._hh,v=0|this._al,w=0|this._bl,E=0|this._cl,x=0|this._dl,S=0|this._el,A=0|this._fl,C=0|this._gl,k=0|this._hl,T=0;T<32;T+=2)e[T]=t.readInt32BE(4*T),e[T+1]=t.readInt32BE(4*T+4);for(;T<160;T+=2){var R=e[T-30],M=e[T-30+1],j=d(R,M),I=p(M,R),N=m(R=e[T-4],M=e[T-4+1]),O=b(M,R),B=e[T-14],q=e[T-14+1],P=e[T-32],L=e[T-32+1],$=I+q|0,U=j+B+g($,I)|0;U=(U=U+N+g($=$+O|0,O)|0)+P+g($=$+L|0,L)|0,e[T]=U,e[T+1]=$}for(var D=0;D<160;D+=2){U=e[D],$=e[D+1];var F=h(r,n,i),z=h(v,w,E),H=f(r,v),Q=f(v,r),W=l(a,S),K=l(S,a),V=s[D],Y=s[D+1],G=u(a,c,y),X=u(S,A,C),J=k+K|0,Z=_+W+g(J,k)|0;Z=(Z=(Z=Z+G+g(J=J+X|0,X)|0)+V+g(J=J+Y|0,Y)|0)+U+g(J=J+$|0,$)|0;var tt=Q+z|0,et=H+F+g(tt,Q)|0;_=y,k=C,y=c,C=A,c=a,A=S,a=o+Z+g(S=x+J|0,x)|0,o=i,x=E,i=n,E=w,n=r,w=v,r=Z+et+g(v=J+tt|0,J)|0}this._al=this._al+v|0,this._bl=this._bl+w|0,this._cl=this._cl+E|0,this._dl=this._dl+x|0,this._el=this._el+S|0,this._fl=this._fl+A|0,this._gl=this._gl+C|0,this._hl=this._hl+k|0,this._ah=this._ah+r+g(this._al,v)|0,this._bh=this._bh+n+g(this._bl,w)|0,this._ch=this._ch+i+g(this._cl,E)|0,this._dh=this._dh+o+g(this._dl,x)|0,this._eh=this._eh+a+g(this._el,S)|0,this._fh=this._fh+c+g(this._fl,A)|0,this._gh=this._gh+y+g(this._gl,C)|0,this._hh=this._hh+_+g(this._hl,k)|0},c.prototype._hash=function(){var t=o.allocUnsafe(64);function e(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),e(this._gh,this._gl,48),e(this._hh,this._hl,56),t},t.exports=c},function(t,e,r){\"use strict\";var n=r(0),i=r(189),o=r(16),s=r(2).Buffer,a=r(85),c=r(52),u=r(53),h=s.alloc(128);function f(t,e){o.call(this,\"digest\"),\"string\"==typeof e&&(e=s.from(e));var r=\"sha512\"===t||\"sha384\"===t?128:64;(this._alg=t,this._key=e,e.length>r)?e=(\"rmd160\"===t?new c:u(t)).update(e).digest():e.lengthr||o!=o)throw new TypeError(\"Bad key length\")}}).call(this,r(3).Buffer)},function(t,e,r){(function(e){var r;e.browser?r=\"utf-8\":r=parseInt(e.version.split(\".\")[0].slice(1),10)>=6?\"utf-8\":\"binary\";t.exports=r}).call(this,r(5))},function(t,e,r){var n=r(85),i=r(52),o=r(53),s=r(88),a=r(89),c=r(2).Buffer,u=c.alloc(128),h={md5:16,sha1:20,sha224:28,sha256:32,sha384:48,sha512:64,rmd160:20,ripemd160:20};function f(t,e,r){var s=function(t){return\"rmd160\"===t||\"ripemd160\"===t?function(t){return(new i).update(t).digest()}:\"md5\"===t?n:function(e){return o(t).update(e).digest()}}(t),a=\"sha512\"===t||\"sha384\"===t?128:64;e.length>a?e=s(e):e.lengtht;)r.ishrn(1);if(r.isEven()&&r.iadd(a),r.testn(1)||r.iadd(c),e.cmp(c)){if(!e.cmp(u))for(;r.mod(h).cmp(f);)r.iadd(d)}else for(;r.mod(o).cmp(l);)r.iadd(d);if(b(p=r.shrn(1))&&b(r)&&g(p)&&g(r)&&s.test(p)&&s.test(r))return r}}},function(t,e,r){var n=r(4),i=r(98);function o(t){this.rand=t||new i.Rand}t.exports=o,o.create=function(t){return new o(t)},o.prototype._randbelow=function(t){var e=t.bitLength(),r=Math.ceil(e/8);do{var i=new n(this.rand.generate(r))}while(i.cmp(t)>=0);return i},o.prototype._randrange=function(t,e){var r=e.sub(t);return t.add(this._randbelow(r))},o.prototype.test=function(t,e,r){var i=t.bitLength(),o=n.mont(t),s=new n(1).toRed(o);e||(e=Math.max(1,i/48|0));for(var a=t.subn(1),c=0;!a.testn(c);c++);for(var u=t.shrn(c),h=a.toRed(o);e>0;e--){var f=this._randrange(new n(2),a);r&&r(f);var l=f.toRed(o).redPow(u);if(0!==l.cmp(s)&&0!==l.cmp(h)){for(var d=1;d0;e--){var h=this._randrange(new n(2),s),f=t.gcd(h);if(0!==f.cmpn(1))return f;var l=h.toRed(i).redPow(c);if(0!==l.cmp(o)&&0!==l.cmp(u)){for(var d=1;d>8,s=255&i;o?r.push(o,s):r.push(s)}return r},n.zero2=i,n.toHex=o,n.encode=function(t,e){return\"hex\"===e?o(t):t}},function(t,e,r){\"use strict\";var n=r(13).rotr32;function i(t,e,r){return t&e^~t&r}function o(t,e,r){return t&e^t&r^e&r}function s(t,e,r){return t^e^r}e.ft_1=function(t,e,r,n){return 0===t?i(e,r,n):1===t||3===t?s(e,r,n):2===t?o(e,r,n):void 0},e.ch32=i,e.maj32=o,e.p32=s,e.s0_256=function(t){return n(t,2)^n(t,13)^n(t,22)},e.s1_256=function(t){return n(t,6)^n(t,11)^n(t,25)},e.g0_256=function(t){return n(t,7)^n(t,18)^t>>>3},e.g1_256=function(t){return n(t,17)^n(t,19)^t>>>10}},function(t,e,r){\"use strict\";var n=r(13),i=r(32),o=r(100),s=r(9),a=n.sum32,c=n.sum32_4,u=n.sum32_5,h=o.ch32,f=o.maj32,l=o.s0_256,d=o.s1_256,p=o.g0_256,m=o.g1_256,b=i.BlockHash,g=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function y(){if(!(this instanceof y))return new y;b.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=g,this.W=new Array(64)}n.inherits(y,b),t.exports=y,y.blockSize=512,y.outSize=256,y.hmacStrength=192,y.padLength=64,y.prototype._update=function(t,e){for(var r=this.W,n=0;n<16;n++)r[n]=t[e+n];for(;n>6],i=0==(32&r);if(31==(31&r)){var o=r;for(r=0;128==(128&o);){if(o=t.readUInt8(e),t.isError(o))return o;r<<=7,r|=127&o}}else r&=31;return{cls:n,primitive:i,tag:r,tagStr:a.tag[r]}}function f(t,e,r){var n=t.readUInt8(r);if(t.isError(n))return n;if(!e&&128===n)return null;if(0==(128&n))return n;var i=127&n;if(i>4)return t.error(\"length octect is too long\");n=0;for(var o=0;o=31)return n.error(\"Multi-octet tag encoding unsupported\");e||(i|=32);return i|=a.tagClassByName[r||\"universal\"]<<6}(t,e,r,this.reporter);if(n.length<128)return(o=new i(2))[0]=s,o[1]=n.length,this._createEncoderBuffer([o,n]);for(var c=1,u=n.length;u>=256;u>>=8)c++;(o=new i(2+c))[0]=s,o[1]=128|c;u=1+c;for(var h=n.length;h>0;u--,h>>=8)o[u]=255&h;return this._createEncoderBuffer([o,n])},u.prototype._encodeStr=function(t,e){if(\"bitstr\"===e)return this._createEncoderBuffer([0|t.unused,t.data]);if(\"bmpstr\"===e){for(var r=new i(2*t.length),n=0;n=40)return this.reporter.error(\"Second objid identifier OOB\");t.splice(0,2,40*t[0]+t[1])}var o=0;for(n=0;n=128;s>>=7)o++}var a=new i(o),c=a.length-1;for(n=t.length-1;n>=0;n--){s=t[n];for(a[c--]=127&s;(s>>=7)>0;)a[c--]=128|127&s}return this._createEncoderBuffer(a)},u.prototype._encodeTime=function(t,e){var r,n=new Date(t);return\"gentime\"===e?r=[h(n.getFullYear()),h(n.getUTCMonth()+1),h(n.getUTCDate()),h(n.getUTCHours()),h(n.getUTCMinutes()),h(n.getUTCSeconds()),\"Z\"].join(\"\"):\"utctime\"===e?r=[h(n.getFullYear()%100),h(n.getUTCMonth()+1),h(n.getUTCDate()),h(n.getUTCHours()),h(n.getUTCMinutes()),h(n.getUTCSeconds()),\"Z\"].join(\"\"):this.reporter.error(\"Encoding \"+e+\" time is not supported yet\"),this._encodeStr(r,\"octstr\")},u.prototype._encodeNull=function(){return this._createEncoderBuffer(\"\")},u.prototype._encodeInt=function(t,e){if(\"string\"==typeof t){if(!e)return this.reporter.error(\"String int or enum given, but no values map\");if(!e.hasOwnProperty(t))return this.reporter.error(\"Values map doesn't contain: \"+JSON.stringify(t));t=e[t]}if(\"number\"!=typeof t&&!i.isBuffer(t)){var r=t.toArray();!t.sign&&128&r[0]&&r.unshift(0),t=new i(r)}if(i.isBuffer(t)){var n=t.length;0===t.length&&n++;var o=new i(n);return t.copy(o),0===t.length&&(o[0]=0),this._createEncoderBuffer(o)}if(t<128)return this._createEncoderBuffer(t);if(t<256)return this._createEncoderBuffer([0,t]);n=1;for(var s=t;s>=256;s>>=8)n++;for(s=(o=new Array(n)).length-1;s>=0;s--)o[s]=255&t,t>>=8;return 128&o[0]&&o.unshift(0),this._createEncoderBuffer(new i(o))},u.prototype._encodeBool=function(t){return this._createEncoderBuffer(t?255:0)},u.prototype._use=function(t,e){return\"function\"==typeof t&&(t=t(e)),t._getEncoder(\"der\").tree},u.prototype._skipDefault=function(t,e,r){var n,i=this._baseState;if(null===i.default)return!1;var o=t.join();if(void 0===i.defaultBuffer&&(i.defaultBuffer=this._encodeValue(i.default,e,r).join()),o.length!==i.defaultBuffer.length)return!1;for(n=0;n{let i;const o=c?\"\":this.formatter.parameterize(t,this.client.valueForUndefined),s=Array.isArray(e)?e:[e];let a=`insert into ${this.tableName} `;e&&(i=new d(s.join(\":\")),n.outParams=(n.outParams||[]).concat(i)),a+=c?`(${this.formatter.wrap(this.single.returning)}) values (default)`:`(${this.formatter.columnize(r.columns)}) values (${o})`,a+=e?` returning ROWID into ${this.formatter.parameter(i)}`:\"\",a=this.formatter.client.positionBindings(a);const u=o.replace(\"DEFAULT, \",\"\").replace(\", DEFAULT\",\"\");return`execute immediate '${a.replace(/'/g,\"''\")}`+(u||e?\"' using \":\"\")+u+(u&&e?\", \":\"\")+(e?\"out ?\":\"\")+\";\"}).join(\" \")+\"end;\",e&&(n.returning=e,n.returningSql=`select ${this.formatter.columnize(e)}`+\" from \"+this.tableName+\" where ROWID in (\"+n.outParams.map((t,e)=>`:${e+1}`).join(\", \")+\") order by case ROWID \"+n.outParams.map((t,e)=>`when CHARTOROWID(:${e+1}) then ${e}`).join(\" \")+\" end\"),n},update(){const t=this._prepUpdate(this.single.update),e=this.where();let{returning:r}=this.single;const n=`update ${this.tableName}`+\" set \"+t.join(\", \")+(e?` ${e}`:\"\");return r?(Array.isArray(r)||(r=[r]),this._addReturningToSqlAndConvert(n,r,this.tableName)):n},truncate(){return`truncate table ${this.tableName}`},forUpdate:()=>\"for update\",forShare(){return this.client.logger.warn(\"lock for share is not supported by oracle dialect\"),\"\"},columnInfo(){const t=this.single.columnInfo;return{sql:`select * from xmltable( '/ROWSET/ROW'\\n passing dbms_xmlgen.getXMLType('\\n select char_col_decl_length, column_name, data_type, data_default, nullable\\n from user_tab_columns where table_name = ''${this.client.customWrapIdentifier(this.single.table,h)}'' ')\\n columns\\n CHAR_COL_DECL_LENGTH number, COLUMN_NAME varchar2(200), DATA_TYPE varchar2(106),\\n DATA_DEFAULT clob, NULLABLE varchar2(1))`,output(e){const r=c(e,function(t,e){return t[e.COLUMN_NAME]={type:e.DATA_TYPE,defaultValue:e.DATA_DEFAULT,maxLength:e.CHAR_COL_DECL_LENGTH,nullable:\"Y\"===e.NULLABLE},t},{});return t&&r[t]||r}}},select(){let t=this.with();const e=a(p,t=>this[t]());return t+=u(e).join(\" \"),this._surroundQueryWithLimitAndOffset(t)},aggregate(t){return this._aggregate(t,{aliasSeparator:\" \"})},_addReturningToSqlAndConvert(t,e,r){const n={sql:t};if(!e)return n;const i=Array.isArray(e)?e:[e],o=new d(i.join(\":\"));return n.sql=t+\" returning ROWID into \"+this.formatter.parameter(o),n.returningSql=`select ${this.formatter.columnize(e)} from ${r} where ROWID = :1`,n.outParams=[o],n.returning=e,n},_surroundQueryWithLimitAndOffset(t){let{limit:e}=this.single;const{offset:r}=this.single,n=e||0===e||\"0\"===e;if(e=+e,!n&&!r)return t;if(t=t||\"\",n&&!r)return`select * from (${t}) where rownum <= ${this.formatter.parameter(e)}`;const i=+r+(n?e:1e13);return\"select * from (select row_.*, ROWNUM rownum_ from (\"+t+\") row_ where rownum <= \"+this.formatter.parameter(i)+\") where rownum_ > \"+this.formatter.parameter(r)}}),m.prototype.first=m.prototype.select,t.exports=m},function(t,e,r){const{uniq:n,map:i}=r(1),o=r(0),s=r(14),a=r(24),c=r(59);function u(){a.apply(this,arguments),this.modifiers=[\"defaultTo\",\"checkIn\",\"nullable\",\"comment\"]}o(u,a),Object.assign(u.prototype,{_createAutoIncrementTriggerAndSequence(){this.pushAdditional(function(){const t=this.tableCompiler.tableNameRaw,e=c.createAutoIncrementTrigger(this.client.logger,t);this.pushQuery(e)})},increments(){return this._createAutoIncrementTriggerAndSequence(),\"integer not null primary key\"},bigincrements(){return this._createAutoIncrementTriggerAndSequence(),\"number(20, 0) not null primary key\"},floating(t){const e=this._num(t,0);return`float${e?`(${e})`:\"\"}`},double(t,e){return`number(${this._num(t,8)}, ${this._num(e,2)})`},decimal(t,e){return null===t?\"decimal\":`decimal(${this._num(t,8)}, ${this._num(e,2)})`},integer(t){return t?`number(${this._num(t,11)})`:\"integer\"},tinyint:\"smallint\",smallint:\"smallint\",mediumint:\"integer\",biginteger:\"number(20, 0)\",text:\"clob\",enu(t){const e=((t=n(t))||[]).reduce((t,e)=>Math.max(t,String(e).length),1);return this.columnBuilder._modifiers.checkIn=[t],`varchar2(${e})`},time:\"timestamp with time zone\",datetime:t=>t?\"timestamp\":\"timestamp with time zone\",timestamp:t=>t?\"timestamp\":\"timestamp with time zone\",bit:\"clob\",json:\"clob\",bool(){return this.columnBuilder._modifiers.checkIn=[[0,1]],\"number(1, 0)\"},varchar(t){return`varchar2(${this._num(t,255)})`},comment(t){const e=this.args[0]||this.defaults(\"columnName\");this.pushAdditional(function(){this.pushQuery(`comment on column ${this.tableCompiler.tableName()}.`+this.formatter.wrap(e)+\" is '\"+(t||\"\")+\"'\")},t)},checkIn(t){return void 0===t?\"\":(t=t instanceof s?t.toQuery():Array.isArray(t)?i(t,t=>`'${t}'`).join(\", \"):`'${t}'`,`check (${this.formatter.wrap(this.args[0])} in (${t}))`)}}),t.exports=u},function(t,e){},function(t,e,r){(function(e){const{map:n,extend:i,isString:o}=r(1),{promisify:s}=r(15),a=r(0),c=r(21),u=r(7),h=r(115),f=r(116),l=r(117),d=r(118),{makeEscape:p}=r(37);function m(t){c.apply(this,arguments),t.returning&&(this.defaultReturning=t.returning),t.searchPath&&(this.searchPath=t.searchPath)}a(m,c),Object.assign(m.prototype,{queryCompiler(){return new h(this,...arguments)},columnCompiler(){return new f(this,...arguments)},schemaCompiler(){return new d(this,...arguments)},tableCompiler(){return new l(this,...arguments)},dialect:\"postgresql\",driverName:\"pg\",_driver:()=>r(119),_escapeBinding:p({escapeArray:(t,e)=>e(function t(e,r){let n=\"{\";for(let i=0;i0&&(n+=\",\");const o=e[i];null==o?n+=\"NULL\":Array.isArray(o)?n+=t(o,r):n+=\"number\"==typeof o?o:JSON.stringify(\"string\"==typeof o?o:r(o))}return n+\"}\"}(t,e)),escapeString(t){let e=!1,r=\"'\";for(let n=0;n{i.__knex__disposed=t}),i.on(\"end\",t=>{i.__knex__disposed=t||\"Connection ended unexpectedly\"}),t.version?void e(i):t.checkVersion(i).then(function(r){t.version=r,e(i)}))})}).then(function(e){return t.setSchemaSearchPath(e),e})},destroyRawConnection:async t=>s(e=>t.end(e))(),checkVersion:t=>new u(function(e,r){t.query(\"select version();\",function(t,n){if(t)return r(t);e(/^PostgreSQL (.*?)( |$)/.exec(n.rows[0].version)[1])})}),positionBindings(t){let e=0;return t.replace(/(\\\\*)(\\?)/g,function(t,r){return r.length%2?\"?\":`$${++e}`})},setSchemaSearchPath(t,e){let r=e||this.searchPath;if(!r)return u.resolve(!0);if(!Array.isArray(r)&&!o(r))throw new TypeError(`knex: Expected searchPath to be Array/String, got: ${typeof r}`);if(o(r)){if(r.includes(\",\")){const t=`[${r.split(\",\").map(t=>`'${t}'`).join(\", \")}]`;this.logger.warn(`Detected comma in searchPath \"${r}\".`+`If you are trying to specify multiple schemas, use Array syntax: ${t}`)}r=[r]}return r=r.map(t=>`\"${t}\"`).join(\",\"),new u(function(e,n){t.query(`set search_path to ${r}`,function(t){if(t)return n(t);e(!0)})})},_stream(t,n,i,o){const s=e.browser?void 0:r(266),a=n.sql;return new u(function(e,r){const c=t.query(new s(a,n.bindings,o));c.on(\"error\",function(t){r(t),i.emit(\"error\",t)}),i.on(\"end\",e),c.pipe(i)})},_query(t,e){let r={text:e.sql,values:e.bindings||[]};return e.options&&(r=i(r,e.options)),new u(function(n,i){t.query(r,function(t,r){if(t)return i(t);e.response=r,n(e)})})},processResponse(t,e){const r=t.response;if(t.output)return t.output.call(e,r);if(\"raw\"===t.method)return r;const{returning:i}=t;if(\"SELECT\"===r.command)return\"first\"===t.method?r.rows[0]:\"pluck\"===t.method?n(r.rows,t.pluck):r.rows;if(i){const t=[];for(let e=0,n=r.rows.length;ethis._wrappedCancelQueryCall(e,t).finally(()=>{this.releaseConnection(e)}))},_wrappedCancelQueryCall(t,e){return this.query(t,{method:\"raw\",sql:\"SELECT pg_cancel_backend(?);\",bindings:[e.processID],options:{}})}}),t.exports=m}).call(this,r(5))},function(t,e,r){const n=r(0),i=r(19),{reduce:o,identity:s}=r(1);function a(t,e){i.call(this,t,e)}n(a,i),Object.assign(a.prototype,{truncate(){return`truncate ${this.tableName} restart identity`},_defaultInsertValue:\"default\",insert(){const t=i.prototype.insert.call(this);if(\"\"===t)return t;const{returning:e}=this.single;return{sql:t+this._returning(e),returning:e}},update(){const t=this.with(),e=this._prepUpdate(this.single.update),r=this.where(),{returning:n}=this.single;return{sql:t+`update ${this.single.only?\"only \":\"\"}${this.tableName} `+`set ${e.join(\", \")}`+(r?` ${r}`:\"\")+this._returning(n),returning:n}},del(){const t=i.prototype.del.apply(this,arguments),{returning:e}=this.single;return{sql:t+this._returning(e),returning:e}},aggregate(t){return this._aggregate(t,{distinctParentheses:!0})},_returning(t){return t?` returning ${this.formatter.columnize(t)}`:\"\"},_tableNames(t){const e=this.single.schema,r=[];for(let n=0;n\"skip locked\",noWait:()=>\"nowait\",columnInfo(){const t=this.single.columnInfo;let e=this.single.schema;const r=this.client.customWrapIdentifier(this.single.table,s);e&&(e=this.client.customWrapIdentifier(e,s));let n=\"select * from information_schema.columns where table_name = ? and table_catalog = ?\";const i=[r,this.client.database()];return e?(n+=\" and table_schema = ?\",i.push(e)):n+=\" and table_schema = current_schema()\",{sql:n,bindings:i,output(e){const r=o(e.rows,function(t,e){return t[e.column_name]={type:e.data_type,maxLength:e.character_maximum_length,nullable:\"YES\"===e.is_nullable,defaultValue:e.column_default},t},{});return t&&r[t]||r}}},distinctOn(t){return\"distinct on (\"+this.formatter.columnize(t)+\") \"}}),t.exports=a},function(t,e,r){const n=r(0),i=r(24),{isObject:o}=r(1);function s(){i.apply(this,arguments),this.modifiers=[\"nullable\",\"defaultTo\",\"comment\"]}function a(t,e){return!t.version||parseFloat(t.version)>=9.2?e?\"jsonb\":\"json\":\"text\"}n(s,i),Object.assign(s.prototype,{bigincrements:\"bigserial primary key\",bigint:\"bigint\",binary:\"bytea\",bit:t=>!1!==t.length?`bit(${t.length})`:\"bit\",bool:\"boolean\",enu(t,e){const r=(e=e||{}).useNative&&e.existingType?void 0:t.join(\"', '\");if(e.useNative){let t=\"\";const n=e.schemaName||this.tableCompiler.schemaNameRaw;return n&&(t+=`\"${n}\".`),t+=`\"${e.enumName}\"`,e.existingType||this.tableCompiler.unshiftQuery(`create type ${t} as enum ('${r}')`),t}return`text check (${this.formatter.wrap(this.args[0])} in ('${r}'))`},double:\"double precision\",decimal(t,e){return null===t?\"decimal\":`decimal(${this._num(t,8)}, ${this._num(e,2)})`},floating:\"real\",increments:\"serial primary key\",json(t){return t&&this.client.logger.deprecate(\"json(true)\",\"jsonb()\"),a(this.client,t)},jsonb(){return a(this.client,!0)},smallint:\"smallint\",tinyint:\"smallint\",datetime(t=!1,e){let r;return o(t)?({useTz:r,precision:e}=t):r=!t,`${r?\"timestamptz\":\"timestamp\"}${e?\"(\"+e+\")\":\"\"}`},timestamp(t=!1,e){let r;return o(t)?({useTz:r,precision:e}=t):r=!t,`${r?\"timestamptz\":\"timestamp\"}${e?\"(\"+e+\")\":\"\"}`},uuid:\"uuid\",comment(t){const e=this.args[0]||this.defaults(\"columnName\");this.pushAdditional(function(){this.pushQuery(`comment on column ${this.tableCompiler.tableName()}.`+this.formatter.wrap(e)+\" is \"+(t?`'${t}'`:\"NULL\"))},t)}}),t.exports=s},function(t,e,r){const n=r(0),i=r(23),{has:o}=r(1);function s(){i.apply(this,arguments)}n(s,i),s.prototype.renameColumn=function(t,e){return this.pushQuery({sql:`alter table ${this.tableName()} rename ${this.formatter.wrap(t)} to ${this.formatter.wrap(e)}`})},s.prototype.compileAdd=function(t){const e=this.formatter.wrap(t),r=this.prefixArray(\"add column\",this.getColumns(t));return this.pushQuery({sql:`alter table ${e} ${r.join(\", \")}`})},s.prototype.createQuery=function(t,e){let r=(e?\"create table if not exists \":\"create table \")+this.tableName()+\" (\"+t.sql.join(\", \")+\")\";this.single.inherits&&(r+=` inherits (${this.formatter.wrap(this.single.inherits)})`),this.pushQuery({sql:r,bindings:t.bindings}),o(this.single,\"comment\")&&this.comment(this.single.comment)},s.prototype.addColumns=function(t,e,r){if(e===this.alterColumnsPrefix)for(const t of r){const e=this.tableName(),r=t.getColumnType(),n=this.client.wrapIdentifier(t.getColumnName(),t.columnBuilder.queryContext());this.pushQuery({sql:`alter table ${e} alter column ${n} drop default`,bindings:[]}),this.pushQuery({sql:`alter table ${e} alter column ${n} drop not null`,bindings:[]}),this.pushQuery({sql:`alter table ${e} alter column ${n} type ${r} using (${n}::${r})`,bindings:[]});const i=t.modified.defaultTo;if(i){const r=t.defaultTo.apply(t,i);this.pushQuery({sql:`alter table ${e} alter column ${n} set ${r}`,bindings:[]})}const o=t.modified.nullable;o&&!1===o[0]&&this.pushQuery({sql:`alter table ${e} alter column ${n} set not null`,bindings:[]})}else i.prototype.addColumns.call(this,t,e)},s.prototype.comment=function(t){this.pushQuery(`comment on table ${this.tableName()} is '${this.single.comment}'`)},s.prototype.primary=function(t,e){e=e?this.formatter.wrap(e):this.formatter.wrap(`${this.tableNameRaw}_pkey`),this.pushQuery(`alter table ${this.tableName()} add constraint ${e} primary key (${this.formatter.columnize(t)})`)},s.prototype.unique=function(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} add constraint ${e}`+\" unique (\"+this.formatter.columnize(t)+\")\")},s.prototype.index=function(t,e,r){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`create index ${e} on ${this.tableName()}${r&&` using ${r}`||\"\"}`+\" (\"+this.formatter.columnize(t)+\")\")},s.prototype.dropPrimary=function(t){t=t?this.formatter.wrap(t):this.formatter.wrap(this.tableNameRaw+\"_pkey\"),this.pushQuery(`alter table ${this.tableName()} drop constraint ${t}`)},s.prototype.dropIndex=function(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),e=this.schemaNameRaw?`${this.formatter.wrap(this.schemaNameRaw)}.${e}`:e,this.pushQuery(`drop index ${e}`)},s.prototype.dropUnique=function(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop constraint ${e}`)},s.prototype.dropForeign=function(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"foreign\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop constraint ${e}`)},t.exports=s},function(t,e,r){const n=r(0),i=r(22);function o(){i.apply(this,arguments)}n(o,i),o.prototype.hasTable=function(t){let e=\"select * from information_schema.tables where table_name = ?\";const r=[t];this.schema?(e+=\" and table_schema = ?\",r.push(this.schema)):e+=\" and table_schema = current_schema()\",this.pushQuery({sql:e,bindings:r,output:t=>t.rows.length>0})},o.prototype.hasColumn=function(t,e){let r=\"select * from information_schema.columns where table_name = ? and column_name = ?\";const n=[t,e];this.schema?(r+=\" and table_schema = ?\",n.push(this.schema)):r+=\" and table_schema = current_schema()\",this.pushQuery({sql:r,bindings:n,output:t=>t.rows.length>0})},o.prototype.qualifiedTableName=function(t){const e=this.schema?`${this.schema}.${t}`:t;return this.formatter.wrap(e)},o.prototype.renameTable=function(t,e){this.pushQuery(`alter table ${this.qualifiedTableName(t)} rename to ${this.formatter.wrap(e)}`)},o.prototype.createSchema=function(t){this.pushQuery(`create schema ${this.formatter.wrap(t)}`)},o.prototype.createSchemaIfNotExists=function(t){this.pushQuery(`create schema if not exists ${this.formatter.wrap(t)}`)},o.prototype.dropSchema=function(t){this.pushQuery(`drop schema ${this.formatter.wrap(t)}`)},o.prototype.dropSchemaIfExists=function(t){this.pushQuery(`drop schema if exists ${this.formatter.wrap(t)}`)},o.prototype.dropExtension=function(t){this.pushQuery(`drop extension ${this.formatter.wrap(t)}`)},o.prototype.dropExtensionIfExists=function(t){this.pushQuery(`drop extension if exists ${this.formatter.wrap(t)}`)},o.prototype.createExtension=function(t){this.pushQuery(`create extension ${this.formatter.wrap(t)}`)},o.prototype.createExtensionIfNotExists=function(t){this.pushQuery(`create extension if not exists ${this.formatter.wrap(t)}`)},t.exports=o},function(t,e){t.exports=pg},function(t,e,r){r(121)},function(t,e,r){t.exports=r(122)},function(t,e,r){const n=r(123);t.exports=n},function(t,e,r){const n=r(14),i=r(21),o=r(36),s=r(74),a=r(72),c=r(156),u=r(164),{SUPPORTED_CLIENTS:h}=r(42),{resolveClientNameWithAliases:f}=r(11);function l(t){if(\"string\"==typeof t){return new l(Object.assign(c(t),arguments[2]))}let e;if(0===arguments.length||!t.client&&!t.dialect)e=i;else if(\"function\"==typeof t.client&&t.client.prototype instanceof i)e=t.client;else{const n=t.client||t.dialect;if(!h.includes(n))throw new Error(`knex: Unknown configuration option 'client' value ${n}. Note that it is case-sensitive, check documentation for supported values.`);const i=f(n);e=r(165)(`./${i}/index.js`)}\"string\"==typeof t.connection&&(t=Object.assign({},t,{connection:c(t.connection).connection}));const n=a(new e(t));return t.userParams&&(n.userParams=t.userParams),n}l.Client=i,l.QueryBuilder={extend:function(t,e){o.extend(t,e),s.push(t)}},l.raw=((t,e)=>(console.warn(\"global Knex.raw is deprecated, use knex.raw (chain off an initialized knex object)\"),new n(u).set(t,e))),t.exports=l},function(t,e,r){var n;function i(t){function r(){if(r.enabled){var t=r,i=+new Date,o=i-(n||i);t.diff=o,t.prev=n,t.curr=i,n=i;for(var s=new Array(arguments.length),a=0;a0)return function(t){if((t=String(t)).length>100)return;var e=/^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(!e)return;var a=parseFloat(e[1]);switch((e[2]||\"ms\").toLowerCase()){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return a*s;case\"days\":case\"day\":case\"d\":return a*o;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return a*i;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return a*n;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return a*r;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return a;default:return}}(t);if(\"number\"===u&&!1===isNaN(t))return e.long?a(c=t,o,\"day\")||a(c,i,\"hour\")||a(c,n,\"minute\")||a(c,r,\"second\")||c+\" ms\":function(t){if(t>=o)return Math.round(t/o)+\"d\";if(t>=i)return Math.round(t/i)+\"h\";if(t>=n)return Math.round(t/n)+\"m\";if(t>=r)return Math.round(t/r)+\"s\";return t+\"ms\"}(t);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(t))}},function(t,e,r){var n,i,o=r(62),s=r(63),a=0,c=0;t.exports=function(t,e,r){var u=e&&r||0,h=e||[],f=(t=t||{}).node||n,l=void 0!==t.clockseq?t.clockseq:i;if(null==f||null==l){var d=o();null==f&&(f=n=[1|d[0],d[1],d[2],d[3],d[4],d[5]]),null==l&&(l=i=16383&(d[6]<<8|d[7]))}var p=void 0!==t.msecs?t.msecs:(new Date).getTime(),m=void 0!==t.nsecs?t.nsecs:c+1,b=p-a+(m-c)/1e4;if(b<0&&void 0===t.clockseq&&(l=l+1&16383),(b<0||p>a)&&void 0===t.nsecs&&(m=0),m>=1e4)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");a=p,c=m,i=l;var g=(1e4*(268435455&(p+=122192928e5))+m)%4294967296;h[u++]=g>>>24&255,h[u++]=g>>>16&255,h[u++]=g>>>8&255,h[u++]=255&g;var y=p/4294967296*1e4&268435455;h[u++]=y>>>8&255,h[u++]=255&y,h[u++]=y>>>24&15|16,h[u++]=y>>>16&255,h[u++]=l>>>8|128,h[u++]=255&l;for(var _=0;_<6;++_)h[u+_]=f[_];return e||s(h)}},function(t,e,r){var n=r(62),i=r(63);t.exports=function(t,e,r){var o=e&&r||0;\"string\"==typeof t&&(e=\"binary\"===t?new Array(16):null,t=null);var s=(t=t||{}).random||(t.rng||n)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;++a)e[o+a]=s[a];return e||i(s)}},function(t,e,r){(function(t,e){!function(t,r){\"use strict\";if(!t.setImmediate){var n,i,o,s,a,c=1,u={},h=!1,f=t.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(t);l=l&&l.setTimeout?l:t,\"[object process]\"==={}.toString.call(t.process)?n=function(t){e.nextTick(function(){p(t)})}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage(\"\",\"*\"),t.onmessage=r,e}}()?t.MessageChannel?((o=new MessageChannel).port1.onmessage=function(t){p(t.data)},n=function(t){o.port2.postMessage(t)}):f&&\"onreadystatechange\"in f.createElement(\"script\")?(i=f.documentElement,n=function(t){var e=f.createElement(\"script\");e.onreadystatechange=function(){p(t),e.onreadystatechange=null,i.removeChild(e),e=null},i.appendChild(e)}):n=function(t){setTimeout(p,0,t)}:(s=\"setImmediate$\"+Math.random()+\"$\",a=function(e){e.source===t&&\"string\"==typeof e.data&&0===e.data.indexOf(s)&&p(+e.data.slice(s.length))},t.addEventListener?t.addEventListener(\"message\",a,!1):t.attachEvent(\"onmessage\",a),n=function(e){t.postMessage(s+e,\"*\")}),l.setImmediate=function(t){\"function\"!=typeof t&&(t=new Function(\"\"+t));for(var e=new Array(arguments.length-1),r=0;rthis.client.processResponse(t,i)).then(e=>{const r=this.builder.queryContext(),n=this.client.postProcessResponse(e,r);return this.builder.emit(\"query-response\",n,Object.assign({__knexUid:this.connection.__knexUid},t),this.builder),this.client.emit(\"query-response\",n,Object.assign({__knexUid:this.connection.__knexUid},t),this.builder),n}).catch(n.TimeoutError,e=>{const{timeout:r,sql:i,bindings:o}=t;let s;return t.cancelOnTimeout?s=this.client.cancelQuery(this.connection):(this.connection.__knex__disposed=e,s=n.resolve()),s.catch(t=>{throw this.connection.__knex__disposed=e,Object.assign(t,{message:`After query timeout of ${r}ms exceeded, cancelling of query failed.`,sql:i,bindings:o,timeout:r})}).then(()=>{throw Object.assign(e,{message:`Defined query timeout of ${r}ms exceeded when running query.`,sql:i,bindings:o,timeout:r})})}).catch(e=>{throw this.builder.emit(\"query-error\",e,Object.assign({__knexUid:this.connection.__knexUid},t)),e})},async queryArray(t){if(1===t.length)return this.query(t[0]);const e=[];for(const r of t)e.push(await this.query(r));return e},async ensureConnection(t){return this.builder._connection?t(this.builder._connection):this.connection?t(this.connection):this.client.acquireConnection().catch(n.TimeoutError,t=>{throw this.builder&&(t.sql=this.builder.sql,t.bindings=this.builder.bindings),t}).then(async e=>{try{return await t(e)}finally{await this.client.releaseConnection(this.connection)}})}}),t.exports=o},function(t,e,r){\"use strict\";e.byteLength=function(t){var e=u(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){for(var e,r=u(t),n=r[0],s=r[1],a=new o(function(t,e,r){return 3*(e+r)/4-r}(0,n,s)),c=0,h=s>0?n-4:n,f=0;f>16&255,a[c++]=e>>8&255,a[c++]=255&e;2===s&&(e=i[t.charCodeAt(f)]<<2|i[t.charCodeAt(f+1)]>>4,a[c++]=255&e);1===s&&(e=i[t.charCodeAt(f)]<<10|i[t.charCodeAt(f+1)]<<4|i[t.charCodeAt(f+2)]>>2,a[c++]=e>>8&255,a[c++]=255&e);return a},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));1===i?(e=t[r-1],o.push(n[e>>2]+n[e<<4&63]+\"==\")):2===i&&(e=(t[r-2]<<8)+t[r-1],o.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+\"=\"));return o.join(\"\")};for(var n=[],i=[],o=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,s=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",a=0,c=s.length;a0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=t.indexOf(\"=\");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function h(t,e,r){for(var i,o,s=[],a=e;a>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return s.join(\"\")}i[\"-\".charCodeAt(0)]=62,i[\"_\".charCodeAt(0)]=63},function(t,e){e.read=function(t,e,r,n,i){var o,s,a=8*i-n-1,c=(1<>1,h=-7,f=r?i-1:0,l=r?-1:1,d=t[e+f];for(f+=l,o=d&(1<<-h)-1,d>>=-h,h+=a;h>0;o=256*o+t[e+f],f+=l,h-=8);for(s=o&(1<<-h)-1,o>>=-h,h+=n;h>0;s=256*s+t[e+f],f+=l,h-=8);if(0===o)o=1-u;else{if(o===c)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,n),o-=u}return(d?-1:1)*s*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var s,a,c,u=8*o-i-1,h=(1<>1,l=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=h):(s=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-s))<1&&(s--,c*=2),(e+=s+f>=1?l/c:l*Math.pow(2,1-f))*c>=2&&(s++,c/=2),s+f>=h?(a=0,s=h):s+f>=1?(a=(e*c-1)*Math.pow(2,i),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;t[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;t[r+d]=255&s,d+=p,s/=256,u-=8);t[r+d-p]|=128*m}},function(t,e){},function(t,e,r){\"use strict\";var n=r(2).Buffer,i=r(135);t.exports=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.head=null,this.tail=null,this.length=0}return t.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},t.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},t.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},t.prototype.clear=function(){this.head=this.tail=null,this.length=0},t.prototype.join=function(t){if(0===this.length)return\"\";for(var e=this.head,r=\"\"+e.data;e=e.next;)r+=t+e.data;return r},t.prototype.concat=function(t){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var e,r,i,o=n.allocUnsafe(t>>>0),s=this.head,a=0;s;)e=s.data,r=o,i=a,e.copy(r,i),a+=s.data.length,s=s.next;return o},t}(),i&&i.inspect&&i.inspect.custom&&(t.exports.prototype[i.inspect.custom]=function(){var t=i.inspect({length:this.length});return this.constructor.name+\" \"+t})},function(t,e){},function(t,e,r){(function(e){function r(t){try{if(!e.localStorage)return!1}catch(t){return!1}var r=e.localStorage[t];return null!=r&&\"true\"===String(r).toLowerCase()}t.exports=function(t,e){if(r(\"noDeprecation\"))return t;var n=!1;return function(){if(!n){if(r(\"throwDeprecation\"))throw new Error(e);r(\"traceDeprecation\")?console.trace(e):console.warn(e),n=!0}return t.apply(this,arguments)}}}).call(this,r(8))},function(t,e,r){\"use strict\";t.exports=o;var n=r(69),i=Object.create(r(28));function o(t){if(!(this instanceof o))return new o(t);n.call(this,t)}i.inherits=r(0),i.inherits(o,n),o.prototype._transform=function(t,e,r){r(null,t)}},function(t,e,r){t.exports=r(46)},function(t,e,r){t.exports=r(17)},function(t,e,r){t.exports=r(45).Transform},function(t,e,r){t.exports=r(45).PassThrough},function(t,e){t.exports=function(t){return t&&\"object\"==typeof t&&\"function\"==typeof t.copy&&\"function\"==typeof t.fill&&\"function\"==typeof t.readUInt8}},function(t,e){t.exports={lockMode:{forShare:\"forShare\",forUpdate:\"forUpdate\"},waitMode:{skipLocked:\"skipLocked\",noWait:\"noWait\"}}},function(t,e){function r(t){this.client=t}r.prototype.now=function(t){return\"number\"==typeof t?this.client.raw(`CURRENT_TIMESTAMP(${t})`):this.client.raw(\"CURRENT_TIMESTAMP\")},t.exports=r},function(t,e,r){const{isNumber:n,chunk:i,flatten:o}=r(1),s=r(146);t.exports=function(t,e,r,a=1e3){let c=void 0,u=null;return Object.assign(Promise.resolve().then(async()=>{if(!n(a)||a<1)throw new TypeError(`Invalid chunkSize: ${a}`);if(!Array.isArray(r))throw new TypeError(`Invalid batch: Expected array, got ${typeof r}`);const h=i(r,a);return await s(1),(e=>u?e(u):t.transaction(e))(async t=>{const r=[];for(const n of h)r.push(await t(e).insert(n,c));return o(r)})}),{returning(t){return c=t,this},transacting(t){return u=t,this}})}},function(t,e,r){const{promisify:n}=r(15);t.exports=n(setTimeout)},function(t,e,r){const n=r(0),{EventEmitter:i}=r(12),{each:o,toArray:s}=r(1),{addQueryContext:a}=r(11),c=r(43);function u(t){this.client=t,this._sequence=[],t.config&&(this._debug=t.config.debug,c(this,4))}n(u,i),o([\"createTable\",\"createTableIfNotExists\",\"createSchema\",\"createSchemaIfNotExists\",\"dropSchema\",\"dropSchemaIfExists\",\"createExtension\",\"createExtensionIfNotExists\",\"dropExtension\",\"dropExtensionIfExists\",\"table\",\"alterTable\",\"hasTable\",\"hasColumn\",\"dropTable\",\"renameTable\",\"dropTableIfExists\",\"raw\"],function(t){u.prototype[t]=function(){return\"createTableIfNotExists\"===t&&this.client.logger.warn([\"Use async .hasTable to check if table exists and then use plain .createTable. Since \",'.createTableIfNotExists actually just generates plain \"CREATE TABLE IF NOT EXIST...\" ',\"query it will not work correctly if there are any alter table queries generated for \",\"columns afterwards. To not break old migrations this function is left untouched for now\",\", but it should not be used when writing new code and it is removed from documentation.\"].join(\"\")),\"table\"===t&&(t=\"alterTable\"),this._sequence.push({method:t,args:s(arguments)}),this}}),r(44)(u),a(u),u.prototype.withSchema=function(t){return this._schema=t,this},u.prototype.toString=function(){return this.toQuery()},u.prototype.toSQL=function(){return this.client.schemaCompiler(this).toSQL()},t.exports=u},function(t,e,r){const{extend:n,each:i,toArray:o,isString:s,isFunction:a}=r(1),c=r(11);function u(t,e,r,n){if(this.client=t,this._fn=n,this._method=e,this._schemaName=void 0,this._tableName=r,this._statements=[],this._single={},!a(this._fn))throw new TypeError(\"A callback function must be supplied to calls against `.createTable` and `.table`\")}u.prototype.setSchema=function(t){this._schemaName=t},u.prototype.toSQL=function(){return\"alter\"===this._method&&n(this,h),this._fn.call(this,this),this.client.tableCompiler(this).toSQL()},i([\"index\",\"primary\",\"unique\",\"dropPrimary\",\"dropUnique\",\"dropIndex\",\"dropForeign\"],function(t){u.prototype[t]=function(){return this._statements.push({grouping:\"alterTable\",method:t,args:o(arguments)}),this}});i({mysql:[\"engine\",\"charset\",\"collate\"],postgresql:[\"inherits\"]},function(t,e){i(t,function(t){u.prototype[t]=function(r){if(this.client.dialect!==e)throw new Error(`Knex only supports ${t} statement with ${e}.`);if(\"alter\"===this._method)throw new Error(`Knex does not support altering the ${t} outside of create `+\"table, please use knex.raw statement.\");this._single[t]=r}})}),c.addQueryContext(u);i([\"tinyint\",\"smallint\",\"mediumint\",\"int\",\"bigint\",\"decimal\",\"float\",\"double\",\"real\",\"bit\",\"boolean\",\"serial\",\"date\",\"datetime\",\"timestamp\",\"time\",\"year\",\"char\",\"varchar\",\"tinytext\",\"tinyText\",\"text\",\"mediumtext\",\"mediumText\",\"longtext\",\"longText\",\"binary\",\"varbinary\",\"tinyblob\",\"tinyBlob\",\"mediumblob\",\"mediumBlob\",\"blob\",\"longblob\",\"longBlob\",\"enum\",\"set\",\"bool\",\"dateTime\",\"increments\",\"bigincrements\",\"bigIncrements\",\"integer\",\"biginteger\",\"bigInteger\",\"string\",\"json\",\"jsonb\",\"uuid\",\"enu\",\"specificType\"],function(t){u.prototype[t]=function(){const e=o(arguments),r=this.client.columnBuilder(this,t,e);return this._statements.push({grouping:\"columns\",builder:r}),r}}),u.prototype.timestamps=function(){const t=!0===arguments[0]?\"timestamp\":\"datetime\",e=this[t](\"created_at\"),r=this[t](\"updated_at\");if(!0===arguments[1]){const t=this.client.raw(\"CURRENT_TIMESTAMP\");e.notNullable().defaultTo(t),r.notNullable().defaultTo(t)}},u.prototype.comment=function(t){if(\"string\"!=typeof t)throw new TypeError(\"Table comment must be string\");this._single.comment=t},u.prototype.foreign=function(t,e){const r={column:t,keyName:e};this._statements.push({grouping:\"alterTable\",method:\"foreign\",args:[r]});let i={references(t){let e;return s(t)&&(e=t.split(\".\")),e&&1!==e.length?(r.inTable=e[0],r.references=e[1],i):(r.references=e?e[0]:t,{on(t){if(\"string\"!=typeof t)throw new TypeError(`Expected tableName to be a string, got: ${typeof t}`);return r.inTable=t,i},inTable(){return this.on.apply(this,arguments)}})},withKeyName:t=>(r.keyName=t,i),onUpdate:t=>(r.onUpdate=t,i),onDelete:t=>(r.onDelete=t,i),_columnBuilder:t=>(n(t,i),i=t,t)};return i};const h={renameColumn(t,e){return this._statements.push({grouping:\"alterTable\",method:\"renameColumn\",args:[t,e]}),this},dropTimestamps(){return this.dropColumns([\"created_at\",\"updated_at\"])}};h.dropColumn=h.dropColumns=function(){return this._statements.push({grouping:\"alterTable\",method:\"dropColumn\",args:o(arguments)}),this},t.exports=u},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});const n=r(150);e.Pool=n.Pool;const i=r(75);e.TimeoutError=i.TimeoutError,t.exports={Pool:n.Pool,TimeoutError:i.TimeoutError}},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});const n=r(151),i=r(153),o=r(50),s=r(12);function a(t,e){var r=t.indexOf(e);return-1!==r&&(t.splice(r,1),!0)}e.Pool=class{constructor(t){if(this.destroyed=!1,this.emitter=new s.EventEmitter,!(t=t||{}).create)throw new Error(\"Tarn: opt.create function most be provided\");if(!t.destroy)throw new Error(\"Tarn: opt.destroy function most be provided\");if(\"number\"!=typeof t.min||t.min<0||t.min!==Math.round(t.min))throw new Error(\"Tarn: opt.min must be an integer >= 0\");if(\"number\"!=typeof t.max||t.max<=0||t.max!==Math.round(t.max))throw new Error(\"Tarn: opt.max must be an integer > 0\");if(t.min>t.max)throw new Error(\"Tarn: opt.max is smaller than opt.min\");if(!o.checkOptionalTime(t.acquireTimeoutMillis))throw new Error(\"Tarn: invalid opt.acquireTimeoutMillis \"+JSON.stringify(t.acquireTimeoutMillis));if(!o.checkOptionalTime(t.createTimeoutMillis))throw new Error(\"Tarn: invalid opt.createTimeoutMillis \"+JSON.stringify(t.createTimeoutMillis));if(!o.checkOptionalTime(t.destroyTimeoutMillis))throw new Error(\"Tarn: invalid opt.destroyTimeoutMillis \"+JSON.stringify(t.destroyTimeoutMillis));if(!o.checkOptionalTime(t.idleTimeoutMillis))throw new Error(\"Tarn: invalid opt.idleTimeoutMillis \"+JSON.stringify(t.idleTimeoutMillis));if(!o.checkOptionalTime(t.reapIntervalMillis))throw new Error(\"Tarn: invalid opt.reapIntervalMillis \"+JSON.stringify(t.reapIntervalMillis));if(!o.checkOptionalTime(t.createRetryIntervalMillis))throw new Error(\"Tarn: invalid opt.createRetryIntervalMillis \"+JSON.stringify(t.createRetryIntervalMillis));const e={create:!0,validate:!0,destroy:!0,log:!0,min:!0,max:!0,acquireTimeoutMillis:!0,createTimeoutMillis:!0,destroyTimeoutMillis:!0,idleTimeoutMillis:!0,reapIntervalMillis:!0,createRetryIntervalMillis:!0,propagateCreateError:!0};for(let r of Object.keys(t))if(!e[r])throw new Error(`Tarn: unsupported option opt.${r}`);this.creator=t.create,this.destroyer=t.destroy,this.validate=\"function\"==typeof t.validate?t.validate:()=>!0,this.log=t.log||(()=>{}),this.acquireTimeoutMillis=t.acquireTimeoutMillis||3e4,this.createTimeoutMillis=t.createTimeoutMillis||3e4,this.destroyTimeoutMillis=t.destroyTimeoutMillis||5e3,this.idleTimeoutMillis=t.idleTimeoutMillis||3e4,this.reapIntervalMillis=t.reapIntervalMillis||1e3,this.createRetryIntervalMillis=t.createRetryIntervalMillis||200,this.propagateCreateError=!!t.propagateCreateError,this.min=t.min,this.max=t.max,this.used=[],this.free=[],this.pendingCreates=[],this.pendingAcquires=[],this.pendingDestroys=[],this.destroyed=!1,this.interval=null,this.eventId=1}numUsed(){return this.used.length}numFree(){return this.free.length}numPendingAcquires(){return this.pendingAcquires.length}numPendingCreates(){return this.pendingCreates.length}acquire(){const t=this.eventId++;this._executeEventHandlers(\"acquireRequest\",t);const e=new n.PendingOperation(this.acquireTimeoutMillis);return this.pendingAcquires.push(e),e.promise=e.promise.then(e=>(this._executeEventHandlers(\"acquireSuccess\",t,e),e)).catch(r=>(this._executeEventHandlers(\"acquireFail\",t,r),a(this.pendingAcquires,e),Promise.reject(r))),this._tryAcquireOrCreate(),e}release(t){this._executeEventHandlers(\"release\",t);for(let e=0,r=this.used.length;et+e)}check(){const t=o.now(),e=[],r=this.min-this.used.length,n=this.free.length-r;let i=0;this.free.forEach(r=>{o.duration(t,r.timestamp)>=this.idleTimeoutMillis&&io.reflect(t.promise))).then(()=>Promise.all(this.used.map(t=>o.reflect(t.promise)))).then(()=>Promise.all(this.pendingAcquires.map(t=>(t.abort(),o.reflect(t.promise))))).then(()=>Promise.all(this.free.map(t=>o.reflect(this._destroy(t.resource))))).then(()=>Promise.all(this.pendingDestroys.map(t=>t.promise))).then(()=>{this.free=[],this.pendingAcquires=[]})).then(e=>(this._executeEventHandlers(\"poolDestroySuccess\",t),this.emitter.removeAllListeners(),e))}on(t,e){this.emitter.on(t,e)}removeListener(t,e){this.emitter.removeListener(t,e)}removeAllListeners(t){this.emitter.removeAllListeners(t)}_tryAcquireOrCreate(){this.destroyed||(this._hasFreeResources()?this._doAcquire():this._shouldCreateMoreResources()&&this._doCreate())}_hasFreeResources(){return this.free.length>0}_doAcquire(){let t=!1;for(;this._canAcquire();){const e=this.pendingAcquires[0],r=this.free[this.free.length-1];this._validateResource(r.resource)?(this.pendingAcquires.shift(),this.free.pop(),this.used.push(r.resolve()),this._startReaping(),e.resolve(r.resource)):(this.free.pop(),this._destroy(r.resource),t=!0)}t&&this._tryAcquireOrCreate()}_canAcquire(){return this.free.length>0&&this.pendingAcquires.length>0}_validateResource(t){try{return!!this.validate(t)}catch(t){return this.log(\"Tarn: resource validator threw an exception \"+t.stack,\"warn\"),!1}}_shouldCreateMoreResources(){return this.used.length+this.pendingCreates.length(this._tryAcquireOrCreate(),null)).catch(e=>{this.propagateCreateError&&0!==this.pendingAcquires.length&&this.pendingAcquires[0].reject(e),t.forEach(t=>{t.possibleTimeoutCause=e}),o.delay(this.createRetryIntervalMillis).then(()=>this._tryAcquireOrCreate())})}_create(){const t=this.eventId++;this._executeEventHandlers(\"createRequest\",t);const e=new n.PendingOperation(this.createTimeoutMillis);var r;return this.pendingCreates.push(e),(r=this.creator,new Promise((t,e)=>{const n=(r,n)=>{r?e(r):t(n)};o.tryPromise(()=>r(n)).then(e=>{e&&t(e)}).catch(t=>{e(t)})})).then(r=>(a(this.pendingCreates,e),this.free.push(new i.Resource(r)),e.resolve(r),this._executeEventHandlers(\"createSuccess\",t,r),null)).catch(r=>(a(this.pendingCreates,e),e.reject(r),this._executeEventHandlers(\"createFail\",t,r),null)),e}_destroy(t){const e=this.eventId++;this._executeEventHandlers(\"destroyRequest\",e,t);const r=new n.PendingOperation(this.destroyTimeoutMillis);return Promise.resolve().then(()=>this.destroyer(t)).then(()=>{r.resolve(t)}).catch(t=>{r.reject(t)}),this.pendingDestroys.push(r),r.promise.then(r=>(this._executeEventHandlers(\"destroySuccess\",e,t),r)).catch(r=>this._logDestroyerError(e,t,r)).then(t=>{const e=this.pendingDestroys.findIndex(t=>t===r);return this.pendingDestroys.splice(e,1),t})}_logDestroyerError(t,e,r){this._executeEventHandlers(\"destroyFail\",t,e,r),this.log(\"Tarn: resource destroyer threw an exception \"+r.stack,\"warn\")}_startReaping(){this.interval||(this._executeEventHandlers(\"startReaping\"),this.interval=setInterval(()=>this.check(),this.reapIntervalMillis))}_stopReaping(){null!==this.interval&&(this._executeEventHandlers(\"stopReaping\"),clearInterval(this.interval)),this.interval=null}_executeEventHandlers(t,...e){this.emitter.listeners(t).forEach(r=>{try{r(...e)}catch(e){this.log(`Tarn: event handler \"${t}\" threw an exception ${e.stack}`,\"warn\")}})}}},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});const n=r(75),i=r(50);e.PendingOperation=class{constructor(t){var e,r;this.timeoutMillis=t,this.deferred=i.defer(),this.possibleTimeoutCause=null,this.promise=(e=this.deferred.promise,r=t,new Promise((t,i)=>{const o=setTimeout(()=>i(new n.TimeoutError),r);e.then(e=>{clearTimeout(o),t(e)}).catch(t=>{clearTimeout(o),i(t)})})).catch(t=>(t instanceof n.TimeoutError&&(t=this.possibleTimeoutCause?new n.TimeoutError(this.possibleTimeoutCause.message):new n.TimeoutError(\"operation timed out for an unknown reason\")),Promise.reject(t)))}abort(){this.reject(new Error(\"aborted\"))}reject(t){this.deferred.reject(t)}resolve(t){this.deferred.resolve(t)}}},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});e.PromiseInspection=class{constructor(t){this._value=t.value,this._error=t.error}value(){return this._value}reason(){return this._error}isRejected(){return!!this._error}isFulfilled(){return!!this._value}}},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});const n=r(50);class i{constructor(t){this.resource=t,this.resource=t,this.timestamp=n.now(),this.deferred=n.defer()}get promise(){return this.deferred.promise}resolve(){return this.deferred.resolve(void 0),new i(this.resource)}}e.Resource=i},function(t,e,r){(function(e){const n=r(155),{inspect:i}=r(15),{isFunction:o,isNil:s,isString:a}=r(1);t.exports=class{constructor(t){const{log:{debug:r,warn:n,error:i,deprecate:o,inspectionDepth:a,enableColors:c}={}}=t;var u;this._inspectionDepth=a||5,this._enableColors=s(u=c)?!(!e||!e.stdout)&&e.stdout.isTTY:u,this._debug=r,this._warn=n,this._error=i,this._deprecate=o}_log(t,e,r){if(!s(e)&&!o(e))throw new TypeError(\"Extensions to knex logger must be functions!\");o(e)?e(t):(a(t)||(t=i(t,{depth:this._inspectionDepth,colors:this._enableColors})),console.log(r?r(t):t))}debug(t){this._log(t,this._debug)}warn(t){this._log(t,this._warn,n.yellow)}error(t){this._log(t,this._error,n.red)}deprecate(t,e){const r=`${t} is deprecated, please use ${e}`;this._log(r,this._deprecate,n.yellow)}}}).call(this,r(5))},function(t,e,r){\"use strict\";(function(e){let r=!(\"NO_COLOR\"in e.env)&&\"0\"!==e.env.FORCE_COLOR&&(\"win32\"===e.platform||null!=e.stdout&&e.stdout.isTTY&&e.env.TERM&&\"dumb\"!==e.env.TERM);const n=(t,e,n,i)=>o=>r?t+(~(o+=\"\").indexOf(e,4)?o.replace(n,i):o)+e:o,i=(t,e)=>n(`\u001b[${t}m`,`\u001b[${e}m`,new RegExp(`\\\\x1b\\\\[${e}m`,\"g\"),`\u001b[${t}m`);t.exports={options:Object.defineProperty({},\"enabled\",{get:()=>r,set:t=>r=t}),reset:i(0,0),bold:n(\"\u001b[1m\",\"\u001b[22m\",/\\x1b\\[22m/g,\"\u001b[22m\u001b[1m\"),dim:n(\"\u001b[2m\",\"\u001b[22m\",/\\x1b\\[22m/g,\"\u001b[22m\u001b[2m\"),italic:i(3,23),underline:i(4,24),inverse:i(7,27),hidden:i(8,28),strikethrough:i(9,29),black:i(30,39),red:i(31,39),green:i(32,39),yellow:i(33,39),blue:i(34,39),magenta:i(35,39),cyan:i(36,39),white:i(37,39),gray:i(90,39),bgBlack:i(40,49),bgRed:i(41,49),bgGreen:i(42,49),bgYellow:i(43,49),bgBlue:i(44,49),bgMagenta:i(45,49),bgCyan:i(46,49),bgWhite:i(47,49),blackBright:i(90,39),redBright:i(91,39),greenBright:i(92,39),yellowBright:i(93,39),blueBright:i(94,39),magentaBright:i(95,39),cyanBright:i(96,39),whiteBright:i(97,39),bgBlackBright:i(100,49),bgRedBright:i(101,49),bgGreenBright:i(102,49),bgYellowBright:i(103,49),bgBlueBright:i(104,49),bgMagentaBright:i(105,49),bgCyanBright:i(106,49),bgWhiteBright:i(107,49)}}).call(this,r(5))},function(t,e,r){const n=r(76),{parse:i}=r(162),o=i;t.exports=function(t){const e=n.parse(t,!0);let{protocol:r}=e;if(null===r)return{client:\"sqlite3\",connection:{filename:t}};return\":\"===r.slice(-1)&&(r=r.slice(0,-1)),{client:r,connection:[\"postgresql\",\"postgres\"].includes(r)?o(t):function(t){const e={};let r=t.pathname;\"/\"===r[0]&&(r=r.slice(1));e.database=r,t.hostname&&(0===t.protocol.indexOf(\"mssql\")?e.server=t.hostname:e.host=t.hostname);t.port&&(e.port=t.port);if(t.auth){const r=t.auth.indexOf(\":\");-1!==r?(e.user=t.auth.slice(0,r),r= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},w=u-h,E=Math.floor,x=String.fromCharCode;function S(t){throw new RangeError(v[t])}function A(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function C(t,e){var r=t.split(\"@\"),n=\"\";return r.length>1&&(n=r[0]+\"@\",t=r[1]),n+A((t=t.replace(_,\".\")).split(\".\"),e).join(\".\")}function k(t){for(var e,r,n=[],i=0,o=t.length;i=55296&&e<=56319&&i65535&&(e+=x((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=x(t)}).join(\"\")}function R(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function M(t,e,r){var n=0;for(t=r?E(t/d):t>>1,t+=E(t/e);t>w*f>>1;n+=u)t=E(t/w);return E(n+(w+1)*t/(t+l))}function j(t){var e,r,n,i,o,s,a,l,d,g,y,_=[],v=t.length,w=0,x=m,A=p;for((r=t.lastIndexOf(b))<0&&(r=0),n=0;n=128&&S(\"not-basic\"),_.push(t.charCodeAt(n));for(i=r>0?r+1:0;i=v&&S(\"invalid-input\"),((l=(y=t.charCodeAt(i++))-48<10?y-22:y-65<26?y-65:y-97<26?y-97:u)>=u||l>E((c-w)/s))&&S(\"overflow\"),w+=l*s,!(l<(d=a<=A?h:a>=A+f?f:a-A));a+=u)s>E(c/(g=u-d))&&S(\"overflow\"),s*=g;A=M(w-o,e=_.length+1,0==o),E(w/e)>c-x&&S(\"overflow\"),x+=E(w/e),w%=e,_.splice(w++,0,x)}return T(_)}function I(t){var e,r,n,i,o,s,a,l,d,g,y,_,v,w,A,C=[];for(_=(t=k(t)).length,e=m,r=0,o=p,s=0;s<_;++s)(y=t[s])<128&&C.push(x(y));for(n=i=C.length,i&&C.push(b);n<_;){for(a=c,s=0;s<_;++s)(y=t[s])>=e&&yE((c-r)/(v=n+1))&&S(\"overflow\"),r+=(a-e)*v,e=a,s=0;s<_;++s)if((y=t[s])c&&S(\"overflow\"),y==e){for(l=r,d=u;!(l<(g=d<=o?h:d>=o+f?f:d-o));d+=u)A=l-g,w=u-g,C.push(x(R(g+A%w,0))),l=E(A/w);C.push(x(R(l,0))),o=M(r,v,n==i),r=0,++n}++r,++e}return C.join(\"\")}a={version:\"1.4.1\",ucs2:{decode:k,encode:T},decode:j,encode:I,toASCII:function(t){return C(t,function(t){return y.test(t)?\"xn--\"+I(t):t})},toUnicode:function(t){return C(t,function(t){return g.test(t)?j(t.slice(4).toLowerCase()):t})}},void 0===(i=function(){return a}.call(e,r,e,t))||(t.exports=i)}()}).call(this,r(77)(t),r(8))},function(t,e,r){\"use strict\";t.exports={isString:function(t){return\"string\"==typeof t},isObject:function(t){return\"object\"==typeof t&&null!==t},isNull:function(t){return null===t},isNullOrUndefined:function(t){return null==t}}},function(t,e,r){\"use strict\";e.decode=e.parse=r(160),e.encode=e.stringify=r(161)},function(t,e,r){\"use strict\";function n(t,e){return Object.prototype.hasOwnProperty.call(t,e)}t.exports=function(t,e,r,o){e=e||\"&\",r=r||\"=\";var s={};if(\"string\"!=typeof t||0===t.length)return s;var a=/\\+/g;t=t.split(e);var c=1e3;o&&\"number\"==typeof o.maxKeys&&(c=o.maxKeys);var u=t.length;c>0&&u>c&&(u=c);for(var h=0;h=0?(f=m.substr(0,b),l=m.substr(b+1)):(f=m,l=\"\"),d=decodeURIComponent(f),p=decodeURIComponent(l),n(s,d)?i(s[d])?s[d].push(p):s[d]=[s[d],p]:s[d]=p}return s};var i=Array.isArray||function(t){return\"[object Array]\"===Object.prototype.toString.call(t)}},function(t,e,r){\"use strict\";var n=function(t){switch(typeof t){case\"string\":return t;case\"boolean\":return t?\"true\":\"false\";case\"number\":return isFinite(t)?t:\"\";default:return\"\"}};t.exports=function(t,e,r,a){return e=e||\"&\",r=r||\"=\",null===t&&(t=void 0),\"object\"==typeof t?o(s(t),function(s){var a=encodeURIComponent(n(s))+r;return i(t[s])?o(t[s],function(t){return a+encodeURIComponent(n(t))}).join(e):a+encodeURIComponent(n(t[s]))}).join(e):a?encodeURIComponent(n(a))+r+encodeURIComponent(n(t)):\"\"};var i=Array.isArray||function(t){return\"[object Array]\"===Object.prototype.toString.call(t)};function o(t,e){if(t.map)return t.map(e);for(var r=[],n=0;nnew n(i,t)};t.exports=i},function(t,e,r){var n={\"./mssql/index.js\":166,\"./mysql/index.js\":78,\"./mysql2/index.js\":181,\"./oracle/index.js\":79,\"./oracledb/index.js\":262,\"./postgres/index.js\":114,\"./redshift/index.js\":267,\"./sqlite3/index.js\":274};function i(t){var e=o(t);return r(e)}function o(t){var e=n[t];if(!(e+1)){var r=new Error(\"Cannot find module '\"+t+\"'\");throw r.code=\"MODULE_NOT_FOUND\",r}return e}i.keys=function(){return Object.keys(n)},i.resolve=o,t.exports=i,i.id=165},function(t,e,r){const{map:n,flatten:i,values:o}=r(1),s=r(0),a=r(21),c=r(7),u=r(29),h=r(167),f=r(168),l=r(169),d=r(170),p=r(171),m=-2147483648,b=2147483647,g=-9007199254740991,y=9007199254740991;function _(t={}){t&&t.connection&&t.connection.host&&(t.connection.server=t.connection.host),this.mssqlPoolSettings={min:1,max:1,idleTimeoutMillis:Number.MAX_SAFE_INTEGER,evictionRunIntervalMillis:0},a.call(this,t)}s(_,a),Object.assign(_.prototype,{dialect:\"mssql\",driverName:\"mssql\",_driver(){const t=r(172),e=r(173),n=r(174),i=r(!function(){var t=new Error(\"Cannot find module 'mssql/package.json'\");throw t.code=\"MODULE_NOT_FOUND\",t}()).version;if(\"4.1.0\"===i)e.ConnectionPool.prototype.release=function(t){this.pool&&this.pool.release(t)},e.ConnectionPool.prototype._poolCreate=function(){return new n.Promise((e,r)=>{const i={userName:this.config.user,password:this.config.password,server:this.config.server,options:Object.assign({},this.config.options),domain:this.config.domain};i.options.database=this.config.database,i.options.port=this.config.port,i.options.connectTimeout=this.config.connectionTimeout||this.config.timeout||15e3,i.options.requestTimeout=null!=this.config.requestTimeout?this.config.requestTimeout:15e3,i.options.tdsVersion=i.options.tdsVersion||\"7_4\",i.options.rowCollectionOnDone=!1,i.options.rowCollectionOnRequestCompletion=!1,i.options.useColumnNames=!1,i.options.appName=i.options.appName||\"node-mssql\",i.options.instanceName&&delete i.options.port,isNaN(i.options.requestTimeout)&&(i.options.requestTimeout=15e3),i.options.requestTimeout===1/0&&(i.options.requestTimeout=0),i.options.requestTimeout<0&&(i.options.requestTimeout=0),this.config.debug&&(i.options.debug={packet:!0,token:!0,data:!0,payload:!0});const o=new t.Connection(i);let s=!1;function a(t){s||(s=!0,r(t))}o.once(\"end\",t=>{a(new n.ConnectionError(\"Connection ended unexpectedly during connecting\"))}),o.once(\"connect\",t=>{if(t)return a(t=new n.ConnectionError(t));!function(t){s||(s=!0,e(t))}(o)}),o.on(\"error\",t=>{\"ESOCKET\"!==t.code?this.emit(\"error\",t):o.hasError=!0}),this.config.debug&&o.on(\"debug\",this.emit.bind(this,\"debug\",o))})};else{const[t]=i.split(\".\");if(t<5)throw new Error(\"This knex version only supports mssql driver versions 4.1.0 and 5.0.0+\")}return e},formatter(){return new v(this,...arguments)},transaction(){return new h(this,...arguments)},queryCompiler(){return new f(this,...arguments)},schemaCompiler(){return new l(this,...arguments)},tableCompiler(){return new d(this,...arguments)},columnCompiler(){return new p(this,...arguments)},wrapIdentifierImpl:t=>\"*\"===t?\"*\":`[${t.replace(/[[\\]']+/g,\"\")}]`,acquireRawConnection(){return new c((t,e)=>{const r=Object.assign({},this.connectionSettings);r.pool=this.mssqlPoolSettings;const n=new this.driver.ConnectionPool(r);n.connect(r=>{if(r)return e(r);n.on(\"error\",t=>{n.__knex__disposed=t}),t(n)})})},validateConnection:t=>!0===t.connected,destroyRawConnection:t=>t.close().catch(t=>{}),positionBindings(t){let e=-1;return t.replace(/\\?/g,function(){return`@p${e+=1}`})},_stream(t,e,r){return e&&\"string\"!=typeof e||(e={sql:e}),new c((n,i)=>{r.on(\"error\",t=>{i(t)}),r.on(\"end\",n);const{sql:o}=e;if(!o)return n();const s=(t.tx_||t).request();if(s.multiple=!0,s.stream=!0,e.bindings)for(let t=0;t{const{sql:o}=e;if(!o)return n();const s=(t.tx_||t).request();if(s.multiple=!0,e.bindings)for(let t=0;t{if(t)return i(t);e.response=r.recordsets[0],n(e)})})},_setReqInput(t,e,r){if(\"number\"==typeof r)if(r%1!=0)t.input(`p${e}`,this.driver.Decimal(38,10),r);else if(rb){if(ry)throw new Error(`Bigint must be safe integer or must be passed as string, saw ${r}`);t.input(`p${e}`,this.driver.BigInt,r)}else t.input(`p${e}`,this.driver.Int,r);else t.input(`p${e}`,r)},processResponse(t,e){if(null==t)return;const{response:r,method:s}=t;if(t.output)return t.output.call(e,r);switch(s){case\"select\":case\"pluck\":case\"first\":return\"pluck\"===s?n(r,t.pluck):\"first\"===s?r[0]:r;case\"insert\":case\"del\":case\"update\":case\"counter\":return t.returning?\"@@rowcount\"===t.returning?r[0][\"\"]:Array.isArray(t.returning)&&t.returning.length>1||\"*\"===t.returning[0]?r:i(n(r,o)):r;default:return r}}});class v extends u{columnizeWithPrefix(t,e){const r=\"string\"==typeof e?[e]:e;let n=\"\",i=-1;for(;++i0&&(n+=\", \"),n+=t+this.wrap(r[i]);return n}}t.exports=_},function(t,e,r){const n=r(7),i=r(18),{isUndefined:o}=r(1),s=r(10)(\"knex:tx\");t.exports=class extends i{begin(t){return s(\"%s: begin\",this.txid),t.tx_.begin().then(this._resolver,this._rejecter)}savepoint(t){return s(\"%s: savepoint at\",this.txid),n.resolve().then(()=>this.query(t,`SAVE TRANSACTION ${this.txid}`))}commit(t,e){return this._completed=!0,s(\"%s: commit\",this.txid),t.tx_.commit().then(()=>this._resolver(e),this._rejecter)}release(t,e){return this._resolver(e)}rollback(t,e){return this._completed=!0,s(\"%s: rolling back\",this.txid),t.tx_.rollback().then(()=>{let t=e;if(o(e)){if(this.doNotRejectOnRollback)return void this._resolver();t=new Error(`Transaction rejected with non-error: ${e}`)}this._rejecter(t)},t=>(e&&(t.originalError=e),this._rejecter(t)))}rollbackTo(t,e){return s(\"%s: rolling backTo\",this.txid),n.resolve().then(()=>this.query(t,`ROLLBACK TRANSACTION ${this.txid}`,2,e)).then(()=>this._rejecter(e))}acquireConnection(t,e){const r=t&&t.connection;return new n((t,e)=>{try{t((this.outerTx?this.outerTx.conn:null)||r||this.client.acquireConnection())}catch(t){e(t)}}).then(t=>(t.__knexTxId=this.txid,this.outerTx||(this.conn=t,t.tx_=t.transaction()),t)).then(async t=>{try{return await e(t)}finally{this.outerTx||(t.tx_&&(this._completed||(s(\"%s: unreleased transaction\",this.txid),t.tx_.rollback()),t.tx_=null),this.conn=null,r?s(\"%s: not releasing external connection\",this.txid):(s(\"%s: releasing connection\",this.txid),this.client.releaseConnection(t)))}})}}},function(t,e,r){const n=r(0),i=r(19),{isEmpty:o,compact:s,identity:a}=r(1);function c(t,e){i.call(this,t,e)}n(c,i);const u=[\"columns\",\"join\",\"lock\",\"where\",\"union\",\"group\",\"having\",\"order\",\"limit\",\"offset\"];Object.assign(c.prototype,{_emptyInsertValue:\"default values\",select(){const t=this.with(),e=u.map(t=>this[t](this));return t+s(e).join(\" \")},insert(){const t=this.single.insert||[];let e=this.with()+`insert into ${this.tableName} `;const{returning:r}=this.single,n=r?this._returning(\"insert\",r)+\" \":\"\";if(Array.isArray(t)){if(0===t.length)return\"\"}else if(\"object\"==typeof t&&o(t))return{sql:e+n+this._emptyInsertValue,returning:r};const i=this._prepInsert(t);if(\"string\"==typeof i)e+=i;else if(i.columns.length){e+=`(${this.formatter.columnize(i.columns)}`,e+=`) ${n}values (`;let t=-1;for(;++t0&&i.push(this.formatter.columnize(e.value))}return 0===i.length&&(i=[\"*\"]),`select ${t}`+(e?e+\" \":\"\")+i.join(\", \")+(this.tableName?` from ${this.tableName}`:\"\")},_returning(t,e){switch(t){case\"update\":case\"insert\":return e?`output ${this.formatter.columnizeWithPrefix(\"inserted.\",e)}`:\"\";case\"del\":return e?`output ${this.formatter.columnizeWithPrefix(\"deleted.\",e)}`:\"\";case\"rowcount\":return e?\";select @@rowcount\":\"\"}},truncate(){return`truncate table ${this.tableName}`},forUpdate:()=>\"with (UPDLOCK)\",forShare:()=>\"with (HOLDLOCK)\",columnInfo(){const t=this.single.columnInfo;let e=this.single.schema;const r=this.client.customWrapIdentifier(this.single.table,a);e&&(e=this.client.customWrapIdentifier(e,a));let n=\"select * from information_schema.columns where table_name = ? and table_catalog = ?\";const i=[r,this.client.database()];return e?(n+=\" and table_schema = ?\",i.push(e)):n+=\" and table_schema = 'dbo'\",{sql:n,bindings:i,output(e){const r=e.reduce(function(t,e){return t[e.COLUMN_NAME]={defaultValue:e.COLUMN_DEFAULT,type:e.DATA_TYPE,maxLength:e.CHARACTER_MAXIMUM_LENGTH,nullable:\"YES\"===e.IS_NULLABLE},t},{});return t&&r[t]||r}}},top(){const t=!this.single.limit&&0!==this.single.limit,e=!this.single.offset;return t||!e?\"\":`top (${this.formatter.parameter(this.single.limit)})`},limit:()=>\"\",offset(){const t=!this.single.limit&&0!==this.single.limit,e=!this.single.offset;if(e)return\"\";let r=`offset ${e?\"0\":this.formatter.parameter(this.single.offset)} rows`;return t||(r+=` fetch next ${this.formatter.parameter(this.single.limit)} rows only`),r}}),t.exports=c},function(t,e,r){const n=r(0),i=r(22);function o(t,e){i.call(this,t,e)}function s(t,e){return t?`${t}.${e}`:e}n(o,i),Object.assign(o.prototype,{dropTablePrefix:\"DROP TABLE \",dropTableIfExists(t){const e=this.formatter.wrap(s(this.schema,t));this.pushQuery(`if object_id('${e}', 'U') is not null DROP TABLE ${e}`)},renameTable(t,e){this.pushQuery(`exec sp_rename ${this.formatter.parameter(s(this.schema,t))}, ${this.formatter.parameter(e)}`)},hasTable(t){const e=\"select object_id from sys.tables \"+`where object_id = object_id(${this.formatter.parameter(this.formatter.wrap(s(this.schema,t)))})`;this.pushQuery({sql:e,output:t=>t.length>0})},hasColumn(t,e){const r=\"select object_id from sys.columns \"+`where name = ${this.formatter.parameter(e)} `+`and object_id = object_id(${this.formatter.parameter(this.formatter.wrap(s(this.schema,t)))})`;this.pushQuery({sql:r,output:t=>t.length>0})}}),t.exports=o},function(t,e,r){const n=r(0),i=r(23),o=r(11);function s(){i.apply(this,arguments)}n(s,i),Object.assign(s.prototype,{createAlterTableMethods:[\"foreign\",\"primary\"],createQuery(t,e){const r=(e?`if object_id('${this.tableName()}', 'U') is null CREATE TABLE `:\"CREATE TABLE \")+this.tableName()+(this._formatting?\" (\\n \":\" (\")+t.sql.join(this._formatting?\",\\n \":\", \")+\")\";if(this.single.comment){const{comment:t}=this.single;t.length>60&&this.client.logger.warn(\"The max length for a table comment is 60 characters\")}this.pushQuery(r)},lowerCase:!1,addColumnsPrefix:\"ADD \",dropColumnPrefix:\"DROP COLUMN \",alterColumnPrefix:\"ALTER COLUMN \",addColumns(t,e){e=e||this.addColumnsPrefix,t.sql.length>0&&this.pushQuery({sql:(this.lowerCase?\"alter table \":\"ALTER TABLE \")+this.tableName()+\" \"+e+t.sql.join(\", \"),bindings:t.bindings})},dropColumn(){const t=this,e=o.normalizeArr.apply(null,arguments),r=(Array.isArray(e)?e:[e]).map(e=>t.formatter.wrap(e));this.pushQuery((this.lowerCase?\"alter table \":\"ALTER TABLE \")+this.tableName()+\" \"+this.dropColumnPrefix+r.join(\", \"))},comment(){},changeType(){},renameColumn(t,e){this.pushQuery(`exec sp_rename ${this.formatter.parameter(this.tableName()+\".\"+t)}, ${this.formatter.parameter(e)}, 'COLUMN'`)},dropFKRefs(t,e){const r=this.client.formatter(this.tableBuilder);return Promise.all(e.map(function(e){const n=r.wrap(e.CONSTRAINT_NAME),i=r.wrap(e.TABLE_NAME);return t.query({sql:`ALTER TABLE ${i} DROP CONSTRAINT ${n}`})}))},createFKRefs(t,e){const r=this.client.formatter(this.tableBuilder);return Promise.all(e.map(function(e){const n=r.wrap(e.TABLE_NAME),i=r.wrap(e.CONSTRAINT_NAME),o=r.columnize(e.COLUMN_NAME),s=r.columnize(e.REFERENCED_COLUMN_NAME),a=r.wrap(e.REFERENCED_TABLE_NAME),c=` ON UPDATE ${e.UPDATE_RULE}`,u=` ON DELETE ${e.DELETE_RULE}`;return t.query({sql:`ALTER TABLE ${n} ADD CONSTRAINT ${i}`+\" FOREIGN KEY (\"+o+\") REFERENCES \"+a+\" (\"+s+\")\"+c+u})}))},index(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`CREATE INDEX ${e} ON ${this.tableName()} (${this.formatter.columnize(t)})`)},primary(t,e){e=e?this.formatter.wrap(e):this.formatter.wrap(`${this.tableNameRaw}_pkey`),this.forCreate?this.pushQuery(`CONSTRAINT ${e} PRIMARY KEY (${this.formatter.columnize(t)})`):this.pushQuery(`ALTER TABLE ${this.tableName()} ADD CONSTRAINT ${e} PRIMARY KEY (${this.formatter.columnize(t)})`)},unique(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),Array.isArray(t)||(t=[t]);const r=t.map(t=>this.formatter.columnize(t)+\" IS NOT NULL\").join(\" AND \");this.pushQuery(`CREATE UNIQUE INDEX ${e} ON ${this.tableName()} (${this.formatter.columnize(t)}) WHERE ${r}`)},dropIndex(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`DROP INDEX ${e} ON ${this.tableName()}`)},dropForeign(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"foreign\",this.tableNameRaw,t),this.pushQuery(`ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${e}`)},dropPrimary(t){t=t?this.formatter.wrap(t):this.formatter.wrap(`${this.tableNameRaw}_pkey`),this.pushQuery(`ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${t}`)},dropUnique(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`DROP INDEX ${e} ON ${this.tableName()}`)}}),t.exports=s},function(t,e,r){const n=r(0),i=r(24);function o(){i.apply(this,arguments),this.modifiers=[\"nullable\",\"defaultTo\",\"first\",\"after\",\"comment\"]}n(o,i),Object.assign(o.prototype,{increments:\"int identity(1,1) not null primary key\",bigincrements:\"bigint identity(1,1) not null primary key\",bigint:\"bigint\",double:(t,e)=>\"float\",floating:(t,e)=>\"float\",integer:()=>\"int\",mediumint:\"int\",smallint:\"smallint\",tinyint:()=>\"tinyint\",varchar(t){return`nvarchar(${this._num(t,255)})`},text:\"nvarchar(max)\",mediumtext:\"nvarchar(max)\",longtext:\"nvarchar(max)\",enu:\"nvarchar(100)\",uuid:\"uniqueidentifier\",datetime:\"datetime2\",timestamp:({useTz:t=!1}={})=>t?\"datetimeoffset\":\"datetime2\",bit(t){return t>1&&this.client.logger.warn(\"Bit field is exactly 1 bit length for MSSQL\"),\"bit\"},binary(t){return t?`varbinary(${this._num(t)})`:\"varbinary(max)\"},bool:\"bit\",first(){return this.client.logger.warn(\"Column first modifier not available for MSSQL\"),\"\"},after(t){return this.client.logger.warn(\"Column after modifier not available for MSSQL\"),\"\"},comment(t){return t&&t.length>255&&this.client.logger.warn(\"Your comment is longer than the max comment length for MSSQL\"),\"\"}}),t.exports=o},function(t,e){},function(t,e){t.exports=mssql},function(t,e){},function(t,e,r){const n=r(18),i=r(10),{isUndefined:o}=r(1),s=i(\"knex:tx\");class a extends n{}Object.assign(a.prototype,{query(t,e,r,n){const i=this,a=this.trxClient.query(t,e).catch(t=>1305===t.errno,()=>{this.trxClient.logger.warn(\"Transaction was implicitly committed, do not mix transactions and DDL with MySQL (#805)\")}).catch(function(t){r=2,n=t,i._completed=!0,s(\"%s error running transaction query\",i.txid)}).then(function(t){if(1===r&&i._resolver(n),2===r){if(o(n)){if(i.doNotRejectOnRollback&&/^ROLLBACK\\b/i.test(e))return void i._resolver();n=new Error(`Transaction rejected with non-error: ${n}`)}i._rejecter(n)}return t});return 1!==r&&2!==r||(i._completed=!0),a}}),t.exports=a},function(t,e,r){const n=r(0),i=r(19),{identity:o}=r(1);function s(t,e){i.call(this,t,e);const{returning:r}=this.single;r&&this.client.logger.warn(\".returning() is not supported by mysql and will not have any effect.\")}n(s,i),Object.assign(s.prototype,{_emptyInsertValue:\"() values ()\",update(){const t=this.join(),e=this._prepUpdate(this.single.update),r=this.where(),n=this.order(),i=this.limit();return`update ${this.tableName}`+(t?` ${t}`:\"\")+\" set \"+e.join(\", \")+(r?` ${r}`:\"\")+(n?` ${n}`:\"\")+(i?` ${i}`:\"\")},forUpdate:()=>\"for update\",forShare:()=>\"lock in share mode\",skipLocked:()=>\"skip locked\",noWait:()=>\"nowait\",columnInfo(){const t=this.single.columnInfo;return{sql:\"select * from information_schema.columns where table_name = ? and table_schema = ?\",bindings:[this.client.customWrapIdentifier(this.single.table,o),this.client.database()],output(e){const r=e.reduce(function(t,e){return t[e.COLUMN_NAME]={defaultValue:e.COLUMN_DEFAULT,type:e.DATA_TYPE,maxLength:e.CHARACTER_MAXIMUM_LENGTH,nullable:\"YES\"===e.IS_NULLABLE},t},{});return t&&r[t]||r}}},limit(){const t=!this.single.limit&&0!==this.single.limit;return t&&!this.single.offset?\"\":`limit ${this.single.offset&&t?\"18446744073709551615\":this.formatter.parameter(this.single.limit)}`}}),t.exports=s},function(t,e,r){const n=r(0),i=r(22),{some:o}=r(1);function s(t,e){i.call(this,t,e)}n(s,i),Object.assign(s.prototype,{renameTable(t,e){this.pushQuery(`rename table ${this.formatter.wrap(t)} to ${this.formatter.wrap(e)}`)},hasTable(t){let e=\"select * from information_schema.tables where table_name = ?\";const r=[t];this.schema?(e+=\" and table_schema = ?\",r.push(this.schema)):e+=\" and table_schema = database()\",this.pushQuery({sql:e,bindings:r,output:function(t){return t.length>0}})},hasColumn(t,e){this.pushQuery({sql:`show columns from ${this.formatter.wrap(t)}`,output(t){return o(t,t=>this.client.wrapIdentifier(t.Field)===this.client.wrapIdentifier(e))}})}}),t.exports=s},function(t,e,r){const n=r(0),i=r(23);function o(){i.apply(this,arguments)}n(o,i),Object.assign(o.prototype,{createQuery(t,e){const r=e?\"create table if not exists \":\"create table \",{client:n}=this;let i={},o=r+this.tableName()+\" (\"+t.sql.join(\", \")+\")\";n.connectionSettings&&(i=n.connectionSettings);const s=this.single.charset||i.charset||\"\",a=this.single.collate||i.collate||\"\",c=this.single.engine||\"\";if(s&&(o+=` default character set ${s}`),a&&(o+=` collate ${a}`),c&&(o+=` engine = ${c}`),this.single.comment){const t=this.single.comment||\"\";t.length>60&&this.client.logger.warn(\"The max length for a table comment is 60 characters\"),o+=` comment = '${t}'`}this.pushQuery(o)},addColumnsPrefix:\"add \",alterColumnsPrefix:\"modify \",dropColumnPrefix:\"drop \",comment(t){this.pushQuery(`alter table ${this.tableName()} comment = '${t}'`)},changeType(){},renameColumn(t,e){const r=this,n=this.tableName(),i=this.formatter.wrap(t)+\" \"+this.formatter.wrap(e);this.pushQuery({sql:`show fields from ${n} where field = `+this.formatter.parameter(t),output(o){const s=o[0],a=this;return r.getFKRefs(a).then(([o])=>new Promise((t,e)=>{try{o.length||t(),t(r.dropFKRefs(a,o))}catch(t){e(t)}}).then(function(){let t=`alter table ${n} change ${i} ${s.Type}`;return\"YES\"!==String(s.Null).toUpperCase()?t+=\" NOT NULL\":t+=\" NULL\",void 0!==s.Default&&null!==s.Default&&(t+=` DEFAULT '${s.Default}'`),a.query({sql:t})}).then(function(){if(o.length)return r.createFKRefs(a,o.map(function(r){return r.REFERENCED_COLUMN_NAME===t&&(r.REFERENCED_COLUMN_NAME=e),r.COLUMN_NAME===t&&(r.COLUMN_NAME=e),r}))}))}})},getFKRefs(t){const e=this.client.formatter(this.tableBuilder),r=\"SELECT KCU.CONSTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, RC.UPDATE_RULE, RC.DELETE_RULE FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC USING(CONSTRAINT_NAME)WHERE KCU.REFERENCED_TABLE_NAME = \"+e.parameter(this.tableNameRaw)+\" AND KCU.CONSTRAINT_SCHEMA = \"+e.parameter(this.client.database())+\" AND RC.CONSTRAINT_SCHEMA = \"+e.parameter(this.client.database());return t.query({sql:r,bindings:e.bindings})},dropFKRefs(t,e){const r=this.client.formatter(this.tableBuilder);return Promise.all(e.map(function(e){const n=r.wrap(e.CONSTRAINT_NAME),i=r.wrap(e.TABLE_NAME);return t.query({sql:`alter table ${i} drop foreign key ${n}`})}))},createFKRefs(t,e){const r=this.client.formatter(this.tableBuilder);return Promise.all(e.map(function(e){const n=r.wrap(e.TABLE_NAME),i=r.wrap(e.CONSTRAINT_NAME),o=r.columnize(e.COLUMN_NAME),s=r.columnize(e.REFERENCED_COLUMN_NAME),a=r.wrap(e.REFERENCED_TABLE_NAME),c=` ON UPDATE ${e.UPDATE_RULE}`,u=` ON DELETE ${e.DELETE_RULE}`;return t.query({sql:`alter table ${n} add constraint ${i} `+\"foreign key (\"+o+\") references \"+a+\" (\"+s+\")\"+c+u})}))},index(t,e,r){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} add${r?` ${r}`:\"\"} index ${e}(${this.formatter.columnize(t)})`)},primary(t,e){e=e?this.formatter.wrap(e):this.formatter.wrap(`${this.tableNameRaw}_pkey`),this.pushQuery(`alter table ${this.tableName()} add primary key ${e}(${this.formatter.columnize(t)})`)},unique(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} add unique ${e}(${this.formatter.columnize(t)})`)},dropIndex(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop index ${e}`)},dropForeign(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"foreign\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop foreign key ${e}`)},dropPrimary(){this.pushQuery(`alter table ${this.tableName()} drop primary key`)},dropUnique(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop index ${e}`)}}),t.exports=o},function(t,e,r){const n=r(0),i=r(24),{isObject:o}=r(1);function s(){i.apply(this,arguments),this.modifiers=[\"unsigned\",\"nullable\",\"defaultTo\",\"comment\",\"collate\",\"first\",\"after\"]}n(s,i),Object.assign(s.prototype,{increments:\"int unsigned not null auto_increment primary key\",bigincrements:\"bigint unsigned not null auto_increment primary key\",bigint:\"bigint\",double(t,e){return t?`double(${this._num(t,8)}, ${this._num(e,2)})`:\"double\"},integer(t){return`int${t=t?`(${this._num(t,11)})`:\"\"}`},mediumint:\"mediumint\",smallint:\"smallint\",tinyint(t){return`tinyint${t=t?`(${this._num(t,1)})`:\"\"}`},text(t){switch(t){case\"medium\":case\"mediumtext\":return\"mediumtext\";case\"long\":case\"longtext\":return\"longtext\";default:return\"text\"}},mediumtext(){return this.text(\"medium\")},longtext(){return this.text(\"long\")},enu:t=>`enum('${t.join(\"', '\")}')`,datetime:t=>(o(t)&&({precision:t}=t),\"number\"==typeof t?`datetime(${t})`:\"datetime\"),timestamp:t=>(o(t)&&({precision:t}=t),\"number\"==typeof t?`timestamp(${t})`:\"timestamp\"),time:t=>(o(t)&&({precision:t}=t),\"number\"==typeof t?`time(${t})`:\"time\"),bit(t){return t?`bit(${this._num(t)})`:\"bit\"},binary(t){return t?`varbinary(${this._num(t)})`:\"blob\"},json:()=>\"json\",jsonb:()=>\"json\",defaultTo(t){if(null==t)return;if((\"json\"===this.type||\"jsonb\"===this.type)&&o(t))return`default ('${JSON.stringify(t)}')`;const e=s.super_.prototype.defaultTo.apply(this,arguments);return\"blob\"!==this.type&&-1===this.type.indexOf(\"text\")?e:\"\"},unsigned:()=>\"unsigned\",comment(t){return t&&t.length>255&&this.client.logger.warn(\"Your comment is longer than the max comment length for MySQL\"),t&&`comment '${t}'`},first:()=>\"first\",after(t){return`after ${this.formatter.wrap(t)}`},collate:t=>t&&`collate '${t}'`}),t.exports=s},function(t,e){t.exports=mysql},function(t,e,r){const n=r(0),i=r(78),o=r(182);function s(t){i.call(this,t)}n(s,i),Object.assign(s.prototype,{driverName:\"mysql2\",transaction(){return new o(this,...arguments)},_driver:()=>r(183),validateConnection:t=>!t._fatalError}),t.exports=s},function(t,e,r){const n=r(18),i=r(10)(\"knex:tx\"),{isUndefined:o}=r(1);class s extends n{}Object.assign(s.prototype,{query(t,e,r,n){const s=this,a=this.trxClient.query(t,e).catch(t=>\"ER_SP_DOES_NOT_EXIST\"===t.code,()=>{this.trxClient.logger.warn(\"Transaction was implicitly committed, do not mix transactions and DDL with MySQL (#805)\")}).catch(function(t){r=2,n=t,s._completed=!0,i(\"%s error running transaction query\",s.txid)}).then(function(t){if(1===r&&s._resolver(n),2===r){if(o(n)){if(s.doNotRejectOnRollback&&/^ROLLBACK\\b/i.test(e))return void s._resolver();n=new Error(`Transaction rejected with non-error: ${n}`)}return s._rejecter(n),t}});return 1!==r&&2!==r||(s._completed=!0),a}}),t.exports=s},function(t,e){t.exports=mysql2},function(t,e,r){\"use strict\";e.randomBytes=e.rng=e.pseudoRandomBytes=e.prng=r(25),e.createHash=e.Hash=r(30),e.createHmac=e.Hmac=r(84);var n=r(190),i=Object.keys(n),o=[\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"md5\",\"rmd160\"].concat(i);e.getHashes=function(){return o};var s=r(87);e.pbkdf2=s.pbkdf2,e.pbkdf2Sync=s.pbkdf2Sync;var a=r(192);e.Cipher=a.Cipher,e.createCipher=a.createCipher,e.Cipheriv=a.Cipheriv,e.createCipheriv=a.createCipheriv,e.Decipher=a.Decipher,e.createDecipher=a.createDecipher,e.Decipheriv=a.Decipheriv,e.createDecipheriv=a.createDecipheriv,e.getCiphers=a.getCiphers,e.listCiphers=a.listCiphers;var c=r(209);e.DiffieHellmanGroup=c.DiffieHellmanGroup,e.createDiffieHellmanGroup=c.createDiffieHellmanGroup,e.getDiffieHellman=c.getDiffieHellman,e.createDiffieHellman=c.createDiffieHellman,e.DiffieHellman=c.DiffieHellman;var u=r(214);e.createSign=u.createSign,e.Sign=u.Sign,e.createVerify=u.createVerify,e.Verify=u.Verify,e.createECDH=r(252);var h=r(253);e.publicEncrypt=h.publicEncrypt,e.privateEncrypt=h.privateEncrypt,e.publicDecrypt=h.publicDecrypt,e.privateDecrypt=h.privateDecrypt;var f=r(256);e.randomFill=f.randomFill,e.randomFillSync=f.randomFillSync,e.createCredentials=function(){throw new Error([\"sorry, createCredentials is not implemented yet\",\"we accept pull requests\",\"https://github.com/crypto-browserify/crypto-browserify\"].join(\"\\n\"))},e.constants={DH_CHECK_P_NOT_SAFE_PRIME:2,DH_CHECK_P_NOT_PRIME:1,DH_UNABLE_TO_CHECK_GENERATOR:4,DH_NOT_SUITABLE_GENERATOR:8,NPN_ENABLED:1,ALPN_ENABLED:1,RSA_PKCS1_PADDING:1,RSA_SSLV23_PADDING:2,RSA_NO_PADDING:3,RSA_PKCS1_OAEP_PADDING:4,RSA_X931_PADDING:5,RSA_PKCS1_PSS_PADDING:6,POINT_CONVERSION_COMPRESSED:2,POINT_CONVERSION_UNCOMPRESSED:4,POINT_CONVERSION_HYBRID:6}},function(t,e,r){var n=r(0),i=r(26),o=r(2).Buffer,s=[1518500249,1859775393,-1894007588,-899497514],a=new Array(80);function c(){this.init(),this._w=a,i.call(this,64,56)}function u(t){return t<<30|t>>>2}function h(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}n(c,i),c.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},c.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,a=0|this._d,c=0|this._e,f=0;f<16;++f)r[f]=t.readInt32BE(4*f);for(;f<80;++f)r[f]=r[f-3]^r[f-8]^r[f-14]^r[f-16];for(var l=0;l<80;++l){var d=~~(l/20),p=0|((e=n)<<5|e>>>27)+h(d,i,o,a)+c+r[l]+s[d];c=a,a=o,o=u(i),i=n,n=p}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=a+this._d|0,this._e=c+this._e|0},c.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=c},function(t,e,r){var n=r(0),i=r(26),o=r(2).Buffer,s=[1518500249,1859775393,-1894007588,-899497514],a=new Array(80);function c(){this.init(),this._w=a,i.call(this,64,56)}function u(t){return t<<5|t>>>27}function h(t){return t<<30|t>>>2}function f(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}n(c,i),c.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},c.prototype._update=function(t){for(var e,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,a=0|this._d,c=0|this._e,l=0;l<16;++l)r[l]=t.readInt32BE(4*l);for(;l<80;++l)r[l]=(e=r[l-3]^r[l-8]^r[l-14]^r[l-16])<<1|e>>>31;for(var d=0;d<80;++d){var p=~~(d/20),m=u(n)+f(p,i,o,a)+c+r[d]+s[p]|0;c=a,a=o,o=h(i),i=n,n=m}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=a+this._d|0,this._e=c+this._e|0},c.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=c},function(t,e,r){var n=r(0),i=r(82),o=r(26),s=r(2).Buffer,a=new Array(64);function c(){this.init(),this._w=a,o.call(this,64,56)}n(c,i),c.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},c.prototype._hash=function(){var t=s.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},t.exports=c},function(t,e,r){var n=r(0),i=r(83),o=r(26),s=r(2).Buffer,a=new Array(160);function c(){this.init(),this._w=a,o.call(this,128,112)}n(c,i),c.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},c.prototype._hash=function(){var t=s.allocUnsafe(48);function e(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),t},t.exports=c},function(t,e,r){\"use strict\";var n=r(0),i=r(2).Buffer,o=r(16),s=i.alloc(128),a=64;function c(t,e){o.call(this,\"digest\"),\"string\"==typeof e&&(e=i.from(e)),this._alg=t,this._key=e,e.length>a?e=t(e):e.length>>0},e.writeUInt32BE=function(t,e,r){t[0+r]=e>>>24,t[1+r]=e>>>16&255,t[2+r]=e>>>8&255,t[3+r]=255&e},e.ip=function(t,e,r,n){for(var i=0,o=0,s=6;s>=0;s-=2){for(var a=0;a<=24;a+=8)i<<=1,i|=e>>>a+s&1;for(a=0;a<=24;a+=8)i<<=1,i|=t>>>a+s&1}for(s=6;s>=0;s-=2){for(a=1;a<=25;a+=8)o<<=1,o|=e>>>a+s&1;for(a=1;a<=25;a+=8)o<<=1,o|=t>>>a+s&1}r[n+0]=i>>>0,r[n+1]=o>>>0},e.rip=function(t,e,r,n){for(var i=0,o=0,s=0;s<4;s++)for(var a=24;a>=0;a-=8)i<<=1,i|=e>>>a+s&1,i<<=1,i|=t>>>a+s&1;for(s=4;s<8;s++)for(a=24;a>=0;a-=8)o<<=1,o|=e>>>a+s&1,o<<=1,o|=t>>>a+s&1;r[n+0]=i>>>0,r[n+1]=o>>>0},e.pc1=function(t,e,r,n){for(var i=0,o=0,s=7;s>=5;s--){for(var a=0;a<=24;a+=8)i<<=1,i|=e>>a+s&1;for(a=0;a<=24;a+=8)i<<=1,i|=t>>a+s&1}for(a=0;a<=24;a+=8)i<<=1,i|=e>>a+s&1;for(s=1;s<=3;s++){for(a=0;a<=24;a+=8)o<<=1,o|=e>>a+s&1;for(a=0;a<=24;a+=8)o<<=1,o|=t>>a+s&1}for(a=0;a<=24;a+=8)o<<=1,o|=t>>a+s&1;r[n+0]=i>>>0,r[n+1]=o>>>0},e.r28shl=function(t,e){return t<>>28-e};var n=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24];e.pc2=function(t,e,r,i){for(var o=0,s=0,a=n.length>>>1,c=0;c>>n[c]&1;for(c=a;c>>n[c]&1;r[i+0]=o>>>0,r[i+1]=s>>>0},e.expand=function(t,e,r){var n=0,i=0;n=(1&t)<<5|t>>>27;for(var o=23;o>=15;o-=4)n<<=6,n|=t>>>o&63;for(o=11;o>=3;o-=4)i|=t>>>o&63,i<<=6;i|=(31&t)<<1|t>>>31,e[r+0]=n>>>0,e[r+1]=i>>>0};var i=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11];e.substitute=function(t,e){for(var r=0,n=0;n<4;n++){r<<=4,r|=i[64*n+(t>>>18-6*n&63)]}for(n=0;n<4;n++){r<<=4,r|=i[256+64*n+(e>>>18-6*n&63)]}return r>>>0};var o=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7];e.permute=function(t){for(var e=0,r=0;r>>o[r]&1;return e>>>0},e.padSplit=function(t,e,r){for(var n=t.toString(2);n.length0;n--)e+=this._buffer(t,e),r+=this._flushBuffer(i,r);return e+=this._buffer(t,e),i},i.prototype.final=function(t){var e,r;return t&&(e=this.update(t)),r=\"encrypt\"===this.type?this._finalEncrypt():this._finalDecrypt(),e?e.concat(r):r},i.prototype._pad=function(t,e){if(0===e)return!1;for(;e>>1];r=s.r28shl(r,a),i=s.r28shl(i,a),s.pc2(r,i,t.keys,o)}},u.prototype._update=function(t,e,r,n){var i=this._desState,o=s.readUInt32BE(t,e),a=s.readUInt32BE(t,e+4);s.ip(o,a,i.tmp,0),o=i.tmp[0],a=i.tmp[1],\"encrypt\"===this.type?this._encrypt(i,o,a,i.tmp,0):this._decrypt(i,o,a,i.tmp,0),o=i.tmp[0],a=i.tmp[1],s.writeUInt32BE(r,o,n),s.writeUInt32BE(r,a,n+4)},u.prototype._pad=function(t,e){for(var r=t.length-e,n=e;n>>0,o=l}s.rip(a,o,n,i)},u.prototype._decrypt=function(t,e,r,n,i){for(var o=r,a=e,c=t.keys.length-2;c>=0;c-=2){var u=t.keys[c],h=t.keys[c+1];s.expand(o,t.tmp,0),u^=t.tmp[0],h^=t.tmp[1];var f=s.substitute(u,h),l=o;o=(a^s.permute(f))>>>0,a=l}s.rip(o,a,n,i)}},function(t,e,r){\"use strict\";var n=r(9),i=r(0),o={};function s(t){n.equal(t.length,8,\"Invalid IV length\"),this.iv=new Array(8);for(var e=0;e15){var t=this.cache.slice(0,16);return this.cache=this.cache.slice(16),t}return null},l.prototype.flush=function(){for(var t=16-this.cache.length,e=o.allocUnsafe(t),r=-1;++r>s%8,t._prev=o(t._prev,r?n:i);return a}function o(t,e){var r=t.length,i=-1,o=n.allocUnsafe(t.length);for(t=n.concat([t,n.from([e])]);++i>7;return o}e.encrypt=function(t,e,r){for(var o=e.length,s=n.allocUnsafe(o),a=-1;++a>>0,0),e.writeUInt32BE(t[1]>>>0,4),e.writeUInt32BE(t[2]>>>0,8),e.writeUInt32BE(t[3]>>>0,12),e}function s(t){this.h=t,this.state=n.alloc(16,0),this.cache=n.allocUnsafe(0)}s.prototype.ghash=function(t){for(var e=-1;++e0;e--)n[e]=n[e]>>>1|(1&n[e-1])<<31;n[0]=n[0]>>>1,r&&(n[0]=n[0]^225<<24)}this.state=o(i)},s.prototype.update=function(t){var e;for(this.cache=n.concat([this.cache,t]);this.cache.length>=16;)e=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(e)},s.prototype.final=function(t,e){return this.cache.length&&this.ghash(n.concat([this.cache,i],16)),this.ghash(o([0,t,0,e])),this.state},t.exports=s},function(t,e,r){var n=r(94),i=r(2).Buffer,o=r(56),s=r(95),a=r(16),c=r(38),u=r(39);function h(t,e,r){a.call(this),this._cache=new f,this._last=void 0,this._cipher=new c.AES(e),this._prev=i.from(r),this._mode=t,this._autopadding=!0}function f(){this.cache=i.allocUnsafe(0)}function l(t,e,r){var a=o[t.toLowerCase()];if(!a)throw new TypeError(\"invalid suite type\");if(\"string\"==typeof r&&(r=i.from(r)),\"GCM\"!==a.mode&&r.length!==a.iv)throw new TypeError(\"invalid iv length \"+r.length);if(\"string\"==typeof e&&(e=i.from(e)),e.length!==a.key/8)throw new TypeError(\"invalid key length \"+e.length);return\"stream\"===a.type?new s(a.module,e,r,!0):\"auth\"===a.type?new n(a.module,e,r,!0):new h(a.module,e,r)}r(0)(h,a),h.prototype._update=function(t){var e,r;this._cache.add(t);for(var n=[];e=this._cache.get(this._autopadding);)r=this._mode.decrypt(this,e),n.push(r);return i.concat(n)},h.prototype._final=function(){var t=this._cache.flush();if(this._autopadding)return function(t){var e=t[15];if(e<1||e>16)throw new Error(\"unable to decrypt data\");var r=-1;for(;++r16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e}else if(this.cache.length>=16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e;return null},f.prototype.flush=function(){if(this.cache.length)return this.cache},e.createDecipher=function(t,e){var r=o[t.toLowerCase()];if(!r)throw new TypeError(\"invalid suite type\");var n=u(e,!1,r.key,r.iv);return l(t,n.key,n.iv)},e.createDecipheriv=l},function(t,e){e[\"des-ecb\"]={key:8,iv:0},e[\"des-cbc\"]=e.des={key:8,iv:8},e[\"des-ede3-cbc\"]=e.des3={key:24,iv:8},e[\"des-ede3\"]={key:24,iv:0},e[\"des-ede-cbc\"]={key:16,iv:8},e[\"des-ede\"]={key:16,iv:0}},function(t,e,r){(function(t){var n=r(96),i=r(212),o=r(213);var s={binary:!0,hex:!0,base64:!0};e.DiffieHellmanGroup=e.createDiffieHellmanGroup=e.getDiffieHellman=function(e){var r=new t(i[e].prime,\"hex\"),n=new t(i[e].gen,\"hex\");return new o(r,n)},e.createDiffieHellman=e.DiffieHellman=function e(r,i,a,c){return t.isBuffer(i)||void 0===s[i]?e(r,\"binary\",i,a):(i=i||\"binary\",c=c||\"binary\",a=a||new t([2]),t.isBuffer(a)||(a=new t(a,c)),\"number\"==typeof r?new o(n(r,a),a,!0):(t.isBuffer(r)||(r=new t(r,i)),new o(r,a,!0)))}}).call(this,r(3).Buffer)},function(t,e){},function(t,e){},function(t){t.exports={modp1:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff\"},modp2:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff\"},modp5:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff\"},modp14:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff\"},modp15:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff\"},modp16:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff\"},modp17:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff\"},modp18:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff\"}}},function(t,e,r){(function(e){var n=r(4),i=new(r(97)),o=new n(24),s=new n(11),a=new n(10),c=new n(3),u=new n(7),h=r(96),f=r(25);function l(t,r){return r=r||\"utf8\",e.isBuffer(t)||(t=new e(t,r)),this._pub=new n(t),this}function d(t,r){return r=r||\"utf8\",e.isBuffer(t)||(t=new e(t,r)),this._priv=new n(t),this}t.exports=m;var p={};function m(t,e,r){this.setGenerator(e),this.__prime=new n(t),this._prime=n.mont(this.__prime),this._primeLen=t.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,r?(this.setPublicKey=l,this.setPrivateKey=d):this._primeCode=8}function b(t,r){var n=new e(t.toArray());return r?n.toString(r):n}Object.defineProperty(m.prototype,\"verifyError\",{enumerable:!0,get:function(){return\"number\"!=typeof this._primeCode&&(this._primeCode=function(t,e){var r=e.toString(\"hex\"),n=[r,t.toString(16)].join(\"_\");if(n in p)return p[n];var f,l=0;if(t.isEven()||!h.simpleSieve||!h.fermatTest(t)||!i.test(t))return l+=1,l+=\"02\"===r||\"05\"===r?8:4,p[n]=l,l;switch(i.test(t.shrn(1))||(l+=2),r){case\"02\":t.mod(o).cmp(s)&&(l+=8);break;case\"05\":(f=t.mod(a)).cmp(c)&&f.cmp(u)&&(l+=8);break;default:l+=4}return p[n]=l,l}(this.__prime,this.__gen)),this._primeCode}}),m.prototype.generateKeys=function(){return this._priv||(this._priv=new n(f(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},m.prototype.computeSecret=function(t){var r=(t=(t=new n(t)).toRed(this._prime)).redPow(this._priv).fromRed(),i=new e(r.toArray()),o=this.getPrime();if(i.length0&&r.ishrn(n),r}function f(t,r,i){var o,s;do{for(o=new e(0);8*o.length=0;){var o;if(i.isOdd()){var s=i.andln(n-1);o=s>(n>>1)-1?(n>>1)-s:s,i.isubn(o)}else o=0;r.push(o);for(var a=0!==i.cmpn(0)&&0===i.andln(n-1)?e+1:1,c=1;c0||e.cmpn(-i)>0;){var o,s,a,c=t.andln(3)+n&3,u=e.andln(3)+i&3;3===c&&(c=-1),3===u&&(u=-1),o=0==(1&c)?0:3!=(a=t.andln(7)+n&7)&&5!==a||2!==u?c:-c,r[0].push(o),s=0==(1&u)?0:3!=(a=e.andln(7)+i&7)&&5!==a||2!==c?u:-u,r[1].push(s),2*n===o+1&&(n=1-n),2*i===s+1&&(i=1-i),t.iushrn(1),e.iushrn(1)}return r},n.cachedProperty=function(t,e,r){var n=\"_\"+e;t.prototype[e]=function(){return void 0!==this[n]?this[n]:this[n]=r.call(this)}},n.parseBytes=function(t){return\"string\"==typeof t?n.toArray(t,\"hex\"):t},n.intFromLE=function(t){return new i(t,\"hex\",\"le\")}},function(t,e,r){\"use strict\";var n=r(4),i=r(6).utils,o=i.getNAF,s=i.getJSF,a=i.assert;function c(t,e){this.type=t,this.p=new n(e.p,16),this.red=e.prime?n.red(e.prime):n.mont(this.p),this.zero=new n(0).toRed(this.red),this.one=new n(1).toRed(this.red),this.two=new n(2).toRed(this.red),this.n=e.n&&new n(e.n,16),this.g=e.g&&this.pointFromJSON(e.g,e.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4);var r=this.n&&this.p.div(this.n);!r||r.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function u(t,e){this.curve=t,this.type=e,this.precomputed=null}t.exports=c,c.prototype.point=function(){throw new Error(\"Not implemented\")},c.prototype.validate=function(){throw new Error(\"Not implemented\")},c.prototype._fixedNafMul=function(t,e){a(t.precomputed);var r=t._getDoubles(),n=o(e,1),i=(1<=c;e--)u=(u<<1)+n[e];s.push(u)}for(var h=this.jpoint(null,null,null),f=this.jpoint(null,null,null),l=i;l>0;l--){for(c=0;c=0;u--){for(e=0;u>=0&&0===s[u];u--)e++;if(u>=0&&e++,c=c.dblp(e),u<0)break;var h=s[u];a(0!==h),c=\"affine\"===t.type?h>0?c.mixedAdd(i[h-1>>1]):c.mixedAdd(i[-h-1>>1].neg()):h>0?c.add(i[h-1>>1]):c.add(i[-h-1>>1].neg())}return\"affine\"===t.type?c.toP():c},c.prototype._wnafMulAdd=function(t,e,r,n,i){for(var a=this._wnafT1,c=this._wnafT2,u=this._wnafT3,h=0,f=0;f=1;f-=2){var d=f-1,p=f;if(1===a[d]&&1===a[p]){var m=[e[d],null,null,e[p]];0===e[d].y.cmp(e[p].y)?(m[1]=e[d].add(e[p]),m[2]=e[d].toJ().mixedAdd(e[p].neg())):0===e[d].y.cmp(e[p].y.redNeg())?(m[1]=e[d].toJ().mixedAdd(e[p]),m[2]=e[d].add(e[p].neg())):(m[1]=e[d].toJ().mixedAdd(e[p]),m[2]=e[d].toJ().mixedAdd(e[p].neg()));var b=[-3,-1,-5,-7,0,7,5,1,3],g=s(r[d],r[p]);h=Math.max(g[0].length,h),u[d]=new Array(h),u[p]=new Array(h);for(var y=0;y=0;f--){for(var x=0;f>=0;){var S=!0;for(y=0;y=0&&x++,w=w.dblp(x),f<0)break;for(y=0;y0?A=c[y][C-1>>1]:C<0&&(A=c[y][-C-1>>1].neg()),w=\"affine\"===A.type?w.mixedAdd(A):w.add(A))}}for(f=0;f=Math.ceil((t.bitLength()+1)/e.step)},u.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],n=this,i=0;i=0&&(s=e,a=r),n.negative&&(n=n.neg(),i=i.neg()),s.negative&&(s=s.neg(),a=a.neg()),[{a:n,b:i},{a:s,b:a}]},u.prototype._endoSplit=function(t){var e=this.endo.basis,r=e[0],n=e[1],i=n.b.mul(t).divRound(this.n),o=r.b.neg().mul(t).divRound(this.n),s=i.mul(r.a),a=o.mul(n.a),c=i.mul(r.b),u=o.mul(n.b);return{k1:t.sub(s).sub(a),k2:c.add(u).neg()}},u.prototype.pointFromX=function(t,e){(t=new o(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr().redMul(t).redIAdd(t.redMul(this.a)).redIAdd(this.b),n=r.redSqrt();if(0!==n.redSqr().redSub(r).cmp(this.zero))throw new Error(\"invalid point\");var i=n.fromRed().isOdd();return(e&&!i||!e&&i)&&(n=n.redNeg()),this.point(t,n)},u.prototype.validate=function(t){if(t.inf)return!0;var e=t.x,r=t.y,n=this.a.redMul(e),i=e.redSqr().redMul(e).redIAdd(n).redIAdd(this.b);return 0===r.redSqr().redISub(i).cmpn(0)},u.prototype._endoWnafMulAdd=function(t,e,r){for(var n=this._endoWnafT1,i=this._endoWnafT2,o=0;o\":\"\"},h.prototype.isInfinity=function(){return this.inf},h.prototype.add=function(t){if(this.inf)return t;if(t.inf)return this;if(this.eq(t))return this.dbl();if(this.neg().eq(t))return this.curve.point(null,null);if(0===this.x.cmp(t.x))return this.curve.point(null,null);var e=this.y.redSub(t.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(t.x).redInvm()));var r=e.redSqr().redISub(this.x).redISub(t.x),n=e.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,n)},h.prototype.dbl=function(){if(this.inf)return this;var t=this.y.redAdd(this.y);if(0===t.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,r=this.x.redSqr(),n=t.redInvm(),i=r.redAdd(r).redIAdd(r).redIAdd(e).redMul(n),o=i.redSqr().redISub(this.x.redAdd(this.x)),s=i.redMul(this.x.redSub(o)).redISub(this.y);return this.curve.point(o,s)},h.prototype.getX=function(){return this.x.fromRed()},h.prototype.getY=function(){return this.y.fromRed()},h.prototype.mul=function(t){return t=new o(t,16),this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve.endo?this.curve._endoWnafMulAdd([this],[t]):this.curve._wnafMul(this,t)},h.prototype.mulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i):this.curve._wnafMulAdd(1,n,i,2)},h.prototype.jmulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i,!0):this.curve._wnafMulAdd(1,n,i,2,!0)},h.prototype.eq=function(t){return this===t||this.inf===t.inf&&(this.inf||0===this.x.cmp(t.x)&&0===this.y.cmp(t.y))},h.prototype.neg=function(t){if(this.inf)return this;var e=this.curve.point(this.x,this.y.redNeg());if(t&&this.precomputed){var r=this.precomputed,n=function(t){return t.neg()};e.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(n)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(n)}}}return e},h.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},s(f,a.BasePoint),u.prototype.jpoint=function(t,e,r){return new f(this,t,e,r)},f.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var t=this.z.redInvm(),e=t.redSqr(),r=this.x.redMul(e),n=this.y.redMul(e).redMul(t);return this.curve.point(r,n)},f.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},f.prototype.add=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.z.redSqr(),r=this.z.redSqr(),n=this.x.redMul(e),i=t.x.redMul(r),o=this.y.redMul(e.redMul(t.z)),s=t.y.redMul(r.redMul(this.z)),a=n.redSub(i),c=o.redSub(s);if(0===a.cmpn(0))return 0!==c.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=a.redSqr(),h=u.redMul(a),f=n.redMul(u),l=c.redSqr().redIAdd(h).redISub(f).redISub(f),d=c.redMul(f.redISub(l)).redISub(o.redMul(h)),p=this.z.redMul(t.z).redMul(a);return this.curve.jpoint(l,d,p)},f.prototype.mixedAdd=function(t){if(this.isInfinity())return t.toJ();if(t.isInfinity())return this;var e=this.z.redSqr(),r=this.x,n=t.x.redMul(e),i=this.y,o=t.y.redMul(e).redMul(this.z),s=r.redSub(n),a=i.redSub(o);if(0===s.cmpn(0))return 0!==a.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var c=s.redSqr(),u=c.redMul(s),h=r.redMul(c),f=a.redSqr().redIAdd(u).redISub(h).redISub(h),l=a.redMul(h.redISub(f)).redISub(i.redMul(u)),d=this.z.redMul(s);return this.curve.jpoint(f,l,d)},f.prototype.dblp=function(t){if(0===t)return this;if(this.isInfinity())return this;if(!t)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var e=this,r=0;r=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}},f.prototype.inspect=function(){return this.isInfinity()?\"\":\"\"},f.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},function(t,e,r){\"use strict\";var n=r(40),i=r(4),o=r(0),s=n.base,a=r(6).utils;function c(t){s.call(this,\"mont\",t),this.a=new i(t.a,16).toRed(this.red),this.b=new i(t.b,16).toRed(this.red),this.i4=new i(4).toRed(this.red).redInvm(),this.two=new i(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function u(t,e,r){s.BasePoint.call(this,t,\"projective\"),null===e&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new i(e,16),this.z=new i(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}o(c,s),t.exports=c,c.prototype.validate=function(t){var e=t.normalize().x,r=e.redSqr(),n=r.redMul(e).redAdd(r.redMul(this.a)).redAdd(e);return 0===n.redSqrt().redSqr().cmp(n)},o(u,s.BasePoint),c.prototype.decodePoint=function(t,e){return this.point(a.toArray(t,e),1)},c.prototype.point=function(t,e){return new u(this,t,e)},c.prototype.pointFromJSON=function(t){return u.fromJSON(this,t)},u.prototype.precompute=function(){},u.prototype._encode=function(){return this.getX().toArray(\"be\",this.curve.p.byteLength())},u.fromJSON=function(t,e){return new u(t,e[0],e[1]||t.one)},u.prototype.inspect=function(){return this.isInfinity()?\"\":\"\"},u.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},u.prototype.dbl=function(){var t=this.x.redAdd(this.z).redSqr(),e=this.x.redSub(this.z).redSqr(),r=t.redSub(e),n=t.redMul(e),i=r.redMul(e.redAdd(this.curve.a24.redMul(r)));return this.curve.point(n,i)},u.prototype.add=function(){throw new Error(\"Not supported on Montgomery curve\")},u.prototype.diffAdd=function(t,e){var r=this.x.redAdd(this.z),n=this.x.redSub(this.z),i=t.x.redAdd(t.z),o=t.x.redSub(t.z).redMul(r),s=i.redMul(n),a=e.z.redMul(o.redAdd(s).redSqr()),c=e.x.redMul(o.redISub(s).redSqr());return this.curve.point(a,c)},u.prototype.mul=function(t){for(var e=t.clone(),r=this,n=this.curve.point(null,null),i=[];0!==e.cmpn(0);e.iushrn(1))i.push(e.andln(1));for(var o=i.length-1;o>=0;o--)0===i[o]?(r=r.diffAdd(n,this),n=n.dbl()):(n=r.diffAdd(n,this),r=r.dbl());return n},u.prototype.mulAdd=function(){throw new Error(\"Not supported on Montgomery curve\")},u.prototype.jumlAdd=function(){throw new Error(\"Not supported on Montgomery curve\")},u.prototype.eq=function(t){return 0===this.getX().cmp(t.getX())},u.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},u.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},function(t,e,r){\"use strict\";var n=r(40),i=r(6),o=r(4),s=r(0),a=n.base,c=i.utils.assert;function u(t){this.twisted=1!=(0|t.a),this.mOneA=this.twisted&&-1==(0|t.a),this.extended=this.mOneA,a.call(this,\"edwards\",t),this.a=new o(t.a,16).umod(this.red.m),this.a=this.a.toRed(this.red),this.c=new o(t.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new o(t.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),c(!this.twisted||0===this.c.fromRed().cmpn(1)),this.oneC=1==(0|t.c)}function h(t,e,r,n,i){a.BasePoint.call(this,t,\"projective\"),null===e&&null===r&&null===n?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new o(e,16),this.y=new o(r,16),this.z=n?new o(n,16):this.curve.one,this.t=i&&new o(i,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}s(u,a),t.exports=u,u.prototype._mulA=function(t){return this.mOneA?t.redNeg():this.a.redMul(t)},u.prototype._mulC=function(t){return this.oneC?t:this.c.redMul(t)},u.prototype.jpoint=function(t,e,r,n){return this.point(t,e,r,n)},u.prototype.pointFromX=function(t,e){(t=new o(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr(),n=this.c2.redSub(this.a.redMul(r)),i=this.one.redSub(this.c2.redMul(this.d).redMul(r)),s=n.redMul(i.redInvm()),a=s.redSqrt();if(0!==a.redSqr().redSub(s).cmp(this.zero))throw new Error(\"invalid point\");var c=a.fromRed().isOdd();return(e&&!c||!e&&c)&&(a=a.redNeg()),this.point(t,a)},u.prototype.pointFromY=function(t,e){(t=new o(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr(),n=r.redSub(this.c2),i=r.redMul(this.d).redMul(this.c2).redSub(this.a),s=n.redMul(i.redInvm());if(0===s.cmp(this.zero)){if(e)throw new Error(\"invalid point\");return this.point(this.zero,t)}var a=s.redSqrt();if(0!==a.redSqr().redSub(s).cmp(this.zero))throw new Error(\"invalid point\");return a.fromRed().isOdd()!==e&&(a=a.redNeg()),this.point(a,t)},u.prototype.validate=function(t){if(t.isInfinity())return!0;t.normalize();var e=t.x.redSqr(),r=t.y.redSqr(),n=e.redMul(this.a).redAdd(r),i=this.c2.redMul(this.one.redAdd(this.d.redMul(e).redMul(r)));return 0===n.cmp(i)},s(h,a.BasePoint),u.prototype.pointFromJSON=function(t){return h.fromJSON(this,t)},u.prototype.point=function(t,e,r,n){return new h(this,t,e,r,n)},h.fromJSON=function(t,e){return new h(t,e[0],e[1],e[2])},h.prototype.inspect=function(){return this.isInfinity()?\"\":\"\"},h.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&(0===this.y.cmp(this.z)||this.zOne&&0===this.y.cmp(this.curve.c))},h.prototype._extDbl=function(){var t=this.x.redSqr(),e=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var n=this.curve._mulA(t),i=this.x.redAdd(this.y).redSqr().redISub(t).redISub(e),o=n.redAdd(e),s=o.redSub(r),a=n.redSub(e),c=i.redMul(s),u=o.redMul(a),h=i.redMul(a),f=s.redMul(o);return this.curve.point(c,u,f,h)},h.prototype._projDbl=function(){var t,e,r,n=this.x.redAdd(this.y).redSqr(),i=this.x.redSqr(),o=this.y.redSqr();if(this.curve.twisted){var s=(u=this.curve._mulA(i)).redAdd(o);if(this.zOne)t=n.redSub(i).redSub(o).redMul(s.redSub(this.curve.two)),e=s.redMul(u.redSub(o)),r=s.redSqr().redSub(s).redSub(s);else{var a=this.z.redSqr(),c=s.redSub(a).redISub(a);t=n.redSub(i).redISub(o).redMul(c),e=s.redMul(u.redSub(o)),r=s.redMul(c)}}else{var u=i.redAdd(o);a=this.curve._mulC(this.z).redSqr(),c=u.redSub(a).redSub(a);t=this.curve._mulC(n.redISub(u)).redMul(c),e=this.curve._mulC(u).redMul(i.redISub(o)),r=u.redMul(c)}return this.curve.point(t,e,r)},h.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},h.prototype._extAdd=function(t){var e=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),r=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),n=this.t.redMul(this.curve.dd).redMul(t.t),i=this.z.redMul(t.z.redAdd(t.z)),o=r.redSub(e),s=i.redSub(n),a=i.redAdd(n),c=r.redAdd(e),u=o.redMul(s),h=a.redMul(c),f=o.redMul(c),l=s.redMul(a);return this.curve.point(u,h,l,f)},h.prototype._projAdd=function(t){var e,r,n=this.z.redMul(t.z),i=n.redSqr(),o=this.x.redMul(t.x),s=this.y.redMul(t.y),a=this.curve.d.redMul(o).redMul(s),c=i.redSub(a),u=i.redAdd(a),h=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(o).redISub(s),f=n.redMul(c).redMul(h);return this.curve.twisted?(e=n.redMul(u).redMul(s.redSub(this.curve._mulA(o))),r=c.redMul(u)):(e=n.redMul(u).redMul(s.redSub(o)),r=this.curve._mulC(c).redMul(u)),this.curve.point(f,e,r)},h.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},h.prototype.mul=function(t){return this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},h.prototype.mulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!1)},h.prototype.jmulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!0)},h.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},h.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},h.prototype.getX=function(){return this.normalize(),this.x.fromRed()},h.prototype.getY=function(){return this.normalize(),this.y.fromRed()},h.prototype.eq=function(t){return this===t||0===this.getX().cmp(t.getX())&&0===this.getY().cmp(t.getY())},h.prototype.eqXToP=function(t){var e=t.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(e))return!0;for(var r=t.clone(),n=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(e.redIAdd(n),0===this.x.cmp(e))return!0}},h.prototype.toP=h.prototype.normalize,h.prototype.mixedAdd=h.prototype.add},function(t,e,r){\"use strict\";var n,i=e,o=r(58),s=r(6),a=s.utils.assert;function c(t){\"short\"===t.type?this.curve=new s.curve.short(t):\"edwards\"===t.type?this.curve=new s.curve.edwards(t):this.curve=new s.curve.mont(t),this.g=this.curve.g,this.n=this.curve.n,this.hash=t.hash,a(this.g.validate(),\"Invalid curve\"),a(this.g.mul(this.n).isInfinity(),\"Invalid curve, G*N != O\")}function u(t,e){Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:function(){var r=new c(e);return Object.defineProperty(i,t,{configurable:!0,enumerable:!0,value:r}),r}})}i.PresetCurve=c,u(\"p192\",{type:\"short\",prime:\"p192\",p:\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\",a:\"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc\",b:\"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1\",n:\"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831\",hash:o.sha256,gRed:!1,g:[\"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012\",\"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811\"]}),u(\"p224\",{type:\"short\",prime:\"p224\",p:\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\",a:\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe\",b:\"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4\",n:\"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d\",hash:o.sha256,gRed:!1,g:[\"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21\",\"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34\"]}),u(\"p256\",{type:\"short\",prime:null,p:\"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff\",a:\"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc\",b:\"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b\",n:\"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551\",hash:o.sha256,gRed:!1,g:[\"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296\",\"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5\"]}),u(\"p384\",{type:\"short\",prime:null,p:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff\",a:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc\",b:\"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef\",n:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973\",hash:o.sha384,gRed:!1,g:[\"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7\",\"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f\"]}),u(\"p521\",{type:\"short\",prime:null,p:\"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\",a:\"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc\",b:\"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00\",n:\"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409\",hash:o.sha512,gRed:!1,g:[\"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66\",\"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650\"]}),u(\"curve25519\",{type:\"mont\",prime:\"p25519\",p:\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",a:\"76d06\",b:\"1\",n:\"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",hash:o.sha256,gRed:!1,g:[\"9\"]}),u(\"ed25519\",{type:\"edwards\",prime:\"p25519\",p:\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",a:\"-1\",c:\"1\",d:\"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3\",n:\"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",hash:o.sha256,gRed:!1,g:[\"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\",\"6666666666666666666666666666666666666666666666666666666666666658\"]});try{n=r(229)}catch(t){n=void 0}u(\"secp256k1\",{type:\"short\",prime:\"k256\",p:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\",a:\"0\",b:\"7\",n:\"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141\",h:\"1\",hash:o.sha256,beta:\"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\",lambda:\"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72\",basis:[{a:\"3086d221a7d46bcde86c90e49284eb15\",b:\"-e4437ed6010e88286f547fa90abfe4c3\"},{a:\"114ca50f7a8e2f3f657c1108d9d44cfd8\",b:\"3086d221a7d46bcde86c90e49284eb15\"}],gRed:!1,g:[\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",n]})},function(t,e,r){\"use strict\";e.sha1=r(224),e.sha224=r(225),e.sha256=r(101),e.sha384=r(226),e.sha512=r(102)},function(t,e,r){\"use strict\";var n=r(13),i=r(32),o=r(100),s=n.rotl32,a=n.sum32,c=n.sum32_5,u=o.ft_1,h=i.BlockHash,f=[1518500249,1859775393,2400959708,3395469782];function l(){if(!(this instanceof l))return new l;h.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}n.inherits(l,h),t.exports=l,l.blockSize=512,l.outSize=160,l.hmacStrength=80,l.padLength=64,l.prototype._update=function(t,e){for(var r=this.W,n=0;n<16;n++)r[n]=t[e+n];for(;nthis.blockSize&&(t=(new this.Hash).update(t).digest()),i(t.length<=this.blockSize);for(var e=t.length;e0))return a.iaddn(1),this.keyFromPrivate(a)}},u.prototype._truncateToN=function(t,e){var r=8*t.byteLength()-this.n.bitLength();return r>0&&(t=t.ushrn(r)),!e&&t.cmp(this.n)>=0?t.sub(this.n):t},u.prototype.sign=function(t,e,r,o){\"object\"==typeof r&&(o=r,r=null),o||(o={}),e=this.keyFromPrivate(e,r),t=this._truncateToN(new n(t,16));for(var s=this.n.byteLength(),a=e.getPrivate().toArray(\"be\",s),u=t.toArray(\"be\",s),h=new i({hash:this.hash,entropy:a,nonce:u,pers:o.pers,persEnc:o.persEnc||\"utf8\"}),f=this.n.sub(new n(1)),l=0;;l++){var d=o.k?o.k(l):new n(h.generate(this.n.byteLength()));if(!((d=this._truncateToN(d,!0)).cmpn(1)<=0||d.cmp(f)>=0)){var p=this.g.mul(d);if(!p.isInfinity()){var m=p.getX(),b=m.umod(this.n);if(0!==b.cmpn(0)){var g=d.invm(this.n).mul(b.mul(e.getPrivate()).iadd(t));if(0!==(g=g.umod(this.n)).cmpn(0)){var y=(p.getY().isOdd()?1:0)|(0!==m.cmp(b)?2:0);return o.canonical&&g.cmp(this.nh)>0&&(g=this.n.sub(g),y^=1),new c({r:b,s:g,recoveryParam:y})}}}}}},u.prototype.verify=function(t,e,r,i){t=this._truncateToN(new n(t,16)),r=this.keyFromPublic(r,i);var o=(e=new c(e,\"hex\")).r,s=e.s;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;if(s.cmpn(1)<0||s.cmp(this.n)>=0)return!1;var a,u=s.invm(this.n),h=u.mul(t).umod(this.n),f=u.mul(o).umod(this.n);return this.curve._maxwellTrick?!(a=this.g.jmulAdd(h,r.getPublic(),f)).isInfinity()&&a.eqXToP(o):!(a=this.g.mulAdd(h,r.getPublic(),f)).isInfinity()&&0===a.getX().umod(this.n).cmp(o)},u.prototype.recoverPubKey=function(t,e,r,i){s((3&r)===r,\"The recovery param is more than two bits\"),e=new c(e,i);var o=this.n,a=new n(t),u=e.r,h=e.s,f=1&r,l=r>>1;if(u.cmp(this.curve.p.umod(this.curve.n))>=0&&l)throw new Error(\"Unable to find sencond key candinate\");u=l?this.curve.pointFromX(u.add(this.curve.n),f):this.curve.pointFromX(u,f);var d=e.r.invm(o),p=o.sub(a).mul(d).umod(o),m=h.mul(d).umod(o);return this.g.mulAdd(p,u,m)},u.prototype.getKeyRecoveryParam=function(t,e,r,n){if(null!==(e=new c(e,n)).recoveryParam)return e.recoveryParam;for(var i=0;i<4;i++){var o;try{o=this.recoverPubKey(t,e,i)}catch(t){continue}if(o.eq(r))return i}throw new Error(\"Unable to find valid recovery factor\")}},function(t,e,r){\"use strict\";var n=r(58),i=r(99),o=r(9);function s(t){if(!(this instanceof s))return new s(t);this.hash=t.hash,this.predResist=!!t.predResist,this.outLen=this.hash.outSize,this.minEntropy=t.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var e=i.toArray(t.entropy,t.entropyEnc||\"hex\"),r=i.toArray(t.nonce,t.nonceEnc||\"hex\"),n=i.toArray(t.pers,t.persEnc||\"hex\");o(e.length>=this.minEntropy/8,\"Not enough entropy. Minimum is: \"+this.minEntropy+\" bits\"),this._init(e,r,n)}t.exports=s,s.prototype._init=function(t,e,r){var n=t.concat(e).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i=this.minEntropy/8,\"Not enough entropy. Minimum is: \"+this.minEntropy+\" bits\"),this._update(t.concat(r||[])),this._reseed=1},s.prototype.generate=function(t,e,r,n){if(this._reseed>this.reseedInterval)throw new Error(\"Reseed is required\");\"string\"!=typeof e&&(n=r,r=e,e=null),r&&(r=i.toArray(r,n||\"hex\"),this._update(r));for(var o=[];o.length\"}},function(t,e,r){\"use strict\";var n=r(4),i=r(6).utils,o=i.assert;function s(t,e){if(t instanceof s)return t;this._importDER(t,e)||(o(t.r&&t.s,\"Signature without r or s\"),this.r=new n(t.r,16),this.s=new n(t.s,16),void 0===t.recoveryParam?this.recoveryParam=null:this.recoveryParam=t.recoveryParam)}function a(){this.place=0}function c(t,e){var r=t[e.place++];if(!(128&r))return r;for(var n=15&r,i=0,o=0,s=e.place;o>>3);for(t.push(128|r);--r;)t.push(e>>>(r<<3)&255);t.push(e)}}t.exports=s,s.prototype._importDER=function(t,e){t=i.toArray(t,e);var r=new a;if(48!==t[r.place++])return!1;if(c(t,r)+r.place!==t.length)return!1;if(2!==t[r.place++])return!1;var o=c(t,r),s=t.slice(r.place,o+r.place);if(r.place+=o,2!==t[r.place++])return!1;var u=c(t,r);if(t.length!==u+r.place)return!1;var h=t.slice(r.place,u+r.place);return 0===s[0]&&128&s[1]&&(s=s.slice(1)),0===h[0]&&128&h[1]&&(h=h.slice(1)),this.r=new n(s),this.s=new n(h),this.recoveryParam=null,!0},s.prototype.toDER=function(t){var e=this.r.toArray(),r=this.s.toArray();for(128&e[0]&&(e=[0].concat(e)),128&r[0]&&(r=[0].concat(r)),e=u(e),r=u(r);!(r[0]||128&r[1]);)r=r.slice(1);var n=[2];h(n,e.length),(n=n.concat(e)).push(2),h(n,r.length);var o=n.concat(r),s=[48];return h(s,o.length),s=s.concat(o),i.encode(s,t)}},function(t,e,r){\"use strict\";var n=r(58),i=r(6),o=i.utils,s=o.assert,a=o.parseBytes,c=r(235),u=r(236);function h(t){if(s(\"ed25519\"===t,\"only tested with ed25519 so far\"),!(this instanceof h))return new h(t);t=i.curves[t].curve;this.curve=t,this.g=t.g,this.g.precompute(t.n.bitLength()+1),this.pointClass=t.point().constructor,this.encodingLength=Math.ceil(t.n.bitLength()/8),this.hash=n.sha512}t.exports=h,h.prototype.sign=function(t,e){t=a(t);var r=this.keyFromSecret(e),n=this.hashInt(r.messagePrefix(),t),i=this.g.mul(n),o=this.encodePoint(i),s=this.hashInt(o,r.pubBytes(),t).mul(r.priv()),c=n.add(s).umod(this.curve.n);return this.makeSignature({R:i,S:c,Rencoded:o})},h.prototype.verify=function(t,e,r){t=a(t),e=this.makeSignature(e);var n=this.keyFromPublic(r),i=this.hashInt(e.Rencoded(),n.pubBytes(),t),o=this.g.mul(e.S());return e.R().add(n.pub().mul(i)).eq(o)},h.prototype.hashInt=function(){for(var t=this.hash(),e=0;e=e)throw new Error(\"invalid sig\")}t.exports=function(t,r,c,u,h){var f=o(c);if(\"ec\"===f.type){if(\"ecdsa\"!==u&&\"ecdsa/rsa\"!==u)throw new Error(\"wrong public key type\");return function(t,e,r){var n=s[r.data.algorithm.curve.join(\".\")];if(!n)throw new Error(\"unknown curve \"+r.data.algorithm.curve.join(\".\"));var o=new i(n),a=r.data.subjectPrivateKey.data;return o.verify(e,t,a)}(t,r,f)}if(\"dsa\"===f.type){if(\"dsa\"!==u)throw new Error(\"wrong public key type\");return function(t,e,r){var i=r.data.p,s=r.data.q,c=r.data.g,u=r.data.pub_key,h=o.signature.decode(t,\"der\"),f=h.s,l=h.r;a(f,s),a(l,s);var d=n.mont(i),p=f.invm(s);return 0===c.toRed(d).redPow(new n(e).mul(p).mod(s)).fromRed().mul(u.toRed(d).redPow(l.mul(p).mod(s)).fromRed()).mod(i).mod(s).cmp(l)}(t,r,f)}if(\"rsa\"!==u&&\"ecdsa/rsa\"!==u)throw new Error(\"wrong public key type\");r=e.concat([h,r]);for(var l=f.modulus.byteLength(),d=[1],p=0;r.length+d.length+2r-l-2)throw new Error(\"message too long\");var d=f.alloc(r-n-l-2),p=r-h-1,m=i(h),b=a(f.concat([u,d,f.alloc(1,1),e],p),s(m,p)),g=a(m,s(b,h));return new c(f.concat([f.alloc(1),g,b],r))}(p,e);else if(1===l)d=function(t,e,r){var n,o=e.length,s=t.modulus.byteLength();if(o>s-11)throw new Error(\"message too long\");n=r?f.alloc(s-o-3,255):function(t){var e,r=f.allocUnsafe(t),n=0,o=i(2*t),s=0;for(;n=0)throw new Error(\"data too long for modulus\")}return r?h(d,p):u(d,p)}},function(t,e,r){var n=r(41),i=r(108),o=r(109),s=r(4),a=r(57),c=r(30),u=r(110),h=r(2).Buffer;t.exports=function(t,e,r){var f;f=t.padding?t.padding:r?1:4;var l,d=n(t),p=d.modulus.byteLength();if(e.length>p||new s(e).cmp(d.modulus)>=0)throw new Error(\"decryption error\");l=r?u(new s(e),d):a(e,d);var m=h.alloc(p-l.length);if(l=h.concat([m,l],p),4===f)return function(t,e){var r=t.modulus.byteLength(),n=c(\"sha1\").update(h.alloc(0)).digest(),s=n.length;if(0!==e[0])throw new Error(\"decryption error\");var a=e.slice(1,s+1),u=e.slice(s+1),f=o(a,i(u,s)),l=o(u,i(f,r-s-1));if(function(t,e){t=h.from(t),e=h.from(e);var r=0,n=t.length;t.length!==e.length&&(r++,n=Math.min(t.length,e.length));var i=-1;for(;++i=e.length){o++;break}var s=e.slice(2,i-1);(\"0002\"!==n.toString(\"hex\")&&!r||\"0001\"!==n.toString(\"hex\")&&r)&&o++;s.length<8&&o++;if(o)throw new Error(\"decryption error\");return e.slice(i)}(0,l,r);if(3===f)return l;throw new Error(\"unknown padding\")}},function(t,e,r){\"use strict\";(function(t,n){function i(){throw new Error(\"secure random number generation not supported by this browser\\nuse chrome, FireFox or Internet Explorer 11\")}var o=r(2),s=r(25),a=o.Buffer,c=o.kMaxLength,u=t.crypto||t.msCrypto,h=Math.pow(2,32)-1;function f(t,e){if(\"number\"!=typeof t||t!=t)throw new TypeError(\"offset must be a number\");if(t>h||t<0)throw new TypeError(\"offset must be a uint32\");if(t>c||t>e)throw new RangeError(\"offset out of range\")}function l(t,e,r){if(\"number\"!=typeof t||t!=t)throw new TypeError(\"size must be a number\");if(t>h||t<0)throw new TypeError(\"size must be a uint32\");if(t+e>r||t>c)throw new RangeError(\"buffer too small\")}function d(t,e,r,i){if(n.browser){var o=t.buffer,a=new Uint8Array(o,e,r);return u.getRandomValues(a),i?void n.nextTick(function(){i(null,t)}):t}if(!i)return s(r).copy(t,e),t;s(r,function(r,n){if(r)return i(r);n.copy(t,e),i(null,t)})}u&&u.getRandomValues||!n.browser?(e.randomFill=function(e,r,n,i){if(!(a.isBuffer(e)||e instanceof t.Uint8Array))throw new TypeError('\"buf\" argument must be a Buffer or Uint8Array');if(\"function\"==typeof r)i=r,r=0,n=e.length;else if(\"function\"==typeof n)i=n,n=e.length-r;else if(\"function\"!=typeof i)throw new TypeError('\"cb\" argument must be a function');return f(r,e.length),l(n,r,e.length),d(e,r,n,i)},e.randomFillSync=function(e,r,n){void 0===r&&(r=0);if(!(a.isBuffer(e)||e instanceof t.Uint8Array))throw new TypeError('\"buf\" argument must be a Buffer or Uint8Array');f(r,e.length),void 0===n&&(n=e.length-r);return l(n,r,e.length),d(e,r,n)}):(e.randomFill=i,e.randomFillSync=i)}).call(this,r(8),r(5))},function(t,e,r){const n=r(7),i=r(18),{isUndefined:o}=r(1),s=r(10)(\"knex:tx\");t.exports=class extends i{begin(){return n.resolve()}commit(t,e){return this._completed=!0,t.commitAsync().then(()=>e).then(this._resolver,this._rejecter)}release(t,e){return this._resolver(e)}rollback(t,e){return this._completed=!0,s(\"%s: rolling back\",this.txid),t.rollbackAsync().throw(e).catch(t=>{if(o(t)){if(this.doNotRejectOnRollback)return void this._resolver();t=new Error(`Transaction rejected with non-error: ${t}`)}return this._rejecter(t)})}acquireConnection(t,e){const r=t&&t.connection;return new n((t,e)=>{try{t(r||this.client.acquireConnection())}catch(t){e(t)}}).then(t=>(t.__knexTxId=this.txid,t)).then(t=>(this.outerTx||t.setAutoCommit(!1),t)).then(async t=>{try{return await e(t)}finally{s(\"%s: releasing connection\",this.txid),t.setAutoCommit(!0),r?s(\"%s: not releasing external connection\",this.txid):this.client.releaseConnection(t)}})}}},function(t,e,r){const n=r(0),i=r(22),o=r(20),s=r(59);function a(){i.apply(this,arguments)}n(a,i),a.prototype.renameTable=function(t,e){const r=s.renameTableAndAutoIncrementTrigger(this.client.logger,t,e);this.pushQuery(r)},a.prototype.hasTable=function(t){this.pushQuery({sql:\"select TABLE_NAME from USER_TABLES where TABLE_NAME = \"+this.formatter.parameter(t),output:t=>t.length>0})},a.prototype.hasColumn=function(t,e){const r=\"select COLUMN_NAME from USER_TAB_COLUMNS \"+`where TABLE_NAME = ${this.formatter.parameter(t)} `+`and COLUMN_NAME = ${this.formatter.parameter(e)}`;this.pushQuery({sql:r,output:t=>t.length>0})},a.prototype.dropSequenceIfExists=function(t){this.pushQuery(o.wrapSqlWithCatch(`drop sequence ${this.formatter.wrap(t)}`,-2289))},a.prototype._dropRelatedSequenceIfExists=function(t){const e=o.generateCombinedName(this.client.logger,\"seq\",t);this.dropSequenceIfExists(e)},a.prototype.dropTable=function(t){this.pushQuery(`drop table ${this.formatter.wrap(t)}`),this._dropRelatedSequenceIfExists(t)},a.prototype.dropTableIfExists=function(t){this.pushQuery(o.wrapSqlWithCatch(`drop table ${this.formatter.wrap(t)}`,-942)),this._dropRelatedSequenceIfExists(t)},t.exports=a},function(t,e,r){const n=r(0),i=r(49),{toArray:o}=r(1);function s(){i.apply(this,arguments)}n(s,i),s.prototype.checkIn=function(){return this._modifiers.checkIn=o(arguments),this},t.exports=s},function(t,e,r){const n=r(0),i=r(20),o=r(23),s=r(11),a=r(59),{map:c}=r(1);function u(){o.apply(this,arguments)}n(u,o),Object.assign(u.prototype,{addColumns(t,e){if(t.sql.length>0){e=e||this.addColumnsPrefix;const r=c(t.sql,t=>t);let n=`${this.lowerCase?\"alter table \":\"ALTER TABLE \"}${this.tableName()} ${e}`;t.sql.length>1?n+=`(${r.join(\", \")})`:n+=r.join(\", \"),this.pushQuery({sql:n,bindings:t.bindings})}},renameColumn(t,e){const r=this.tableName().slice(1,-1);return this.pushQuery(a.renameColumnTrigger(this.client.logger,r,t,e))},compileAdd(t){const e=this.formatter.wrap(t),r=this.prefixArray(\"add column\",this.getColumns(t));return this.pushQuery({sql:`alter table ${e} ${r.join(\", \")}`})},createQuery(t,e){const r=`create table ${this.tableName()} (${t.sql.join(\", \")})`;this.pushQuery({sql:e?i.wrapSqlWithCatch(r,-955):r,bindings:t.bindings}),this.single.comment&&this.comment(this.single.comment)},comment(t){this.pushQuery(`comment on table ${this.tableName()} is '${t}'`)},addColumnsPrefix:\"add \",alterColumnsPrefix:\"modify \",dropColumn(){const t=s.normalizeArr.apply(null,arguments);this.pushQuery(`alter table ${this.tableName()} drop (${this.formatter.columnize(t)})`)},changeType(){},_indexCommand(t,e,r){return this.formatter.wrap(i.generateCombinedName(this.client.logger,t,e,r))},primary(t,e){e=e?this.formatter.wrap(e):this.formatter.wrap(`${this.tableNameRaw}_pkey`),this.pushQuery(`alter table ${this.tableName()} add constraint ${e} primary key (${this.formatter.columnize(t)})`)},dropPrimary(t){t=t?this.formatter.wrap(t):this.formatter.wrap(this.tableNameRaw+\"_pkey\"),this.pushQuery(`alter table ${this.tableName()} drop constraint ${t}`)},index(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`create index ${e} on ${this.tableName()}`+\" (\"+this.formatter.columnize(t)+\")\")},dropIndex(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"index\",this.tableNameRaw,t),this.pushQuery(`drop index ${e}`)},unique(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} add constraint ${e}`+\" unique (\"+this.formatter.columnize(t)+\")\")},dropUnique(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"unique\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop constraint ${e}`)},dropForeign(t,e){e=e?this.formatter.wrap(e):this._indexCommand(\"foreign\",this.tableNameRaw,t),this.pushQuery(`alter table ${this.tableName()} drop constraint ${e}`)}}),t.exports=u},function(t,e){},function(t,e,r){(function(e,n){const i=r(1),o=r(0),s=r(263),a=r(264),{BlobHelper:c,ReturningHelper:u,isConnectionError:h}=r(60),f=r(7),l=r(27),{promisify:d}=r(15),p=r(265),m=r(79),b=r(80);function g(){m.apply(this,arguments),this.driver&&(e.env.UV_THREADPOOL_SIZE=e.env.UV_THREADPOOL_SIZE||1,e.env.UV_THREADPOOL_SIZE=parseInt(e.env.UV_THREADPOOL_SIZE)+this.driver.poolMax)}o(g,m),g.prototype.driverName=\"oracledb\",g.prototype._driver=function(){const t=this,e=r(113);return t.fetchAsString=[],this.config.fetchAsString&&i.isArray(this.config.fetchAsString)&&this.config.fetchAsString.forEach(function(r){i.isString(r)&&(r=r.toUpperCase(),e[r]&&(\"NUMBER\"!==r&&\"DATE\"!==r&&\"CLOB\"!==r&&this.logger.warn('Only \"date\", \"number\" and \"clob\" are supported for fetchAsString'),t.fetchAsString.push(e[r])))}),e},g.prototype.queryCompiler=function(){return new s(this,...arguments)},g.prototype.columnCompiler=function(){return new a(this,...arguments)},g.prototype.formatter=function(){return new _(this,...arguments)},g.prototype.transaction=function(){return new p(this,...arguments)},g.prototype.prepBindings=function(t){return i.map(t,t=>t instanceof c&&this.driver?{type:this.driver.BLOB,dir:this.driver.BIND_OUT}:t instanceof u&&this.driver?{type:this.driver.STRING,dir:this.driver.BIND_OUT}:\"boolean\"==typeof t?t?1:0:t)},g.prototype.acquireRawConnection=function(){const t=this;return new f(function(e,r){const n=t.connectionSettings.externalAuth?{externalAuth:t.connectionSettings.externalAuth}:{user:t.connectionSettings.user,password:t.connectionSettings.password};n.connectString=t.connectionSettings.connectString||t.connectionSettings.host+\"/\"+t.connectionSettings.database,t.connectionSettings.prefetchRowCount&&(n.prefetchRows=t.connectionSettings.prefetchRowCount),i.isUndefined(t.connectionSettings.stmtCacheSize)||(n.stmtCacheSize=t.connectionSettings.stmtCacheSize),t.driver.fetchAsString=t.fetchAsString,t.driver.getConnection(n,function(n,i){if(n)return r(n);i.commitAsync=function(){return new f((t,e)=>{if(i.isTransaction)return t();this.commit(function(r){if(r)return e(r);t()})})},i.rollbackAsync=function(){return new f((t,e)=>{this.rollback(function(r){if(r)return e(r);t()})})};const o=d(function(e,r,n,o){if((n=n||{}).outFormat=t.driver.OUT_FORMAT_OBJECT||t.driver.OBJECT,!n.outFormat)throw new Error(\"not found oracledb.outFormat constants\");n.resultSet?i.execute(e,r||[],n,function(t,e){if(t)return h(t)&&(i.close().catch(function(t){}),i.__knex__disposed=t),o(t);const r={rows:[],resultSet:e.resultSet},n=function(t,e,i){e.getRows(i,function(s,a){if(s)h(s)&&(t.close().catch(function(t){}),t.__knex__disposed=s),e.close(function(){return o(s)});else{if(0===a.length)return o(null,r);if(a.length>0){if(a.length!==i)return r.rows=r.rows.concat(a),o(null,r);r.rows=r.rows.concat(a),n(t,e,i)}}})};n(i,e.resultSet,100)}):i.execute(e,r||[],n,function(t,e){return t?(h(t)&&(i.close().catch(function(t){}),i.__knex__disposed=t),o(t)):o(null,e)})});i.executeAsync=function(t,e,r){return o(t,e,r).then(async t=>{const e=()=>t.resultSet?d(t.resultSet.close).call(t.resultSet):Promise.resolve(),r=[];if(t.rows&&Array.isArray(t.rows))for(let e=0;e{}),t}return await e(),t})},e(i)})})},g.prototype.destroyRawConnection=function(t){return t.release()},g.prototype._query=function(t,e){if(!e.sql)throw new Error(\"The query is empty\");const r={autoCommit:!1};return\"select\"===e.method&&(r.resultSet=!0),f.resolve(t.executeAsync(e.sql,e.bindings,r)).then(async function(r){let n=i.flatten(r.outBinds);if(e.response=r.rows||[],e.rowsAffected=r.rows?r.rows.rowsAffected:r.rowsAffected,\"raw\"===e.method&&n.length>0)return{response:n};if(\"update\"===e.method){const t=e.rowsAffected.length||e.rowsAffected,r=[],o=[],s=e=>(function(r,i){const s=i*t;o.push(n[e+s])});for(let n=0;n{let o=\"string\"===e?\"\":n.alloc(0);t.on(\"error\",function(t){i(t)}),t.on(\"data\",function(t){\"string\"===e?o+=t:o=n.concat([o,t])}),t.on(\"end\",function(){r(o)})})}(t,i)};class _ extends b{parameter(t){return\"function\"==typeof t?this.outputQuery(this.compileCallback(t),!0):t instanceof c?\"EMPTY_BLOB()\":this.unwrapRaw(t,!0)||\"?\"}}t.exports=g}).call(this,r(5),r(3).Buffer)},function(t,e,r){(function(e){const n=r(1),i=r(0),o=r(111),s=r(60).ReturningHelper,a=r(60).BlobHelper;function c(t,e){o.call(this,t,e)}i(c,o),n.assign(c.prototype,{insert:function(){const t=this,e=this._prepOutbindings(this.single.insert,this.single.returning),r=e.outBinding,i=e.returning,o=e.values;if(Array.isArray(o)&&1===o.length&&n.isEmpty(o[0]))return this._addReturningToSqlAndConvert(\"insert into \"+this.tableName+\" (\"+this.formatter.wrap(this.single.returning)+\") values (default)\",r[0],this.tableName,i);if(n.isEmpty(this.single.insert)&&\"function\"!=typeof this.single.insert)return\"\";const c=this._prepInsert(o),u={};if(n.isString(c))return this._addReturningToSqlAndConvert(\"insert into \"+this.tableName+\" \"+c,r[0],this.tableName,i);if(1===c.values.length)return this._addReturningToSqlAndConvert(\"insert into \"+this.tableName+\" (\"+this.formatter.columnize(c.columns)+\") values (\"+this.formatter.parameterize(c.values[0])+\")\",r[0],this.tableName,i);const h=0===c.columns.length;return u.returning=i,u.sql=\"begin \"+n.map(c.values,function(e,i){const o=h?\"\":t.formatter.parameterize(e,t.client.valueForUndefined);let u=\"insert into \"+t.tableName;u+=h?\" (\"+t.formatter.wrap(t.single.returning)+\") values (default)\":\" (\"+t.formatter.columnize(c.columns)+\") values (\"+o+\")\";let f=\"\",l=\"\",d=\"\",p=\"\";n.each(e,function(t){t instanceof a||(d+=\" ?,\")}),d=d.slice(0,-1),n.each(r[i],function(e){const r=e.columnName||e;if(f+=t.formatter.wrap(r)+\",\",l+=\" ?,\",p+=\" out ?,\",e instanceof a)return t.formatter.bindings.push(e);t.formatter.bindings.push(new s(r))}),f=f.slice(0,-1),l=l.slice(0,-1),p=p.slice(0,-1),f&&l&&(u+=\" returning \"+f+\" into\"+l),u=t.formatter.client.positionBindings(u);const m=o.replace(\"DEFAULT, \",\"\").replace(\", DEFAULT\",\"\").replace(\"EMPTY_BLOB(), \",\"\").replace(\", EMPTY_BLOB()\",\"\");return\"execute immediate '\"+u.replace(/'/g,\"''\")+(m||e?\"' using \":\"\")+m+(m&&p?\",\":\"\")+p+\";\"}).join(\" \")+\"end;\",u.outBinding=r,\"*\"===i[0]&&(u.returningSql=function(){return\"select * from \"+t.tableName+\" where ROWID in (\"+this.outBinding.map(function(t,e){return\":\"+(e+1)}).join(\", \")+\") order by case ROWID \"+this.outBinding.map(function(t,e){return\"when CHARTOROWID(:\"+(e+1)+\") then \"+e}).join(\" \")+\" end\"}),u},_addReturningToSqlAndConvert:function(t,e,r,i){const o=this,c={sql:t};if(!e)return c;const u=Array.isArray(e)?e:[e];let h=\"\",f=\"\";return n.each(u,function(t){const e=t.columnName||t;if(h+=o.formatter.wrap(e)+\",\",f+=\"?,\",t instanceof a)return o.formatter.bindings.push(t);o.formatter.bindings.push(new s(e))}),c.sql=t,h=h.slice(0,-1),f=f.slice(0,-1),h&&f&&(c.sql+=\" returning \"+h+\" into \"+f),c.outBinding=[e],\"*\"===i[0]&&(c.returningSql=function(){return\"select * from \"+o.tableName+\" where ROWID = :1\"}),c.returning=i,c},_prepOutbindings:function(t,r){const i={};let o=t||[],s=r||[];!Array.isArray(o)&&n.isPlainObject(t)&&(o=[o]),s&&!Array.isArray(s)&&(s=[s]);const c=[];return n.each(o,function(t,r){\"*\"===s[0]?c[r]=[\"ROWID\"]:c[r]=n.clone(s),n.each(t,function(i,s){if(i instanceof e){t[s]=new a(s,i);const e=c[r].indexOf(s);e>=0&&(c[r].splice(e,1),t[s].returning=!0),c[r].push(t[s])}n.isUndefined(i)&&delete o[r][s]})}),i.returning=s,i.outBinding=c,i.values=o,i},update:function(){const t=this,e={},r=this._prepOutbindings(this.single.update||this.single.counter,this.single.returning),i=r.outBinding,o=r.returning,c=this._prepUpdate(this.single.update),u=this.where();let h=\"\",f=\"\";return n.isEmpty(c)&&\"function\"!=typeof this.single.update?\"\":(n.each(i,function(e){n.each(e,function(e){const r=e.columnName||e;if(h+=t.formatter.wrap(r)+\",\",f+=\" ?,\",e instanceof a)return t.formatter.bindings.push(e);t.formatter.bindings.push(new s(r))})}),h=h.slice(0,-1),f=f.slice(0,-1),e.outBinding=i,e.returning=o,e.sql=\"update \"+this.tableName+\" set \"+c.join(\", \")+(u?\" \"+u:\"\"),i.length&&!n.isEmpty(i[0])&&(e.sql+=\" returning \"+h+\" into\"+f),\"*\"===o[0]&&(e.returningSql=function(){let e=\"select * from \"+t.tableName;const r=this.rowsAffected.length||this.rowsAffected;let n=\" where ROWID in (\",i=\") order by case ROWID \";for(let t=0;te).then(this._resolver,this._rejecter)}release(t,e){return this._resolver(e)}rollback(t,e){const r=this;return this._completed=!0,s(\"%s: rolling back\",this.txid),t.rollbackAsync().timeout(5e3).catch(i.TimeoutError,function(t){r._rejecter(t)}).then(function(){if(n(e)){if(r.doNotRejectOnRollback)return void r._resolver();e=new Error(`Transaction rejected with non-error: ${e}`)}r._rejecter(e)})}savepoint(t){return this.query(t,`SAVEPOINT ${this.txid}`)}acquireConnection(t,e){const r=t&&t.connection,n=this;return new i((t,e)=>{try{this.client.acquireConnection().then(e=>{e.__knexTxId=this.txid,e.isTransaction=!0,t(e)}).catch(e)}catch(t){e(t)}}).then(async t=>{try{return await e(t)}finally{s(\"%s: releasing connection\",this.txid),t.isTransaction=!1;try{await t.commitAsync()}catch(t){n._rejecter(t)}finally{r?s(\"%s: not releasing external connection\",n.txid):await n.client.releaseConnection(t)}}})}}},function(t,e){},function(t,e,r){const n=r(0),i=r(114),{map:o}=r(1),s=r(268),a=r(269),c=r(270),u=r(271),h=r(272),f=r(273);function l(t){i.apply(this,arguments)}n(l,i),Object.assign(l.prototype,{transaction(){return new s(this,...arguments)},queryCompiler(){return new a(this,...arguments)},columnBuilder(){return new c(this,...arguments)},columnCompiler(){return new u(this,...arguments)},tableCompiler(){return new h(this,...arguments)},schemaCompiler(){return new f(this,...arguments)},dialect:\"redshift\",driverName:\"pg-redshift\",_driver:()=>r(119),processResponse(t,e){const r=t.response;return t.output?t.output.call(e,r):\"raw\"===t.method?r:\"SELECT\"===r.command?\"first\"===t.method?r.rows[0]:\"pluck\"===t.method?o(r.rows,t.pluck):r.rows:\"INSERT\"===r.command||\"UPDATE\"===r.command||\"DELETE\"===r.command?r.rowCount:r}}),t.exports=l},function(t,e,r){const n=r(18);t.exports=class extends n{savepoint(t){return this.trxClient.logger(\"Redshift does not support savepoints.\"),Promise.resolve()}release(t,e){return this.trxClient.logger(\"Redshift does not support savepoints.\"),Promise.resolve()}rollbackTo(t,e){return this.trxClient.logger(\"Redshift does not support savepoints.\"),Promise.resolve()}}},function(t,e,r){const n=r(0),i=r(19),o=r(115),{reduce:s,identity:a}=r(1);function c(t,e){o.call(this,t,e)}n(c,o),Object.assign(c.prototype,{truncate(){return`truncate ${this.tableName.toLowerCase()}`},insert(){const t=i.prototype.insert.apply(this,arguments);return\"\"===t?t:(this._slightReturn(),{sql:t})},update(){const t=i.prototype.update.apply(this,arguments);return this._slightReturn(),{sql:t}},del(){const t=i.prototype.del.apply(this,arguments);return this._slightReturn(),{sql:t}},_slightReturn(){this.single.isReturning&&this.client.logger.warn(\"insert/update/delete returning is not supported by redshift dialect\")},forUpdate(){return this.client.logger.warn(\"table lock is not supported by redshift dialect\"),\"\"},forShare(){return this.client.logger.warn(\"lock for share is not supported by redshift dialect\"),\"\"},columnInfo(){const t=this.single.columnInfo;let e=this.single.schema;const r=this.client.customWrapIdentifier(this.single.table,a);e&&(e=this.client.customWrapIdentifier(e,a));let n=\"select * from information_schema.columns where table_name = ? and table_catalog = ?\";const i=[r.toLowerCase(),this.client.database().toLowerCase()];return e?(n+=\" and table_schema = ?\",i.push(e)):n+=\" and table_schema = current_schema()\",{sql:n,bindings:i,output(e){const r=s(e.rows,function(t,e){return t[e.column_name]={type:e.data_type,maxLength:e.character_maximum_length,nullable:\"YES\"===e.is_nullable,defaultValue:e.column_default},t},{});return t&&r[t]||r}}}}),t.exports=c},function(t,e,r){const n=r(0),i=r(49);function o(){i.apply(this,arguments)}n(o,i),o.prototype.primary=function(){return this.notNullable(),i.prototype.primary.apply(this,arguments)},o.prototype.index=function(){return this.client.logger.warn(\"Redshift does not support the creation of indexes.\"),this},t.exports=o},function(t,e,r){const n=r(0),i=r(116);function o(){i.apply(this,arguments)}n(o,i),Object.assign(o.prototype,{bigincrements:\"bigint identity(1,1) primary key not null\",binary:\"varchar(max)\",bit:t=>!1!==t.length?`char(${t.length})`:\"char(1)\",blob:\"varchar(max)\",enu:\"varchar(255)\",enum:\"varchar(255)\",increments:\"integer identity(1,1) primary key not null\",json:\"varchar(max)\",jsonb:\"varchar(max)\",longblob:\"varchar(max)\",mediumblob:\"varchar(16777218)\",set:\"text\",text:\"varchar(max)\",datetime:t=>t?\"timestamp\":\"timestamptz\",timestamp:t=>t?\"timestamp\":\"timestamptz\",tinyblob:\"varchar(256)\",uuid:\"char(36)\",varbinary:\"varchar(max)\",bigint:\"bigint\",bool:\"boolean\",double:\"double precision\",floating:\"real\",smallint:\"smallint\",tinyint:\"smallint\",comment(t){this.pushAdditional(function(){this.pushQuery(`comment on column ${this.tableCompiler.tableName()}.`+this.formatter.wrap(this.args[0])+\" is \"+(t?`'${t}'`:\"NULL\"))},t)}}),t.exports=o},function(t,e,r){const n=r(0),{has:i}=r(1),o=r(117);function s(){o.apply(this,arguments)}n(s,o),s.prototype.index=function(t,e,r){this.client.logger.warn(\"Redshift does not support the creation of indexes.\")},s.prototype.dropIndex=function(t,e){this.client.logger.warn(\"Redshift does not support the deletion of indexes.\")},s.prototype.createQuery=function(t,e){let r=(e?\"create table if not exists \":\"create table \")+this.tableName()+\" (\"+t.sql.join(\", \")+\")\";this.single.inherits&&(r+=` like (${this.formatter.wrap(this.single.inherits)})`),this.pushQuery({sql:r,bindings:t.bindings}),i(this.single,\"comment\")&&this.comment(this.single.comment)},s.prototype.primary=function(t,e){e=e?this.formatter.wrap(e):this.formatter.wrap(`${this.tableNameRaw}_pkey`),t.constructor!==Array&&(t=[t]);const r=this.grouped.columns;if(r)for(let e=0;e\"columns\"===r.grouping&&r.builder&&\"add\"===r.builder._method&&r.builder._args&&r.builder._args.indexOf(t[e])>-1);if(n&&(n=n.builder),!(n&&n._modifiers&&n._modifiers.nullable&&!1===n._modifiers.nullable[0]))return n?this.client.logger.warn(\"Redshift does not allow primary keys to contain nullable columns.\"):this.client.logger.warn(\"Redshift does not allow primary keys to contain nonexistent columns.\")}return this.pushQuery(`alter table ${this.tableName()} add constraint ${e} primary key (${this.formatter.columnize(t)})`)},s.prototype.addColumns=function(t,e,r){if(e===this.alterColumnsPrefix)o.prototype.addColumns.call(this,t,e,r);else{e=e||this.addColumnsPrefix,r=r||this.getColumns();for(const t of r){const r=this.tableName(),n=t.compileColumn();this.pushQuery({sql:`alter table ${r} ${e}${n}`,bindings:[]})}}},t.exports=s},function(t,e,r){const n=r(0),i=r(118);function o(){i.apply(this,arguments)}n(o,i),t.exports=o},function(t,e,r){const n=r(7),i=r(0),{isUndefined:o,map:s,defaults:a}=r(1),{promisify:c}=r(15),u=r(21),h=r(275),f=r(276),l=r(277),d=r(278),p=r(279),m=r(280);function b(t){u.call(this,t),o(t.useNullAsDefault)&&this.logger.warn(\"sqlite does not support inserting default values. Set the `useNullAsDefault` flag to hide this warning. (see docs http://knexjs.org/#Builder-insert).\")}i(b,u),Object.assign(b.prototype,{dialect:\"sqlite3\",driverName:\"sqlite3\",_driver:()=>r(281),schemaCompiler(){return new f(this,...arguments)},queryCompiler(){return new h(this,...arguments)},columnCompiler(){return new l(this,...arguments)},tableCompiler(){return new d(this,...arguments)},ddl(t,e,r){return new p(this,t,e,r)},wrapIdentifierImpl:t=>\"*\"!==t?`\\`${t.replace(/`/g,\"``\")}\\``:\"*\",acquireRawConnection(){return new n((t,e)=>{const r=new this.driver.Database(this.connectionSettings.filename,n=>{if(n)return e(n);t(r)})})},destroyRawConnection:async t=>c(e=>t.close(e))(),_query(t,e){const{method:r}=e;let i;switch(r){case\"insert\":case\"update\":case\"counter\":case\"del\":i=\"run\";break;default:i=\"all\"}return new n(function(r,n){if(!t||!t[i])return n(new Error(`Error calling ${i} on connection.`));t[i](e.sql,e.bindings,function(t,i){return t?n(t):(e.response=i,e.context=this,r(e))})})},_stream(t,e,r){const i=this;return new n(function(n,o){return r.on(\"error\",o),r.on(\"end\",n),i._query(t,e).then(t=>t.response).then(t=>t.forEach(t=>r.write(t))).catch(function(t){r.emit(\"error\",t)}).then(function(){r.end()})})},processResponse(t,e){const r=t.context;let{response:n}=t;if(t.output)return t.output.call(e,n);switch(t.method){case\"select\":case\"pluck\":case\"first\":return\"pluck\"===t.method&&(n=s(n,t.pluck)),\"first\"===t.method?n[0]:n;case\"insert\":return[r.lastID];case\"del\":case\"update\":case\"counter\":return r.changes;default:return n}},poolDefaults(){return a({min:1,max:1},u.prototype.poolDefaults.call(this))},formatter(){return new m(this,...arguments)}}),t.exports=b},function(t,e,r){const n=r(0),i=r(19),{assign:o,each:s,isEmpty:a,isString:c,noop:u,reduce:h,identity:f}=r(1);function l(t,e){i.call(this,t,e);const{returning:r}=this.single;r&&this.client.logger.warn(\".returning() is not supported by sqlite3 and will not have any effect.\")}function d(){return\"\"}n(l,i),o(l.prototype,{forShare:d,forUpdate:d,insert(){const t=this.single.insert||[];let e=this.with()+`insert into ${this.tableName} `;if(Array.isArray(t)){if(0===t.length)return\"\";if(1===t.length&&t[0]&&a(t[0]))return e+this._emptyInsertValue}else if(\"object\"==typeof t&&a(t))return e+this._emptyInsertValue;const r=this._prepInsert(t);if(c(r))return e+r;if(0===r.columns.length)return\"\";if(e+=`(${this.formatter.columnize(r.columns)})`,null!==this.client.valueForUndefined&&s(r.values,t=>{s(t,t=>{if(void 0===t)throw new TypeError(\"`sqlite` does not support inserting default values. Specify values explicitly or use the `useNullAsDefault` config flag. (see docs http://knexjs.org/#Builder-insert).\")})}),1===r.values.length){return e+` values (${this.formatter.parameterize(r.values[0],this.client.valueForUndefined)})`}const n=[];let i=-1;for(;++it.length>0})},s.prototype.hasColumn=function(t,e){this.pushQuery({sql:`PRAGMA table_info(${this.formatter.wrap(t)})`,output(t){return o(t,t=>this.client.wrapIdentifier(t.name.toLowerCase())===this.client.wrapIdentifier(e.toLowerCase()))}})},s.prototype.renameTable=function(t,e){this.pushQuery(`alter table ${this.formatter.wrap(t)} rename to ${this.formatter.wrap(e)}`)},t.exports=s},function(t,e,r){const n=r(0),i=r(24);function o(){i.apply(this,arguments),this.modifiers=[\"nullable\",\"defaultTo\"]}n(o,i),o.prototype.double=o.prototype.decimal=o.prototype.floating=\"float\",o.prototype.timestamp=\"datetime\",o.prototype.enu=function(t){return`text check (${this.formatter.wrap(this.args[0])} in ('${t.join(\"', '\")}'))`},o.prototype.json=\"json\",t.exports=o},function(t,e,r){const n=r(0),i=r(23),{filter:o,values:s}=r(1);function a(){i.apply(this,arguments),this.primaryKey=void 0}n(a,i),a.prototype.createQuery=function(t,e){let r=(e?\"create table if not exists \":\"create table \")+this.tableName()+\" (\"+t.sql.join(\", \");r+=this.foreignKeys()||\"\",r+=this.primaryKeys()||\"\",r+=\")\",this.pushQuery(r)},a.prototype.addColumns=function(t,e){if(e)throw new Error(\"Sqlite does not support alter column.\");for(let e=0,r=t.sql.length;e0&&t[0].args.length>0){const e=t[0].args[0];let r=t[0].args[1]||\"\";return r&&(r=\" constraint \"+this.formatter.wrap(r)),`,${r} primary key (${this.formatter.columnize(e)})`}},a.prototype.foreignKeys=function(){let t=\"\";const e=o(this.grouped.alterTable||[],{method:\"foreign\"});for(let r=0,n=e.length;rt}n(m.prototype,{tableName(){return this.formatter(this.tableNameRaw,t=>t)},getColumn:async function(t){const e=o(this.pragma,e=>this.client.wrapIdentifier(e.name).toLowerCase()===this.client.wrapIdentifier(t).toLowerCase());if(!e)throw new Error(`The column ${t} is not in the ${this.tableName()} table`);return e},getTableSql(){return this.trx.disableProcessing(),this.trx.raw(`SELECT name, sql FROM sqlite_master WHERE type=\"table\" AND name=\"${this.tableName()}\"`).then(t=>(this.trx.enableProcessing(),t))},renameTable:async function(){return this.trx.raw(`ALTER TABLE \"${this.tableName()}\" RENAME TO \"${this.alteredName}\"`)},dropOriginal(){return this.trx.raw(`DROP TABLE \"${this.tableName()}\"`)},dropTempTable(){return this.trx.raw(`DROP TABLE \"${this.alteredName}\"`)},copyData(){return this.trx.raw(`SELECT * FROM \"${this.tableName()}\"`).then(t=>this.insertChunked(20,this.alteredName,s,t))},reinsertData(t){return this.trx.raw(`SELECT * FROM \"${this.alteredName}\"`).then(e=>this.insertChunked(20,this.tableName(),t,e))},async insertChunked(t,e,r,n){r=r||s;const i=p(n,t);for(const t of i)await this.trx.queryBuilder().table(e).insert(a(t,r))},createTempTable(t){return this.trx.raw(t.sql.replace(this.tableName(),this.alteredName))},_doReplace(t,e,r){const n=t.replace(/\\s+/g,\" \"),i=n.match(/^CREATE TABLE\\s+(\\S+)\\s*\\((.*)\\)/),o=i[1],s=i[2];if(!s)throw new Error(\"No column definitions in this statement!\");let a=0,c=[],u=0,h=0;const p=s.length;for(h=0;h{let e=t.trim().split(\" \");const n=[new RegExp(`\\`${m}\\``,\"i\"),new RegExp(`\"${m}\"`,\"i\"),new RegExp(`'${m}'`,\"i\"),new RegExp(`\\\\[${m}\\\\]`,\"i\")];m.match(/^\\S+$/)&&n.push(new RegExp(`\\\\b${m}\\\\b`,\"i\"));const i=t=>n.reduce((t,e)=>t.replace(e,r),t);if((t=>f(n,e=>t.match(e)))(e[0]))return r?(e[0]=r,e.join(\" \")):\"\";const s=/constraint/i.test(e[0])?2:0;if(/primary|unique/i.test(e[s])){const e=t.replace(/\\(.*\\)/,i);return e!==t&&d(r)?\"\":e}if(/foreign/.test(e[s])){const n=i((e=t.split(/ references /i))[0]);if(e[0]!==n){if(d(r))return\"\";e[0]=n}if(e[1].slice(0,o.length)===o){const t=e[1].replace(/\\(.*\\)/,i);if(e[1]!==t){if(d(r))return\"\";e[1]=t}}return e.join(\" references \")}return t})).filter(l(d))).length)throw new Error(\"Unable to drop last column from table\");return n.replace(/\\(.*\\)/,()=>`(${c.join(\", \")})`).replace(/,\\s*([,)])/,\"$1\")},renameColumn:async function(t,e){return this.client.transaction(async r=>{this.trx=r;const n=await this.getColumn(t),i=await this.getTableSql(n),o=this.client.wrapIdentifier(t),s=this.client.wrapIdentifier(e),a=i[0],h=this._doReplace(a.sql,o,s);if(i===h)throw new Error(\"Unable to find the column to change\");const{from:f,to:l}=u(this.client.postProcessResponse(u({from:t,to:e})));return this.reinsertMapped(a,h,t=>(t[l]=t[f],c(t,f)))},{connection:this.connection})},dropColumn:async function(t){return this.client.transaction(e=>(this.trx=e,Promise.all(t.map(t=>this.getColumn(t))).then(()=>this.getTableSql()).then(e=>{const r=e[0];let n=r.sql;if(t.forEach(t=>{const e=this.client.wrapIdentifier(t);n=this._doReplace(n,e,\"\")}),e===n)throw new Error(\"Unable to find the column to change\");const i=Object.keys(this.client.postProcessResponse(h(t.map(t=>[t,t]))));return this.reinsertMapped(r,n,t=>c(t,...i))})),{connection:this.connection})},reinsertMapped(t,e,r){return Promise.resolve().then(()=>this.createTempTable(t)).then(()=>this.copyData()).then(()=>this.dropOriginal()).then(()=>this.trx.raw(e)).then(()=>this.reinsertData(r)).then(()=>this.dropTempTable())}}),t.exports=m},function(t,e,r){const n=r(29),i=r(14);t.exports=class extends n{values(t){return Array.isArray(t)?Array.isArray(t[0])?`( values ${t.map(t=>`(${this.parameterize(t)})`).join(\", \")})`:`(${this.parameterize(t)})`:t instanceof i?`(${this.parameter(t)})`:this.parameter(t)}}},function(t,e){t.exports=sqlite3}]);","extractedComments":[]} \ No newline at end of file diff --git a/node_modules/.cache/terser-webpack-plugin/index-v5/4c/05/7eea19d89972a5155d16260e736a4bb680508347463b756b6f36981e164c b/node_modules/.cache/terser-webpack-plugin/index-v5/4c/05/7eea19d89972a5155d16260e736a4bb680508347463b756b6f36981e164c new file mode 100644 index 0000000..fe9ba5c --- /dev/null +++ b/node_modules/.cache/terser-webpack-plugin/index-v5/4c/05/7eea19d89972a5155d16260e736a4bb680508347463b756b6f36981e164c @@ -0,0 +1,2 @@ + +9a33838bc351e55ffa949dcbecd94ad22cd5a3da {"key":"{\"terser\":\"3.10.12\",\"terser-webpack-plugin\":\"1.1.0\",\"terser-webpack-plugin-options\":{\"test\":/\\.js(\\?.*)?$/i,\"warningsFilter\":() => true,\"extractComments\":false,\"sourceMap\":false,\"cache\":true,\"cacheKeys\":defaultCacheKeys => defaultCacheKeys,\"parallel\":true,\"terserOptions\":{\"output\":{\"comments\":/^\\**!|@preserve|@license|@cc_on/i}}},\"path\":\"\\u002Fhome\\u002Frui\\u002Fcode\\u002Fpersonal\\u002Fdijkstra-app\\u002Fbackend-dijkstra\\u002Fdist\\u002Fbundle.js\",\"hash\":\"76e9314883582c8fc84477275058c8b9\"}","integrity":"sha512-dDrZgY6riWmSXdgjzX6vs8KOVr9ojlYaMKthhmtcE/ngUJcigFF2SBxqsSIxe9YEf6dPrgey0iW40S0T9Zov2Q==","time":1602263429292,"size":603960} \ No newline at end of file diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE new file mode 100644 index 0000000..9bcfa9d --- /dev/null +++ b/node_modules/abbrev/LICENSE @@ -0,0 +1,46 @@ +This software is dual-licensed under the ISC and MIT licenses. +You may use this software under EITHER of the following licenses. + +---------- + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------- + +Copyright Isaac Z. Schlueter and 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/abbrev/README.md b/node_modules/abbrev/README.md new file mode 100644 index 0000000..99746fe --- /dev/null +++ b/node_modules/abbrev/README.md @@ -0,0 +1,23 @@ +# abbrev-js + +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev). + +Usage: + + var abbrev = require("abbrev"); + abbrev("foo", "fool", "folding", "flop"); + + // returns: + { fl: 'flop' + , flo: 'flop' + , flop: 'flop' + , fol: 'folding' + , fold: 'folding' + , foldi: 'folding' + , foldin: 'folding' + , folding: 'folding' + , foo: 'foo' + , fool: 'fool' + } + +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands. diff --git a/node_modules/abbrev/abbrev.js b/node_modules/abbrev/abbrev.js new file mode 100644 index 0000000..7b1dc5d --- /dev/null +++ b/node_modules/abbrev/abbrev.js @@ -0,0 +1,61 @@ +module.exports = exports = abbrev.abbrev = abbrev + +abbrev.monkeyPatch = monkeyPatch + +function monkeyPatch () { + Object.defineProperty(Array.prototype, 'abbrev', { + value: function () { return abbrev(this) }, + enumerable: false, configurable: true, writable: true + }) + + Object.defineProperty(Object.prototype, 'abbrev', { + value: function () { return abbrev(Object.keys(this)) }, + enumerable: false, configurable: true, writable: true + }) +} + +function abbrev (list) { + if (arguments.length !== 1 || !Array.isArray(list)) { + list = Array.prototype.slice.call(arguments, 0) + } + for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { + args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) + } + + // sort them lexicographically, so that they're next to their nearest kin + args = args.sort(lexSort) + + // walk through each, seeing how much it has in common with the next and previous + var abbrevs = {} + , prev = "" + for (var i = 0, l = args.length ; i < l ; i ++) { + var current = args[i] + , next = args[i + 1] || "" + , nextMatches = true + , prevMatches = true + if (current === next) continue + for (var j = 0, cl = current.length ; j < cl ; j ++) { + var curChar = current.charAt(j) + nextMatches = nextMatches && curChar === next.charAt(j) + prevMatches = prevMatches && curChar === prev.charAt(j) + if (!nextMatches && !prevMatches) { + j ++ + break + } + } + prev = current + if (j === cl) { + abbrevs[current] = current + continue + } + for (var a = current.substr(0, j) ; j <= cl ; j ++) { + abbrevs[a] = current + a += current.charAt(j) + } + } + return abbrevs +} + +function lexSort (a, b) { + return a === b ? 0 : a > b ? 1 : -1 +} diff --git a/node_modules/abbrev/package.json b/node_modules/abbrev/package.json new file mode 100644 index 0000000..a132e8b --- /dev/null +++ b/node_modules/abbrev/package.json @@ -0,0 +1,60 @@ +{ + "_args": [ + [ + "abbrev@1.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "abbrev@1.1.1", + "_id": "abbrev@1.1.1", + "_inBundle": false, + "_integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "_location": "/abbrev", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "abbrev@1.1.1", + "name": "abbrev", + "escapedName": "abbrev", + "rawSpec": "1.1.1", + "saveSpec": null, + "fetchSpec": "1.1.1" + }, + "_requiredBy": [ + "/nopt", + "/touch/nopt" + ], + "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "_spec": "1.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "bugs": { + "url": "https://github.com/isaacs/abbrev-js/issues" + }, + "description": "Like ruby's abbrev module, but in js", + "devDependencies": { + "tap": "^10.1" + }, + "files": [ + "abbrev.js" + ], + "homepage": "https://github.com/isaacs/abbrev-js#readme", + "license": "ISC", + "main": "abbrev.js", + "name": "abbrev", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test.js --100" + }, + "version": "1.1.1" +} diff --git a/node_modules/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md new file mode 100644 index 0000000..0bf0417 --- /dev/null +++ b/node_modules/accepts/HISTORY.md @@ -0,0 +1,236 @@ +1.3.7 / 2019-04-29 +================== + + * deps: negotiator@0.6.2 + - Fix sorting charset, encoding, and language with extra parameters + +1.3.6 / 2019-04-28 +================== + + * deps: mime-types@~2.1.24 + - deps: mime-db@~1.40.0 + +1.3.5 / 2018-02-28 +================== + + * deps: mime-types@~2.1.18 + - deps: mime-db@~1.33.0 + +1.3.4 / 2017-08-22 +================== + + * deps: mime-types@~2.1.16 + - deps: mime-db@~1.29.0 + +1.3.3 / 2016-05-02 +================== + + * deps: mime-types@~2.1.11 + - deps: mime-db@~1.23.0 + * deps: negotiator@0.6.1 + - perf: improve `Accept` parsing speed + - perf: improve `Accept-Charset` parsing speed + - perf: improve `Accept-Encoding` parsing speed + - perf: improve `Accept-Language` parsing speed + +1.3.2 / 2016-03-08 +================== + + * deps: mime-types@~2.1.10 + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + - deps: mime-db@~1.22.0 + +1.3.1 / 2016-01-19 +================== + + * deps: mime-types@~2.1.9 + - deps: mime-db@~1.21.0 + +1.3.0 / 2015-09-29 +================== + + * deps: mime-types@~2.1.7 + - deps: mime-db@~1.19.0 + * deps: negotiator@0.6.0 + - Fix including type extensions in parameters in `Accept` parsing + - Fix parsing `Accept` parameters with quoted equals + - Fix parsing `Accept` parameters with quoted semicolons + - Lazy-load modules from main entry point + - perf: delay type concatenation until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove closures getting spec properties + - perf: remove a closure from media type parsing + - perf: remove property delete from media type parsing + +1.2.13 / 2015-09-06 +=================== + + * deps: mime-types@~2.1.6 + - deps: mime-db@~1.18.0 + +1.2.12 / 2015-07-30 +=================== + + * deps: mime-types@~2.1.4 + - deps: mime-db@~1.16.0 + +1.2.11 / 2015-07-16 +=================== + + * deps: mime-types@~2.1.3 + - deps: mime-db@~1.15.0 + +1.2.10 / 2015-07-01 +=================== + + * deps: mime-types@~2.1.2 + - deps: mime-db@~1.14.0 + +1.2.9 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - perf: fix deopt during mapping + +1.2.8 / 2015-06-07 +================== + + * deps: mime-types@~2.1.0 + - deps: mime-db@~1.13.0 + * perf: avoid argument reassignment & argument slice + * perf: avoid negotiator recursive construction + * perf: enable strict mode + * perf: remove unnecessary bitwise operator + +1.2.7 / 2015-05-10 +================== + + * deps: negotiator@0.5.3 + - Fix media type parameter matching to be case-insensitive + +1.2.6 / 2015-05-07 +================== + + * deps: mime-types@~2.0.11 + - deps: mime-db@~1.9.1 + * deps: negotiator@0.5.2 + - Fix comparing media types with quoted values + - Fix splitting media types with quoted commas + +1.2.5 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - deps: mime-db@~1.8.0 + +1.2.4 / 2015-02-14 +================== + + * Support Node.js 0.6 + * deps: mime-types@~2.0.9 + - deps: mime-db@~1.7.0 + * deps: negotiator@0.5.1 + - Fix preference sorting to be stable for long acceptable lists + +1.2.3 / 2015-01-31 +================== + + * deps: mime-types@~2.0.8 + - deps: mime-db@~1.6.0 + +1.2.2 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - deps: mime-db@~1.5.0 + +1.2.1 / 2014-12-30 +================== + + * deps: mime-types@~2.0.5 + - deps: mime-db@~1.3.1 + +1.2.0 / 2014-12-19 +================== + + * deps: negotiator@0.5.0 + - Fix list return order when large accepted list + - Fix missing identity encoding when q=0 exists + - Remove dynamic building of Negotiator class + +1.1.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - deps: mime-db@~1.3.0 + +1.1.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - deps: mime-db@~1.2.0 + +1.1.2 / 2014-10-14 +================== + + * deps: negotiator@0.4.9 + - Fix error when media type has invalid parameter + +1.1.1 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - deps: mime-db@~1.1.0 + * deps: negotiator@0.4.8 + - Fix all negotiations to be case-insensitive + - Stable sort preferences of same quality according to client order + +1.1.0 / 2014-09-02 +================== + + * update `mime-types` + +1.0.7 / 2014-07-04 +================== + + * Fix wrong type returned from `type` when match after unknown extension + +1.0.6 / 2014-06-24 +================== + + * deps: negotiator@0.4.7 + +1.0.5 / 2014-06-20 +================== + + * fix crash when unknown extension given + +1.0.4 / 2014-06-19 +================== + + * use `mime-types` + +1.0.3 / 2014-06-11 +================== + + * deps: negotiator@0.4.6 + - Order by specificity when quality is the same + +1.0.2 / 2014-05-29 +================== + + * Fix interpretation when header not in request + * deps: pin negotiator@0.4.5 + +1.0.1 / 2014-01-18 +================== + + * Identity encoding isn't always acceptable + * deps: negotiator@~0.4.0 + +1.0.0 / 2013-12-27 +================== + + * Genesis diff --git a/node_modules/accepts/LICENSE b/node_modules/accepts/LICENSE new file mode 100644 index 0000000..0616607 --- /dev/null +++ b/node_modules/accepts/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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/accepts/README.md b/node_modules/accepts/README.md new file mode 100644 index 0000000..66a2f54 --- /dev/null +++ b/node_modules/accepts/README.md @@ -0,0 +1,142 @@ +# accepts + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). +Extracted from [koa](https://www.npmjs.com/package/koa) for general use. + +In addition to negotiator, it allows: + +- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` + as well as `('text/html', 'application/json')`. +- Allows type shorthands such as `json`. +- Returns `false` when no types match +- Treats non-existent headers as `*` + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install accepts +``` + +## API + + + +```js +var accepts = require('accepts') +``` + +### accepts(req) + +Create a new `Accepts` object for the given `req`. + +#### .charset(charsets) + +Return the first accepted charset. If nothing in `charsets` is accepted, +then `false` is returned. + +#### .charsets() + +Return the charsets that the request accepts, in the order of the client's +preference (most preferred first). + +#### .encoding(encodings) + +Return the first accepted encoding. If nothing in `encodings` is accepted, +then `false` is returned. + +#### .encodings() + +Return the encodings that the request accepts, in the order of the client's +preference (most preferred first). + +#### .language(languages) + +Return the first accepted language. If nothing in `languages` is accepted, +then `false` is returned. + +#### .languages() + +Return the languages that the request accepts, in the order of the client's +preference (most preferred first). + +#### .type(types) + +Return the first accepted type (and it is returned as the same text as what +appears in the `types` array). If nothing in `types` is accepted, then `false` +is returned. + +The `types` array can contain full MIME types or file extensions. Any value +that is not a full MIME types is passed to `require('mime-types').lookup`. + +#### .types() + +Return the types that the request accepts, in the order of the client's +preference (most preferred first). + +## Examples + +### Simple type negotiation + +This simple example shows how to use `accepts` to return a different typed +respond body based on what the client wants to accept. The server lists it's +preferences in order and will get back the best match between the client and +server. + +```js +var accepts = require('accepts') +var http = require('http') + +function app (req, res) { + var accept = accepts(req) + + // the order of this list is significant; should be server preferred order + switch (accept.type(['json', 'html'])) { + case 'json': + res.setHeader('Content-Type', 'application/json') + res.write('{"hello":"world!"}') + break + case 'html': + res.setHeader('Content-Type', 'text/html') + res.write('hello, world!') + break + default: + // the fallback is text/plain, so no need to specify it above + res.setHeader('Content-Type', 'text/plain') + res.write('hello, world!') + break + } + + res.end() +} + +http.createServer(app).listen(3000) +``` + +You can test this out with the cURL program: +```sh +curl -I -H'Accept: text/html' http://localhost:3000/ +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master +[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master +[node-version-image]: https://badgen.net/npm/node/accepts +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/accepts +[npm-url]: https://npmjs.org/package/accepts +[npm-version-image]: https://badgen.net/npm/v/accepts +[travis-image]: https://badgen.net/travis/jshttp/accepts/master +[travis-url]: https://travis-ci.org/jshttp/accepts diff --git a/node_modules/accepts/index.js b/node_modules/accepts/index.js new file mode 100644 index 0000000..e9b2f63 --- /dev/null +++ b/node_modules/accepts/index.js @@ -0,0 +1,238 @@ +/*! + * accepts + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var Negotiator = require('negotiator') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = Accepts + +/** + * Create a new Accepts object for the given req. + * + * @param {object} req + * @public + */ + +function Accepts (req) { + if (!(this instanceof Accepts)) { + return new Accepts(req) + } + + this.headers = req.headers + this.negotiator = new Negotiator(req) +} + +/** + * 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" 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 + * this.types('html'); + * // => "html" + * + * // Accept: text/*, application/json + * this.types('html'); + * // => "html" + * this.types('text/html'); + * // => "text/html" + * this.types('json', 'text'); + * // => "json" + * this.types('application/json'); + * // => "application/json" + * + * // Accept: text/*, application/json + * this.types('image/png'); + * this.types('png'); + * // => undefined + * + * // Accept: text/*;q=.5, application/json + * this.types(['html', 'json']); + * this.types('html', 'json'); + * // => "json" + * + * @param {String|Array} types... + * @return {String|Array|Boolean} + * @public + */ + +Accepts.prototype.type = +Accepts.prototype.types = function (types_) { + var types = types_ + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i] + } + } + + // no types, return all requested types + if (!types || types.length === 0) { + return this.negotiator.mediaTypes() + } + + // no accept header, return first given type + if (!this.headers.accept) { + return types[0] + } + + var mimes = types.map(extToMime) + var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) + var first = accepts[0] + + return first + ? types[mimes.indexOf(first)] + : false +} + +/** + * Return accepted encodings or best fit based on `encodings`. + * + * Given `Accept-Encoding: gzip, deflate` + * an array sorted by quality is returned: + * + * ['gzip', 'deflate'] + * + * @param {String|Array} encodings... + * @return {String|Array} + * @public + */ + +Accepts.prototype.encoding = +Accepts.prototype.encodings = function (encodings_) { + var encodings = encodings_ + + // support flattened arguments + if (encodings && !Array.isArray(encodings)) { + encodings = new Array(arguments.length) + for (var i = 0; i < encodings.length; i++) { + encodings[i] = arguments[i] + } + } + + // no encodings, return all requested encodings + if (!encodings || encodings.length === 0) { + return this.negotiator.encodings() + } + + return this.negotiator.encodings(encodings)[0] || false +} + +/** + * Return accepted charsets or best fit based on `charsets`. + * + * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` + * an array sorted by quality is returned: + * + * ['utf-8', 'utf-7', 'iso-8859-1'] + * + * @param {String|Array} charsets... + * @return {String|Array} + * @public + */ + +Accepts.prototype.charset = +Accepts.prototype.charsets = function (charsets_) { + var charsets = charsets_ + + // support flattened arguments + if (charsets && !Array.isArray(charsets)) { + charsets = new Array(arguments.length) + for (var i = 0; i < charsets.length; i++) { + charsets[i] = arguments[i] + } + } + + // no charsets, return all requested charsets + if (!charsets || charsets.length === 0) { + return this.negotiator.charsets() + } + + return this.negotiator.charsets(charsets)[0] || false +} + +/** + * Return accepted languages or best fit based on `langs`. + * + * Given `Accept-Language: en;q=0.8, es, pt` + * an array sorted by quality is returned: + * + * ['es', 'pt', 'en'] + * + * @param {String|Array} langs... + * @return {Array|String} + * @public + */ + +Accepts.prototype.lang = +Accepts.prototype.langs = +Accepts.prototype.language = +Accepts.prototype.languages = function (languages_) { + var languages = languages_ + + // support flattened arguments + if (languages && !Array.isArray(languages)) { + languages = new Array(arguments.length) + for (var i = 0; i < languages.length; i++) { + languages[i] = arguments[i] + } + } + + // no languages, return all requested languages + if (!languages || languages.length === 0) { + return this.negotiator.languages() + } + + return this.negotiator.languages(languages)[0] || false +} + +/** + * Convert extnames to mime. + * + * @param {String} type + * @return {String} + * @private + */ + +function extToMime (type) { + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if mime is valid. + * + * @param {String} type + * @return {String} + * @private + */ + +function validMime (type) { + return typeof type === 'string' +} diff --git a/node_modules/accepts/package.json b/node_modules/accepts/package.json new file mode 100644 index 0000000..b923ea5 --- /dev/null +++ b/node_modules/accepts/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + "accepts@1.3.7", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "accepts@1.3.7", + "_id": "accepts@1.3.7", + "_inBundle": false, + "_integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "_location": "/accepts", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "accepts@1.3.7", + "name": "accepts", + "escapedName": "accepts", + "rawSpec": "1.3.7", + "saveSpec": null, + "fetchSpec": "1.3.7" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "_spec": "1.3.7", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/jshttp/accepts/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "description": "Higher-level content negotiation", + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.0.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/accepts#readme", + "keywords": [ + "content", + "negotiation", + "accept", + "accepts" + ], + "license": "MIT", + "name": "accepts", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/accepts.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "version": "1.3.7" +} diff --git a/node_modules/ajv/.tonic_example.js b/node_modules/ajv/.tonic_example.js new file mode 100644 index 0000000..aa11812 --- /dev/null +++ b/node_modules/ajv/.tonic_example.js @@ -0,0 +1,20 @@ +var Ajv = require('ajv'); +var ajv = new Ajv({allErrors: true}); + +var schema = { + "properties": { + "foo": { "type": "string" }, + "bar": { "type": "number", "maximum": 3 } + } +}; + +var validate = ajv.compile(schema); + +test({"foo": "abc", "bar": 2}); +test({"foo": 2, "bar": 4}); + +function test(data) { + var valid = validate(data); + if (valid) console.log('Valid!'); + else console.log('Invalid: ' + ajv.errorsText(validate.errors)); +} \ No newline at end of file diff --git a/node_modules/ajv/LICENSE b/node_modules/ajv/LICENSE new file mode 100644 index 0000000..96ee719 --- /dev/null +++ b/node_modules/ajv/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017 Evgeny Poberezkin + +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/ajv/README.md b/node_modules/ajv/README.md new file mode 100644 index 0000000..d645c3f --- /dev/null +++ b/node_modules/ajv/README.md @@ -0,0 +1,1380 @@ +Ajv logo + +# Ajv: Another JSON Schema Validator + +The fastest JSON Schema validator for Node.js and browser. Supports draft-04/06/07. + +[![Build Status](https://travis-ci.org/epoberezkin/ajv.svg?branch=master)](https://travis-ci.org/epoberezkin/ajv) +[![npm](https://img.shields.io/npm/v/ajv.svg)](https://www.npmjs.com/package/ajv) +[![npm downloads](https://img.shields.io/npm/dm/ajv.svg)](https://www.npmjs.com/package/ajv) +[![Coverage Status](https://coveralls.io/repos/epoberezkin/ajv/badge.svg?branch=master&service=github)](https://coveralls.io/github/epoberezkin/ajv?branch=master) +[![Greenkeeper badge](https://badges.greenkeeper.io/epoberezkin/ajv.svg)](https://greenkeeper.io/) +[![Gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv) + + +## Using version 6 + +[JSON Schema draft-07](http://json-schema.org/latest/json-schema-validation.html) is published. + +[Ajv version 6.0.0](https://github.com/epoberezkin/ajv/releases/tag/v6.0.0) that supports draft-07 is released. It may require either migrating your schemas or updating your code (to continue using draft-04 and v5 schemas, draft-06 schemas will be supported without changes). + +__Please note__: To use Ajv with draft-06 schemas you need to explicitly add the meta-schema to the validator instance: + +```javascript +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); +``` + +To use Ajv with draft-04 schemas in addition to explicitly adding meta-schema you also need to use option schemaId: + +```javascript +var ajv = new Ajv({schemaId: 'id'}); +// If you want to use both draft-04 and draft-06/07 schemas: +// var ajv = new Ajv({schemaId: 'auto'}); +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')); +``` + + +## Contents + +- [Performance](#performance) +- [Features](#features) +- [Getting started](#getting-started) +- [Frequently Asked Questions](https://github.com/epoberezkin/ajv/blob/master/FAQ.md) +- [Using in browser](#using-in-browser) +- [Command line interface](#command-line-interface) +- Validation + - [Keywords](#validation-keywords) + - [Annotation keywords](#annotation-keywords) + - [Formats](#formats) + - [Combining schemas with $ref](#ref) + - [$data reference](#data-reference) + - NEW: [$merge and $patch keywords](#merge-and-patch-keywords) + - [Defining custom keywords](#defining-custom-keywords) + - [Asynchronous schema compilation](#asynchronous-schema-compilation) + - [Asynchronous validation](#asynchronous-validation) +- [Security considerations](#security-considerations) + - [Security contact](#security-contact) + - [Untrusted schemas](#untrusted-schemas) + - [Circular references in objects](#circular-references-in-javascript-objects) + - [Trusted schemas](#security-risks-of-trusted-schemas) + - [ReDoS attack](#redos-attack) +- Modifying data during validation + - [Filtering data](#filtering-data) + - [Assigning defaults](#assigning-defaults) + - [Coercing data types](#coercing-data-types) +- API + - [Methods](#api) + - [Options](#options) + - [Validation errors](#validation-errors) +- [Plugins](#plugins) +- [Related packages](#related-packages) +- [Some packages using Ajv](#some-packages-using-ajv) +- [Tests, Contributing, History, Support, License](#tests) + + +## Performance + +Ajv generates code using [doT templates](https://github.com/olado/doT) to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization. + +Currently Ajv is the fastest and the most standard compliant validator according to these benchmarks: + +- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place +- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster +- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html) +- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html) + + +Performance of different validators by [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark): + +[![performance](https://chart.googleapis.com/chart?chxt=x,y&cht=bhs&chco=76A4FB&chls=2.0&chbh=32,4,1&chs=600x416&chxl=-1:|djv|ajv|json-schema-validator-generator|jsen|is-my-json-valid|themis|z-schema|jsck|skeemas|json-schema-library|tv4&chd=t:100,98,72.1,66.8,50.1,15.1,6.1,3.8,1.2,0.7,0.2)](https://github.com/ebdrup/json-schema-benchmark/blob/master/README.md#performance) + + +## Features + +- Ajv implements full JSON Schema [draft-06/07](http://json-schema.org/) and draft-04 standards: + - all validation keywords (see [JSON Schema validation keywords](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md)) + - full support of remote refs (remote schemas have to be added with `addSchema` or compiled to be available) + - support of circular references between schemas + - correct string lengths for strings with unicode pairs (can be turned off) + - [formats](#formats) defined by JSON Schema draft-07 standard and custom formats (can be turned off) + - [validates schemas against meta-schema](#api-validateschema) +- supports [browsers](#using-in-browser) and Node.js 0.10-8.x +- [asynchronous loading](#asynchronous-schema-compilation) of referenced schemas during compilation +- "All errors" validation mode with [option allErrors](#options) +- [error messages with parameters](#validation-errors) describing error reasons to allow creating custom error messages +- i18n error messages support with [ajv-i18n](https://github.com/epoberezkin/ajv-i18n) package +- [filtering data](#filtering-data) from additional properties +- [assigning defaults](#assigning-defaults) to missing properties and items +- [coercing data](#coercing-data-types) to the types specified in `type` keywords +- [custom keywords](#defining-custom-keywords) +- draft-06/07 keywords `const`, `contains`, `propertyNames` and `if/then/else` +- draft-06 boolean schemas (`true`/`false` as a schema to always pass/fail). +- keywords `switch`, `patternRequired`, `formatMaximum` / `formatMinimum` and `formatExclusiveMaximum` / `formatExclusiveMinimum` from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) with [ajv-keywords](https://github.com/epoberezkin/ajv-keywords) package +- [$data reference](#data-reference) to use values from the validated data as values for the schema keywords +- [asynchronous validation](#asynchronous-validation) of custom formats and keywords + +Currently Ajv is the only validator that passes all the tests from [JSON Schema Test Suite](https://github.com/json-schema/JSON-Schema-Test-Suite) (according to [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark), apart from the test that requires that `1.0` is not an integer that is impossible to satisfy in JavaScript). + + +## Install + +``` +npm install ajv +``` + + +## Getting started + +Try it in the Node.js REPL: https://tonicdev.com/npm/ajv + + +The fastest validation call: + +```javascript +var Ajv = require('ajv'); +var ajv = new Ajv(); // options can be passed, e.g. {allErrors: true} +var validate = ajv.compile(schema); +var valid = validate(data); +if (!valid) console.log(validate.errors); +``` + +or with less code + +```javascript +// ... +var valid = ajv.validate(schema, data); +if (!valid) console.log(ajv.errors); +// ... +``` + +or + +```javascript +// ... +var valid = ajv.addSchema(schema, 'mySchema') + .validate('mySchema', data); +if (!valid) console.log(ajv.errorsText()); +// ... +``` + +See [API](#api) and [Options](#options) for more details. + +Ajv compiles schemas to functions and caches them in all cases (using schema serialized with [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) or a custom function as a key), so that the next time the same schema is used (not necessarily the same object instance) it won't be compiled again. + +The best performance is achieved when using compiled functions returned by `compile` or `getSchema` methods (there is no additional function call). + +__Please note__: every time a validation function or `ajv.validate` are called `errors` property is overwritten. You need to copy `errors` array reference to another variable if you want to use it later (e.g., in the callback). See [Validation errors](#validation-errors) + + +## Using in browser + +You can require Ajv directly from the code you browserify - in this case Ajv will be a part of your bundle. + +If you need to use Ajv in several bundles you can create a separate UMD bundle using `npm run bundle` script (thanks to [siddo420](https://github.com/siddo420)). + +Then you need to load Ajv in the browser: +```html + +``` + +This bundle can be used with different module systems; it creates global `Ajv` if no module system is found. + +The browser bundle is available on [cdnjs](https://cdnjs.com/libraries/ajv). + +Ajv is tested with these browsers: + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/epoberezkin.svg)](https://saucelabs.com/u/epoberezkin) + +__Please note__: some frameworks, e.g. Dojo, may redefine global require in such way that is not compatible with CommonJS module format. In such case Ajv bundle has to be loaded before the framework and then you can use global Ajv (see issue [#234](https://github.com/epoberezkin/ajv/issues/234)). + + +## Command line interface + +CLI is available as a separate npm package [ajv-cli](https://github.com/jessedc/ajv-cli). It supports: + +- compiling JSON Schemas to test their validity +- BETA: generating standalone module exporting a validation function to be used without Ajv (using [ajv-pack](https://github.com/epoberezkin/ajv-pack)) +- migrate schemas to draft-07 (using [json-schema-migrate](https://github.com/epoberezkin/json-schema-migrate)) +- validating data file(s) against JSON Schema +- testing expected validity of data against JSON Schema +- referenced schemas +- custom meta-schemas +- files in JSON and JavaScript format +- all Ajv options +- reporting changes in data after validation in [JSON-patch](https://tools.ietf.org/html/rfc6902) format + + +## Validation keywords + +Ajv supports all validation keywords from draft-07 of JSON Schema standard: + +- [type](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#type) +- [for numbers](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#keywords-for-numbers) - maximum, minimum, exclusiveMaximum, exclusiveMinimum, multipleOf +- [for strings](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#keywords-for-strings) - maxLength, minLength, pattern, format +- [for arrays](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#keywords-for-arrays) - maxItems, minItems, uniqueItems, items, additionalItems, [contains](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#contains) +- [for objects](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#keywords-for-objects) - maxProperties, minProperties, required, properties, patternProperties, additionalProperties, dependencies, [propertyNames](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#propertynames) +- [for all types](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#keywords-for-all-types) - enum, [const](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#const) +- [compound keywords](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#compound-keywords) - not, oneOf, anyOf, allOf, [if/then/else](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#ifthenelse) + +With [ajv-keywords](https://github.com/epoberezkin/ajv-keywords) package Ajv also supports validation keywords from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) for JSON Schema standard: + +- [patternRequired](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#patternrequired-proposed) - like `required` but with patterns that some property should match. +- [formatMaximum, formatMinimum, formatExclusiveMaximum, formatExclusiveMinimum](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#formatmaximum--formatminimum-and-exclusiveformatmaximum--exclusiveformatminimum-proposed) - setting limits for date, time, etc. + +See [JSON Schema validation keywords](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md) for more details. + + +## Annotation keywords + +JSON Schema specification defines several annotation keywords that describe schema itself but do not perform any validation. + +- `title` and `description`: information about the data represented by that schema +- `$comment` (NEW in draft-07): information for developers. With option `$comment` Ajv logs or passes the comment string to the user-supplied function. See [Options](#options). +- `default`: a default value of the data instance, see [Assigning defaults](#assigning-defaults). +- `examples` (NEW in draft-06): an array of data instances. Ajv does not check the validity of these instances against the schema. +- `readOnly` and `writeOnly` (NEW in draft-07): marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.). +- `contentEncoding`: [RFC 2045](https://tools.ietf.org/html/rfc2045#section-6.1 ), e.g., "base64". +- `contentMediaType`: [RFC 2046](https://tools.ietf.org/html/rfc2046), e.g., "image/png". + +__Please note__: Ajv does not implement validation of the keywords `examples`, `contentEncoding` and `contentMediaType` but it reserves them. If you want to create a plugin that implements some of them, it should remove these keywords from the instance. + + +## Formats + +Ajv implements formats defined by JSON Schema specification and several other formats. It is recommended NOT to use "format" keyword implementations with untrusted data, as they use potentially unsafe regular expressions - see [ReDoS attack](#redos-attack). + +__Please note__: if you need to use "format" keyword to validate untrusted data, you MUST assess their suitability and safety for your validation scenarios. + +The following formats are implemented for string validation with "format" keyword: + +- _date_: full-date according to [RFC3339](http://tools.ietf.org/html/rfc3339#section-5.6). +- _time_: time with optional time-zone. +- _date-time_: date-time from the same source (time-zone is mandatory). `date`, `time` and `date-time` validate ranges in `full` mode and only regexp in `fast` mode (see [options](#options)). +- _uri_: full URI. +- _uri-reference_: URI reference, including full and relative URIs. +- _uri-template_: URI template according to [RFC6570](https://tools.ietf.org/html/rfc6570) +- _url_ (deprecated): [URL record](https://url.spec.whatwg.org/#concept-url). +- _email_: email address. +- _hostname_: host name according to [RFC1034](http://tools.ietf.org/html/rfc1034#section-3.5). +- _ipv4_: IP address v4. +- _ipv6_: IP address v6. +- _regex_: tests whether a string is a valid regular expression by passing it to RegExp constructor. +- _uuid_: Universally Unique IDentifier according to [RFC4122](http://tools.ietf.org/html/rfc4122). +- _json-pointer_: JSON-pointer according to [RFC6901](https://tools.ietf.org/html/rfc6901). +- _relative-json-pointer_: relative JSON-pointer according to [this draft](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00). + +__Please note__: JSON Schema draft-07 also defines formats `iri`, `iri-reference`, `idn-hostname` and `idn-email` for URLs, hostnames and emails with international characters. Ajv does not implement these formats. If you create Ajv plugin that implements them please make a PR to mention this plugin here. + +There are two modes of format validation: `fast` and `full`. This mode affects formats `date`, `time`, `date-time`, `uri`, `uri-reference`, `email`, and `hostname`. See [Options](#options) for details. + +You can add additional formats and replace any of the formats above using [addFormat](#api-addformat) method. + +The option `unknownFormats` allows changing the default behaviour when an unknown format is encountered. In this case Ajv can either fail schema compilation (default) or ignore it (default in versions before 5.0.0). You also can whitelist specific format(s) to be ignored. See [Options](#options) for details. + +You can find regular expressions used for format validation and the sources that were used in [formats.js](https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js). + + +## Combining schemas with $ref + +You can structure your validation logic across multiple schema files and have schemas reference each other using `$ref` keyword. + +Example: + +```javascript +var schema = { + "$id": "http://example.com/schemas/schema.json", + "type": "object", + "properties": { + "foo": { "$ref": "defs.json#/definitions/int" }, + "bar": { "$ref": "defs.json#/definitions/str" } + } +}; + +var defsSchema = { + "$id": "http://example.com/schemas/defs.json", + "definitions": { + "int": { "type": "integer" }, + "str": { "type": "string" } + } +}; +``` + +Now to compile your schema you can either pass all schemas to Ajv instance: + +```javascript +var ajv = new Ajv({schemas: [schema, defsSchema]}); +var validate = ajv.getSchema('http://example.com/schemas/schema.json'); +``` + +or use `addSchema` method: + +```javascript +var ajv = new Ajv; +var validate = ajv.addSchema(defsSchema) + .compile(schema); +``` + +See [Options](#options) and [addSchema](#api) method. + +__Please note__: +- `$ref` is resolved as the uri-reference using schema $id as the base URI (see the example). +- References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.). +- You don't have to host your schema files at the URIs that you use as schema $id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs. +- The actual location of the schema file in the file system is not used. +- You can pass the identifier of the schema as the second parameter of `addSchema` method or as a property name in `schemas` option. This identifier can be used instead of (or in addition to) schema $id. +- You cannot have the same $id (or the schema identifier) used for more than one schema - the exception will be thrown. +- You can implement dynamic resolution of the referenced schemas using `compileAsync` method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See [Asynchronous schema compilation](#asynchronous-schema-compilation). + + +## $data reference + +With `$data` option you can use values from the validated data as the values for the schema keywords. See [proposal](https://github.com/json-schema/json-schema/wiki/$data-(v5-proposal)) for more information about how it works. + +`$data` reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems. + +The value of "$data" should be a [JSON-pointer](https://tools.ietf.org/html/rfc6901) to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a [relative JSON-pointer](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00) (it is relative to the current point in data; if the $data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema). + +Examples. + +This schema requires that the value in property `smaller` is less or equal than the value in the property larger: + +```javascript +var ajv = new Ajv({$data: true}); + +var schema = { + "properties": { + "smaller": { + "type": "number", + "maximum": { "$data": "1/larger" } + }, + "larger": { "type": "number" } + } +}; + +var validData = { + smaller: 5, + larger: 7 +}; + +ajv.validate(schema, validData); // true +``` + +This schema requires that the properties have the same format as their field names: + +```javascript +var schema = { + "additionalProperties": { + "type": "string", + "format": { "$data": "0#" } + } +}; + +var validData = { + 'date-time': '1963-06-19T08:30:06.283185Z', + email: 'joe.bloggs@example.com' +} +``` + +`$data` reference is resolved safely - it won't throw even if some property is undefined. If `$data` resolves to `undefined` the validation succeeds (with the exclusion of `const` keyword). If `$data` resolves to incorrect type (e.g. not "number" for maximum keyword) the validation fails. + + +## $merge and $patch keywords + +With the package [ajv-merge-patch](https://github.com/epoberezkin/ajv-merge-patch) you can use the keywords `$merge` and `$patch` that allow extending JSON Schemas with patches using formats [JSON Merge Patch (RFC 7396)](https://tools.ietf.org/html/rfc7396) and [JSON Patch (RFC 6902)](https://tools.ietf.org/html/rfc6902). + +To add keywords `$merge` and `$patch` to Ajv instance use this code: + +```javascript +require('ajv-merge-patch')(ajv); +``` + +Examples. + +Using `$merge`: + +```json +{ + "$merge": { + "source": { + "type": "object", + "properties": { "p": { "type": "string" } }, + "additionalProperties": false + }, + "with": { + "properties": { "q": { "type": "number" } } + } + } +} +``` + +Using `$patch`: + +```json +{ + "$patch": { + "source": { + "type": "object", + "properties": { "p": { "type": "string" } }, + "additionalProperties": false + }, + "with": [ + { "op": "add", "path": "/properties/q", "value": { "type": "number" } } + ] + } +} +``` + +The schemas above are equivalent to this schema: + +```json +{ + "type": "object", + "properties": { + "p": { "type": "string" }, + "q": { "type": "number" } + }, + "additionalProperties": false +} +``` + +The properties `source` and `with` in the keywords `$merge` and `$patch` can use absolute or relative `$ref` to point to other schemas previously added to the Ajv instance or to the fragments of the current schema. + +See the package [ajv-merge-patch](https://github.com/epoberezkin/ajv-merge-patch) for more information. + + +## Defining custom keywords + +The advantages of using custom keywords are: + +- allow creating validation scenarios that cannot be expressed using JSON Schema +- simplify your schemas +- help bringing a bigger part of the validation logic to your schemas +- make your schemas more expressive, less verbose and closer to your application domain +- implement custom data processors that modify your data (`modifying` option MUST be used in keyword definition) and/or create side effects while the data is being validated + +If a keyword is used only for side-effects and its validation result is pre-defined, use option `valid: true/false` in keyword definition to simplify both generated code (no error handling in case of `valid: true`) and your keyword functions (no need to return any validation result). + +The concerns you have to be aware of when extending JSON Schema standard with custom keywords are the portability and understanding of your schemas. You will have to support these custom keywords on other platforms and to properly document these keywords so that everybody can understand them in your schemas. + +You can define custom keywords with [addKeyword](#api-addkeyword) method. Keywords are defined on the `ajv` instance level - new instances will not have previously defined keywords. + +Ajv allows defining keywords with: +- validation function +- compilation function +- macro function +- inline compilation function that should return code (as string) that will be inlined in the currently compiled schema. + +Example. `range` and `exclusiveRange` keywords using compiled schema: + +```javascript +ajv.addKeyword('range', { + type: 'number', + compile: function (sch, parentSchema) { + var min = sch[0]; + var max = sch[1]; + + return parentSchema.exclusiveRange === true + ? function (data) { return data > min && data < max; } + : function (data) { return data >= min && data <= max; } + } +}); + +var schema = { "range": [2, 4], "exclusiveRange": true }; +var validate = ajv.compile(schema); +console.log(validate(2.01)); // true +console.log(validate(3.99)); // true +console.log(validate(2)); // false +console.log(validate(4)); // false +``` + +Several custom keywords (typeof, instanceof, range and propertyNames) are defined in [ajv-keywords](https://github.com/epoberezkin/ajv-keywords) package - they can be used for your schemas and as a starting point for your own custom keywords. + +See [Defining custom keywords](https://github.com/epoberezkin/ajv/blob/master/CUSTOM.md) for more details. + + +## Asynchronous schema compilation + +During asynchronous compilation remote references are loaded using supplied function. See `compileAsync` [method](#api-compileAsync) and `loadSchema` [option](#options). + +Example: + +```javascript +var ajv = new Ajv({ loadSchema: loadSchema }); + +ajv.compileAsync(schema).then(function (validate) { + var valid = validate(data); + // ... +}); + +function loadSchema(uri) { + return request.json(uri).then(function (res) { + if (res.statusCode >= 400) + throw new Error('Loading error: ' + res.statusCode); + return res.body; + }); +} +``` + +__Please note__: [Option](#options) `missingRefs` should NOT be set to `"ignore"` or `"fail"` for asynchronous compilation to work. + + +## Asynchronous validation + +Example in Node.js REPL: https://tonicdev.com/esp/ajv-asynchronous-validation + +You can define custom formats and keywords that perform validation asynchronously by accessing database or some other service. You should add `async: true` in the keyword or format definition (see [addFormat](#api-addformat), [addKeyword](#api-addkeyword) and [Defining custom keywords](#defining-custom-keywords)). + +If your schema uses asynchronous formats/keywords or refers to some schema that contains them it should have `"$async": true` keyword so that Ajv can compile it correctly. If asynchronous format/keyword or reference to asynchronous schema is used in the schema without `$async` keyword Ajv will throw an exception during schema compilation. + +__Please note__: all asynchronous subschemas that are referenced from the current or other schemas should have `"$async": true` keyword as well, otherwise the schema compilation will fail. + +Validation function for an asynchronous custom format/keyword should return a promise that resolves with `true` or `false` (or rejects with `new Ajv.ValidationError(errors)` if you want to return custom errors from the keyword function). + +Ajv compiles asynchronous schemas to [es7 async functions](http://tc39.github.io/ecmascript-asyncawait/) that can optionally be transpiled with [nodent](https://github.com/MatAtBread/nodent). Async functions are supported in Node.js 7+ and all modern browsers. You can also supply any other transpiler as a function via `processCode` option. See [Options](#options). + +The compiled validation function has `$async: true` property (if the schema is asynchronous), so you can differentiate these functions if you are using both synchronous and asynchronous schemas. + +Validation result will be a promise that resolves with validated data or rejects with an exception `Ajv.ValidationError` that contains the array of validation errors in `errors` property. + + +Example: + +```javascript +var ajv = new Ajv; +// require('ajv-async')(ajv); + +ajv.addKeyword('idExists', { + async: true, + type: 'number', + validate: checkIdExists +}); + + +function checkIdExists(schema, data) { + return knex(schema.table) + .select('id') + .where('id', data) + .then(function (rows) { + return !!rows.length; // true if record is found + }); +} + +var schema = { + "$async": true, + "properties": { + "userId": { + "type": "integer", + "idExists": { "table": "users" } + }, + "postId": { + "type": "integer", + "idExists": { "table": "posts" } + } + } +}; + +var validate = ajv.compile(schema); + +validate({ userId: 1, postId: 19 }) +.then(function (data) { + console.log('Data is valid', data); // { userId: 1, postId: 19 } +}) +.catch(function (err) { + if (!(err instanceof Ajv.ValidationError)) throw err; + // data is invalid + console.log('Validation errors:', err.errors); +}); +``` + +### Using transpilers with asynchronous validation functions. + +[ajv-async](https://github.com/epoberezkin/ajv-async) uses [nodent](https://github.com/MatAtBread/nodent) to transpile async functions. To use another transpiler you should separately install it (or load its bundle in the browser). + + +#### Using nodent + +```javascript +var ajv = new Ajv; +require('ajv-async')(ajv); +// in the browser if you want to load ajv-async bundle separately you can: +// window.ajvAsync(ajv); +var validate = ajv.compile(schema); // transpiled es7 async function +validate(data).then(successFunc).catch(errorFunc); +``` + + +#### Using other transpilers + +```javascript +var ajv = new Ajv({ processCode: transpileFunc }); +var validate = ajv.compile(schema); // transpiled es7 async function +validate(data).then(successFunc).catch(errorFunc); +``` + +See [Options](#options). + + +## Security considerations + +JSON Schema, if properly used, can replace data sanitisation. It doesn't replace other API security considerations. It also introduces additional security aspects to consider. + + +##### Security contact + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues. + + +##### Untrusted schemas + +Ajv treats JSON schemas as trusted as your application code. This security model is based on the most common use case, when the schemas are static and bundled together with the application. + +If your schemas are received from untrusted sources (or generated from untrusted data) there are several scenarios you need to prevent: +- compiling schemas can cause stack overflow (if they are too deep) +- compiling schemas can be slow (e.g. [#557](https://github.com/epoberezkin/ajv/issues/557)) +- validating certain data can be slow + +It is difficult to predict all the scenarios, but at the very least it may help to limit the size of untrusted schemas (e.g. limit JSON string length) and also the maximum schema object depth (that can be high for relatively small JSON strings). You also may want to mitigate slow regular expressions in `pattern` and `patternProperties` keywords. + +Regardless the measures you take, using untrusted schemas increases security risks. + + +##### Circular references in JavaScript objects + +Ajv does not support schemas and validated data that have circular references in objects. See [issue #802](https://github.com/epoberezkin/ajv/issues/802). + +An attempt to compile such schemas or validate such data would cause stack overflow (or will not complete in case of asynchronous validation). Depending on the parser you use, untrusted data can lead to circular references. + + +##### Security risks of trusted schemas + +Some keywords in JSON Schemas can lead to very slow validation for certain data. These keywords include (but may be not limited to): + +- `pattern` and `format` for large strings - in some cases using `maxLength` can help mitigate it, but certain regular expressions can lead to exponential validation time even with relatively short strings (see [ReDoS attack](#redos-attack)). +- `patternProperties` for large property names - use `propertyNames` to mitigate, but some regular expressions can have exponential evaluation time as well. +- `uniqueItems` for large non-scalar arrays - use `maxItems` to mitigate + +__Please note__: The suggestions above to prevent slow validation would only work if you do NOT use `allErrors: true` in production code (using it would continue validation after validation errors). + +You can validate your JSON schemas against [this meta-schema](https://github.com/epoberezkin/ajv/blob/master/lib/refs/json-schema-secure.json) to check that these recommendations are followed: + +```javascript +const isSchemaSecure = ajv.compile(require('ajv/lib/refs/json-schema-secure.json')); + +const schema1 = {format: 'email'}; +isSchemaSecure(schema1); // false + +const schema2 = {format: 'email', maxLength: MAX_LENGTH}; +isSchemaSecure(schema2); // true +``` + +__Please note__: following all these recommendation is not a guarantee that validation of untrusted data is safe - it can still lead to some undesirable results. + + +## ReDoS attack + +Certain regular expressions can lead to the exponential evaluation time even with relatively short strings. + +Please assess the regular expressions you use in the schemas on their vulnerability to this attack - see [safe-regex](https://github.com/substack/safe-regex), for example. + +__Please note__: some formats that Ajv implements use [regular expressions](https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js) that can be vulnerable to ReDoS attack, so if you use Ajv to validate data from untrusted sources __it is strongly recommended__ to consider the following: + +- making assessment of "format" implementations in Ajv. +- using `format: 'fast'` option that simplifies some of the regular expressions (although it does not guarantee that they are safe). +- replacing format implementations provided by Ajv with your own implementations of "format" keyword that either uses different regular expressions or another approach to format validation. Please see [addFormat](#api-addformat) method. +- disabling format validation by ignoring "format" keyword with option `format: false` + +Whatever mitigation you choose, please assume all formats provided by Ajv as potentially unsafe and make your own assessment of their suitability for your validation scenarios. + + +## Filtering data + +With [option `removeAdditional`](#options) (added by [andyscott](https://github.com/andyscott)) you can filter data during the validation. + +This option modifies original data. + +Example: + +```javascript +var ajv = new Ajv({ removeAdditional: true }); +var schema = { + "additionalProperties": false, + "properties": { + "foo": { "type": "number" }, + "bar": { + "additionalProperties": { "type": "number" }, + "properties": { + "baz": { "type": "string" } + } + } + } +} + +var data = { + "foo": 0, + "additional1": 1, // will be removed; `additionalProperties` == false + "bar": { + "baz": "abc", + "additional2": 2 // will NOT be removed; `additionalProperties` != false + }, +} + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 0, "bar": { "baz": "abc", "additional2": 2 } +``` + +If `removeAdditional` option in the example above were `"all"` then both `additional1` and `additional2` properties would have been removed. + +If the option were `"failing"` then property `additional1` would have been removed regardless of its value and property `additional2` would have been removed only if its value were failing the schema in the inner `additionalProperties` (so in the example above it would have stayed because it passes the schema, but any non-number would have been removed). + +__Please note__: If you use `removeAdditional` option with `additionalProperties` keyword inside `anyOf`/`oneOf` keywords your validation can fail with this schema, for example: + +```json +{ + "type": "object", + "oneOf": [ + { + "properties": { + "foo": { "type": "string" } + }, + "required": [ "foo" ], + "additionalProperties": false + }, + { + "properties": { + "bar": { "type": "integer" } + }, + "required": [ "bar" ], + "additionalProperties": false + } + ] +} +``` + +The intention of the schema above is to allow objects with either the string property "foo" or the integer property "bar", but not with both and not with any other properties. + +With the option `removeAdditional: true` the validation will pass for the object `{ "foo": "abc"}` but will fail for the object `{"bar": 1}`. It happens because while the first subschema in `oneOf` is validated, the property `bar` is removed because it is an additional property according to the standard (because it is not included in `properties` keyword in the same schema). + +While this behaviour is unexpected (issues [#129](https://github.com/epoberezkin/ajv/issues/129), [#134](https://github.com/epoberezkin/ajv/issues/134)), it is correct. To have the expected behaviour (both objects are allowed and additional properties are removed) the schema has to be refactored in this way: + +```json +{ + "type": "object", + "properties": { + "foo": { "type": "string" }, + "bar": { "type": "integer" } + }, + "additionalProperties": false, + "oneOf": [ + { "required": [ "foo" ] }, + { "required": [ "bar" ] } + ] +} +``` + +The schema above is also more efficient - it will compile into a faster function. + + +## Assigning defaults + +With [option `useDefaults`](#options) Ajv will assign values from `default` keyword in the schemas of `properties` and `items` (when it is the array of schemas) to the missing properties and items. + +With the option value `"empty"` properties and items equal to `null` or `""` (empty string) will be considered missing and assigned defaults. + +This option modifies original data. + +__Please note__: the default value is inserted in the generated validation code as a literal, so the value inserted in the data will be the deep clone of the default in the schema. + + +Example 1 (`default` in `properties`): + +```javascript +var ajv = new Ajv({ useDefaults: true }); +var schema = { + "type": "object", + "properties": { + "foo": { "type": "number" }, + "bar": { "type": "string", "default": "baz" } + }, + "required": [ "foo", "bar" ] +}; + +var data = { "foo": 1 }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 1, "bar": "baz" } +``` + +Example 2 (`default` in `items`): + +```javascript +var schema = { + "type": "array", + "items": [ + { "type": "number" }, + { "type": "string", "default": "foo" } + ] +} + +var data = [ 1 ]; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // [ 1, "foo" ] +``` + +`default` keywords in other cases are ignored: + +- not in `properties` or `items` subschemas +- in schemas inside `anyOf`, `oneOf` and `not` (see [#42](https://github.com/epoberezkin/ajv/issues/42)) +- in `if` subschema of `switch` keyword +- in schemas generated by custom macro keywords + +The [`strictDefaults` option](#options) customizes Ajv's behavior for the defaults that Ajv ignores (`true` raises an error, and `"log"` outputs a warning). + + +## Coercing data types + +When you are validating user inputs all your data properties are usually strings. The option `coerceTypes` allows you to have your data types coerced to the types specified in your schema `type` keywords, both to pass the validation and to use the correctly typed data afterwards. + +This option modifies original data. + +__Please note__: if you pass a scalar value to the validating function its type will be coerced and it will pass the validation, but the value of the variable you pass won't be updated because scalars are passed by value. + + +Example 1: + +```javascript +var ajv = new Ajv({ coerceTypes: true }); +var schema = { + "type": "object", + "properties": { + "foo": { "type": "number" }, + "bar": { "type": "boolean" } + }, + "required": [ "foo", "bar" ] +}; + +var data = { "foo": "1", "bar": "false" }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 1, "bar": false } +``` + +Example 2 (array coercions): + +```javascript +var ajv = new Ajv({ coerceTypes: 'array' }); +var schema = { + "properties": { + "foo": { "type": "array", "items": { "type": "number" } }, + "bar": { "type": "boolean" } + } +}; + +var data = { "foo": "1", "bar": ["false"] }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": [1], "bar": false } +``` + +The coercion rules, as you can see from the example, are different from JavaScript both to validate user input as expected and to have the coercion reversible (to correctly validate cases where different types are defined in subschemas of "anyOf" and other compound keywords). + +See [Coercion rules](https://github.com/epoberezkin/ajv/blob/master/COERCION.md) for details. + + +## API + +##### new Ajv(Object options) -> Object + +Create Ajv instance. + + +##### .compile(Object schema) -> Function<Object data> + +Generate validating function and cache the compiled schema for future use. + +Validating function returns a boolean value. This function has properties `errors` and `schema`. Errors encountered during the last validation are assigned to `errors` property (it is assigned `null` if there was no errors). `schema` property contains the reference to the original schema. + +The schema passed to this method will be validated against meta-schema unless `validateSchema` option is false. If schema is invalid, an error will be thrown. See [options](#options). + + +##### .compileAsync(Object schema [, Boolean meta] [, Function callback]) -> Promise + +Asynchronous version of `compile` method that loads missing remote schemas using asynchronous function in `options.loadSchema`. This function returns a Promise that resolves to a validation function. An optional callback passed to `compileAsync` will be called with 2 parameters: error (or null) and validating function. The returned promise will reject (and the callback will be called with an error) when: + +- missing schema can't be loaded (`loadSchema` returns a Promise that rejects). +- a schema containing a missing reference is loaded, but the reference cannot be resolved. +- schema (or some loaded/referenced schema) is invalid. + +The function compiles schema and loads the first missing schema (or meta-schema) until all missing schemas are loaded. + +You can asynchronously compile meta-schema by passing `true` as the second parameter. + +See example in [Asynchronous compilation](#asynchronous-schema-compilation). + + +##### .validate(Object schema|String key|String ref, data) -> Boolean + +Validate data using passed schema (it will be compiled and cached). + +Instead of the schema you can use the key that was previously passed to `addSchema`, the schema id if it was present in the schema or any previously resolved reference. + +Validation errors will be available in the `errors` property of Ajv instance (`null` if there were no errors). + +__Please note__: every time this method is called the errors are overwritten so you need to copy them to another variable if you want to use them later. + +If the schema is asynchronous (has `$async` keyword on the top level) this method returns a Promise. See [Asynchronous validation](#asynchronous-validation). + + +##### .addSchema(Array<Object>|Object schema [, String key]) -> Ajv + +Add schema(s) to validator instance. This method does not compile schemas (but it still validates them). Because of that dependencies can be added in any order and circular dependencies are supported. It also prevents unnecessary compilation of schemas that are containers for other schemas but not used as a whole. + +Array of schemas can be passed (schemas should have ids), the second parameter will be ignored. + +Key can be passed that can be used to reference the schema and will be used as the schema id if there is no id inside the schema. If the key is not passed, the schema id will be used as the key. + + +Once the schema is added, it (and all the references inside it) can be referenced in other schemas and used to validate data. + +Although `addSchema` does not compile schemas, explicit compilation is not required - the schema will be compiled when it is used first time. + +By default the schema is validated against meta-schema before it is added, and if the schema does not pass validation the exception is thrown. This behaviour is controlled by `validateSchema` option. + +__Please note__: Ajv uses the [method chaining syntax](https://en.wikipedia.org/wiki/Method_chaining) for all methods with the prefix `add*` and `remove*`. +This allows you to do nice things like the following. + +```javascript +var validate = new Ajv().addSchema(schema).addFormat(name, regex).getSchema(uri); +``` + +##### .addMetaSchema(Array<Object>|Object schema [, String key]) -> Ajv + +Adds meta schema(s) that can be used to validate other schemas. That function should be used instead of `addSchema` because there may be instance options that would compile a meta schema incorrectly (at the moment it is `removeAdditional` option). + +There is no need to explicitly add draft-07 meta schema (http://json-schema.org/draft-07/schema) - it is added by default, unless option `meta` is set to `false`. You only need to use it if you have a changed meta-schema that you want to use to validate your schemas. See `validateSchema`. + + +##### .validateSchema(Object schema) -> Boolean + +Validates schema. This method should be used to validate schemas rather than `validate` due to the inconsistency of `uri` format in JSON Schema standard. + +By default this method is called automatically when the schema is added, so you rarely need to use it directly. + +If schema doesn't have `$schema` property, it is validated against draft 6 meta-schema (option `meta` should not be false). + +If schema has `$schema` property, then the schema with this id (that should be previously added) is used to validate passed schema. + +Errors will be available at `ajv.errors`. + + +##### .getSchema(String key) -> Function<Object data> + +Retrieve compiled schema previously added with `addSchema` by the key passed to `addSchema` or by its full reference (id). The returned validating function has `schema` property with the reference to the original schema. + + +##### .removeSchema([Object schema|String key|String ref|RegExp pattern]) -> Ajv + +Remove added/cached schema. Even if schema is referenced by other schemas it can be safely removed as dependent schemas have local references. + +Schema can be removed using: +- key passed to `addSchema` +- it's full reference (id) +- RegExp that should match schema id or key (meta-schemas won't be removed) +- actual schema object that will be stable-stringified to remove schema from cache + +If no parameter is passed all schemas but meta-schemas will be removed and the cache will be cleared. + + +##### .addFormat(String name, String|RegExp|Function|Object format) -> Ajv + +Add custom format to validate strings or numbers. It can also be used to replace pre-defined formats for Ajv instance. + +Strings are converted to RegExp. + +Function should return validation result as `true` or `false`. + +If object is passed it should have properties `validate`, `compare` and `async`: + +- _validate_: a string, RegExp or a function as described above. +- _compare_: an optional comparison function that accepts two strings and compares them according to the format meaning. This function is used with keywords `formatMaximum`/`formatMinimum` (defined in [ajv-keywords](https://github.com/epoberezkin/ajv-keywords) package). It should return `1` if the first value is bigger than the second value, `-1` if it is smaller and `0` if it is equal. +- _async_: an optional `true` value if `validate` is an asynchronous function; in this case it should return a promise that resolves with a value `true` or `false`. +- _type_: an optional type of data that the format applies to. It can be `"string"` (default) or `"number"` (see https://github.com/epoberezkin/ajv/issues/291#issuecomment-259923858). If the type of data is different, the validation will pass. + +Custom formats can be also added via `formats` option. + + +##### .addKeyword(String keyword, Object definition) -> Ajv + +Add custom validation keyword to Ajv instance. + +Keyword should be different from all standard JSON Schema keywords and different from previously defined keywords. There is no way to redefine keywords or to remove keyword definition from the instance. + +Keyword must start with a letter, `_` or `$`, and may continue with letters, numbers, `_`, `$`, or `-`. +It is recommended to use an application-specific prefix for keywords to avoid current and future name collisions. + +Example Keywords: +- `"xyz-example"`: valid, and uses prefix for the xyz project to avoid name collisions. +- `"example"`: valid, but not recommended as it could collide with future versions of JSON Schema etc. +- `"3-example"`: invalid as numbers are not allowed to be the first character in a keyword + +Keyword definition is an object with the following properties: + +- _type_: optional string or array of strings with data type(s) that the keyword applies to. If not present, the keyword will apply to all types. +- _validate_: validating function +- _compile_: compiling function +- _macro_: macro function +- _inline_: compiling function that returns code (as string) +- _schema_: an optional `false` value used with "validate" keyword to not pass schema +- _metaSchema_: an optional meta-schema for keyword schema +- _dependencies_: an optional list of properties that must be present in the parent schema - it will be checked during schema compilation +- _modifying_: `true` MUST be passed if keyword modifies data +- _statements_: `true` can be passed in case inline keyword generates statements (as opposed to expression) +- _valid_: pass `true`/`false` to pre-define validation result, the result returned from validation function will be ignored. This option cannot be used with macro keywords. +- _$data_: an optional `true` value to support [$data reference](#data-reference) as the value of custom keyword. The reference will be resolved at validation time. If the keyword has meta-schema it would be extended to allow $data and it will be used to validate the resolved value. Supporting $data reference requires that keyword has validating function (as the only option or in addition to compile, macro or inline function). +- _async_: an optional `true` value if the validation function is asynchronous (whether it is compiled or passed in _validate_ property); in this case it should return a promise that resolves with a value `true` or `false`. This option is ignored in case of "macro" and "inline" keywords. +- _errors_: an optional boolean or string `"full"` indicating whether keyword returns errors. If this property is not set Ajv will determine if the errors were set in case of failed validation. + +_compile_, _macro_ and _inline_ are mutually exclusive, only one should be used at a time. _validate_ can be used separately or in addition to them to support $data reference. + +__Please note__: If the keyword is validating data type that is different from the type(s) in its definition, the validation function will not be called (and expanded macro will not be used), so there is no need to check for data type inside validation function or inside schema returned by macro function (unless you want to enforce a specific type and for some reason do not want to use a separate `type` keyword for that). In the same way as standard keywords work, if the keyword does not apply to the data type being validated, the validation of this keyword will succeed. + +See [Defining custom keywords](#defining-custom-keywords) for more details. + + +##### .getKeyword(String keyword) -> Object|Boolean + +Returns custom keyword definition, `true` for pre-defined keywords and `false` if the keyword is unknown. + + +##### .removeKeyword(String keyword) -> Ajv + +Removes custom or pre-defined keyword so you can redefine them. + +While this method can be used to extend pre-defined keywords, it can also be used to completely change their meaning - it may lead to unexpected results. + +__Please note__: schemas compiled before the keyword is removed will continue to work without changes. To recompile schemas use `removeSchema` method and compile them again. + + +##### .errorsText([Array<Object> errors [, Object options]]) -> String + +Returns the text with all errors in a String. + +Options can have properties `separator` (string used to separate errors, ", " by default) and `dataVar` (the variable name that dataPaths are prefixed with, "data" by default). + + +## Options + +Defaults: + +```javascript +{ + // validation and reporting options: + $data: false, + allErrors: false, + verbose: false, + $comment: false, // NEW in Ajv version 6.0 + jsonPointers: false, + uniqueItems: true, + unicode: true, + nullable: false, + format: 'fast', + formats: {}, + unknownFormats: true, + schemas: {}, + logger: undefined, + // referenced schema options: + schemaId: '$id', + missingRefs: true, + extendRefs: 'ignore', // recommended 'fail' + loadSchema: undefined, // function(uri: string): Promise {} + // options to modify validated data: + removeAdditional: false, + useDefaults: false, + coerceTypes: false, + // strict mode options + strictDefaults: false, + strictKeywords: false, + // asynchronous validation options: + transpile: undefined, // requires ajv-async package + // advanced options: + meta: true, + validateSchema: true, + addUsedSchema: true, + inlineRefs: true, + passContext: false, + loopRequired: Infinity, + ownProperties: false, + multipleOfPrecision: false, + errorDataPath: 'object', // deprecated + messages: true, + sourceCode: false, + processCode: undefined, // function (str: string): string {} + cache: new Cache, + serialize: undefined +} +``` + +##### Validation and reporting options + +- _$data_: support [$data references](#data-reference). Draft 6 meta-schema that is added by default will be extended to allow them. If you want to use another meta-schema you need to use $dataMetaSchema method to add support for $data reference. See [API](#api). +- _allErrors_: check all rules collecting all errors. Default is to return after the first error. +- _verbose_: include the reference to the part of the schema (`schema` and `parentSchema`) and validated data in errors (false by default). +- _$comment_ (NEW in Ajv version 6.0): log or pass the value of `$comment` keyword to a function. Option values: + - `false` (default): ignore $comment keyword. + - `true`: log the keyword value to console. + - function: pass the keyword value, its schema path and root schema to the specified function +- _jsonPointers_: set `dataPath` property of errors using [JSON Pointers](https://tools.ietf.org/html/rfc6901) instead of JavaScript property access notation. +- _uniqueItems_: validate `uniqueItems` keyword (true by default). +- _unicode_: calculate correct length of strings with unicode pairs (true by default). Pass `false` to use `.length` of strings that is faster, but gives "incorrect" lengths of strings with unicode pairs - each unicode pair is counted as two characters. +- _nullable_: support keyword "nullable" from [Open API 3 specification](https://swagger.io/docs/specification/data-models/data-types/). +- _format_: formats validation mode. Option values: + - `"fast"` (default) - simplified and fast validation (see [Formats](#formats) for details of which formats are available and affected by this option). + - `"full"` - more restrictive and slow validation. E.g., 25:00:00 and 2015/14/33 will be invalid time and date in 'full' mode but it will be valid in 'fast' mode. + - `false` - ignore all format keywords. +- _formats_: an object with custom formats. Keys and values will be passed to `addFormat` method. +- _unknownFormats_: handling of unknown formats. Option values: + - `true` (default) - if an unknown format is encountered the exception is thrown during schema compilation. If `format` keyword value is [$data reference](#data-reference) and it is unknown the validation will fail. + - `[String]` - an array of unknown format names that will be ignored. This option can be used to allow usage of third party schemas with format(s) for which you don't have definitions, but still fail if another unknown format is used. If `format` keyword value is [$data reference](#data-reference) and it is not in this array the validation will fail. + - `"ignore"` - to log warning during schema compilation and always pass validation (the default behaviour in versions before 5.0.0). This option is not recommended, as it allows to mistype format name and it won't be validated without any error message. This behaviour is required by JSON Schema specification. +- _schemas_: an array or object of schemas that will be added to the instance. In case you pass the array the schemas must have IDs in them. When the object is passed the method `addSchema(value, key)` will be called for each schema in this object. +- _logger_: sets the logging method. Default is the global `console` object that should have methods `log`, `warn` and `error`. Option values: + - custom logger - it should have methods `log`, `warn` and `error`. If any of these methods is missing an exception will be thrown. + - `false` - logging is disabled. + + +##### Referenced schema options + +- _schemaId_: this option defines which keywords are used as schema URI. Option value: + - `"$id"` (default) - only use `$id` keyword as schema URI (as specified in JSON Schema draft-06/07), ignore `id` keyword (if it is present a warning will be logged). + - `"id"` - only use `id` keyword as schema URI (as specified in JSON Schema draft-04), ignore `$id` keyword (if it is present a warning will be logged). + - `"auto"` - use both `$id` and `id` keywords as schema URI. If both are present (in the same schema object) and different the exception will be thrown during schema compilation. +- _missingRefs_: handling of missing referenced schemas. Option values: + - `true` (default) - if the reference cannot be resolved during compilation the exception is thrown. The thrown error has properties `missingRef` (with hash fragment) and `missingSchema` (without it). Both properties are resolved relative to the current base id (usually schema id, unless it was substituted). + - `"ignore"` - to log error during compilation and always pass validation. + - `"fail"` - to log error and successfully compile schema but fail validation if this rule is checked. +- _extendRefs_: validation of other keywords when `$ref` is present in the schema. Option values: + - `"ignore"` (default) - when `$ref` is used other keywords are ignored (as per [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3) standard). A warning will be logged during the schema compilation. + - `"fail"` (recommended) - if other validation keywords are used together with `$ref` the exception will be thrown when the schema is compiled. This option is recommended to make sure schema has no keywords that are ignored, which can be confusing. + - `true` - validate all keywords in the schemas with `$ref` (the default behaviour in versions before 5.0.0). +- _loadSchema_: asynchronous function that will be used to load remote schemas when `compileAsync` [method](#api-compileAsync) is used and some reference is missing (option `missingRefs` should NOT be 'fail' or 'ignore'). This function should accept remote schema uri as a parameter and return a Promise that resolves to a schema. See example in [Asynchronous compilation](#asynchronous-schema-compilation). + + +##### Options to modify validated data + +- _removeAdditional_: remove additional properties - see example in [Filtering data](#filtering-data). This option is not used if schema is added with `addMetaSchema` method. Option values: + - `false` (default) - not to remove additional properties + - `"all"` - all additional properties are removed, regardless of `additionalProperties` keyword in schema (and no validation is made for them). + - `true` - only additional properties with `additionalProperties` keyword equal to `false` are removed. + - `"failing"` - additional properties that fail schema validation will be removed (where `additionalProperties` keyword is `false` or schema). +- _useDefaults_: replace missing or undefined properties and items with the values from corresponding `default` keywords. Default behaviour is to ignore `default` keywords. This option is not used if schema is added with `addMetaSchema` method. See examples in [Assigning defaults](#assigning-defaults). Option values: + - `false` (default) - do not use defaults + - `true` - insert defaults by value (object literal is used). + - `"empty"` - in addition to missing or undefined, use defaults for properties and items that are equal to `null` or `""` (an empty string). + - `"shared"` (deprecated) - insert defaults by reference. If the default is an object, it will be shared by all instances of validated data. If you modify the inserted default in the validated data, it will be modified in the schema as well. +- _coerceTypes_: change data type of data to match `type` keyword. See the example in [Coercing data types](#coercing-data-types) and [coercion rules](https://github.com/epoberezkin/ajv/blob/master/COERCION.md). Option values: + - `false` (default) - no type coercion. + - `true` - coerce scalar data types. + - `"array"` - in addition to coercions between scalar types, coerce scalar data to an array with one element and vice versa (as required by the schema). + + +##### Strict mode options + +- _strictDefaults_: report ignored `default` keywords in schemas. Option values: + - `false` (default) - ignored defaults are not reported + - `true` - if an ignored default is present, throw an error + - `"log"` - if an ignored default is present, log warning +- _strictKeywords_: report unknown keywords in schemas. Option values: + - `false` (default) - unknown keywords are not reported + - `true` - if an unknown keyword is present, throw an error + - `"log"` - if an unknown keyword is present, log warning + + +##### Asynchronous validation options + +- _transpile_: Requires [ajv-async](https://github.com/epoberezkin/ajv-async) package. It determines whether Ajv transpiles compiled asynchronous validation function. Option values: + - `undefined` (default) - transpile with [nodent](https://github.com/MatAtBread/nodent) if async functions are not supported. + - `true` - always transpile with nodent. + - `false` - do not transpile; if async functions are not supported an exception will be thrown. + + +##### Advanced options + +- _meta_: add [meta-schema](http://json-schema.org/documentation.html) so it can be used by other schemas (true by default). If an object is passed, it will be used as the default meta-schema for schemas that have no `$schema` keyword. This default meta-schema MUST have `$schema` keyword. +- _validateSchema_: validate added/compiled schemas against meta-schema (true by default). `$schema` property in the schema can be http://json-schema.org/draft-07/schema or absent (draft-07 meta-schema will be used) or can be a reference to the schema previously added with `addMetaSchema` method. Option values: + - `true` (default) - if the validation fails, throw the exception. + - `"log"` - if the validation fails, log error. + - `false` - skip schema validation. +- _addUsedSchema_: by default methods `compile` and `validate` add schemas to the instance if they have `$id` (or `id`) property that doesn't start with "#". If `$id` is present and it is not unique the exception will be thrown. Set this option to `false` to skip adding schemas to the instance and the `$id` uniqueness check when these methods are used. This option does not affect `addSchema` method. +- _inlineRefs_: Affects compilation of referenced schemas. Option values: + - `true` (default) - the referenced schemas that don't have refs in them are inlined, regardless of their size - that substantially improves performance at the cost of the bigger size of compiled schema functions. + - `false` - to not inline referenced schemas (they will be compiled as separate functions). + - integer number - to limit the maximum number of keywords of the schema that will be inlined. +- _passContext_: pass validation context to custom keyword functions. If this option is `true` and you pass some context to the compiled validation function with `validate.call(context, data)`, the `context` will be available as `this` in your custom keywords. By default `this` is Ajv instance. +- _loopRequired_: by default `required` keyword is compiled into a single expression (or a sequence of statements in `allErrors` mode). In case of a very large number of properties in this keyword it may result in a very big validation function. Pass integer to set the number of properties above which `required` keyword will be validated in a loop - smaller validation function size but also worse performance. +- _ownProperties_: by default Ajv iterates over all enumerable object properties; when this option is `true` only own enumerable object properties (i.e. found directly on the object rather than on its prototype) are iterated. Contributed by @mbroadst. +- _multipleOfPrecision_: by default `multipleOf` keyword is validated by comparing the result of division with parseInt() of that result. It works for dividers that are bigger than 1. For small dividers such as 0.01 the result of the division is usually not integer (even when it should be integer, see issue [#84](https://github.com/epoberezkin/ajv/issues/84)). If you need to use fractional dividers set this option to some positive integer N to have `multipleOf` validated using this formula: `Math.abs(Math.round(division) - division) < 1e-N` (it is slower but allows for float arithmetics deviations). +- _errorDataPath_ (deprecated): set `dataPath` to point to 'object' (default) or to 'property' when validating keywords `required`, `additionalProperties` and `dependencies`. +- _messages_: Include human-readable messages in errors. `true` by default. `false` can be passed when custom messages are used (e.g. with [ajv-i18n](https://github.com/epoberezkin/ajv-i18n)). +- _sourceCode_: add `sourceCode` property to validating function (for debugging; this code can be different from the result of toString call). +- _processCode_: an optional function to process generated code before it is passed to Function constructor. It can be used to either beautify (the validating function is generated without line-breaks) or to transpile code. Starting from version 5.0.0 this option replaced options: + - `beautify` that formatted the generated function using [js-beautify](https://github.com/beautify-web/js-beautify). If you want to beautify the generated code pass `require('js-beautify').js_beautify`. + - `transpile` that transpiled asynchronous validation function. You can still use `transpile` option with [ajv-async](https://github.com/epoberezkin/ajv-async) package. See [Asynchronous validation](#asynchronous-validation) for more information. +- _cache_: an optional instance of cache to store compiled schemas using stable-stringified schema as a key. For example, set-associative cache [sacjs](https://github.com/epoberezkin/sacjs) can be used. If not passed then a simple hash is used which is good enough for the common use case (a limited number of statically defined schemas). Cache should have methods `put(key, value)`, `get(key)`, `del(key)` and `clear()`. +- _serialize_: an optional function to serialize schema to cache key. Pass `false` to use schema itself as a key (e.g., if WeakMap used as a cache). By default [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used. + + +## Validation errors + +In case of validation failure, Ajv assigns the array of errors to `errors` property of validation function (or to `errors` property of Ajv instance when `validate` or `validateSchema` methods were called). In case of [asynchronous validation](#asynchronous-validation), the returned promise is rejected with exception `Ajv.ValidationError` that has `errors` property. + + +### Error objects + +Each error is an object with the following properties: + +- _keyword_: validation keyword. +- _dataPath_: the path to the part of the data that was validated. By default `dataPath` uses JavaScript property access notation (e.g., `".prop[1].subProp"`). When the option `jsonPointers` is true (see [Options](#options)) `dataPath` will be set using JSON pointer standard (e.g., `"/prop/1/subProp"`). +- _schemaPath_: the path (JSON-pointer as a URI fragment) to the schema of the keyword that failed validation. +- _params_: the object with the additional information about error that can be used to create custom error messages (e.g., using [ajv-i18n](https://github.com/epoberezkin/ajv-i18n) package). See below for parameters set by all keywords. +- _message_: the standard error message (can be excluded with option `messages` set to false). +- _schema_: the schema of the keyword (added with `verbose` option). +- _parentSchema_: the schema containing the keyword (added with `verbose` option) +- _data_: the data validated by the keyword (added with `verbose` option). + +__Please note__: `propertyNames` keyword schema validation errors have an additional property `propertyName`, `dataPath` points to the object. After schema validation for each property name, if it is invalid an additional error is added with the property `keyword` equal to `"propertyNames"`. + + +### Error parameters + +Properties of `params` object in errors depend on the keyword that failed validation. + +- `maxItems`, `minItems`, `maxLength`, `minLength`, `maxProperties`, `minProperties` - property `limit` (number, the schema of the keyword). +- `additionalItems` - property `limit` (the maximum number of allowed items in case when `items` keyword is an array of schemas and `additionalItems` is false). +- `additionalProperties` - property `additionalProperty` (the property not used in `properties` and `patternProperties` keywords). +- `dependencies` - properties: + - `property` (dependent property), + - `missingProperty` (required missing dependency - only the first one is reported currently) + - `deps` (required dependencies, comma separated list as a string), + - `depsCount` (the number of required dependencies). +- `format` - property `format` (the schema of the keyword). +- `maximum`, `minimum` - properties: + - `limit` (number, the schema of the keyword), + - `exclusive` (boolean, the schema of `exclusiveMaximum` or `exclusiveMinimum`), + - `comparison` (string, comparison operation to compare the data to the limit, with the data on the left and the limit on the right; can be "<", "<=", ">", ">=") +- `multipleOf` - property `multipleOf` (the schema of the keyword) +- `pattern` - property `pattern` (the schema of the keyword) +- `required` - property `missingProperty` (required property that is missing). +- `propertyNames` - property `propertyName` (an invalid property name). +- `patternRequired` (in ajv-keywords) - property `missingPattern` (required pattern that did not match any property). +- `type` - property `type` (required type(s), a string, can be a comma-separated list) +- `uniqueItems` - properties `i` and `j` (indices of duplicate items). +- `const` - property `allowedValue` pointing to the value (the schema of the keyword). +- `enum` - property `allowedValues` pointing to the array of values (the schema of the keyword). +- `$ref` - property `ref` with the referenced schema URI. +- `oneOf` - property `passingSchemas` (array of indices of passing schemas, null if no schema passes). +- custom keywords (in case keyword definition doesn't create errors) - property `keyword` (the keyword name). + + +## Plugins + +Ajv can be extended with plugins that add custom keywords, formats or functions to process generated code. When such plugin is published as npm package it is recommended that it follows these conventions: + +- it exports a function +- this function accepts ajv instance as the first parameter and returns the same instance to allow chaining +- this function can accept an optional configuration as the second parameter + +If you have published a useful plugin please submit a PR to add it to the next section. + + +## Related packages + +- [ajv-async](https://github.com/epoberezkin/ajv-async) - plugin to configure async validation mode +- [ajv-bsontype](https://github.com/BoLaMN/ajv-bsontype) - plugin to validate mongodb's bsonType formats +- [ajv-cli](https://github.com/jessedc/ajv-cli) - command line interface +- [ajv-errors](https://github.com/epoberezkin/ajv-errors) - plugin for custom error messages +- [ajv-i18n](https://github.com/epoberezkin/ajv-i18n) - internationalised error messages +- [ajv-istanbul](https://github.com/epoberezkin/ajv-istanbul) - plugin to instrument generated validation code to measure test coverage of your schemas +- [ajv-keywords](https://github.com/epoberezkin/ajv-keywords) - plugin with custom validation keywords (select, typeof, etc.) +- [ajv-merge-patch](https://github.com/epoberezkin/ajv-merge-patch) - plugin with keywords $merge and $patch +- [ajv-pack](https://github.com/epoberezkin/ajv-pack) - produces a compact module exporting validation functions + + +## Some packages using Ajv + +- [webpack](https://github.com/webpack/webpack) - a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser +- [jsonscript-js](https://github.com/JSONScript/jsonscript-js) - the interpreter for [JSONScript](http://www.jsonscript.org) - scripted processing of existing endpoints and services +- [osprey-method-handler](https://github.com/mulesoft-labs/osprey-method-handler) - Express middleware for validating requests and responses based on a RAML method object, used in [osprey](https://github.com/mulesoft/osprey) - validating API proxy generated from a RAML definition +- [har-validator](https://github.com/ahmadnassri/har-validator) - HTTP Archive (HAR) validator +- [jsoneditor](https://github.com/josdejong/jsoneditor) - a web-based tool to view, edit, format, and validate JSON http://jsoneditoronline.org +- [JSON Schema Lint](https://github.com/nickcmaynard/jsonschemalint) - a web tool to validate JSON/YAML document against a single JSON Schema http://jsonschemalint.com +- [objection](https://github.com/vincit/objection.js) - SQL-friendly ORM for Node.js +- [table](https://github.com/gajus/table) - formats data into a string table +- [ripple-lib](https://github.com/ripple/ripple-lib) - a JavaScript API for interacting with [Ripple](https://ripple.com) in Node.js and the browser +- [restbase](https://github.com/wikimedia/restbase) - distributed storage with REST API & dispatcher for backend services built to provide a low-latency & high-throughput API for Wikipedia / Wikimedia content +- [hippie-swagger](https://github.com/CacheControl/hippie-swagger) - [Hippie](https://github.com/vesln/hippie) wrapper that provides end to end API testing with swagger validation +- [react-form-controlled](https://github.com/seeden/react-form-controlled) - React controlled form components with validation +- [rabbitmq-schema](https://github.com/tjmehta/rabbitmq-schema) - a schema definition module for RabbitMQ graphs and messages +- [@query/schema](https://www.npmjs.com/package/@query/schema) - stream filtering with a URI-safe query syntax parsing to JSON Schema +- [chai-ajv-json-schema](https://github.com/peon374/chai-ajv-json-schema) - chai plugin to us JSON Schema with expect in mocha tests +- [grunt-jsonschema-ajv](https://github.com/SignpostMarv/grunt-jsonschema-ajv) - Grunt plugin for validating files against JSON Schema +- [extract-text-webpack-plugin](https://github.com/webpack-contrib/extract-text-webpack-plugin) - extract text from bundle into a file +- [electron-builder](https://github.com/electron-userland/electron-builder) - a solution to package and build a ready for distribution Electron app +- [addons-linter](https://github.com/mozilla/addons-linter) - Mozilla Add-ons Linter +- [gh-pages-generator](https://github.com/epoberezkin/gh-pages-generator) - multi-page site generator converting markdown files to GitHub pages +- [ESLint](https://github.com/eslint/eslint) - the pluggable linting utility for JavaScript and JSX + + +## Tests + +``` +npm install +git submodule update --init +npm test +``` + +## Contributing + +All validation functions are generated using doT templates in [dot](https://github.com/epoberezkin/ajv/tree/master/lib/dot) folder. Templates are precompiled so doT is not a run-time dependency. + +`npm run build` - compiles templates to [dotjs](https://github.com/epoberezkin/ajv/tree/master/lib/dotjs) folder. + +`npm run watch` - automatically compiles templates when files in dot folder change + +Please see [Contributing guidelines](https://github.com/epoberezkin/ajv/blob/master/CONTRIBUTING.md) + + +## Changes history + +See https://github.com/epoberezkin/ajv/releases + +__Please note__: [Changes in version 6.0.0](https://github.com/epoberezkin/ajv/releases/tag/v6.0.0). + +[Version 5.0.0](https://github.com/epoberezkin/ajv/releases/tag/5.0.0). + +[Version 4.0.0](https://github.com/epoberezkin/ajv/releases/tag/4.0.0). + +[Version 3.0.0](https://github.com/epoberezkin/ajv/releases/tag/3.0.0). + +[Version 2.0.0](https://github.com/epoberezkin/ajv/releases/tag/2.0.0). + + +## Open-source software support + +Ajv is a part of [Tidelift subscription](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=readme) - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers. + + +## License + +[MIT](https://github.com/epoberezkin/ajv/blob/master/LICENSE) diff --git a/node_modules/ajv/dist/ajv.bundle.js b/node_modules/ajv/dist/ajv.bundle.js new file mode 100644 index 0000000..2ebb4c3 --- /dev/null +++ b/node_modules/ajv/dist/ajv.bundle.js @@ -0,0 +1,7163 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Ajv = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; +var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+-.]*:)(?:\/?\/)?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: hostname, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function isLeapYear(year) { + // https://tools.ietf.org/html/rfc3339#appendix-C + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var year = +matches[1]; + var month = +matches[2]; + var day = +matches[3]; + + return month >= 1 && month <= 12 && day >= 1 && + day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return ((hour <= 23 && minute <= 59 && second <= 59) || + (hour == 23 && minute == 59 && second == 60)) && + (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +function hostname(str) { + // https://tools.ietf.org/html/rfc1034#section-3.5 + // https://tools.ietf.org/html/rfc1123#section-2 + return str.length <= 255 && HOSTNAME.test(str); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} + +},{"./util":10}],5:[function(require,module,exports){ +'use strict'; + +var resolve = require('./resolve') + , util = require('./util') + , errorClasses = require('./error_classes') + , stableStringify = require('fast-json-stable-stringify'); + +var validateGenerator = require('../dotjs/validate'); + +/** + * Functions below are used inside compiled validations function + */ + +var ucs2length = util.ucs2length; +var equal = require('fast-deep-equal'); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + /* @this {*} - custom context, see passContext option */ + function callValidate() { + /* jshint validthis: true */ + var validate = compilation.validate; + var result = validate.apply(this, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && !!refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + if (self._opts.validateSchema !== false) { + var deps = rule.definition.dependencies; + if (deps && !deps.every(function(keyword) { + return Object.prototype.hasOwnProperty.call(parentSchema, keyword); + })) + throw new Error('parent schema must have all required keywords: ' + deps.join(',')); + + var validateSchema = rule.definition.validateSchema; + if (validateSchema) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + + +module.exports = { + copy: copy, + checkDataType: checkDataType, + checkDataTypes: checkDataTypes, + coerceToTypes: coerceToTypes, + toHash: toHash, + getProperty: getProperty, + escapeQuotes: escapeQuotes, + equal: require('fast-deep-equal'), + ucs2length: require('./ucs2length'), + varOccurences: varOccurences, + varReplace: varReplace, + cleanUpCode: cleanUpCode, + finalCleanUpCode: finalCleanUpCode, + schemaHasRules: schemaHasRules, + schemaHasRulesExcept: schemaHasRulesExcept, + schemaUnknownRules: schemaUnknownRules, + toQuotedString: toQuotedString, + getPathExpr: getPathExpr, + getPath: getPath, + getData: getData, + unescapeFragment: unescapeFragment, + unescapeJsonPointer: unescapeJsonPointer, + escapeFragment: escapeFragment, + escapeJsonPointer: escapeJsonPointer +}; + + +function copy(o, to) { + to = to || {}; + for (var key in o) to[key] = o[key]; + return to; +} + + +function checkDataType(dataType, data, negate) { + var EQUAL = negate ? ' !== ' : ' === ' + , AND = negate ? ' || ' : ' && ' + , OK = negate ? '!' : '' + , NOT = negate ? '' : '!'; + switch (dataType) { + case 'null': return data + EQUAL + 'null'; + case 'array': return OK + 'Array.isArray(' + data + ')'; + case 'object': return '(' + OK + data + AND + + 'typeof ' + data + EQUAL + '"object"' + AND + + NOT + 'Array.isArray(' + data + '))'; + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + + NOT + '(' + data + ' % 1)' + + AND + data + EQUAL + data + ')'; + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; + } +} + + +function checkDataTypes(dataTypes, data) { + switch (dataTypes.length) { + case 1: return checkDataType(dataTypes[0], data, true); + default: + var code = ''; + var types = toHash(dataTypes); + if (types.array && types.object) { + code = types.null ? '(': '(!' + data + ' || '; + code += 'typeof ' + data + ' !== "object")'; + delete types.null; + delete types.array; + delete types.object; + } + if (types.number) delete types.integer; + for (var t in types) + code += (code ? ' && ' : '' ) + checkDataType(t, data, true); + + return code; + } +} + + +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); +function coerceToTypes(optionCoerceTypes, dataTypes) { + if (Array.isArray(dataTypes)) { + var types = []; + for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],14:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],15:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],16:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],17:[function(require,module,exports){ +'use strict'; +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + out = it.util.cleanUpCode(out); + return out; +} + +},{}],18:[function(require,module,exports){ +'use strict'; +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return (it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all)); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + out = it.util.cleanUpCode(out); + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],19:[function(require,module,exports){ +'use strict'; +module.exports = function generate_comment(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $comment = it.util.toQuotedString($schema); + if (it.opts.$comment === true) { + out += ' console.log(' + ($comment) + ');'; + } else if (typeof it.opts.$comment == 'function') { + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; + } + return out; +} + +},{}],20:[function(require,module,exports){ +'use strict'; +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],21:[function(require,module,exports){ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = (it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all)); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + out = it.util.cleanUpCode(out); + return out; +} + +},{}],22:[function(require,module,exports){ +'use strict'; +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += 'await '; + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; + } + out += ') { '; + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} + +},{}],24:[function(require,module,exports){ +'use strict'; +module.exports = function generate_enum(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $i = 'i' + $lvl, + $vSchema = 'schema' + $lvl; + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ';'; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to one of the allowed values\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],25:[function(require,module,exports){ +'use strict'; +module.exports = function generate_format(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + if (it.opts.format === false) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $unknownFormats = it.opts.unknownFormats, + $allowUnknown = Array.isArray($unknownFormats); + if ($isData) { + var $format = 'format' + $lvl, + $isObject = 'isObject' + $lvl, + $formatType = 'formatType' + $lvl; + out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; + if (it.async) { + out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; + } + out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' ('; + if ($unknownFormats != 'ignore') { + out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; + if ($allowUnknown) { + out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; + } + out += ') || '; + } + out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; + if (it.async) { + out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; + } else { + out += ' ' + ($format) + '(' + ($data) + ') '; + } + out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; + } else { + var $format = it.formats[$schema]; + if (!$format) { + if ($unknownFormats == 'ignore') { + it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],26:[function(require,module,exports){ +'use strict'; +module.exports = function generate_if(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + var $thenSch = it.schema['then'], + $elseSch = it.schema['else'], + $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? typeof $thenSch == 'object' && Object.keys($thenSch).length > 0 : it.util.schemaHasRules($thenSch, it.RULES.all)), + $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? typeof $elseSch == 'object' && Object.keys($elseSch).length > 0 : it.util.schemaHasRules($elseSch, it.RULES.all)), + $currentBaseId = $it.baseId; + if ($thenPresent || $elsePresent) { + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + $it.createErrors = true; + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + if ($thenPresent) { + out += ' if (' + ($nextValid) + ') { '; + $it.schema = it.schema['then']; + $it.schemaPath = it.schemaPath + '.then'; + $it.errSchemaPath = it.errSchemaPath + '/then'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'then\'; '; + } else { + $ifClause = '\'then\''; + } + out += ' } '; + if ($elsePresent) { + out += ' else { '; + } + } else { + out += ' if (!' + ($nextValid) + ') { '; + } + if ($elsePresent) { + $it.schema = it.schema['else']; + $it.schemaPath = it.schemaPath + '.else'; + $it.errSchemaPath = it.errSchemaPath + '/else'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'else\'; '; + } else { + $ifClause = '\'else\''; + } + out += ' } '; + } + out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + out = it.util.cleanUpCode(out); + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],27:[function(require,module,exports){ +'use strict'; + +//all requires must be explicit because browserify won't work with dynamic requires +module.exports = { + '$ref': require('./ref'), + allOf: require('./allOf'), + anyOf: require('./anyOf'), + '$comment': require('./comment'), + const: require('./const'), + contains: require('./contains'), + dependencies: require('./dependencies'), + 'enum': require('./enum'), + format: require('./format'), + 'if': require('./if'), + items: require('./items'), + maximum: require('./_limit'), + minimum: require('./_limit'), + maxItems: require('./_limitItems'), + minItems: require('./_limitItems'), + maxLength: require('./_limitLength'), + minLength: require('./_limitLength'), + maxProperties: require('./_limitProperties'), + minProperties: require('./_limitProperties'), + multipleOf: require('./multipleOf'), + not: require('./not'), + oneOf: require('./oneOf'), + pattern: require('./pattern'), + properties: require('./properties'), + propertyNames: require('./propertyNames'), + required: require('./required'), + uniqueItems: require('./uniqueItems'), + validate: require('./validate') +}; + +},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(require,module,exports){ +'use strict'; +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0 : it.util.schemaHasRules($additionalItems, it.RULES.all))) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} + +},{}],29:[function(require,module,exports){ +'use strict'; +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],30:[function(require,module,exports){ +'use strict'; +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} + +},{}],31:[function(require,module,exports){ +'use strict'; +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $prevValid = 'prevValid' + $lvl, + $passingSchemas = 'passingSchemas' + $lvl; + out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} + +},{}],32:[function(require,module,exports){ +'use strict'; +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],33:[function(require,module,exports){ +'use strict'; +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required); + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 8) { + out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is an invalid additional property'; + } else { + out += 'should NOT have additional properties'; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr4 = $pPropertyKeys; + if (arr4) { + var $pProperty, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $pProperty = arr4[i4 += 1]; + var $sch = $pProperties[$pProperty]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} + +},{}],34:[function(require,module,exports){ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;'; + if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0 : it.util.schemaHasRules($propertySch, it.RULES.all)))) { + $required[$required.length] = $property; + } + } + } + } else { + var $required = $schema; + } + } + if ($isData || $required.length) { + var $currentErrorPath = it.errorPath, + $loopRequired = $isData || $required.length >= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} + +},{}],37:[function(require,module,exports){ +'use strict'; +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; + var $itemType = it.schema.items && it.schema.items.type, + $typeIsArray = Array.isArray($itemType); + if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { + out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; + } else { + out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; + var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); + out += ' if (' + (it.util[$method]($itemType, 'item', true)) + ') continue; '; + if ($typeIsArray) { + out += ' if (typeof item == \'string\') item = \'"\' + item; '; + } + out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; + } + out += ' } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],38:[function(require,module,exports){ +'use strict'; +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } + if (it.isTop) { + out += ' var validate = '; + if ($async) { + it.async = true; + out += 'async '; + } + out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }; return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [undefined]; + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if (it.schema.$comment && it.opts.$comment) { + out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; + } + out += ' var ' + ($coerced) + ' = undefined; '; + var $bracesCoercion = ''; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($i) { + out += ' if (' + ($coerced) + ' === undefined) { '; + $bracesCoercion += '}'; + } + if (it.opts.coerceTypes == 'array' && $type != 'array') { + out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } '; + } + if ($type == 'string') { + out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { '; + } + if (it.opts.useDefaults) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }; return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + out = it.util.cleanUpCode(out); + if ($top) { + out = it.util.finalCleanUpCode(out, $async); + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} + +},{}],39:[function(require,module,exports){ +'use strict'; + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = require('./dotjs/custom'); +var definitionSchema = require('./definition_schema'); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword, + validate: validateKeyword +}; + + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + this.validateKeyword(definition, true); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + for (var i=0; i 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } else { + return sets[0]; + } +} +function subexp(str) { + return "(?:" + str + ")"; +} +function typeOf(o) { + return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase(); +} +function toUpperCase(str) { + return str.toUpperCase(); +} +function toArray(obj) { + return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : []; +} +function assign(target, source) { + var obj = target; + if (source) { + for (var key in source) { + obj[key] = source[key]; + } + } + return obj; +} + +function buildExps(isIRI) { + var ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), + //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), + //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), + UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", + //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", + //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), + SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), + //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), + // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), + // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), + //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), + //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), + //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), + //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), + //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), + //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), + //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), + ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), + //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), + //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), + //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), + //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), + PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), + PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), + //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), + //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), + //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), + FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), + RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", + SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +var URI_PROTOCOL = buildExps(false); + +var IRI_PROTOCOL = buildExps(true); + +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); + + + + + + + + + + + + + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** Highest positive signed 32-bit float value */ + +var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +var base = 36; +var tMin = 1; +var tMax = 26; +var skew = 38; +var damp = 700; +var initialBias = 72; +var initialN = 128; // 0x80 +var delimiter = '-'; // '\x2D' + +/** Regular expressions */ +var regexPunycode = /^xn--/; +var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +var errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +var baseMinusTMin = base - tMin; +var floor = Math.floor; +var stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error$1(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + var result = []; + var length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + var output = []; + var counter = 0; + var length = string.length; + while (counter < length) { + var value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + var extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +var ucs2encode = function ucs2encode(array) { + return String.fromCodePoint.apply(String, toConsumableArray(array)); +}; + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +var basicToDigit = function basicToDigit(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +var digitToBasic = function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +var adapt = function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +var decode = function decode(input) { + // Don't use UCS-2. + var output = []; + var inputLength = input.length; + var i = 0; + var n = initialN; + var bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + var basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (var j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error$1('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{ + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + var oldi = i; + for (var w = 1, k = base;; /* no condition */k += base) { + + if (index >= inputLength) { + error$1('invalid-input'); + } + + var digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error$1('overflow'); + } + + i += digit * w; + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (digit < t) { + break; + } + + var baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error$1('overflow'); + } + + w *= baseMinusT; + } + + var out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error$1('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + } + + return String.fromCodePoint.apply(String, output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +var encode = function encode(input) { + var output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + var inputLength = input.length; + + // Initialize the state. + var n = initialN; + var delta = 0; + var bias = initialBias; + + // Handle the basic code points. + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _currentValue2 = _step.value; + + if (_currentValue2 < 0x80) { + output.push(stringFromCharCode(_currentValue2)); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var basicLength = output.length; + var handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + var m = maxInt; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var currentValue = _step2.value; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + var handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error$1('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _currentValue = _step3.value; + + if (_currentValue < n && ++delta > maxInt) { + error$1('overflow'); + } + if (_currentValue == n) { + // Represent delta as a generalized variable-length integer. + var q = delta; + for (var k = base;; /* no condition */k += base) { + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + var qMinusT = q - t; + var baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + ++delta; + ++n; + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +var toUnicode = function toUnicode(input) { + return mapDomain(input, function (string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +var toASCII = function toASCII(input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +var punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``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 GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +var SCHEMES = {}; +function pctEncChar(chr) { + var c = chr.charCodeAt(0); + var e = void 0; + if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); + return e; +} +function pctDecChars(str) { + var newStr = ""; + var i = 0; + var il = str.length; + while (i < il) { + var c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } else if (c >= 194 && c < 224) { + if (il - i >= 6) { + var c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode((c & 31) << 6 | c2 & 63); + } else { + newStr += str.substr(i, 6); + } + i += 6; + } else if (c >= 224) { + if (il - i >= 9) { + var _c = parseInt(str.substr(i + 4, 2), 16); + var c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63); + } else { + newStr += str.substr(i, 9); + } + i += 9; + } else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(protocol.UNRESERVED) ? str : decStr; + } + if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} + +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + var matches = host.match(protocol.IPV4ADDRESS) || []; + + var _matches = slicedToArray(matches, 2), + address = _matches[1]; + + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + var matches = host.match(protocol.IPV6ADDRESS) || []; + + var _matches2 = slicedToArray(matches, 3), + address = _matches2[1], + zone = _matches2[2]; + + if (address) { + var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(), + _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), + last = _address$toLowerCase$2[0], + first = _address$toLowerCase$2[1]; + + var firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + var lastFields = last.split(":").map(_stripLeadingZeros); + var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + var fieldCount = isLastFieldIPv4Address ? 7 : 8; + var lastFieldsStart = lastFields.length - fieldCount; + var fields = Array(fieldCount); + for (var x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + var allZeroFields = fields.reduce(function (acc, field, index) { + if (!field || field === "0") { + var lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } else { + acc.push({ index: index, length: 1 }); + } + } + return acc; + }, []); + var longestZeroFields = allZeroFields.sort(function (a, b) { + return b.length - a.length; + })[0]; + var newHost = void 0; + if (longestZeroFields && longestZeroFields.length > 1) { + var newFirst = fields.slice(0, longestZeroFields.index); + var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } else { + return host; + } +} +var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined; +function parse(uriString) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var components = {}; + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + var matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } else { + //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined; + components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined; + components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined; + //fix port number + if (isNaN(components.port)) { + components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined; + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } else if (components.scheme === undefined) { + components.reference = "relative"; + } else if (components.fragment === undefined) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} + +function _recomposeAuthority(components, options) { + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) { + return "[" + $1 + ($2 ? "%25" + $2 : "") + "]"; + })); + } + if (typeof components.port === "number") { + uriTokens.push(":"); + uriTokens.push(components.port.toString(10)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} + +var RDS1 = /^\.\.?\//; +var RDS2 = /^\/\.(\/|$)/; +var RDS3 = /^\/\.\.(\/|$)/; +var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +function removeDotSegments(input) { + var output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } else if (input === "." || input === "..") { + input = ""; + } else { + var im = input.match(RDS5); + if (im) { + var s = im[0]; + input = input.slice(s.length); + output.push(s); + } else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} + +function serialize(components) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) {} + //TODO: normalize IPv6 address as per RFC 5952 + + //if host component is a domain name + else if (options.domainHost || schemeHandler && schemeHandler.domainHost) { + //convert IDN via punycode + try { + components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + var authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + var s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} + +function resolveComponents(base, relative) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var skipNormalization = arguments[3]; + + var target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} + +function resolve(baseURI, relativeURI, options) { + var schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} + +function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} + +function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} + +function escapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar); +} + +function unescapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars); +} + +var handler = { + scheme: "http", + domainHost: true, + parse: function parse(components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function serialize(components, options) { + //normalize the default port + if (components.port === (String(components.scheme).toLowerCase() !== "https" ? 80 : 443) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; + +var handler$1 = { + scheme: "https", + domainHost: handler.domainHost, + parse: handler.parse, + serialize: handler.serialize +}; + +var O = {}; +var isIRI = true; +//RFC 3986 +var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +var UNRESERVED = new RegExp(UNRESERVED$$, "g"); +var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +var NOT_HFVALUE = NOT_HFNAME; +function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(UNRESERVED) ? str : decStr; +} +var handler$2 = { + scheme: "mailto", + parse: function parse$$1(components, options) { + var mailtoComponents = components; + var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : []; + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + var unknownHeaders = false; + var headers = {}; + var hfields = mailtoComponents.query.split("&"); + for (var x = 0, xl = hfields.length; x < xl; ++x) { + var hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + var toAddrs = hfield[1].split(","); + for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) { + to.push(toAddrs[_x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) { + var addr = to[_x2].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[_x2] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function serialize$$1(mailtoComponents, options) { + var components = mailtoComponents; + var to = toArray(mailtoComponents.to); + if (to) { + for (var x = 0, xl = to.length; x < xl; ++x) { + var toAddr = String(to[x]); + var atIdx = toAddr.lastIndexOf("@"); + var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + var domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain); + } catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + var headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) headers["body"] = mailtoComponents.body; + var fields = []; + for (var name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; + +var URN_PARSE = /^([^\:]+)\:(.*)/; +//RFC 2141 +var handler$3 = { + scheme: "urn", + parse: function parse$$1(components, options) { + var matches = components.path && components.path.match(URN_PARSE); + var urnComponents = components; + if (matches) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = matches[1].toLowerCase(); + var nss = matches[2]; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function serialize$$1(urnComponents, options) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = urnComponents.nid; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + var uriComponents = urnComponents; + var nss = urnComponents.nss; + uriComponents.path = (nid || options.nid) + ":" + nss; + return uriComponents; + } +}; + +var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +//RFC 4122 +var handler$4 = { + scheme: "urn:uuid", + parse: function parse(urnComponents, options) { + var uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function serialize(uuidComponents, options) { + var urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + } +}; + +SCHEMES[handler.scheme] = handler; +SCHEMES[handler$1.scheme] = handler$1; +SCHEMES[handler$2.scheme] = handler$2; +SCHEMES[handler$3.scheme] = handler$3; +SCHEMES[handler$4.scheme] = handler$4; + +exports.SCHEMES = SCHEMES; +exports.pctEncChar = pctEncChar; +exports.pctDecChars = pctDecChars; +exports.parse = parse; +exports.removeDotSegments = removeDotSegments; +exports.serialize = serialize; +exports.resolveComponents = resolveComponents; +exports.resolve = resolve; +exports.normalize = normalize; +exports.equal = equal; +exports.escapeComponent = escapeComponent; +exports.unescapeComponent = unescapeComponent; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + + +},{}],"ajv":[function(require,module,exports){ +'use strict'; + +var compileSchema = require('./compile') + , resolve = require('./compile/resolve') + , Cache = require('./cache') + , SchemaObject = require('./compile/schema_obj') + , stableStringify = require('fast-json-stable-stringify') + , formats = require('./compile/formats') + , rules = require('./compile/rules') + , $dataMetaSchema = require('./data') + , util = require('./compile/util'); + +module.exports = Ajv; + +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; + +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async'); +var customKeyword = require('./keyword'); +Ajv.prototype.addKeyword = customKeyword.add; +Ajv.prototype.getKeyword = customKeyword.get; +Ajv.prototype.removeKeyword = customKeyword.remove; +Ajv.prototype.validateKeyword = customKeyword.validate; + +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; + +var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; +var META_SUPPORT_DATA = ['/properties']; + +/** + * Creates validator instance. + * Usage: `Ajv(opts)` + * @param {Object} opts optional options + * @return {Object} ajv instance + */ +function Ajv(opts) { + if (!(this instanceof Ajv)) return new Ajv(opts); + opts = this._opts = util.copy(opts) || {}; + setLogger(this); + this._schemas = {}; + this._refs = {}; + this._fragments = {}; + this._formats = formats(opts.format); + + this._cache = opts.cache || new Cache; + this._loadingSchemas = {}; + this._compilations = []; + this.RULES = rules(); + this._getId = chooseGetId(opts); + + opts.loopRequired = opts.loopRequired || Infinity; + if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; + if (opts.serialize === undefined) opts.serialize = stableStringify; + this._metaOpts = getMetaSchemaOptions(this); + + if (opts.formats) addInitialFormats(this); + addDefaultMetaSchema(this); + if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); + if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); + addInitialSchemas(this); +} + + + +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. + * @this Ajv + * @param {String|Object} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { + var v; + if (typeof schemaKeyRef == 'string') { + v = this.getSchema(schemaKeyRef); + if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); + } else { + var schemaObj = this._addSchema(schemaKeyRef); + v = schemaObj.validate || this._compile(schemaObj); + } + + var valid = v(data); + if (v.$async !== true) this.errors = v.errors; + return valid; +} + + +/** + * Create validating function for passed schema. + * @this Ajv + * @param {Object} schema schema object + * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { + var schemaObj = this._addSchema(schema, undefined, _meta); + return schemaObj.validate || this._compile(schemaObj); +} + + +/** + * Adds schema to the instance. + * @this Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + * @return {Ajv} this for method chaining + */ +function addSchema(schema, key, _skipValidation, _meta) { + if (Array.isArray(schema)){ + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,f=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,p=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":f,"relative-json-pointer":p},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:function(e){return e.length<=255&&s.test(e)},ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":f,"relative-json-pointer":p};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var j=e("./resolve"),O=e("./util"),I=e("./error_classes"),A=e("fast-json-stable-stringify"),C=e("../dotjs/validate"),k=O.ucs2length,L=e("fast-deep-equal"),z=I.Validation;function T(e,r,t){var a=s.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}function q(e,r,t){var a=s.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}function s(e,r,t){for(var a=0;a",y=d?">":"<",g=void 0;if(m){var P=e.util.getData(p.$data,o,e.dataPathArr),E="exclusive"+s,w="exclType"+s,b="exclIsNumber"+s,S="' + "+(x="op"+s)+" + '";a+=" var schemaExcl"+s+" = "+P+"; ";var _;g=f;(_=_||[]).push(a+=" var "+E+"; var "+w+" = typeof "+(P="schemaExcl"+s)+"; if ("+w+" != 'boolean' && "+w+" != 'undefined' && "+w+" != 'number') { "),a="",!1!==e.createErrors?(a+=" { keyword: '"+(g||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(a+=" , message: '"+f+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var F=a;a=_.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+F+"]); ":" validate.errors = ["+F+"]; return false; ":" var err = "+F+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else if ( ",h&&(a+=" ("+t+" !== undefined && typeof "+t+" != 'number') || "),a+=" "+w+" == 'number' ? ( ("+E+" = "+t+" === undefined || "+P+" "+v+"= "+t+") ? "+u+" "+y+"= "+P+" : "+u+" "+y+" "+t+" ) : ( ("+E+" = "+P+" === true) ? "+u+" "+y+"= "+t+" : "+u+" "+y+" "+t+" ) || "+u+" !== "+u+") { var op"+s+" = "+E+" ? '"+v+"' : '"+v+"='; ",void 0===i&&(l=e.errSchemaPath+"/"+(g=f),t=P,h=m)}else{S=v;if((b="number"==typeof p)&&h){var x="'"+S+"'";a+=" if ( ",h&&(a+=" ("+t+" !== undefined && typeof "+t+" != 'number') || "),a+=" ( "+t+" === undefined || "+p+" "+v+"= "+t+" ? "+u+" "+y+"= "+p+" : "+u+" "+y+" "+t+" ) || "+u+" !== "+u+") { "}else{b&&void 0===i?(E=!0,l=e.errSchemaPath+"/"+(g=f),t=p,y+="="):(b&&(t=Math[d?"min":"max"](p,i)),p===(!b||t)?(E=!0,l=e.errSchemaPath+"/"+(g=f),y+="="):(E=!1,S+="="));x="'"+S+"'";a+=" if ( ",h&&(a+=" ("+t+" !== undefined && typeof "+t+" != 'number') || "),a+=" "+u+" "+y+" "+t+" || "+u+" !== "+u+") { "}}g=g||r,(_=_||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(g||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { comparison: "+x+", limit: "+t+", exclusive: "+E+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be "+S+" ",a+=h?"' + "+t:t+"'"),e.opts.verbose&&(a+=" , schema: ",a+=h?"validate.schema"+n:""+i,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";F=a;return a=_.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+F+"]); ":" validate.errors = ["+F+"]; return false; ":" var err = "+F+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",c&&(a+=" else { "),a}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+e.util.getProperty(r),l=e.errSchemaPath+"/"+r,c=!e.opts.allErrors,u="data"+(o||""),h=e.opts.$data&&i&&i.$data;t=h?(a+=" var schema"+s+" = "+e.util.getData(i.$data,o,e.dataPathArr)+"; ","schema"+s):i,a+="if ( ",h&&(a+=" ("+t+" !== undefined && typeof "+t+" != 'number') || ");var d=r,f=f||[];f.push(a+=" "+u+".length "+("maxItems"==r?">":"<")+" "+t+") { "),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { limit: "+t+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxItems"==r?"more":"fewer",a+=" than ",a+=h?"' + "+t+" + '":""+i,a+=" items' "),e.opts.verbose&&(a+=" , schema: ",a+=h?"validate.schema"+n:""+i,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var p=a;return a=f.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",c&&(a+=" else { "),a}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+e.util.getProperty(r),l=e.errSchemaPath+"/"+r,c=!e.opts.allErrors,u="data"+(o||""),h=e.opts.$data&&i&&i.$data;t=h?(a+=" var schema"+s+" = "+e.util.getData(i.$data,o,e.dataPathArr)+"; ","schema"+s):i,a+="if ( ",h&&(a+=" ("+t+" !== undefined && typeof "+t+" != 'number') || "),a+=!1===e.opts.unicode?" "+u+".length ":" ucs2length("+u+") ";var d=r,f=f||[];f.push(a+=" "+("maxLength"==r?">":"<")+" "+t+") { "),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { limit: "+t+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT be ",a+="maxLength"==r?"longer":"shorter",a+=" than ",a+=h?"' + "+t+" + '":""+i,a+=" characters' "),e.opts.verbose&&(a+=" , schema: ",a+=h?"validate.schema"+n:""+i,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var p=a;return a=f.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",c&&(a+=" else { "),a}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+e.util.getProperty(r),l=e.errSchemaPath+"/"+r,c=!e.opts.allErrors,u="data"+(o||""),h=e.opts.$data&&i&&i.$data;t=h?(a+=" var schema"+s+" = "+e.util.getData(i.$data,o,e.dataPathArr)+"; ","schema"+s):i,a+="if ( ",h&&(a+=" ("+t+" !== undefined && typeof "+t+" != 'number') || ");var d=r,f=f||[];f.push(a+=" Object.keys("+u+").length "+("maxProperties"==r?">":"<")+" "+t+") { "),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { limit: "+t+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxProperties"==r?"more":"fewer",a+=" than ",a+=h?"' + "+t+" + '":""+i,a+=" properties' "),e.opts.verbose&&(a+=" , schema: ",a+=h?"validate.schema"+n:""+i,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var p=a;return a=f.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",c&&(a+=" else { "),a}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var f,p=-1,m=d.length-1;p "+F+") { ";var R=c+"["+F+"]";d.schema=_,d.schemaPath=i+"["+F+"]",d.errSchemaPath=n+"/"+F,d.errorPath=e.util.getPathExpr(e.errorPath,F,e.opts.jsonPointers,!0),d.dataPathArr[v]=F;var $=e.validate(d);d.baseId=g,e.util.varOccurences($,y)<2?t+=" "+e.util.varReplace($,y,R)+" ":t+=" var "+y+" = "+R+"; "+$+" ",t+=" } ",l&&(t+=" if ("+p+") { ",f+="}")}if("object"==typeof P&&(e.opts.strictKeywords?"object"==typeof P&&0 "+o.length+") { for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0);R=c+"["+m+"]";d.dataPathArr[v]=m;$=e.validate(d);d.baseId=g,e.util.varOccurences($,y)<2?t+=" "+e.util.varReplace($,y,R)+" ":t+=" var "+y+" = "+R+"; "+$+" ",l&&(t+=" if (!"+p+") break; "),t+=" } } ",l&&(t+=" if ("+p+") { ",f+="}")}}else if(e.opts.strictKeywords?"object"==typeof o&&0 1e-"+e.opts.multipleOfPrecision+" ":" division"+s+" !== parseInt(division"+s+") ",a+=" ) ",h&&(a+=" ) ");var d=d||[];d.push(a+=" ) { "),a="",!1!==e.createErrors?(a+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { multipleOf: "+t+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be multiple of ",a+=h?"' + "+t:t+"'"),e.opts.verbose&&(a+=" , schema: ",a+=h?"validate.schema"+n:""+i,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var f=a;return a=d.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",c&&(a+=" else { "),a}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d="valid"+h.level;if(e.opts.strictKeywords?"object"==typeof o&&0 1) { ";var f=e.schema.items&&e.schema.items.type,p=Array.isArray(f);if(!f||"object"==f||"array"==f||p&&(0<=f.indexOf("object")||0<=f.indexOf("array")))a+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+u+"[i], "+u+"[j])) { "+h+" = false; break outer; } } } ";else a+=" var itemIndices = {}, item; for (;i--;) { var item = "+u+"[i]; ",a+=" if ("+e.util["checkDataType"+(p?"s":"")](f,"item",!0)+") continue; ",p&&(a+=" if (typeof item == 'string') item = '\"' + item; "),a+=" if (typeof itemIndices[item] == 'number') { "+h+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ";a+=" } ",d&&(a+=" } ");var m=m||[];m.push(a+=" if (!"+h+") { "),a="",!1!==e.createErrors?(a+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+n:""+i,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var v=a;a=m.pop(),a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+v+"]); ":" validate.errors = ["+v+"]; return false; ":" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",c&&(a+=" else { ")}else c&&(a+=" if (true) { ");return a}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,f=!a.opts.allErrors,p="data"+(c||""),m="valid"+l;if(!1===a.schema){a.isTop?f=!0:r+=" var "+m+" = false; ",(Z=Z||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+p+" "),r+=" } "):r+=" {} ";var v=r;r=Z.pop(),r+=!a.compositeRule&&f?a.async?" throw new ValidationError(["+v+"]); ":" validate.errors = ["+v+"]; return false; ":" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}else r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ";return a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var y=a.isTop;l=a.level=0,c=a.dataLevel=0,p="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[void 0],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var g="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(g);a.logger.warn(g)}r+=" var vErrors = null; ",r+=" var errors = 0; ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,p="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}m="valid"+l,f=!a.opts.allErrors;var P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){if(a.opts.coerceTypes)var S=a.util.coerceToTypes(a.opts.coerceTypes,w);var _=a.RULES.types[w];if(S||b||!0===_||_&&!G(_)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,p,!0)+") { ",S){var F="dataType"+l,x="coerced"+l;r+=" var "+F+" = typeof "+p+"; ","array"==a.opts.coerceTypes&&(r+=" if ("+F+" == 'object' && Array.isArray("+p+")) "+F+" = 'array'; "),r+=" var "+x+" = undefined; ";var R="",$=S;if($)for(var D,j=-1,O=$.length-1;j= 0x80 (not a basic code point)","invalid-input":"Invalid input"},C=Math.floor,k=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1>1,e+=C(e/r);455C((A-s)/h))&&L("overflow"),s+=f*h;var p=d<=i?1:i+26<=d?26:d-i;if(fC(A/m)&&L("overflow"),h*=m}var v=t.length+1;i=q(s-u,v,0==u),C(s/v)>A-o&&L("overflow"),o+=C(s/v),s%=v,t.splice(s++,0,o)}return String.fromCodePoint.apply(String,t)}function c(e){var r=[],t=(e=z(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(k(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,f=d;for(d&&r.push("-");fC((A-s)/w)&&L("overflow"),s+=(p-a)*w,a=p;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(RA&&L("overflow"),R==a){for(var $=s,D=36;;D+=36){var j=D<=o?1:o+26<=D?26:D-o;if($>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function f(e){for(var r="",t=0,a=e.length;tA-Z\\x5E-\\x7E]",'[\\"\\\\]')),M=new RegExp(V,"g"),B=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),G=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',K),"g"),Y=new RegExp(J("[^]",V,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),W=Y;function X(e){var r=f(e);return r.match(M)?r:e}var ee={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n); + + message: string; + errors: Array; + ajv: true; + validation: true; + } + + class MissingRefError extends Error { + constructor(baseId: string, ref: string, message?: string); + static message: (baseId: string, ref: string) => string; + + message: string; + missingRef: string; + missingSchema: string; + } +} + +declare namespace ajv { + type ValidationError = AjvErrors.ValidationError; + + type MissingRefError = AjvErrors.MissingRefError; + + interface Ajv { + /** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key, [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize by default). + * @param {string|object|Boolean} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ + validate(schemaKeyRef: object | string | boolean, data: any): boolean | PromiseLike; + /** + * Create validating function for passed schema. + * @param {object|Boolean} schema schema object + * @return {Function} validating function + */ + compile(schema: object | boolean): ValidateFunction; + /** + * Creates validating function for passed schema with asynchronous loading of missing schemas. + * `loadSchema` option should be a function that accepts schema uri and node-style callback. + * @this Ajv + * @param {object|Boolean} schema schema object + * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped + * @param {Function} callback optional node-style callback, it is always called with 2 parameters: error (or null) and validating function. + * @return {PromiseLike} validating function + */ + compileAsync(schema: object | boolean, meta?: Boolean, callback?: (err: Error, validate: ValidateFunction) => any): PromiseLike; + /** + * Adds schema to the instance. + * @param {object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {string} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @return {Ajv} this for method chaining + */ + addSchema(schema: Array | object, key?: string): Ajv; + /** + * Add schema that will be used to validate other schemas + * options in META_IGNORE_OPTIONS are alway set to false + * @param {object} schema schema object + * @param {string} key optional schema key + * @return {Ajv} this for method chaining + */ + addMetaSchema(schema: object, key?: string): Ajv; + /** + * Validate schema + * @param {object|Boolean} schema schema to validate + * @return {Boolean} true if schema is valid + */ + validateSchema(schema: object | boolean): boolean; + /** + * Get compiled schema from the instance by `key` or `ref`. + * @param {string} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). + * @return {Function} schema validating function (with property `schema`). + */ + getSchema(keyRef: string): ValidateFunction; + /** + * Remove cached schema(s). + * If no parameter is passed all schemas but meta-schemas are removed. + * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + * @param {string|object|RegExp|Boolean} schemaKeyRef key, ref, pattern to match key/ref or schema object + * @return {Ajv} this for method chaining + */ + removeSchema(schemaKeyRef?: object | string | RegExp | boolean): Ajv; + /** + * Add custom format + * @param {string} name format name + * @param {string|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid) + * @return {Ajv} this for method chaining + */ + addFormat(name: string, format: FormatValidator | FormatDefinition): Ajv; + /** + * Define custom keyword + * @this Ajv + * @param {string} keyword custom keyword, should be a valid identifier, should be different from all standard, custom and macro keywords. + * @param {object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ + addKeyword(keyword: string, definition: KeywordDefinition): Ajv; + /** + * Get keyword definition + * @this Ajv + * @param {string} keyword pre-defined or custom keyword. + * @return {object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise. + */ + getKeyword(keyword: string): object | boolean; + /** + * Remove keyword + * @this Ajv + * @param {string} keyword pre-defined or custom keyword. + * @return {Ajv} this for method chaining + */ + removeKeyword(keyword: string): Ajv; + /** + * Validate keyword + * @this Ajv + * @param {object} definition keyword definition object + * @param {boolean} throwError true to throw exception if definition is invalid + * @return {boolean} validation result + */ + validateKeyword(definition: KeywordDefinition, throwError: boolean): boolean; + /** + * Convert array of error message objects to string + * @param {Array} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {object} options optional options with properties `separator` and `dataVar`. + * @return {string} human readable string with all errors descriptions + */ + errorsText(errors?: Array | null, options?: ErrorsTextOptions): string; + errors?: Array | null; + } + + interface CustomLogger { + log(...args: any[]): any; + warn(...args: any[]): any; + error(...args: any[]): any; + } + + interface ValidateFunction { + ( + data: any, + dataPath?: string, + parentData?: object | Array, + parentDataProperty?: string | number, + rootData?: object | Array + ): boolean | PromiseLike; + schema?: object | boolean; + errors?: null | Array; + refs?: object; + refVal?: Array; + root?: ValidateFunction | object; + $async?: true; + source?: object; + } + + interface Options { + $data?: boolean; + allErrors?: boolean; + verbose?: boolean; + jsonPointers?: boolean; + uniqueItems?: boolean; + unicode?: boolean; + format?: string; + formats?: object; + unknownFormats?: true | string[] | 'ignore'; + schemas?: Array | object; + schemaId?: '$id' | 'id' | 'auto'; + missingRefs?: true | 'ignore' | 'fail'; + extendRefs?: true | 'ignore' | 'fail'; + loadSchema?: (uri: string, cb?: (err: Error, schema: object) => void) => PromiseLike; + removeAdditional?: boolean | 'all' | 'failing'; + useDefaults?: boolean | 'empty' | 'shared'; + coerceTypes?: boolean | 'array'; + strictDefaults?: boolean | 'log'; + strictKeywords?: boolean | 'log'; + async?: boolean | string; + transpile?: string | ((code: string) => string); + meta?: boolean | object; + validateSchema?: boolean | 'log'; + addUsedSchema?: boolean; + inlineRefs?: boolean | number; + passContext?: boolean; + loopRequired?: number; + ownProperties?: boolean; + multipleOfPrecision?: boolean | number; + errorDataPath?: string, + messages?: boolean; + sourceCode?: boolean; + processCode?: (code: string) => string; + cache?: object; + logger?: CustomLogger | false; + nullable?: boolean; + serialize?: ((schema: object | boolean) => any) | false; + } + + type FormatValidator = string | RegExp | ((data: string) => boolean | PromiseLike); + type NumberFormatValidator = ((data: number) => boolean | PromiseLike); + + interface NumberFormatDefinition { + type: "number", + validate: NumberFormatValidator; + compare?: (data1: number, data2: number) => number; + async?: boolean; + } + + interface StringFormatDefinition { + type?: "string", + validate: FormatValidator; + compare?: (data1: string, data2: string) => number; + async?: boolean; + } + + type FormatDefinition = NumberFormatDefinition | StringFormatDefinition; + + interface KeywordDefinition { + type?: string | Array; + async?: boolean; + $data?: boolean; + errors?: boolean | string; + metaSchema?: object; + // schema: false makes validate not to expect schema (ValidateFunction) + schema?: boolean; + statements?: boolean; + dependencies?: Array; + modifying?: boolean; + valid?: boolean; + // one and only one of the following properties should be present + validate?: SchemaValidateFunction | ValidateFunction; + compile?: (schema: any, parentSchema: object, it: CompilationContext) => ValidateFunction; + macro?: (schema: any, parentSchema: object, it: CompilationContext) => object | boolean; + inline?: (it: CompilationContext, keyword: string, schema: any, parentSchema: object) => string; + } + + interface CompilationContext { + level: number; + dataLevel: number; + dataPathArr: string[]; + schema: any; + schemaPath: string; + baseId: string; + async: boolean; + opts: Options; + formats: { + [index: string]: FormatDefinition | undefined; + }; + compositeRule: boolean; + validate: (schema: object) => boolean; + util: { + copy(obj: any, target?: any): any; + toHash(source: string[]): { [index: string]: true | undefined }; + equal(obj: any, target: any): boolean; + getProperty(str: string): string; + schemaHasRules(schema: object, rules: any): string; + escapeQuotes(str: string): string; + toQuotedString(str: string): string; + getData(jsonPointer: string, dataLevel: number, paths: string[]): string; + escapeJsonPointer(str: string): string; + unescapeJsonPointer(str: string): string; + escapeFragment(str: string): string; + unescapeFragment(str: string): string; + }; + self: Ajv; + } + + interface SchemaValidateFunction { + ( + schema: any, + data: any, + parentSchema?: object, + dataPath?: string, + parentData?: object | Array, + parentDataProperty?: string | number, + rootData?: object | Array + ): boolean | PromiseLike; + errors?: Array; + } + + interface ErrorsTextOptions { + separator?: string; + dataVar?: string; + } + + interface ErrorObject { + keyword: string; + dataPath: string; + schemaPath: string; + params: ErrorParameters; + // Added to validation errors of propertyNames keyword schema + propertyName?: string; + // Excluded if messages set to false. + message?: string; + // These are added with the `verbose` option. + schema?: any; + parentSchema?: object; + data?: any; + } + + type ErrorParameters = RefParams | LimitParams | AdditionalPropertiesParams | + DependenciesParams | FormatParams | ComparisonParams | + MultipleOfParams | PatternParams | RequiredParams | + TypeParams | UniqueItemsParams | CustomParams | + PatternRequiredParams | PropertyNamesParams | + IfParams | SwitchParams | NoParams | EnumParams; + + interface RefParams { + ref: string; + } + + interface LimitParams { + limit: number; + } + + interface AdditionalPropertiesParams { + additionalProperty: string; + } + + interface DependenciesParams { + property: string; + missingProperty: string; + depsCount: number; + deps: string; + } + + interface FormatParams { + format: string + } + + interface ComparisonParams { + comparison: string; + limit: number | string; + exclusive: boolean; + } + + interface MultipleOfParams { + multipleOf: number; + } + + interface PatternParams { + pattern: string; + } + + interface RequiredParams { + missingProperty: string; + } + + interface TypeParams { + type: string; + } + + interface UniqueItemsParams { + i: number; + j: number; + } + + interface CustomParams { + keyword: string; + } + + interface PatternRequiredParams { + missingPattern: string; + } + + interface PropertyNamesParams { + propertyName: string; + } + + interface IfParams { + failingKeyword: string; + } + + interface SwitchParams { + caseIndex: number; + } + + interface NoParams { } + + interface EnumParams { + allowedValues: Array; + } +} + +export = ajv; diff --git a/node_modules/ajv/lib/ajv.js b/node_modules/ajv/lib/ajv.js new file mode 100644 index 0000000..611b938 --- /dev/null +++ b/node_modules/ajv/lib/ajv.js @@ -0,0 +1,497 @@ +'use strict'; + +var compileSchema = require('./compile') + , resolve = require('./compile/resolve') + , Cache = require('./cache') + , SchemaObject = require('./compile/schema_obj') + , stableStringify = require('fast-json-stable-stringify') + , formats = require('./compile/formats') + , rules = require('./compile/rules') + , $dataMetaSchema = require('./data') + , util = require('./compile/util'); + +module.exports = Ajv; + +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; + +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async'); +var customKeyword = require('./keyword'); +Ajv.prototype.addKeyword = customKeyword.add; +Ajv.prototype.getKeyword = customKeyword.get; +Ajv.prototype.removeKeyword = customKeyword.remove; +Ajv.prototype.validateKeyword = customKeyword.validate; + +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; + +var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; +var META_SUPPORT_DATA = ['/properties']; + +/** + * Creates validator instance. + * Usage: `Ajv(opts)` + * @param {Object} opts optional options + * @return {Object} ajv instance + */ +function Ajv(opts) { + if (!(this instanceof Ajv)) return new Ajv(opts); + opts = this._opts = util.copy(opts) || {}; + setLogger(this); + this._schemas = {}; + this._refs = {}; + this._fragments = {}; + this._formats = formats(opts.format); + + this._cache = opts.cache || new Cache; + this._loadingSchemas = {}; + this._compilations = []; + this.RULES = rules(); + this._getId = chooseGetId(opts); + + opts.loopRequired = opts.loopRequired || Infinity; + if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; + if (opts.serialize === undefined) opts.serialize = stableStringify; + this._metaOpts = getMetaSchemaOptions(this); + + if (opts.formats) addInitialFormats(this); + addDefaultMetaSchema(this); + if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); + if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); + addInitialSchemas(this); +} + + + +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. + * @this Ajv + * @param {String|Object} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { + var v; + if (typeof schemaKeyRef == 'string') { + v = this.getSchema(schemaKeyRef); + if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); + } else { + var schemaObj = this._addSchema(schemaKeyRef); + v = schemaObj.validate || this._compile(schemaObj); + } + + var valid = v(data); + if (v.$async !== true) this.errors = v.errors; + return valid; +} + + +/** + * Create validating function for passed schema. + * @this Ajv + * @param {Object} schema schema object + * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { + var schemaObj = this._addSchema(schema, undefined, _meta); + return schemaObj.validate || this._compile(schemaObj); +} + + +/** + * Adds schema to the instance. + * @this Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + * @return {Ajv} this for method chaining + */ +function addSchema(schema, key, _skipValidation, _meta) { + if (Array.isArray(schema)){ + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; +var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+-.]*:)(?:\/?\/)?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: hostname, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function isLeapYear(year) { + // https://tools.ietf.org/html/rfc3339#appendix-C + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var year = +matches[1]; + var month = +matches[2]; + var day = +matches[3]; + + return month >= 1 && month <= 12 && day >= 1 && + day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return ((hour <= 23 && minute <= 59 && second <= 59) || + (hour == 23 && minute == 59 && second == 60)) && + (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +function hostname(str) { + // https://tools.ietf.org/html/rfc1034#section-3.5 + // https://tools.ietf.org/html/rfc1123#section-2 + return str.length <= 255 && HOSTNAME.test(str); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} diff --git a/node_modules/ajv/lib/compile/index.js b/node_modules/ajv/lib/compile/index.js new file mode 100644 index 0000000..f4d3f0d --- /dev/null +++ b/node_modules/ajv/lib/compile/index.js @@ -0,0 +1,387 @@ +'use strict'; + +var resolve = require('./resolve') + , util = require('./util') + , errorClasses = require('./error_classes') + , stableStringify = require('fast-json-stable-stringify'); + +var validateGenerator = require('../dotjs/validate'); + +/** + * Functions below are used inside compiled validations function + */ + +var ucs2length = util.ucs2length; +var equal = require('fast-deep-equal'); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + /* @this {*} - custom context, see passContext option */ + function callValidate() { + /* jshint validthis: true */ + var validate = compilation.validate; + var result = validate.apply(this, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && !!refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + if (self._opts.validateSchema !== false) { + var deps = rule.definition.dependencies; + if (deps && !deps.every(function(keyword) { + return Object.prototype.hasOwnProperty.call(parentSchema, keyword); + })) + throw new Error('parent schema must have all required keywords: ' + deps.join(',')); + + var validateSchema = rule.definition.validateSchema; + if (validateSchema) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; diff --git a/node_modules/ajv/lib/compile/util.js b/node_modules/ajv/lib/compile/util.js new file mode 100644 index 0000000..0efa001 --- /dev/null +++ b/node_modules/ajv/lib/compile/util.js @@ -0,0 +1,274 @@ +'use strict'; + + +module.exports = { + copy: copy, + checkDataType: checkDataType, + checkDataTypes: checkDataTypes, + coerceToTypes: coerceToTypes, + toHash: toHash, + getProperty: getProperty, + escapeQuotes: escapeQuotes, + equal: require('fast-deep-equal'), + ucs2length: require('./ucs2length'), + varOccurences: varOccurences, + varReplace: varReplace, + cleanUpCode: cleanUpCode, + finalCleanUpCode: finalCleanUpCode, + schemaHasRules: schemaHasRules, + schemaHasRulesExcept: schemaHasRulesExcept, + schemaUnknownRules: schemaUnknownRules, + toQuotedString: toQuotedString, + getPathExpr: getPathExpr, + getPath: getPath, + getData: getData, + unescapeFragment: unescapeFragment, + unescapeJsonPointer: unescapeJsonPointer, + escapeFragment: escapeFragment, + escapeJsonPointer: escapeJsonPointer +}; + + +function copy(o, to) { + to = to || {}; + for (var key in o) to[key] = o[key]; + return to; +} + + +function checkDataType(dataType, data, negate) { + var EQUAL = negate ? ' !== ' : ' === ' + , AND = negate ? ' || ' : ' && ' + , OK = negate ? '!' : '' + , NOT = negate ? '' : '!'; + switch (dataType) { + case 'null': return data + EQUAL + 'null'; + case 'array': return OK + 'Array.isArray(' + data + ')'; + case 'object': return '(' + OK + data + AND + + 'typeof ' + data + EQUAL + '"object"' + AND + + NOT + 'Array.isArray(' + data + '))'; + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + + NOT + '(' + data + ' % 1)' + + AND + data + EQUAL + data + ')'; + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; + } +} + + +function checkDataTypes(dataTypes, data) { + switch (dataTypes.length) { + case 1: return checkDataType(dataTypes[0], data, true); + default: + var code = ''; + var types = toHash(dataTypes); + if (types.array && types.object) { + code = types.null ? '(': '(!' + data + ' || '; + code += 'typeof ' + data + ' !== "object")'; + delete types.null; + delete types.array; + delete types.object; + } + if (types.number) delete types.integer; + for (var t in types) + code += (code ? ' && ' : '' ) + checkDataType(t, data, true); + + return code; + } +} + + +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); +function coerceToTypes(optionCoerceTypes, dataTypes) { + if (Array.isArray(dataTypes)) { + var types = []; + for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i' + , $notOp = $isMax ? '>' : '<' + , $errorKeyword = undefined; +}} + +{{? $isDataExcl }} + {{ + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr) + , $exclusive = 'exclusive' + $lvl + , $exclType = 'exclType' + $lvl + , $exclIsNumber = 'exclIsNumber' + $lvl + , $opExpr = 'op' + $lvl + , $opStr = '\' + ' + $opExpr + ' + \''; + }} + var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}}; + {{ $schemaValueExcl = 'schemaExcl' + $lvl; }} + + var {{=$exclusive}}; + var {{=$exclType}} = typeof {{=$schemaValueExcl}}; + if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') { + {{ var $errorKeyword = $exclusiveKeyword; }} + {{# def.error:'_exclusiveLimit' }} + } else if ({{# def.$dataNotType:'number' }} + {{=$exclType}} == 'number' + ? ( + ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}}) + ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} + ) + : ( + ({{=$exclusive}} = {{=$schemaValueExcl}} === true) + ? {{=$data}} {{=$notOp}}= {{=$schemaValue}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} + ) + || {{=$data}} !== {{=$data}}) { + var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}='; + {{ + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + }} +{{??}} + {{ + var $exclIsNumber = typeof $schemaExcl == 'number' + , $opStr = $op; /*used in error*/ + }} + + {{? $exclIsNumber && $isData }} + {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }} + if ({{# def.$dataNotType:'number' }} + ( {{=$schemaValue}} === undefined + || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}} + ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} ) + || {{=$data}} !== {{=$data}}) { + {{??}} + {{ + if ($exclIsNumber && $schema === undefined) { + {{# def.setExclusiveLimit }} + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) + $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + {{# def.setExclusiveLimit }} + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + + var $opExpr = '\'' + $opStr + '\''; /*used in error*/ + }} + + if ({{# def.$dataNotType:'number' }} + {{=$data}} {{=$notOp}} {{=$schemaValue}} + || {{=$data}} !== {{=$data}}) { + {{?}} +{{?}} + {{ $errorKeyword = $errorKeyword || $keyword; }} + {{# def.error:'_limit' }} + } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitItems.jst b/node_modules/ajv/lib/dot/_limitItems.jst new file mode 100644 index 0000000..a3e078e --- /dev/null +++ b/node_modules/ajv/lib/dot/_limitItems.jst @@ -0,0 +1,10 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitItems' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitLength.jst b/node_modules/ajv/lib/dot/_limitLength.jst new file mode 100644 index 0000000..cfc8dbb --- /dev/null +++ b/node_modules/ajv/lib/dot/_limitLength.jst @@ -0,0 +1,10 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitLength' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitProperties.jst b/node_modules/ajv/lib/dot/_limitProperties.jst new file mode 100644 index 0000000..da7ea77 --- /dev/null +++ b/node_modules/ajv/lib/dot/_limitProperties.jst @@ -0,0 +1,10 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitProperties' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/allOf.jst b/node_modules/ajv/lib/dot/allOf.jst new file mode 100644 index 0000000..4c28363 --- /dev/null +++ b/node_modules/ajv/lib/dot/allOf.jst @@ -0,0 +1,34 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $currentBaseId = $it.baseId + , $allSchemasEmpty = true; +}} + +{{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{ + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + + {{# def.ifResultValid }} + {{?}} +{{~}} + +{{? $breakOnError }} + {{? $allSchemasEmpty }} + if (true) { + {{??}} + {{= $closingBraces.slice(0,-1) }} + {{?}} +{{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/anyOf.jst b/node_modules/ajv/lib/dot/anyOf.jst new file mode 100644 index 0000000..086cf2b --- /dev/null +++ b/node_modules/ajv/lib/dot/anyOf.jst @@ -0,0 +1,48 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $noEmptySchema = $schema.every(function($sch) { + return {{# def.nonEmptySchema:$sch }}; + }); +}} +{{? $noEmptySchema }} + {{ var $currentBaseId = $it.baseId; }} + var {{=$errs}} = errors; + var {{=$valid}} = false; + + {{# def.setCompositeRule }} + + {{~ $schema:$sch:$i }} + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + + {{=$valid}} = {{=$valid}} || {{=$nextValid}}; + + if (!{{=$valid}}) { + {{ $closingBraces += '}'; }} + {{~}} + + {{# def.resetCompositeRule }} + + {{= $closingBraces }} + + if (!{{=$valid}}) { + {{# def.extraError:'anyOf' }} + } else { + {{# def.resetErrors }} + {{? it.opts.allErrors }} } {{?}} + + {{# def.cleanUp }} +{{??}} + {{? $breakOnError }} + if (true) { + {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/coerce.def b/node_modules/ajv/lib/dot/coerce.def new file mode 100644 index 0000000..86e0e18 --- /dev/null +++ b/node_modules/ajv/lib/dot/coerce.def @@ -0,0 +1,61 @@ +{{## def.coerceType: + {{ + var $dataType = 'dataType' + $lvl + , $coerced = 'coerced' + $lvl; + }} + var {{=$dataType}} = typeof {{=$data}}; + {{? it.opts.coerceTypes == 'array'}} + if ({{=$dataType}} == 'object' && Array.isArray({{=$data}})) {{=$dataType}} = 'array'; + {{?}} + + var {{=$coerced}} = undefined; + + {{ var $bracesCoercion = ''; }} + {{~ $coerceToTypes:$type:$i }} + {{? $i }} + if ({{=$coerced}} === undefined) { + {{ $bracesCoercion += '}'; }} + {{?}} + + {{? it.opts.coerceTypes == 'array' && $type != 'array' }} + if ({{=$dataType}} == 'array' && {{=$data}}.length == 1) { + {{=$coerced}} = {{=$data}} = {{=$data}}[0]; + {{=$dataType}} = typeof {{=$data}}; + /*if ({{=$dataType}} == 'object' && Array.isArray({{=$data}})) {{=$dataType}} = 'array';*/ + } + {{?}} + + {{? $type == 'string' }} + if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean') + {{=$coerced}} = '' + {{=$data}}; + else if ({{=$data}} === null) {{=$coerced}} = ''; + {{?? $type == 'number' || $type == 'integer' }} + if ({{=$dataType}} == 'boolean' || {{=$data}} === null + || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}} + {{? $type == 'integer' }} && !({{=$data}} % 1){{?}})) + {{=$coerced}} = +{{=$data}}; + {{?? $type == 'boolean' }} + if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null) + {{=$coerced}} = false; + else if ({{=$data}} === 'true' || {{=$data}} === 1) + {{=$coerced}} = true; + {{?? $type == 'null' }} + if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false) + {{=$coerced}} = null; + {{?? it.opts.coerceTypes == 'array' && $type == 'array' }} + if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null) + {{=$coerced}} = [{{=$data}}]; + {{?}} + {{~}} + + {{= $bracesCoercion }} + + if ({{=$coerced}} === undefined) { + {{# def.error:'type' }} + } else { + {{# def.setParentData }} + {{=$data}} = {{=$coerced}}; + {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}} + {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}}; + } +#}} diff --git a/node_modules/ajv/lib/dot/comment.jst b/node_modules/ajv/lib/dot/comment.jst new file mode 100644 index 0000000..f959150 --- /dev/null +++ b/node_modules/ajv/lib/dot/comment.jst @@ -0,0 +1,9 @@ +{{# def.definitions }} +{{# def.setupKeyword }} + +{{ var $comment = it.util.toQuotedString($schema); }} +{{? it.opts.$comment === true }} + console.log({{=$comment}}); +{{?? typeof it.opts.$comment == 'function' }} + self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema); +{{?}} diff --git a/node_modules/ajv/lib/dot/const.jst b/node_modules/ajv/lib/dot/const.jst new file mode 100644 index 0000000..2aa2298 --- /dev/null +++ b/node_modules/ajv/lib/dot/const.jst @@ -0,0 +1,11 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{? !$isData }} + var schema{{=$lvl}} = validate.schema{{=$schemaPath}}; +{{?}} +var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}}); +{{# def.checkError:'const' }} +{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/contains.jst b/node_modules/ajv/lib/dot/contains.jst new file mode 100644 index 0000000..925d2c8 --- /dev/null +++ b/node_modules/ajv/lib/dot/contains.jst @@ -0,0 +1,57 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{ + var $idx = 'i' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $currentBaseId = it.baseId + , $nonEmptySchema = {{# def.nonEmptySchema:$schema }}; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? $nonEmptySchema }} + {{# def.setCompositeRule }} + + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + var {{=$nextValid}} = false; + + for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + if ({{=$nextValid}}) break; + } + + {{# def.resetCompositeRule }} + {{= $closingBraces }} + + if (!{{=$nextValid}}) { +{{??}} + if ({{=$data}}.length == 0) { +{{?}} + + {{# def.error:'contains' }} + } else { + {{? $nonEmptySchema }} + {{# def.resetErrors }} + {{?}} + {{? it.opts.allErrors }} } {{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/custom.jst b/node_modules/ajv/lib/dot/custom.jst new file mode 100644 index 0000000..d30588f --- /dev/null +++ b/node_modules/ajv/lib/dot/custom.jst @@ -0,0 +1,191 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $rule = this + , $definition = 'definition' + $lvl + , $rDef = $rule.definition + , $closingBraces = ''; + var $validate = $rDef.validate; + var $compile, $inline, $macro, $ruleValidate, $validateCode; +}} + +{{? $isData && $rDef.$data }} + {{ + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + }} + var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition; + var {{=$validateCode}} = {{=$definition}}.validate; +{{??}} + {{ + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + }} +{{?}} + +{{ + var $ruleErrs = $validateCode + '.errors' + , $i = 'i' + $lvl + , $ruleErr = 'ruleErr' + $lvl + , $asyncKeyword = $rDef.async; + + if ($asyncKeyword && !it.async) + throw new Error('async keyword in sync schema'); +}} + + +{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}} +var {{=$errs}} = errors; +var {{=$valid}}; + +{{## def.callRuleValidate: + {{=$validateCode}}.call( + {{? it.opts.passContext }}this{{??}}self{{?}} + {{? $compile || $rDef.schema === false }} + , {{=$data}} + {{??}} + , {{=$schemaValue}} + , {{=$data}} + , validate.schema{{=it.schemaPath}} + {{?}} + , {{# def.dataPath }} + {{# def.passParentData }} + , rootData + ) +#}} + +{{## def.extendErrors:_inline: + for (var {{=$i}}={{=$errs}}; {{=$i}} 0 + : it.util.schemaHasRules(_schema, it.RULES.all)) +#}} + + +{{## def.strLength: + {{? it.opts.unicode === false }} + {{=$data}}.length + {{??}} + ucs2length({{=$data}}) + {{?}} +#}} + + +{{## def.willOptimize: + it.util.varOccurences($code, $nextData) < 2 +#}} + + +{{## def.generateSubschemaCode: + {{ + var $code = it.validate($it); + $it.baseId = $currentBaseId; + }} +#}} + + +{{## def.insertSubschemaCode: + {{= it.validate($it) }} + {{ $it.baseId = $currentBaseId; }} +#}} + + +{{## def._optimizeValidate: + it.util.varReplace($code, $nextData, $passData) +#}} + + +{{## def.optimizeValidate: + {{? {{# def.willOptimize}} }} + {{= {{# def._optimizeValidate }} }} + {{??}} + var {{=$nextData}} = {{=$passData}}; + {{= $code }} + {{?}} +#}} + + +{{## def.cleanUp: {{ out = it.util.cleanUpCode(out); }} #}} + + +{{## def.finalCleanUp: {{ out = it.util.finalCleanUpCode(out, $async); }} #}} + + +{{## def.$data: + {{ + var $isData = it.opts.$data && $schema && $schema.$data + , $schemaValue; + }} + {{? $isData }} + var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }}; + {{ $schemaValue = 'schema' + $lvl; }} + {{??}} + {{ $schemaValue = $schema; }} + {{?}} +#}} + + +{{## def.$dataNotType:_type: + {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}} +#}} + + +{{## def.check$dataIsArray: + if (schema{{=$lvl}} === undefined) {{=$valid}} = true; + else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false; + else { +#}} + + +{{## def.beginDefOut: + {{ + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + }} +#}} + + +{{## def.storeDefOut:_variable: + {{ + var _variable = out; + out = $$outStack.pop(); + }} +#}} + + +{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}} + +{{## def.setParentData: + {{ + var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData' + , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + }} +#}} + +{{## def.passParentData: + {{# def.setParentData }} + , {{= $parentData }} + , {{= $parentDataProperty }} +#}} + + +{{## def.iterateProperties: + {{? $ownProperties }} + {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}}); + for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) { + var {{=$key}} = {{=$dataProperties}}[{{=$idx}}]; + {{??}} + for (var {{=$key}} in {{=$data}}) { + {{?}} +#}} + + +{{## def.noPropertyInData: + {{=$useData}} === undefined + {{? $ownProperties }} + || !{{# def.isOwnProperty }} + {{?}} +#}} + + +{{## def.isOwnProperty: + Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}') +#}} diff --git a/node_modules/ajv/lib/dot/dependencies.jst b/node_modules/ajv/lib/dot/dependencies.jst new file mode 100644 index 0000000..c41f334 --- /dev/null +++ b/node_modules/ajv/lib/dot/dependencies.jst @@ -0,0 +1,80 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.missing }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.propertyInData: + {{=$data}}{{= it.util.getProperty($property) }} !== undefined + {{? $ownProperties }} + && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}') + {{?}} +#}} + + +{{ + var $schemaDeps = {} + , $propertyDeps = {} + , $ownProperties = it.opts.ownProperties; + + for ($property in $schema) { + var $sch = $schema[$property]; + var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps; + $deps[$property] = $sch; + } +}} + +var {{=$errs}} = errors; + +{{ var $currentErrorPath = it.errorPath; }} + +var missing{{=$lvl}}; +{{ for (var $property in $propertyDeps) { }} + {{ $deps = $propertyDeps[$property]; }} + {{? $deps.length }} + if ({{# def.propertyInData }} + {{? $breakOnError }} + && ({{# def.checkMissingProperty:$deps }})) { + {{# def.errorMissingProperty:'dependencies' }} + {{??}} + ) { + {{~ $deps:$propertyKey }} + {{# def.allErrorsMissingProperty:'dependencies' }} + {{~}} + {{?}} + } {{# def.elseIfValid }} + {{?}} +{{ } }} + +{{ + it.errorPath = $currentErrorPath; + var $currentBaseId = $it.baseId; +}} + + +{{ for (var $property in $schemaDeps) { }} + {{ var $sch = $schemaDeps[$property]; }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{=$nextValid}} = true; + + if ({{# def.propertyInData }}) { + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + }} + + {{# def.insertSubschemaCode }} + } + + {{# def.ifResultValid }} + {{?}} +{{ } }} + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/enum.jst b/node_modules/ajv/lib/dot/enum.jst new file mode 100644 index 0000000..357c2e8 --- /dev/null +++ b/node_modules/ajv/lib/dot/enum.jst @@ -0,0 +1,30 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $i = 'i' + $lvl + , $vSchema = 'schema' + $lvl; +}} + +{{? !$isData }} + var {{=$vSchema}} = validate.schema{{=$schemaPath}}; +{{?}} +var {{=$valid}}; + +{{?$isData}}{{# def.check$dataIsArray }}{{?}} + +{{=$valid}} = false; + +for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++) + if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) { + {{=$valid}} = true; + break; + } + +{{? $isData }} } {{?}} + +{{# def.checkError:'enum' }} + +{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/errors.def b/node_modules/ajv/lib/dot/errors.def new file mode 100644 index 0000000..5c5752c --- /dev/null +++ b/node_modules/ajv/lib/dot/errors.def @@ -0,0 +1,194 @@ +{{# def.definitions }} + +{{## def._error:_rule: + {{ 'istanbul ignore else'; }} + {{? it.createErrors !== false }} + { + keyword: '{{= $errorKeyword || _rule }}' + , dataPath: (dataPath || '') + {{= it.errorPath }} + , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}} + , params: {{# def._errorParams[_rule] }} + {{? it.opts.messages !== false }} + , message: {{# def._errorMessages[_rule] }} + {{?}} + {{? it.opts.verbose }} + , schema: {{# def._errorSchemas[_rule] }} + , parentSchema: validate.schema{{=it.schemaPath}} + , data: {{=$data}} + {{?}} + } + {{??}} + {} + {{?}} +#}} + + +{{## def._addError:_rule: + if (vErrors === null) vErrors = [err]; + else vErrors.push(err); + errors++; +#}} + + +{{## def.addError:_rule: + var err = {{# def._error:_rule }}; + {{# def._addError:_rule }} +#}} + + +{{## def.error:_rule: + {{# def.beginDefOut}} + {{# def._error:_rule }} + {{# def.storeDefOut:__err }} + + {{? !it.compositeRule && $breakOnError }} + {{ 'istanbul ignore if'; }} + {{? it.async }} + throw new ValidationError([{{=__err}}]); + {{??}} + validate.errors = [{{=__err}}]; + return false; + {{?}} + {{??}} + var err = {{=__err}}; + {{# def._addError:_rule }} + {{?}} +#}} + + +{{## def.extraError:_rule: + {{# def.addError:_rule}} + {{? !it.compositeRule && $breakOnError }} + {{ 'istanbul ignore if'; }} + {{? it.async }} + throw new ValidationError(vErrors); + {{??}} + validate.errors = vErrors; + return false; + {{?}} + {{?}} +#}} + + +{{## def.checkError:_rule: + if (!{{=$valid}}) { + {{# def.error:_rule }} + } +#}} + + +{{## def.resetErrors: + errors = {{=$errs}}; + if (vErrors !== null) { + if ({{=$errs}}) vErrors.length = {{=$errs}}; + else vErrors = null; + } +#}} + + +{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}} +{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}} +{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}} + +{{## def._errorMessages = { + 'false schema': "'boolean schema is false'", + $ref: "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'", + additionalItems: "'should NOT have more than {{=$schema.length}} items'", + additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'", + anyOf: "'should match some schema in anyOf'", + const: "'should be equal to constant'", + contains: "'should contain a valid item'", + dependencies: "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'", + 'enum': "'should be equal to one of the allowed values'", + format: "'should match format \"{{#def.concatSchemaEQ}}\"'", + 'if': "'should match \"' + {{=$ifClause}} + '\" schema'", + _limit: "'should be {{=$opStr}} {{#def.appendSchema}}", + _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'", + _limitItems: "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'", + _limitLength: "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'", + _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'", + multipleOf: "'should be multiple of {{#def.appendSchema}}", + not: "'should NOT be valid'", + oneOf: "'should match exactly one schema in oneOf'", + pattern: "'should match pattern \"{{#def.concatSchemaEQ}}\"'", + propertyNames: "'property name \\'{{=$invalidName}}\\' is invalid'", + required: "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'", + type: "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'", + uniqueItems: "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'", + custom: "'should pass \"{{=$rule.keyword}}\" keyword validation'", + patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''", + switch: "'should pass \"switch\" keyword validation'", + _formatLimit: "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'", + _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'" +} #}} + + +{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}} +{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} + +{{## def._errorSchemas = { + 'false schema': "false", + $ref: "{{=it.util.toQuotedString($schema)}}", + additionalItems: "false", + additionalProperties: "false", + anyOf: "validate.schema{{=$schemaPath}}", + const: "validate.schema{{=$schemaPath}}", + contains: "validate.schema{{=$schemaPath}}", + dependencies: "validate.schema{{=$schemaPath}}", + 'enum': "validate.schema{{=$schemaPath}}", + format: "{{#def.schemaRefOrQS}}", + 'if': "validate.schema{{=$schemaPath}}", + _limit: "{{#def.schemaRefOrVal}}", + _exclusiveLimit: "validate.schema{{=$schemaPath}}", + _limitItems: "{{#def.schemaRefOrVal}}", + _limitLength: "{{#def.schemaRefOrVal}}", + _limitProperties:"{{#def.schemaRefOrVal}}", + multipleOf: "{{#def.schemaRefOrVal}}", + not: "validate.schema{{=$schemaPath}}", + oneOf: "validate.schema{{=$schemaPath}}", + pattern: "{{#def.schemaRefOrQS}}", + propertyNames: "validate.schema{{=$schemaPath}}", + required: "validate.schema{{=$schemaPath}}", + type: "validate.schema{{=$schemaPath}}", + uniqueItems: "{{#def.schemaRefOrVal}}", + custom: "validate.schema{{=$schemaPath}}", + patternRequired: "validate.schema{{=$schemaPath}}", + switch: "validate.schema{{=$schemaPath}}", + _formatLimit: "{{#def.schemaRefOrQS}}", + _formatExclusiveLimit: "validate.schema{{=$schemaPath}}" +} #}} + + +{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} + +{{## def._errorParams = { + 'false schema': "{}", + $ref: "{ ref: '{{=it.util.escapeQuotes($schema)}}' }", + additionalItems: "{ limit: {{=$schema.length}} }", + additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }", + anyOf: "{}", + const: "{ allowedValue: schema{{=$lvl}} }", + contains: "{}", + dependencies: "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }", + 'enum': "{ allowedValues: schema{{=$lvl}} }", + format: "{ format: {{#def.schemaValueQS}} }", + 'if': "{ failingKeyword: {{=$ifClause}} }", + _limit: "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }", + _exclusiveLimit: "{}", + _limitItems: "{ limit: {{=$schemaValue}} }", + _limitLength: "{ limit: {{=$schemaValue}} }", + _limitProperties:"{ limit: {{=$schemaValue}} }", + multipleOf: "{ multipleOf: {{=$schemaValue}} }", + not: "{}", + oneOf: "{ passingSchemas: {{=$passingSchemas}} }", + pattern: "{ pattern: {{#def.schemaValueQS}} }", + propertyNames: "{ propertyName: '{{=$invalidName}}' }", + required: "{ missingProperty: '{{=$missingProperty}}' }", + type: "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }", + uniqueItems: "{ i: i, j: j }", + custom: "{ keyword: '{{=$rule.keyword}}' }", + patternRequired: "{ missingPattern: '{{=$missingPattern}}' }", + switch: "{ caseIndex: {{=$caseIndex}} }", + _formatLimit: "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }", + _formatExclusiveLimit: "{}" +} #}} diff --git a/node_modules/ajv/lib/dot/format.jst b/node_modules/ajv/lib/dot/format.jst new file mode 100644 index 0000000..37f14da --- /dev/null +++ b/node_modules/ajv/lib/dot/format.jst @@ -0,0 +1,106 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} + +{{## def.skipFormat: + {{? $breakOnError }} if (true) { {{?}} + {{ return out; }} +#}} + +{{? it.opts.format === false }}{{# def.skipFormat }}{{?}} + + +{{# def.$data }} + + +{{## def.$dataCheckFormat: + {{# def.$dataNotType:'string' }} + ({{? $unknownFormats != 'ignore' }} + ({{=$schemaValue}} && !{{=$format}} + {{? $allowUnknown }} + && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1 + {{?}}) || + {{?}} + ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}' + && !(typeof {{=$format}} == 'function' + ? {{? it.async}} + (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}})) + {{??}} + {{=$format}}({{=$data}}) + {{?}} + : {{=$format}}.test({{=$data}})))) +#}} + +{{## def.checkFormat: + {{ + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + }} + {{? typeof $format == 'function' }} + {{=$formatRef}}({{=$data}}) + {{??}} + {{=$formatRef}}.test({{=$data}}) + {{?}} +#}} + + +{{ + var $unknownFormats = it.opts.unknownFormats + , $allowUnknown = Array.isArray($unknownFormats); +}} + +{{? $isData }} + {{ + var $format = 'format' + $lvl + , $isObject = 'isObject' + $lvl + , $formatType = 'formatType' + $lvl; + }} + var {{=$format}} = formats[{{=$schemaValue}}]; + var {{=$isObject}} = typeof {{=$format}} == 'object' + && !({{=$format}} instanceof RegExp) + && {{=$format}}.validate; + var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string'; + if ({{=$isObject}}) { + {{? it.async}} + var async{{=$lvl}} = {{=$format}}.async; + {{?}} + {{=$format}} = {{=$format}}.validate; + } + if ({{# def.$dataCheckFormat }}) { +{{??}} + {{ var $format = it.formats[$schema]; }} + {{? !$format }} + {{? $unknownFormats == 'ignore' }} + {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }} + {{# def.skipFormat }} + {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }} + {{# def.skipFormat }} + {{??}} + {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }} + {{?}} + {{?}} + {{ + var $isObject = typeof $format == 'object' + && !($format instanceof RegExp) + && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + }} + {{? $formatType != $ruleType }} + {{# def.skipFormat }} + {{?}} + {{? $async }} + {{ + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + }} + if (!(await {{=$formatRef}}({{=$data}}))) { + {{??}} + if (!{{# def.checkFormat }}) { + {{?}} +{{?}} + {{# def.error:'format' }} + } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/if.jst b/node_modules/ajv/lib/dot/if.jst new file mode 100644 index 0000000..7ccc9b7 --- /dev/null +++ b/node_modules/ajv/lib/dot/if.jst @@ -0,0 +1,75 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateIfClause:_clause: + {{ + $it.schema = it.schema['_clause']; + $it.schemaPath = it.schemaPath + '._clause'; + $it.errSchemaPath = it.errSchemaPath + '/_clause'; + }} + {{# def.insertSubschemaCode }} + {{=$valid}} = {{=$nextValid}}; + {{? $thenPresent && $elsePresent }} + {{ $ifClause = 'ifClause' + $lvl; }} + var {{=$ifClause}} = '_clause'; + {{??}} + {{ $ifClause = '\'_clause\''; }} + {{?}} +#}} + +{{ + var $thenSch = it.schema['then'] + , $elseSch = it.schema['else'] + , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }} + , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }} + , $currentBaseId = $it.baseId; +}} + +{{? $thenPresent || $elsePresent }} + {{ + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + var {{=$errs}} = errors; + var {{=$valid}} = true; + + {{# def.setCompositeRule }} + {{# def.insertSubschemaCode }} + {{ $it.createErrors = true; }} + {{# def.resetErrors }} + {{# def.resetCompositeRule }} + + {{? $thenPresent }} + if ({{=$nextValid}}) { + {{# def.validateIfClause:then }} + } + {{? $elsePresent }} + else { + {{?}} + {{??}} + if (!{{=$nextValid}}) { + {{?}} + + {{? $elsePresent }} + {{# def.validateIfClause:else }} + } + {{?}} + + if (!{{=$valid}}) { + {{# def.extraError:'if' }} + } + {{? $breakOnError }} else { {{?}} + + {{# def.cleanUp }} +{{??}} + {{? $breakOnError }} + if (true) { + {{?}} +{{?}} + diff --git a/node_modules/ajv/lib/dot/items.jst b/node_modules/ajv/lib/dot/items.jst new file mode 100644 index 0000000..8c0f5ac --- /dev/null +++ b/node_modules/ajv/lib/dot/items.jst @@ -0,0 +1,100 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateItems:startFrom: + for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + {{? $breakOnError }} + if (!{{=$nextValid}}) break; + {{?}} + } +#}} + +{{ + var $idx = 'i' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $currentBaseId = it.baseId; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? Array.isArray($schema) }} + {{ /* 'items' is an array of schemas */}} + {{ var $additionalItems = it.schema.additionalItems; }} + {{? $additionalItems === false }} + {{=$valid}} = {{=$data}}.length <= {{= $schema.length }}; + {{ + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + }} + {{# def.checkError:'additionalItems' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{# def.elseIfValid}} + {{?}} + + {{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{=$nextValid}} = true; + + if ({{=$data}}.length > {{=$i}}) { + {{ + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + } + + {{# def.ifResultValid }} + {{?}} + {{~}} + + {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }} + {{ + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + }} + {{=$nextValid}} = true; + + if ({{=$data}}.length > {{= $schema.length }}) { + {{# def.validateItems: $schema.length }} + } + + {{# def.ifResultValid }} + {{?}} + +{{?? {{# def.nonEmptySchema:$schema }} }} + {{ /* 'items' is a single schema */}} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + {{# def.validateItems: 0 }} +{{?}} + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/missing.def b/node_modules/ajv/lib/dot/missing.def new file mode 100644 index 0000000..a73b9f9 --- /dev/null +++ b/node_modules/ajv/lib/dot/missing.def @@ -0,0 +1,39 @@ +{{## def.checkMissingProperty:_properties: + {{~ _properties:$propertyKey:$i }} + {{?$i}} || {{?}} + {{ + var $prop = it.util.getProperty($propertyKey) + , $useData = $data + $prop; + }} + ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) ) + {{~}} +#}} + + +{{## def.errorMissingProperty:_error: + {{ + var $propertyPath = 'missing' + $lvl + , $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers + ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) + : $currentErrorPath + ' + ' + $propertyPath; + } + }} + {{# def.error:_error }} +#}} + + +{{## def.allErrorsMissingProperty:_error: + {{ + var $prop = it.util.getProperty($propertyKey) + , $missingProperty = it.util.escapeQuotes($propertyKey) + , $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + }} + if ({{# def.noPropertyInData }}) { + {{# def.addError:_error }} + } +#}} diff --git a/node_modules/ajv/lib/dot/multipleOf.jst b/node_modules/ajv/lib/dot/multipleOf.jst new file mode 100644 index 0000000..5f8dd33 --- /dev/null +++ b/node_modules/ajv/lib/dot/multipleOf.jst @@ -0,0 +1,20 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +var division{{=$lvl}}; +if ({{?$isData}} + {{=$schemaValue}} !== undefined && ( + typeof {{=$schemaValue}} != 'number' || + {{?}} + (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}}, + {{? it.opts.multipleOfPrecision }} + Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}} + {{??}} + division{{=$lvl}} !== parseInt(division{{=$lvl}}) + {{?}} + ) + {{?$isData}} ) {{?}} ) { + {{# def.error:'multipleOf' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/not.jst b/node_modules/ajv/lib/dot/not.jst new file mode 100644 index 0000000..e03185a --- /dev/null +++ b/node_modules/ajv/lib/dot/not.jst @@ -0,0 +1,43 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{? {{# def.nonEmptySchema:$schema }} }} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + var {{=$errs}} = errors; + + {{# def.setCompositeRule }} + + {{ + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + }} + {{= it.validate($it) }} + {{ + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + }} + + {{# def.resetCompositeRule }} + + if ({{=$nextValid}}) { + {{# def.error:'not' }} + } else { + {{# def.resetErrors }} + {{? it.opts.allErrors }} } {{?}} +{{??}} + {{# def.addError:'not' }} + {{? $breakOnError}} + if (false) { + {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/oneOf.jst b/node_modules/ajv/lib/dot/oneOf.jst new file mode 100644 index 0000000..bcce2c6 --- /dev/null +++ b/node_modules/ajv/lib/dot/oneOf.jst @@ -0,0 +1,54 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $currentBaseId = $it.baseId + , $prevValid = 'prevValid' + $lvl + , $passingSchemas = 'passingSchemas' + $lvl; +}} + +var {{=$errs}} = errors + , {{=$prevValid}} = false + , {{=$valid}} = false + , {{=$passingSchemas}} = null; + +{{# def.setCompositeRule }} + +{{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + {{??}} + var {{=$nextValid}} = true; + {{?}} + + {{? $i }} + if ({{=$nextValid}} && {{=$prevValid}}) { + {{=$valid}} = false; + {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}]; + } else { + {{ $closingBraces += '}'; }} + {{?}} + + if ({{=$nextValid}}) { + {{=$valid}} = {{=$prevValid}} = true; + {{=$passingSchemas}} = {{=$i}}; + } +{{~}} + +{{# def.resetCompositeRule }} + +{{= $closingBraces }} + +if (!{{=$valid}}) { + {{# def.extraError:'oneOf' }} +} else { + {{# def.resetErrors }} +{{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/pattern.jst b/node_modules/ajv/lib/dot/pattern.jst new file mode 100644 index 0000000..3a37ef6 --- /dev/null +++ b/node_modules/ajv/lib/dot/pattern.jst @@ -0,0 +1,14 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $regexp = $isData + ? '(new RegExp(' + $schemaValue + '))' + : it.usePattern($schema); +}} + +if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) { + {{# def.error:'pattern' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/properties.jst b/node_modules/ajv/lib/dot/properties.jst new file mode 100644 index 0000000..862067e --- /dev/null +++ b/node_modules/ajv/lib/dot/properties.jst @@ -0,0 +1,244 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateAdditional: + {{ /* additionalProperties is schema */ + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty + ? it.errorPath + : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} +#}} + + +{{ + var $key = 'key' + $lvl + , $idx = 'idx' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $dataProperties = 'dataProperties' + $lvl; + + var $schemaKeys = Object.keys($schema || {}) + , $pProperties = it.schema.patternProperties || {} + , $pPropertyKeys = Object.keys($pProperties) + , $aProperties = it.schema.additionalProperties + , $someProperties = $schemaKeys.length || $pPropertyKeys.length + , $noAdditional = $aProperties === false + , $additionalIsSchema = typeof $aProperties == 'object' + && Object.keys($aProperties).length + , $removeAdditional = it.opts.removeAdditional + , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional + , $ownProperties = it.opts.ownProperties + , $currentBaseId = it.baseId; + + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) + var $requiredHash = it.util.toHash($required); +}} + + +var {{=$errs}} = errors; +var {{=$nextValid}} = true; +{{? $ownProperties }} + var {{=$dataProperties}} = undefined; +{{?}} + +{{? $checkAdditional }} + {{# def.iterateProperties }} + {{? $someProperties }} + var isAdditional{{=$lvl}} = !(false + {{? $schemaKeys.length }} + {{? $schemaKeys.length > 8 }} + || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}}) + {{??}} + {{~ $schemaKeys:$propertyKey }} + || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }} + {{~}} + {{?}} + {{?}} + {{? $pPropertyKeys.length }} + {{~ $pPropertyKeys:$pProperty:$i }} + || {{= it.usePattern($pProperty) }}.test({{=$key}}) + {{~}} + {{?}} + ); + + if (isAdditional{{=$lvl}}) { + {{?}} + {{? $removeAdditional == 'all' }} + delete {{=$data}}[{{=$key}}]; + {{??}} + {{ + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + }} + {{? $noAdditional }} + {{? $removeAdditional }} + delete {{=$data}}[{{=$key}}]; + {{??}} + {{=$nextValid}} = false; + {{ + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + }} + {{# def.error:'additionalProperties' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{? $breakOnError }} break; {{?}} + {{?}} + {{?? $additionalIsSchema }} + {{? $removeAdditional == 'failing' }} + var {{=$errs}} = errors; + {{# def.setCompositeRule }} + + {{# def.validateAdditional }} + + if (!{{=$nextValid}}) { + errors = {{=$errs}}; + if (validate.errors !== null) { + if (errors) validate.errors.length = errors; + else validate.errors = null; + } + delete {{=$data}}[{{=$key}}]; + } + + {{# def.resetCompositeRule }} + {{??}} + {{# def.validateAdditional }} + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} + {{?}} + {{?}} + {{ it.errorPath = $currentErrorPath; }} + {{?}} + {{? $someProperties }} + } + {{?}} + } + + {{# def.ifResultValid }} +{{?}} + +{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }} + +{{? $schemaKeys.length }} + {{~ $schemaKeys:$propertyKey }} + {{ var $sch = $schema[$propertyKey]; }} + + {{? {{# def.nonEmptySchema:$sch}} }} + {{ + var $prop = it.util.getProperty($propertyKey) + , $passData = $data + $prop + , $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + }} + + {{# def.generateSubschemaCode }} + + {{? {{# def.willOptimize }} }} + {{ + $code = {{# def._optimizeValidate }}; + var $useData = $passData; + }} + {{??}} + {{ var $useData = $nextData; }} + var {{=$nextData}} = {{=$passData}}; + {{?}} + + {{? $hasDefault }} + {{= $code }} + {{??}} + {{? $requiredHash && $requiredHash[$propertyKey] }} + if ({{# def.noPropertyInData }}) { + {{=$nextValid}} = false; + {{ + var $currentErrorPath = it.errorPath + , $currErrSchemaPath = $errSchemaPath + , $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + }} + {{# def.error:'required' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{ it.errorPath = $currentErrorPath; }} + } else { + {{??}} + {{? $breakOnError }} + if ({{# def.noPropertyInData }}) { + {{=$nextValid}} = true; + } else { + {{??}} + if ({{=$useData}} !== undefined + {{? $ownProperties }} + && {{# def.isOwnProperty }} + {{?}} + ) { + {{?}} + {{?}} + + {{= $code }} + } + {{?}} {{ /* $hasDefault */ }} + {{?}} {{ /* def.nonEmptySchema */ }} + + {{# def.ifResultValid }} + {{~}} +{{?}} + +{{? $pPropertyKeys.length }} + {{~ $pPropertyKeys:$pProperty }} + {{ var $sch = $pProperties[$pProperty]; }} + + {{? {{# def.nonEmptySchema:$sch}} }} + {{ + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + + it.util.escapeFragment($pProperty); + }} + + {{# def.iterateProperties }} + if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} + } + {{? $breakOnError }} else {{=$nextValid}} = true; {{?}} + } + + {{# def.ifResultValid }} + {{?}} {{ /* def.nonEmptySchema */ }} + {{~}} +{{?}} + + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/propertyNames.jst b/node_modules/ajv/lib/dot/propertyNames.jst new file mode 100644 index 0000000..ee52b21 --- /dev/null +++ b/node_modules/ajv/lib/dot/propertyNames.jst @@ -0,0 +1,54 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +var {{=$errs}} = errors; + +{{? {{# def.nonEmptySchema:$schema }} }} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + {{ + var $key = 'key' + $lvl + , $idx = 'idx' + $lvl + , $i = 'i' + $lvl + , $invalidName = '\' + ' + $key + ' + \'' + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $dataProperties = 'dataProperties' + $lvl + , $ownProperties = it.opts.ownProperties + , $currentBaseId = it.baseId; + }} + + {{? $ownProperties }} + var {{=$dataProperties}} = undefined; + {{?}} + {{# def.iterateProperties }} + var startErrs{{=$lvl}} = errors; + + {{ var $passData = $key; }} + {{# def.setCompositeRule }} + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + {{# def.resetCompositeRule }} + + if (!{{=$nextValid}}) { + for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}= it.opts.loopRequired + , $ownProperties = it.opts.ownProperties; + }} + + {{? $breakOnError }} + var missing{{=$lvl}}; + {{? $loopRequired }} + {{# def.setupLoop }} + var {{=$valid}} = true; + + {{?$isData}}{{# def.check$dataIsArray }}{{?}} + + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { + {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined + {{? $ownProperties }} + && {{# def.isRequiredOwnProperty }} + {{?}}; + if (!{{=$valid}}) break; + } + + {{? $isData }} } {{?}} + + {{# def.checkError:'required' }} + else { + {{??}} + if ({{# def.checkMissingProperty:$required }}) { + {{# def.errorMissingProperty:'required' }} + } else { + {{?}} + {{??}} + {{? $loopRequired }} + {{# def.setupLoop }} + {{? $isData }} + if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) { + {{# def.addError:'required' }} + } else if ({{=$vSchema}} !== undefined) { + {{?}} + + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { + if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined + {{? $ownProperties }} + || !{{# def.isRequiredOwnProperty }} + {{?}}) { + {{# def.addError:'required' }} + } + } + + {{? $isData }} } {{?}} + {{??}} + {{~ $required:$propertyKey }} + {{# def.allErrorsMissingProperty:'required' }} + {{~}} + {{?}} + {{?}} + + {{ it.errorPath = $currentErrorPath; }} + +{{?? $breakOnError }} + if (true) { +{{?}} diff --git a/node_modules/ajv/lib/dot/uniqueItems.jst b/node_modules/ajv/lib/dot/uniqueItems.jst new file mode 100644 index 0000000..22f82f9 --- /dev/null +++ b/node_modules/ajv/lib/dot/uniqueItems.jst @@ -0,0 +1,62 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + + +{{? ($schema || $isData) && it.opts.uniqueItems !== false }} + {{? $isData }} + var {{=$valid}}; + if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined) + {{=$valid}} = true; + else if (typeof {{=$schemaValue}} != 'boolean') + {{=$valid}} = false; + else { + {{?}} + + var i = {{=$data}}.length + , {{=$valid}} = true + , j; + if (i > 1) { + {{ + var $itemType = it.schema.items && it.schema.items.type + , $typeIsArray = Array.isArray($itemType); + }} + {{? !$itemType || $itemType == 'object' || $itemType == 'array' || + ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }} + outer: + for (;i--;) { + for (j = i; j--;) { + if (equal({{=$data}}[i], {{=$data}}[j])) { + {{=$valid}} = false; + break outer; + } + } + } + {{??}} + var itemIndices = {}, item; + for (;i--;) { + var item = {{=$data}}[i]; + {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }} + if ({{= it.util[$method]($itemType, 'item', true) }}) continue; + {{? $typeIsArray}} + if (typeof item == 'string') item = '"' + item; + {{?}} + if (typeof itemIndices[item] == 'number') { + {{=$valid}} = false; + j = itemIndices[item]; + break; + } + itemIndices[item] = i; + } + {{?}} + } + + {{? $isData }} } {{?}} + + if (!{{=$valid}}) { + {{# def.error:'uniqueItems' }} + } {{? $breakOnError }} else { {{?}} +{{??}} + {{? $breakOnError }} if (true) { {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/validate.jst b/node_modules/ajv/lib/dot/validate.jst new file mode 100644 index 0000000..f8a1edf --- /dev/null +++ b/node_modules/ajv/lib/dot/validate.jst @@ -0,0 +1,282 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.defaults }} +{{# def.coerce }} + +{{ /** + * schema compilation (render) time: + * it = { schema, RULES, _validate, opts } + * it.validate - this template function, + * it is used recursively to generate code for subschemas + * + * runtime: + * "validate" is a variable name to which this function will be assigned + * validateRef etc. are defined in the parent scope in index.js + */ }} + +{{ + var $async = it.schema.$async === true + , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref') + , $id = it.self._getId(it.schema); +}} + +{{ + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } +}} + +{{? it.isTop }} + var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) { + 'use strict'; + {{? $id && (it.opts.sourceCode || it.opts.processCode) }} + {{= '/\*# sourceURL=' + $id + ' */' }} + {{?}} +{{?}} + +{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }} + {{ var $keyword = 'false schema'; }} + {{# def.setupKeyword }} + {{? it.schema === false}} + {{? it.isTop}} + {{ $breakOnError = true; }} + {{??}} + var {{=$valid}} = false; + {{?}} + {{# def.error:'false schema' }} + {{??}} + {{? it.isTop}} + {{? $async }} + return data; + {{??}} + validate.errors = null; + return true; + {{?}} + {{??}} + var {{=$valid}} = true; + {{?}} + {{?}} + + {{? it.isTop}} + }; + return validate; + {{?}} + + {{ return out; }} +{{?}} + + +{{? it.isTop }} + {{ + var $top = it.isTop + , $lvl = it.level = 0 + , $dataLvl = it.dataLevel = 0 + , $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + + it.dataPathArr = [undefined]; + + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + }} + + var vErrors = null; {{ /* don't edit, used in replace */ }} + var errors = 0; {{ /* don't edit, used in replace */ }} + if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }} +{{??}} + {{ + var $lvl = it.level + , $dataLvl = it.dataLevel + , $data = 'data' + ($dataLvl || ''); + + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + + if ($async && !it.async) throw new Error('async schema in sync schema'); + }} + + var errs_{{=$lvl}} = errors; +{{?}} + +{{ + var $valid = 'valid' + $lvl + , $breakOnError = !it.opts.allErrors + , $closingBraces1 = '' + , $closingBraces2 = ''; + + var $errorKeyword; + var $typeSchema = it.schema.type + , $typeIsArray = Array.isArray($typeSchema); + + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) + $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } +}} + +{{## def.checkType: + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type' + , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + }} + + if ({{= it.util[$method]($typeSchema, $data, true) }}) { +#}} + +{{? it.schema.$ref && $refKeywords }} + {{? it.opts.extendRefs == 'fail' }} + {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }} + {{?? it.opts.extendRefs !== true }} + {{ + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + }} + {{?}} +{{?}} + +{{? it.schema.$comment && it.opts.$comment }} + {{= it.RULES.all.$comment.code(it, '$comment') }} +{{?}} + +{{? $typeSchema }} + {{? it.opts.coerceTypes }} + {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }} + {{?}} + + {{ var $rulesGroup = it.RULES.types[$typeSchema]; }} + {{? $coerceToTypes || $typeIsArray || $rulesGroup === true || + ($rulesGroup && !$shouldUseGroup($rulesGroup)) }} + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type'; + }} + {{# def.checkType }} + {{? $coerceToTypes }} + {{# def.coerceType }} + {{??}} + {{# def.error:'type' }} + {{?}} + } + {{?}} +{{?}} + + +{{? it.schema.$ref && !$refKeywords }} + {{= it.RULES.all.$ref.code(it, '$ref') }} + {{? $breakOnError }} + } + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { + {{ $closingBraces2 += '}'; }} + {{?}} +{{??}} + {{~ it.RULES:$rulesGroup }} + {{? $shouldUseGroup($rulesGroup) }} + {{? $rulesGroup.type }} + if ({{= it.util.checkDataType($rulesGroup.type, $data) }}) { + {{?}} + {{? it.opts.useDefaults }} + {{? $rulesGroup.type == 'object' && it.schema.properties }} + {{# def.defaultProperties }} + {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }} + {{# def.defaultItems }} + {{?}} + {{?}} + {{~ $rulesGroup.rules:$rule }} + {{? $shouldUseRule($rule) }} + {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }} + {{? $code }} + {{= $code }} + {{? $breakOnError }} + {{ $closingBraces1 += '}'; }} + {{?}} + {{?}} + {{?}} + {{~}} + {{? $breakOnError }} + {{= $closingBraces1 }} + {{ $closingBraces1 = ''; }} + {{?}} + {{? $rulesGroup.type }} + } + {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }} + else { + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type'; + }} + {{# def.error:'type' }} + } + {{?}} + {{?}} + + {{? $breakOnError }} + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { + {{ $closingBraces2 += '}'; }} + {{?}} + {{?}} + {{~}} +{{?}} + +{{? $breakOnError }} {{= $closingBraces2 }} {{?}} + +{{? $top }} + {{? $async }} + if (errors === 0) return data; {{ /* don't edit, used in replace */ }} + else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }} + {{??}} + validate.errors = vErrors; {{ /* don't edit, used in replace */ }} + return errors === 0; {{ /* don't edit, used in replace */ }} + {{?}} + }; + + return validate; +{{??}} + var {{=$valid}} = errors === errs_{{=$lvl}}; +{{?}} + +{{# def.cleanUp }} + +{{? $top }} + {{# def.finalCleanUp }} +{{?}} + +{{ + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i=0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) + return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || + ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i=0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) + return true; + } +}} diff --git a/node_modules/ajv/lib/dotjs/README.md b/node_modules/ajv/lib/dotjs/README.md new file mode 100644 index 0000000..4d99484 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/README.md @@ -0,0 +1,3 @@ +These files are compiled dot templates from dot folder. + +Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder. diff --git a/node_modules/ajv/lib/dotjs/_limit.js b/node_modules/ajv/lib/dotjs/_limit.js new file mode 100644 index 0000000..f02a760 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limit.js @@ -0,0 +1,157 @@ +'use strict'; +module.exports = function generate__limit(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $isMax = $keyword == 'maximum', + $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum', + $schemaExcl = it.schema[$exclusiveKeyword], + $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, + $op = $isMax ? '<' : '>', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/_limitItems.js b/node_modules/ajv/lib/dotjs/_limitItems.js new file mode 100644 index 0000000..a27d118 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limitItems.js @@ -0,0 +1,77 @@ +'use strict'; +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/_limitLength.js b/node_modules/ajv/lib/dotjs/_limitLength.js new file mode 100644 index 0000000..789f374 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limitLength.js @@ -0,0 +1,82 @@ +'use strict'; +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/_limitProperties.js b/node_modules/ajv/lib/dotjs/_limitProperties.js new file mode 100644 index 0000000..11dc939 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limitProperties.js @@ -0,0 +1,77 @@ +'use strict'; +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/allOf.js b/node_modules/ajv/lib/dotjs/allOf.js new file mode 100644 index 0000000..4bad914 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/allOf.js @@ -0,0 +1,43 @@ +'use strict'; +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + out = it.util.cleanUpCode(out); + return out; +} diff --git a/node_modules/ajv/lib/dotjs/anyOf.js b/node_modules/ajv/lib/dotjs/anyOf.js new file mode 100644 index 0000000..01551d5 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/anyOf.js @@ -0,0 +1,74 @@ +'use strict'; +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return (it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all)); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + out = it.util.cleanUpCode(out); + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/comment.js b/node_modules/ajv/lib/dotjs/comment.js new file mode 100644 index 0000000..dd66bb8 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/comment.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function generate_comment(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $comment = it.util.toQuotedString($schema); + if (it.opts.$comment === true) { + out += ' console.log(' + ($comment) + ');'; + } else if (typeof it.opts.$comment == 'function') { + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/const.js b/node_modules/ajv/lib/dotjs/const.js new file mode 100644 index 0000000..15b7c61 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/const.js @@ -0,0 +1,56 @@ +'use strict'; +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/contains.js b/node_modules/ajv/lib/dotjs/contains.js new file mode 100644 index 0000000..cd4dfab --- /dev/null +++ b/node_modules/ajv/lib/dotjs/contains.js @@ -0,0 +1,82 @@ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = (it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all)); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + out = it.util.cleanUpCode(out); + return out; +} diff --git a/node_modules/ajv/lib/dotjs/custom.js b/node_modules/ajv/lib/dotjs/custom.js new file mode 100644 index 0000000..f3e641e --- /dev/null +++ b/node_modules/ajv/lib/dotjs/custom.js @@ -0,0 +1,228 @@ +'use strict'; +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += 'await '; + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; + } + out += ') { '; + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} diff --git a/node_modules/ajv/lib/dotjs/enum.js b/node_modules/ajv/lib/dotjs/enum.js new file mode 100644 index 0000000..90580b9 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/enum.js @@ -0,0 +1,66 @@ +'use strict'; +module.exports = function generate_enum(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $i = 'i' + $lvl, + $vSchema = 'schema' + $lvl; + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ';'; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to one of the allowed values\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/format.js b/node_modules/ajv/lib/dotjs/format.js new file mode 100644 index 0000000..cd9a569 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/format.js @@ -0,0 +1,150 @@ +'use strict'; +module.exports = function generate_format(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + if (it.opts.format === false) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $unknownFormats = it.opts.unknownFormats, + $allowUnknown = Array.isArray($unknownFormats); + if ($isData) { + var $format = 'format' + $lvl, + $isObject = 'isObject' + $lvl, + $formatType = 'formatType' + $lvl; + out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; + if (it.async) { + out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; + } + out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' ('; + if ($unknownFormats != 'ignore') { + out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; + if ($allowUnknown) { + out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; + } + out += ') || '; + } + out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; + if (it.async) { + out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; + } else { + out += ' ' + ($format) + '(' + ($data) + ') '; + } + out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; + } else { + var $format = it.formats[$schema]; + if (!$format) { + if ($unknownFormats == 'ignore') { + it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/if.js b/node_modules/ajv/lib/dotjs/if.js new file mode 100644 index 0000000..019f61a --- /dev/null +++ b/node_modules/ajv/lib/dotjs/if.js @@ -0,0 +1,104 @@ +'use strict'; +module.exports = function generate_if(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + var $thenSch = it.schema['then'], + $elseSch = it.schema['else'], + $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? typeof $thenSch == 'object' && Object.keys($thenSch).length > 0 : it.util.schemaHasRules($thenSch, it.RULES.all)), + $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? typeof $elseSch == 'object' && Object.keys($elseSch).length > 0 : it.util.schemaHasRules($elseSch, it.RULES.all)), + $currentBaseId = $it.baseId; + if ($thenPresent || $elsePresent) { + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + $it.createErrors = true; + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + if ($thenPresent) { + out += ' if (' + ($nextValid) + ') { '; + $it.schema = it.schema['then']; + $it.schemaPath = it.schemaPath + '.then'; + $it.errSchemaPath = it.errSchemaPath + '/then'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'then\'; '; + } else { + $ifClause = '\'then\''; + } + out += ' } '; + if ($elsePresent) { + out += ' else { '; + } + } else { + out += ' if (!' + ($nextValid) + ') { '; + } + if ($elsePresent) { + $it.schema = it.schema['else']; + $it.schemaPath = it.schemaPath + '.else'; + $it.errSchemaPath = it.errSchemaPath + '/else'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'else\'; '; + } else { + $ifClause = '\'else\''; + } + out += ' } '; + } + out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + out = it.util.cleanUpCode(out); + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/index.js b/node_modules/ajv/lib/dotjs/index.js new file mode 100644 index 0000000..2fb1b00 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/index.js @@ -0,0 +1,33 @@ +'use strict'; + +//all requires must be explicit because browserify won't work with dynamic requires +module.exports = { + '$ref': require('./ref'), + allOf: require('./allOf'), + anyOf: require('./anyOf'), + '$comment': require('./comment'), + const: require('./const'), + contains: require('./contains'), + dependencies: require('./dependencies'), + 'enum': require('./enum'), + format: require('./format'), + 'if': require('./if'), + items: require('./items'), + maximum: require('./_limit'), + minimum: require('./_limit'), + maxItems: require('./_limitItems'), + minItems: require('./_limitItems'), + maxLength: require('./_limitLength'), + minLength: require('./_limitLength'), + maxProperties: require('./_limitProperties'), + minProperties: require('./_limitProperties'), + multipleOf: require('./multipleOf'), + not: require('./not'), + oneOf: require('./oneOf'), + pattern: require('./pattern'), + properties: require('./properties'), + propertyNames: require('./propertyNames'), + required: require('./required'), + uniqueItems: require('./uniqueItems'), + validate: require('./validate') +}; diff --git a/node_modules/ajv/lib/dotjs/items.js b/node_modules/ajv/lib/dotjs/items.js new file mode 100644 index 0000000..d5532f0 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/items.js @@ -0,0 +1,141 @@ +'use strict'; +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0 : it.util.schemaHasRules($additionalItems, it.RULES.all))) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} diff --git a/node_modules/ajv/lib/dotjs/multipleOf.js b/node_modules/ajv/lib/dotjs/multipleOf.js new file mode 100644 index 0000000..af087d2 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/multipleOf.js @@ -0,0 +1,77 @@ +'use strict'; +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/not.js b/node_modules/ajv/lib/dotjs/not.js new file mode 100644 index 0000000..6aea659 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/not.js @@ -0,0 +1,84 @@ +'use strict'; +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/oneOf.js b/node_modules/ajv/lib/dotjs/oneOf.js new file mode 100644 index 0000000..30988d5 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/oneOf.js @@ -0,0 +1,73 @@ +'use strict'; +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $prevValid = 'prevValid' + $lvl, + $passingSchemas = 'passingSchemas' + $lvl; + out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/pattern.js b/node_modules/ajv/lib/dotjs/pattern.js new file mode 100644 index 0000000..1d74d6b --- /dev/null +++ b/node_modules/ajv/lib/dotjs/pattern.js @@ -0,0 +1,75 @@ +'use strict'; +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/properties.js b/node_modules/ajv/lib/dotjs/properties.js new file mode 100644 index 0000000..34a82c6 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/properties.js @@ -0,0 +1,330 @@ +'use strict'; +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required); + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 8) { + out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is an invalid additional property'; + } else { + out += 'should NOT have additional properties'; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr4 = $pPropertyKeys; + if (arr4) { + var $pProperty, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $pProperty = arr4[i4 += 1]; + var $sch = $pProperties[$pProperty]; + if ((it.opts.strictKeywords ? typeof $sch == 'object' && Object.keys($sch).length > 0 : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} diff --git a/node_modules/ajv/lib/dotjs/propertyNames.js b/node_modules/ajv/lib/dotjs/propertyNames.js new file mode 100644 index 0000000..b2bf295 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/propertyNames.js @@ -0,0 +1,82 @@ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;'; + if ((it.opts.strictKeywords ? typeof $schema == 'object' && Object.keys($schema).length > 0 : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0 : it.util.schemaHasRules($propertySch, it.RULES.all)))) { + $required[$required.length] = $property; + } + } + } + } else { + var $required = $schema; + } + } + if ($isData || $required.length) { + var $currentErrorPath = it.errorPath, + $loopRequired = $isData || $required.length >= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/uniqueItems.js b/node_modules/ajv/lib/dotjs/uniqueItems.js new file mode 100644 index 0000000..c4f6536 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/uniqueItems.js @@ -0,0 +1,86 @@ +'use strict'; +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; + var $itemType = it.schema.items && it.schema.items.type, + $typeIsArray = Array.isArray($itemType); + if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { + out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; + } else { + out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; + var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); + out += ' if (' + (it.util[$method]($itemType, 'item', true)) + ') continue; '; + if ($typeIsArray) { + out += ' if (typeof item == \'string\') item = \'"\' + item; '; + } + out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; + } + out += ' } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/validate.js b/node_modules/ajv/lib/dotjs/validate.js new file mode 100644 index 0000000..cd0efc8 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/validate.js @@ -0,0 +1,494 @@ +'use strict'; +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } + if (it.isTop) { + out += ' var validate = '; + if ($async) { + it.async = true; + out += 'async '; + } + out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }; return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [undefined]; + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if (it.schema.$comment && it.opts.$comment) { + out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; + } + out += ' var ' + ($coerced) + ' = undefined; '; + var $bracesCoercion = ''; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($i) { + out += ' if (' + ($coerced) + ' === undefined) { '; + $bracesCoercion += '}'; + } + if (it.opts.coerceTypes == 'array' && $type != 'array') { + out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } '; + } + if ($type == 'string') { + out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { '; + } + if (it.opts.useDefaults) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }; return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + out = it.util.cleanUpCode(out); + if ($top) { + out = it.util.finalCleanUpCode(out, $async); + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} diff --git a/node_modules/ajv/lib/keyword.js b/node_modules/ajv/lib/keyword.js new file mode 100644 index 0000000..5fec19a --- /dev/null +++ b/node_modules/ajv/lib/keyword.js @@ -0,0 +1,146 @@ +'use strict'; + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = require('./dotjs/custom'); +var definitionSchema = require('./definition_schema'); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword, + validate: validateKeyword +}; + + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + this.validateKeyword(definition, true); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + for (var i=0; i ../ajv-dist/bower.json + cd ../ajv-dist + + if [[ `git status --porcelain` ]]; then + echo "Changes detected. Updating master branch..." + git add -A + git commit -m "updated by travis build #$TRAVIS_BUILD_NUMBER" + git push --quiet origin master > /dev/null 2>&1 + fi + + echo "Publishing tag..." + + git tag $TRAVIS_TAG + git push --tags > /dev/null 2>&1 + + echo "Done" +fi diff --git a/node_modules/ajv/scripts/travis-gh-pages b/node_modules/ajv/scripts/travis-gh-pages new file mode 100755 index 0000000..46ded16 --- /dev/null +++ b/node_modules/ajv/scripts/travis-gh-pages @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -e + +if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then + git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE '\.md$|^LICENSE$|travis-gh-pages$' && { + rm -rf ../gh-pages + git clone -b gh-pages --single-branch https://${GITHUB_TOKEN}@github.com/epoberezkin/ajv.git ../gh-pages + mkdir -p ../gh-pages/_source + cp *.md ../gh-pages/_source + cp LICENSE ../gh-pages/_source + currentDir=$(pwd) + cd ../gh-pages + $currentDir/node_modules/.bin/gh-pages-generator + # remove logo from README + sed -i -E "s/]+ajv_logo[^>]+>//" index.md + git config user.email "$GIT_USER_EMAIL" + git config user.name "$GIT_USER_NAME" + git add . + git commit -am "updated by travis build #$TRAVIS_BUILD_NUMBER" + git push --quiet origin gh-pages > /dev/null 2>&1 + } +fi diff --git a/node_modules/ansi-align/CHANGELOG.md b/node_modules/ansi-align/CHANGELOG.md new file mode 100644 index 0000000..621e50a --- /dev/null +++ b/node_modules/ansi-align/CHANGELOG.md @@ -0,0 +1,36 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [2.0.0](https://github.com/nexdrew/ansi-align/compare/v1.1.0...v2.0.0) (2017-05-01) + + +### Features + +* ES2015ify, dropping support for Node <4 ([#30](https://github.com/nexdrew/ansi-align/issues/30)) ([7b43f48](https://github.com/nexdrew/ansi-align/commit/7b43f48)) + + +### BREAKING CHANGES + +* Node 0.10 or 0.12 no longer supported, please update to Node 4+ or use ansi-align@1.1.0 + + + + +# [1.1.0](https://github.com/nexdrew/ansi-align/compare/v1.0.0...v1.1.0) (2016-06-06) + + +### Features + +* support left-alignment as no-op ([#3](https://github.com/nexdrew/ansi-align/issues/3)) ([e581db6](https://github.com/nexdrew/ansi-align/commit/e581db6)) + + + + +# 1.0.0 (2016-04-30) + + +### Features + +* initial commit ([1914d90](https://github.com/nexdrew/ansi-align/commit/1914d90)) diff --git a/node_modules/ansi-align/LICENSE b/node_modules/ansi-align/LICENSE new file mode 100644 index 0000000..ab601b6 --- /dev/null +++ b/node_modules/ansi-align/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/ansi-align/README.md b/node_modules/ansi-align/README.md new file mode 100644 index 0000000..3aafc67 --- /dev/null +++ b/node_modules/ansi-align/README.md @@ -0,0 +1,79 @@ +# ansi-align + +> align-text with ANSI support for CLIs + +[![Build Status](https://travis-ci.org/nexdrew/ansi-align.svg?branch=master)](https://travis-ci.org/nexdrew/ansi-align) +[![Coverage Status](https://coveralls.io/repos/github/nexdrew/ansi-align/badge.svg?branch=master)](https://coveralls.io/github/nexdrew/ansi-align?branch=master) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +Easily center- or right- align a block of text, carefully ignoring ANSI escape codes. + +E.g. turn this: + +ansi text block no alignment :( + +Into this: + +ansi text block center aligned! + +## Install + +```sh +npm install --save ansi-align +``` + +```js +var ansiAlign = require('ansi-align') +``` + +## API + +### `ansiAlign(text, [opts])` + +Align the given text per the line with the greatest [`string-width`](https://github.com/sindresorhus/string-width), returning a new string (or array). + +#### Arguments + +- `text`: required, string or array + + The text to align. If a string is given, it will be split using either the `opts.split` value or `'\n'` by default. If an array is given, a different array of modified strings will be returned. + +- `opts`: optional, object + + Options to change behavior, see below. + +#### Options + +- `opts.align`: string, default `'center'` + + The alignment mode. Use `'center'` for center-alignment, `'right'` for right-alignment, or `'left'` for left-alignment. Note that the given `text` is assumed to be left-aligned already, so specifying `align: 'left'` just returns the `text` as is (no-op). + +- `opts.split`: string or RegExp, default `'\n'` + + The separator to use when splitting the text. Only used if text is given as a string. + +- `opts.pad`: string, default `' '` + + The value used to left-pad (prepend to) lines of lesser width. Will be repeated as necessary to adjust alignment to the line with the greatest width. + +### `ansiAlign.center(text)` + +Alias for `ansiAlign(text, { align: 'center' })`. + +### `ansiAlign.right(text)` + +Alias for `ansiAlign(text, { align: 'right' })`. + +### `ansiAlign.left(text)` + +Alias for `ansiAlign(text, { align: 'left' })`, which is a no-op. + +## Similar Packages + +- [`center-align`](https://github.com/jonschlinkert/center-align): Very close to this package, except it doesn't support ANSI codes. +- [`left-pad`](https://github.com/camwest/left-pad): Great for left-padding but does not support center alignment or ANSI codes. +- Pretty much anything by the [chalk](https://github.com/chalk) team + +## License + +ISC © Contributors diff --git a/node_modules/ansi-align/index.js b/node_modules/ansi-align/index.js new file mode 100644 index 0000000..67fa826 --- /dev/null +++ b/node_modules/ansi-align/index.js @@ -0,0 +1,61 @@ +'use strict' + +const stringWidth = require('string-width') + +function ansiAlign (text, opts) { + if (!text) return text + + opts = opts || {} + const align = opts.align || 'center' + + // short-circuit `align: 'left'` as no-op + if (align === 'left') return text + + const split = opts.split || '\n' + const pad = opts.pad || ' ' + const widthDiffFn = align !== 'right' ? halfDiff : fullDiff + + let returnString = false + if (!Array.isArray(text)) { + returnString = true + text = String(text).split(split) + } + + let width + let maxWidth = 0 + text = text.map(function (str) { + str = String(str) + width = stringWidth(str) + maxWidth = Math.max(width, maxWidth) + return { + str, + width + } + }).map(function (obj) { + return new Array(widthDiffFn(maxWidth, obj.width) + 1).join(pad) + obj.str + }) + + return returnString ? text.join(split) : text +} + +ansiAlign.left = function left (text) { + return ansiAlign(text, { align: 'left' }) +} + +ansiAlign.center = function center (text) { + return ansiAlign(text, { align: 'center' }) +} + +ansiAlign.right = function right (text) { + return ansiAlign(text, { align: 'right' }) +} + +module.exports = ansiAlign + +function halfDiff (maxWidth, curWidth) { + return Math.floor((maxWidth - curWidth) / 2) +} + +function fullDiff (maxWidth, curWidth) { + return maxWidth - curWidth +} diff --git a/node_modules/ansi-align/node_modules/ansi-regex/index.js b/node_modules/ansi-align/node_modules/ansi-regex/index.js new file mode 100644 index 0000000..c4aaecf --- /dev/null +++ b/node_modules/ansi-align/node_modules/ansi-regex/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = () => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, 'g'); +}; diff --git a/node_modules/ansi-align/node_modules/ansi-regex/license b/node_modules/ansi-align/node_modules/ansi-regex/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/ansi-align/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/ansi-align/node_modules/ansi-regex/package.json b/node_modules/ansi-align/node_modules/ansi-regex/package.json new file mode 100644 index 0000000..da7798c --- /dev/null +++ b/node_modules/ansi-align/node_modules/ansi-regex/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + "ansi-regex@3.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "ansi-regex@3.0.0", + "_id": "ansi-regex@3.0.0", + "_inBundle": false, + "_integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "_location": "/ansi-align/ansi-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ansi-regex@3.0.0", + "name": "ansi-regex", + "escapedName": "ansi-regex", + "rawSpec": "3.0.0", + "saveSpec": null, + "fetchSpec": "3.0.0" + }, + "_requiredBy": [ + "/ansi-align/strip-ansi" + ], + "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "_spec": "3.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/ansi-regex/issues" + }, + "description": "Regular expression for matching ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/ansi-regex#readme", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "license": "MIT", + "name": "ansi-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/ansi-regex.git" + }, + "scripts": { + "test": "xo && ava", + "view-supported": "node fixtures/view-codes.js" + }, + "version": "3.0.0" +} diff --git a/node_modules/ansi-align/node_modules/ansi-regex/readme.md b/node_modules/ansi-align/node_modules/ansi-regex/readme.md new file mode 100644 index 0000000..22db1c3 --- /dev/null +++ b/node_modules/ansi-align/node_modules/ansi-regex/readme.md @@ -0,0 +1,46 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] +``` + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/ansi-align/node_modules/is-fullwidth-code-point/index.js b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/index.js new file mode 100644 index 0000000..d506327 --- /dev/null +++ b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/index.js @@ -0,0 +1,46 @@ +'use strict'; +/* eslint-disable yoda */ +module.exports = x => { + if (Number.isNaN(x)) { + return false; + } + + // code points are derived from: + // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt + if ( + x >= 0x1100 && ( + x <= 0x115f || // Hangul Jamo + x === 0x2329 || // LEFT-POINTING ANGLE BRACKET + x === 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK Radicals Supplement .. Enclosed CJK Letters and Months + (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || + // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A + (0x3250 <= x && x <= 0x4dbf) || + // CJK Unified Ideographs .. Yi Radicals + (0x4e00 <= x && x <= 0xa4c6) || + // Hangul Jamo Extended-A + (0xa960 <= x && x <= 0xa97c) || + // Hangul Syllables + (0xac00 <= x && x <= 0xd7a3) || + // CJK Compatibility Ideographs + (0xf900 <= x && x <= 0xfaff) || + // Vertical Forms + (0xfe10 <= x && x <= 0xfe19) || + // CJK Compatibility Forms .. Small Form Variants + (0xfe30 <= x && x <= 0xfe6b) || + // Halfwidth and Fullwidth Forms + (0xff01 <= x && x <= 0xff60) || + (0xffe0 <= x && x <= 0xffe6) || + // Kana Supplement + (0x1b000 <= x && x <= 0x1b001) || + // Enclosed Ideographic Supplement + (0x1f200 <= x && x <= 0x1f251) || + // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane + (0x20000 <= x && x <= 0x3fffd) + ) + ) { + return true; + } + + return false; +}; diff --git a/node_modules/ansi-align/node_modules/is-fullwidth-code-point/license b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/ansi-align/node_modules/is-fullwidth-code-point/package.json b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/package.json new file mode 100644 index 0000000..fed7312 --- /dev/null +++ b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/package.json @@ -0,0 +1,81 @@ +{ + "_args": [ + [ + "is-fullwidth-code-point@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "is-fullwidth-code-point@2.0.0", + "_id": "is-fullwidth-code-point@2.0.0", + "_inBundle": false, + "_integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "_location": "/ansi-align/is-fullwidth-code-point", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "is-fullwidth-code-point@2.0.0", + "name": "is-fullwidth-code-point", + "escapedName": "is-fullwidth-code-point", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/ansi-align/string-width" + ], + "_resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues" + }, + "description": "Check if the character represented by a given Unicode code point is fullwidth", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme", + "keywords": [ + "fullwidth", + "full-width", + "full", + "width", + "unicode", + "character", + "char", + "string", + "str", + "codepoint", + "code", + "point", + "is", + "detect", + "check" + ], + "license": "MIT", + "name": "is-fullwidth-code-point", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.0", + "xo": { + "esnext": true + } +} diff --git a/node_modules/ansi-align/node_modules/is-fullwidth-code-point/readme.md b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/readme.md new file mode 100644 index 0000000..093b028 --- /dev/null +++ b/node_modules/ansi-align/node_modules/is-fullwidth-code-point/readme.md @@ -0,0 +1,39 @@ +# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point) + +> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) + + +## Install + +``` +$ npm install --save is-fullwidth-code-point +``` + + +## Usage + +```js +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +isFullwidthCodePoint('谢'.codePointAt()); +//=> true + +isFullwidthCodePoint('a'.codePointAt()); +//=> false +``` + + +## API + +### isFullwidthCodePoint(input) + +#### input + +Type: `number` + +[Code point](https://en.wikipedia.org/wiki/Code_point) of a character. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/ansi-align/node_modules/string-width/index.js b/node_modules/ansi-align/node_modules/string-width/index.js new file mode 100644 index 0000000..bbc49d2 --- /dev/null +++ b/node_modules/ansi-align/node_modules/string-width/index.js @@ -0,0 +1,36 @@ +'use strict'; +const stripAnsi = require('strip-ansi'); +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +module.exports = str => { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + str = stripAnsi(str); + + let width = 0; + + for (let i = 0; i < str.length; i++) { + const code = str.codePointAt(i); + + // Ignore control characters + if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { + continue; + } + + // Ignore combining characters + if (code >= 0x300 && code <= 0x36F) { + continue; + } + + // Surrogates + if (code > 0xFFFF) { + i++; + } + + width += isFullwidthCodePoint(code) ? 2 : 1; + } + + return width; +}; diff --git a/node_modules/ansi-align/node_modules/string-width/license b/node_modules/ansi-align/node_modules/string-width/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/ansi-align/node_modules/string-width/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/ansi-align/node_modules/string-width/package.json b/node_modules/ansi-align/node_modules/string-width/package.json new file mode 100644 index 0000000..9fa666f --- /dev/null +++ b/node_modules/ansi-align/node_modules/string-width/package.json @@ -0,0 +1,91 @@ +{ + "_args": [ + [ + "string-width@2.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "string-width@2.1.1", + "_id": "string-width@2.1.1", + "_inBundle": false, + "_integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "_location": "/ansi-align/string-width", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "string-width@2.1.1", + "name": "string-width", + "escapedName": "string-width", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/ansi-align" + ], + "_resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "_spec": "2.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/string-width/issues" + }, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "description": "Get the visual width of a string - the number of columns required to display it", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/string-width#readme", + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "license": "MIT", + "name": "string-width", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/string-width.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.1.1" +} diff --git a/node_modules/ansi-align/node_modules/string-width/readme.md b/node_modules/ansi-align/node_modules/string-width/readme.md new file mode 100644 index 0000000..df5b719 --- /dev/null +++ b/node_modules/ansi-align/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/ansi-align/node_modules/strip-ansi/index.js b/node_modules/ansi-align/node_modules/strip-ansi/index.js new file mode 100644 index 0000000..96e0292 --- /dev/null +++ b/node_modules/ansi-align/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +const ansiRegex = require('ansi-regex'); + +module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; diff --git a/node_modules/ansi-align/node_modules/strip-ansi/license b/node_modules/ansi-align/node_modules/strip-ansi/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/ansi-align/node_modules/strip-ansi/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/ansi-align/node_modules/strip-ansi/package.json b/node_modules/ansi-align/node_modules/strip-ansi/package.json new file mode 100644 index 0000000..36ebf6a --- /dev/null +++ b/node_modules/ansi-align/node_modules/strip-ansi/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "strip-ansi@4.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "strip-ansi@4.0.0", + "_id": "strip-ansi@4.0.0", + "_inBundle": false, + "_integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "_location": "/ansi-align/strip-ansi", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "strip-ansi@4.0.0", + "name": "strip-ansi", + "escapedName": "strip-ansi", + "rawSpec": "4.0.0", + "saveSpec": null, + "fetchSpec": "4.0.0" + }, + "_requiredBy": [ + "/ansi-align/string-width" + ], + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "_spec": "4.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/strip-ansi/issues" + }, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "description": "Strip ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/strip-ansi#readme", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "name": "strip-ansi", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/strip-ansi.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "4.0.0" +} diff --git a/node_modules/ansi-align/node_modules/strip-ansi/readme.md b/node_modules/ansi-align/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000..dc76f0c --- /dev/null +++ b/node_modules/ansi-align/node_modules/strip-ansi/readme.md @@ -0,0 +1,39 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install strip-ansi +``` + + +## Usage + +```js +const stripAnsi = require('strip-ansi'); + +stripAnsi('\u001B[4mUnicorn\u001B[0m'); +//=> 'Unicorn' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/ansi-align/package.json b/node_modules/ansi-align/package.json new file mode 100644 index 0000000..73d9c49 --- /dev/null +++ b/node_modules/ansi-align/package.json @@ -0,0 +1,74 @@ +{ + "_args": [ + [ + "ansi-align@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "ansi-align@2.0.0", + "_id": "ansi-align@2.0.0", + "_inBundle": false, + "_integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "_location": "/ansi-align", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ansi-align@2.0.0", + "name": "ansi-align", + "escapedName": "ansi-align", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/boxen" + ], + "_resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "nexdrew" + }, + "bugs": { + "url": "https://github.com/nexdrew/ansi-align/issues" + }, + "dependencies": { + "string-width": "^2.0.0" + }, + "description": "align-text with ANSI support for CLIs", + "devDependencies": { + "ava": "^0.19.1", + "chalk": "^1.1.3", + "coveralls": "^2.13.1", + "nyc": "^10.3.0", + "standard": "^10.0.2", + "standard-version": "^4.0.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/nexdrew/ansi-align#readme", + "keywords": [ + "ansi", + "align", + "cli", + "center", + "pad" + ], + "license": "ISC", + "main": "index.js", + "name": "ansi-align", + "repository": { + "type": "git", + "url": "git+https://github.com/nexdrew/ansi-align.git" + }, + "scripts": { + "coverage": "nyc report --reporter=text-lcov | coveralls", + "pretest": "standard", + "release": "standard-version", + "test": "nyc ava" + }, + "version": "2.0.0" +} diff --git a/node_modules/ansi-regex/index.js b/node_modules/ansi-regex/index.js new file mode 100644 index 0000000..b9574ed --- /dev/null +++ b/node_modules/ansi-regex/index.js @@ -0,0 +1,4 @@ +'use strict'; +module.exports = function () { + return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g; +}; diff --git a/node_modules/ansi-regex/license b/node_modules/ansi-regex/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/ansi-regex/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/ansi-regex/package.json b/node_modules/ansi-regex/package.json new file mode 100644 index 0000000..cb640c7 --- /dev/null +++ b/node_modules/ansi-regex/package.json @@ -0,0 +1,111 @@ +{ + "_args": [ + [ + "ansi-regex@2.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "ansi-regex@2.1.1", + "_id": "ansi-regex@2.1.1", + "_inBundle": false, + "_integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "_location": "/ansi-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ansi-regex@2.1.1", + "name": "ansi-regex", + "escapedName": "ansi-regex", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/strip-ansi" + ], + "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "_spec": "2.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/ansi-regex/issues" + }, + "description": "Regular expression for matching ANSI escape codes", + "devDependencies": { + "ava": "0.17.0", + "xo": "0.16.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/ansi-regex#readme", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "license": "MIT", + "maintainers": [ + { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + { + "name": "Joshua Appelman", + "email": "jappelman@xebia.com", + "url": "jbnicolai.com" + }, + { + "name": "JD Ballard", + "email": "i.am.qix@gmail.com", + "url": "github.com/qix-" + } + ], + "name": "ansi-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/ansi-regex.git" + }, + "scripts": { + "test": "xo && ava --verbose", + "view-supported": "node fixtures/view-codes.js" + }, + "version": "2.1.1", + "xo": { + "rules": { + "guard-for-in": 0, + "no-loop-func": 0 + } + } +} diff --git a/node_modules/ansi-regex/readme.md b/node_modules/ansi-regex/readme.md new file mode 100644 index 0000000..6a928ed --- /dev/null +++ b/node_modules/ansi-regex/readme.md @@ -0,0 +1,39 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install --save ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001b[4mcake\u001b[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001b[4mcake\u001b[0m'.match(ansiRegex()); +//=> ['\u001b[4m', '\u001b[0m'] +``` + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. If I recall correctly, we test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/ansi-styles/index.js b/node_modules/ansi-styles/index.js new file mode 100644 index 0000000..90a871c --- /dev/null +++ b/node_modules/ansi-styles/index.js @@ -0,0 +1,165 @@ +'use strict'; +const colorConvert = require('color-convert'); + +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; + +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; + +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + 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], + + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Fix humans + styles.color.grey = styles.color.gray; + + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; + + for (const styleName of Object.keys(group)) { + const style = group[styleName]; + + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } + + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; + + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; + + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } + + const suite = colorConvert[key]; + + if (key === 'ansi16') { + key = 'ansi'; + } + + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } + + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } + + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/node_modules/ansi-styles/license b/node_modules/ansi-styles/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/ansi-styles/package.json b/node_modules/ansi-styles/package.json new file mode 100644 index 0000000..adcb461 --- /dev/null +++ b/node_modules/ansi-styles/package.json @@ -0,0 +1,92 @@ +{ + "_args": [ + [ + "ansi-styles@3.2.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "ansi-styles@3.2.1", + "_id": "ansi-styles@3.2.1", + "_inBundle": false, + "_integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "_location": "/ansi-styles", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ansi-styles@3.2.1", + "name": "ansi-styles", + "escapedName": "ansi-styles", + "rawSpec": "3.2.1", + "saveSpec": null, + "fetchSpec": "3.2.1" + }, + "_requiredBy": [ + "/chalk" + ], + "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "_spec": "3.2.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "ava": { + "require": "babel-polyfill" + }, + "bugs": { + "url": "https://github.com/chalk/ansi-styles/issues" + }, + "dependencies": { + "color-convert": "^1.9.0" + }, + "description": "ANSI escape codes for styling strings in the terminal", + "devDependencies": { + "ava": "*", + "babel-polyfill": "^6.23.0", + "svg-term-cli": "^2.1.1", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/ansi-styles#readme", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "name": "ansi-styles", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/ansi-styles.git" + }, + "scripts": { + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor", + "test": "xo && ava" + }, + "version": "3.2.1" +} diff --git a/node_modules/ansi-styles/readme.md b/node_modules/ansi-styles/readme.md new file mode 100644 index 0000000..3158e2d --- /dev/null +++ b/node_modules/ansi-styles/readme.md @@ -0,0 +1,147 @@ +# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) + +> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + + +## Install + +``` +$ npm install ansi-styles +``` + + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 16/256/truecolor +// NOTE: If conversion goes to 16 colors or 256 colors, the original color +// may be degraded to fit that color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); +console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); +console.log(style.color.ansi16m.hex('#ABCDEF') + 'Hello world!' + style.color.close); +``` + +## API + +Each style has an `open` and `close` property. + + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `gray` ("bright black") +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code +style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code + +style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code +style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code + +style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code +style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code +``` + + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE new file mode 100644 index 0000000..491766c --- /dev/null +++ b/node_modules/anymatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) + +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/anymatch/README.md b/node_modules/anymatch/README.md new file mode 100644 index 0000000..1dd67f5 --- /dev/null +++ b/node_modules/anymatch/README.md @@ -0,0 +1,87 @@ +anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) +====== +Javascript module to match a string against a regular expression, glob, string, +or function that takes the string as an argument and returns a truthy or falsy +value. The matcher can also be an array of any or all of these. Useful for +allowing a very flexible user-defined config to define things like file paths. + +__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ + + +Usage +----- +```sh +npm install anymatch +``` + +#### anymatch(matchers, testString, [returnIndex], [options]) +* __matchers__: (_Array|String|RegExp|Function_) +String to be directly matched, string with glob patterns, regular expression +test, function that takes the testString as an argument and returns a truthy +value if it should be matched, or an array of any number and mix of these types. +* __testString__: (_String|Array_) The string to test against the matchers. If +passed as an array, the first element of the array will be used as the +`testString` for non-function matchers, while the entire array will be applied +as the arguments for function matchers. +* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. + * __returnIndex__: (_Boolean [optional]_) If true, return the array index of +the first matcher that that testString matched, or -1 if no match, instead of a +boolean result. + +```js +const anymatch = require('anymatch'); + +const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; + +anymatch(matchers, 'path/to/file.js'); // true +anymatch(matchers, 'path/anyjs/baz.js'); // true +anymatch(matchers, 'path/to/foo.js'); // true +anymatch(matchers, 'path/to/bar.js'); // true +anymatch(matchers, 'bar.js'); // false + +// returnIndex = true +anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 +anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 + +// any picomatc + +// using globs to match directories and their children +anymatch('node_modules', 'node_modules'); // true +anymatch('node_modules', 'node_modules/somelib/index.js'); // false +anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true +anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false +anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true + +const matcher = anymatch(matchers); +['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] +anymatch master* ❯ + +``` + +#### anymatch(matchers) +You can also pass in only your matcher(s) to get a curried function that has +already been bound to the provided matching criteria. This can be used as an +`Array#filter` callback. + +```js +var matcher = anymatch(matchers); + +matcher('path/to/file.js'); // true +matcher('path/anyjs/baz.js', true); // 1 + +['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] +``` + +Changelog +---------- +[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) + +- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. +- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). +- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) +for glob pattern matching. Issues with glob pattern matching should be +reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). + +License +------- +[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/node_modules/anymatch/index.d.ts b/node_modules/anymatch/index.d.ts new file mode 100644 index 0000000..196d061 --- /dev/null +++ b/node_modules/anymatch/index.d.ts @@ -0,0 +1,19 @@ +type AnymatchFn = (testString: string) => boolean; +type AnymatchPattern = string|RegExp|AnymatchFn; +type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] +type AnymatchTester = { + (testString: string|any[], returnIndex: true): number; + (testString: string|any[]): boolean; +} + +type PicomatchOptions = {dot: boolean}; + +declare const anymatch: { + (matchers: AnymatchMatcher): AnymatchTester; + (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; + (matchers: AnymatchMatcher, testString: string|any[]): boolean; +} + +export {AnymatchMatcher as Matcher} +export {AnymatchTester as Tester} +export default anymatch diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js new file mode 100644 index 0000000..24529c8 --- /dev/null +++ b/node_modules/anymatch/index.js @@ -0,0 +1,102 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { value: true }); + +const picomatch = require('picomatch'); +const normalizePath = require('normalize-path'); + +/** + * @typedef {(testString: string) => boolean} AnymatchFn + * @typedef {string|RegExp|AnymatchFn} AnymatchPattern + * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher + */ +const BANG = '!'; +const DEFAULT_OPTIONS = {returnIndex: false}; +const arrify = (item) => Array.isArray(item) ? item : [item]; + +/** + * @param {AnymatchPattern} matcher + * @param {object} options + * @returns {AnymatchFn} + */ +const createPattern = (matcher, options) => { + if (typeof matcher === 'function') { + return matcher; + } + if (typeof matcher === 'string') { + const glob = picomatch(matcher, options); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; +}; + +/** + * @param {Array} patterns + * @param {Array} negPatterns + * @param {String|Array} args + * @param {Boolean} returnIndex + * @returns {boolean|number} + */ +const matchPatterns = (patterns, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== 'string') { + throw new TypeError('anymatch: second argument must be a string: got ' + + Object.prototype.toString.call(_path)) + } + const path = normalizePath(_path); + + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path)) { + return returnIndex ? -1 : false; + } + } + + const applied = isList && [path].concat(args.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (isList ? pattern(...applied) : pattern(path)) { + return returnIndex ? index : true; + } + } + + return returnIndex ? -1 : false; +}; + +/** + * @param {AnymatchMatcher} matchers + * @param {Array|string} testString + * @param {object} options + * @returns {boolean|number|Function} + */ +const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError('anymatch: specify first argument'); + } + const opts = typeof options === 'boolean' ? {returnIndex: options} : options; + const returnIndex = opts.returnIndex || false; + + // Early cache for matchers. + const mtchers = arrify(matchers); + const negatedGlobs = mtchers + .filter(item => typeof item === 'string' && item.charAt(0) === BANG) + .map(item => item.slice(1)) + .map(item => picomatch(item, opts)); + const patterns = mtchers.map(matcher => createPattern(matcher, opts)); + + if (testString == null) { + return (testString, ri = false) => { + const returnIndex = typeof ri === 'boolean' ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + } + } + + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); +}; + +anymatch.default = anymatch; +module.exports = anymatch; diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json new file mode 100644 index 0000000..3dc3bbc --- /dev/null +++ b/node_modules/anymatch/package.json @@ -0,0 +1,80 @@ +{ + "_args": [ + [ + "anymatch@3.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "anymatch@3.1.1", + "_id": "anymatch@3.1.1", + "_inBundle": false, + "_integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "_location": "/anymatch", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "anymatch@3.1.1", + "name": "anymatch", + "escapedName": "anymatch", + "rawSpec": "3.1.1", + "saveSpec": null, + "fetchSpec": "3.1.1" + }, + "_requiredBy": [ + "/chokidar" + ], + "_resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "_spec": "3.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Elan Shanker", + "url": "https://github.com/es128" + }, + "bugs": { + "url": "https://github.com/micromatch/anymatch/issues" + }, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", + "devDependencies": { + "mocha": "^6.1.3", + "nyc": "^14.0.0" + }, + "engines": { + "node": ">= 8" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "homepage": "https://github.com/micromatch/anymatch", + "keywords": [ + "match", + "any", + "string", + "file", + "fs", + "list", + "glob", + "regex", + "regexp", + "regular", + "expression", + "function" + ], + "license": "ISC", + "name": "anymatch", + "repository": { + "type": "git", + "url": "git+https://github.com/micromatch/anymatch.git" + }, + "scripts": { + "mocha": "mocha", + "test": "nyc mocha" + }, + "version": "3.1.1" +} diff --git a/node_modules/aproba/LICENSE b/node_modules/aproba/LICENSE new file mode 100644 index 0000000..f4be44d --- /dev/null +++ b/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/aproba/README.md b/node_modules/aproba/README.md new file mode 100644 index 0000000..0bfc594 --- /dev/null +++ b/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/node_modules/aproba/index.js b/node_modules/aproba/index.js new file mode 100644 index 0000000..6f3f797 --- /dev/null +++ b/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +var types = { + '*': {label: 'any', check: function () { return true }}, + A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }}, + S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }}, + N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }}, + F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }}, + O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }}, + B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }}, + E: {label: 'error', check: function (thingy) { return thingy instanceof Error }}, + Z: {label: 'null', check: function (thingy) { return thingy == null }} +} + +function addSchema (schema, arity) { + var group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +var validate = module.exports = function (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + var schemas = rawSchemas.split('|') + var arity = {} + + schemas.forEach(function (schema) { + for (var ii = 0; ii < schema.length; ++ii) { + var type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + var matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (var ii = 0; ii < args.length; ++ii) { + var newMatching = matching.filter(function (schema) { + var type = schema[ii] + var typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + var labels = matching.map(function (schema) { + return types[schema[ii]].label + }).filter(function (schema) { return schema != null }) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + var valueType + Object.keys(types).forEach(function (typeCode) { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + var english = englishList(expected) + var args = expected.every(function (ex) { return ex.length === 1 }) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + var e = new Error(msg) + e.code = code + if (Error.captureStackTrace) Error.captureStackTrace(e, validate) + return e +} diff --git a/node_modules/aproba/package.json b/node_modules/aproba/package.json new file mode 100644 index 0000000..3982971 --- /dev/null +++ b/node_modules/aproba/package.json @@ -0,0 +1,65 @@ +{ + "_args": [ + [ + "aproba@1.2.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "aproba@1.2.0", + "_id": "aproba@1.2.0", + "_inBundle": false, + "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "_location": "/aproba", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "aproba@1.2.0", + "name": "aproba", + "escapedName": "aproba", + "rawSpec": "1.2.0", + "saveSpec": null, + "fetchSpec": "1.2.0" + }, + "_requiredBy": [ + "/gauge" + ], + "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "_spec": "1.2.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "dependencies": {}, + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "devDependencies": { + "standard": "^10.0.3", + "tap": "^10.0.2" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/aproba", + "keywords": [ + "argument", + "validate" + ], + "license": "ISC", + "main": "index.js", + "name": "aproba", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/aproba.git" + }, + "scripts": { + "test": "standard && tap -j3 test/*.js" + }, + "version": "1.2.0" +} diff --git a/node_modules/are-we-there-yet/CHANGES.md b/node_modules/are-we-there-yet/CHANGES.md new file mode 100644 index 0000000..21f3b1c --- /dev/null +++ b/node_modules/are-we-there-yet/CHANGES.md @@ -0,0 +1,37 @@ +Hi, figured we could actually use a changelog now: + +## 1.1.5 2018-05-24 + +* [#92](https://github.com/iarna/are-we-there-yet/pull/92) Fix bug where + `finish` would throw errors when including `TrackerStream` objects in + `TrackerGroup` collections. (@brianloveswords) + +## 1.1.4 2017-04-21 + +* Fix typo in package.json + +## 1.1.3 2017-04-21 + +* Improve documentation and limit files included in the distribution. + +## 1.1.2 2016-03-15 + +* Add tracker group cycle detection and tests for it + +## 1.1.1 2016-01-29 + +* Fix a typo in stream completion tracker + +## 1.1.0 2016-01-29 + +* Rewrote completion percent computation to be low impact– no more walking a + tree of completion groups every time we need this info. Previously, with + medium sized tree of completion groups, even a relatively modest number of + calls to the top level `completed()` method would result in absurd numbers + of calls overall as it walked down the tree. We now, instead, keep track as + we bubble up changes, so the computation is limited to when data changes and + to the depth of that one branch, instead of _every_ node. (Plus, we were already + incurring _this_ cost, since we already bubbled out changes.) +* Moved different tracker types out to their own files. +* Made tests test for TOO MANY events too. +* Standarized the source code formatting diff --git a/node_modules/are-we-there-yet/LICENSE b/node_modules/are-we-there-yet/LICENSE new file mode 100644 index 0000000..af45880 --- /dev/null +++ b/node_modules/are-we-there-yet/LICENSE @@ -0,0 +1,5 @@ +Copyright (c) 2015, Rebecca Turner + +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/are-we-there-yet/README.md b/node_modules/are-we-there-yet/README.md new file mode 100644 index 0000000..7e2b42d --- /dev/null +++ b/node_modules/are-we-there-yet/README.md @@ -0,0 +1,195 @@ +are-we-there-yet +---------------- + +Track complex hiearchies of asynchronous task completion statuses. This is +intended to give you a way of recording and reporting the progress of the big +recursive fan-out and gather type workflows that are so common in async. + +What you do with this completion data is up to you, but the most common use case is to +feed it to one of the many progress bar modules. + +Most progress bar modules include a rudamentary version of this, but my +needs were more complex. + +Usage +===== + +```javascript +var TrackerGroup = require("are-we-there-yet").TrackerGroup + +var top = new TrackerGroup("program") + +var single = top.newItem("one thing", 100) +single.completeWork(20) + +console.log(top.completed()) // 0.2 + +fs.stat("file", function(er, stat) { + if (er) throw er + var stream = top.newStream("file", stat.size) + console.log(top.completed()) // now 0.1 as single is 50% of the job and is 20% complete + // and 50% * 20% == 10% + fs.createReadStream("file").pipe(stream).on("data", function (chunk) { + // do stuff with chunk + }) + top.on("change", function (name) { + // called each time a chunk is read from "file" + // top.completed() will start at 0.1 and fill up to 0.6 as the file is read + }) +}) +``` + +Shared Methods +============== + +* var completed = tracker.completed() + +Implemented in: `Tracker`, `TrackerGroup`, `TrackerStream` + +Returns the ratio of completed work to work to be done. Range of 0 to 1. + +* tracker.finish() + +Implemented in: `Tracker`, `TrackerGroup` + +Marks the tracker as completed. With a TrackerGroup this marks all of its +components as completed. + +Marks all of the components of this tracker as finished, which in turn means +that `tracker.completed()` for this will now be 1. + +This will result in one or more `change` events being emitted. + +Events +====== + +All tracker objects emit `change` events with the following arguments: + +``` +function (name, completed, tracker) +``` + +`name` is the name of the tracker that originally emitted the event, +or if it didn't have one, the first containing tracker group that had one. + +`completed` is the percent complete (as returned by `tracker.completed()` method). + +`tracker` is the tracker object that you are listening for events on. + +TrackerGroup +============ + +* var tracker = new TrackerGroup(**name**) + + * **name** *(optional)* - The name of this tracker group, used in change + notifications if the component updating didn't have a name. Defaults to undefined. + +Creates a new empty tracker aggregation group. These are trackers whose +completion status is determined by the completion status of other trackers. + +* tracker.addUnit(**otherTracker**, **weight**) + + * **otherTracker** - Any of the other are-we-there-yet tracker objects + * **weight** *(optional)* - The weight to give the tracker, defaults to 1. + +Adds the **otherTracker** to this aggregation group. The weight determines +how long you expect this tracker to take to complete in proportion to other +units. So for instance, if you add one tracker with a weight of 1 and +another with a weight of 2, you're saying the second will take twice as long +to complete as the first. As such, the first will account for 33% of the +completion of this tracker and the second will account for the other 67%. + +Returns **otherTracker**. + +* var subGroup = tracker.newGroup(**name**, **weight**) + +The above is exactly equivalent to: + +```javascript + var subGroup = tracker.addUnit(new TrackerGroup(name), weight) +``` + +* var subItem = tracker.newItem(**name**, **todo**, **weight**) + +The above is exactly equivalent to: + +```javascript + var subItem = tracker.addUnit(new Tracker(name, todo), weight) +``` + +* var subStream = tracker.newStream(**name**, **todo**, **weight**) + +The above is exactly equivalent to: + +```javascript + var subStream = tracker.addUnit(new TrackerStream(name, todo), weight) +``` + +* console.log( tracker.debug() ) + +Returns a tree showing the completion of this tracker group and all of its +children, including recursively entering all of the children. + +Tracker +======= + +* var tracker = new Tracker(**name**, **todo**) + + * **name** *(optional)* The name of this counter to report in change + events. Defaults to undefined. + * **todo** *(optional)* The amount of work todo (a number). Defaults to 0. + +Ordinarily these are constructed as a part of a tracker group (via +`newItem`). + +* var completed = tracker.completed() + +Returns the ratio of completed work to work to be done. Range of 0 to 1. If +total work to be done is 0 then it will return 0. + +* tracker.addWork(**todo**) + + * **todo** A number to add to the amount of work to be done. + +Increases the amount of work to be done, thus decreasing the completion +percentage. Triggers a `change` event. + +* tracker.completeWork(**completed**) + + * **completed** A number to add to the work complete + +Increase the amount of work complete, thus increasing the completion percentage. +Will never increase the work completed past the amount of work todo. That is, +percentages > 100% are not allowed. Triggers a `change` event. + +* tracker.finish() + +Marks this tracker as finished, tracker.completed() will now be 1. Triggers +a `change` event. + +TrackerStream +============= + +* var tracker = new TrackerStream(**name**, **size**, **options**) + + * **name** *(optional)* The name of this counter to report in change + events. Defaults to undefined. + * **size** *(optional)* The number of bytes being sent through this stream. + * **options** *(optional)* A hash of stream options + +The tracker stream object is a pass through stream that updates an internal +tracker object each time a block passes through. It's intended to track +downloads, file extraction and other related activities. You use it by piping +your data source into it and then using it as your data source. + +If your data has a length attribute then that's used as the amount of work +completed when the chunk is passed through. If it does not (eg, object +streams) then each chunk counts as completing 1 unit of work, so your size +should be the total number of objects being streamed. + +* tracker.addWork(**todo**) + + * **todo** Increase the expected overall size by **todo** bytes. + +Increases the amount of work to be done, thus decreasing the completion +percentage. Triggers a `change` event. diff --git a/node_modules/are-we-there-yet/index.js b/node_modules/are-we-there-yet/index.js new file mode 100644 index 0000000..57d8743 --- /dev/null +++ b/node_modules/are-we-there-yet/index.js @@ -0,0 +1,4 @@ +'use strict' +exports.TrackerGroup = require('./tracker-group.js') +exports.Tracker = require('./tracker.js') +exports.TrackerStream = require('./tracker-stream.js') diff --git a/node_modules/are-we-there-yet/package.json b/node_modules/are-we-there-yet/package.json new file mode 100644 index 0000000..c667187 --- /dev/null +++ b/node_modules/are-we-there-yet/package.json @@ -0,0 +1,66 @@ +{ + "_args": [ + [ + "are-we-there-yet@1.1.5", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "are-we-there-yet@1.1.5", + "_id": "are-we-there-yet@1.1.5", + "_inBundle": false, + "_integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "_location": "/are-we-there-yet", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "are-we-there-yet@1.1.5", + "name": "are-we-there-yet", + "escapedName": "are-we-there-yet", + "rawSpec": "1.1.5", + "saveSpec": null, + "fetchSpec": "1.1.5" + }, + "_requiredBy": [ + "/npmlog" + ], + "_resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "_spec": "1.1.5", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Rebecca Turner", + "url": "http://re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/are-we-there-yet/issues" + }, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "description": "Keep track of the overall completion of many disparate processes", + "devDependencies": { + "standard": "^11.0.1", + "tap": "^12.0.1" + }, + "files": [ + "index.js", + "tracker-base.js", + "tracker-group.js", + "tracker-stream.js", + "tracker.js", + "CHANGES.md" + ], + "homepage": "https://github.com/iarna/are-we-there-yet", + "license": "ISC", + "main": "index.js", + "name": "are-we-there-yet", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/are-we-there-yet.git" + }, + "scripts": { + "test": "standard && tap test/*.js" + }, + "version": "1.1.5" +} diff --git a/node_modules/are-we-there-yet/tracker-base.js b/node_modules/are-we-there-yet/tracker-base.js new file mode 100644 index 0000000..6f43687 --- /dev/null +++ b/node_modules/are-we-there-yet/tracker-base.js @@ -0,0 +1,11 @@ +'use strict' +var EventEmitter = require('events').EventEmitter +var util = require('util') + +var trackerId = 0 +var TrackerBase = module.exports = function (name) { + EventEmitter.call(this) + this.id = ++trackerId + this.name = name +} +util.inherits(TrackerBase, EventEmitter) diff --git a/node_modules/are-we-there-yet/tracker-group.js b/node_modules/are-we-there-yet/tracker-group.js new file mode 100644 index 0000000..9759e12 --- /dev/null +++ b/node_modules/are-we-there-yet/tracker-group.js @@ -0,0 +1,107 @@ +'use strict' +var util = require('util') +var TrackerBase = require('./tracker-base.js') +var Tracker = require('./tracker.js') +var TrackerStream = require('./tracker-stream.js') + +var TrackerGroup = module.exports = function (name) { + TrackerBase.call(this, name) + this.parentGroup = null + this.trackers = [] + this.completion = {} + this.weight = {} + this.totalWeight = 0 + this.finished = false + this.bubbleChange = bubbleChange(this) +} +util.inherits(TrackerGroup, TrackerBase) + +function bubbleChange (trackerGroup) { + return function (name, completed, tracker) { + trackerGroup.completion[tracker.id] = completed + if (trackerGroup.finished) return + trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup) + } +} + +TrackerGroup.prototype.nameInTree = function () { + var names = [] + var from = this + while (from) { + names.unshift(from.name) + from = from.parentGroup + } + return names.join('/') +} + +TrackerGroup.prototype.addUnit = function (unit, weight) { + if (unit.addUnit) { + var toTest = this + while (toTest) { + if (unit === toTest) { + throw new Error( + 'Attempted to add tracker group ' + + unit.name + ' to tree that already includes it ' + + this.nameInTree(this)) + } + toTest = toTest.parentGroup + } + unit.parentGroup = this + } + this.weight[unit.id] = weight || 1 + this.totalWeight += this.weight[unit.id] + this.trackers.push(unit) + this.completion[unit.id] = unit.completed() + unit.on('change', this.bubbleChange) + if (!this.finished) this.emit('change', unit.name, this.completion[unit.id], unit) + return unit +} + +TrackerGroup.prototype.completed = function () { + if (this.trackers.length === 0) return 0 + var valPerWeight = 1 / this.totalWeight + var completed = 0 + for (var ii = 0; ii < this.trackers.length; ii++) { + var trackerId = this.trackers[ii].id + completed += valPerWeight * this.weight[trackerId] * this.completion[trackerId] + } + return completed +} + +TrackerGroup.prototype.newGroup = function (name, weight) { + return this.addUnit(new TrackerGroup(name), weight) +} + +TrackerGroup.prototype.newItem = function (name, todo, weight) { + return this.addUnit(new Tracker(name, todo), weight) +} + +TrackerGroup.prototype.newStream = function (name, todo, weight) { + return this.addUnit(new TrackerStream(name, todo), weight) +} + +TrackerGroup.prototype.finish = function () { + this.finished = true + if (!this.trackers.length) this.addUnit(new Tracker(), 1, true) + for (var ii = 0; ii < this.trackers.length; ii++) { + var tracker = this.trackers[ii] + tracker.finish() + tracker.removeListener('change', this.bubbleChange) + } + this.emit('change', this.name, 1, this) +} + +var buffer = ' ' +TrackerGroup.prototype.debug = function (depth) { + depth = depth || 0 + var indent = depth ? buffer.substr(0, depth) : '' + var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n' + this.trackers.forEach(function (tracker) { + if (tracker instanceof TrackerGroup) { + output += tracker.debug(depth + 1) + } else { + output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n' + } + }) + return output +} diff --git a/node_modules/are-we-there-yet/tracker-stream.js b/node_modules/are-we-there-yet/tracker-stream.js new file mode 100644 index 0000000..e1cf850 --- /dev/null +++ b/node_modules/are-we-there-yet/tracker-stream.js @@ -0,0 +1,36 @@ +'use strict' +var util = require('util') +var stream = require('readable-stream') +var delegate = require('delegates') +var Tracker = require('./tracker.js') + +var TrackerStream = module.exports = function (name, size, options) { + stream.Transform.call(this, options) + this.tracker = new Tracker(name, size) + this.name = name + this.id = this.tracker.id + this.tracker.on('change', delegateChange(this)) +} +util.inherits(TrackerStream, stream.Transform) + +function delegateChange (trackerStream) { + return function (name, completion, tracker) { + trackerStream.emit('change', name, completion, trackerStream) + } +} + +TrackerStream.prototype._transform = function (data, encoding, cb) { + this.tracker.completeWork(data.length ? data.length : 1) + this.push(data) + cb() +} + +TrackerStream.prototype._flush = function (cb) { + this.tracker.finish() + cb() +} + +delegate(TrackerStream.prototype, 'tracker') + .method('completed') + .method('addWork') + .method('finish') diff --git a/node_modules/are-we-there-yet/tracker.js b/node_modules/are-we-there-yet/tracker.js new file mode 100644 index 0000000..68c2339 --- /dev/null +++ b/node_modules/are-we-there-yet/tracker.js @@ -0,0 +1,30 @@ +'use strict' +var util = require('util') +var TrackerBase = require('./tracker-base.js') + +var Tracker = module.exports = function (name, todo) { + TrackerBase.call(this, name) + this.workDone = 0 + this.workTodo = todo || 0 +} +util.inherits(Tracker, TrackerBase) + +Tracker.prototype.completed = function () { + return this.workTodo === 0 ? 0 : this.workDone / this.workTodo +} + +Tracker.prototype.addWork = function (work) { + this.workTodo += work + this.emit('change', this.name, this.completed(), this) +} + +Tracker.prototype.completeWork = function (work) { + this.workDone += work + if (this.workDone > this.workTodo) this.workDone = this.workTodo + this.emit('change', this.name, this.completed(), this) +} + +Tracker.prototype.finish = function () { + this.workTodo = this.workDone = 1 + this.emit('change', this.name, 1, this) +} diff --git a/node_modules/arr-diff/LICENSE b/node_modules/arr-diff/LICENSE new file mode 100755 index 0000000..d734237 --- /dev/null +++ b/node_modules/arr-diff/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert + +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/arr-diff/README.md b/node_modules/arr-diff/README.md new file mode 100644 index 0000000..961f5c3 --- /dev/null +++ b/node_modules/arr-diff/README.md @@ -0,0 +1,130 @@ +# arr-diff [![NPM version](https://img.shields.io/npm/v/arr-diff.svg?style=flat)](https://www.npmjs.com/package/arr-diff) [![NPM monthly downloads](https://img.shields.io/npm/dm/arr-diff.svg?style=flat)](https://npmjs.org/package/arr-diff) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/arr-diff.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/arr-diff) + +> Returns an array with only the unique values from the first array, by excluding all values from additional arrays using strict equality for comparisons. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save arr-diff +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add arr-diff +``` + +Install with [bower](https://bower.io/) + +```sh +$ bower install arr-diff --save +``` + +## Usage + +Returns the difference between the first array and additional arrays. + +```js +var diff = require('arr-diff'); + +var a = ['a', 'b', 'c', 'd']; +var b = ['b', 'c']; + +console.log(diff(a, b)) +//=> ['a', 'd'] +``` + +## Benchmarks + +This library versus [array-differ](https://github.com/sindresorhus/array-differ), on April 14, 2017: + +``` +Benchmarking: (4 of 4) + · long-dupes + · long + · med + · short + +# benchmark/fixtures/long-dupes.js (100804 bytes) + arr-diff-3.0.0 x 822 ops/sec ±0.67% (86 runs sampled) + arr-diff-4.0.0 x 2,141 ops/sec ±0.42% (89 runs sampled) + array-differ x 708 ops/sec ±0.70% (89 runs sampled) + + fastest is arr-diff-4.0.0 + +# benchmark/fixtures/long.js (94529 bytes) + arr-diff-3.0.0 x 882 ops/sec ±0.60% (87 runs sampled) + arr-diff-4.0.0 x 2,329 ops/sec ±0.97% (83 runs sampled) + array-differ x 769 ops/sec ±0.61% (90 runs sampled) + + fastest is arr-diff-4.0.0 + +# benchmark/fixtures/med.js (708 bytes) + arr-diff-3.0.0 x 856,150 ops/sec ±0.42% (89 runs sampled) + arr-diff-4.0.0 x 4,665,249 ops/sec ±1.06% (89 runs sampled) + array-differ x 653,888 ops/sec ±1.02% (86 runs sampled) + + fastest is arr-diff-4.0.0 + +# benchmark/fixtures/short.js (60 bytes) + arr-diff-3.0.0 x 3,078,467 ops/sec ±0.77% (93 runs sampled) + arr-diff-4.0.0 x 9,213,296 ops/sec ±0.65% (89 runs sampled) + array-differ x 1,337,051 ops/sec ±0.91% (92 runs sampled) + + fastest is arr-diff-4.0.0 +``` + +## About + +### Related projects + +* [arr-flatten](https://www.npmjs.com/package/arr-flatten): Recursively flatten an array or arrays. This is the fastest implementation of array flatten. | [homepage](https://github.com/jonschlinkert/arr-flatten "Recursively flatten an array or arrays. This is the fastest implementation of array flatten.") +* [array-filter](https://www.npmjs.com/package/array-filter): Array#filter for older browsers. | [homepage](https://github.com/juliangruber/array-filter "Array#filter for older browsers.") +* [array-intersection](https://www.npmjs.com/package/array-intersection): Return an array with the unique values present in _all_ given arrays using strict equality… [more](https://github.com/jonschlinkert/array-intersection) | [homepage](https://github.com/jonschlinkert/array-intersection "Return an array with the unique values present in _all_ given arrays using strict equality for comparisons.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 33 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [paulmillr](https://github.com/paulmillr) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.5.0, on April 14, 2017._ \ No newline at end of file diff --git a/node_modules/arr-diff/index.js b/node_modules/arr-diff/index.js new file mode 100644 index 0000000..90f2807 --- /dev/null +++ b/node_modules/arr-diff/index.js @@ -0,0 +1,47 @@ +/*! + * arr-diff + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function diff(arr/*, arrays*/) { + var len = arguments.length; + var idx = 0; + while (++idx < len) { + arr = diffArray(arr, arguments[idx]); + } + return arr; +}; + +function diffArray(one, two) { + if (!Array.isArray(two)) { + return one.slice(); + } + + var tlen = two.length + var olen = one.length; + var idx = -1; + var arr = []; + + while (++idx < olen) { + var ele = one[idx]; + + var hasEle = false; + for (var i = 0; i < tlen; i++) { + var val = two[i]; + + if (ele === val) { + hasEle = true; + break; + } + } + + if (hasEle === false) { + arr.push(ele); + } + } + return arr; +} diff --git a/node_modules/arr-diff/package.json b/node_modules/arr-diff/package.json new file mode 100644 index 0000000..18a357c --- /dev/null +++ b/node_modules/arr-diff/package.json @@ -0,0 +1,112 @@ +{ + "_args": [ + [ + "arr-diff@4.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "arr-diff@4.0.0", + "_id": "arr-diff@4.0.0", + "_inBundle": false, + "_integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "_location": "/arr-diff", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "arr-diff@4.0.0", + "name": "arr-diff", + "escapedName": "arr-diff", + "rawSpec": "4.0.0", + "saveSpec": null, + "fetchSpec": "4.0.0" + }, + "_requiredBy": [ + "/micromatch", + "/nanomatch" + ], + "_resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "_spec": "4.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/arr-diff/issues" + }, + "contributors": [ + { + "name": "Jon Schlinkert", + "email": "jon.schlinkert@sellside.com", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Paul Miller", + "email": "paul+gh@paulmillr.com", + "url": "paulmillr.com" + } + ], + "dependencies": {}, + "description": "Returns an array with only the unique values from the first array, by excluding all values from additional arrays using strict equality for comparisons.", + "devDependencies": { + "ansi-bold": "^0.1.1", + "arr-flatten": "^1.0.1", + "array-differ": "^1.0.0", + "benchmarked": "^0.2.4", + "gulp-format-md": "^0.1.9", + "minimist": "^1.2.0", + "mocha": "^2.4.5" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/arr-diff", + "keywords": [ + "arr", + "array", + "array differ", + "array-differ", + "diff", + "differ", + "difference" + ], + "license": "MIT", + "main": "index.js", + "name": "arr-diff", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/arr-diff.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "arr-flatten", + "array-filter", + "array-intersection" + ] + }, + "reflinks": [ + "array-differ", + "verb" + ], + "lint": { + "reflinks": true + } + }, + "version": "4.0.0" +} diff --git a/node_modules/arr-flatten/LICENSE b/node_modules/arr-flatten/LICENSE new file mode 100755 index 0000000..3f2eca1 --- /dev/null +++ b/node_modules/arr-flatten/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert. + +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/arr-flatten/README.md b/node_modules/arr-flatten/README.md new file mode 100755 index 0000000..7dc7a97 --- /dev/null +++ b/node_modules/arr-flatten/README.md @@ -0,0 +1,86 @@ +# arr-flatten [![NPM version](https://img.shields.io/npm/v/arr-flatten.svg?style=flat)](https://www.npmjs.com/package/arr-flatten) [![NPM monthly downloads](https://img.shields.io/npm/dm/arr-flatten.svg?style=flat)](https://npmjs.org/package/arr-flatten) [![NPM total downloads](https://img.shields.io/npm/dt/arr-flatten.svg?style=flat)](https://npmjs.org/package/arr-flatten) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/arr-flatten.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/arr-flatten) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/arr-flatten.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/arr-flatten) + +> Recursively flatten an array or arrays. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save arr-flatten +``` + +## Install + +Install with [bower](https://bower.io/) + +```sh +$ bower install arr-flatten --save +``` + +## Usage + +```js +var flatten = require('arr-flatten'); + +flatten(['a', ['b', ['c']], 'd', ['e']]); +//=> ['a', 'b', 'c', 'd', 'e'] +``` + +## Why another flatten utility? + +I wanted the fastest implementation I could find, with implementation choices that should work for 95% of use cases, but no cruft to cover the other 5%. + +## About + +### Related projects + +* [arr-filter](https://www.npmjs.com/package/arr-filter): Faster alternative to javascript's native filter method. | [homepage](https://github.com/jonschlinkert/arr-filter "Faster alternative to javascript's native filter method.") +* [arr-union](https://www.npmjs.com/package/arr-union): Combines a list of arrays, returning a single array with unique values, using strict equality… [more](https://github.com/jonschlinkert/arr-union) | [homepage](https://github.com/jonschlinkert/arr-union "Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons.") +* [array-each](https://www.npmjs.com/package/array-each): Loop over each item in an array and call the given function on every element. | [homepage](https://github.com/jonschlinkert/array-each "Loop over each item in an array and call the given function on every element.") +* [array-unique](https://www.npmjs.com/package/array-unique): Remove duplicate values from an array. Fastest ES5 implementation. | [homepage](https://github.com/jonschlinkert/array-unique "Remove duplicate values from an array. Fastest ES5 implementation.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 20 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [lukeed](https://github.com/lukeed) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 05, 2017._ \ No newline at end of file diff --git a/node_modules/arr-flatten/index.js b/node_modules/arr-flatten/index.js new file mode 100644 index 0000000..0cb4ea4 --- /dev/null +++ b/node_modules/arr-flatten/index.js @@ -0,0 +1,22 @@ +/*! + * arr-flatten + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function (arr) { + return flat(arr, []); +}; + +function flat(arr, res) { + var i = 0, cur; + var len = arr.length; + for (; i < len; i++) { + cur = arr[i]; + Array.isArray(cur) ? flat(cur, res) : res.push(cur); + } + return res; +} diff --git a/node_modules/arr-flatten/package.json b/node_modules/arr-flatten/package.json new file mode 100644 index 0000000..48591f9 --- /dev/null +++ b/node_modules/arr-flatten/package.json @@ -0,0 +1,116 @@ +{ + "_args": [ + [ + "arr-flatten@1.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "arr-flatten@1.1.0", + "_id": "arr-flatten@1.1.0", + "_inBundle": false, + "_integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "_location": "/arr-flatten", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "arr-flatten@1.1.0", + "name": "arr-flatten", + "escapedName": "arr-flatten", + "rawSpec": "1.1.0", + "saveSpec": null, + "fetchSpec": "1.1.0" + }, + "_requiredBy": [ + "/braces" + ], + "_resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "_spec": "1.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/arr-flatten/issues" + }, + "contributors": [ + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Luke Edwards", + "url": "https://lukeed.com" + } + ], + "description": "Recursively flatten an array or arrays.", + "devDependencies": { + "ansi-bold": "^0.1.1", + "array-flatten": "^2.1.1", + "array-slice": "^1.0.0", + "benchmarked": "^1.0.0", + "compute-flatten": "^1.0.0", + "flatit": "^1.1.1", + "flatten": "^1.0.2", + "flatten-array": "^1.0.0", + "glob": "^7.1.1", + "gulp-format-md": "^0.1.12", + "just-flatten-it": "^1.1.23", + "lodash.flattendeep": "^4.4.0", + "m_flattened": "^1.0.1", + "mocha": "^3.2.0", + "utils-flatten": "^1.0.0", + "write": "^0.3.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/arr-flatten", + "keywords": [ + "arr", + "array", + "elements", + "flat", + "flatten", + "nested", + "recurse", + "recursive", + "recursively" + ], + "license": "MIT", + "main": "index.js", + "name": "arr-flatten", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/arr-flatten.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "arr-filter", + "arr-union", + "array-each", + "array-unique" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "1.1.0" +} diff --git a/node_modules/arr-union/LICENSE b/node_modules/arr-union/LICENSE new file mode 100644 index 0000000..39245ac --- /dev/null +++ b/node_modules/arr-union/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +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/arr-union/README.md b/node_modules/arr-union/README.md new file mode 100644 index 0000000..b3cd4f4 --- /dev/null +++ b/node_modules/arr-union/README.md @@ -0,0 +1,99 @@ +# arr-union [![NPM version](https://img.shields.io/npm/v/arr-union.svg)](https://www.npmjs.com/package/arr-union) [![Build Status](https://img.shields.io/travis/jonschlinkert/arr-union.svg)](https://travis-ci.org/jonschlinkert/arr-union) + +> Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm i arr-union --save +``` + +## Benchmarks + +This library is **10-20 times faster** and more performant than [array-union](https://github.com/sindresorhus/array-union). + +See the [benchmarks](./benchmark). + +```sh +#1: five-arrays + array-union x 511,121 ops/sec ±0.80% (96 runs sampled) + arr-union x 5,716,039 ops/sec ±0.86% (93 runs sampled) + +#2: ten-arrays + array-union x 245,196 ops/sec ±0.69% (94 runs sampled) + arr-union x 1,850,786 ops/sec ±0.84% (97 runs sampled) + +#3: two-arrays + array-union x 563,869 ops/sec ±0.97% (94 runs sampled) + arr-union x 9,602,852 ops/sec ±0.87% (92 runs sampled) +``` + +## Usage + +```js +var union = require('arr-union'); + +union(['a'], ['b', 'c'], ['d', 'e', 'f']); +//=> ['a', 'b', 'c', 'd', 'e', 'f'] +``` + +Returns only unique elements: + +```js +union(['a', 'a'], ['b', 'c']); +//=> ['a', 'b', 'c'] +``` + +## Related projects + +* [arr-diff](https://www.npmjs.com/package/arr-diff): Returns an array with only the unique values from the first array, by excluding all… [more](https://www.npmjs.com/package/arr-diff) | [homepage](https://github.com/jonschlinkert/arr-diff) +* [arr-filter](https://www.npmjs.com/package/arr-filter): Faster alternative to javascript's native filter method. | [homepage](https://github.com/jonschlinkert/arr-filter) +* [arr-flatten](https://www.npmjs.com/package/arr-flatten): Recursively flatten an array or arrays. This is the fastest implementation of array flatten. | [homepage](https://github.com/jonschlinkert/arr-flatten) +* [arr-map](https://www.npmjs.com/package/arr-map): Faster, node.js focused alternative to JavaScript's native array map. | [homepage](https://github.com/jonschlinkert/arr-map) +* [arr-pluck](https://www.npmjs.com/package/arr-pluck): Retrieves the value of a specified property from all elements in the collection. | [homepage](https://github.com/jonschlinkert/arr-pluck) +* [arr-reduce](https://www.npmjs.com/package/arr-reduce): Fast array reduce that also loops over sparse elements. | [homepage](https://github.com/jonschlinkert/arr-reduce) +* [array-unique](https://www.npmjs.com/package/array-unique): Return an array free of duplicate values. Fastest ES5 implementation. | [homepage](https://github.com/jonschlinkert/array-unique) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/arr-union/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm i verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016 [Jon Schlinkert](https://github.com/jonschlinkert) +Released under the [MIT license](https://github.com/jonschlinkert/arr-union/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on February 23, 2016._ \ No newline at end of file diff --git a/node_modules/arr-union/index.js b/node_modules/arr-union/index.js new file mode 100644 index 0000000..5ae6c4a --- /dev/null +++ b/node_modules/arr-union/index.js @@ -0,0 +1,29 @@ +'use strict'; + +module.exports = function union(init) { + if (!Array.isArray(init)) { + throw new TypeError('arr-union expects the first argument to be an array.'); + } + + var len = arguments.length; + var i = 0; + + while (++i < len) { + var arg = arguments[i]; + if (!arg) continue; + + if (!Array.isArray(arg)) { + arg = [arg]; + } + + for (var j = 0; j < arg.length; j++) { + var ele = arg[j]; + + if (init.indexOf(ele) >= 0) { + continue; + } + init.push(ele); + } + } + return init; +}; diff --git a/node_modules/arr-union/package.json b/node_modules/arr-union/package.json new file mode 100644 index 0000000..abe6c8d --- /dev/null +++ b/node_modules/arr-union/package.json @@ -0,0 +1,111 @@ +{ + "_args": [ + [ + "arr-union@3.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "arr-union@3.1.0", + "_id": "arr-union@3.1.0", + "_inBundle": false, + "_integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "_location": "/arr-union", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "arr-union@3.1.0", + "name": "arr-union", + "escapedName": "arr-union", + "rawSpec": "3.1.0", + "saveSpec": null, + "fetchSpec": "3.1.0" + }, + "_requiredBy": [ + "/class-utils", + "/union-value" + ], + "_resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "_spec": "3.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/arr-union/issues" + }, + "description": "Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons.", + "devDependencies": { + "ansi-bold": "^0.1.1", + "array-union": "^1.0.1", + "array-unique": "^0.2.1", + "benchmarked": "^0.1.4", + "gulp-format-md": "^0.1.7", + "minimist": "^1.1.1", + "mocha": "*", + "should": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/arr-union", + "keywords": [ + "add", + "append", + "array", + "arrays", + "combine", + "concat", + "extend", + "union", + "uniq", + "unique", + "util", + "utility", + "utils" + ], + "license": "MIT", + "main": "index.js", + "name": "arr-union", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/arr-union.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "arr-diff", + "arr-flatten", + "arr-filter", + "arr-map", + "arr-pluck", + "arr-reduce", + "array-unique" + ] + }, + "reflinks": [ + "verb", + "array-union" + ], + "lint": { + "reflinks": true + } + }, + "version": "3.1.0" +} diff --git a/node_modules/array-each/LICENSE b/node_modules/array-each/LICENSE new file mode 100644 index 0000000..ec85897 --- /dev/null +++ b/node_modules/array-each/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +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/array-each/README.md b/node_modules/array-each/README.md new file mode 100644 index 0000000..e8602a1 --- /dev/null +++ b/node_modules/array-each/README.md @@ -0,0 +1,84 @@ +# array-each [![NPM version](https://img.shields.io/npm/v/array-each.svg?style=flat)](https://www.npmjs.com/package/array-each) [![NPM monthly downloads](https://img.shields.io/npm/dm/array-each.svg?style=flat)](https://npmjs.org/package/array-each) [![NPM total downloads](https://img.shields.io/npm/dt/array-each.svg?style=flat)](https://npmjs.org/package/array-each) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/array-each.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/array-each) + +> Loop over each item in an array and call the given function on every element. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save array-each +``` + +## Usage + +### [each](index.js#L34) + +Loop over each item in an array and call the given function on every element. + +**Params** + +* `array` **{Array}** +* `fn` **{Function}** +* `thisArg` **{Object}**: (optional) pass a `thisArg` to be used as the context in which to call the function. +* `returns` **{undefined}** + +**Example** + +```js +each(['a', 'b', 'c'], function(ele) { + return ele + ele; +}); +//=> ['aa', 'bb', 'cc'] + +each(['a', 'b', 'c'], function(ele, i) { + return i + ele; +}); +//=> ['0a', '1b', '2c'] +``` + +## About + +### Related projects + +* [arr-filter](https://www.npmjs.com/package/arr-filter): Faster alternative to javascript's native filter method. | [homepage](https://github.com/jonschlinkert/arr-filter "Faster alternative to javascript's native filter method.") +* [arr-map](https://www.npmjs.com/package/arr-map): Faster, node.js focused alternative to JavaScript's native array map. | [homepage](https://github.com/jonschlinkert/arr-map "Faster, node.js focused alternative to JavaScript's native array map.") +* [collection-map](https://www.npmjs.com/package/collection-map): Returns an array of mapped values from an array or object. | [homepage](https://github.com/jonschlinkert/collection-map "Returns an array of mapped values from an array or object.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.2, on February 26, 2017._ \ No newline at end of file diff --git a/node_modules/array-each/index.js b/node_modules/array-each/index.js new file mode 100644 index 0000000..12afef4 --- /dev/null +++ b/node_modules/array-each/index.js @@ -0,0 +1,46 @@ +/*! + * array-each + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +/** + * Loop over each item in an array and call the given function on every element. + * + * ```js + * each(['a', 'b', 'c'], function(ele) { + * return ele + ele; + * }); + * //=> ['aa', 'bb', 'cc'] + * + * each(['a', 'b', 'c'], function(ele, i) { + * return i + ele; + * }); + * //=> ['0a', '1b', '2c'] + * ``` + * + * @name each + * @alias forEach + * @param {Array} `array` + * @param {Function} `fn` + * @param {Object} `thisArg` (optional) pass a `thisArg` to be used as the context in which to call the function. + * @return {undefined} + * @api public + */ + +module.exports = function each(arr, cb, thisArg) { + if (arr == null) return; + + var len = arr.length; + var idx = -1; + + while (++idx < len) { + var ele = arr[idx]; + if (cb.call(thisArg, ele, idx, arr) === false) { + break; + } + } +}; diff --git a/node_modules/array-each/package.json b/node_modules/array-each/package.json new file mode 100644 index 0000000..caed4be --- /dev/null +++ b/node_modules/array-each/package.json @@ -0,0 +1,84 @@ +{ + "_args": [ + [ + "array-each@1.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "array-each@1.0.1", + "_id": "array-each@1.0.1", + "_inBundle": false, + "_integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "_location": "/array-each", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "array-each@1.0.1", + "name": "array-each", + "escapedName": "array-each", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/object.defaults" + ], + "_resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "_spec": "1.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/array-each/issues" + }, + "description": "Loop over each item in an array and call the given function on every element.", + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/array-each", + "keywords": [ + "array", + "each" + ], + "license": "MIT", + "main": "index.js", + "name": "array-each", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/array-each.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "collection-map", + "arr-filter", + "arr-map" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "1.0.1" +} diff --git a/node_modules/array-flatten/LICENSE b/node_modules/array-flatten/LICENSE new file mode 100644 index 0000000..983fbe8 --- /dev/null +++ b/node_modules/array-flatten/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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/array-flatten/README.md b/node_modules/array-flatten/README.md new file mode 100644 index 0000000..91fa5b6 --- /dev/null +++ b/node_modules/array-flatten/README.md @@ -0,0 +1,43 @@ +# Array Flatten + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. + +## Installation + +``` +npm install array-flatten --save +``` + +## Usage + +```javascript +var flatten = require('array-flatten') + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) +//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) +//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] + +(function () { + flatten(arguments) //=> [1, 2, 3] +})(1, [2, 3]) +``` + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat +[npm-url]: https://npmjs.org/package/array-flatten +[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat +[downloads-url]: https://npmjs.org/package/array-flatten +[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat +[travis-url]: https://travis-ci.org/blakeembrey/array-flatten +[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat +[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/node_modules/array-flatten/array-flatten.js b/node_modules/array-flatten/array-flatten.js new file mode 100644 index 0000000..089117b --- /dev/null +++ b/node_modules/array-flatten/array-flatten.js @@ -0,0 +1,64 @@ +'use strict' + +/** + * Expose `arrayFlatten`. + */ +module.exports = arrayFlatten + +/** + * Recursive flatten function with depth. + * + * @param {Array} array + * @param {Array} result + * @param {Number} depth + * @return {Array} + */ +function flattenWithDepth (array, result, depth) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (depth > 0 && Array.isArray(value)) { + flattenWithDepth(value, result, depth - 1) + } else { + result.push(value) + } + } + + return result +} + +/** + * Recursive flatten function. Omitting depth is slightly faster. + * + * @param {Array} array + * @param {Array} result + * @return {Array} + */ +function flattenForever (array, result) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (Array.isArray(value)) { + flattenForever(value, result) + } else { + result.push(value) + } + } + + return result +} + +/** + * Flatten an array, with the ability to define a depth. + * + * @param {Array} array + * @param {Number} depth + * @return {Array} + */ +function arrayFlatten (array, depth) { + if (depth == null) { + return flattenForever(array, []) + } + + return flattenWithDepth(array, [], depth) +} diff --git a/node_modules/array-flatten/package.json b/node_modules/array-flatten/package.json new file mode 100644 index 0000000..6481173 --- /dev/null +++ b/node_modules/array-flatten/package.json @@ -0,0 +1,67 @@ +{ + "_args": [ + [ + "array-flatten@1.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "array-flatten@1.1.1", + "_id": "array-flatten@1.1.1", + "_inBundle": false, + "_integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "_location": "/array-flatten", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "array-flatten@1.1.1", + "name": "array-flatten", + "escapedName": "array-flatten", + "rawSpec": "1.1.1", + "saveSpec": null, + "fetchSpec": "1.1.1" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "_spec": "1.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "bugs": { + "url": "https://github.com/blakeembrey/array-flatten/issues" + }, + "description": "Flatten an array of nested arrays into a single flat array", + "devDependencies": { + "istanbul": "^0.3.13", + "mocha": "^2.2.4", + "pre-commit": "^1.0.7", + "standard": "^3.7.3" + }, + "files": [ + "array-flatten.js", + "LICENSE" + ], + "homepage": "https://github.com/blakeembrey/array-flatten", + "keywords": [ + "array", + "flatten", + "arguments", + "depth" + ], + "license": "MIT", + "main": "array-flatten.js", + "name": "array-flatten", + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/array-flatten.git" + }, + "scripts": { + "test": "istanbul cover _mocha -- -R spec" + }, + "version": "1.1.1" +} diff --git a/node_modules/array-slice/LICENSE b/node_modules/array-slice/LICENSE new file mode 100755 index 0000000..3f2eca1 --- /dev/null +++ b/node_modules/array-slice/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert. + +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/array-slice/README.md b/node_modules/array-slice/README.md new file mode 100755 index 0000000..e175ca0 --- /dev/null +++ b/node_modules/array-slice/README.md @@ -0,0 +1,82 @@ +# array-slice [![NPM version](https://img.shields.io/npm/v/array-slice.svg?style=flat)](https://www.npmjs.com/package/array-slice) [![NPM monthly downloads](https://img.shields.io/npm/dm/array-slice.svg?style=flat)](https://npmjs.org/package/array-slice) [![NPM total downloads](https://img.shields.io/npm/dt/array-slice.svg?style=flat)](https://npmjs.org/package/array-slice) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/array-slice.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/array-slice) + +> Array-slice method. Slices `array` from the `start` index up to, but not including, the `end` index. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save array-slice +``` + +This function is used instead of `Array#slice` to support node lists in IE < 9 and to ensure dense arrays are returned. This is also faster than native slice in some cases. + +## Usage + +```js +var slice = require('array-slice'); +var arr = ['a', 'b', 'd', 'e', 'f', 'g', 'h', 'i', 'j']; + +slice(arr, 3, 6); +//=> ['e', 'f', 'g'] +``` + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Related projects + +You might also be interested in these projects: + +* [arr-flatten](https://www.npmjs.com/package/arr-flatten): Recursively flatten an array or arrays. | [homepage](https://github.com/jonschlinkert/arr-flatten "Recursively flatten an array or arrays.") +* [array-unique](https://www.npmjs.com/package/array-unique): Remove duplicate values from an array. Fastest ES5 implementation. | [homepage](https://github.com/jonschlinkert/array-unique "Remove duplicate values from an array. Fastest ES5 implementation.") +* [array-xor](https://www.npmjs.com/package/array-xor): Returns the symmetric difference (exclusive-or) of an array of elements (elements that are present in… [more](https://github.com/jonschlinkert/array-xor) | [homepage](https://github.com/jonschlinkert/array-xor "Returns the symmetric difference (exclusive-or) of an array of elements (elements that are present in all given arrays and not in their intersections).") + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 30, 2017._ \ No newline at end of file diff --git a/node_modules/array-slice/index.js b/node_modules/array-slice/index.js new file mode 100644 index 0000000..15cdb77 --- /dev/null +++ b/node_modules/array-slice/index.js @@ -0,0 +1,33 @@ +/*! + * array-slice + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function slice(arr, start, end) { + var len = arr.length; + var range = []; + + start = idx(len, start); + end = idx(len, end, len); + + while (start < end) { + range.push(arr[start++]); + } + return range; +}; + +function idx(len, pos, end) { + if (pos == null) { + pos = end || 0; + } else if (pos < 0) { + pos = Math.max(len + pos, 0); + } else { + pos = Math.min(pos, len); + } + + return pos; +} diff --git a/node_modules/array-slice/package.json b/node_modules/array-slice/package.json new file mode 100644 index 0000000..31f2032 --- /dev/null +++ b/node_modules/array-slice/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "array-slice@1.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "array-slice@1.1.0", + "_id": "array-slice@1.1.0", + "_inBundle": false, + "_integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "_location": "/array-slice", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "array-slice@1.1.0", + "name": "array-slice", + "escapedName": "array-slice", + "rawSpec": "1.1.0", + "saveSpec": null, + "fetchSpec": "1.1.0" + }, + "_requiredBy": [ + "/object.defaults" + ], + "_resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "_spec": "1.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/array-slice/issues" + }, + "description": "Array-slice method. Slices `array` from the `start` index up to, but not including, the `end` index.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/array-slice", + "keywords": [ + "array", + "javascript", + "js", + "slice", + "util", + "utils" + ], + "license": "MIT", + "main": "index.js", + "name": "array-slice", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/array-slice.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "arr-flatten", + "array-unique", + "array-xor" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "1.1.0" +} diff --git a/node_modules/array-unique/LICENSE b/node_modules/array-unique/LICENSE new file mode 100755 index 0000000..842218c --- /dev/null +++ b/node_modules/array-unique/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert + +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/array-unique/README.md b/node_modules/array-unique/README.md new file mode 100755 index 0000000..41c8c90 --- /dev/null +++ b/node_modules/array-unique/README.md @@ -0,0 +1,77 @@ +# array-unique [![NPM version](https://img.shields.io/npm/v/array-unique.svg?style=flat)](https://www.npmjs.com/package/array-unique) [![NPM downloads](https://img.shields.io/npm/dm/array-unique.svg?style=flat)](https://npmjs.org/package/array-unique) [![Build Status](https://img.shields.io/travis/jonschlinkert/array-unique.svg?style=flat)](https://travis-ci.org/jonschlinkert/array-unique) + +Remove duplicate values from an array. Fastest ES5 implementation. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save array-unique +``` + +## Usage + +```js +var unique = require('array-unique'); + +var arr = ['a', 'b', 'c', 'c']; +console.log(unique(arr)) //=> ['a', 'b', 'c'] +console.log(arr) //=> ['a', 'b', 'c'] + +/* The above modifies the input array. To prevent that at a slight performance cost: */ +var unique = require("array-unique").immutable; + +var arr = ['a', 'b', 'c', 'c']; +console.log(unique(arr)) //=> ['a', 'b', 'c'] +console.log(arr) //=> ['a', 'b', 'c', 'c'] +``` + +## About + +### Related projects + +* [arr-diff](https://www.npmjs.com/package/arr-diff): Returns an array with only the unique values from the first array, by excluding all… [more](https://github.com/jonschlinkert/arr-diff) | [homepage](https://github.com/jonschlinkert/arr-diff "Returns an array with only the unique values from the first array, by excluding all values from additional arrays using strict equality for comparisons.") +* [arr-flatten](https://www.npmjs.com/package/arr-flatten): Recursively flatten an array or arrays. This is the fastest implementation of array flatten. | [homepage](https://github.com/jonschlinkert/arr-flatten "Recursively flatten an array or arrays. This is the fastest implementation of array flatten.") +* [arr-map](https://www.npmjs.com/package/arr-map): Faster, node.js focused alternative to JavaScript's native array map. | [homepage](https://github.com/jonschlinkert/arr-map "Faster, node.js focused alternative to JavaScript's native array map.") +* [arr-pluck](https://www.npmjs.com/package/arr-pluck): Retrieves the value of a specified property from all elements in the collection. | [homepage](https://github.com/jonschlinkert/arr-pluck "Retrieves the value of a specified property from all elements in the collection.") +* [arr-reduce](https://www.npmjs.com/package/arr-reduce): Fast array reduce that also loops over sparse elements. | [homepage](https://github.com/jonschlinkert/arr-reduce "Fast array reduce that also loops over sparse elements.") +* [arr-union](https://www.npmjs.com/package/arr-union): Combines a list of arrays, returning a single array with unique values, using strict equality… [more](https://github.com/jonschlinkert/arr-union) | [homepage](https://github.com/jonschlinkert/arr-union "Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/array-unique/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.28, on July 31, 2016._ \ No newline at end of file diff --git a/node_modules/array-unique/index.js b/node_modules/array-unique/index.js new file mode 100644 index 0000000..7e481e0 --- /dev/null +++ b/node_modules/array-unique/index.js @@ -0,0 +1,43 @@ +/*! + * array-unique + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +module.exports = function unique(arr) { + if (!Array.isArray(arr)) { + throw new TypeError('array-unique expects an array.'); + } + + var len = arr.length; + var i = -1; + + while (i++ < len) { + var j = i + 1; + + for (; j < arr.length; ++j) { + if (arr[i] === arr[j]) { + arr.splice(j--, 1); + } + } + } + return arr; +}; + +module.exports.immutable = function uniqueImmutable(arr) { + if (!Array.isArray(arr)) { + throw new TypeError('array-unique expects an array.'); + } + + var arrLen = arr.length; + var newArr = new Array(arrLen); + + for (var i = 0; i < arrLen; i++) { + newArr[i] = arr[i]; + } + + return module.exports(newArr); +}; diff --git a/node_modules/array-unique/package.json b/node_modules/array-unique/package.json new file mode 100644 index 0000000..58a6ecd --- /dev/null +++ b/node_modules/array-unique/package.json @@ -0,0 +1,99 @@ +{ + "_args": [ + [ + "array-unique@0.3.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "array-unique@0.3.2", + "_id": "array-unique@0.3.2", + "_inBundle": false, + "_integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "_location": "/array-unique", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "array-unique@0.3.2", + "name": "array-unique", + "escapedName": "array-unique", + "rawSpec": "0.3.2", + "saveSpec": null, + "fetchSpec": "0.3.2" + }, + "_requiredBy": [ + "/braces", + "/extglob", + "/micromatch", + "/nanomatch" + ], + "_resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "_spec": "0.3.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/array-unique/issues" + }, + "description": "Remove duplicate values from an array. Fastest ES5 implementation.", + "devDependencies": { + "array-uniq": "^1.0.2", + "benchmarked": "^0.1.3", + "gulp-format-md": "^0.1.9", + "mocha": "^2.5.3", + "should": "^10.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js", + "LICENSE", + "README.md" + ], + "homepage": "https://github.com/jonschlinkert/array-unique", + "keywords": [ + "array", + "unique" + ], + "license": "MIT", + "main": "index.js", + "name": "array-unique", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/array-unique.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "arr-diff", + "arr-union", + "arr-flatten", + "arr-reduce", + "arr-map", + "arr-pluck" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + }, + "version": "0.3.2" +} diff --git a/node_modules/asn1/LICENSE b/node_modules/asn1/LICENSE new file mode 100644 index 0000000..9b5dcdb --- /dev/null +++ b/node_modules/asn1/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Mark Cavage, 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/asn1/README.md b/node_modules/asn1/README.md new file mode 100644 index 0000000..2208210 --- /dev/null +++ b/node_modules/asn1/README.md @@ -0,0 +1,50 @@ +node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS. +Currently BER encoding is supported; at some point I'll likely have to do DER. + +## Usage + +Mostly, if you're *actually* needing to read and write ASN.1, you probably don't +need this readme to explain what and why. If you have no idea what ASN.1 is, +see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc + +The source is pretty much self-explanatory, and has read/write methods for the +common types out there. + +### Decoding + +The following reads an ASN.1 sequence with a boolean. + + var Ber = require('asn1').Ber; + + var reader = new Ber.Reader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff])); + + reader.readSequence(); + console.log('Sequence len: ' + reader.length); + if (reader.peek() === Ber.Boolean) + console.log(reader.readBoolean()); + +### Encoding + +The following generates the same payload as above. + + var Ber = require('asn1').Ber; + + var writer = new Ber.Writer(); + + writer.startSequence(); + writer.writeBoolean(true); + writer.endSequence(); + + console.log(writer.buffer); + +## Installation + + npm install asn1 + +## License + +MIT. + +## Bugs + +See . diff --git a/node_modules/asn1/lib/ber/errors.js b/node_modules/asn1/lib/ber/errors.js new file mode 100644 index 0000000..4557b8a --- /dev/null +++ b/node_modules/asn1/lib/ber/errors.js @@ -0,0 +1,13 @@ +// Copyright 2011 Mark Cavage All rights reserved. + + +module.exports = { + + newInvalidAsn1Error: function (msg) { + var e = new Error(); + e.name = 'InvalidAsn1Error'; + e.message = msg || ''; + return e; + } + +}; diff --git a/node_modules/asn1/lib/ber/index.js b/node_modules/asn1/lib/ber/index.js new file mode 100644 index 0000000..387d132 --- /dev/null +++ b/node_modules/asn1/lib/ber/index.js @@ -0,0 +1,27 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var errors = require('./errors'); +var types = require('./types'); + +var Reader = require('./reader'); +var Writer = require('./writer'); + + +// --- Exports + +module.exports = { + + Reader: Reader, + + Writer: Writer + +}; + +for (var t in types) { + if (types.hasOwnProperty(t)) + module.exports[t] = types[t]; +} +for (var e in errors) { + if (errors.hasOwnProperty(e)) + module.exports[e] = errors[e]; +} diff --git a/node_modules/asn1/lib/ber/reader.js b/node_modules/asn1/lib/ber/reader.js new file mode 100644 index 0000000..8a7e4ca --- /dev/null +++ b/node_modules/asn1/lib/ber/reader.js @@ -0,0 +1,262 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; + +var ASN1 = require('./types'); +var errors = require('./errors'); + + +// --- Globals + +var newInvalidAsn1Error = errors.newInvalidAsn1Error; + + + +// --- API + +function Reader(data) { + if (!data || !Buffer.isBuffer(data)) + throw new TypeError('data must be a node Buffer'); + + this._buf = data; + this._size = data.length; + + // These hold the "current" state + this._len = 0; + this._offset = 0; +} + +Object.defineProperty(Reader.prototype, 'length', { + enumerable: true, + get: function () { return (this._len); } +}); + +Object.defineProperty(Reader.prototype, 'offset', { + enumerable: true, + get: function () { return (this._offset); } +}); + +Object.defineProperty(Reader.prototype, 'remain', { + get: function () { return (this._size - this._offset); } +}); + +Object.defineProperty(Reader.prototype, 'buffer', { + get: function () { return (this._buf.slice(this._offset)); } +}); + + +/** + * Reads a single byte and advances offset; you can pass in `true` to make this + * a "peek" operation (i.e., get the byte, but don't advance the offset). + * + * @param {Boolean} peek true means don't move offset. + * @return {Number} the next byte, null if not enough data. + */ +Reader.prototype.readByte = function (peek) { + if (this._size - this._offset < 1) + return null; + + var b = this._buf[this._offset] & 0xff; + + if (!peek) + this._offset += 1; + + return b; +}; + + +Reader.prototype.peek = function () { + return this.readByte(true); +}; + + +/** + * Reads a (potentially) variable length off the BER buffer. This call is + * not really meant to be called directly, as callers have to manipulate + * the internal buffer afterwards. + * + * As a result of this call, you can call `Reader.length`, until the + * next thing called that does a readLength. + * + * @return {Number} the amount of offset to advance the buffer. + * @throws {InvalidAsn1Error} on bad ASN.1 + */ +Reader.prototype.readLength = function (offset) { + if (offset === undefined) + offset = this._offset; + + if (offset >= this._size) + return null; + + var lenB = this._buf[offset++] & 0xff; + if (lenB === null) + return null; + + if ((lenB & 0x80) === 0x80) { + lenB &= 0x7f; + + if (lenB === 0) + throw newInvalidAsn1Error('Indefinite length not supported'); + + if (lenB > 4) + throw newInvalidAsn1Error('encoding too long'); + + if (this._size - offset < lenB) + return null; + + this._len = 0; + for (var i = 0; i < lenB; i++) + this._len = (this._len << 8) + (this._buf[offset++] & 0xff); + + } else { + // Wasn't a variable length + this._len = lenB; + } + + return offset; +}; + + +/** + * Parses the next sequence in this BER buffer. + * + * To get the length of the sequence, call `Reader.length`. + * + * @return {Number} the sequence's tag. + */ +Reader.prototype.readSequence = function (tag) { + var seq = this.peek(); + if (seq === null) + return null; + if (tag !== undefined && tag !== seq) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + seq.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + if (o === null) + return null; + + this._offset = o; + return seq; +}; + + +Reader.prototype.readInt = function () { + return this._readTag(ASN1.Integer); +}; + + +Reader.prototype.readBoolean = function () { + return (this._readTag(ASN1.Boolean) === 0 ? false : true); +}; + + +Reader.prototype.readEnumeration = function () { + return this._readTag(ASN1.Enumeration); +}; + + +Reader.prototype.readString = function (tag, retbuf) { + if (!tag) + tag = ASN1.OctetString; + + var b = this.peek(); + if (b === null) + return null; + + if (b !== tag) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + b.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + + if (o === null) + return null; + + if (this.length > this._size - o) + return null; + + this._offset = o; + + if (this.length === 0) + return retbuf ? Buffer.alloc(0) : ''; + + var str = this._buf.slice(this._offset, this._offset + this.length); + this._offset += this.length; + + return retbuf ? str : str.toString('utf8'); +}; + +Reader.prototype.readOID = function (tag) { + if (!tag) + tag = ASN1.OID; + + var b = this.readString(tag, true); + if (b === null) + return null; + + var values = []; + var value = 0; + + for (var i = 0; i < b.length; i++) { + var byte = b[i] & 0xff; + + value <<= 7; + value += byte & 0x7f; + if ((byte & 0x80) === 0) { + values.push(value); + value = 0; + } + } + + value = values.shift(); + values.unshift(value % 40); + values.unshift((value / 40) >> 0); + + return values.join('.'); +}; + + +Reader.prototype._readTag = function (tag) { + assert.ok(tag !== undefined); + + var b = this.peek(); + + if (b === null) + return null; + + if (b !== tag) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + b.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + if (o === null) + return null; + + if (this.length > 4) + throw newInvalidAsn1Error('Integer too long: ' + this.length); + + if (this.length > this._size - o) + return null; + this._offset = o; + + var fb = this._buf[this._offset]; + var value = 0; + + for (var i = 0; i < this.length; i++) { + value <<= 8; + value |= (this._buf[this._offset++] & 0xff); + } + + if ((fb & 0x80) === 0x80 && i !== 4) + value -= (1 << (i * 8)); + + return value >> 0; +}; + + + +// --- Exported API + +module.exports = Reader; diff --git a/node_modules/asn1/lib/ber/types.js b/node_modules/asn1/lib/ber/types.js new file mode 100644 index 0000000..8aea000 --- /dev/null +++ b/node_modules/asn1/lib/ber/types.js @@ -0,0 +1,36 @@ +// Copyright 2011 Mark Cavage All rights reserved. + + +module.exports = { + EOC: 0, + Boolean: 1, + Integer: 2, + BitString: 3, + OctetString: 4, + Null: 5, + OID: 6, + ObjectDescriptor: 7, + External: 8, + Real: 9, // float + Enumeration: 10, + PDV: 11, + Utf8String: 12, + RelativeOID: 13, + Sequence: 16, + Set: 17, + NumericString: 18, + PrintableString: 19, + T61String: 20, + VideotexString: 21, + IA5String: 22, + UTCTime: 23, + GeneralizedTime: 24, + GraphicString: 25, + VisibleString: 26, + GeneralString: 28, + UniversalString: 29, + CharacterString: 30, + BMPString: 31, + Constructor: 32, + Context: 128 +}; diff --git a/node_modules/asn1/lib/ber/writer.js b/node_modules/asn1/lib/ber/writer.js new file mode 100644 index 0000000..3515acf --- /dev/null +++ b/node_modules/asn1/lib/ber/writer.js @@ -0,0 +1,317 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; +var ASN1 = require('./types'); +var errors = require('./errors'); + + +// --- Globals + +var newInvalidAsn1Error = errors.newInvalidAsn1Error; + +var DEFAULT_OPTS = { + size: 1024, + growthFactor: 8 +}; + + +// --- Helpers + +function merge(from, to) { + assert.ok(from); + assert.equal(typeof (from), 'object'); + assert.ok(to); + assert.equal(typeof (to), 'object'); + + var keys = Object.getOwnPropertyNames(from); + keys.forEach(function (key) { + if (to[key]) + return; + + var value = Object.getOwnPropertyDescriptor(from, key); + Object.defineProperty(to, key, value); + }); + + return to; +} + + + +// --- API + +function Writer(options) { + options = merge(DEFAULT_OPTS, options || {}); + + this._buf = Buffer.alloc(options.size || 1024); + this._size = this._buf.length; + this._offset = 0; + this._options = options; + + // A list of offsets in the buffer where we need to insert + // sequence tag/len pairs. + this._seq = []; +} + +Object.defineProperty(Writer.prototype, 'buffer', { + get: function () { + if (this._seq.length) + throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)'); + + return (this._buf.slice(0, this._offset)); + } +}); + +Writer.prototype.writeByte = function (b) { + if (typeof (b) !== 'number') + throw new TypeError('argument must be a Number'); + + this._ensure(1); + this._buf[this._offset++] = b; +}; + + +Writer.prototype.writeInt = function (i, tag) { + if (typeof (i) !== 'number') + throw new TypeError('argument must be a Number'); + if (typeof (tag) !== 'number') + tag = ASN1.Integer; + + var sz = 4; + + while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) && + (sz > 1)) { + sz--; + i <<= 8; + } + + if (sz > 4) + throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff'); + + this._ensure(2 + sz); + this._buf[this._offset++] = tag; + this._buf[this._offset++] = sz; + + while (sz-- > 0) { + this._buf[this._offset++] = ((i & 0xff000000) >>> 24); + i <<= 8; + } + +}; + + +Writer.prototype.writeNull = function () { + this.writeByte(ASN1.Null); + this.writeByte(0x00); +}; + + +Writer.prototype.writeEnumeration = function (i, tag) { + if (typeof (i) !== 'number') + throw new TypeError('argument must be a Number'); + if (typeof (tag) !== 'number') + tag = ASN1.Enumeration; + + return this.writeInt(i, tag); +}; + + +Writer.prototype.writeBoolean = function (b, tag) { + if (typeof (b) !== 'boolean') + throw new TypeError('argument must be a Boolean'); + if (typeof (tag) !== 'number') + tag = ASN1.Boolean; + + this._ensure(3); + this._buf[this._offset++] = tag; + this._buf[this._offset++] = 0x01; + this._buf[this._offset++] = b ? 0xff : 0x00; +}; + + +Writer.prototype.writeString = function (s, tag) { + if (typeof (s) !== 'string') + throw new TypeError('argument must be a string (was: ' + typeof (s) + ')'); + if (typeof (tag) !== 'number') + tag = ASN1.OctetString; + + var len = Buffer.byteLength(s); + this.writeByte(tag); + this.writeLength(len); + if (len) { + this._ensure(len); + this._buf.write(s, this._offset); + this._offset += len; + } +}; + + +Writer.prototype.writeBuffer = function (buf, tag) { + if (typeof (tag) !== 'number') + throw new TypeError('tag must be a number'); + if (!Buffer.isBuffer(buf)) + throw new TypeError('argument must be a buffer'); + + this.writeByte(tag); + this.writeLength(buf.length); + this._ensure(buf.length); + buf.copy(this._buf, this._offset, 0, buf.length); + this._offset += buf.length; +}; + + +Writer.prototype.writeStringArray = function (strings) { + if ((!strings instanceof Array)) + throw new TypeError('argument must be an Array[String]'); + + var self = this; + strings.forEach(function (s) { + self.writeString(s); + }); +}; + +// This is really to solve DER cases, but whatever for now +Writer.prototype.writeOID = function (s, tag) { + if (typeof (s) !== 'string') + throw new TypeError('argument must be a string'); + if (typeof (tag) !== 'number') + tag = ASN1.OID; + + if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) + throw new Error('argument is not a valid OID string'); + + function encodeOctet(bytes, octet) { + if (octet < 128) { + bytes.push(octet); + } else if (octet < 16384) { + bytes.push((octet >>> 7) | 0x80); + bytes.push(octet & 0x7F); + } else if (octet < 2097152) { + bytes.push((octet >>> 14) | 0x80); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } else if (octet < 268435456) { + bytes.push((octet >>> 21) | 0x80); + bytes.push(((octet >>> 14) | 0x80) & 0xFF); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } else { + bytes.push(((octet >>> 28) | 0x80) & 0xFF); + bytes.push(((octet >>> 21) | 0x80) & 0xFF); + bytes.push(((octet >>> 14) | 0x80) & 0xFF); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } + } + + var tmp = s.split('.'); + var bytes = []; + bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); + tmp.slice(2).forEach(function (b) { + encodeOctet(bytes, parseInt(b, 10)); + }); + + var self = this; + this._ensure(2 + bytes.length); + this.writeByte(tag); + this.writeLength(bytes.length); + bytes.forEach(function (b) { + self.writeByte(b); + }); +}; + + +Writer.prototype.writeLength = function (len) { + if (typeof (len) !== 'number') + throw new TypeError('argument must be a Number'); + + this._ensure(4); + + if (len <= 0x7f) { + this._buf[this._offset++] = len; + } else if (len <= 0xff) { + this._buf[this._offset++] = 0x81; + this._buf[this._offset++] = len; + } else if (len <= 0xffff) { + this._buf[this._offset++] = 0x82; + this._buf[this._offset++] = len >> 8; + this._buf[this._offset++] = len; + } else if (len <= 0xffffff) { + this._buf[this._offset++] = 0x83; + this._buf[this._offset++] = len >> 16; + this._buf[this._offset++] = len >> 8; + this._buf[this._offset++] = len; + } else { + throw newInvalidAsn1Error('Length too long (> 4 bytes)'); + } +}; + +Writer.prototype.startSequence = function (tag) { + if (typeof (tag) !== 'number') + tag = ASN1.Sequence | ASN1.Constructor; + + this.writeByte(tag); + this._seq.push(this._offset); + this._ensure(3); + this._offset += 3; +}; + + +Writer.prototype.endSequence = function () { + var seq = this._seq.pop(); + var start = seq + 3; + var len = this._offset - start; + + if (len <= 0x7f) { + this._shift(start, len, -2); + this._buf[seq] = len; + } else if (len <= 0xff) { + this._shift(start, len, -1); + this._buf[seq] = 0x81; + this._buf[seq + 1] = len; + } else if (len <= 0xffff) { + this._buf[seq] = 0x82; + this._buf[seq + 1] = len >> 8; + this._buf[seq + 2] = len; + } else if (len <= 0xffffff) { + this._shift(start, len, 1); + this._buf[seq] = 0x83; + this._buf[seq + 1] = len >> 16; + this._buf[seq + 2] = len >> 8; + this._buf[seq + 3] = len; + } else { + throw newInvalidAsn1Error('Sequence too long'); + } +}; + + +Writer.prototype._shift = function (start, len, shift) { + assert.ok(start !== undefined); + assert.ok(len !== undefined); + assert.ok(shift); + + this._buf.copy(this._buf, start + shift, start, start + len); + this._offset += shift; +}; + +Writer.prototype._ensure = function (len) { + assert.ok(len); + + if (this._size - this._offset < len) { + var sz = this._size * this._options.growthFactor; + if (sz - this._offset < len) + sz += len; + + var buf = Buffer.alloc(sz); + + this._buf.copy(buf, 0, 0, this._offset); + this._buf = buf; + this._size = sz; + } +}; + + + +// --- Exported API + +module.exports = Writer; diff --git a/node_modules/asn1/lib/index.js b/node_modules/asn1/lib/index.js new file mode 100644 index 0000000..ede3ab2 --- /dev/null +++ b/node_modules/asn1/lib/index.js @@ -0,0 +1,20 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +// If you have no idea what ASN.1 or BER is, see this: +// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc + +var Ber = require('./ber/index'); + + + +// --- Exported API + +module.exports = { + + Ber: Ber, + + BerReader: Ber.Reader, + + BerWriter: Ber.Writer + +}; diff --git a/node_modules/asn1/package.json b/node_modules/asn1/package.json new file mode 100644 index 0000000..f913f5a --- /dev/null +++ b/node_modules/asn1/package.json @@ -0,0 +1,78 @@ +{ + "_args": [ + [ + "asn1@0.2.4", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "asn1@0.2.4", + "_id": "asn1@0.2.4", + "_inBundle": false, + "_integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "_location": "/asn1", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "asn1@0.2.4", + "name": "asn1", + "escapedName": "asn1", + "rawSpec": "0.2.4", + "saveSpec": null, + "fetchSpec": "0.2.4" + }, + "_requiredBy": [ + "/sshpk" + ], + "_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "_spec": "0.2.4", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Joyent", + "url": "joyent.com" + }, + "bugs": { + "url": "https://github.com/joyent/node-asn1/issues" + }, + "contributors": [ + { + "name": "Mark Cavage", + "email": "mcavage@gmail.com" + }, + { + "name": "David Gwynne", + "email": "loki@animata.net" + }, + { + "name": "Yunong Xiao", + "email": "yunong@joyent.com" + }, + { + "name": "Alex Wilson", + "email": "alex.wilson@joyent.com" + } + ], + "dependencies": { + "safer-buffer": "~2.1.0" + }, + "description": "Contains parsers and serializers for ASN.1 (currently BER only)", + "devDependencies": { + "eslint": "2.13.1", + "eslint-plugin-joyent": "~1.3.0", + "faucet": "0.0.1", + "istanbul": "^0.3.6", + "tape": "^3.5.0" + }, + "homepage": "https://github.com/joyent/node-asn1#readme", + "license": "MIT", + "main": "lib/index.js", + "name": "asn1", + "repository": { + "type": "git", + "url": "git://github.com/joyent/node-asn1.git" + }, + "scripts": { + "test": "tape ./test/ber/*.test.js" + }, + "version": "0.2.4" +} diff --git a/node_modules/assert-plus/AUTHORS b/node_modules/assert-plus/AUTHORS new file mode 100644 index 0000000..1923524 --- /dev/null +++ b/node_modules/assert-plus/AUTHORS @@ -0,0 +1,6 @@ +Dave Eddy +Fred Kuo +Lars-Magnus Skog +Mark Cavage +Patrick Mooney +Rob Gulewich diff --git a/node_modules/assert-plus/CHANGES.md b/node_modules/assert-plus/CHANGES.md new file mode 100644 index 0000000..57d92bf --- /dev/null +++ b/node_modules/assert-plus/CHANGES.md @@ -0,0 +1,14 @@ +# assert-plus Changelog + +## 1.0.0 + +- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input +- Add assert.finite check. Previous assert.number callers should use this if + they expect Infinity inputs to throw. + +## 0.2.0 + +- Fix `assert.object(null)` so it throws +- Fix optional/arrayOf exports for non-type-of asserts +- Add optiona/arrayOf exports for Stream/Date/Regex/uuid +- Add basic unit test coverage diff --git a/node_modules/assert-plus/README.md b/node_modules/assert-plus/README.md new file mode 100644 index 0000000..ec200d1 --- /dev/null +++ b/node_modules/assert-plus/README.md @@ -0,0 +1,162 @@ +# assert-plus + +This library is a super small wrapper over node's assert module that has two +things: (1) the ability to disable assertions with the environment variable +NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like +`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks +like this: + +```javascript + var assert = require('assert-plus'); + + function fooAccount(options, callback) { + assert.object(options, 'options'); + assert.number(options.id, 'options.id'); + assert.bool(options.isManager, 'options.isManager'); + assert.string(options.name, 'options.name'); + assert.arrayOfString(options.email, 'options.email'); + assert.func(callback, 'callback'); + + // Do stuff + callback(null, {}); + } +``` + +# API + +All methods that *aren't* part of node's core assert API are simply assumed to +take an argument, and then a string 'name' that's not a message; `AssertionError` +will be thrown if the assertion fails with a message like: + + AssertionError: foo (string) is required + at test (/home/mark/work/foo/foo.js:3:9) + at Object. (/home/mark/work/foo/foo.js:15:1) + at Module._compile (module.js:446:26) + at Object..js (module.js:464:10) + at Module.load (module.js:353:31) + at Function._load (module.js:311:12) + at Array.0 (module.js:484:10) + at EventEmitter._tickCallback (node.js:190:38) + +from: + +```javascript + function test(foo) { + assert.string(foo, 'foo'); + } +``` + +There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`: + +```javascript + function test(foo) { + assert.arrayOfString(foo, 'foo'); + } +``` + +You can assert IFF an argument is not `undefined` (i.e., an optional arg): + +```javascript + assert.optionalString(foo, 'foo'); +``` + +Lastly, you can opt-out of assertion checking altogether by setting the +environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have +lots of assertions, and don't want to pay `typeof ()` taxes to v8 in +production. Be advised: The standard functions re-exported from `assert` are +also disabled in assert-plus if NDEBUG is specified. Using them directly from +the `assert` module avoids this behavior. + +The complete list of APIs is: + +* assert.array +* assert.bool +* assert.buffer +* assert.func +* assert.number +* assert.finite +* assert.object +* assert.string +* assert.stream +* assert.date +* assert.regexp +* assert.uuid +* assert.arrayOfArray +* assert.arrayOfBool +* assert.arrayOfBuffer +* assert.arrayOfFunc +* assert.arrayOfNumber +* assert.arrayOfFinite +* assert.arrayOfObject +* assert.arrayOfString +* assert.arrayOfStream +* assert.arrayOfDate +* assert.arrayOfRegexp +* assert.arrayOfUuid +* assert.optionalArray +* assert.optionalBool +* assert.optionalBuffer +* assert.optionalFunc +* assert.optionalNumber +* assert.optionalFinite +* assert.optionalObject +* assert.optionalString +* assert.optionalStream +* assert.optionalDate +* assert.optionalRegexp +* assert.optionalUuid +* assert.optionalArrayOfArray +* assert.optionalArrayOfBool +* assert.optionalArrayOfBuffer +* assert.optionalArrayOfFunc +* assert.optionalArrayOfNumber +* assert.optionalArrayOfFinite +* assert.optionalArrayOfObject +* assert.optionalArrayOfString +* assert.optionalArrayOfStream +* assert.optionalArrayOfDate +* assert.optionalArrayOfRegexp +* assert.optionalArrayOfUuid +* assert.AssertionError +* assert.fail +* assert.ok +* assert.equal +* assert.notEqual +* assert.deepEqual +* assert.notDeepEqual +* assert.strictEqual +* assert.notStrictEqual +* assert.throws +* assert.doesNotThrow +* assert.ifError + +# Installation + + npm install assert-plus + +## License + +The MIT License (MIT) +Copyright (c) 2012 Mark Cavage + +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. + +## Bugs + +See . diff --git a/node_modules/assert-plus/assert.js b/node_modules/assert-plus/assert.js new file mode 100644 index 0000000..26f944e --- /dev/null +++ b/node_modules/assert-plus/assert.js @@ -0,0 +1,211 @@ +// Copyright (c) 2012, Mark Cavage. All rights reserved. +// Copyright 2015 Joyent, Inc. + +var assert = require('assert'); +var Stream = require('stream').Stream; +var util = require('util'); + + +///--- Globals + +/* JSSTYLED */ +var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; + + +///--- Internal + +function _capitalize(str) { + return (str.charAt(0).toUpperCase() + str.slice(1)); +} + +function _toss(name, expected, oper, arg, actual) { + throw new assert.AssertionError({ + message: util.format('%s (%s) is required', name, expected), + actual: (actual === undefined) ? typeof (arg) : actual(arg), + expected: expected, + operator: oper || '===', + stackStartFunction: _toss.caller + }); +} + +function _getClass(arg) { + return (Object.prototype.toString.call(arg).slice(8, -1)); +} + +function noop() { + // Why even bother with asserts? +} + + +///--- Exports + +var types = { + bool: { + check: function (arg) { return typeof (arg) === 'boolean'; } + }, + func: { + check: function (arg) { return typeof (arg) === 'function'; } + }, + string: { + check: function (arg) { return typeof (arg) === 'string'; } + }, + object: { + check: function (arg) { + return typeof (arg) === 'object' && arg !== null; + } + }, + number: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg); + } + }, + finite: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); + } + }, + buffer: { + check: function (arg) { return Buffer.isBuffer(arg); }, + operator: 'Buffer.isBuffer' + }, + array: { + check: function (arg) { return Array.isArray(arg); }, + operator: 'Array.isArray' + }, + stream: { + check: function (arg) { return arg instanceof Stream; }, + operator: 'instanceof', + actual: _getClass + }, + date: { + check: function (arg) { return arg instanceof Date; }, + operator: 'instanceof', + actual: _getClass + }, + regexp: { + check: function (arg) { return arg instanceof RegExp; }, + operator: 'instanceof', + actual: _getClass + }, + uuid: { + check: function (arg) { + return typeof (arg) === 'string' && UUID_REGEXP.test(arg); + }, + operator: 'isUUID' + } +}; + +function _setExports(ndebug) { + var keys = Object.keys(types); + var out; + + /* re-export standard assert */ + if (process.env.NODE_NDEBUG) { + out = noop; + } else { + out = function (arg, msg) { + if (!arg) { + _toss(msg, 'true', arg); + } + }; + } + + /* standard checks */ + keys.forEach(function (k) { + if (ndebug) { + out[k] = noop; + return; + } + var type = types[k]; + out[k] = function (arg, msg) { + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* optional checks */ + keys.forEach(function (k) { + var name = 'optional' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* arrayOf checks */ + keys.forEach(function (k) { + var name = 'arrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* optionalArrayOf checks */ + keys.forEach(function (k) { + var name = 'optionalArrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* re-export built-in assertions */ + Object.keys(assert).forEach(function (k) { + if (k === 'AssertionError') { + out[k] = assert[k]; + return; + } + if (ndebug) { + out[k] = noop; + return; + } + out[k] = assert[k]; + }); + + /* export ourselves (for unit tests _only_) */ + out._setExports = _setExports; + + return out; +} + +module.exports = _setExports(process.env.NODE_NDEBUG); diff --git a/node_modules/assert-plus/package.json b/node_modules/assert-plus/package.json new file mode 100644 index 0000000..f2d3ddc --- /dev/null +++ b/node_modules/assert-plus/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "assert-plus@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "assert-plus@1.0.0", + "_id": "assert-plus@1.0.0", + "_inBundle": false, + "_integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "_location": "/assert-plus", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "assert-plus@1.0.0", + "name": "assert-plus", + "escapedName": "assert-plus", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/dashdash", + "/getpass", + "/http-signature", + "/jsprim", + "/sshpk", + "/verror" + ], + "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Mark Cavage", + "email": "mcavage@gmail.com" + }, + "bugs": { + "url": "https://github.com/mcavage/node-assert-plus/issues" + }, + "contributors": [ + { + "name": "Dave Eddy", + "email": "dave@daveeddy.com" + }, + { + "name": "Fred Kuo", + "email": "fred.kuo@joyent.com" + }, + { + "name": "Lars-Magnus Skog", + "email": "ralphtheninja@riseup.net" + }, + { + "name": "Mark Cavage", + "email": "mcavage@gmail.com" + }, + { + "name": "Patrick Mooney", + "email": "pmooney@pfmooney.com" + }, + { + "name": "Rob Gulewich", + "email": "robert.gulewich@joyent.com" + } + ], + "dependencies": {}, + "description": "Extra assertions on top of node's assert module", + "devDependencies": { + "faucet": "0.0.1", + "tape": "4.2.2" + }, + "engines": { + "node": ">=0.8" + }, + "homepage": "https://github.com/mcavage/node-assert-plus#readme", + "license": "MIT", + "main": "./assert.js", + "name": "assert-plus", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git+https://github.com/mcavage/node-assert-plus.git" + }, + "scripts": { + "test": "tape tests/*.js | ./node_modules/.bin/faucet" + }, + "version": "1.0.0" +} diff --git a/node_modules/assign-symbols/LICENSE b/node_modules/assign-symbols/LICENSE new file mode 100644 index 0000000..65f90ac --- /dev/null +++ b/node_modules/assign-symbols/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, Jon Schlinkert. + +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/assign-symbols/README.md b/node_modules/assign-symbols/README.md new file mode 100644 index 0000000..422729d --- /dev/null +++ b/node_modules/assign-symbols/README.md @@ -0,0 +1,73 @@ +# assign-symbols [![NPM version](https://badge.fury.io/js/assign-symbols.svg)](http://badge.fury.io/js/assign-symbols) + +> Assign the enumerable es6 Symbol properties from an object (or objects) to the first object passed on the arguments. Can be used as a supplement to other extend, assign or merge methods as a polyfill for the Symbols part of the es6 Object.assign method. + +From the [Mozilla Developer docs for Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol): + +> A symbol is a unique and immutable data type and may be used as an identifier for object properties. The symbol object is an implicit object wrapper for the symbol primitive data type. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i assign-symbols --save +``` + +## Usage + +```js +var assignSymbols = require('assign-symbols'); +var obj = {}; + +var one = {}; +var symbolOne = Symbol('aaa'); +one[symbolOne] = 'bbb'; + +var two = {}; +var symbolTwo = Symbol('ccc'); +two[symbolTwo] = 'ddd'; + +assignSymbols(obj, one, two); + +console.log(obj[symbolOne]); +//=> 'bbb' +console.log(obj[symbolTwo]); +//=> 'ddd' +``` + +## Similar projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties of source objects to a destination object. | [homepage](https://github.com/jonschlinkert/assign-deep) +* [clone-deep](https://www.npmjs.com/package/clone-deep): Recursively (deep) clone JavaScript native types, like Object, Array, RegExp, Date as well as primitives. | [homepage](https://github.com/jonschlinkert/clone-deep) +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow) +* [merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep) +* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep) + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/assign-symbols/issues/new). + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on November 06, 2015._ \ No newline at end of file diff --git a/node_modules/assign-symbols/index.js b/node_modules/assign-symbols/index.js new file mode 100644 index 0000000..c08a232 --- /dev/null +++ b/node_modules/assign-symbols/index.js @@ -0,0 +1,40 @@ +/*! + * assign-symbols + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +module.exports = function(receiver, objects) { + if (receiver === null || typeof receiver === 'undefined') { + throw new TypeError('expected first argument to be an object.'); + } + + if (typeof objects === 'undefined' || typeof Symbol === 'undefined') { + return receiver; + } + + if (typeof Object.getOwnPropertySymbols !== 'function') { + return receiver; + } + + var isEnumerable = Object.prototype.propertyIsEnumerable; + var target = Object(receiver); + var len = arguments.length, i = 0; + + while (++i < len) { + var provider = Object(arguments[i]); + var names = Object.getOwnPropertySymbols(provider); + + for (var j = 0; j < names.length; j++) { + var key = names[j]; + + if (isEnumerable.call(provider, key)) { + target[key] = provider[key]; + } + } + } + return target; +}; diff --git a/node_modules/assign-symbols/package.json b/node_modules/assign-symbols/package.json new file mode 100644 index 0000000..e03de3a --- /dev/null +++ b/node_modules/assign-symbols/package.json @@ -0,0 +1,74 @@ +{ + "_args": [ + [ + "assign-symbols@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "assign-symbols@1.0.0", + "_id": "assign-symbols@1.0.0", + "_inBundle": false, + "_integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "_location": "/assign-symbols", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "assign-symbols@1.0.0", + "name": "assign-symbols", + "escapedName": "assign-symbols", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/extend-shallow" + ], + "_resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/assign-symbols/issues" + }, + "description": "Assign the enumerable es6 Symbol properties from an object (or objects) to the first object passed on the arguments. Can be used as a supplement to other extend, assign or merge methods as a polyfill for the Symbols part of the es6 Object.assign method.", + "devDependencies": { + "mocha": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/assign-symbols", + "keywords": [ + "assign", + "symbols" + ], + "license": "MIT", + "main": "index.js", + "name": "assign-symbols", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/assign-symbols.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "assign-deep", + "mixin-deep", + "merge-deep", + "extend-shallow", + "clone-deep" + ] + } + }, + "version": "1.0.0" +} diff --git a/node_modules/asynckit/LICENSE b/node_modules/asynckit/LICENSE new file mode 100644 index 0000000..c9eca5d --- /dev/null +++ b/node_modules/asynckit/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Alex Indigo + +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/asynckit/README.md b/node_modules/asynckit/README.md new file mode 100644 index 0000000..ddcc7e6 --- /dev/null +++ b/node_modules/asynckit/README.md @@ -0,0 +1,233 @@ +# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit) + +Minimal async jobs utility library, with streams support. + +[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit) + +[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master) +[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit) +[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit) + + + +AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects. +Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method. + +It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators. + +| compression | size | +| :----------------- | -------: | +| asynckit.js | 12.34 kB | +| asynckit.min.js | 4.11 kB | +| asynckit.min.js.gz | 1.47 kB | + + +## Install + +```sh +$ npm install --save asynckit +``` + +## Examples + +### Parallel Jobs + +Runs iterator over provided array in parallel. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will terminate rest of the active jobs (if abort function is provided) +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var parallel = require('asynckit').parallel + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , target = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// async job accepts one element from the array +// and a callback function +function asyncJob(item, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var parallel = require('asynckit/parallel') + , assert = require('assert') + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ] + , target = [] + , keys = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); + assert.deepEqual(keys, expectedKeys); +}); + +// supports full value, key, callback (shortcut) interface +function asyncJob(item, key, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + keys.push(key); + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js). + +### Serial Jobs + +Runs iterator over provided array sequentially. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will not proceed to the rest of the items in the list +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var serial = require('asynckit/serial') + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// extended interface (item, key, callback) +// also supported for arrays +function asyncJob(item, key, cb) +{ + target.push(key); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-array.js](test/test-serial-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var serial = require('asynckit').serial + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , target = [] + ; + + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// shortcut interface (item, callback) +// works for object as well as for the arrays +function asyncJob(item, cb) +{ + target.push(item); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-object.js](test/test-serial-object.js). + +_Note: Since _object_ is an _unordered_ collection of properties, +it may produce unexpected results with sequential iterations. +Whenever order of the jobs' execution is important please use `serialOrdered` method._ + +### Ordered Serial Iterations + +TBD + +For example [compare-property](compare-property) package. + +### Streaming interface + +TBD + +## Want to Know More? + +More examples can be found in [test folder](test/). + +Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions. + +## License + +AsyncKit is licensed under the MIT license. diff --git a/node_modules/asynckit/bench.js b/node_modules/asynckit/bench.js new file mode 100644 index 0000000..c612f1a --- /dev/null +++ b/node_modules/asynckit/bench.js @@ -0,0 +1,76 @@ +/* eslint no-console: "off" */ + +var asynckit = require('./') + , async = require('async') + , assert = require('assert') + , expected = 0 + ; + +var Benchmark = require('benchmark'); +var suite = new Benchmark.Suite; + +var source = []; +for (var z = 1; z < 100; z++) +{ + source.push(z); + expected += z; +} + +suite +// add tests + +.add('async.map', function(deferred) +{ + var total = 0; + + async.map(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +.add('asynckit.parallel', function(deferred) +{ + var total = 0; + + asynckit.parallel(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +// add listeners +.on('cycle', function(ev) +{ + console.log(String(ev.target)); +}) +.on('complete', function() +{ + console.log('Fastest is ' + this.filter('fastest').map('name')); +}) +// run async +.run({ 'async': true }); diff --git a/node_modules/asynckit/index.js b/node_modules/asynckit/index.js new file mode 100644 index 0000000..455f945 --- /dev/null +++ b/node_modules/asynckit/index.js @@ -0,0 +1,6 @@ +module.exports = +{ + parallel : require('./parallel.js'), + serial : require('./serial.js'), + serialOrdered : require('./serialOrdered.js') +}; diff --git a/node_modules/asynckit/lib/abort.js b/node_modules/asynckit/lib/abort.js new file mode 100644 index 0000000..114367e --- /dev/null +++ b/node_modules/asynckit/lib/abort.js @@ -0,0 +1,29 @@ +// API +module.exports = abort; + +/** + * Aborts leftover active jobs + * + * @param {object} state - current state object + */ +function abort(state) +{ + Object.keys(state.jobs).forEach(clean.bind(state)); + + // reset leftover jobs + state.jobs = {}; +} + +/** + * Cleans up leftover job by invoking abort function for the provided job id + * + * @this state + * @param {string|number} key - job id to abort + */ +function clean(key) +{ + if (typeof this.jobs[key] == 'function') + { + this.jobs[key](); + } +} diff --git a/node_modules/asynckit/lib/async.js b/node_modules/asynckit/lib/async.js new file mode 100644 index 0000000..7f1288a --- /dev/null +++ b/node_modules/asynckit/lib/async.js @@ -0,0 +1,34 @@ +var defer = require('./defer.js'); + +// API +module.exports = async; + +/** + * Runs provided callback asynchronously + * even if callback itself is not + * + * @param {function} callback - callback to invoke + * @returns {function} - augmented callback + */ +function async(callback) +{ + var isAsync = false; + + // check if async happened + defer(function() { isAsync = true; }); + + return function async_callback(err, result) + { + if (isAsync) + { + callback(err, result); + } + else + { + defer(function nextTick_callback() + { + callback(err, result); + }); + } + }; +} diff --git a/node_modules/asynckit/lib/defer.js b/node_modules/asynckit/lib/defer.js new file mode 100644 index 0000000..b67110c --- /dev/null +++ b/node_modules/asynckit/lib/defer.js @@ -0,0 +1,26 @@ +module.exports = defer; + +/** + * Runs provided function on next iteration of the event loop + * + * @param {function} fn - function to run + */ +function defer(fn) +{ + var nextTick = typeof setImmediate == 'function' + ? setImmediate + : ( + typeof process == 'object' && typeof process.nextTick == 'function' + ? process.nextTick + : null + ); + + if (nextTick) + { + nextTick(fn); + } + else + { + setTimeout(fn, 0); + } +} diff --git a/node_modules/asynckit/lib/iterate.js b/node_modules/asynckit/lib/iterate.js new file mode 100644 index 0000000..5d2839a --- /dev/null +++ b/node_modules/asynckit/lib/iterate.js @@ -0,0 +1,75 @@ +var async = require('./async.js') + , abort = require('./abort.js') + ; + +// API +module.exports = iterate; + +/** + * Iterates over each job object + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {object} state - current job status + * @param {function} callback - invoked when all elements processed + */ +function iterate(list, iterator, state, callback) +{ + // store current index + var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; + + state.jobs[key] = runJob(iterator, key, list[key], function(error, output) + { + // don't repeat yourself + // skip secondary callbacks + if (!(key in state.jobs)) + { + return; + } + + // clean up jobs + delete state.jobs[key]; + + if (error) + { + // don't process rest of the results + // stop still active jobs + // and reset the list + abort(state); + } + else + { + state.results[key] = output; + } + + // return salvaged results + callback(error, state.results); + }); +} + +/** + * Runs iterator over provided job element + * + * @param {function} iterator - iterator to invoke + * @param {string|number} key - key/index of the element in the list of jobs + * @param {mixed} item - job description + * @param {function} callback - invoked after iterator is done with the job + * @returns {function|mixed} - job abort function or something else + */ +function runJob(iterator, key, item, callback) +{ + var aborter; + + // allow shortcut if iterator expects only two arguments + if (iterator.length == 2) + { + aborter = iterator(item, async(callback)); + } + // otherwise go with full three arguments + else + { + aborter = iterator(item, key, async(callback)); + } + + return aborter; +} diff --git a/node_modules/asynckit/lib/readable_asynckit.js b/node_modules/asynckit/lib/readable_asynckit.js new file mode 100644 index 0000000..78ad240 --- /dev/null +++ b/node_modules/asynckit/lib/readable_asynckit.js @@ -0,0 +1,91 @@ +var streamify = require('./streamify.js') + , defer = require('./defer.js') + ; + +// API +module.exports = ReadableAsyncKit; + +/** + * Base constructor for all streams + * used to hold properties/methods + */ +function ReadableAsyncKit() +{ + ReadableAsyncKit.super_.apply(this, arguments); + + // list of active jobs + this.jobs = {}; + + // add stream methods + this.destroy = destroy; + this._start = _start; + this._read = _read; +} + +/** + * Destroys readable stream, + * by aborting outstanding jobs + * + * @returns {void} + */ +function destroy() +{ + if (this.destroyed) + { + return; + } + + this.destroyed = true; + + if (typeof this.terminator == 'function') + { + this.terminator(); + } +} + +/** + * Starts provided jobs in async manner + * + * @private + */ +function _start() +{ + // first argument – runner function + var runner = arguments[0] + // take away first argument + , args = Array.prototype.slice.call(arguments, 1) + // second argument - input data + , input = args[0] + // last argument - result callback + , endCb = streamify.callback.call(this, args[args.length - 1]) + ; + + args[args.length - 1] = endCb; + // third argument - iterator + args[1] = streamify.iterator.call(this, args[1]); + + // allow time for proper setup + defer(function() + { + if (!this.destroyed) + { + this.terminator = runner.apply(null, args); + } + else + { + endCb(null, Array.isArray(input) ? [] : {}); + } + }.bind(this)); +} + + +/** + * Implement _read to comply with Readable streams + * Doesn't really make sense for flowing object mode + * + * @private + */ +function _read() +{ + +} diff --git a/node_modules/asynckit/lib/readable_parallel.js b/node_modules/asynckit/lib/readable_parallel.js new file mode 100644 index 0000000..5d2929f --- /dev/null +++ b/node_modules/asynckit/lib/readable_parallel.js @@ -0,0 +1,25 @@ +var parallel = require('../parallel.js'); + +// API +module.exports = ReadableParallel; + +/** + * Streaming wrapper to `asynckit.parallel` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableParallel(list, iterator, callback) +{ + if (!(this instanceof ReadableParallel)) + { + return new ReadableParallel(list, iterator, callback); + } + + // turn on object mode + ReadableParallel.super_.call(this, {objectMode: true}); + + this._start(parallel, list, iterator, callback); +} diff --git a/node_modules/asynckit/lib/readable_serial.js b/node_modules/asynckit/lib/readable_serial.js new file mode 100644 index 0000000..7822698 --- /dev/null +++ b/node_modules/asynckit/lib/readable_serial.js @@ -0,0 +1,25 @@ +var serial = require('../serial.js'); + +// API +module.exports = ReadableSerial; + +/** + * Streaming wrapper to `asynckit.serial` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerial(list, iterator, callback) +{ + if (!(this instanceof ReadableSerial)) + { + return new ReadableSerial(list, iterator, callback); + } + + // turn on object mode + ReadableSerial.super_.call(this, {objectMode: true}); + + this._start(serial, list, iterator, callback); +} diff --git a/node_modules/asynckit/lib/readable_serial_ordered.js b/node_modules/asynckit/lib/readable_serial_ordered.js new file mode 100644 index 0000000..3de89c4 --- /dev/null +++ b/node_modules/asynckit/lib/readable_serial_ordered.js @@ -0,0 +1,29 @@ +var serialOrdered = require('../serialOrdered.js'); + +// API +module.exports = ReadableSerialOrdered; +// expose sort helpers +module.exports.ascending = serialOrdered.ascending; +module.exports.descending = serialOrdered.descending; + +/** + * Streaming wrapper to `asynckit.serialOrdered` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerialOrdered(list, iterator, sortMethod, callback) +{ + if (!(this instanceof ReadableSerialOrdered)) + { + return new ReadableSerialOrdered(list, iterator, sortMethod, callback); + } + + // turn on object mode + ReadableSerialOrdered.super_.call(this, {objectMode: true}); + + this._start(serialOrdered, list, iterator, sortMethod, callback); +} diff --git a/node_modules/asynckit/lib/state.js b/node_modules/asynckit/lib/state.js new file mode 100644 index 0000000..cbea7ad --- /dev/null +++ b/node_modules/asynckit/lib/state.js @@ -0,0 +1,37 @@ +// API +module.exports = state; + +/** + * Creates initial state object + * for iteration over list + * + * @param {array|object} list - list to iterate over + * @param {function|null} sortMethod - function to use for keys sort, + * or `null` to keep them as is + * @returns {object} - initial state object + */ +function state(list, sortMethod) +{ + var isNamedList = !Array.isArray(list) + , initState = + { + index : 0, + keyedList: isNamedList || sortMethod ? Object.keys(list) : null, + jobs : {}, + results : isNamedList ? {} : [], + size : isNamedList ? Object.keys(list).length : list.length + } + ; + + if (sortMethod) + { + // sort array keys based on it's values + // sort object's keys just on own merit + initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) + { + return sortMethod(list[a], list[b]); + }); + } + + return initState; +} diff --git a/node_modules/asynckit/lib/streamify.js b/node_modules/asynckit/lib/streamify.js new file mode 100644 index 0000000..f56a1c9 --- /dev/null +++ b/node_modules/asynckit/lib/streamify.js @@ -0,0 +1,141 @@ +var async = require('./async.js'); + +// API +module.exports = { + iterator: wrapIterator, + callback: wrapCallback +}; + +/** + * Wraps iterators with long signature + * + * @this ReadableAsyncKit# + * @param {function} iterator - function to wrap + * @returns {function} - wrapped function + */ +function wrapIterator(iterator) +{ + var stream = this; + + return function(item, key, cb) + { + var aborter + , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key)) + ; + + stream.jobs[key] = wrappedCb; + + // it's either shortcut (item, cb) + if (iterator.length == 2) + { + aborter = iterator(item, wrappedCb); + } + // or long format (item, key, cb) + else + { + aborter = iterator(item, key, wrappedCb); + } + + return aborter; + }; +} + +/** + * Wraps provided callback function + * allowing to execute snitch function before + * real callback + * + * @this ReadableAsyncKit# + * @param {function} callback - function to wrap + * @returns {function} - wrapped function + */ +function wrapCallback(callback) +{ + var stream = this; + + var wrapped = function(error, result) + { + return finisher.call(stream, error, result, callback); + }; + + return wrapped; +} + +/** + * Wraps provided iterator callback function + * makes sure snitch only called once, + * but passes secondary calls to the original callback + * + * @this ReadableAsyncKit# + * @param {function} callback - callback to wrap + * @param {number|string} key - iteration key + * @returns {function} wrapped callback + */ +function wrapIteratorCallback(callback, key) +{ + var stream = this; + + return function(error, output) + { + // don't repeat yourself + if (!(key in stream.jobs)) + { + callback(error, output); + return; + } + + // clean up jobs + delete stream.jobs[key]; + + return streamer.call(stream, error, {key: key, value: output}, callback); + }; +} + +/** + * Stream wrapper for iterator callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects iterator results + */ +function streamer(error, output, callback) +{ + if (error && !this.error) + { + this.error = error; + this.pause(); + this.emit('error', error); + // send back value only, as expected + callback(error, output && output.value); + return; + } + + // stream stuff + this.push(output); + + // back to original track + // send back value only, as expected + callback(error, output && output.value); +} + +/** + * Stream wrapper for finishing callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects final results + */ +function finisher(error, output, callback) +{ + // signal end of the stream + // only for successfully finished streams + if (!error) + { + this.push(null); + } + + // back to original track + callback(error, output); +} diff --git a/node_modules/asynckit/lib/terminator.js b/node_modules/asynckit/lib/terminator.js new file mode 100644 index 0000000..d6eb992 --- /dev/null +++ b/node_modules/asynckit/lib/terminator.js @@ -0,0 +1,29 @@ +var abort = require('./abort.js') + , async = require('./async.js') + ; + +// API +module.exports = terminator; + +/** + * Terminates jobs in the attached state context + * + * @this AsyncKitState# + * @param {function} callback - final callback to invoke after termination + */ +function terminator(callback) +{ + if (!Object.keys(this.jobs).length) + { + return; + } + + // fast forward iteration index + this.index = this.size; + + // abort jobs + abort(this); + + // send back results we have so far + async(callback)(null, this.results); +} diff --git a/node_modules/asynckit/package.json b/node_modules/asynckit/package.json new file mode 100644 index 0000000..80870c5 --- /dev/null +++ b/node_modules/asynckit/package.json @@ -0,0 +1,94 @@ +{ + "_args": [ + [ + "asynckit@0.4.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "asynckit@0.4.0", + "_id": "asynckit@0.4.0", + "_inBundle": false, + "_integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "_location": "/asynckit", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "asynckit@0.4.0", + "name": "asynckit", + "escapedName": "asynckit", + "rawSpec": "0.4.0", + "saveSpec": null, + "fetchSpec": "0.4.0" + }, + "_requiredBy": [ + "/form-data" + ], + "_resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "_spec": "0.4.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Alex Indigo", + "email": "iam@alexindigo.com" + }, + "bugs": { + "url": "https://github.com/alexindigo/asynckit/issues" + }, + "dependencies": {}, + "description": "Minimal async jobs utility library, with streams support", + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "^2.11.9", + "eslint": "^2.9.0", + "istanbul": "^0.4.3", + "obake": "^0.1.2", + "phantomjs-prebuilt": "^2.1.7", + "pre-commit": "^1.1.3", + "reamde": "^1.1.0", + "rimraf": "^2.5.2", + "size-table": "^0.2.0", + "tap-spec": "^4.1.1", + "tape": "^4.5.1" + }, + "homepage": "https://github.com/alexindigo/asynckit#readme", + "keywords": [ + "async", + "jobs", + "parallel", + "serial", + "iterator", + "array", + "object", + "stream", + "destroy", + "terminate", + "abort" + ], + "license": "MIT", + "main": "index.js", + "name": "asynckit", + "pre-commit": [ + "clean", + "lint", + "test", + "browser", + "report", + "size" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/alexindigo/asynckit.git" + }, + "scripts": { + "browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec", + "clean": "rimraf coverage", + "debug": "tape test/test-*.js", + "lint": "eslint *.js lib/*.js test/*.js", + "report": "istanbul report", + "size": "browserify index.js | size-table asynckit", + "test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec", + "win-test": "tape test/test-*.js" + }, + "version": "0.4.0" +} diff --git a/node_modules/asynckit/parallel.js b/node_modules/asynckit/parallel.js new file mode 100644 index 0000000..3c50344 --- /dev/null +++ b/node_modules/asynckit/parallel.js @@ -0,0 +1,43 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = parallel; + +/** + * Runs iterator over provided array elements in parallel + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function parallel(list, iterator, callback) +{ + var state = initState(list); + + while (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, function(error, result) + { + if (error) + { + callback(error, result); + return; + } + + // looks like it's the last one + if (Object.keys(state.jobs).length === 0) + { + callback(null, state.results); + return; + } + }); + + state.index++; + } + + return terminator.bind(state, callback); +} diff --git a/node_modules/asynckit/serial.js b/node_modules/asynckit/serial.js new file mode 100644 index 0000000..6cd949a --- /dev/null +++ b/node_modules/asynckit/serial.js @@ -0,0 +1,17 @@ +var serialOrdered = require('./serialOrdered.js'); + +// Public API +module.exports = serial; + +/** + * Runs iterator over provided array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serial(list, iterator, callback) +{ + return serialOrdered(list, iterator, null, callback); +} diff --git a/node_modules/asynckit/serialOrdered.js b/node_modules/asynckit/serialOrdered.js new file mode 100644 index 0000000..607eafe --- /dev/null +++ b/node_modules/asynckit/serialOrdered.js @@ -0,0 +1,75 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = serialOrdered; +// sorting helpers +module.exports.ascending = ascending; +module.exports.descending = descending; + +/** + * Runs iterator over provided sorted array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serialOrdered(list, iterator, sortMethod, callback) +{ + var state = initState(list, sortMethod); + + iterate(list, iterator, state, function iteratorHandler(error, result) + { + if (error) + { + callback(error, result); + return; + } + + state.index++; + + // are we there yet? + if (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, iteratorHandler); + return; + } + + // done here + callback(null, state.results); + }); + + return terminator.bind(state, callback); +} + +/* + * -- Sort methods + */ + +/** + * sort helper to sort array elements in ascending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function ascending(a, b) +{ + return a < b ? -1 : a > b ? 1 : 0; +} + +/** + * sort helper to sort array elements in descending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function descending(a, b) +{ + return -1 * ascending(a, b); +} diff --git a/node_modules/asynckit/stream.js b/node_modules/asynckit/stream.js new file mode 100644 index 0000000..d43465f --- /dev/null +++ b/node_modules/asynckit/stream.js @@ -0,0 +1,21 @@ +var inherits = require('util').inherits + , Readable = require('stream').Readable + , ReadableAsyncKit = require('./lib/readable_asynckit.js') + , ReadableParallel = require('./lib/readable_parallel.js') + , ReadableSerial = require('./lib/readable_serial.js') + , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js') + ; + +// API +module.exports = +{ + parallel : ReadableParallel, + serial : ReadableSerial, + serialOrdered : ReadableSerialOrdered, +}; + +inherits(ReadableAsyncKit, Readable); + +inherits(ReadableParallel, ReadableAsyncKit); +inherits(ReadableSerial, ReadableAsyncKit); +inherits(ReadableSerialOrdered, ReadableAsyncKit); diff --git a/node_modules/atob/LICENSE b/node_modules/atob/LICENSE new file mode 100644 index 0000000..2d9338b --- /dev/null +++ b/node_modules/atob/LICENSE @@ -0,0 +1,230 @@ +At your option you may choose either of the following licenses: + + * The MIT License (MIT) + * The Apache License 2.0 (Apache-2.0) + + +The MIT License (MIT) + +Copyright (c) 2015 AJ ONeal + +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 2015 AJ ONeal + + 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/atob/LICENSE.DOCS b/node_modules/atob/LICENSE.DOCS new file mode 100644 index 0000000..1d658d6 --- /dev/null +++ b/node_modules/atob/LICENSE.DOCS @@ -0,0 +1,319 @@ +Creative Commons Legal Code + +Attribution 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined above) for the purposes of this + License. + c. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + d. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + e. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + f. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + g. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + h. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + i. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(b), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(b), as requested. + b. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Section 3(b), in the case of an Adaptation, + a credit identifying the use of the Work in the Adaptation (e.g., + "French translation of the Work by Original Author," or "Screenplay + based on original Work by Original Author"). The credit required by + this Section 4 (b) may be implemented in any reasonable manner; + provided, however, that in the case of a Adaptation or Collection, at + a minimum such credit will appear, if a credit for all contributing + authors of the Adaptation or Collection appears, then as part of these + credits and in a manner at least as prominent as the credits for the + other contributing authors. For the avoidance of doubt, You may only + use the credit required by this Section for the purpose of attribution + in the manner set out above and, by exercising Your rights under this + License, You may not implicitly or explicitly assert or imply any + connection with, sponsorship or endorsement by the Original Author, + Licensor and/or Attribution Parties, as appropriate, of You or Your + use of the Work, without the separate, express prior written + permission of the Original Author, Licensor and/or Attribution + Parties. + c. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of this License. + + Creative Commons may be contacted at http://creativecommons.org/. diff --git a/node_modules/atob/README.md b/node_modules/atob/README.md new file mode 100644 index 0000000..e15ef86 --- /dev/null +++ b/node_modules/atob/README.md @@ -0,0 +1,49 @@ +atob +=== + +| **atob** +| [btoa](https://git.coolaj86.com/coolaj86/btoa.js) +| [unibabel.js](https://git.coolaj86.com/coolaj86/unibabel.js) +| Sponsored by [ppl](https://ppl.family) + +Uses `Buffer` to emulate the exact functionality of the browser's atob. + +Note: Unicode may be handled incorrectly (like the browser). + +It turns base64-encoded ascii data back **to** binary. + +```javascript +(function () { + "use strict"; + + var atob = require('atob'); + var b64 = "SGVsbG8sIFdvcmxkIQ=="; + var bin = atob(b64); + + console.log(bin); // "Hello, World!" +}()); +``` + +### Need Unicode and Binary Support in the Browser? + +Check out [unibabel.js](https://git.coolaj86.com/coolaj86/unibabel.js) + +Changelog +======= + + * v2.1.0 address a few issues and PRs, update URLs + * v2.0.0 provide browser version for ios web workers + * v1.2.0 provide (empty) browser version + * v1.1.3 add MIT license + * v1.1.2 node only + +LICENSE +======= + +Code copyright 2012-2018 AJ ONeal + +Dual-licensed MIT and Apache-2.0 + +Docs copyright 2012-2018 AJ ONeal + +Docs released under [Creative Commons](https://git.coolaj86.com/coolaj86/atob.js/blob/master/LICENSE.DOCS). diff --git a/node_modules/atob/bin/atob.js b/node_modules/atob/bin/atob.js new file mode 100755 index 0000000..a56ac2e --- /dev/null +++ b/node_modules/atob/bin/atob.js @@ -0,0 +1,6 @@ +#!/usr/bin/env node +'use strict'; + +var atob = require('../node-atob'); +var str = process.argv[2]; +console.log(atob(str)); diff --git a/node_modules/atob/bower.json b/node_modules/atob/bower.json new file mode 100644 index 0000000..e3ef66e --- /dev/null +++ b/node_modules/atob/bower.json @@ -0,0 +1,24 @@ +{ + "name": "atob", + "description": "atob for isomorphic environments", + "main": "browser-atob.js", + "authors": [ + "AJ ONeal (https://coolaj86.com)" + ], + "license": "(MIT OR Apache-2.0)", + "keywords": [ + "atob", + "browser" + ], + "homepage": "https://github.com/node-browser-compat/atob", + "moduleType": [ + "globals" + ], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/node_modules/atob/browser-atob.js b/node_modules/atob/browser-atob.js new file mode 100644 index 0000000..af4f357 --- /dev/null +++ b/node_modules/atob/browser-atob.js @@ -0,0 +1,44 @@ +(function (w) { + "use strict"; + + function findBest(atobNative) { + // normal window + if ('function' === typeof atobNative) { return atobNative; } + + + // browserify (web worker) + if ('function' === typeof Buffer) { + return function atobBrowserify(a) { + //!! Deliberately using an API that's deprecated in node.js because + //!! this file is for browsers and we expect them to cope with it. + //!! Discussion: github.com/node-browser-compat/atob/pull/9 + return new Buffer(a, 'base64').toString('binary'); + }; + } + + // ios web worker with base64js + if ('object' === typeof w.base64js) { + // bufferToBinaryString + // https://git.coolaj86.com/coolaj86/unibabel.js/blob/master/index.js#L50 + return function atobWebWorker_iOS(a) { + var buf = w.base64js.b64ToByteArray(a); + return Array.prototype.map.call(buf, function (ch) { + return String.fromCharCode(ch); + }).join(''); + }; + } + + return function () { + // ios web worker without base64js + throw new Error("You're probably in an old browser or an iOS webworker." + + " It might help to include beatgammit's base64-js."); + }; + } + + var atobBest = findBest(w.atob); + w.atob = atobBest; + + if ((typeof module === 'object') && module && module.exports) { + module.exports = atobBest; + } +}(window)); diff --git a/node_modules/atob/node-atob.js b/node_modules/atob/node-atob.js new file mode 100644 index 0000000..d7305a3 --- /dev/null +++ b/node_modules/atob/node-atob.js @@ -0,0 +1,7 @@ +"use strict"; + +function atob(str) { + return Buffer.from(str, 'base64').toString('binary'); +} + +module.exports = atob.atob = atob; diff --git a/node_modules/atob/package.json b/node_modules/atob/package.json new file mode 100644 index 0000000..1a1acef --- /dev/null +++ b/node_modules/atob/package.json @@ -0,0 +1,56 @@ +{ + "_args": [ + [ + "atob@2.1.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "atob@2.1.2", + "_id": "atob@2.1.2", + "_inBundle": false, + "_integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "_location": "/atob", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "atob@2.1.2", + "name": "atob", + "escapedName": "atob", + "rawSpec": "2.1.2", + "saveSpec": null, + "fetchSpec": "2.1.2" + }, + "_requiredBy": [ + "/source-map-resolve" + ], + "_resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "_spec": "2.1.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "AJ ONeal", + "email": "coolaj86@gmail.com", + "url": "https://coolaj86.com" + }, + "bin": { + "atob": "bin/atob.js" + }, + "browser": "browser-atob.js", + "description": "atob for Node.JS and Linux / Mac / Windows CLI (it's a one-liner)", + "engines": { + "node": ">= 4.5.0" + }, + "homepage": "https://git.coolaj86.com/coolaj86/atob.js.git", + "keywords": [ + "atob", + "browser" + ], + "license": "(MIT OR Apache-2.0)", + "main": "node-atob.js", + "name": "atob", + "repository": { + "type": "git", + "url": "git://git.coolaj86.com/coolaj86/atob.js.git" + }, + "version": "2.1.2" +} diff --git a/node_modules/atob/test.js b/node_modules/atob/test.js new file mode 100644 index 0000000..bd80a4e --- /dev/null +++ b/node_modules/atob/test.js @@ -0,0 +1,18 @@ +(function () { + "use strict"; + + var atob = require('.'); + var encoded = "SGVsbG8sIFdvcmxkIQ==" + var unencoded = "Hello, World!"; + /* + , encoded = "SGVsbG8sIBZM" + , unencoded = "Hello, 世界" + */ + + if (unencoded !== atob(encoded)) { + console.log('[FAIL]', unencoded, atob(encoded)); + return; + } + + console.log('[PASS] all tests pass'); +}()); diff --git a/node_modules/aws-sign2/LICENSE b/node_modules/aws-sign2/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/aws-sign2/LICENSE @@ -0,0 +1,55 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +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 + +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 \ No newline at end of file diff --git a/node_modules/aws-sign2/README.md b/node_modules/aws-sign2/README.md new file mode 100644 index 0000000..763564e --- /dev/null +++ b/node_modules/aws-sign2/README.md @@ -0,0 +1,4 @@ +aws-sign +======== + +AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module. diff --git a/node_modules/aws-sign2/index.js b/node_modules/aws-sign2/index.js new file mode 100644 index 0000000..fb35f6d --- /dev/null +++ b/node_modules/aws-sign2/index.js @@ -0,0 +1,212 @@ + +/*! + * Copyright 2010 LearnBoost + * + * 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. + */ + +/** + * Module dependencies. + */ + +var crypto = require('crypto') + , parse = require('url').parse + ; + +/** + * Valid keys. + */ + +var keys = + [ 'acl' + , 'location' + , 'logging' + , 'notification' + , 'partNumber' + , 'policy' + , 'requestPayment' + , 'torrent' + , 'uploadId' + , 'uploads' + , 'versionId' + , 'versioning' + , 'versions' + , 'website' + ] + +/** + * Return an "Authorization" header value with the given `options` + * in the form of "AWS :" + * + * @param {Object} options + * @return {String} + * @api private + */ + +function authorization (options) { + return 'AWS ' + options.key + ':' + sign(options) +} + +module.exports = authorization +module.exports.authorization = authorization + +/** + * Simple HMAC-SHA1 Wrapper + * + * @param {Object} options + * @return {String} + * @api private + */ + +function hmacSha1 (options) { + return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') +} + +module.exports.hmacSha1 = hmacSha1 + +/** + * Create a base64 sha1 HMAC for `options`. + * + * @param {Object} options + * @return {String} + * @api private + */ + +function sign (options) { + options.message = stringToSign(options) + return hmacSha1(options) +} +module.exports.sign = sign + +/** + * Create a base64 sha1 HMAC for `options`. + * + * Specifically to be used with S3 presigned URLs + * + * @param {Object} options + * @return {String} + * @api private + */ + +function signQuery (options) { + options.message = queryStringToSign(options) + return hmacSha1(options) +} +module.exports.signQuery= signQuery + +/** + * Return a string for sign() with the given `options`. + * + * Spec: + * + * \n + * \n + * \n + * \n + * [headers\n] + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function stringToSign (options) { + var headers = options.amazonHeaders || '' + if (headers) headers += '\n' + var r = + [ options.verb + , options.md5 + , options.contentType + , options.date ? options.date.toUTCString() : '' + , headers + options.resource + ] + return r.join('\n') +} +module.exports.stringToSign = stringToSign + +/** + * Return a string for sign() with the given `options`, but is meant exclusively + * for S3 presigned URLs + * + * Spec: + * + * \n + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function queryStringToSign (options){ + return 'GET\n\n\n' + options.date + '\n' + options.resource +} +module.exports.queryStringToSign = queryStringToSign + +/** + * Perform the following: + * + * - ignore non-amazon headers + * - lowercase fields + * - sort lexicographically + * - trim whitespace between ":" + * - join with newline + * + * @param {Object} headers + * @return {String} + * @api private + */ + +function canonicalizeHeaders (headers) { + var buf = [] + , fields = Object.keys(headers) + ; + for (var i = 0, len = fields.length; i < len; ++i) { + var field = fields[i] + , val = headers[field] + , field = field.toLowerCase() + ; + if (0 !== field.indexOf('x-amz')) continue + buf.push(field + ':' + val) + } + return buf.sort().join('\n') +} +module.exports.canonicalizeHeaders = canonicalizeHeaders + +/** + * Perform the following: + * + * - ignore non sub-resources + * - sort lexicographically + * + * @param {String} resource + * @return {String} + * @api private + */ + +function canonicalizeResource (resource) { + var url = parse(resource, true) + , path = url.pathname + , buf = [] + ; + + Object.keys(url.query).forEach(function(key){ + if (!~keys.indexOf(key)) return + var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) + buf.push(key + val) + }) + + return path + (buf.length ? '?' + buf.sort().join('&') : '') +} +module.exports.canonicalizeResource = canonicalizeResource diff --git a/node_modules/aws-sign2/package.json b/node_modules/aws-sign2/package.json new file mode 100644 index 0000000..f722841 --- /dev/null +++ b/node_modules/aws-sign2/package.json @@ -0,0 +1,53 @@ +{ + "_args": [ + [ + "aws-sign2@0.7.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "aws-sign2@0.7.0", + "_id": "aws-sign2@0.7.0", + "_inBundle": false, + "_integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "_location": "/aws-sign2", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "aws-sign2@0.7.0", + "name": "aws-sign2", + "escapedName": "aws-sign2", + "rawSpec": "0.7.0", + "saveSpec": null, + "fetchSpec": "0.7.0" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "_spec": "0.7.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "bugs": { + "url": "https://github.com/mikeal/aws-sign/issues" + }, + "dependencies": {}, + "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.", + "devDependencies": {}, + "engines": { + "node": "*" + }, + "homepage": "https://github.com/mikeal/aws-sign#readme", + "license": "Apache-2.0", + "main": "index.js", + "name": "aws-sign2", + "optionalDependencies": {}, + "repository": { + "url": "git+https://github.com/mikeal/aws-sign.git" + }, + "version": "0.7.0" +} diff --git a/node_modules/aws4/.travis.yml b/node_modules/aws4/.travis.yml new file mode 100644 index 0000000..178bf31 --- /dev/null +++ b/node_modules/aws4/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" + - "6" + - "8" + - "10" + - "12" diff --git a/node_modules/aws4/LICENSE b/node_modules/aws4/LICENSE new file mode 100644 index 0000000..4f321e5 --- /dev/null +++ b/node_modules/aws4/LICENSE @@ -0,0 +1,19 @@ +Copyright 2013 Michael Hart (michael.hart.au@gmail.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/aws4/README.md b/node_modules/aws4/README.md new file mode 100644 index 0000000..1e9d61b --- /dev/null +++ b/node_modules/aws4/README.md @@ -0,0 +1,523 @@ +aws4 +---- + +[![Build Status](https://secure.travis-ci.org/mhart/aws4.png?branch=master)](http://travis-ci.org/mhart/aws4) + +A small utility to sign vanilla Node.js http(s) request options using Amazon's +[AWS Signature Version 4](http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html). + +If you want to sign and send AWS requests in a modern browser, or an environment like [Cloudflare Workers](https://developers.cloudflare.com/workers/), then check out [aws4fetch](https://github.com/mhart/aws4fetch) – otherwise you can also bundle this library for use [in the browser](./browser). + +This signature is supported by nearly all Amazon services, including +[S3](http://docs.aws.amazon.com/AmazonS3/latest/API/), +[EC2](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/), +[DynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/API.html), +[Kinesis](http://docs.aws.amazon.com/kinesis/latest/APIReference/), +[Lambda](http://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html), +[SQS](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/), +[SNS](http://docs.aws.amazon.com/sns/latest/api/), +[IAM](http://docs.aws.amazon.com/IAM/latest/APIReference/), +[STS](http://docs.aws.amazon.com/STS/latest/APIReference/), +[RDS](http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/), +[CloudWatch](http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/), +[CloudWatch Logs](http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/), +[CodeDeploy](http://docs.aws.amazon.com/codedeploy/latest/APIReference/), +[CloudFront](http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/), +[CloudTrail](http://docs.aws.amazon.com/awscloudtrail/latest/APIReference/), +[ElastiCache](http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/), +[EMR](http://docs.aws.amazon.com/ElasticMapReduce/latest/API/), +[Glacier](http://docs.aws.amazon.com/amazonglacier/latest/dev/amazon-glacier-api.html), +[CloudSearch](http://docs.aws.amazon.com/cloudsearch/latest/developerguide/APIReq.html), +[Elastic Load Balancing](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/), +[Elastic Transcoder](http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/api-reference.html), +[CloudFormation](http://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/), +[Elastic Beanstalk](http://docs.aws.amazon.com/elasticbeanstalk/latest/api/), +[Storage Gateway](http://docs.aws.amazon.com/storagegateway/latest/userguide/AWSStorageGatewayAPI.html), +[Data Pipeline](http://docs.aws.amazon.com/datapipeline/latest/APIReference/), +[Direct Connect](http://docs.aws.amazon.com/directconnect/latest/APIReference/), +[Redshift](http://docs.aws.amazon.com/redshift/latest/APIReference/), +[OpsWorks](http://docs.aws.amazon.com/opsworks/latest/APIReference/), +[SES](http://docs.aws.amazon.com/ses/latest/APIReference/), +[SWF](http://docs.aws.amazon.com/amazonswf/latest/apireference/), +[AutoScaling](http://docs.aws.amazon.com/AutoScaling/latest/APIReference/), +[Mobile Analytics](http://docs.aws.amazon.com/mobileanalytics/latest/ug/server-reference.html), +[Cognito Identity](http://docs.aws.amazon.com/cognitoidentity/latest/APIReference/), +[Cognito Sync](http://docs.aws.amazon.com/cognitosync/latest/APIReference/), +[Container Service](http://docs.aws.amazon.com/AmazonECS/latest/APIReference/), +[AppStream](http://docs.aws.amazon.com/appstream/latest/developerguide/appstream-api-rest.html), +[Key Management Service](http://docs.aws.amazon.com/kms/latest/APIReference/), +[Config](http://docs.aws.amazon.com/config/latest/APIReference/), +[CloudHSM](http://docs.aws.amazon.com/cloudhsm/latest/dg/api-ref.html), +[Route53](http://docs.aws.amazon.com/Route53/latest/APIReference/requests-rest.html) and +[Route53 Domains](http://docs.aws.amazon.com/Route53/latest/APIReference/requests-rpc.html). + +Indeed, the only AWS services that *don't* support v4 as of 2014-12-30 are +[Import/Export](http://docs.aws.amazon.com/AWSImportExport/latest/DG/api-reference.html) and +[SimpleDB](http://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/SDB_API.html) +(they only support [AWS Signature Version 2](https://github.com/mhart/aws2)). + +It also provides defaults for a number of core AWS headers and +request parameters, making it very easy to query AWS services, or +build out a fully-featured AWS library. + +Example +------- + +```javascript +var http = require('http'), + https = require('https'), + aws4 = require('aws4') + +// given an options object you could pass to http.request +var opts = {host: 'sqs.us-east-1.amazonaws.com', path: '/?Action=ListQueues'} + +// alternatively (as aws4 can infer the host): +opts = {service: 'sqs', region: 'us-east-1', path: '/?Action=ListQueues'} + +// alternatively (as us-east-1 is default): +opts = {service: 'sqs', path: '/?Action=ListQueues'} + +aws4.sign(opts) // assumes AWS credentials are available in process.env + +console.log(opts) +/* +{ + host: 'sqs.us-east-1.amazonaws.com', + path: '/?Action=ListQueues', + headers: { + Host: 'sqs.us-east-1.amazonaws.com', + 'X-Amz-Date': '20121226T061030Z', + Authorization: 'AWS4-HMAC-SHA256 Credential=ABCDEF/20121226/us-east-1/sqs/aws4_request, ...' + } +} +*/ + +// we can now use this to query AWS using the standard node.js http API +http.request(opts, function(res) { res.pipe(process.stdout) }).end() +/* + + +... +*/ +``` + +More options +------------ + +```javascript +// you can also pass AWS credentials in explicitly (otherwise taken from process.env) +aws4.sign(opts, {accessKeyId: '', secretAccessKey: ''}) + +// can also add the signature to query strings +aws4.sign({service: 's3', path: '/my-bucket?X-Amz-Expires=12345', signQuery: true}) + +// create a utility function to pipe to stdout (with https this time) +function request(o) { https.request(o, function(res) { res.pipe(process.stdout) }).end(o.body || '') } + +// aws4 can infer the HTTP method if a body is passed in +// method will be POST and Content-Type: 'application/x-www-form-urlencoded; charset=utf-8' +request(aws4.sign({service: 'iam', body: 'Action=ListGroups&Version=2010-05-08'})) +/* + +... +*/ + +// can specify any custom option or header as per usual +request(aws4.sign({ + service: 'dynamodb', + region: 'ap-southeast-2', + method: 'POST', + path: '/', + headers: { + 'Content-Type': 'application/x-amz-json-1.0', + 'X-Amz-Target': 'DynamoDB_20120810.ListTables' + }, + body: '{}' +})) +/* +{"TableNames":[]} +... +*/ + +// works with all other services that support Signature Version 4 + +request(aws4.sign({service: 's3', path: '/', signQuery: true})) +/* + +... +*/ + +request(aws4.sign({service: 'ec2', path: '/?Action=DescribeRegions&Version=2014-06-15'})) +/* + +... +*/ + +request(aws4.sign({service: 'sns', path: '/?Action=ListTopics&Version=2010-03-31'})) +/* + +... +*/ + +request(aws4.sign({service: 'sts', path: '/?Action=GetSessionToken&Version=2011-06-15'})) +/* + +... +*/ + +request(aws4.sign({service: 'cloudsearch', path: '/?Action=ListDomainNames&Version=2013-01-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'ses', path: '/?Action=ListIdentities&Version=2010-12-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'autoscaling', path: '/?Action=DescribeAutoScalingInstances&Version=2011-01-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'elasticloadbalancing', path: '/?Action=DescribeLoadBalancers&Version=2012-06-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'cloudformation', path: '/?Action=ListStacks&Version=2010-05-15'})) +/* + +... +*/ + +request(aws4.sign({service: 'elasticbeanstalk', path: '/?Action=ListAvailableSolutionStacks&Version=2010-12-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'rds', path: '/?Action=DescribeDBInstances&Version=2012-09-17'})) +/* + +... +*/ + +request(aws4.sign({service: 'monitoring', path: '/?Action=ListMetrics&Version=2010-08-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'redshift', path: '/?Action=DescribeClusters&Version=2012-12-01'})) +/* + +... +*/ + +request(aws4.sign({service: 'cloudfront', path: '/2014-05-31/distribution'})) +/* + +... +*/ + +request(aws4.sign({service: 'elasticache', path: '/?Action=DescribeCacheClusters&Version=2014-07-15'})) +/* + +... +*/ + +request(aws4.sign({service: 'elasticmapreduce', path: '/?Action=DescribeJobFlows&Version=2009-03-31'})) +/* + +... +*/ + +request(aws4.sign({service: 'route53', path: '/2013-04-01/hostedzone'})) +/* + +... +*/ + +request(aws4.sign({service: 'appstream', path: '/applications'})) +/* +{"_links":{"curie":[{"href":"http://docs.aws.amazon.com/appstream/latest/... +... +*/ + +request(aws4.sign({service: 'cognito-sync', path: '/identitypools'})) +/* +{"Count":0,"IdentityPoolUsages":[],"MaxResults":16,"NextToken":null} +... +*/ + +request(aws4.sign({service: 'elastictranscoder', path: '/2012-09-25/pipelines'})) +/* +{"NextPageToken":null,"Pipelines":[]} +... +*/ + +request(aws4.sign({service: 'lambda', path: '/2014-11-13/functions/'})) +/* +{"Functions":[],"NextMarker":null} +... +*/ + +request(aws4.sign({service: 'ecs', path: '/?Action=ListClusters&Version=2014-11-13'})) +/* + +... +*/ + +request(aws4.sign({service: 'glacier', path: '/-/vaults', headers: {'X-Amz-Glacier-Version': '2012-06-01'}})) +/* +{"Marker":null,"VaultList":[]} +... +*/ + +request(aws4.sign({service: 'storagegateway', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'StorageGateway_20120630.ListGateways' +}})) +/* +{"Gateways":[]} +... +*/ + +request(aws4.sign({service: 'datapipeline', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'DataPipeline.ListPipelines' +}})) +/* +{"hasMoreResults":false,"pipelineIdList":[]} +... +*/ + +request(aws4.sign({service: 'opsworks', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'OpsWorks_20130218.DescribeStacks' +}})) +/* +{"Stacks":[]} +... +*/ + +request(aws4.sign({service: 'route53domains', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'Route53Domains_v20140515.ListDomains' +}})) +/* +{"Domains":[]} +... +*/ + +request(aws4.sign({service: 'kinesis', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'Kinesis_20131202.ListStreams' +}})) +/* +{"HasMoreStreams":false,"StreamNames":[]} +... +*/ + +request(aws4.sign({service: 'cloudtrail', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'CloudTrail_20131101.DescribeTrails' +}})) +/* +{"trailList":[]} +... +*/ + +request(aws4.sign({service: 'logs', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'Logs_20140328.DescribeLogGroups' +}})) +/* +{"logGroups":[]} +... +*/ + +request(aws4.sign({service: 'codedeploy', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'CodeDeploy_20141006.ListApplications' +}})) +/* +{"applications":[]} +... +*/ + +request(aws4.sign({service: 'directconnect', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'OvertureService.DescribeConnections' +}})) +/* +{"connections":[]} +... +*/ + +request(aws4.sign({service: 'kms', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'TrentService.ListKeys' +}})) +/* +{"Keys":[],"Truncated":false} +... +*/ + +request(aws4.sign({service: 'config', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'StarlingDoveService.DescribeDeliveryChannels' +}})) +/* +{"DeliveryChannels":[]} +... +*/ + +request(aws4.sign({service: 'cloudhsm', body: '{}', headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'CloudHsmFrontendService.ListAvailableZones' +}})) +/* +{"AZList":["us-east-1a","us-east-1b","us-east-1c"]} +... +*/ + +request(aws4.sign({ + service: 'swf', + body: '{"registrationStatus":"REGISTERED"}', + headers: { + 'Content-Type': 'application/x-amz-json-1.0', + 'X-Amz-Target': 'SimpleWorkflowService.ListDomains' + } +})) +/* +{"domainInfos":[]} +... +*/ + +request(aws4.sign({ + service: 'cognito-identity', + body: '{"MaxResults": 1}', + headers: { + 'Content-Type': 'application/x-amz-json-1.1', + 'X-Amz-Target': 'AWSCognitoIdentityService.ListIdentityPools' + } +})) +/* +{"IdentityPools":[]} +... +*/ + +request(aws4.sign({ + service: 'mobileanalytics', + path: '/2014-06-05/events', + body: JSON.stringify({events:[{ + eventType: 'a', + timestamp: new Date().toISOString(), + session: {}, + }]}), + headers: { + 'Content-Type': 'application/json', + 'X-Amz-Client-Context': JSON.stringify({ + client: {client_id: 'a', app_title: 'a'}, + custom: {}, + env: {platform: 'a'}, + services: {}, + }), + } +})) +/* +(HTTP 202, empty response) +*/ + +// Generate CodeCommit Git access password +var signer = new aws4.RequestSigner({ + service: 'codecommit', + host: 'git-codecommit.us-east-1.amazonaws.com', + method: 'GIT', + path: '/v1/repos/MyAwesomeRepo', +}) +var password = signer.getDateTime() + 'Z' + signer.signature() +``` + +API +--- + +### aws4.sign(requestOptions, [credentials]) + +This calculates and populates the `Authorization` header of +`requestOptions`, and any other necessary AWS headers and/or request +options. Returns `requestOptions` as a convenience for chaining. + +`requestOptions` is an object holding the same options that the node.js +[http.request](http://nodejs.org/docs/latest/api/http.html#http_http_request_options_callback) +function takes. + +The following properties of `requestOptions` are used in the signing or +populated if they don't already exist: + +- `hostname` or `host` (will be determined from `service` and `region` if not given) +- `method` (will use `'GET'` if not given or `'POST'` if there is a `body`) +- `path` (will use `'/'` if not given) +- `body` (will use `''` if not given) +- `service` (will be calculated from `hostname` or `host` if not given) +- `region` (will be calculated from `hostname` or `host` or use `'us-east-1'` if not given) +- `headers['Host']` (will use `hostname` or `host` or be calculated if not given) +- `headers['Content-Type']` (will use `'application/x-www-form-urlencoded; charset=utf-8'` + if not given and there is a `body`) +- `headers['Date']` (used to calculate the signature date if given, otherwise `new Date` is used) + +Your AWS credentials (which can be found in your +[AWS console](https://portal.aws.amazon.com/gp/aws/securityCredentials)) +can be specified in one of two ways: + +- As the second argument, like this: + +```javascript +aws4.sign(requestOptions, { + secretAccessKey: "", + accessKeyId: "", + sessionToken: "" +}) +``` + +- From `process.env`, such as this: + +``` +export AWS_SECRET_ACCESS_KEY="" +export AWS_ACCESS_KEY_ID="" +export AWS_SESSION_TOKEN="" +``` + +(will also use `AWS_ACCESS_KEY` and `AWS_SECRET_KEY` if available) + +The `sessionToken` property and `AWS_SESSION_TOKEN` environment variable are optional for signing +with [IAM STS temporary credentials](http://docs.aws.amazon.com/STS/latest/UsingSTS/using-temp-creds.html). + +Installation +------------ + +With [npm](http://npmjs.org/) do: + +``` +npm install aws4 +``` + +Can also be used [in the browser](./browser). + +Thanks +------ + +Thanks to [@jed](https://github.com/jed) for his +[dynamo-client](https://github.com/jed/dynamo-client) lib where I first +committed and subsequently extracted this code. + +Also thanks to the +[official node.js AWS SDK](https://github.com/aws/aws-sdk-js) for giving +me a start on implementing the v4 signature. + diff --git a/node_modules/aws4/aws4.js b/node_modules/aws4/aws4.js new file mode 100644 index 0000000..9014894 --- /dev/null +++ b/node_modules/aws4/aws4.js @@ -0,0 +1,345 @@ +var aws4 = exports, + url = require('url'), + querystring = require('querystring'), + crypto = require('crypto'), + lru = require('./lru'), + credentialsCache = lru(1000) + +// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html + +function hmac(key, string, encoding) { + return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding) +} + +function hash(string, encoding) { + return crypto.createHash('sha256').update(string, 'utf8').digest(encoding) +} + +// This function assumes the string has already been percent encoded +function encodeRfc3986(urlEncodedString) { + return urlEncodedString.replace(/[!'()*]/g, function(c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +function encodeRfc3986Full(str) { + return encodeRfc3986(encodeURIComponent(str)) +} + +// request: { path | body, [host], [method], [headers], [service], [region] } +// credentials: { accessKeyId, secretAccessKey, [sessionToken] } +function RequestSigner(request, credentials) { + + if (typeof request === 'string') request = url.parse(request) + + var headers = request.headers = (request.headers || {}), + hostParts = this.matchHost(request.hostname || request.host || headers.Host || headers.host) + + this.request = request + this.credentials = credentials || this.defaultCredentials() + + this.service = request.service || hostParts[0] || '' + this.region = request.region || hostParts[1] || 'us-east-1' + + // SES uses a different domain from the service name + if (this.service === 'email') this.service = 'ses' + + if (!request.method && request.body) + request.method = 'POST' + + if (!headers.Host && !headers.host) { + headers.Host = request.hostname || request.host || this.createHost() + + // If a port is specified explicitly, use it as is + if (request.port) + headers.Host += ':' + request.port + } + if (!request.hostname && !request.host) + request.hostname = headers.Host || headers.host + + this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT' +} + +RequestSigner.prototype.matchHost = function(host) { + var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/) + var hostParts = (match || []).slice(1, 3) + + // ES's hostParts are sometimes the other way round, if the value that is expected + // to be region equals ‘es’ switch them back + // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com + if (hostParts[1] === 'es') + hostParts = hostParts.reverse() + + return hostParts +} + +// http://docs.aws.amazon.com/general/latest/gr/rande.html +RequestSigner.prototype.isSingleRegion = function() { + // Special case for S3 and SimpleDB in us-east-1 + if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true + + return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts'] + .indexOf(this.service) >= 0 +} + +RequestSigner.prototype.createHost = function() { + var region = this.isSingleRegion() ? '' : + (this.service === 's3' && this.region !== 'us-east-1' ? '-' : '.') + this.region, + service = this.service === 'ses' ? 'email' : this.service + return service + region + '.amazonaws.com' +} + +RequestSigner.prototype.prepareRequest = function() { + this.parsePath() + + var request = this.request, headers = request.headers, query + + if (request.signQuery) { + + this.parsedPath.query = query = this.parsedPath.query || {} + + if (this.credentials.sessionToken) + query['X-Amz-Security-Token'] = this.credentials.sessionToken + + if (this.service === 's3' && !query['X-Amz-Expires']) + query['X-Amz-Expires'] = 86400 + + if (query['X-Amz-Date']) + this.datetime = query['X-Amz-Date'] + else + query['X-Amz-Date'] = this.getDateTime() + + query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256' + query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString() + query['X-Amz-SignedHeaders'] = this.signedHeaders() + + } else { + + if (!request.doNotModifyHeaders && !this.isCodeCommitGit) { + if (request.body && !headers['Content-Type'] && !headers['content-type']) + headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' + + if (request.body && !headers['Content-Length'] && !headers['content-length']) + headers['Content-Length'] = Buffer.byteLength(request.body) + + if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token']) + headers['X-Amz-Security-Token'] = this.credentials.sessionToken + + if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256']) + headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex') + + if (headers['X-Amz-Date'] || headers['x-amz-date']) + this.datetime = headers['X-Amz-Date'] || headers['x-amz-date'] + else + headers['X-Amz-Date'] = this.getDateTime() + } + + delete headers.Authorization + delete headers.authorization + } +} + +RequestSigner.prototype.sign = function() { + if (!this.parsedPath) this.prepareRequest() + + if (this.request.signQuery) { + this.parsedPath.query['X-Amz-Signature'] = this.signature() + } else { + this.request.headers.Authorization = this.authHeader() + } + + this.request.path = this.formatPath() + + return this.request +} + +RequestSigner.prototype.getDateTime = function() { + if (!this.datetime) { + var headers = this.request.headers, + date = new Date(headers.Date || headers.date || new Date) + + this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '') + + // Remove the trailing 'Z' on the timestamp string for CodeCommit git access + if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1) + } + return this.datetime +} + +RequestSigner.prototype.getDate = function() { + return this.getDateTime().substr(0, 8) +} + +RequestSigner.prototype.authHeader = function() { + return [ + 'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(), + 'SignedHeaders=' + this.signedHeaders(), + 'Signature=' + this.signature(), + ].join(', ') +} + +RequestSigner.prototype.signature = function() { + var date = this.getDate(), + cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), + kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey) + if (!kCredentials) { + kDate = hmac('AWS4' + this.credentials.secretAccessKey, date) + kRegion = hmac(kDate, this.region) + kService = hmac(kRegion, this.service) + kCredentials = hmac(kService, 'aws4_request') + credentialsCache.set(cacheKey, kCredentials) + } + return hmac(kCredentials, this.stringToSign(), 'hex') +} + +RequestSigner.prototype.stringToSign = function() { + return [ + 'AWS4-HMAC-SHA256', + this.getDateTime(), + this.credentialString(), + hash(this.canonicalString(), 'hex'), + ].join('\n') +} + +RequestSigner.prototype.canonicalString = function() { + if (!this.parsedPath) this.prepareRequest() + + var pathStr = this.parsedPath.path, + query = this.parsedPath.query, + headers = this.request.headers, + queryStr = '', + normalizePath = this.service !== 's3', + decodePath = this.service === 's3' || this.request.doNotEncodePath, + decodeSlashesInPath = this.service === 's3', + firstValOnly = this.service === 's3', + bodyHash + + if (this.service === 's3' && this.request.signQuery) { + bodyHash = 'UNSIGNED-PAYLOAD' + } else if (this.isCodeCommitGit) { + bodyHash = '' + } else { + bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] || + hash(this.request.body || '', 'hex') + } + + if (query) { + var reducedQuery = Object.keys(query).reduce(function(obj, key) { + if (!key) return obj + obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] : + (firstValOnly ? query[key][0] : query[key]) + return obj + }, {}) + var encodedQueryPieces = [] + Object.keys(reducedQuery).sort().forEach(function(key) { + if (!Array.isArray(reducedQuery[key])) { + encodedQueryPieces.push(key + '=' + encodeRfc3986Full(reducedQuery[key])) + } else { + reducedQuery[key].map(encodeRfc3986Full).sort() + .forEach(function(val) { encodedQueryPieces.push(key + '=' + val) }) + } + }) + queryStr = encodedQueryPieces.join('&') + } + if (pathStr !== '/') { + if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/') + pathStr = pathStr.split('/').reduce(function(path, piece) { + if (normalizePath && piece === '..') { + path.pop() + } else if (!normalizePath || piece !== '.') { + if (decodePath) piece = decodeURIComponent(piece).replace(/\+/g, ' ') + path.push(encodeRfc3986Full(piece)) + } + return path + }, []).join('/') + if (pathStr[0] !== '/') pathStr = '/' + pathStr + if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/') + } + + return [ + this.request.method || 'GET', + pathStr, + queryStr, + this.canonicalHeaders() + '\n', + this.signedHeaders(), + bodyHash, + ].join('\n') +} + +RequestSigner.prototype.canonicalHeaders = function() { + var headers = this.request.headers + function trimAll(header) { + return header.toString().trim().replace(/\s+/g, ' ') + } + return Object.keys(headers) + .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 }) + .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) }) + .join('\n') +} + +RequestSigner.prototype.signedHeaders = function() { + return Object.keys(this.request.headers) + .map(function(key) { return key.toLowerCase() }) + .sort() + .join(';') +} + +RequestSigner.prototype.credentialString = function() { + return [ + this.getDate(), + this.region, + this.service, + 'aws4_request', + ].join('/') +} + +RequestSigner.prototype.defaultCredentials = function() { + var env = process.env + return { + accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY, + secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY, + sessionToken: env.AWS_SESSION_TOKEN, + } +} + +RequestSigner.prototype.parsePath = function() { + var path = this.request.path || '/' + + // S3 doesn't always encode characters > 127 correctly and + // all services don't encode characters > 255 correctly + // So if there are non-reserved chars (and it's not already all % encoded), just encode them all + if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path)) { + path = encodeURI(decodeURI(path)) + } + + var queryIx = path.indexOf('?'), + query = null + + if (queryIx >= 0) { + query = querystring.parse(path.slice(queryIx + 1)) + path = path.slice(0, queryIx) + } + + this.parsedPath = { + path: path, + query: query, + } +} + +RequestSigner.prototype.formatPath = function() { + var path = this.parsedPath.path, + query = this.parsedPath.query + + if (!query) return path + + // Services don't support empty query string keys + if (query[''] != null) delete query[''] + + return path + '?' + encodeRfc3986(querystring.stringify(query)) +} + +aws4.RequestSigner = RequestSigner + +aws4.sign = function(request, credentials) { + return new RequestSigner(request, credentials).sign() +} diff --git a/node_modules/aws4/lru.js b/node_modules/aws4/lru.js new file mode 100644 index 0000000..333f66a --- /dev/null +++ b/node_modules/aws4/lru.js @@ -0,0 +1,96 @@ +module.exports = function(size) { + return new LruCache(size) +} + +function LruCache(size) { + this.capacity = size | 0 + this.map = Object.create(null) + this.list = new DoublyLinkedList() +} + +LruCache.prototype.get = function(key) { + var node = this.map[key] + if (node == null) return undefined + this.used(node) + return node.val +} + +LruCache.prototype.set = function(key, val) { + var node = this.map[key] + if (node != null) { + node.val = val + } else { + if (!this.capacity) this.prune() + if (!this.capacity) return false + node = new DoublyLinkedNode(key, val) + this.map[key] = node + this.capacity-- + } + this.used(node) + return true +} + +LruCache.prototype.used = function(node) { + this.list.moveToFront(node) +} + +LruCache.prototype.prune = function() { + var node = this.list.pop() + if (node != null) { + delete this.map[node.key] + this.capacity++ + } +} + + +function DoublyLinkedList() { + this.firstNode = null + this.lastNode = null +} + +DoublyLinkedList.prototype.moveToFront = function(node) { + if (this.firstNode == node) return + + this.remove(node) + + if (this.firstNode == null) { + this.firstNode = node + this.lastNode = node + node.prev = null + node.next = null + } else { + node.prev = null + node.next = this.firstNode + node.next.prev = node + this.firstNode = node + } +} + +DoublyLinkedList.prototype.pop = function() { + var lastNode = this.lastNode + if (lastNode != null) { + this.remove(lastNode) + } + return lastNode +} + +DoublyLinkedList.prototype.remove = function(node) { + if (this.firstNode == node) { + this.firstNode = node.next + } else if (node.prev != null) { + node.prev.next = node.next + } + if (this.lastNode == node) { + this.lastNode = node.prev + } else if (node.next != null) { + node.next.prev = node.prev + } +} + + +function DoublyLinkedNode(key, val) { + this.key = key + this.val = val + this.prev = null + this.next = null +} diff --git a/node_modules/aws4/package.json b/node_modules/aws4/package.json new file mode 100644 index 0000000..20fb4f1 --- /dev/null +++ b/node_modules/aws4/package.json @@ -0,0 +1,108 @@ +{ + "_args": [ + [ + "aws4@1.9.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "aws4@1.9.1", + "_id": "aws4@1.9.1", + "_inBundle": false, + "_integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "_location": "/aws4", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "aws4@1.9.1", + "name": "aws4", + "escapedName": "aws4", + "rawSpec": "1.9.1", + "saveSpec": null, + "fetchSpec": "1.9.1" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "_spec": "1.9.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Michael Hart", + "email": "michael.hart.au@gmail.com", + "url": "http://github.com/mhart" + }, + "bugs": { + "url": "https://github.com/mhart/aws4/issues" + }, + "description": "Signs and prepares requests using AWS Signature Version 4", + "devDependencies": { + "mocha": "^2.4.5", + "should": "^8.2.2" + }, + "homepage": "https://github.com/mhart/aws4#readme", + "keywords": [ + "amazon", + "aws", + "signature", + "s3", + "ec2", + "autoscaling", + "cloudformation", + "elasticloadbalancing", + "elb", + "elasticbeanstalk", + "cloudsearch", + "dynamodb", + "kinesis", + "lambda", + "glacier", + "sqs", + "sns", + "iam", + "sts", + "ses", + "swf", + "storagegateway", + "datapipeline", + "directconnect", + "redshift", + "opsworks", + "rds", + "monitoring", + "cloudtrail", + "cloudfront", + "codedeploy", + "elasticache", + "elasticmapreduce", + "elastictranscoder", + "emr", + "cloudwatch", + "mobileanalytics", + "cognitoidentity", + "cognitosync", + "cognito", + "containerservice", + "ecs", + "appstream", + "keymanagementservice", + "kms", + "config", + "cloudhsm", + "route53", + "route53domains", + "logs" + ], + "license": "MIT", + "main": "aws4.js", + "name": "aws4", + "repository": { + "type": "git", + "url": "git+https://github.com/mhart/aws4.git" + }, + "scripts": { + "integration": "node ./test/slow.js", + "test": "mocha ./test/fast.js -b -t 100s -R list" + }, + "version": "1.9.1" +} diff --git a/node_modules/balanced-match/.npmignore b/node_modules/balanced-match/.npmignore new file mode 100644 index 0000000..ae5d8c3 --- /dev/null +++ b/node_modules/balanced-match/.npmignore @@ -0,0 +1,5 @@ +test +.gitignore +.travis.yml +Makefile +example.js diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md new file mode 100644 index 0000000..2cdc8e4 --- /dev/null +++ b/node_modules/balanced-match/LICENSE.md @@ -0,0 +1,21 @@ +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.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/balanced-match/README.md b/node_modules/balanced-match/README.md new file mode 100644 index 0000000..08e918c --- /dev/null +++ b/node_modules/balanced-match/README.md @@ -0,0 +1,91 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.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/balanced-match/index.js b/node_modules/balanced-match/index.js new file mode 100644 index 0000000..1685a76 --- /dev/null +++ b/node_modules/balanced-match/index.js @@ -0,0 +1,59 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json new file mode 100644 index 0000000..f115946 --- /dev/null +++ b/node_modules/balanced-match/package.json @@ -0,0 +1,80 @@ +{ + "_args": [ + [ + "balanced-match@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "balanced-match@1.0.0", + "_id": "balanced-match@1.0.0", + "_inBundle": false, + "_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "_location": "/balanced-match", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "balanced-match@1.0.0", + "name": "balanced-match", + "escapedName": "balanced-match", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/brace-expansion" + ], + "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/balanced-match/issues" + }, + "dependencies": {}, + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "license": "MIT", + "main": "index.js", + "name": "balanced-match", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "scripts": { + "bench": "make bench", + "test": "make test" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.0.0" +} diff --git a/node_modules/base/LICENSE b/node_modules/base/LICENSE new file mode 100644 index 0000000..e33d14b --- /dev/null +++ b/node_modules/base/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +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/base/README.md b/node_modules/base/README.md new file mode 100644 index 0000000..c77cdaf --- /dev/null +++ b/node_modules/base/README.md @@ -0,0 +1,491 @@ +

+ + + +

+ +# base [![NPM version](https://img.shields.io/npm/v/base.svg?style=flat)](https://www.npmjs.com/package/base) [![NPM monthly downloads](https://img.shields.io/npm/dm/base.svg?style=flat)](https://npmjs.org/package/base) [![NPM total downloads](https://img.shields.io/npm/dt/base.svg?style=flat)](https://npmjs.org/package/base) [![Linux Build Status](https://img.shields.io/travis/node-base/base.svg?style=flat&label=Travis)](https://travis-ci.org/node-base/base) + +> base is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save base +``` + +## What is Base? + +Base is a framework for rapidly creating high quality node.js applications, using plugins like building blocks. + +### Guiding principles + +The core team follows these principles to help guide API decisions: + +* **Compact API surface**: The smaller the API surface, the easier the library will be to learn and use. +* **Easy to extend**: Implementors can use any npm package, and write plugins in pure JavaScript. If you're building complex apps, Base simplifies inheritance. +* **Easy to test**: No special setup should be required to unit test `Base` or base plugins + +### Minimal API surface + +[The API](#api) was designed to provide only the minimum necessary functionality for creating a useful application, with or without [plugins](#plugins). + +**Base core** + +Base itself ships with only a handful of [useful methods](#api), such as: + +* `.set`: for setting values on the instance +* `.get`: for getting values from the instance +* `.has`: to check if a property exists on the instance +* `.define`: for setting non-enumerable values on the instance +* `.use`: for adding plugins + +**Be generic** + +When deciding on method to add or remove, we try to answer these questions: + +1. Will all or most Base applications need this method? +2. Will this method encourage practices or enforce conventions that are beneficial to implementors? +3. Can or should this be done in a plugin instead? + +### Composability + +**Plugin system** + +It couldn't be easier to extend Base with any features or custom functionality you can think of. + +Base plugins are just functions that take an instance of `Base`: + +```js +var base = new Base(); + +function plugin(base) { + // do plugin stuff, in pure JavaScript +} +// use the plugin +base.use(plugin); +``` + +**Inheritance** + +Easily inherit Base using `.extend`: + +```js +var Base = require('base'); + +function MyApp() { + Base.call(this); +} +Base.extend(MyApp); + +var app = new MyApp(); +app.set('a', 'b'); +app.get('a'); +//=> 'b'; +``` + +**Inherit or instantiate with a namespace** + +By default, the `.get`, `.set` and `.has` methods set and get values from the root of the `base` instance. You can customize this using the `.namespace` method exposed on the exported function. For example: + +```js +var Base = require('base'); +// get and set values on the `base.cache` object +var base = Base.namespace('cache'); + +var app = base(); +app.set('foo', 'bar'); +console.log(app.cache.foo); +//=> 'bar' +``` + +## API + +**Usage** + +```js +var Base = require('base'); +var app = new Base(); +app.set('foo', 'bar'); +console.log(app.foo); +//=> 'bar' +``` + +### [Base](index.js#L44) + +Create an instance of `Base` with the given `config` and `options`. + +**Params** + +* `config` **{Object}**: If supplied, this object is passed to [cache-base](https://github.com/jonschlinkert/cache-base) to merge onto the the instance upon instantiation. +* `options` **{Object}**: If supplied, this object is used to initialize the `base.options` object. + +**Example** + +```js +// initialize with `config` and `options` +var app = new Base({isApp: true}, {abc: true}); +app.set('foo', 'bar'); + +// values defined with the given `config` object will be on the root of the instance +console.log(app.baz); //=> undefined +console.log(app.foo); //=> 'bar' +// or use `.get` +console.log(app.get('isApp')); //=> true +console.log(app.get('foo')); //=> 'bar' + +// values defined with the given `options` object will be on `app.options +console.log(app.options.abc); //=> true +``` + +### [.is](index.js#L107) + +Set the given `name` on `app._name` and `app.is*` properties. Used for doing lookups in plugins. + +**Params** + +* `name` **{String}** +* `returns` **{Boolean}** + +**Example** + +```js +app.is('foo'); +console.log(app._name); +//=> 'foo' +console.log(app.isFoo); +//=> true +app.is('bar'); +console.log(app.isFoo); +//=> true +console.log(app.isBar); +//=> true +console.log(app._name); +//=> 'bar' +``` + +### [.isRegistered](index.js#L145) + +Returns true if a plugin has already been registered on an instance. + +Plugin implementors are encouraged to use this first thing in a plugin +to prevent the plugin from being called more than once on the same +instance. + +**Params** + +* `name` **{String}**: The plugin name. +* `register` **{Boolean}**: If the plugin if not already registered, to record it as being registered pass `true` as the second argument. +* `returns` **{Boolean}**: Returns true if a plugin is already registered. + +**Events** + +* `emits`: `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once. + +**Example** + +```js +var base = new Base(); +base.use(function(app) { + if (app.isRegistered('myPlugin')) return; + // do stuff to `app` +}); + +// to also record the plugin as being registered +base.use(function(app) { + if (app.isRegistered('myPlugin', true)) return; + // do stuff to `app` +}); +``` + +### [.use](index.js#L175) + +Define a plugin function to be called immediately upon init. Plugins are chainable and expose the following arguments to the plugin function: + +* `app`: the current instance of `Base` +* `base`: the [first ancestor instance](#base) of `Base` + +**Params** + +* `fn` **{Function}**: plugin function to call +* `returns` **{Object}**: Returns the item instance for chaining. + +**Example** + +```js +var app = new Base() + .use(foo) + .use(bar) + .use(baz) +``` + +### [.define](index.js#L197) + +The `.define` method is used for adding non-enumerable property on the instance. Dot-notation is **not supported** with `define`. + +**Params** + +* `key` **{String}**: The name of the property to define. +* `value` **{any}** +* `returns` **{Object}**: Returns the instance for chaining. + +**Example** + +```js +// arbitrary `render` function using lodash `template` +app.define('render', function(str, locals) { + return _.template(str)(locals); +}); +``` + +### [.mixin](index.js#L222) + +Mix property `key` onto the Base prototype. If base is inherited using `Base.extend` this method will be overridden by a new `mixin` method that will only add properties to the prototype of the inheriting application. + +**Params** + +* `key` **{String}** +* `val` **{Object|Array}** +* `returns` **{Object}**: Returns the `base` instance for chaining. + +**Example** + +```js +app.mixin('foo', function() { + // do stuff +}); +``` + +### [.base](index.js#L268) + +Getter/setter used when creating nested instances of `Base`, for storing a reference to the first ancestor instance. This works by setting an instance of `Base` on the `parent` property of a "child" instance. The `base` property defaults to the current instance if no `parent` property is defined. + +**Example** + +```js +// create an instance of `Base`, this is our first ("base") instance +var first = new Base(); +first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later + +// create another instance +var second = new Base(); +// create a reference to the first instance (`first`) +second.parent = first; + +// create another instance +var third = new Base(); +// create a reference to the previous instance (`second`) +// repeat this pattern every time a "child" instance is created +third.parent = second; + +// we can always access the first instance using the `base` property +console.log(first.base.foo); +//=> 'bar' +console.log(second.base.foo); +//=> 'bar' +console.log(third.base.foo); +//=> 'bar' +// and now you know how to get to third base ;) +``` + +### [#use](index.js#L293) + +Static method for adding global plugin functions that will be added to an instance when created. + +**Params** + +* `fn` **{Function}**: Plugin function to use on each instance. +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.use(function(app) { + app.foo = 'bar'; +}); +var app = new Base(); +console.log(app.foo); +//=> 'bar' +``` + +### [#extend](index.js#L337) + +Static method for inheriting the prototype and static methods of the `Base` class. This method greatly simplifies the process of creating inheritance-based applications. See [static-extend](https://github.com/jonschlinkert/static-extend) for more details. + +**Params** + +* `Ctor` **{Function}**: constructor to extend +* `methods` **{Object}**: Optional prototype properties to mix in. +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +var extend = cu.extend(Parent); +Parent.extend(Child); + +// optional methods +Parent.extend(Child, { + foo: function() {}, + bar: function() {} +}); +``` + +### [#mixin](index.js#L379) + +Used for adding methods to the `Base` prototype, and/or to the prototype of child instances. When a mixin function returns a function, the returned function is pushed onto the `.mixins` array, making it available to be used on inheriting classes whenever `Base.mixins()` is called (e.g. `Base.mixins(Child)`). + +**Params** + +* `fn` **{Function}**: Function to call +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.mixin(function(proto) { + proto.foo = function(msg) { + return 'foo ' + msg; + }; +}); +``` + +### [#mixins](index.js#L401) + +Static method for running global mixin functions against a child constructor. Mixins must be registered before calling this method. + +**Params** + +* `Child` **{Function}**: Constructor function of a child class +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.extend(Child); +Base.mixins(Child); +``` + +### [#inherit](index.js#L420) + +Similar to `util.inherit`, but copies all static properties, prototype properties, and getters/setters from `Provider` to `Receiver`. See [class-utils](https://github.com/jonschlinkert/class-utils#inherit) for more details. + +**Params** + +* `Receiver` **{Function}**: Receiving (child) constructor +* `Provider` **{Function}**: Providing (parent) constructor +* `returns` **{Object}**: Returns the `Base` constructor for chaining + +**Example** + +```js +Base.inherit(Foo, Bar); +``` + +## In the wild + +The following node.js applications were built with `Base`: + +* [assemble](https://github.com/assemble/assemble) +* [verb](https://github.com/verbose/verb) +* [generate](https://github.com/generate/generate) +* [scaffold](https://github.com/jonschlinkert/scaffold) +* [boilerplate](https://github.com/jonschlinkert/boilerplate) + +## Test coverage + +``` +Statements : 98.91% ( 91/92 ) +Branches : 92.86% ( 26/28 ) +Functions : 100% ( 17/17 ) +Lines : 98.9% ( 90/91 ) +``` + +## History + +### v0.11.2 + +* fixes https://github.com/micromatch/micromatch/issues/99 + +### v0.11.0 + +**Breaking changes** + +* Static `.use` and `.run` methods are now non-enumerable + +### v0.9.0 + +**Breaking changes** + +* `.is` no longer takes a function, a string must be passed +* all remaining `.debug` code has been removed +* `app._namespace` was removed (related to `debug`) +* `.plugin`, `.use`, and `.define` no longer emit events +* `.assertPlugin` was removed +* `.lazy` was removed + +## About + +### Related projects + +* [base-cwd](https://www.npmjs.com/package/base-cwd): Base plugin that adds a getter/setter for the current working directory. | [homepage](https://github.com/node-base/base-cwd "Base plugin that adds a getter/setter for the current working directory.") +* [base-data](https://www.npmjs.com/package/base-data): adds a `data` method to base-methods. | [homepage](https://github.com/node-base/base-data "adds a `data` method to base-methods.") +* [base-fs](https://www.npmjs.com/package/base-fs): base-methods plugin that adds vinyl-fs methods to your 'base' application for working with the file… [more](https://github.com/node-base/base-fs) | [homepage](https://github.com/node-base/base-fs "base-methods plugin that adds vinyl-fs methods to your 'base' application for working with the file system, like src, dest, copy and symlink.") +* [base-generators](https://www.npmjs.com/package/base-generators): Adds project-generator support to your `base` application. | [homepage](https://github.com/node-base/base-generators "Adds project-generator support to your `base` application.") +* [base-option](https://www.npmjs.com/package/base-option): Adds a few options methods to base, like `option`, `enable` and `disable`. See the readme… [more](https://github.com/node-base/base-option) | [homepage](https://github.com/node-base/base-option "Adds a few options methods to base, like `option`, `enable` and `disable`. See the readme for the full API.") +* [base-pipeline](https://www.npmjs.com/package/base-pipeline): base-methods plugin that adds pipeline and plugin methods for dynamically composing streaming plugin pipelines. | [homepage](https://github.com/node-base/base-pipeline "base-methods plugin that adds pipeline and plugin methods for dynamically composing streaming plugin pipelines.") +* [base-pkg](https://www.npmjs.com/package/base-pkg): Plugin for adding a `pkg` method that exposes pkg-store to your base application. | [homepage](https://github.com/node-base/base-pkg "Plugin for adding a `pkg` method that exposes pkg-store to your base application.") +* [base-plugins](https://www.npmjs.com/package/base-plugins): Adds 'smart plugin' support to your base application. | [homepage](https://github.com/node-base/base-plugins "Adds 'smart plugin' support to your base application.") +* [base-questions](https://www.npmjs.com/package/base-questions): Plugin for base-methods that adds methods for prompting the user and storing the answers on… [more](https://github.com/node-base/base-questions) | [homepage](https://github.com/node-base/base-questions "Plugin for base-methods that adds methods for prompting the user and storing the answers on a project-by-project basis.") +* [base-store](https://www.npmjs.com/package/base-store): Plugin for getting and persisting config values with your base-methods application. Adds a 'store' object… [more](https://github.com/node-base/base-store) | [homepage](https://github.com/node-base/base-store "Plugin for getting and persisting config values with your base-methods application. Adds a 'store' object that exposes all of the methods from the data-store library. Also now supports sub-stores!") +* [base-task](https://www.npmjs.com/package/base-task): base plugin that provides a very thin wrapper around [https://github.com/doowb/composer](https://github.com/doowb/composer) for adding task methods to… [more](https://github.com/node-base/base-task) | [homepage](https://github.com/node-base/base-task "base plugin that provides a very thin wrapper around for adding task methods to your application.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 141 | [jonschlinkert](https://github.com/jonschlinkert) | +| 30 | [doowb](https://github.com/doowb) | +| 3 | [charlike](https://github.com/charlike) | +| 1 | [criticalmash](https://github.com/criticalmash) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on September 07, 2017._ \ No newline at end of file diff --git a/node_modules/base/index.js b/node_modules/base/index.js new file mode 100644 index 0000000..fb68048 --- /dev/null +++ b/node_modules/base/index.js @@ -0,0 +1,435 @@ +'use strict'; + +var util = require('util'); +var define = require('define-property'); +var CacheBase = require('cache-base'); +var Emitter = require('component-emitter'); +var isObject = require('isobject'); +var merge = require('mixin-deep'); +var pascal = require('pascalcase'); +var cu = require('class-utils'); + +/** + * Optionally define a custom `cache` namespace to use. + */ + +function namespace(name) { + var Cache = name ? CacheBase.namespace(name) : CacheBase; + var fns = []; + + /** + * Create an instance of `Base` with the given `config` and `options`. + * + * ```js + * // initialize with `config` and `options` + * var app = new Base({isApp: true}, {abc: true}); + * app.set('foo', 'bar'); + * + * // values defined with the given `config` object will be on the root of the instance + * console.log(app.baz); //=> undefined + * console.log(app.foo); //=> 'bar' + * // or use `.get` + * console.log(app.get('isApp')); //=> true + * console.log(app.get('foo')); //=> 'bar' + * + * // values defined with the given `options` object will be on `app.options + * console.log(app.options.abc); //=> true + * ``` + * + * @param {Object} `config` If supplied, this object is passed to [cache-base][] to merge onto the the instance upon instantiation. + * @param {Object} `options` If supplied, this object is used to initialize the `base.options` object. + * @api public + */ + + function Base(config, options) { + if (!(this instanceof Base)) { + return new Base(config, options); + } + Cache.call(this, config); + this.is('base'); + this.initBase(config, options); + } + + /** + * Inherit cache-base + */ + + util.inherits(Base, Cache); + + /** + * Add static emitter methods + */ + + Emitter(Base); + + /** + * Initialize `Base` defaults with the given `config` object + */ + + Base.prototype.initBase = function(config, options) { + this.options = merge({}, this.options, options); + this.cache = this.cache || {}; + this.define('registered', {}); + if (name) this[name] = {}; + + // make `app._callbacks` non-enumerable + this.define('_callbacks', this._callbacks); + if (isObject(config)) { + this.visit('set', config); + } + Base.run(this, 'use', fns); + }; + + /** + * Set the given `name` on `app._name` and `app.is*` properties. Used for doing + * lookups in plugins. + * + * ```js + * app.is('foo'); + * console.log(app._name); + * //=> 'foo' + * console.log(app.isFoo); + * //=> true + * app.is('bar'); + * console.log(app.isFoo); + * //=> true + * console.log(app.isBar); + * //=> true + * console.log(app._name); + * //=> 'bar' + * ``` + * @name .is + * @param {String} `name` + * @return {Boolean} + * @api public + */ + + Base.prototype.is = function(name) { + if (typeof name !== 'string') { + throw new TypeError('expected name to be a string'); + } + this.define('is' + pascal(name), true); + this.define('_name', name); + this.define('_appname', name); + return this; + }; + + /** + * Returns true if a plugin has already been registered on an instance. + * + * Plugin implementors are encouraged to use this first thing in a plugin + * to prevent the plugin from being called more than once on the same + * instance. + * + * ```js + * var base = new Base(); + * base.use(function(app) { + * if (app.isRegistered('myPlugin')) return; + * // do stuff to `app` + * }); + * + * // to also record the plugin as being registered + * base.use(function(app) { + * if (app.isRegistered('myPlugin', true)) return; + * // do stuff to `app` + * }); + * ``` + * @name .isRegistered + * @emits `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once. + * @param {String} `name` The plugin name. + * @param {Boolean} `register` If the plugin if not already registered, to record it as being registered pass `true` as the second argument. + * @return {Boolean} Returns true if a plugin is already registered. + * @api public + */ + + Base.prototype.isRegistered = function(name, register) { + if (this.registered.hasOwnProperty(name)) { + return true; + } + if (register !== false) { + this.registered[name] = true; + this.emit('plugin', name); + } + return false; + }; + + /** + * Define a plugin function to be called immediately upon init. Plugins are chainable + * and expose the following arguments to the plugin function: + * + * - `app`: the current instance of `Base` + * - `base`: the [first ancestor instance](#base) of `Base` + * + * ```js + * var app = new Base() + * .use(foo) + * .use(bar) + * .use(baz) + * ``` + * @name .use + * @param {Function} `fn` plugin function to call + * @return {Object} Returns the item instance for chaining. + * @api public + */ + + Base.prototype.use = function(fn) { + fn.call(this, this); + return this; + }; + + /** + * The `.define` method is used for adding non-enumerable property on the instance. + * Dot-notation is **not supported** with `define`. + * + * ```js + * // arbitrary `render` function using lodash `template` + * app.define('render', function(str, locals) { + * return _.template(str)(locals); + * }); + * ``` + * @name .define + * @param {String} `key` The name of the property to define. + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Base.prototype.define = function(key, val) { + if (isObject(key)) { + return this.visit('define', key); + } + define(this, key, val); + return this; + }; + + /** + * Mix property `key` onto the Base prototype. If base is inherited using + * `Base.extend` this method will be overridden by a new `mixin` method that will + * only add properties to the prototype of the inheriting application. + * + * ```js + * app.mixin('foo', function() { + * // do stuff + * }); + * ``` + * @name .mixin + * @param {String} `key` + * @param {Object|Array} `val` + * @return {Object} Returns the `base` instance for chaining. + * @api public + */ + + Base.prototype.mixin = function(key, val) { + Base.prototype[key] = val; + return this; + }; + + /** + * Non-enumberable mixin array, used by the static [Base.mixin]() method. + */ + + Base.prototype.mixins = Base.prototype.mixins || []; + + /** + * Getter/setter used when creating nested instances of `Base`, for storing a reference + * to the first ancestor instance. This works by setting an instance of `Base` on the `parent` + * property of a "child" instance. The `base` property defaults to the current instance if + * no `parent` property is defined. + * + * ```js + * // create an instance of `Base`, this is our first ("base") instance + * var first = new Base(); + * first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later + * + * // create another instance + * var second = new Base(); + * // create a reference to the first instance (`first`) + * second.parent = first; + * + * // create another instance + * var third = new Base(); + * // create a reference to the previous instance (`second`) + * // repeat this pattern every time a "child" instance is created + * third.parent = second; + * + * // we can always access the first instance using the `base` property + * console.log(first.base.foo); + * //=> 'bar' + * console.log(second.base.foo); + * //=> 'bar' + * console.log(third.base.foo); + * //=> 'bar' + * // and now you know how to get to third base ;) + * ``` + * @name .base + * @api public + */ + + Object.defineProperty(Base.prototype, 'base', { + configurable: true, + get: function() { + return this.parent ? this.parent.base : this; + } + }); + + /** + * Static method for adding global plugin functions that will + * be added to an instance when created. + * + * ```js + * Base.use(function(app) { + * app.foo = 'bar'; + * }); + * var app = new Base(); + * console.log(app.foo); + * //=> 'bar' + * ``` + * @name #use + * @param {Function} `fn` Plugin function to use on each instance. + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'use', function(fn) { + fns.push(fn); + return Base; + }); + + /** + * Run an array of functions by passing each function + * to a method on the given object specified by the given property. + * + * @param {Object} `obj` Object containing method to use. + * @param {String} `prop` Name of the method on the object to use. + * @param {Array} `arr` Array of functions to pass to the method. + */ + + define(Base, 'run', function(obj, prop, arr) { + var len = arr.length, i = 0; + while (len--) { + obj[prop](arr[i++]); + } + return Base; + }); + + /** + * Static method for inheriting the prototype and static methods of the `Base` class. + * This method greatly simplifies the process of creating inheritance-based applications. + * See [static-extend][] for more details. + * + * ```js + * var extend = cu.extend(Parent); + * Parent.extend(Child); + * + * // optional methods + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @name #extend + * @param {Function} `Ctor` constructor to extend + * @param {Object} `methods` Optional prototype properties to mix in. + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'extend', cu.extend(Base, function(Ctor, Parent) { + Ctor.prototype.mixins = Ctor.prototype.mixins || []; + + define(Ctor, 'mixin', function(fn) { + var mixin = fn(Ctor.prototype, Ctor); + if (typeof mixin === 'function') { + Ctor.prototype.mixins.push(mixin); + } + return Ctor; + }); + + define(Ctor, 'mixins', function(Child) { + Base.run(Child, 'mixin', Ctor.prototype.mixins); + return Ctor; + }); + + Ctor.prototype.mixin = function(key, value) { + Ctor.prototype[key] = value; + return this; + }; + return Base; + })); + + /** + * Used for adding methods to the `Base` prototype, and/or to the prototype of child instances. + * When a mixin function returns a function, the returned function is pushed onto the `.mixins` + * array, making it available to be used on inheriting classes whenever `Base.mixins()` is + * called (e.g. `Base.mixins(Child)`). + * + * ```js + * Base.mixin(function(proto) { + * proto.foo = function(msg) { + * return 'foo ' + msg; + * }; + * }); + * ``` + * @name #mixin + * @param {Function} `fn` Function to call + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'mixin', function(fn) { + var mixin = fn(Base.prototype, Base); + if (typeof mixin === 'function') { + Base.prototype.mixins.push(mixin); + } + return Base; + }); + + /** + * Static method for running global mixin functions against a child constructor. + * Mixins must be registered before calling this method. + * + * ```js + * Base.extend(Child); + * Base.mixins(Child); + * ``` + * @name #mixins + * @param {Function} `Child` Constructor function of a child class + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'mixins', function(Child) { + Base.run(Child, 'mixin', Base.prototype.mixins); + return Base; + }); + + /** + * Similar to `util.inherit`, but copies all static properties, prototype properties, and + * getters/setters from `Provider` to `Receiver`. See [class-utils][]{#inherit} for more details. + * + * ```js + * Base.inherit(Foo, Bar); + * ``` + * @name #inherit + * @param {Function} `Receiver` Receiving (child) constructor + * @param {Function} `Provider` Providing (parent) constructor + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'inherit', cu.inherit); + define(Base, 'bubble', cu.bubble); + return Base; +} + +/** + * Expose `Base` with default settings + */ + +module.exports = namespace(); + +/** + * Allow users to define a namespace + */ + +module.exports.namespace = namespace; diff --git a/node_modules/base/node_modules/define-property/LICENSE b/node_modules/base/node_modules/define-property/LICENSE new file mode 100644 index 0000000..ec85897 --- /dev/null +++ b/node_modules/base/node_modules/define-property/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +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/base/node_modules/define-property/README.md b/node_modules/base/node_modules/define-property/README.md new file mode 100644 index 0000000..2f1af05 --- /dev/null +++ b/node_modules/base/node_modules/define-property/README.md @@ -0,0 +1,95 @@ +# define-property [![NPM version](https://img.shields.io/npm/v/define-property.svg?style=flat)](https://www.npmjs.com/package/define-property) [![NPM monthly downloads](https://img.shields.io/npm/dm/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![NPM total downloads](https://img.shields.io/npm/dt/define-property.svg?style=flat)](https://npmjs.org/package/define-property) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/define-property.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/define-property) + +> Define a non-enumerable property on an object. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save define-property +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add define-property +``` + +## Usage + +**Params** + +* `obj`: The object on which to define the property. +* `prop`: The name of the property to be defined or modified. +* `descriptor`: The descriptor for the property being defined or modified. + +```js +var define = require('define-property'); +var obj = {}; +define(obj, 'foo', function(val) { + return val.toUpperCase(); +}); + +console.log(obj); +//=> {} + +console.log(obj.foo('bar')); +//=> 'BAR' +``` + +**get/set** + +```js +define(obj, 'foo', { + get: function() {}, + set: function() {} +}); +``` + +## About + +### Related projects + +* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target… [more](https://github.com/jonschlinkert/assign-deep) | [homepage](https://github.com/jonschlinkert/assign-deep "Deeply assign the enumerable properties and/or es6 Symbol properies of source objects to the target (first) object.") +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow "Extend an object with the properties of additional objects. node.js/javascript util.") +* [merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep "Recursively merge values in a javascript object.") +* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep "Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.5.0, on April 20, 2017._ \ No newline at end of file diff --git a/node_modules/base/node_modules/define-property/index.js b/node_modules/base/node_modules/define-property/index.js new file mode 100644 index 0000000..27c19eb --- /dev/null +++ b/node_modules/base/node_modules/define-property/index.js @@ -0,0 +1,31 @@ +/*! + * define-property + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isDescriptor = require('is-descriptor'); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; diff --git a/node_modules/base/node_modules/define-property/package.json b/node_modules/base/node_modules/define-property/package.json new file mode 100644 index 0000000..d4ae00d --- /dev/null +++ b/node_modules/base/node_modules/define-property/package.json @@ -0,0 +1,96 @@ +{ + "_args": [ + [ + "define-property@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "define-property@1.0.0", + "_id": "define-property@1.0.0", + "_inBundle": false, + "_integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "_location": "/base/define-property", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "define-property@1.0.0", + "name": "define-property", + "escapedName": "define-property", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/base" + ], + "_resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/define-property/issues" + }, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "description": "Define a non-enumerable property on an object.", + "devDependencies": { + "gulp-format-md": "^0.1.12", + "mocha": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/define-property", + "keywords": [ + "define", + "define-property", + "enumerable", + "key", + "non", + "non-enumerable", + "object", + "prop", + "property", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "define-property", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/define-property.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "extend-shallow", + "merge-deep", + "assign-deep", + "mixin-deep" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.0.0" +} diff --git a/node_modules/base/node_modules/is-accessor-descriptor/LICENSE b/node_modules/base/node_modules/is-accessor-descriptor/LICENSE new file mode 100644 index 0000000..e33d14b --- /dev/null +++ b/node_modules/base/node_modules/is-accessor-descriptor/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +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/base/node_modules/is-accessor-descriptor/README.md b/node_modules/base/node_modules/is-accessor-descriptor/README.md new file mode 100644 index 0000000..d198e1f --- /dev/null +++ b/node_modules/base/node_modules/is-accessor-descriptor/README.md @@ -0,0 +1,144 @@ +# is-accessor-descriptor [![NPM version](https://img.shields.io/npm/v/is-accessor-descriptor.svg?style=flat)](https://www.npmjs.com/package/is-accessor-descriptor) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-accessor-descriptor.svg?style=flat)](https://npmjs.org/package/is-accessor-descriptor) [![NPM total downloads](https://img.shields.io/npm/dt/is-accessor-descriptor.svg?style=flat)](https://npmjs.org/package/is-accessor-descriptor) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-accessor-descriptor.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-accessor-descriptor) + +> Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-accessor-descriptor +``` + +## Usage + +```js +var isAccessor = require('is-accessor-descriptor'); + +isAccessor({get: function() {}}); +//=> true +``` + +You may also pass an object and property name to check if the property is an accessor: + +```js +isAccessor(foo, 'bar'); +``` + +## Examples + +`false` when not an object + +```js +isAccessor('a') +isAccessor(null) +isAccessor([]) +//=> false +``` + +`true` when the object has valid properties + +and the properties all have the correct JavaScript types: + +```js +isAccessor({get: noop, set: noop}) +isAccessor({get: noop}) +isAccessor({set: noop}) +//=> true +``` + +`false` when the object has invalid properties + +```js +isAccessor({get: noop, set: noop, bar: 'baz'}) +isAccessor({get: noop, writable: true}) +isAccessor({get: noop, value: true}) +//=> false +``` + +`false` when an accessor is not a function + +```js +isAccessor({get: noop, set: 'baz'}) +isAccessor({get: 'foo', set: noop}) +isAccessor({get: 'foo', bar: 'baz'}) +isAccessor({get: 'foo', set: 'baz'}) +//=> false +``` + +`false` when a value is not the correct type + +```js +isAccessor({get: noop, set: noop, enumerable: 'foo'}) +isAccessor({set: noop, configurable: 'foo'}) +isAccessor({get: noop, configurable: 'foo'}) +//=> false +``` + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Related projects + +You might also be interested in these projects: + +* [is-accessor-descriptor](https://www.npmjs.com/package/is-accessor-descriptor): Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. | [homepage](https://github.com/jonschlinkert/is-accessor-descriptor "Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.") +* [is-data-descriptor](https://www.npmjs.com/package/is-data-descriptor): Returns true if a value has the characteristics of a valid JavaScript data descriptor. | [homepage](https://github.com/jonschlinkert/is-data-descriptor "Returns true if a value has the characteristics of a valid JavaScript data descriptor.") +* [is-descriptor](https://www.npmjs.com/package/is-descriptor): Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for… [more](https://github.com/jonschlinkert/is-descriptor) | [homepage](https://github.com/jonschlinkert/is-descriptor "Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.") +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 22 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [realityking](https://github.com/realityking) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 01, 2017._ \ No newline at end of file diff --git a/node_modules/base/node_modules/is-accessor-descriptor/index.js b/node_modules/base/node_modules/is-accessor-descriptor/index.js new file mode 100644 index 0000000..d2e6fe8 --- /dev/null +++ b/node_modules/base/node_modules/is-accessor-descriptor/index.js @@ -0,0 +1,69 @@ +/*! + * is-accessor-descriptor + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var typeOf = require('kind-of'); + +// accessor descriptor properties +var accessor = { + get: 'function', + set: 'function', + configurable: 'boolean', + enumerable: 'boolean' +}; + +function isAccessorDescriptor(obj, prop) { + if (typeof prop === 'string') { + var val = Object.getOwnPropertyDescriptor(obj, prop); + return typeof val !== 'undefined'; + } + + if (typeOf(obj) !== 'object') { + return false; + } + + if (has(obj, 'value') || has(obj, 'writable')) { + return false; + } + + if (!has(obj, 'get') || typeof obj.get !== 'function') { + return false; + } + + // tldr: it's valid to have "set" be undefined + // "set" might be undefined if `Object.getOwnPropertyDescriptor` + // was used to get the value, and only `get` was defined by the user + if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') { + return false; + } + + for (var key in obj) { + if (!accessor.hasOwnProperty(key)) { + continue; + } + + if (typeOf(obj[key]) === accessor[key]) { + continue; + } + + if (typeof obj[key] !== 'undefined') { + return false; + } + } + return true; +} + +function has(obj, key) { + return {}.hasOwnProperty.call(obj, key); +} + +/** + * Expose `isAccessorDescriptor` + */ + +module.exports = isAccessorDescriptor; diff --git a/node_modules/base/node_modules/is-accessor-descriptor/package.json b/node_modules/base/node_modules/is-accessor-descriptor/package.json new file mode 100644 index 0000000..981541d --- /dev/null +++ b/node_modules/base/node_modules/is-accessor-descriptor/package.json @@ -0,0 +1,113 @@ +{ + "_args": [ + [ + "is-accessor-descriptor@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "is-accessor-descriptor@1.0.0", + "_id": "is-accessor-descriptor@1.0.0", + "_inBundle": false, + "_integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "_location": "/base/is-accessor-descriptor", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "is-accessor-descriptor@1.0.0", + "name": "is-accessor-descriptor", + "escapedName": "is-accessor-descriptor", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/base/is-descriptor" + ], + "_resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/is-accessor-descriptor/issues" + }, + "contributors": [ + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Rouven Weßling", + "url": "www.rouvenwessling.de" + } + ], + "dependencies": { + "kind-of": "^6.0.0" + }, + "description": "Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/is-accessor-descriptor", + "keywords": [ + "accessor", + "check", + "data", + "descriptor", + "get", + "getter", + "is", + "keys", + "object", + "properties", + "property", + "set", + "setter", + "type", + "valid", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "is-accessor-descriptor", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/is-accessor-descriptor.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "is-accessor-descriptor", + "is-data-descriptor", + "is-descriptor", + "is-plain-object", + "isobject" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "1.0.0" +} diff --git a/node_modules/base/node_modules/is-data-descriptor/LICENSE b/node_modules/base/node_modules/is-data-descriptor/LICENSE new file mode 100644 index 0000000..e33d14b --- /dev/null +++ b/node_modules/base/node_modules/is-data-descriptor/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +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/base/node_modules/is-data-descriptor/README.md b/node_modules/base/node_modules/is-data-descriptor/README.md new file mode 100644 index 0000000..42b0714 --- /dev/null +++ b/node_modules/base/node_modules/is-data-descriptor/README.md @@ -0,0 +1,161 @@ +# is-data-descriptor [![NPM version](https://img.shields.io/npm/v/is-data-descriptor.svg?style=flat)](https://www.npmjs.com/package/is-data-descriptor) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-data-descriptor.svg?style=flat)](https://npmjs.org/package/is-data-descriptor) [![NPM total downloads](https://img.shields.io/npm/dt/is-data-descriptor.svg?style=flat)](https://npmjs.org/package/is-data-descriptor) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-data-descriptor.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-data-descriptor) + +> Returns true if a value has the characteristics of a valid JavaScript data descriptor. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-data-descriptor +``` + +## Usage + +```js +var isDataDesc = require('is-data-descriptor'); +``` + +## Examples + +`true` when the descriptor has valid properties with valid values. + +```js +// `value` can be anything +isDataDesc({value: 'foo'}) +isDataDesc({value: function() {}}) +isDataDesc({value: true}) +//=> true +``` + +`false` when not an object + +```js +isDataDesc('a') +//=> false +isDataDesc(null) +//=> false +isDataDesc([]) +//=> false +``` + +`false` when the object has invalid properties + +```js +isDataDesc({value: 'foo', bar: 'baz'}) +//=> false +isDataDesc({value: 'foo', bar: 'baz'}) +//=> false +isDataDesc({value: 'foo', get: function(){}}) +//=> false +isDataDesc({get: function(){}, value: 'foo'}) +//=> false +``` + +`false` when a value is not the correct type + +```js +isDataDesc({value: 'foo', enumerable: 'foo'}) +//=> false +isDataDesc({value: 'foo', configurable: 'foo'}) +//=> false +isDataDesc({value: 'foo', writable: 'foo'}) +//=> false +``` + +## Valid properties + +The only valid data descriptor properties are the following: + +* `configurable` (required) +* `enumerable` (required) +* `value` (optional) +* `writable` (optional) + +To be a valid data descriptor, either `value` or `writable` must be defined. + +**Invalid properties** + +A descriptor may have additional _invalid_ properties (an error will **not** be thrown). + +```js +var foo = {}; + +Object.defineProperty(foo, 'bar', { + enumerable: true, + whatever: 'blah', // invalid, but doesn't cause an error + get: function() { + return 'baz'; + } +}); + +console.log(foo.bar); +//=> 'baz' +``` + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Related projects + +You might also be interested in these projects: + +* [is-accessor-descriptor](https://www.npmjs.com/package/is-accessor-descriptor): Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. | [homepage](https://github.com/jonschlinkert/is-accessor-descriptor "Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.") +* [is-data-descriptor](https://www.npmjs.com/package/is-data-descriptor): Returns true if a value has the characteristics of a valid JavaScript data descriptor. | [homepage](https://github.com/jonschlinkert/is-data-descriptor "Returns true if a value has the characteristics of a valid JavaScript data descriptor.") +* [is-descriptor](https://www.npmjs.com/package/is-descriptor): Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for… [more](https://github.com/jonschlinkert/is-descriptor) | [homepage](https://github.com/jonschlinkert/is-descriptor "Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 21 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [realityking](https://github.com/realityking) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 01, 2017._ \ No newline at end of file diff --git a/node_modules/base/node_modules/is-data-descriptor/index.js b/node_modules/base/node_modules/is-data-descriptor/index.js new file mode 100644 index 0000000..cfeae36 --- /dev/null +++ b/node_modules/base/node_modules/is-data-descriptor/index.js @@ -0,0 +1,49 @@ +/*! + * is-data-descriptor + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var typeOf = require('kind-of'); + +module.exports = function isDataDescriptor(obj, prop) { + // data descriptor properties + var data = { + configurable: 'boolean', + enumerable: 'boolean', + writable: 'boolean' + }; + + if (typeOf(obj) !== 'object') { + return false; + } + + if (typeof prop === 'string') { + var val = Object.getOwnPropertyDescriptor(obj, prop); + return typeof val !== 'undefined'; + } + + if (!('value' in obj) && !('writable' in obj)) { + return false; + } + + for (var key in obj) { + if (key === 'value') continue; + + if (!data.hasOwnProperty(key)) { + continue; + } + + if (typeOf(obj[key]) === data[key]) { + continue; + } + + if (typeof obj[key] !== 'undefined') { + return false; + } + } + return true; +}; diff --git a/node_modules/base/node_modules/is-data-descriptor/package.json b/node_modules/base/node_modules/is-data-descriptor/package.json new file mode 100644 index 0000000..d58b448 --- /dev/null +++ b/node_modules/base/node_modules/is-data-descriptor/package.json @@ -0,0 +1,112 @@ +{ + "_args": [ + [ + "is-data-descriptor@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "is-data-descriptor@1.0.0", + "_id": "is-data-descriptor@1.0.0", + "_inBundle": false, + "_integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "_location": "/base/is-data-descriptor", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "is-data-descriptor@1.0.0", + "name": "is-data-descriptor", + "escapedName": "is-data-descriptor", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/base/is-descriptor" + ], + "_resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/is-data-descriptor/issues" + }, + "contributors": [ + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Rouven Weßling", + "url": "www.rouvenwessling.de" + } + ], + "dependencies": { + "kind-of": "^6.0.0" + }, + "description": "Returns true if a value has the characteristics of a valid JavaScript data descriptor.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/is-data-descriptor", + "keywords": [ + "accessor", + "check", + "data", + "descriptor", + "get", + "getter", + "is", + "keys", + "object", + "properties", + "property", + "set", + "setter", + "type", + "valid", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "is-data-descriptor", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/is-data-descriptor.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "is-accessor-descriptor", + "is-data-descriptor", + "is-descriptor", + "isobject" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "1.0.0" +} diff --git a/node_modules/base/node_modules/is-descriptor/LICENSE b/node_modules/base/node_modules/is-descriptor/LICENSE new file mode 100644 index 0000000..c0d7f13 --- /dev/null +++ b/node_modules/base/node_modules/is-descriptor/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +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/base/node_modules/is-descriptor/README.md b/node_modules/base/node_modules/is-descriptor/README.md new file mode 100644 index 0000000..658e533 --- /dev/null +++ b/node_modules/base/node_modules/is-descriptor/README.md @@ -0,0 +1,193 @@ +# is-descriptor [![NPM version](https://img.shields.io/npm/v/is-descriptor.svg?style=flat)](https://www.npmjs.com/package/is-descriptor) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-descriptor.svg?style=flat)](https://npmjs.org/package/is-descriptor) [![NPM total downloads](https://img.shields.io/npm/dt/is-descriptor.svg?style=flat)](https://npmjs.org/package/is-descriptor) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-descriptor.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-descriptor) + +> Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-descriptor +``` + +## Usage + +```js +var isDescriptor = require('is-descriptor'); + +isDescriptor({value: 'foo'}) +//=> true +isDescriptor({get: function(){}, set: function(){}}) +//=> true +isDescriptor({get: 'foo', set: function(){}}) +//=> false +``` + +You may also check for a descriptor by passing an object as the first argument and property name (`string`) as the second argument. + +```js +var obj = {}; +obj.foo = 'abc'; + +Object.defineProperty(obj, 'bar', { + value: 'xyz' +}); + +isDescriptor(obj, 'foo'); +//=> true +isDescriptor(obj, 'bar'); +//=> true +``` + +## Examples + +### value type + +`false` when not an object + +```js +isDescriptor('a'); +//=> false +isDescriptor(null); +//=> false +isDescriptor([]); +//=> false +``` + +### data descriptor + +`true` when the object has valid properties with valid values. + +```js +isDescriptor({value: 'foo'}); +//=> true +isDescriptor({value: noop}); +//=> true +``` + +`false` when the object has invalid properties + +```js +isDescriptor({value: 'foo', bar: 'baz'}); +//=> false +isDescriptor({value: 'foo', bar: 'baz'}); +//=> false +isDescriptor({value: 'foo', get: noop}); +//=> false +isDescriptor({get: noop, value: noop}); +//=> false +``` + +`false` when a value is not the correct type + +```js +isDescriptor({value: 'foo', enumerable: 'foo'}); +//=> false +isDescriptor({value: 'foo', configurable: 'foo'}); +//=> false +isDescriptor({value: 'foo', writable: 'foo'}); +//=> false +``` + +### accessor descriptor + +`true` when the object has valid properties with valid values. + +```js +isDescriptor({get: noop, set: noop}); +//=> true +isDescriptor({get: noop}); +//=> true +isDescriptor({set: noop}); +//=> true +``` + +`false` when the object has invalid properties + +```js +isDescriptor({get: noop, set: noop, bar: 'baz'}); +//=> false +isDescriptor({get: noop, writable: true}); +//=> false +isDescriptor({get: noop, value: true}); +//=> false +``` + +`false` when an accessor is not a function + +```js +isDescriptor({get: noop, set: 'baz'}); +//=> false +isDescriptor({get: 'foo', set: noop}); +//=> false +isDescriptor({get: 'foo', bar: 'baz'}); +//=> false +isDescriptor({get: 'foo', set: 'baz'}); +//=> false +``` + +`false` when a value is not the correct type + +```js +isDescriptor({get: noop, set: noop, enumerable: 'foo'}); +//=> false +isDescriptor({set: noop, configurable: 'foo'}); +//=> false +isDescriptor({get: noop, configurable: 'foo'}); +//=> false +``` + +## About + +### Related projects + +* [is-accessor-descriptor](https://www.npmjs.com/package/is-accessor-descriptor): Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. | [homepage](https://github.com/jonschlinkert/is-accessor-descriptor "Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.") +* [is-data-descriptor](https://www.npmjs.com/package/is-data-descriptor): Returns true if a value has the characteristics of a valid JavaScript data descriptor. | [homepage](https://github.com/jonschlinkert/is-data-descriptor "Returns true if a value has the characteristics of a valid JavaScript data descriptor.") +* [is-descriptor](https://www.npmjs.com/package/is-descriptor): Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for… [more](https://github.com/jonschlinkert/is-descriptor) | [homepage](https://github.com/jonschlinkert/is-descriptor "Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 24 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [doowb](https://github.com/doowb) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 22, 2017._ \ No newline at end of file diff --git a/node_modules/base/node_modules/is-descriptor/index.js b/node_modules/base/node_modules/is-descriptor/index.js new file mode 100644 index 0000000..c9b91d7 --- /dev/null +++ b/node_modules/base/node_modules/is-descriptor/index.js @@ -0,0 +1,22 @@ +/*! + * is-descriptor + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var typeOf = require('kind-of'); +var isAccessor = require('is-accessor-descriptor'); +var isData = require('is-data-descriptor'); + +module.exports = function isDescriptor(obj, key) { + if (typeOf(obj) !== 'object') { + return false; + } + if ('get' in obj) { + return isAccessor(obj, key); + } + return isData(obj, key); +}; diff --git a/node_modules/base/node_modules/is-descriptor/package.json b/node_modules/base/node_modules/is-descriptor/package.json new file mode 100644 index 0000000..51659c0 --- /dev/null +++ b/node_modules/base/node_modules/is-descriptor/package.json @@ -0,0 +1,117 @@ +{ + "_args": [ + [ + "is-descriptor@1.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "is-descriptor@1.0.2", + "_id": "is-descriptor@1.0.2", + "_inBundle": false, + "_integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "_location": "/base/is-descriptor", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "is-descriptor@1.0.2", + "name": "is-descriptor", + "escapedName": "is-descriptor", + "rawSpec": "1.0.2", + "saveSpec": null, + "fetchSpec": "1.0.2" + }, + "_requiredBy": [ + "/base/define-property" + ], + "_resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "_spec": "1.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/is-descriptor/issues" + }, + "contributors": [ + { + "name": "Brian Woodward", + "url": "https://twitter.com/doowb" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "url": "https://github.com/wtgtybhertgeghgtwtg" + } + ], + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "description": "Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/is-descriptor", + "keywords": [ + "accessor", + "check", + "data", + "descriptor", + "get", + "getter", + "is", + "keys", + "object", + "properties", + "property", + "set", + "setter", + "type", + "valid", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "is-descriptor", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/is-descriptor.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "is-accessor-descriptor", + "is-data-descriptor", + "is-descriptor", + "isobject" + ] + }, + "plugins": [ + "gulp-format-md" + ], + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.0.2" +} diff --git a/node_modules/base/package.json b/node_modules/base/package.json new file mode 100644 index 0000000..0f9f70a --- /dev/null +++ b/node_modules/base/package.json @@ -0,0 +1,167 @@ +{ + "_args": [ + [ + "base@0.11.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "base@0.11.2", + "_id": "base@0.11.2", + "_inBundle": false, + "_integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "_location": "/base", + "_phantomChildren": { + "kind-of": "6.0.3" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "base@0.11.2", + "name": "base", + "escapedName": "base", + "rawSpec": "0.11.2", + "saveSpec": null, + "fetchSpec": "0.11.2" + }, + "_requiredBy": [ + "/snapdragon" + ], + "_resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "_spec": "0.11.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/node-base/base/issues" + }, + "contributors": [ + { + "name": "Brian Woodward", + "url": "https://twitter.com/doowb" + }, + { + "name": "John O'Donnell", + "url": "https://github.com/criticalmash" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "tunnckoCore", + "url": "https://i.am.charlike.online" + }, + { + "url": "https://github.com/wtgtybhertgeghgtwtg" + } + ], + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "description": "base is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`.", + "devDependencies": { + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^1.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "helper-coverage": "^0.1.3", + "mocha": "^3.5.0", + "should": "^13.0.1", + "through2": "^2.0.3", + "verb-generate-readme": "^0.6.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/node-base/base", + "keywords": [ + "base", + "boilerplate", + "cache", + "del", + "get", + "inherit", + "methods", + "set", + "starter", + "unset", + "visit" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "Brian Woodward", + "url": "https://github.com/doowb" + }, + { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + } + ], + "name": "base", + "repository": { + "type": "git", + "url": "git+https://github.com/node-base/base.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "helpers": [ + "helper-coverage" + ], + "related": { + "description": "There are a number of different plugins available for extending base. Let us know if you create your own!", + "hightlight": "generate", + "list": [ + "base-cwd", + "base-data", + "base-fs", + "base-generators", + "base-option", + "base-pipeline", + "base-pkg", + "base-plugins", + "base-questions", + "base-store", + "base-task" + ] + }, + "reflinks": [ + "assemble", + "boilerplate", + "cache-base", + "class-utils", + "generate", + "scaffold", + "static-extend", + "verb" + ], + "lint": { + "reflinks": true + } + }, + "version": "0.11.2" +} diff --git a/node_modules/bcrypt-pbkdf/CONTRIBUTING.md b/node_modules/bcrypt-pbkdf/CONTRIBUTING.md new file mode 100644 index 0000000..401d34e --- /dev/null +++ b/node_modules/bcrypt-pbkdf/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/node_modules/bcrypt-pbkdf/LICENSE b/node_modules/bcrypt-pbkdf/LICENSE new file mode 100644 index 0000000..fc58d2a --- /dev/null +++ b/node_modules/bcrypt-pbkdf/LICENSE @@ -0,0 +1,66 @@ +The Blowfish portions are under the following license: + +Blowfish block cipher for OpenBSD +Copyright 1997 Niels Provos +All rights reserved. + +Implementation advice by David Mazieres . + +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. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +The bcrypt_pbkdf portions are under the following license: + +Copyright (c) 2013 Ted Unangst + +Permission to use, copy, modify, and 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. + + + +Performance improvements (Javascript-specific): + +Copyright 2016, Joyent Inc +Author: Alex Wilson + +Permission to use, copy, modify, and 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/bcrypt-pbkdf/README.md b/node_modules/bcrypt-pbkdf/README.md new file mode 100644 index 0000000..7551f33 --- /dev/null +++ b/node_modules/bcrypt-pbkdf/README.md @@ -0,0 +1,45 @@ +Port of the OpenBSD `bcrypt_pbkdf` function to pure Javascript. `npm`-ified +version of [Devi Mandiri's port](https://github.com/devi/tmp/blob/master/js/bcrypt_pbkdf.js), +with some minor performance improvements. The code is copied verbatim (and +un-styled) from Devi's work. + +This product includes software developed by Niels Provos. + +## API + +### `bcrypt_pbkdf.pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds)` + +Derive a cryptographic key of arbitrary length from a given password and salt, +using the OpenBSD `bcrypt_pbkdf` function. This is a combination of Blowfish and +SHA-512. + +See [this article](http://www.tedunangst.com/flak/post/bcrypt-pbkdf) for +further information. + +Parameters: + + * `pass`, a Uint8Array of length `passlen` + * `passlen`, an integer Number + * `salt`, a Uint8Array of length `saltlen` + * `saltlen`, an integer Number + * `key`, a Uint8Array of length `keylen`, will be filled with output + * `keylen`, an integer Number + * `rounds`, an integer Number, number of rounds of the PBKDF to run + +### `bcrypt_pbkdf.hash(sha2pass, sha2salt, out)` + +Calculate a Blowfish hash, given SHA2-512 output of a password and salt. Used as +part of the inner round function in the PBKDF. + +Parameters: + + * `sha2pass`, a Uint8Array of length 64 + * `sha2salt`, a Uint8Array of length 64 + * `out`, a Uint8Array of length 32, will be filled with output + +## License + +This source form is a 1:1 port from the OpenBSD `blowfish.c` and `bcrypt_pbkdf.c`. +As a result, it retains the original copyright and license. The two files are +under slightly different (but compatible) licenses, and are here combined in +one file. For each of the full license texts see `LICENSE`. diff --git a/node_modules/bcrypt-pbkdf/index.js b/node_modules/bcrypt-pbkdf/index.js new file mode 100644 index 0000000..b1b5ad4 --- /dev/null +++ b/node_modules/bcrypt-pbkdf/index.js @@ -0,0 +1,556 @@ +'use strict'; + +var crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash; + +/* + * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a + * result, it retains the original copyright and license. The two files are + * under slightly different (but compatible) licenses, and are here combined in + * one file. + * + * Credit for the actual porting work goes to: + * Devi Mandiri + */ + +/* + * The Blowfish portions are under the following license: + * + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Implementation advice by David Mazieres . + * + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * The bcrypt_pbkdf portions are under the following license: + * + * Copyright (c) 2013 Ted Unangst + * + * Permission to use, copy, modify, and 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. + */ + +/* + * Performance improvements (Javascript-specific): + * + * Copyright 2016, Joyent Inc + * Author: Alex Wilson + * + * Permission to use, copy, modify, and 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. + */ + +// Ported from OpenBSD bcrypt_pbkdf.c v1.9 + +var BLF_J = 0; + +var Blowfish = function() { + this.S = [ + new Uint32Array([ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]), + new Uint32Array([ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]), + new Uint32Array([ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]), + new Uint32Array([ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]) + ]; + this.P = new Uint32Array([ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b]); +}; + +function F(S, x8, i) { + return (((S[0][x8[i+3]] + + S[1][x8[i+2]]) ^ + S[2][x8[i+1]]) + + S[3][x8[i]]); +}; + +Blowfish.prototype.encipher = function(x, x8) { + if (x8 === undefined) { + x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + } + x[0] ^= this.P[0]; + for (var i = 1; i < 16; i += 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i+1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[17]; + x[1] = t; +}; + +Blowfish.prototype.decipher = function(x) { + var x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + x[0] ^= this.P[17]; + for (var i = 16; i > 0; i -= 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i-1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[0]; + x[1] = t; +}; + +function stream2word(data, databytes){ + var i, temp = 0; + for (i = 0; i < 4; i++, BLF_J++) { + if (BLF_J >= databytes) BLF_J = 0; + temp = (temp << 8) | data[BLF_J]; + } + return temp; +}; + +Blowfish.prototype.expand0state = function(key, keybytes) { + var d = new Uint32Array(2), i, k; + var d8 = new Uint8Array(d.buffer); + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + BLF_J = 0; + + for (i = 0; i < 18; i += 2) { + this.encipher(d, d8); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + this.encipher(d, d8); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } +}; + +Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) { + var d = new Uint32Array(2), i, k; + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + + for (i = 0, BLF_J = 0; i < 18; i += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } + BLF_J = 0; +}; + +Blowfish.prototype.enc = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.encipher(data.subarray(i*2)); + } +}; + +Blowfish.prototype.dec = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.decipher(data.subarray(i*2)); + } +}; + +var BCRYPT_BLOCKS = 8, + BCRYPT_HASHSIZE = 32; + +function bcrypt_hash(sha2pass, sha2salt, out) { + var state = new Blowfish(), + cdata = new Uint32Array(BCRYPT_BLOCKS), i, + ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105, + 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109, + 105,116,101]); //"OxychromaticBlowfishSwatDynamite" + + state.expandstate(sha2salt, 64, sha2pass, 64); + for (i = 0; i < 64; i++) { + state.expand0state(sha2salt, 64); + state.expand0state(sha2pass, 64); + } + + for (i = 0; i < BCRYPT_BLOCKS; i++) + cdata[i] = stream2word(ciphertext, ciphertext.byteLength); + for (i = 0; i < 64; i++) + state.enc(cdata, cdata.byteLength / 8); + + for (i = 0; i < BCRYPT_BLOCKS; i++) { + out[4*i+3] = cdata[i] >>> 24; + out[4*i+2] = cdata[i] >>> 16; + out[4*i+1] = cdata[i] >>> 8; + out[4*i+0] = cdata[i]; + } +}; + +function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) { + var sha2pass = new Uint8Array(64), + sha2salt = new Uint8Array(64), + out = new Uint8Array(BCRYPT_HASHSIZE), + tmpout = new Uint8Array(BCRYPT_HASHSIZE), + countsalt = new Uint8Array(saltlen+4), + i, j, amt, stride, dest, count, + origkeylen = keylen; + + if (rounds < 1) + return -1; + if (passlen === 0 || saltlen === 0 || keylen === 0 || + keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20)) + return -1; + + stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength); + amt = Math.floor((keylen + stride - 1) / stride); + + for (i = 0; i < saltlen; i++) + countsalt[i] = salt[i]; + + crypto_hash_sha512(sha2pass, pass, passlen); + + for (count = 1; keylen > 0; count++) { + countsalt[saltlen+0] = count >>> 24; + countsalt[saltlen+1] = count >>> 16; + countsalt[saltlen+2] = count >>> 8; + countsalt[saltlen+3] = count; + + crypto_hash_sha512(sha2salt, countsalt, saltlen + 4); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (i = out.byteLength; i--;) + out[i] = tmpout[i]; + + for (i = 1; i < rounds; i++) { + crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (j = 0; j < out.byteLength; j++) + out[j] ^= tmpout[j]; + } + + amt = Math.min(amt, keylen); + for (i = 0; i < amt; i++) { + dest = i * stride + (count - 1); + if (dest >= origkeylen) + break; + key[dest] = out[i]; + } + keylen -= i; + } + + return 0; +}; + +module.exports = { + BLOCKS: BCRYPT_BLOCKS, + HASHSIZE: BCRYPT_HASHSIZE, + hash: bcrypt_hash, + pbkdf: bcrypt_pbkdf +}; diff --git a/node_modules/bcrypt-pbkdf/package.json b/node_modules/bcrypt-pbkdf/package.json new file mode 100644 index 0000000..c44d7aa --- /dev/null +++ b/node_modules/bcrypt-pbkdf/package.json @@ -0,0 +1,47 @@ +{ + "_args": [ + [ + "bcrypt-pbkdf@1.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "bcrypt-pbkdf@1.0.2", + "_id": "bcrypt-pbkdf@1.0.2", + "_inBundle": false, + "_integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "_location": "/bcrypt-pbkdf", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "bcrypt-pbkdf@1.0.2", + "name": "bcrypt-pbkdf", + "escapedName": "bcrypt-pbkdf", + "rawSpec": "1.0.2", + "saveSpec": null, + "fetchSpec": "1.0.2" + }, + "_requiredBy": [ + "/sshpk" + ], + "_resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "_spec": "1.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/joyent/node-bcrypt-pbkdf/issues" + }, + "dependencies": { + "tweetnacl": "^0.14.3" + }, + "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS", + "devDependencies": {}, + "homepage": "https://github.com/joyent/node-bcrypt-pbkdf#readme", + "license": "BSD-3-Clause", + "main": "index.js", + "name": "bcrypt-pbkdf", + "repository": { + "type": "git", + "url": "git://github.com/joyent/node-bcrypt-pbkdf.git" + }, + "version": "1.0.2" +} diff --git a/node_modules/binary-extensions/binary-extensions.json b/node_modules/binary-extensions/binary-extensions.json new file mode 100644 index 0000000..725e532 --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,252 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "oga", + "ogg", + "ogv", + "otf", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" +] diff --git a/node_modules/binary-extensions/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts new file mode 100644 index 0000000..94a248c --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json.d.ts @@ -0,0 +1,3 @@ +declare const binaryExtensionsJson: readonly string[]; + +export = binaryExtensionsJson; diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts new file mode 100644 index 0000000..f469ac5 --- /dev/null +++ b/node_modules/binary-extensions/index.d.ts @@ -0,0 +1,14 @@ +/** +List of binary file extensions. + +@example +``` +import binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` +*/ +declare const binaryExtensions: readonly string[]; + +export = binaryExtensions; diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js new file mode 100644 index 0000000..d46e468 --- /dev/null +++ b/node_modules/binary-extensions/index.js @@ -0,0 +1 @@ +module.exports = require('./binary-extensions.json'); diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license new file mode 100644 index 0000000..401b1c7 --- /dev/null +++ b/node_modules/binary-extensions/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.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/binary-extensions/package.json b/node_modules/binary-extensions/package.json new file mode 100644 index 0000000..ee73516 --- /dev/null +++ b/node_modules/binary-extensions/package.json @@ -0,0 +1,74 @@ +{ + "_args": [ + [ + "binary-extensions@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "binary-extensions@2.0.0", + "_id": "binary-extensions@2.0.0", + "_inBundle": false, + "_integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "_location": "/binary-extensions", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "binary-extensions@2.0.0", + "name": "binary-extensions", + "escapedName": "binary-extensions", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/is-binary-path" + ], + "_resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/binary-extensions/issues" + }, + "description": "List of binary file extensions", + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + }, + "engines": { + "node": ">=8" + }, + "files": [ + "index.js", + "index.d.ts", + "binary-extensions.json", + "binary-extensions.json.d.ts" + ], + "homepage": "https://github.com/sindresorhus/binary-extensions#readme", + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "license": "MIT", + "name": "binary-extensions", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/binary-extensions.git" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "version": "2.0.0" +} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md new file mode 100644 index 0000000..8d711fa --- /dev/null +++ b/node_modules/binary-extensions/readme.md @@ -0,0 +1,33 @@ +# binary-extensions [![Build Status](https://travis-ci.org/sindresorhus/binary-extensions.svg?branch=master)](https://travis-ci.org/sindresorhus/binary-extensions) + +> List of binary file extensions + +The list is just a [JSON file](binary-extensions.json) and can be used anywhere. + + +## Install + +``` +$ npm install binary-extensions +``` + + +## Usage + +```js +const binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` + + +## Related + +- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file +- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com) diff --git a/node_modules/bluebird/LICENSE b/node_modules/bluebird/LICENSE new file mode 100644 index 0000000..b24e635 --- /dev/null +++ b/node_modules/bluebird/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2018 Petka Antonov + +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/bluebird/README.md b/node_modules/bluebird/README.md new file mode 100644 index 0000000..7c1dd66 --- /dev/null +++ b/node_modules/bluebird/README.md @@ -0,0 +1,57 @@ + + Promises/A+ logo + + + +[![Build Status](https://travis-ci.org/petkaantonov/bluebird.svg?branch=master)](https://travis-ci.org/petkaantonov/bluebird) +[![coverage-98%](https://img.shields.io/badge/coverage-98%25-brightgreen.svg?style=flat)](http://petkaantonov.github.io/bluebird/coverage/debug/index.html) + +**Got a question?** Join us on [stackoverflow](http://stackoverflow.com/questions/tagged/bluebird), the [mailing list](https://groups.google.com/forum/#!forum/bluebird-js) or chat on [IRC](https://webchat.freenode.net/?channels=#promises) + +# Introduction + +Bluebird is a fully featured promise library with focus on innovative features and performance + +See the [**bluebird website**](http://bluebirdjs.com/docs/getting-started.html) for further documentation, references and instructions. See the [**API reference**](http://bluebirdjs.com/docs/api-reference.html) here. + +For bluebird 2.x documentation and files, see the [2.x tree](https://github.com/petkaantonov/bluebird/tree/2.x). + +### Note + +Promises in Node.js 10 are significantly faster than before. Bluebird still includes a lot of features like cancellation, iteration methods and warnings that native promises don't. If you are using Bluebird for performance rather than for those - please consider giving native promises a shot and running the benchmarks yourself. + +# Questions and issues + +The [github issue tracker](https://github.com/petkaantonov/bluebird/issues) is **_only_** for bug reports and feature requests. Anything else, such as questions for help in using the library, should be posted in [StackOverflow](http://stackoverflow.com/questions/tagged/bluebird) under tags `promise` and `bluebird`. + + + +## Thanks + +Thanks to BrowserStack for providing us with a free account which lets us support old browsers like IE8. + +# License + +The MIT License (MIT) + +Copyright (c) 2013-2019 Petka Antonov + +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/bluebird/changelog.md b/node_modules/bluebird/changelog.md new file mode 100644 index 0000000..73b2eb6 --- /dev/null +++ b/node_modules/bluebird/changelog.md @@ -0,0 +1 @@ +[http://bluebirdjs.com/docs/changelog.html](http://bluebirdjs.com/docs/changelog.html) diff --git a/node_modules/bluebird/js/browser/bluebird.core.js b/node_modules/bluebird/js/browser/bluebird.core.js new file mode 100644 index 0000000..24a8bf2 --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.core.js @@ -0,0 +1,3914 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * 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. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core + * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)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.Promise=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 _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0) { + _drainQueueStep(queue); + } +} + +function _drainQueueStep(queue) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + } else { + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } +} + +Async.prototype._drainQueues = function () { + _drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + _drainQueue(this._lateQueue); +}; + +Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } +}; + +Async.prototype._reset = function () { + this._isTickUsed = false; +}; + +module.exports = Async; +module.exports.firstLineError = firstLineError; + +},{"./queue":17,"./schedule":18}],2:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { +var calledBind = false; +var rejectThis = function(_, e) { + this._reject(e); +}; + +var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); +}; + +var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } +}; + +var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); +}; + +Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; +}; + +Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } +}; + +Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; +}; + +Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); +}; +}; + +},{}],3:[function(_dereq_,module,exports){ +"use strict"; +var old; +if (typeof Promise !== "undefined") old = Promise; +function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; +} +var bluebird = _dereq_("./promise")(); +bluebird.noConflict = noConflict; +module.exports = bluebird; + +},{"./promise":15}],4:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, PromiseArray, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } +}; + +Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; +}; + +Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; +}; + +Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; +}; + +Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } +}; + +Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); +}; + +Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); +}; + +Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; +}; + +Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); +}; + +Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); +}; + +Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } +}; + +Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); +}; + +Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } +}; + +Promise.prototype._resultCancelled = function() { + this.cancel(); +}; + +}; + +},{"./util":21}],5:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(NEXT_FILTER) { +var util = _dereq_("./util"); +var getKeys = _dereq_("./es5").keys; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; +} + +return catchFilter; +}; + +},{"./es5":10,"./util":21}],6:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +var longStackTraces = false; +var contextStack = []; + +Promise.prototype._promiseCreated = function() {}; +Promise.prototype._pushContext = function() {}; +Promise.prototype._popContext = function() {return null;}; +Promise._peekContext = Promise.prototype._peekContext = function() {}; + +function Context() { + this._trace = new Context.CapturedTrace(peekContext()); +} +Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } +}; + +Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; +}; + +function createContext() { + if (longStackTraces) return new Context(); +} + +function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; +} +Context.CapturedTrace = null; +Context.create = createContext; +Context.deactivateLongStackTraces = function() {}; +Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; +}; +return Context; +}; + +},{}],7:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, Context, + enableAsyncHooks, disableAsyncHooks) { +var async = Promise._async; +var Warning = _dereq_("./errors").Warning; +var util = _dereq_("./util"); +var es5 = _dereq_("./es5"); +var canAttachTrace = util.canAttachTrace; +var unhandledRejectionHandled; +var possiblyUnhandledRejection; +var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; +var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; +var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; +var stackFramePattern = null; +var formatStack = null; +var indentStackFrames = false; +var printWarning; +var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (true || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + +var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + +var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + +var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + +var deferUnhandledRejectionCheck; +(function() { + var promises = []; + + function unhandledRejectionCheck() { + for (var i = 0; i < promises.length; ++i) { + promises[i]._notifyUnhandledRejection(); + } + unhandledRejectionClear(); + } + + function unhandledRejectionClear() { + promises.length = 0; + } + + deferUnhandledRejectionCheck = function(promise) { + promises.push(promise); + setTimeout(unhandledRejectionCheck, 1); + }; + + es5.defineProperty(Promise, "_unhandledRejectionCheck", { + value: unhandledRejectionCheck + }); + es5.defineProperty(Promise, "_unhandledRejectionClear", { + value: unhandledRejectionClear + }); +})(); + +Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); +}; + +Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + deferUnhandledRejectionCheck(this); +}; + +Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); +}; + +Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; +}; + +Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; +}; + +Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } +}; + +Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; +}; + +Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); +}; + +Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; +}; + +Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; +}; + +Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } +}; + +Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; +}; + +Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); +}; + +Promise.onPossiblyUnhandledRejection = function (fn) { + var context = Promise._getContext(); + possiblyUnhandledRejection = util.contextBind(context, fn); +}; + +Promise.onUnhandledRejectionHandled = function (fn) { + var context = Promise._getContext(); + unhandledRejectionHandled = util.contextBind(context, fn); +}; + +var disableLongStackTraces = function() {}; +Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Promise.prototype._dereferenceTrace = Promise_dereferenceTrace; + Context.deactivateLongStackTraces(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace; + Context.activateLongStackTraces(); + } +}; + +Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); +}; + + +var legacyHandlers = { + unhandledrejection: { + before: function() { + var ret = util.global.onunhandledrejection; + util.global.onunhandledrejection = null; + return ret; + }, + after: function(fn) { + util.global.onunhandledrejection = fn; + } + }, + rejectionhandled: { + before: function() { + var ret = util.global.onrejectionhandled; + util.global.onrejectionhandled = null; + return ret; + }, + after: function(fn) { + util.global.onrejectionhandled = fn; + } + } +}; + +var fireDomEvent = (function() { + var dispatch = function(legacy, e) { + if (legacy) { + var fn; + try { + fn = legacy.before(); + return !util.global.dispatchEvent(e); + } finally { + legacy.after(fn); + } + } else { + return !util.global.dispatchEvent(e); + } + }; + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var eventData = { + detail: event, + cancelable: true + }; + var domEvent = new CustomEvent(name, eventData); + es5.defineProperty( + domEvent, "promise", {value: event.promise}); + es5.defineProperty( + domEvent, "reason", {value: event.reason}); + + return dispatch(legacyHandlers[name], domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = new Event(name, { + cancelable: true + }); + domEvent.detail = event; + es5.defineProperty(domEvent, "promise", {value: event.promise}); + es5.defineProperty(domEvent, "reason", {value: event.reason}); + return dispatch(legacyHandlers[name], domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name, false, true, + event); + return dispatch(legacyHandlers[name], domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; +})(); + +var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } +})(); + +function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; +} + +var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject +}; + +var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; +}; + +Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) { + var prev = config.asyncHooks; + var cur = !!opts.asyncHooks; + if (prev !== cur) { + config.asyncHooks = cur; + if (cur) { + enableAsyncHooks(); + } else { + disableAsyncHooks(); + } + } + } + return Promise; +}; + +function defaultFireEvent() { return false; } + +Promise.prototype._fireEvent = defaultFireEvent; +Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } +}; +Promise.prototype._onCancel = function () {}; +Promise.prototype._setOnCancel = function (handler) { ; }; +Promise.prototype._attachCancellationCallback = function(onCancel) { + ; +}; +Promise.prototype._captureStackTrace = function () {}; +Promise.prototype._attachExtraTrace = function () {}; +Promise.prototype._dereferenceTrace = function () {}; +Promise.prototype._clearCancellationData = function() {}; +Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; +}; + +function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } +} + +function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } +} + +function cancellationOnCancel() { + return this._onCancelField; +} + +function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; +} + +function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; +} + +function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} + +function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} +var propagateFromFunction = bindingPropagateFrom; + +function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; +} + +function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); +} + +function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } +} + +function longStackTracesDereferenceTrace() { + this._trace = undefined; +} + +function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } +} + +function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); +} + +function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } +} + +function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); +} + +function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } +} + +function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } +} + +function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; +} + +function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; +} + +function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; +} + +function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } +} + +function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } +} + +function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); +} + +function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; +} + +function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; +} + +var shouldIgnore = function() { return false; }; +var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; +function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } +} + +function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = (firstLineError.stack || "").split("\n"); + var lastStackLines = (lastLineError.stack || "").split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; +} + +function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); +} +util.inherits(CapturedTrace, Error); +Context.CapturedTrace = CapturedTrace; + +CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } +}; + +CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); +}; + +var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + +})([]); + +if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } +} + +var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false, + asyncHooks: false +}; + +if (longStackTraces) Promise.longStackTraces(); + +return { + asyncHooks: function() { + return config.asyncHooks; + }, + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent +}; +}; + +},{"./errors":9,"./es5":10,"./util":21}],8:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function returner() { + return this.value; +} +function thrower() { + throw this.reason; +} + +Promise.prototype["return"] = +Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); +}; + +Promise.prototype["throw"] = +Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); +}; + +Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } +}; + +Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } +}; +}; + +},{}],9:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var Objectfreeze = es5.freeze; +var util = _dereq_("./util"); +var inherits = util.inherits; +var notEnumerableProp = util.notEnumerableProp; + +function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; +} + +var _TypeError, _RangeError; +var Warning = subError("Warning", "warning"); +var CancellationError = subError("CancellationError", "cancellation error"); +var TimeoutError = subError("TimeoutError", "timeout error"); +var AggregateError = subError("AggregateError", "aggregate error"); +try { + _TypeError = TypeError; + _RangeError = RangeError; +} catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); +} + +var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + +for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } +} + +es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true +}); +AggregateError.prototype["isOperational"] = true; +var level = 0; +AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; +}; + +function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + +} +inherits(OperationalError, Error); + +var errorTypes = Error["__BluebirdErrorTypes__"]; +if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); +} + +module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning +}; + +},{"./es5":10,"./util":21}],10:[function(_dereq_,module,exports){ +var isES5 = (function(){ + "use strict"; + return this === undefined; +})(); + +if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; +} else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; +} + +},{}],11:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { +var util = _dereq_("./util"); +var CancellationError = Promise.CancellationError; +var errorObj = util.errorObj; +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); + +function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; +} + +PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; +}; + +function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; +} + +FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); +}; + +function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; +} + +function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); +} +function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; +} +function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret === NEXT_FILTER) { + return ret; + } else if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } +} + +Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); +}; + +Promise.prototype.lastly = +Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); +}; + + +Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); +}; + +Promise.prototype.tapCatch = function (handlerOrPredicate) { + var len = arguments.length; + if(len === 1) { + return this._passThrough(handlerOrPredicate, + 1, + undefined, + finallyHandler); + } else { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return Promise.reject(new TypeError( + "tapCatch statement predicate: " + + "expecting an object but got " + util.classString(item) + )); + } + } + catchInstances.length = j; + var handler = arguments[i]; + return this._passThrough(catchFilter(catchInstances, handler, this), + 1, + undefined, + finallyHandler); + } + +}; + +return PassThroughHandlerContext; +}; + +},{"./catch_filter":5,"./util":21}],12:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) { +var util = _dereq_("./util"); +var canEvaluate = util.canEvaluate; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var reject; + +if (!true) { +if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; +}} + +Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (!true) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var context = Promise._getContext(); + holder.fn = util.contextBind(context, holder.fn); + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var args = [].slice.call(arguments);; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; +}; + +}; + +},{"./util":21}],13:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; + +Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; +}; + +Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; +}; + +Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } +}; +}; + +},{"./util":21}],14:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var maybeWrapAsError = util.maybeWrapAsError; +var errors = _dereq_("./errors"); +var OperationalError = errors.OperationalError; +var es5 = _dereq_("./es5"); + +function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; +} + +var rErrorKey = /^(?:name|message|stack|cause)$/; +function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; +} + +function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var args = [].slice.call(arguments, 1);; + promise._fulfill(args); + } + promise = null; + }; +} + +module.exports = nodebackForPromise; + +},{"./errors":9,"./es5":10,"./util":21}],15:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function() { +var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); +}; +var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); +}; +function Proxyable() {} +var UNDEFINED_BINDING = {}; +var util = _dereq_("./util"); +util.setReflectHandler(reflectHandler); + +var getDomain = function() { + var domain = process.domain; + if (domain === undefined) { + return null; + } + return domain; +}; +var getContextDefault = function() { + return null; +}; +var getContextDomain = function() { + return { + domain: getDomain(), + async: null + }; +}; +var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? + _dereq_("async_hooks").AsyncResource : null; +var getContextAsyncHooks = function() { + return { + domain: getDomain(), + async: new AsyncResource("Bluebird::Promise") + }; +}; +var getContext = util.isNode ? getContextDomain : getContextDefault; +util.notEnumerableProp(Promise, "_getContext", getContext); +var enableAsyncHooks = function() { + getContext = getContextAsyncHooks; + util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); +}; +var disableAsyncHooks = function() { + getContext = getContextDomain; + util.notEnumerableProp(Promise, "_getContext", getContextDomain); +}; + +var es5 = _dereq_("./es5"); +var Async = _dereq_("./async"); +var async = new Async(); +es5.defineProperty(Promise, "_async", {value: async}); +var errors = _dereq_("./errors"); +var TypeError = Promise.TypeError = errors.TypeError; +Promise.RangeError = errors.RangeError; +var CancellationError = Promise.CancellationError = errors.CancellationError; +Promise.TimeoutError = errors.TimeoutError; +Promise.OperationalError = errors.OperationalError; +Promise.RejectionError = errors.OperationalError; +Promise.AggregateError = errors.AggregateError; +var INTERNAL = function(){}; +var APPLY = {}; +var NEXT_FILTER = {}; +var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL); +var PromiseArray = + _dereq_("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); +var Context = _dereq_("./context")(Promise); + /*jshint unused:false*/ +var createContext = Context.create; + +var debug = _dereq_("./debuggability")(Promise, Context, + enableAsyncHooks, disableAsyncHooks); +var CapturedTrace = debug.CapturedTrace; +var PassThroughHandlerContext = + _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); +var nodebackForPromise = _dereq_("./nodeback"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +function check(self, executor) { + if (self == null || self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + +} + +function Promise(executor) { + if (executor !== INTERNAL) { + check(this, executor); + } + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + this._resolveFromExecutor(executor); + this._promiseCreated(); + this._fireEvent("promiseCreated", this); +} + +Promise.prototype.toString = function () { + return "[object Promise]"; +}; + +Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("Catch statement predicate: " + + "expecting an object but got " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + + if (typeof fn !== "function") { + throw new TypeError("The last argument to .catch() " + + "must be a function, got " + util.toString(fn)); + } + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); +}; + +Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); +}; + +Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); +}; + +Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); +}; + +Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); +}; + +Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; +}; + +Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); +}; + +Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); +}; + +Promise.getNewLibraryCopy = module.exports; + +Promise.is = function (val) { + return val instanceof Promise; +}; + +Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.all = function (promises) { + return new PromiseArray(promises).promise(); +}; + +Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; +}; + +Promise.resolve = Promise.fulfilled = Promise.cast; + +Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; +}; + +Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); +}; + +Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData +) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var context = getContext(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: util.contextBind(context, handler), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, + receiver, context); + } + + return promise; +}; + +Promise.prototype._length = function () { + return this._bitField & 65535; +}; + +Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; +}; + +Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; +}; + +Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); +}; + +Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); +}; + +Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); +}; + +Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); +}; + +Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; +}; + +Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; +}; + +Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); +}; + +Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); +}; + +Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; +}; + +Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + var bitField = this._bitField; + this._bitField = bitField | + (((bitField & 536870912) >> 2) ^ + 134217728); +}; + +Promise.prototype._setNoAsyncGuarantee = function() { + this._bitField = (this._bitField | 536870912) & + (~134217728); +}; + +Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; +}; + +Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; +}; + +Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; +}; + +Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; +}; + +Promise.prototype._boundValue = function() {}; + +Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + context +) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = util.contextBind(context, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + util.contextBind(context, reject); + } + } + this._setLength(index + 1); + return index; +}; + +Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); +}; + +Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(maybePromise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } +}; + +Promise.prototype._rejectCallback = +function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); +}; + +Promise.prototype._resolveFromExecutor = function (executor) { + if (executor === INTERNAL) return; + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } +}; + +Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise +) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } +}; + +Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; +}; + +Promise.prototype._followee = function() { + return this._rejectionHandler0; +}; + +Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; +}; + +Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } +}; + +Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } +}; + +Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); +}; + +Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); +}; + +Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; +}; + +Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + this._dereferenceTrace(); + } +}; + +Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } +}; + +Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } +}; + +Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } +}; + +Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); +}; + +Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } +}; + +if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + es5.defineProperty(Promise.prototype, Symbol.toStringTag, { + get: function () { + return "Object"; + } + }); +} + +function deferResolve(v) {this.promise._resolveCallback(v);} +function deferReject(v) {this.promise._rejectCallback(v, false);} + +Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; +}; + +util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + +_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); +_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); +_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug); +_dereq_("./direct_resolve")(Promise); +_dereq_("./synchronous_inspection")(Promise); +_dereq_("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); +Promise.Promise = Promise; +Promise.version = "3.7.2"; + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + +}; + +},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,"async_hooks":undefined}],16:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { +var util = _dereq_("./util"); +var isArray = util.isArray; + +function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + case -6: return new Map(); + } +} + +function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + values.suppressUnhandledRejections(); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); +} +util.inherits(PromiseArray, Proxyable); + +PromiseArray.prototype.length = function () { + return this._length; +}; + +PromiseArray.prototype.promise = function () { + return this._promise; +}; + +PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); +}; + +PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); +}; + +PromiseArray.prototype._isResolved = function () { + return this._values === null; +}; + +PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); +}; + +PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); +}; + +PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); +}; + +PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; +}; + +PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; +}; + +PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } +}; + +PromiseArray.prototype.shouldCopyValues = function () { + return true; +}; + +PromiseArray.prototype.getActualLength = function (len) { + return len; +}; + +return PromiseArray; +}; + +},{"./util":21}],17:[function(_dereq_,module,exports){ +"use strict"; +function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } +} + +function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; +} + +Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; +}; + +Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; +}; + +Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; +}; + +Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; +}; + +Queue.prototype.length = function () { + return this._length; +}; + +Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } +}; + +Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); +}; + +module.exports = Queue; + +},{}],18:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var schedule; +var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var NativePromise = util.getNativePromise(); +if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; +} else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova)) && + ("classList" in document.documentElement)) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); +} else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; +} else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; +} else { + schedule = noAsyncScheduler; +} +module.exports = schedule; + +},{"./util":21}],19:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } +} + +PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; +}; + +var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var reason = PromiseInspection.prototype.error = +PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; +}; + +var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; +}; + +var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; +}; + +var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; +}; + +PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; +}; + +Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; +}; + +Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); +}; + +Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; +}; + +Promise.prototype.isPending = function() { + return isPending.call(this._target()); +}; + +Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); +}; + +Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); +}; + +Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); +}; + +Promise.prototype.value = function() { + return value.call(this._target()); +}; + +Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); +}; + +Promise.prototype._value = function() { + return this._settledValue(); +}; + +Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); +}; + +Promise.PromiseInspection = PromiseInspection; +}; + +},{}],20:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var util = _dereq_("./util"); +var errorObj = util.errorObj; +var isObject = util.isObject; + +function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; +} + +function doGetThen(obj) { + return obj.then; +} + +function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} + +var hasProp = {}.hasOwnProperty; +function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } +} + +function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; +} + +return tryConvertToPromise; +}; + +},{"./util":21}],21:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var canEvaluate = typeof navigator == "undefined"; + +var errorObj = {e: {}}; +var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + +function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} +function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; +} + +var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; +}; + + +function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + +} + +function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; +} + +function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); +} + +function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; +} + +function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } +} + +function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; +} + +function thrower(r) { + throw r; +} + +var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + +})(); + +var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; +function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } +} + +function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var receiver = new FakeConstructor(); + function ic() { + return typeof receiver.foo; + } + ic(); + ic(); + return obj; + eval(obj); +} + +var rident = /^[a-z$_][a-z$_0-9]*$/i; +function isIdentifier(str) { + return rident.test(str); +} + +function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; +} + +function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } +} + +function isError(obj) { + return obj instanceof Error || + (obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"); +} + +function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} +} + +function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); +} + +function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); +} + +var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } +})(); + +function classString(obj) { + return {}.toString.call(obj); +} + +function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } +} + +var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; +}; + +if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; +} + +var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + +var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + +function env(key) { + return hasEnvVariables ? process.env[key] : undefined; +} + +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if (classString(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + +var reflectHandler; +function contextBind(ctx, cb) { + if (ctx === null || + typeof cb !== "function" || + cb === reflectHandler) { + return cb; + } + + if (ctx.domain !== null) { + cb = ctx.domain.bind(cb); + } + + var async = ctx.async; + if (async !== null) { + var old = cb; + cb = function() { + var args = (new Array(2)).concat([].slice.call(arguments));; + args[0] = old; + args[1] = this; + return async.runInAsyncScope.apply(async, args); + }; + } + return cb; +} + +var ret = { + setReflectHandler: function(fn) { + reflectHandler = fn; + }, + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + contextBind: contextBind +}; +ret.isRecentNode = ret.isNode && (function() { + var version; + if (process.versions && process.versions.node) { + version = process.versions.node.split(".").map(Number); + } else if (process.version) { + version = process.version.split(".").map(Number); + } + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); +})(); +ret.nodeSupportsAsyncResource = ret.isNode && (function() { + var supportsAsync = false; + try { + var res = _dereq_("async_hooks").AsyncResource; + supportsAsync = typeof res.prototype.runInAsyncScope === "function"; + } catch (e) { + supportsAsync = false; + } + return supportsAsync; +})(); + +if (ret.isNode) ret.toFastProperties(process); + +try {throw new Error(); } catch (e) {ret.lastLineError = e;} +module.exports = ret; + +},{"./es5":10,"async_hooks":undefined}]},{},[3])(3) +}); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; } \ No newline at end of file diff --git a/node_modules/bluebird/js/browser/bluebird.core.min.js b/node_modules/bluebird/js/browser/bluebird.core.min.js new file mode 100644 index 0000000..836176e --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.core.min.js @@ -0,0 +1,31 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * 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. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core + * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function o(a,s){if(!e[a]){if(!t[a]){var c="function"==typeof _dereq_&&_dereq_;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,r,t,e,n)}return e[a].exports}for(var i="function"==typeof _dereq_&&_dereq_,a=0;a0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var l;try{throw new Error}catch(u){l=u}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=o,r.prototype.invoke=i,r.prototype.settlePromises=a,r.prototype._drainQueues=function(){s(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,s(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=l},{"./queue":17,"./schedule":18}],2:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var o=!1,i=function(t,e){this._reject(e)},a=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(i,i,null,this,t)},s=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(i){o||(o=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(i),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var f={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,a,void 0,u,f),l._then(s,c,void 0,u,f),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],3:[function(t,e,n){"use strict";function r(){try{Promise===i&&(Promise=o)}catch(t){}return i}var o;"undefined"!=typeof Promise&&(o=Promise);var i=t("./promise")();i.noConflict=r,e.exports=i},{"./promise":15}],4:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){var i=t("./util"),a=i.tryCatch,s=i.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!o.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(i.isArray(t))for(var n=0;n=0?i[t]:void 0}var o=!1,i=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,i.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=i.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,i=t.prototype._popContext,a=t._peekContext,s=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=i,t._peekContext=a,t.prototype._peekContext=s,t.prototype._promiseCreated=c,o=!1},o=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],7:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){function i(t,e){return{promise:e}}function a(){return!1}function s(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+V.toString(t));r._attachCancellationCallback(t)})}catch(o){return o}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?V.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function l(){return this._onCancelField}function u(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function d(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function _(){this._trace=new H(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);V.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),V.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,o){if(void 0===t&&null!==e&&Z){if(void 0!==o&&o._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var i="",a="";if(e._trace){for(var s=e._trace.stack.split("\n"),c=E(s),l=c.length-1;l>=0;--l){var u=c[l];if(!M.test(u)){var p=u.match(W);p&&(i="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],l=0;l0&&(a="\n"+s[l-1]);break}}var h="a promise was created in a "+n+"handler "+i+"but was not returned from it, see http://goo.gl/rRqMUw"+a;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(ut.warnings){var o,i=new D(t);if(n)r._attachExtraTrace(i);else if(ut.longStackTraces&&(o=e._peekContext()))o.attachExtraTrace(i);else{var a=F(i);i.stack=a.message+"\n"+a.stack.join("\n")}it("warning",i)||T(i,"",!0)}}function C(t,e){for(var n=0;n=0;--s)if(r[s]===i){a=s;break}for(var s=a;s>=0;--s){var c=r[s];if(e[o]!==c)break;e.pop(),o--}e=r}}function E(t){for(var e=[],n=0;n0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?j(t):[" (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:E(e)}}function T(t,e,n){if("undefined"!=typeof console){var r;if(V.isObject(t)){var o=t.stack;r=e+z(o,t)}else r=e+String(t);"function"==typeof B?B(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function x(t,e,n,r){var o=!1;try{"function"==typeof e&&(o=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(i){I.throwLater(i)}"unhandledRejection"===t?it(t,n,r)||o||T(n,"Unhandled rejection "):it(t,r)}function R(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():V.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(o){}0===e.length&&(e="(empty array)")}return"(<"+S(e)+">, no stack trace)"}function S(t){var e=41;return t.lengtha||0>s||!n||!r||n!==r||a>=s||(st=function(t){if(G.test(t))return!0;var e=O(t);return e&&e.fileName===n&&a<=e.line&&e.line<=s?!0:!1})}}function H(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);lt(this,H),e>32&&this.uncycle()}var N,L,B,U,I=e._async,D=t("./errors").Warning,V=t("./util"),Q=t("./es5"),q=V.canAttachTrace,G=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,M=/\((?:timers\.js):\d+:\d+\)/,W=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,$=null,z=null,X=!1,K=!(0==V.env("BLUEBIRD_DEBUG")||!V.env("BLUEBIRD_DEBUG")&&"development"!==V.env("NODE_ENV")),J=!(0==V.env("BLUEBIRD_WARNINGS")||!K&&!V.env("BLUEBIRD_WARNINGS")),Y=!(0==V.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!V.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=V.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!V.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();L=V.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();N=V.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!ut.longStackTraces&&P()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,o=e.prototype._dereferenceTrace;ut.longStackTraces=!0,tt=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=o,n.deactivateLongStackTraces(),ut.longStackTraces=!1},e.prototype._captureStackTrace=_,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return ut.longStackTraces&&P()};var et={unhandledrejection:{before:function(){var t=V.global.onunhandledrejection;return V.global.onunhandledrejection=null,t},after:function(t){V.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=V.global.onrejectionhandled;return V.global.onrejectionhandled=null,t},after:function(t){V.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!V.global.dispatchEvent(e);var n;try{return n=t.before(),!V.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},o=new CustomEvent(e,r);return Q.defineProperty(o,"promise",{value:n.promise}),Q.defineProperty(o,"reason",{value:n.reason}),t(et[e],o)}}if("function"==typeof Event){var e=new Event("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,Q.defineProperty(r,"promise",{value:n.promise}),Q.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return V.isNode?function(){return process.emit.apply(process,arguments)}:V.global?function(t){var e="on"+t.toLowerCase(),n=V.global[e];return n?(n.apply(V.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),ot={promiseCreated:i,promiseFulfilled:i,promiseRejected:i,promiseResolved:i,promiseCancelled:i,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:i},it=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){I.throwLater(n),e=!0}var r=!1;try{r=nt(t,ot[t].apply(null,arguments))}catch(n){I.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;ut.warnings=!!n,Z=ut.warnings,V.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!ut.cancellation){if(I.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=l,e.prototype._setOnCancel=u,e.prototype._attachCancellationCallback=c,e.prototype._execute=s,at=f,ut.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!ut.monitoring?(ut.monitoring=!0,e.prototype._fireEvent=it):!t.monitoring&&ut.monitoring&&(ut.monitoring=!1,e.prototype._fireEvent=a)),"asyncHooks"in t&&V.nodeSupportsAsyncResource){var i=ut.asyncHooks,h=!!t.asyncHooks;i!==h&&(ut.asyncHooks=h,h?r():o())}return e},e.prototype._fireEvent=a,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var at=h,st=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;V.inherits(H,Error),n.CapturedTrace=H,H.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,o=this;void 0!==o;++r)e.push(o),o=o._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var i=e[r].stack;void 0===n[i]&&(n[i]=r)}for(var r=0;t>r;++r){var a=e[r].stack,s=n[a];if(void 0!==s&&s!==r){s>0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>s?(c._parent=e[s+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var l=c._length+1,u=r-2;u>=0;--u)e[u]._length=l,l++;return}}}},H.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],o=this;void 0!==o;)r.push(E(o.stack.split("\n"))),o=o._parent;k(r),w(r),V.notEnumerableProp(t,"stack",C(n,r)),V.notEnumerableProp(t,"__stackCleaned__",!0)}};var lt=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():R(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,$=t,z=e;var n=Error.captureStackTrace;return st=function(t){return G.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return $=/@/,z=e,X=!0,function(t){t.stack=(new Error).stack};var o;try{throw new Error}catch(i){o="stack"in i}return"stack"in r||!o||"number"!=typeof Error.stackTraceLimit?(z=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?R(e):e.toString()},null):($=t,z=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(B=function(t){console.warn(t)},V.isNode&&process.stderr.isTTY?B=function(t,e){var n=e?"":"";console.warn(n+t+"\n")}:V.isNode||"string"!=typeof(new Error).stack||(B=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var ut={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return ut.asyncHooks},longStackTraces:function(){return ut.longStackTraces},warnings:function(){return ut.warnings},cancellation:function(){return ut.cancellation},monitoring:function(){return ut.monitoring},propagateFromFunction:function(){return at},boundValueFunction:function(){return d},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:H,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":9,"./es5":10,"./util":21}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var o=function(){return r};return this.caught(n,o)}}},{}],9:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return u(n,Error),n}function o(t){return this instanceof o?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new o(t)}var i,a,s=t("./es5"),c=s.freeze,l=t("./util"),u=l.inherits,p=l.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),d=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,a=RangeError}catch(v){i=r("TypeError","type error"),a=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function s(){return l.call(this,this.promise._target()._settledValue())}function c(t){return a(this,t)?void 0:(f.e=t,f)}function l(t){var o=this.promise,l=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?l.call(o._boundValue()):l.call(o._boundValue(),t);if(u===r)return u;if(void 0!==u){o._setReturnedNonUndefined();var h=n(u,o);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var d=new p("late cancellation observer");return o._attachExtraTrace(d),f.e=d,f}h.isPending()&&h._attachCancellationCallback(new i(this))}return h._then(s,c,void 0,this,void 0)}}}return o.isRejected()?(a(this),f.e=t,f):(a(this),t)}var u=t("./util"),p=e.CancellationError,f=u.errorObj,h=t("./catch_filter")(r);return o.prototype.isFinallyHandler=function(){return 0===this.type},i.prototype._resultCancelled=function(){a(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new o(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,l,l)},e.prototype.tap=function(t){return this._passThrough(t,1,l)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,l);var r,o=new Array(n-1),i=0;for(r=0;n-1>r;++r){var a=arguments[r];if(!u.isObject(a))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+u.classString(a)));o[i++]=a}o.length=i;var s=arguments[r];return this._passThrough(h(o,s,this),1,void 0,l)},o}},{"./catch_filter":5,"./util":21}],12:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util");a.canEvaluate,a.tryCatch,a.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var o=[].slice.call(arguments);t&&o.pop();var r=new n(o).promise();return void 0!==t?r.spread(t):r}}},{"./util":21}],13:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util"),s=a.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+a.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var o=s(t).apply(this,arguments),a=r._popContext();return i.checkForgottenReturns(o,a,"Promise.method",r),r._resolveFromSyncValue(o),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return o("expecting a function but got "+a.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){i.deprecated("calling Promise.try with more than 1 argument");var l=arguments[1],u=arguments[2];c=a.isArray(l)?s(t).apply(u,l):s(t).call(u,l)}else c=s(t)();var p=r._popContext();return i.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===a.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":21}],14:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&u.getPrototypeOf(t)===Error.prototype}function o(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=u.keys(t),o=0;o1){var n,r=new Array(e-1),o=0; +for(n=0;e-1>n;++n){var i=arguments[n];if(!f.isObject(i))return u("Catch statement predicate: expecting an object but got "+f.classString(i));r[o++]=i}if(r.length=o,t=arguments[n],"function"!=typeof t)throw new j("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,N(r,t,this))}return this.then(void 0,t)},o.prototype.reflect=function(){return this._then(l,l,void 0,this,void 0)},o.prototype.then=function(t,e){if(A.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},o.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},o.prototype.spread=function(t){return"function"!=typeof t?u("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,x,void 0)},o.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},o.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new P(this).promise()},o.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},o.getNewLibraryCopy=e.exports,o.is=function(t){return t instanceof o},o.fromNode=o.fromCallback=function(t){var e=new o(T);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=U(t)(L(e,n));return r===B&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},o.all=function(t){return new P(t).promise()},o.cast=function(t){var e=S(t);return e instanceof o||(e=new o(T),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},o.resolve=o.fulfilled=o.cast,o.reject=o.rejected=function(t){var e=new o(T);return e._captureStackTrace(),e._rejectCallback(t,!0),e},o.setScheduler=function(t){if("function"!=typeof t)throw new j("expecting a function but got "+f.classString(t));return k.setScheduler(t)},o.prototype._then=function(t,e,n,r,i){var a=void 0!==i,s=a?i:new o(T),c=this._target(),l=c._bitField;a||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&l)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var u=g();if(0!==(50397184&l)){var p,h,d=c._settlePromiseCtx;0!==(33554432&l)?(h=c._rejectionHandler0,p=t):0!==(16777216&l)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(d=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),k.invoke(d,c,{handler:f.contextBind(u,p),promise:s,receiver:r,value:h})}else c._addCallbacks(t,e,s,r,u);return s},o.prototype._length=function(){return 65535&this._bitField},o.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},o.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},o.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},o.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},o.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},o.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},o.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},o.prototype._isFinal=function(){return(4194304&this._bitField)>0},o.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},o.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},o.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},o.prototype._setAsyncGuaranteed=function(){if(!k.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},o.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},o.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},o.prototype._promiseAt=function(t){return this[4*t-4+2]},o.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},o.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},o.prototype._boundValue=function(){},o.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,o=t._receiverAt(0);void 0===o&&(o=p),this._addCallbacks(e,n,r,o,null)},o.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),o=t._promiseAt(e),i=t._receiverAt(e);void 0===i&&(i=p),this._addCallbacks(n,r,o,i,null)},o.prototype._addCallbacks=function(t,e,n,r,o){var i=this._length();if(i>=65531&&(i=0,this._setLength(0)),0===i)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(o,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(o,e));else{var a=4*i-4;this[a+2]=n,this[a+3]=r,"function"==typeof t&&(this[a+0]=f.contextBind(o,t)),"function"==typeof e&&(this[a+1]=f.contextBind(o,e))}return this._setLength(i+1),i},o.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},o.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=S(t,this);if(!(n instanceof o))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var i=r._bitField;if(0===(50397184&i)){var a=this._length();a>0&&r._migrateCallback0(this);for(var s=1;a>s;++s)r._migrateCallbackAt(this,s);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&i))this._fulfill(r._value());else if(0!==(16777216&i))this._reject(r._reason());else{var l=new F("late cancellation observer");r._attachExtraTrace(l),this._reject(l)}}},o.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),o=r===t;if(!o&&!n&&A.warnings()){var i="a promise was rejected with a non-error: "+f.classString(t);this._warn(i,!0)}this._attachExtraTrace(r,e?o:!1),this._reject(t)},o.prototype._resolveFromExecutor=function(t){if(t!==T){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},o.prototype._settlePromiseFromHandler=function(t,e,n,r){var o=r._bitField;if(0===(65536&o)){r._pushContext();var i;e===x?n&&"number"==typeof n.length?i=U(t).apply(this._boundValue(),n):(i=B,i.e=new j("cannot .spread() a non-array: "+f.classString(n))):i=U(t).call(e,n);var a=r._popContext();o=r._bitField,0===(65536&o)&&(i===R?r._reject(n):i===B?r._rejectCallback(i.e,!1):(A.checkForgottenReturns(i,a,"",r,this),r._resolveCallback(i)))}},o.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},o.prototype._followee=function(){return this._rejectionHandler0},o.prototype._setFollowee=function(t){this._rejectionHandler0=t},o.prototype._settlePromise=function(t,e,r,i){var a=t instanceof o,s=this._bitField,c=0!==(134217728&s);0!==(65536&s)?(a&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,U(e).call(r,i)===B&&t._reject(B.e)):e===l?t._fulfill(l.call(r)):r instanceof n?r._promiseCancelled(t):a||t instanceof P?t._cancel():r.cancel()):"function"==typeof e?a?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,i,t)):e.call(r,i,t):r instanceof n?r._isResolved()||(0!==(33554432&s)?r._promiseFulfilled(i,t):r._promiseRejected(i,t)):a&&(c&&t._setAsyncGuaranteed(),0!==(33554432&s)?t._fulfill(i):t._reject(i))},o.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,i=t.value;"function"==typeof e?n instanceof o?this._settlePromiseFromHandler(e,r,i,n):e.call(r,i,n):n instanceof o&&n._reject(i)},o.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},o.prototype._settlePromise0=function(t,e,n){var r=this._promise0,o=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,o,e)},o.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},o.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():k.settlePromises(this),this._dereferenceTrace())}},o.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?k.fatalError(t,f.isNode):void((65535&e)>0?k.settlePromises(this):this._ensurePossibleRejectionHandled())},o.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},o.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&C.defineProperty(o.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),o.defer=o.pending=function(){A.deprecated("Promise.defer","new Promise");var t=new o(T);return{promise:t,resolve:i,reject:a}},f.notEnumerableProp(o,"_makeSelfResolutionError",c),t("./method")(o,T,S,u,A),t("./bind")(o,T,S,A),t("./cancel")(o,P,u,A),t("./direct_resolve")(o),t("./synchronous_inspection")(o),t("./join")(o,P,S,T,k),o.Promise=o,o.version="3.7.2",f.toFastProperties(o),f.toFastProperties(o.prototype),s({a:1}),s({b:2}),s({c:3}),s(1),s(function(){}),s(void 0),s(!1),s(new o(T)),A.setBounds(w.firstLineError,f.lastLineError),o}},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,async_hooks:void 0}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){function a(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function s(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(s,i),s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function l(t,n){var i=r(this._values,this._promise);if(i instanceof e){i=i._target();var s=i._bitField;if(this._values=i,0===(50397184&s))return this._promise._setAsyncGuaranteed(),i._then(l,this._reject,void 0,this,n);if(0===(33554432&s))return 0!==(16777216&s)?this._reject(i._reason()):this._cancel();i=i._value()}if(i=c.asArray(i),null===i){var u=o("expecting an array or an iterable object but got "+c.classString(i)).reason();return void this._promise._rejectCallback(u,!1)}return 0===i.length?void(-5===n?this._resolveEmptyArray():this._resolve(a(n))):void this._iterate(i)},s.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var o=this._promise,i=!1,a=null,s=0;n>s;++s){var c=r(t[s],o);c instanceof e?(c=c._target(),a=c._bitField):a=null,i?null!==a&&c.suppressUnhandledRejections():null!==a?0===(50397184&a)?(c._proxy(this,s),this._values[s]=c):i=0!==(33554432&a)?this._promiseFulfilled(c._value(),s):0!==(16777216&a)?this._promiseRejected(c._reason(),s):this._promiseCancelled(s):i=this._promiseFulfilled(c,s)}i||o._setAsyncGuaranteed()},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},s.prototype._promiseCancelled=function(){return this._cancel(),!0},s.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},s.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;ni;++i)n[i+r]=t[i+e],t[i+e]=void 0}function o(t){this._capacity=t,this._length=0,this._front=0}o.prototype._willBeOverCapacity=function(t){return this._capacityn;++n)o[n]=t[n];return o[n]=e,o}function l(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function u(t,e,n){if(i(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),o=A.test(t+"")&&F.names(t).length>0;if(n||r||o)return!0}return!1}catch(i){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function d(t){return H.test(t)}function _(t,e,n){for(var r=new Array(t),o=0;t>o;++o)r[o]=e+o+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{u(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function C(t){return{}.toString.call(t)}function w(t,e,n){for(var r=F.names(t),o=0;o10||t[0]>0}(),V.nodeSupportsAsyncResource=V.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),V.isNode&&V.toFastProperties(process);try{throw new Error}catch(Q){V.lastLineError=Q}e.exports=V},{"./es5":10,async_hooks:void 0}]},{},[3])(3)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise); \ No newline at end of file diff --git a/node_modules/bluebird/js/browser/bluebird.js b/node_modules/bluebird/js/browser/bluebird.js new file mode 100644 index 0000000..7f0686f --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.js @@ -0,0 +1,5778 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * 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. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)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.Promise=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 _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0) { + _drainQueueStep(queue); + } +} + +function _drainQueueStep(queue) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + } else { + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } +} + +Async.prototype._drainQueues = function () { + _drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + _drainQueue(this._lateQueue); +}; + +Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } +}; + +Async.prototype._reset = function () { + this._isTickUsed = false; +}; + +module.exports = Async; +module.exports.firstLineError = firstLineError; + +},{"./queue":26,"./schedule":29}],3:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { +var calledBind = false; +var rejectThis = function(_, e) { + this._reject(e); +}; + +var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); +}; + +var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } +}; + +var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); +}; + +Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; +}; + +Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } +}; + +Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; +}; + +Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); +}; +}; + +},{}],4:[function(_dereq_,module,exports){ +"use strict"; +var old; +if (typeof Promise !== "undefined") old = Promise; +function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; +} +var bluebird = _dereq_("./promise")(); +bluebird.noConflict = noConflict; +module.exports = bluebird; + +},{"./promise":22}],5:[function(_dereq_,module,exports){ +"use strict"; +var cr = Object.create; +if (cr) { + var callerCache = cr(null); + var getterCache = cr(null); + callerCache[" size"] = getterCache[" size"] = 0; +} + +module.exports = function(Promise) { +var util = _dereq_("./util"); +var canEvaluate = util.canEvaluate; +var isIdentifier = util.isIdentifier; + +var getMethodCaller; +var getGetter; +if (!true) { +var makeMethodCaller = function (methodName) { + return new Function("ensureMethod", " \n\ + return function(obj) { \n\ + 'use strict' \n\ + var len = this.length; \n\ + ensureMethod(obj, 'methodName'); \n\ + switch(len) { \n\ + case 1: return obj.methodName(this[0]); \n\ + case 2: return obj.methodName(this[0], this[1]); \n\ + case 3: return obj.methodName(this[0], this[1], this[2]); \n\ + case 0: return obj.methodName(); \n\ + default: \n\ + return obj.methodName.apply(obj, this); \n\ + } \n\ + }; \n\ + ".replace(/methodName/g, methodName))(ensureMethod); +}; + +var makeGetter = function (propertyName) { + return new Function("obj", " \n\ + 'use strict'; \n\ + return obj.propertyName; \n\ + ".replace("propertyName", propertyName)); +}; + +var getCompiled = function(name, compiler, cache) { + var ret = cache[name]; + if (typeof ret !== "function") { + if (!isIdentifier(name)) { + return null; + } + ret = compiler(name); + cache[name] = ret; + cache[" size"]++; + if (cache[" size"] > 512) { + var keys = Object.keys(cache); + for (var i = 0; i < 256; ++i) delete cache[keys[i]]; + cache[" size"] = keys.length - 256; + } + } + return ret; +}; + +getMethodCaller = function(name) { + return getCompiled(name, makeMethodCaller, callerCache); +}; + +getGetter = function(name) { + return getCompiled(name, makeGetter, getterCache); +}; +} + +function ensureMethod(obj, methodName) { + var fn; + if (obj != null) fn = obj[methodName]; + if (typeof fn !== "function") { + var message = "Object " + util.classString(obj) + " has no method '" + + util.toString(methodName) + "'"; + throw new Promise.TypeError(message); + } + return fn; +} + +function caller(obj) { + var methodName = this.pop(); + var fn = ensureMethod(obj, methodName); + return fn.apply(obj, this); +} +Promise.prototype.call = function (methodName) { + var args = [].slice.call(arguments, 1);; + if (!true) { + if (canEvaluate) { + var maybeCaller = getMethodCaller(methodName); + if (maybeCaller !== null) { + return this._then( + maybeCaller, undefined, undefined, args, undefined); + } + } + } + args.push(methodName); + return this._then(caller, undefined, undefined, args, undefined); +}; + +function namedGetter(obj) { + return obj[this]; +} +function indexedGetter(obj) { + var index = +this; + if (index < 0) index = Math.max(0, index + obj.length); + return obj[index]; +} +Promise.prototype.get = function (propertyName) { + var isIndex = (typeof propertyName === "number"); + var getter; + if (!isIndex) { + if (canEvaluate) { + var maybeGetter = getGetter(propertyName); + getter = maybeGetter !== null ? maybeGetter : namedGetter; + } else { + getter = namedGetter; + } + } else { + getter = indexedGetter; + } + return this._then(getter, undefined, undefined, propertyName, undefined); +}; +}; + +},{"./util":36}],6:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, PromiseArray, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } +}; + +Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; +}; + +Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; +}; + +Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; +}; + +Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } +}; + +Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); +}; + +Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); +}; + +Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; +}; + +Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); +}; + +Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); +}; + +Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } +}; + +Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); +}; + +Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } +}; + +Promise.prototype._resultCancelled = function() { + this.cancel(); +}; + +}; + +},{"./util":36}],7:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(NEXT_FILTER) { +var util = _dereq_("./util"); +var getKeys = _dereq_("./es5").keys; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; +} + +return catchFilter; +}; + +},{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +var longStackTraces = false; +var contextStack = []; + +Promise.prototype._promiseCreated = function() {}; +Promise.prototype._pushContext = function() {}; +Promise.prototype._popContext = function() {return null;}; +Promise._peekContext = Promise.prototype._peekContext = function() {}; + +function Context() { + this._trace = new Context.CapturedTrace(peekContext()); +} +Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } +}; + +Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; +}; + +function createContext() { + if (longStackTraces) return new Context(); +} + +function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; +} +Context.CapturedTrace = null; +Context.create = createContext; +Context.deactivateLongStackTraces = function() {}; +Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; +}; +return Context; +}; + +},{}],9:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, Context, + enableAsyncHooks, disableAsyncHooks) { +var async = Promise._async; +var Warning = _dereq_("./errors").Warning; +var util = _dereq_("./util"); +var es5 = _dereq_("./es5"); +var canAttachTrace = util.canAttachTrace; +var unhandledRejectionHandled; +var possiblyUnhandledRejection; +var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; +var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; +var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; +var stackFramePattern = null; +var formatStack = null; +var indentStackFrames = false; +var printWarning; +var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (true || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + +var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + +var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + +var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + +var deferUnhandledRejectionCheck; +(function() { + var promises = []; + + function unhandledRejectionCheck() { + for (var i = 0; i < promises.length; ++i) { + promises[i]._notifyUnhandledRejection(); + } + unhandledRejectionClear(); + } + + function unhandledRejectionClear() { + promises.length = 0; + } + + deferUnhandledRejectionCheck = function(promise) { + promises.push(promise); + setTimeout(unhandledRejectionCheck, 1); + }; + + es5.defineProperty(Promise, "_unhandledRejectionCheck", { + value: unhandledRejectionCheck + }); + es5.defineProperty(Promise, "_unhandledRejectionClear", { + value: unhandledRejectionClear + }); +})(); + +Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); +}; + +Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + deferUnhandledRejectionCheck(this); +}; + +Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); +}; + +Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; +}; + +Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; +}; + +Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } +}; + +Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; +}; + +Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); +}; + +Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; +}; + +Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; +}; + +Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } +}; + +Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; +}; + +Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); +}; + +Promise.onPossiblyUnhandledRejection = function (fn) { + var context = Promise._getContext(); + possiblyUnhandledRejection = util.contextBind(context, fn); +}; + +Promise.onUnhandledRejectionHandled = function (fn) { + var context = Promise._getContext(); + unhandledRejectionHandled = util.contextBind(context, fn); +}; + +var disableLongStackTraces = function() {}; +Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Promise.prototype._dereferenceTrace = Promise_dereferenceTrace; + Context.deactivateLongStackTraces(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace; + Context.activateLongStackTraces(); + } +}; + +Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); +}; + + +var legacyHandlers = { + unhandledrejection: { + before: function() { + var ret = util.global.onunhandledrejection; + util.global.onunhandledrejection = null; + return ret; + }, + after: function(fn) { + util.global.onunhandledrejection = fn; + } + }, + rejectionhandled: { + before: function() { + var ret = util.global.onrejectionhandled; + util.global.onrejectionhandled = null; + return ret; + }, + after: function(fn) { + util.global.onrejectionhandled = fn; + } + } +}; + +var fireDomEvent = (function() { + var dispatch = function(legacy, e) { + if (legacy) { + var fn; + try { + fn = legacy.before(); + return !util.global.dispatchEvent(e); + } finally { + legacy.after(fn); + } + } else { + return !util.global.dispatchEvent(e); + } + }; + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var eventData = { + detail: event, + cancelable: true + }; + var domEvent = new CustomEvent(name, eventData); + es5.defineProperty( + domEvent, "promise", {value: event.promise}); + es5.defineProperty( + domEvent, "reason", {value: event.reason}); + + return dispatch(legacyHandlers[name], domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = new Event(name, { + cancelable: true + }); + domEvent.detail = event; + es5.defineProperty(domEvent, "promise", {value: event.promise}); + es5.defineProperty(domEvent, "reason", {value: event.reason}); + return dispatch(legacyHandlers[name], domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name, false, true, + event); + return dispatch(legacyHandlers[name], domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; +})(); + +var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } +})(); + +function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; +} + +var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject +}; + +var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; +}; + +Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) { + var prev = config.asyncHooks; + var cur = !!opts.asyncHooks; + if (prev !== cur) { + config.asyncHooks = cur; + if (cur) { + enableAsyncHooks(); + } else { + disableAsyncHooks(); + } + } + } + return Promise; +}; + +function defaultFireEvent() { return false; } + +Promise.prototype._fireEvent = defaultFireEvent; +Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } +}; +Promise.prototype._onCancel = function () {}; +Promise.prototype._setOnCancel = function (handler) { ; }; +Promise.prototype._attachCancellationCallback = function(onCancel) { + ; +}; +Promise.prototype._captureStackTrace = function () {}; +Promise.prototype._attachExtraTrace = function () {}; +Promise.prototype._dereferenceTrace = function () {}; +Promise.prototype._clearCancellationData = function() {}; +Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; +}; + +function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } +} + +function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } +} + +function cancellationOnCancel() { + return this._onCancelField; +} + +function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; +} + +function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; +} + +function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} + +function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} +var propagateFromFunction = bindingPropagateFrom; + +function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; +} + +function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); +} + +function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } +} + +function longStackTracesDereferenceTrace() { + this._trace = undefined; +} + +function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } +} + +function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); +} + +function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } +} + +function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); +} + +function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } +} + +function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } +} + +function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; +} + +function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; +} + +function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; +} + +function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } +} + +function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } +} + +function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); +} + +function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; +} + +function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; +} + +var shouldIgnore = function() { return false; }; +var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; +function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } +} + +function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = (firstLineError.stack || "").split("\n"); + var lastStackLines = (lastLineError.stack || "").split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; +} + +function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); +} +util.inherits(CapturedTrace, Error); +Context.CapturedTrace = CapturedTrace; + +CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } +}; + +CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); +}; + +var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + +})([]); + +if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } +} + +var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false, + asyncHooks: false +}; + +if (longStackTraces) Promise.longStackTraces(); + +return { + asyncHooks: function() { + return config.asyncHooks; + }, + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent +}; +}; + +},{"./errors":12,"./es5":13,"./util":36}],10:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function returner() { + return this.value; +} +function thrower() { + throw this.reason; +} + +Promise.prototype["return"] = +Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); +}; + +Promise.prototype["throw"] = +Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); +}; + +Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } +}; + +Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } +}; +}; + +},{}],11:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseReduce = Promise.reduce; +var PromiseAll = Promise.all; + +function promiseAllThis() { + return PromiseAll(this); +} + +function PromiseMapSeries(promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, INTERNAL); +} + +Promise.prototype.each = function (fn) { + return PromiseReduce(this, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, this, undefined); +}; + +Promise.prototype.mapSeries = function (fn) { + return PromiseReduce(this, fn, INTERNAL, INTERNAL); +}; + +Promise.each = function (promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, promises, undefined); +}; + +Promise.mapSeries = PromiseMapSeries; +}; + + +},{}],12:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var Objectfreeze = es5.freeze; +var util = _dereq_("./util"); +var inherits = util.inherits; +var notEnumerableProp = util.notEnumerableProp; + +function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; +} + +var _TypeError, _RangeError; +var Warning = subError("Warning", "warning"); +var CancellationError = subError("CancellationError", "cancellation error"); +var TimeoutError = subError("TimeoutError", "timeout error"); +var AggregateError = subError("AggregateError", "aggregate error"); +try { + _TypeError = TypeError; + _RangeError = RangeError; +} catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); +} + +var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + +for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } +} + +es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true +}); +AggregateError.prototype["isOperational"] = true; +var level = 0; +AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; +}; + +function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + +} +inherits(OperationalError, Error); + +var errorTypes = Error["__BluebirdErrorTypes__"]; +if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); +} + +module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning +}; + +},{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){ +var isES5 = (function(){ + "use strict"; + return this === undefined; +})(); + +if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; +} else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; +} + +},{}],14:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseMap = Promise.map; + +Promise.prototype.filter = function (fn, options) { + return PromiseMap(this, fn, options, INTERNAL); +}; + +Promise.filter = function (promises, fn, options) { + return PromiseMap(promises, fn, options, INTERNAL); +}; +}; + +},{}],15:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { +var util = _dereq_("./util"); +var CancellationError = Promise.CancellationError; +var errorObj = util.errorObj; +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); + +function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; +} + +PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; +}; + +function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; +} + +FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); +}; + +function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; +} + +function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); +} +function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; +} +function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret === NEXT_FILTER) { + return ret; + } else if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } +} + +Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); +}; + +Promise.prototype.lastly = +Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); +}; + + +Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); +}; + +Promise.prototype.tapCatch = function (handlerOrPredicate) { + var len = arguments.length; + if(len === 1) { + return this._passThrough(handlerOrPredicate, + 1, + undefined, + finallyHandler); + } else { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return Promise.reject(new TypeError( + "tapCatch statement predicate: " + + "expecting an object but got " + util.classString(item) + )); + } + } + catchInstances.length = j; + var handler = arguments[i]; + return this._passThrough(catchFilter(catchInstances, handler, this), + 1, + undefined, + finallyHandler); + } + +}; + +return PassThroughHandlerContext; +}; + +},{"./catch_filter":7,"./util":36}],16:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, + apiRejection, + INTERNAL, + tryConvertToPromise, + Proxyable, + debug) { +var errors = _dereq_("./errors"); +var TypeError = errors.TypeError; +var util = _dereq_("./util"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +var yieldHandlers = []; + +function promiseFromYieldHandler(value, yieldHandlers, traceParent) { + for (var i = 0; i < yieldHandlers.length; ++i) { + traceParent._pushContext(); + var result = tryCatch(yieldHandlers[i])(value); + traceParent._popContext(); + if (result === errorObj) { + traceParent._pushContext(); + var ret = Promise.reject(errorObj.e); + traceParent._popContext(); + return ret; + } + var maybePromise = tryConvertToPromise(result, traceParent); + if (maybePromise instanceof Promise) return maybePromise; + } + return null; +} + +function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { + if (debug.cancellation()) { + var internal = new Promise(INTERNAL); + var _finallyPromise = this._finallyPromise = new Promise(INTERNAL); + this._promise = internal.lastly(function() { + return _finallyPromise; + }); + internal._captureStackTrace(); + internal._setOnCancel(this); + } else { + var promise = this._promise = new Promise(INTERNAL); + promise._captureStackTrace(); + } + this._stack = stack; + this._generatorFunction = generatorFunction; + this._receiver = receiver; + this._generator = undefined; + this._yieldHandlers = typeof yieldHandler === "function" + ? [yieldHandler].concat(yieldHandlers) + : yieldHandlers; + this._yieldedPromise = null; + this._cancellationPhase = false; +} +util.inherits(PromiseSpawn, Proxyable); + +PromiseSpawn.prototype._isResolved = function() { + return this._promise === null; +}; + +PromiseSpawn.prototype._cleanup = function() { + this._promise = this._generator = null; + if (debug.cancellation() && this._finallyPromise !== null) { + this._finallyPromise._fulfill(); + this._finallyPromise = null; + } +}; + +PromiseSpawn.prototype._promiseCancelled = function() { + if (this._isResolved()) return; + var implementsReturn = typeof this._generator["return"] !== "undefined"; + + var result; + if (!implementsReturn) { + var reason = new Promise.CancellationError( + "generator .return() sentinel"); + Promise.coroutine.returnSentinel = reason; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + result = tryCatch(this._generator["throw"]).call(this._generator, + reason); + this._promise._popContext(); + } else { + this._promise._pushContext(); + result = tryCatch(this._generator["return"]).call(this._generator, + undefined); + this._promise._popContext(); + } + this._cancellationPhase = true; + this._yieldedPromise = null; + this._continue(result); +}; + +PromiseSpawn.prototype._promiseFulfilled = function(value) { + this._yieldedPromise = null; + this._promise._pushContext(); + var result = tryCatch(this._generator.next).call(this._generator, value); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._promiseRejected = function(reason) { + this._yieldedPromise = null; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + var result = tryCatch(this._generator["throw"]) + .call(this._generator, reason); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._resultCancelled = function() { + if (this._yieldedPromise instanceof Promise) { + var promise = this._yieldedPromise; + this._yieldedPromise = null; + promise.cancel(); + } +}; + +PromiseSpawn.prototype.promise = function () { + return this._promise; +}; + +PromiseSpawn.prototype._run = function () { + this._generator = this._generatorFunction.call(this._receiver); + this._receiver = + this._generatorFunction = undefined; + this._promiseFulfilled(undefined); +}; + +PromiseSpawn.prototype._continue = function (result) { + var promise = this._promise; + if (result === errorObj) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._rejectCallback(result.e, false); + } + } + + var value = result.value; + if (result.done === true) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._resolveCallback(value); + } + } else { + var maybePromise = tryConvertToPromise(value, this._promise); + if (!(maybePromise instanceof Promise)) { + maybePromise = + promiseFromYieldHandler(maybePromise, + this._yieldHandlers, + this._promise); + if (maybePromise === null) { + this._promiseRejected( + new TypeError( + "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) + + "From coroutine:\u000a" + + this._stack.split("\n").slice(1, -7).join("\n") + ) + ); + return; + } + } + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + this._yieldedPromise = maybePromise; + maybePromise._proxy(this, null); + } else if (((bitField & 33554432) !== 0)) { + Promise._async.invoke( + this._promiseFulfilled, this, maybePromise._value() + ); + } else if (((bitField & 16777216) !== 0)) { + Promise._async.invoke( + this._promiseRejected, this, maybePromise._reason() + ); + } else { + this._promiseCancelled(); + } + } +}; + +Promise.coroutine = function (generatorFunction, options) { + if (typeof generatorFunction !== "function") { + throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var yieldHandler = Object(options).yieldHandler; + var PromiseSpawn$ = PromiseSpawn; + var stack = new Error().stack; + return function () { + var generator = generatorFunction.apply(this, arguments); + var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, + stack); + var ret = spawn.promise(); + spawn._generator = generator; + spawn._promiseFulfilled(undefined); + return ret; + }; +}; + +Promise.coroutine.addYieldHandler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + yieldHandlers.push(fn); +}; + +Promise.spawn = function (generatorFunction) { + debug.deprecated("Promise.spawn()", "Promise.coroutine()"); + if (typeof generatorFunction !== "function") { + return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var spawn = new PromiseSpawn(generatorFunction, this); + var ret = spawn.promise(); + spawn._run(Promise.spawn); + return ret; +}; +}; + +},{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) { +var util = _dereq_("./util"); +var canEvaluate = util.canEvaluate; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var reject; + +if (!true) { +if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; +}} + +Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (!true) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var context = Promise._getContext(); + holder.fn = util.contextBind(context, holder.fn); + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var args = [].slice.call(arguments);; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; +}; + +}; + +},{"./util":36}],18:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +function MappingPromiseArray(promises, fn, limit, _filter) { + this.constructor$(promises); + this._promise._captureStackTrace(); + var context = Promise._getContext(); + this._callback = util.contextBind(context, fn); + this._preservedValues = _filter === INTERNAL + ? new Array(this.length()) + : null; + this._limit = limit; + this._inFlight = 0; + this._queue = []; + async.invoke(this._asyncInit, this, undefined); + if (util.isArray(promises)) { + for (var i = 0; i < promises.length; ++i) { + var maybePromise = promises[i]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + } +} +util.inherits(MappingPromiseArray, PromiseArray); + +MappingPromiseArray.prototype._asyncInit = function() { + this._init$(undefined, -2); +}; + +MappingPromiseArray.prototype._init = function () {}; + +MappingPromiseArray.prototype._promiseFulfilled = function (value, index) { + var values = this._values; + var length = this.length(); + var preservedValues = this._preservedValues; + var limit = this._limit; + + if (index < 0) { + index = (index * -1) - 1; + values[index] = value; + if (limit >= 1) { + this._inFlight--; + this._drainQueue(); + if (this._isResolved()) return true; + } + } else { + if (limit >= 1 && this._inFlight >= limit) { + values[index] = value; + this._queue.push(index); + return false; + } + if (preservedValues !== null) preservedValues[index] = value; + + var promise = this._promise; + var callback = this._callback; + var receiver = promise._boundValue(); + promise._pushContext(); + var ret = tryCatch(callback).call(receiver, value, index, length); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + preservedValues !== null ? "Promise.filter" : "Promise.map", + promise + ); + if (ret === errorObj) { + this._reject(ret.e); + return true; + } + + var maybePromise = tryConvertToPromise(ret, this._promise); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + if (limit >= 1) this._inFlight++; + values[index] = maybePromise; + maybePromise._proxy(this, (index + 1) * -1); + return false; + } else if (((bitField & 33554432) !== 0)) { + ret = maybePromise._value(); + } else if (((bitField & 16777216) !== 0)) { + this._reject(maybePromise._reason()); + return true; + } else { + this._cancel(); + return true; + } + } + values[index] = ret; + } + var totalResolved = ++this._totalResolved; + if (totalResolved >= length) { + if (preservedValues !== null) { + this._filter(values, preservedValues); + } else { + this._resolve(values); + } + return true; + } + return false; +}; + +MappingPromiseArray.prototype._drainQueue = function () { + var queue = this._queue; + var limit = this._limit; + var values = this._values; + while (queue.length > 0 && this._inFlight < limit) { + if (this._isResolved()) return; + var index = queue.pop(); + this._promiseFulfilled(values[index], index); + } +}; + +MappingPromiseArray.prototype._filter = function (booleans, values) { + var len = values.length; + var ret = new Array(len); + var j = 0; + for (var i = 0; i < len; ++i) { + if (booleans[i]) ret[j++] = values[i]; + } + ret.length = j; + this._resolve(ret); +}; + +MappingPromiseArray.prototype.preservedValues = function () { + return this._preservedValues; +}; + +function map(promises, fn, options, _filter) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + + var limit = 0; + if (options !== undefined) { + if (typeof options === "object" && options !== null) { + if (typeof options.concurrency !== "number") { + return Promise.reject( + new TypeError("'concurrency' must be a number but it is " + + util.classString(options.concurrency))); + } + limit = options.concurrency; + } else { + return Promise.reject(new TypeError( + "options argument must be an object but it is " + + util.classString(options))); + } + } + limit = typeof limit === "number" && + isFinite(limit) && limit >= 1 ? limit : 0; + return new MappingPromiseArray(promises, fn, limit, _filter).promise(); +} + +Promise.prototype.map = function (fn, options) { + return map(this, fn, options, null); +}; + +Promise.map = function (promises, fn, options, _filter) { + return map(promises, fn, options, _filter); +}; + + +}; + +},{"./util":36}],19:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; + +Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; +}; + +Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; +}; + +Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } +}; +}; + +},{"./util":36}],20:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var maybeWrapAsError = util.maybeWrapAsError; +var errors = _dereq_("./errors"); +var OperationalError = errors.OperationalError; +var es5 = _dereq_("./es5"); + +function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; +} + +var rErrorKey = /^(?:name|message|stack|cause)$/; +function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; +} + +function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var args = [].slice.call(arguments, 1);; + promise._fulfill(args); + } + promise = null; + }; +} + +module.exports = nodebackForPromise; + +},{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +var util = _dereq_("./util"); +var async = Promise._async; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function spreadAdapter(val, nodeback) { + var promise = this; + if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); + var ret = + tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +function successAdapter(val, nodeback) { + var promise = this; + var receiver = promise._boundValue(); + var ret = val === undefined + ? tryCatch(nodeback).call(receiver, null) + : tryCatch(nodeback).call(receiver, null, val); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} +function errorAdapter(reason, nodeback) { + var promise = this; + if (!reason) { + var newReason = new Error(reason + ""); + newReason.cause = reason; + reason = newReason; + } + var ret = tryCatch(nodeback).call(promise._boundValue(), reason); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, + options) { + if (typeof nodeback == "function") { + var adapter = successAdapter; + if (options !== undefined && Object(options).spread) { + adapter = spreadAdapter; + } + this._then( + adapter, + errorAdapter, + undefined, + this, + nodeback + ); + } + return this; +}; +}; + +},{"./util":36}],22:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function() { +var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); +}; +var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); +}; +function Proxyable() {} +var UNDEFINED_BINDING = {}; +var util = _dereq_("./util"); +util.setReflectHandler(reflectHandler); + +var getDomain = function() { + var domain = process.domain; + if (domain === undefined) { + return null; + } + return domain; +}; +var getContextDefault = function() { + return null; +}; +var getContextDomain = function() { + return { + domain: getDomain(), + async: null + }; +}; +var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? + _dereq_("async_hooks").AsyncResource : null; +var getContextAsyncHooks = function() { + return { + domain: getDomain(), + async: new AsyncResource("Bluebird::Promise") + }; +}; +var getContext = util.isNode ? getContextDomain : getContextDefault; +util.notEnumerableProp(Promise, "_getContext", getContext); +var enableAsyncHooks = function() { + getContext = getContextAsyncHooks; + util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); +}; +var disableAsyncHooks = function() { + getContext = getContextDomain; + util.notEnumerableProp(Promise, "_getContext", getContextDomain); +}; + +var es5 = _dereq_("./es5"); +var Async = _dereq_("./async"); +var async = new Async(); +es5.defineProperty(Promise, "_async", {value: async}); +var errors = _dereq_("./errors"); +var TypeError = Promise.TypeError = errors.TypeError; +Promise.RangeError = errors.RangeError; +var CancellationError = Promise.CancellationError = errors.CancellationError; +Promise.TimeoutError = errors.TimeoutError; +Promise.OperationalError = errors.OperationalError; +Promise.RejectionError = errors.OperationalError; +Promise.AggregateError = errors.AggregateError; +var INTERNAL = function(){}; +var APPLY = {}; +var NEXT_FILTER = {}; +var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL); +var PromiseArray = + _dereq_("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); +var Context = _dereq_("./context")(Promise); + /*jshint unused:false*/ +var createContext = Context.create; + +var debug = _dereq_("./debuggability")(Promise, Context, + enableAsyncHooks, disableAsyncHooks); +var CapturedTrace = debug.CapturedTrace; +var PassThroughHandlerContext = + _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); +var nodebackForPromise = _dereq_("./nodeback"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +function check(self, executor) { + if (self == null || self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + +} + +function Promise(executor) { + if (executor !== INTERNAL) { + check(this, executor); + } + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + this._resolveFromExecutor(executor); + this._promiseCreated(); + this._fireEvent("promiseCreated", this); +} + +Promise.prototype.toString = function () { + return "[object Promise]"; +}; + +Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("Catch statement predicate: " + + "expecting an object but got " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + + if (typeof fn !== "function") { + throw new TypeError("The last argument to .catch() " + + "must be a function, got " + util.toString(fn)); + } + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); +}; + +Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); +}; + +Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); +}; + +Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); +}; + +Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); +}; + +Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; +}; + +Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); +}; + +Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); +}; + +Promise.getNewLibraryCopy = module.exports; + +Promise.is = function (val) { + return val instanceof Promise; +}; + +Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.all = function (promises) { + return new PromiseArray(promises).promise(); +}; + +Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; +}; + +Promise.resolve = Promise.fulfilled = Promise.cast; + +Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; +}; + +Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); +}; + +Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData +) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var context = getContext(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: util.contextBind(context, handler), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, + receiver, context); + } + + return promise; +}; + +Promise.prototype._length = function () { + return this._bitField & 65535; +}; + +Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; +}; + +Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; +}; + +Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); +}; + +Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); +}; + +Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); +}; + +Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); +}; + +Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; +}; + +Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; +}; + +Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); +}; + +Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); +}; + +Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; +}; + +Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + var bitField = this._bitField; + this._bitField = bitField | + (((bitField & 536870912) >> 2) ^ + 134217728); +}; + +Promise.prototype._setNoAsyncGuarantee = function() { + this._bitField = (this._bitField | 536870912) & + (~134217728); +}; + +Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; +}; + +Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; +}; + +Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; +}; + +Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; +}; + +Promise.prototype._boundValue = function() {}; + +Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + context +) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = util.contextBind(context, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + util.contextBind(context, reject); + } + } + this._setLength(index + 1); + return index; +}; + +Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); +}; + +Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(maybePromise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } +}; + +Promise.prototype._rejectCallback = +function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); +}; + +Promise.prototype._resolveFromExecutor = function (executor) { + if (executor === INTERNAL) return; + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } +}; + +Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise +) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } +}; + +Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; +}; + +Promise.prototype._followee = function() { + return this._rejectionHandler0; +}; + +Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; +}; + +Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } +}; + +Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } +}; + +Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); +}; + +Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); +}; + +Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; +}; + +Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + this._dereferenceTrace(); + } +}; + +Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } +}; + +Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } +}; + +Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } +}; + +Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); +}; + +Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } +}; + +if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + es5.defineProperty(Promise.prototype, Symbol.toStringTag, { + get: function () { + return "Object"; + } + }); +} + +function deferResolve(v) {this.promise._resolveCallback(v);} +function deferReject(v) {this.promise._rejectCallback(v, false);} + +Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; +}; + +util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + +_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); +_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); +_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug); +_dereq_("./direct_resolve")(Promise); +_dereq_("./synchronous_inspection")(Promise); +_dereq_("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); +Promise.Promise = Promise; +Promise.version = "3.7.2"; +_dereq_('./call_get.js')(Promise); +_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); +_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +_dereq_('./nodeify.js')(Promise); +_dereq_('./promisify.js')(Promise, INTERNAL); +_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); +_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); +_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +_dereq_('./settle.js')(Promise, PromiseArray, debug); +_dereq_('./some.js')(Promise, PromiseArray, apiRejection); +_dereq_('./timers.js')(Promise, INTERNAL, debug); +_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); +_dereq_('./any.js')(Promise); +_dereq_('./each.js')(Promise, INTERNAL); +_dereq_('./filter.js')(Promise, INTERNAL); + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + +}; + +},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,"async_hooks":undefined}],23:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { +var util = _dereq_("./util"); +var isArray = util.isArray; + +function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + case -6: return new Map(); + } +} + +function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + values.suppressUnhandledRejections(); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); +} +util.inherits(PromiseArray, Proxyable); + +PromiseArray.prototype.length = function () { + return this._length; +}; + +PromiseArray.prototype.promise = function () { + return this._promise; +}; + +PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); +}; + +PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); +}; + +PromiseArray.prototype._isResolved = function () { + return this._values === null; +}; + +PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); +}; + +PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); +}; + +PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); +}; + +PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; +}; + +PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; +}; + +PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } +}; + +PromiseArray.prototype.shouldCopyValues = function () { + return true; +}; + +PromiseArray.prototype.getActualLength = function (len) { + return len; +}; + +return PromiseArray; +}; + +},{"./util":36}],24:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var THIS = {}; +var util = _dereq_("./util"); +var nodebackForPromise = _dereq_("./nodeback"); +var withAppended = util.withAppended; +var maybeWrapAsError = util.maybeWrapAsError; +var canEvaluate = util.canEvaluate; +var TypeError = _dereq_("./errors").TypeError; +var defaultSuffix = "Async"; +var defaultPromisified = {__isPromisified__: true}; +var noCopyProps = [ + "arity", "length", + "name", + "arguments", + "caller", + "callee", + "prototype", + "__isPromisified__" +]; +var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$"); + +var defaultFilter = function(name) { + return util.isIdentifier(name) && + name.charAt(0) !== "_" && + name !== "constructor"; +}; + +function propsFilter(key) { + return !noCopyPropsPattern.test(key); +} + +function isPromisified(fn) { + try { + return fn.__isPromisified__ === true; + } + catch (e) { + return false; + } +} + +function hasPromisified(obj, key, suffix) { + var val = util.getDataPropertyOrDefault(obj, key + suffix, + defaultPromisified); + return val ? isPromisified(val) : false; +} +function checkValid(ret, suffix, suffixRegexp) { + for (var i = 0; i < ret.length; i += 2) { + var key = ret[i]; + if (suffixRegexp.test(key)) { + var keyWithoutAsyncSuffix = key.replace(suffixRegexp, ""); + for (var j = 0; j < ret.length; j += 2) { + if (ret[j] === keyWithoutAsyncSuffix) { + throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a" + .replace("%s", suffix)); + } + } + } + } +} + +function promisifiableMethods(obj, suffix, suffixRegexp, filter) { + var keys = util.inheritedDataKeys(obj); + var ret = []; + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var value = obj[key]; + var passesDefaultFilter = filter === defaultFilter + ? true : defaultFilter(key, value, obj); + if (typeof value === "function" && + !isPromisified(value) && + !hasPromisified(obj, key, suffix) && + filter(key, value, obj, passesDefaultFilter)) { + ret.push(key, value); + } + } + checkValid(ret, suffix, suffixRegexp); + return ret; +} + +var escapeIdentRegex = function(str) { + return str.replace(/([$])/, "\\$"); +}; + +var makeNodePromisifiedEval; +if (!true) { +var switchCaseArgumentOrder = function(likelyArgumentCount) { + var ret = [likelyArgumentCount]; + var min = Math.max(0, likelyArgumentCount - 1 - 3); + for(var i = likelyArgumentCount - 1; i >= min; --i) { + ret.push(i); + } + for(var i = likelyArgumentCount + 1; i <= 3; ++i) { + ret.push(i); + } + return ret; +}; + +var argumentSequence = function(argumentCount) { + return util.filledRange(argumentCount, "_arg", ""); +}; + +var parameterDeclaration = function(parameterCount) { + return util.filledRange( + Math.max(parameterCount, 3), "_arg", ""); +}; + +var parameterCount = function(fn) { + if (typeof fn.length === "number") { + return Math.max(Math.min(fn.length, 1023 + 1), 0); + } + return 0; +}; + +makeNodePromisifiedEval = +function(callback, receiver, originalName, fn, _, multiArgs) { + var newParameterCount = Math.max(0, parameterCount(fn) - 1); + var argumentOrder = switchCaseArgumentOrder(newParameterCount); + var shouldProxyThis = typeof callback === "string" || receiver === THIS; + + function generateCallForArgumentCount(count) { + var args = argumentSequence(count).join(", "); + var comma = count > 0 ? ", " : ""; + var ret; + if (shouldProxyThis) { + ret = "ret = callback.call(this, {{args}}, nodeback); break;\n"; + } else { + ret = receiver === undefined + ? "ret = callback({{args}}, nodeback); break;\n" + : "ret = callback.call(receiver, {{args}}, nodeback); break;\n"; + } + return ret.replace("{{args}}", args).replace(", ", comma); + } + + function generateArgumentSwitchCase() { + var ret = ""; + for (var i = 0; i < argumentOrder.length; ++i) { + ret += "case " + argumentOrder[i] +":" + + generateCallForArgumentCount(argumentOrder[i]); + } + + ret += " \n\ + default: \n\ + var args = new Array(len + 1); \n\ + var i = 0; \n\ + for (var i = 0; i < len; ++i) { \n\ + args[i] = arguments[i]; \n\ + } \n\ + args[i] = nodeback; \n\ + [CodeForCall] \n\ + break; \n\ + ".replace("[CodeForCall]", (shouldProxyThis + ? "ret = callback.apply(this, args);\n" + : "ret = callback.apply(receiver, args);\n")); + return ret; + } + + var getFunctionCode = typeof callback === "string" + ? ("this != null ? this['"+callback+"'] : fn") + : "fn"; + var body = "'use strict'; \n\ + var ret = function (Parameters) { \n\ + 'use strict'; \n\ + var len = arguments.length; \n\ + var promise = new Promise(INTERNAL); \n\ + promise._captureStackTrace(); \n\ + var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\ + var ret; \n\ + var callback = tryCatch([GetFunctionCode]); \n\ + switch(len) { \n\ + [CodeForSwitchCase] \n\ + } \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\ + } \n\ + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\ + return promise; \n\ + }; \n\ + notEnumerableProp(ret, '__isPromisified__', true); \n\ + return ret; \n\ + ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase()) + .replace("[GetFunctionCode]", getFunctionCode); + body = body.replace("Parameters", parameterDeclaration(newParameterCount)); + return new Function("Promise", + "fn", + "receiver", + "withAppended", + "maybeWrapAsError", + "nodebackForPromise", + "tryCatch", + "errorObj", + "notEnumerableProp", + "INTERNAL", + body)( + Promise, + fn, + receiver, + withAppended, + maybeWrapAsError, + nodebackForPromise, + util.tryCatch, + util.errorObj, + util.notEnumerableProp, + INTERNAL); +}; +} + +function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) { + var defaultThis = (function() {return this;})(); + var method = callback; + if (typeof method === "string") { + callback = fn; + } + function promisified() { + var _receiver = receiver; + if (receiver === THIS) _receiver = this; + var promise = new Promise(INTERNAL); + promise._captureStackTrace(); + var cb = typeof method === "string" && this !== defaultThis + ? this[method] : callback; + var fn = nodebackForPromise(promise, multiArgs); + try { + cb.apply(_receiver, withAppended(arguments, fn)); + } catch(e) { + promise._rejectCallback(maybeWrapAsError(e), true, true); + } + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); + return promise; + } + util.notEnumerableProp(promisified, "__isPromisified__", true); + return promisified; +} + +var makeNodePromisified = canEvaluate + ? makeNodePromisifiedEval + : makeNodePromisifiedClosure; + +function promisifyAll(obj, suffix, filter, promisifier, multiArgs) { + var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$"); + var methods = + promisifiableMethods(obj, suffix, suffixRegexp, filter); + + for (var i = 0, len = methods.length; i < len; i+= 2) { + var key = methods[i]; + var fn = methods[i+1]; + var promisifiedKey = key + suffix; + if (promisifier === makeNodePromisified) { + obj[promisifiedKey] = + makeNodePromisified(key, THIS, key, fn, suffix, multiArgs); + } else { + var promisified = promisifier(fn, function() { + return makeNodePromisified(key, THIS, key, + fn, suffix, multiArgs); + }); + util.notEnumerableProp(promisified, "__isPromisified__", true); + obj[promisifiedKey] = promisified; + } + } + util.toFastProperties(obj); + return obj; +} + +function promisify(callback, receiver, multiArgs) { + return makeNodePromisified(callback, receiver, undefined, + callback, null, multiArgs); +} + +Promise.promisify = function (fn, options) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + if (isPromisified(fn)) { + return fn; + } + options = Object(options); + var receiver = options.context === undefined ? THIS : options.context; + var multiArgs = !!options.multiArgs; + var ret = promisify(fn, receiver, multiArgs); + util.copyDescriptors(fn, ret, propsFilter); + return ret; +}; + +Promise.promisifyAll = function (target, options) { + if (typeof target !== "function" && typeof target !== "object") { + throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + options = Object(options); + var multiArgs = !!options.multiArgs; + var suffix = options.suffix; + if (typeof suffix !== "string") suffix = defaultSuffix; + var filter = options.filter; + if (typeof filter !== "function") filter = defaultFilter; + var promisifier = options.promisifier; + if (typeof promisifier !== "function") promisifier = makeNodePromisified; + + if (!util.isIdentifier(suffix)) { + throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + + var keys = util.inheritedDataKeys(target); + for (var i = 0; i < keys.length; ++i) { + var value = target[keys[i]]; + if (keys[i] !== "constructor" && + util.isClass(value)) { + promisifyAll(value.prototype, suffix, filter, promisifier, + multiArgs); + promisifyAll(value, suffix, filter, promisifier, multiArgs); + } + } + + return promisifyAll(target, suffix, filter, promisifier, multiArgs); +}; +}; + + +},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function( + Promise, PromiseArray, tryConvertToPromise, apiRejection) { +var util = _dereq_("./util"); +var isObject = util.isObject; +var es5 = _dereq_("./es5"); +var Es6Map; +if (typeof Map === "function") Es6Map = Map; + +var mapToEntries = (function() { + var index = 0; + var size = 0; + + function extractEntry(value, key) { + this[index] = value; + this[index + size] = key; + index++; + } + + return function mapToEntries(map) { + size = map.size; + index = 0; + var ret = new Array(map.size * 2); + map.forEach(extractEntry, ret); + return ret; + }; +})(); + +var entriesToMap = function(entries) { + var ret = new Es6Map(); + var length = entries.length / 2 | 0; + for (var i = 0; i < length; ++i) { + var key = entries[length + i]; + var value = entries[i]; + ret.set(key, value); + } + return ret; +}; + +function PropertiesPromiseArray(obj) { + var isMap = false; + var entries; + if (Es6Map !== undefined && obj instanceof Es6Map) { + entries = mapToEntries(obj); + isMap = true; + } else { + var keys = es5.keys(obj); + var len = keys.length; + entries = new Array(len * 2); + for (var i = 0; i < len; ++i) { + var key = keys[i]; + entries[i] = obj[key]; + entries[i + len] = key; + } + } + this.constructor$(entries); + this._isMap = isMap; + this._init$(undefined, isMap ? -6 : -3); +} +util.inherits(PropertiesPromiseArray, PromiseArray); + +PropertiesPromiseArray.prototype._init = function () {}; + +PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + var val; + if (this._isMap) { + val = entriesToMap(this._values); + } else { + val = {}; + var keyOffset = this.length(); + for (var i = 0, len = this.length(); i < len; ++i) { + val[this._values[i + keyOffset]] = this._values[i]; + } + } + this._resolve(val); + return true; + } + return false; +}; + +PropertiesPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +PropertiesPromiseArray.prototype.getActualLength = function (len) { + return len >> 1; +}; + +function props(promises) { + var ret; + var castValue = tryConvertToPromise(promises); + + if (!isObject(castValue)) { + return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } else if (castValue instanceof Promise) { + ret = castValue._then( + Promise.props, undefined, undefined, undefined, undefined); + } else { + ret = new PropertiesPromiseArray(castValue).promise(); + } + + if (castValue instanceof Promise) { + ret._propagateFrom(castValue, 2); + } + return ret; +} + +Promise.prototype.props = function () { + return props(this); +}; + +Promise.props = function (promises) { + return props(promises); +}; +}; + +},{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){ +"use strict"; +function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } +} + +function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; +} + +Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; +}; + +Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; +}; + +Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; +}; + +Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; +}; + +Queue.prototype.length = function () { + return this._length; +}; + +Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } +}; + +Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); +}; + +module.exports = Queue; + +},{}],27:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function( + Promise, INTERNAL, tryConvertToPromise, apiRejection) { +var util = _dereq_("./util"); + +var raceLater = function (promise) { + return promise.then(function(array) { + return race(array, promise); + }); +}; + +function race(promises, parent) { + var maybePromise = tryConvertToPromise(promises); + + if (maybePromise instanceof Promise) { + return raceLater(maybePromise); + } else { + promises = util.asArray(promises); + if (promises === null) + return apiRejection("expecting an array or an iterable object but got " + util.classString(promises)); + } + + var ret = new Promise(INTERNAL); + if (parent !== undefined) { + ret._propagateFrom(parent, 3); + } + var fulfill = ret._fulfill; + var reject = ret._reject; + for (var i = 0, len = promises.length; i < len; ++i) { + var val = promises[i]; + + if (val === undefined && !(i in promises)) { + continue; + } + + Promise.cast(val)._then(fulfill, reject, undefined, ret, null); + } + return ret; +} + +Promise.race = function (promises) { + return race(promises, undefined); +}; + +Promise.prototype.race = function () { + return race(this, undefined); +}; + +}; + +},{"./util":36}],28:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; + +function ReductionPromiseArray(promises, fn, initialValue, _each) { + this.constructor$(promises); + var context = Promise._getContext(); + this._fn = util.contextBind(context, fn); + if (initialValue !== undefined) { + initialValue = Promise.resolve(initialValue); + initialValue._attachCancellationCallback(this); + } + this._initialValue = initialValue; + this._currentCancellable = null; + if(_each === INTERNAL) { + this._eachValues = Array(this._length); + } else if (_each === 0) { + this._eachValues = null; + } else { + this._eachValues = undefined; + } + this._promise._captureStackTrace(); + this._init$(undefined, -5); +} +util.inherits(ReductionPromiseArray, PromiseArray); + +ReductionPromiseArray.prototype._gotAccum = function(accum) { + if (this._eachValues !== undefined && + this._eachValues !== null && + accum !== INTERNAL) { + this._eachValues.push(accum); + } +}; + +ReductionPromiseArray.prototype._eachComplete = function(value) { + if (this._eachValues !== null) { + this._eachValues.push(value); + } + return this._eachValues; +}; + +ReductionPromiseArray.prototype._init = function() {}; + +ReductionPromiseArray.prototype._resolveEmptyArray = function() { + this._resolve(this._eachValues !== undefined ? this._eachValues + : this._initialValue); +}; + +ReductionPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +ReductionPromiseArray.prototype._resolve = function(value) { + this._promise._resolveCallback(value); + this._values = null; +}; + +ReductionPromiseArray.prototype._resultCancelled = function(sender) { + if (sender === this._initialValue) return this._cancel(); + if (this._isResolved()) return; + this._resultCancelled$(); + if (this._currentCancellable instanceof Promise) { + this._currentCancellable.cancel(); + } + if (this._initialValue instanceof Promise) { + this._initialValue.cancel(); + } +}; + +ReductionPromiseArray.prototype._iterate = function (values) { + this._values = values; + var value; + var i; + var length = values.length; + if (this._initialValue !== undefined) { + value = this._initialValue; + i = 0; + } else { + value = Promise.resolve(values[0]); + i = 1; + } + + this._currentCancellable = value; + + for (var j = i; j < length; ++j) { + var maybePromise = values[j]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + + if (!value.isRejected()) { + for (; i < length; ++i) { + var ctx = { + accum: null, + value: values[i], + index: i, + length: length, + array: this + }; + + value = value._then(gotAccum, undefined, undefined, ctx, undefined); + + if ((i & 127) === 0) { + value._setNoAsyncGuarantee(); + } + } + } + + if (this._eachValues !== undefined) { + value = value + ._then(this._eachComplete, undefined, undefined, this, undefined); + } + value._then(completed, completed, undefined, value, this); +}; + +Promise.prototype.reduce = function (fn, initialValue) { + return reduce(this, fn, initialValue, null); +}; + +Promise.reduce = function (promises, fn, initialValue, _each) { + return reduce(promises, fn, initialValue, _each); +}; + +function completed(valueOrReason, array) { + if (this.isFulfilled()) { + array._resolve(valueOrReason); + } else { + array._reject(valueOrReason); + } +} + +function reduce(promises, fn, initialValue, _each) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var array = new ReductionPromiseArray(promises, fn, initialValue, _each); + return array.promise(); +} + +function gotAccum(accum) { + this.accum = accum; + this.array._gotAccum(accum); + var value = tryConvertToPromise(this.value, this.array._promise); + if (value instanceof Promise) { + this.array._currentCancellable = value; + return value._then(gotValue, undefined, undefined, this, undefined); + } else { + return gotValue.call(this, value); + } +} + +function gotValue(value) { + var array = this.array; + var promise = array._promise; + var fn = tryCatch(array._fn); + promise._pushContext(); + var ret; + if (array._eachValues !== undefined) { + ret = fn.call(promise._boundValue(), value, this.index, this.length); + } else { + ret = fn.call(promise._boundValue(), + this.accum, value, this.index, this.length); + } + if (ret instanceof Promise) { + array._currentCancellable = ret; + } + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", + promise + ); + return ret; +} +}; + +},{"./util":36}],29:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var schedule; +var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var NativePromise = util.getNativePromise(); +if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; +} else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova)) && + ("classList" in document.documentElement)) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); +} else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; +} else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; +} else { + schedule = noAsyncScheduler; +} +module.exports = schedule; + +},{"./util":36}],30:[function(_dereq_,module,exports){ +"use strict"; +module.exports = + function(Promise, PromiseArray, debug) { +var PromiseInspection = Promise.PromiseInspection; +var util = _dereq_("./util"); + +function SettledPromiseArray(values) { + this.constructor$(values); +} +util.inherits(SettledPromiseArray, PromiseArray); + +SettledPromiseArray.prototype._promiseResolved = function (index, inspection) { + this._values[index] = inspection; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +SettledPromiseArray.prototype._promiseFulfilled = function (value, index) { + var ret = new PromiseInspection(); + ret._bitField = 33554432; + ret._settledValueField = value; + return this._promiseResolved(index, ret); +}; +SettledPromiseArray.prototype._promiseRejected = function (reason, index) { + var ret = new PromiseInspection(); + ret._bitField = 16777216; + ret._settledValueField = reason; + return this._promiseResolved(index, ret); +}; + +Promise.settle = function (promises) { + debug.deprecated(".settle()", ".reflect()"); + return new SettledPromiseArray(promises).promise(); +}; + +Promise.allSettled = function (promises) { + return new SettledPromiseArray(promises).promise(); +}; + +Promise.prototype.settle = function () { + return Promise.settle(this); +}; +}; + +},{"./util":36}],31:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, PromiseArray, apiRejection) { +var util = _dereq_("./util"); +var RangeError = _dereq_("./errors").RangeError; +var AggregateError = _dereq_("./errors").AggregateError; +var isArray = util.isArray; +var CANCELLATION = {}; + + +function SomePromiseArray(values) { + this.constructor$(values); + this._howMany = 0; + this._unwrap = false; + this._initialized = false; +} +util.inherits(SomePromiseArray, PromiseArray); + +SomePromiseArray.prototype._init = function () { + if (!this._initialized) { + return; + } + if (this._howMany === 0) { + this._resolve([]); + return; + } + this._init$(undefined, -5); + var isArrayResolved = isArray(this._values); + if (!this._isResolved() && + isArrayResolved && + this._howMany > this._canPossiblyFulfill()) { + this._reject(this._getRangeError(this.length())); + } +}; + +SomePromiseArray.prototype.init = function () { + this._initialized = true; + this._init(); +}; + +SomePromiseArray.prototype.setUnwrap = function () { + this._unwrap = true; +}; + +SomePromiseArray.prototype.howMany = function () { + return this._howMany; +}; + +SomePromiseArray.prototype.setHowMany = function (count) { + this._howMany = count; +}; + +SomePromiseArray.prototype._promiseFulfilled = function (value) { + this._addFulfilled(value); + if (this._fulfilled() === this.howMany()) { + this._values.length = this.howMany(); + if (this.howMany() === 1 && this._unwrap) { + this._resolve(this._values[0]); + } else { + this._resolve(this._values); + } + return true; + } + return false; + +}; +SomePromiseArray.prototype._promiseRejected = function (reason) { + this._addRejected(reason); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._promiseCancelled = function () { + if (this._values instanceof Promise || this._values == null) { + return this._cancel(); + } + this._addRejected(CANCELLATION); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._checkOutcome = function() { + if (this.howMany() > this._canPossiblyFulfill()) { + var e = new AggregateError(); + for (var i = this.length(); i < this._values.length; ++i) { + if (this._values[i] !== CANCELLATION) { + e.push(this._values[i]); + } + } + if (e.length > 0) { + this._reject(e); + } else { + this._cancel(); + } + return true; + } + return false; +}; + +SomePromiseArray.prototype._fulfilled = function () { + return this._totalResolved; +}; + +SomePromiseArray.prototype._rejected = function () { + return this._values.length - this.length(); +}; + +SomePromiseArray.prototype._addRejected = function (reason) { + this._values.push(reason); +}; + +SomePromiseArray.prototype._addFulfilled = function (value) { + this._values[this._totalResolved++] = value; +}; + +SomePromiseArray.prototype._canPossiblyFulfill = function () { + return this.length() - this._rejected(); +}; + +SomePromiseArray.prototype._getRangeError = function (count) { + var message = "Input array must contain at least " + + this._howMany + " items but contains only " + count + " items"; + return new RangeError(message); +}; + +SomePromiseArray.prototype._resolveEmptyArray = function () { + this._reject(this._getRangeError(0)); +}; + +function some(promises, howMany) { + if ((howMany | 0) !== howMany || howMany < 0) { + return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(howMany); + ret.init(); + return promise; +} + +Promise.some = function (promises, howMany) { + return some(promises, howMany); +}; + +Promise.prototype.some = function (howMany) { + return some(this, howMany); +}; + +Promise._SomePromiseArray = SomePromiseArray; +}; + +},{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } +} + +PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; +}; + +var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var reason = PromiseInspection.prototype.error = +PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; +}; + +var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; +}; + +var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; +}; + +var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; +}; + +PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; +}; + +Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; +}; + +Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); +}; + +Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; +}; + +Promise.prototype.isPending = function() { + return isPending.call(this._target()); +}; + +Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); +}; + +Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); +}; + +Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); +}; + +Promise.prototype.value = function() { + return value.call(this._target()); +}; + +Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); +}; + +Promise.prototype._value = function() { + return this._settledValue(); +}; + +Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); +}; + +Promise.PromiseInspection = PromiseInspection; +}; + +},{}],33:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var util = _dereq_("./util"); +var errorObj = util.errorObj; +var isObject = util.isObject; + +function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; +} + +function doGetThen(obj) { + return obj.then; +} + +function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} + +var hasProp = {}.hasOwnProperty; +function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } +} + +function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; +} + +return tryConvertToPromise; +}; + +},{"./util":36}],34:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, debug) { +var util = _dereq_("./util"); +var TimeoutError = Promise.TimeoutError; + +function HandleWrapper(handle) { + this.handle = handle; +} + +HandleWrapper.prototype._resultCancelled = function() { + clearTimeout(this.handle); +}; + +var afterValue = function(value) { return delay(+this).thenReturn(value); }; +var delay = Promise.delay = function (ms, value) { + var ret; + var handle; + if (value !== undefined) { + ret = Promise.resolve(value) + ._then(afterValue, null, null, ms, undefined); + if (debug.cancellation() && value instanceof Promise) { + ret._setOnCancel(value); + } + } else { + ret = new Promise(INTERNAL); + handle = setTimeout(function() { ret._fulfill(); }, +ms); + if (debug.cancellation()) { + ret._setOnCancel(new HandleWrapper(handle)); + } + ret._captureStackTrace(); + } + ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.prototype.delay = function (ms) { + return delay(ms, this); +}; + +var afterTimeout = function (promise, message, parent) { + var err; + if (typeof message !== "string") { + if (message instanceof Error) { + err = message; + } else { + err = new TimeoutError("operation timed out"); + } + } else { + err = new TimeoutError(message); + } + util.markAsOriginatingFromRejection(err); + promise._attachExtraTrace(err); + promise._reject(err); + + if (parent != null) { + parent.cancel(); + } +}; + +function successClear(value) { + clearTimeout(this.handle); + return value; +} + +function failureClear(reason) { + clearTimeout(this.handle); + throw reason; +} + +Promise.prototype.timeout = function (ms, message) { + ms = +ms; + var ret, parent; + + var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { + if (ret.isPending()) { + afterTimeout(ret, message, parent); + } + }, ms)); + + if (debug.cancellation()) { + parent = this.then(); + ret = parent._then(successClear, failureClear, + undefined, handleWrapper, undefined); + ret._setOnCancel(handleWrapper); + } else { + ret = this._then(successClear, failureClear, + undefined, handleWrapper, undefined); + } + + return ret; +}; + +}; + +},{"./util":36}],35:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function (Promise, apiRejection, tryConvertToPromise, + createContext, INTERNAL, debug) { + var util = _dereq_("./util"); + var TypeError = _dereq_("./errors").TypeError; + var inherits = _dereq_("./util").inherits; + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + var NULL = {}; + + function thrower(e) { + setTimeout(function(){throw e;}, 0); + } + + function castPreservingDisposable(thenable) { + var maybePromise = tryConvertToPromise(thenable); + if (maybePromise !== thenable && + typeof thenable._isDisposable === "function" && + typeof thenable._getDisposer === "function" && + thenable._isDisposable()) { + maybePromise._setDisposable(thenable._getDisposer()); + } + return maybePromise; + } + function dispose(resources, inspection) { + var i = 0; + var len = resources.length; + var ret = new Promise(INTERNAL); + function iterator() { + if (i >= len) return ret._fulfill(); + var maybePromise = castPreservingDisposable(resources[i++]); + if (maybePromise instanceof Promise && + maybePromise._isDisposable()) { + try { + maybePromise = tryConvertToPromise( + maybePromise._getDisposer().tryDispose(inspection), + resources.promise); + } catch (e) { + return thrower(e); + } + if (maybePromise instanceof Promise) { + return maybePromise._then(iterator, thrower, + null, null, null); + } + } + iterator(); + } + iterator(); + return ret; + } + + function Disposer(data, promise, context) { + this._data = data; + this._promise = promise; + this._context = context; + } + + Disposer.prototype.data = function () { + return this._data; + }; + + Disposer.prototype.promise = function () { + return this._promise; + }; + + Disposer.prototype.resource = function () { + if (this.promise().isFulfilled()) { + return this.promise().value(); + } + return NULL; + }; + + Disposer.prototype.tryDispose = function(inspection) { + var resource = this.resource(); + var context = this._context; + if (context !== undefined) context._pushContext(); + var ret = resource !== NULL + ? this.doDispose(resource, inspection) : null; + if (context !== undefined) context._popContext(); + this._promise._unsetDisposable(); + this._data = null; + return ret; + }; + + Disposer.isDisposer = function (d) { + return (d != null && + typeof d.resource === "function" && + typeof d.tryDispose === "function"); + }; + + function FunctionDisposer(fn, promise, context) { + this.constructor$(fn, promise, context); + } + inherits(FunctionDisposer, Disposer); + + FunctionDisposer.prototype.doDispose = function (resource, inspection) { + var fn = this.data(); + return fn.call(resource, resource, inspection); + }; + + function maybeUnwrapDisposer(value) { + if (Disposer.isDisposer(value)) { + this.resources[this.index]._setDisposable(value); + return value.promise(); + } + return value; + } + + function ResourceList(length) { + this.length = length; + this.promise = null; + this[length-1] = null; + } + + ResourceList.prototype._resultCancelled = function() { + var len = this.length; + for (var i = 0; i < len; ++i) { + var item = this[i]; + if (item instanceof Promise) { + item.cancel(); + } + } + }; + + Promise.using = function () { + var len = arguments.length; + if (len < 2) return apiRejection( + "you must pass at least 2 arguments to Promise.using"); + var fn = arguments[len - 1]; + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var input; + var spreadArgs = true; + if (len === 2 && Array.isArray(arguments[0])) { + input = arguments[0]; + len = input.length; + spreadArgs = false; + } else { + input = arguments; + len--; + } + var resources = new ResourceList(len); + for (var i = 0; i < len; ++i) { + var resource = input[i]; + if (Disposer.isDisposer(resource)) { + var disposer = resource; + resource = resource.promise(); + resource._setDisposable(disposer); + } else { + var maybePromise = tryConvertToPromise(resource); + if (maybePromise instanceof Promise) { + resource = + maybePromise._then(maybeUnwrapDisposer, null, null, { + resources: resources, + index: i + }, undefined); + } + } + resources[i] = resource; + } + + var reflectedResources = new Array(resources.length); + for (var i = 0; i < reflectedResources.length; ++i) { + reflectedResources[i] = Promise.resolve(resources[i]).reflect(); + } + + var resultPromise = Promise.all(reflectedResources) + .then(function(inspections) { + for (var i = 0; i < inspections.length; ++i) { + var inspection = inspections[i]; + if (inspection.isRejected()) { + errorObj.e = inspection.error(); + return errorObj; + } else if (!inspection.isFulfilled()) { + resultPromise.cancel(); + return; + } + inspections[i] = inspection.value(); + } + promise._pushContext(); + + fn = tryCatch(fn); + var ret = spreadArgs + ? fn.apply(undefined, inspections) : fn(inspections); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, promiseCreated, "Promise.using", promise); + return ret; + }); + + var promise = resultPromise.lastly(function() { + var inspection = new Promise.PromiseInspection(resultPromise); + return dispose(resources, inspection); + }); + resources.promise = promise; + promise._setOnCancel(resources); + return promise; + }; + + Promise.prototype._setDisposable = function (disposer) { + this._bitField = this._bitField | 131072; + this._disposer = disposer; + }; + + Promise.prototype._isDisposable = function () { + return (this._bitField & 131072) > 0; + }; + + Promise.prototype._getDisposer = function () { + return this._disposer; + }; + + Promise.prototype._unsetDisposable = function () { + this._bitField = this._bitField & (~131072); + this._disposer = undefined; + }; + + Promise.prototype.disposer = function (fn) { + if (typeof fn === "function") { + return new FunctionDisposer(fn, this, createContext()); + } + throw new TypeError(); + }; + +}; + +},{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var canEvaluate = typeof navigator == "undefined"; + +var errorObj = {e: {}}; +var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + +function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} +function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; +} + +var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; +}; + + +function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + +} + +function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; +} + +function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); +} + +function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; +} + +function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } +} + +function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; +} + +function thrower(r) { + throw r; +} + +var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + +})(); + +var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; +function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } +} + +function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var receiver = new FakeConstructor(); + function ic() { + return typeof receiver.foo; + } + ic(); + ic(); + return obj; + eval(obj); +} + +var rident = /^[a-z$_][a-z$_0-9]*$/i; +function isIdentifier(str) { + return rident.test(str); +} + +function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; +} + +function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } +} + +function isError(obj) { + return obj instanceof Error || + (obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"); +} + +function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} +} + +function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); +} + +function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); +} + +var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } +})(); + +function classString(obj) { + return {}.toString.call(obj); +} + +function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } +} + +var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; +}; + +if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; +} + +var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + +var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + +function env(key) { + return hasEnvVariables ? process.env[key] : undefined; +} + +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if (classString(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + +var reflectHandler; +function contextBind(ctx, cb) { + if (ctx === null || + typeof cb !== "function" || + cb === reflectHandler) { + return cb; + } + + if (ctx.domain !== null) { + cb = ctx.domain.bind(cb); + } + + var async = ctx.async; + if (async !== null) { + var old = cb; + cb = function() { + var args = (new Array(2)).concat([].slice.call(arguments));; + args[0] = old; + args[1] = this; + return async.runInAsyncScope.apply(async, args); + }; + } + return cb; +} + +var ret = { + setReflectHandler: function(fn) { + reflectHandler = fn; + }, + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + contextBind: contextBind +}; +ret.isRecentNode = ret.isNode && (function() { + var version; + if (process.versions && process.versions.node) { + version = process.versions.node.split(".").map(Number); + } else if (process.version) { + version = process.version.split(".").map(Number); + } + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); +})(); +ret.nodeSupportsAsyncResource = ret.isNode && (function() { + var supportsAsync = false; + try { + var res = _dereq_("async_hooks").AsyncResource; + supportsAsync = typeof res.prototype.runInAsyncScope === "function"; + } catch (e) { + supportsAsync = false; + } + return supportsAsync; +})(); + +if (ret.isNode) ret.toFastProperties(process); + +try {throw new Error(); } catch (e) {ret.lastLineError = e;} +module.exports = ret; + +},{"./es5":13,"async_hooks":undefined}]},{},[4])(4) +}); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; } \ No newline at end of file diff --git a/node_modules/bluebird/js/browser/bluebird.min.js b/node_modules/bluebird/js/browser/bluebird.min.js new file mode 100644 index 0000000..c1e907b --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.min.js @@ -0,0 +1,31 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * 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. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(s,a){if(!e[s]){if(!t[s]){var c="function"==typeof _dereq_&&_dereq_;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n?n:e)},l,l.exports,r,t,e,n)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var u;try{throw new Error}catch(l){u=l}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=s,r.prototype._drainQueues=function(){a(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,a(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=u},{"./queue":26,"./schedule":29}],3:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var u=n(o),l=new t(e);l._propagateFrom(this,1);var p=this._target();if(l._setBoundTo(u),u instanceof t){var f={promiseRejectionQueued:!1,promise:l,target:p,bindingPromise:u};p._then(e,s,void 0,l,f),u._then(a,c,void 0,l,f),l._setOnCancel(u)}else l._resolveCallback(p);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],4:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":22}],5:[function(t,e,n){"use strict";var r=Object.create;if(r){var i=r(null),o=r(null);i[" size"]=o[" size"]=0}e.exports=function(e){function n(t,n){var r;if(null!=t&&(r=t[n]),"function"!=typeof r){var i="Object "+a.classString(t)+" has no method '"+a.toString(n)+"'";throw new e.TypeError(i)}return r}function r(t){var e=this.pop(),r=n(t,e);return r.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}var s,a=t("./util"),c=a.canEvaluate;a.isIdentifier;e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(r,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e,n="number"==typeof t;if(n)e=o;else if(c){var r=s(t);e=null!==r?r:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var n=0;n=0?o[t]:void 0}var i=!1,o=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,o.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=o.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,i=!1},i=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],9:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,e){return{promise:e}}function s(){return!1}function a(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+B.toString(t));r._attachCancellationCallback(t)})}catch(i){return i}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?B.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function u(){return this._onCancelField}function l(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function _(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function d(){this._trace=new V(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);B.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),B.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,i){if(void 0===t&&null!==e&&Z){if(void 0!==i&&i._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),c=k(a),u=c.length-1;u>=0;--u){var l=c[u];if(!Q.test(l)){var p=l.match(G);p&&(o="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],u=0;u0&&(s="\n"+a[u-1]);break}}var h="a promise was created in a "+n+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(lt.warnings){var i,o=new U(t);if(n)r._attachExtraTrace(o);else if(lt.longStackTraces&&(i=e._peekContext()))i.attachExtraTrace(o);else{var s=F(o);o.stack=s.message+"\n"+s.stack.join("\n")}ot("warning",o)||x(o,"",!0)}}function w(t,e){for(var n=0;n=0;--a)if(r[a]===o){s=a;break}for(var a=s;a>=0;--a){var c=r[a];if(e[i]!==c)break;e.pop(),i--}e=r}}function k(t){for(var e=[],n=0;n0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?E(t):[" (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:k(e)}}function x(t,e,n){if("undefined"!=typeof console){var r;if(B.isObject(t)){var i=t.stack;r=e+X(i,t)}else r=e+String(t);"function"==typeof I?I(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function T(t,e,n,r){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(o){N.throwLater(o)}"unhandledRejection"===t?ot(t,n,r)||i||x(n,"Unhandled rejection "):ot(t,r)}function P(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():B.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+R(e)+">, no stack trace)"}function R(t){var e=41;return t.lengths||0>a||!n||!r||n!==r||s>=a||(at=function(t){if($.test(t))return!0;var e=O(t);return e&&e.fileName===n&&s<=e.line&&e.line<=a?!0:!1})}}function V(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);ut(this,V),e>32&&this.uncycle()}var H,D,I,L,N=e._async,U=t("./errors").Warning,B=t("./util"),M=t("./es5"),q=B.canAttachTrace,$=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,Q=/\((?:timers\.js):\d+:\d+\)/,G=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,z=null,X=null,W=!1,K=!(0==B.env("BLUEBIRD_DEBUG")||!B.env("BLUEBIRD_DEBUG")&&"development"!==B.env("NODE_ENV")),J=!(0==B.env("BLUEBIRD_WARNINGS")||!K&&!B.env("BLUEBIRD_WARNINGS")),Y=!(0==B.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!B.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=B.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!B.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();D=B.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();H=B.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!lt.longStackTraces&&S()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,i=e.prototype._dereferenceTrace;lt.longStackTraces=!0,tt=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=i,n.deactivateLongStackTraces(),lt.longStackTraces=!1},e.prototype._captureStackTrace=d,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return lt.longStackTraces&&S()};var et={unhandledrejection:{before:function(){var t=B.global.onunhandledrejection;return B.global.onunhandledrejection=null,t},after:function(t){B.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=B.global.onrejectionhandled;return B.global.onrejectionhandled=null,t},after:function(t){B.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!B.global.dispatchEvent(e);var n;try{return n=t.before(),!B.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},i=new CustomEvent(e,r);return M.defineProperty(i,"promise",{value:n.promise}),M.defineProperty(i,"reason",{value:n.reason}),t(et[e],i)}}if("function"==typeof Event){var e=new Event("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,M.defineProperty(r,"promise",{value:n.promise}),M.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return B.isNode?function(){return process.emit.apply(process,arguments)}:B.global?function(t){var e="on"+t.toLowerCase(),n=B.global[e];return n?(n.apply(B.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),it={promiseCreated:o,promiseFulfilled:o,promiseRejected:o,promiseResolved:o,promiseCancelled:o,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:o},ot=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){N.throwLater(n),e=!0}var r=!1;try{r=nt(t,it[t].apply(null,arguments))}catch(n){N.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;lt.warnings=!!n,Z=lt.warnings,B.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!lt.cancellation){if(N.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=u,e.prototype._setOnCancel=l,e.prototype._attachCancellationCallback=c,e.prototype._execute=a,st=f,lt.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!lt.monitoring?(lt.monitoring=!0,e.prototype._fireEvent=ot):!t.monitoring&<.monitoring&&(lt.monitoring=!1,e.prototype._fireEvent=s)),"asyncHooks"in t&&B.nodeSupportsAsyncResource){var o=lt.asyncHooks,h=!!t.asyncHooks;o!==h&&(lt.asyncHooks=h,h?r():i())}return e},e.prototype._fireEvent=s,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var st=h,at=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;B.inherits(V,Error),n.CapturedTrace=V,V.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,i=this;void 0!==i;++r)e.push(i),i=i._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var o=e[r].stack;void 0===n[o]&&(n[o]=r)}for(var r=0;t>r;++r){var s=e[r].stack,a=n[s];if(void 0!==a&&a!==r){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>a?(c._parent=e[a+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var u=c._length+1,l=r-2;l>=0;--l)e[l]._length=u,u++;return}}}},V.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],i=this;void 0!==i;)r.push(k(i.stack.split("\n"))),i=i._parent;j(r),C(r),B.notEnumerableProp(t,"stack",w(n,r)),B.notEnumerableProp(t,"__stackCleaned__",!0)}};var ut=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():P(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,z=t,X=e;var n=Error.captureStackTrace;return at=function(t){return $.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return z=/@/,X=e,W=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in r||!i||"number"!=typeof Error.stackTraceLimit?(X=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?P(e):e.toString()},null):(z=t,X=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(I=function(t){console.warn(t)},B.isNode&&process.stderr.isTTY?I=function(t,e){var n=e?"":"";console.warn(n+t+"\n")}:B.isNode||"string"!=typeof(new Error).stack||(I=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var lt={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return lt.asyncHooks},longStackTraces:function(){return lt.longStackTraces},warnings:function(){return lt.warnings},cancellation:function(){return lt.cancellation},monitoring:function(){return lt.monitoring},propagateFromFunction:function(){return st},boundValueFunction:function(){return _},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:V,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":12,"./es5":13,"./util":36}],10:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var i=function(){return r};return this.caught(n,i)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t,e){function n(){return o(this)}function r(t,n){return i(t,n,e,e)}var i=t.reduce,o=t.all;t.prototype.each=function(t){return i(this,t,e,0)._then(n,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return i(this,t,e,e)},t.each=function(t,r){return i(t,r,e,0)._then(n,void 0,void 0,t,void 0)},t.mapSeries=r}},{}],12:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return l(n,Error),n}function i(t){return this instanceof i?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new i(t)}var o,s,a=t("./es5"),c=a.freeze,u=t("./util"),l=u.inherits,p=u.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),_=r("TimeoutError","timeout error"),d=r("AggregateError","aggregate error");try{o=TypeError,s=RangeError}catch(v){o=r("TypeError","type error"),s=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function a(){return u.call(this,this.promise._target()._settledValue())}function c(t){return s(this,t)?void 0:(f.e=t,f)}function u(t){var i=this.promise,u=this.handler;if(!this.called){this.called=!0;var l=this.isFinallyHandler()?u.call(i._boundValue()):u.call(i._boundValue(),t);if(l===r)return l;if(void 0!==l){i._setReturnedNonUndefined();var h=n(l,i);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var _=new p("late cancellation observer");return i._attachExtraTrace(_),f.e=_,f}h.isPending()&&h._attachCancellationCallback(new o(this))}return h._then(a,c,void 0,this,void 0)}}}return i.isRejected()?(s(this),f.e=t,f):(s(this),t)}var l=t("./util"),p=e.CancellationError,f=l.errorObj,h=t("./catch_filter")(r);return i.prototype.isFinallyHandler=function(){return 0===this.type},o.prototype._resultCancelled=function(){s(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new i(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,u,u)},e.prototype.tap=function(t){return this._passThrough(t,1,u)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,u);var r,i=new Array(n-1),o=0;for(r=0;n-1>r;++r){var s=arguments[r];if(!l.isObject(s))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+l.classString(s)));i[o++]=s}i.length=o;var a=arguments[r];return this._passThrough(h(i,a,this),1,void 0,u)},i}},{"./catch_filter":7,"./util":36}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r){for(var o=0;o0&&"function"==typeof arguments[e]){t=arguments[e];var r}var i=[].slice.call(arguments);t&&i.pop();var r=new n(i).promise();return void 0!==t?r.spread(t):r}}},{"./util":36}],18:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t),this._promise._captureStackTrace();var s=e._getContext();if(this._callback=u.contextBind(s,n),this._preservedValues=i===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0),u.isArray(t))for(var a=0;a=1?s:0,new a(t,n,s,o).promise()}var u=t("./util"),l=u.tryCatch,p=u.errorObj,f=e._async;u.inherits(a,n),a.prototype._asyncInit=function(){this._init$(void 0,-2)},a.prototype._init=function(){},a.prototype._promiseFulfilled=function(t,n){var r=this._values,o=this.length(),a=this._preservedValues,c=this._limit;if(0>n){if(n=-1*n-1,r[n]=t,c>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(c>=1&&this._inFlight>=c)return r[n]=t,this._queue.push(n),!1;null!==a&&(a[n]=t);var u=this._promise,f=this._callback,h=u._boundValue();u._pushContext();var _=l(f).call(h,t,n,o),d=u._popContext();if(s.checkForgottenReturns(_,d,null!==a?"Promise.filter":"Promise.map",u),_===p)return this._reject(_.e),!0;var v=i(_,this._promise);if(v instanceof e){v=v._target();var y=v._bitField;if(0===(50397184&y))return c>=1&&this._inFlight++,r[n]=v,v._proxy(this,-1*(n+1)),!1;if(0===(33554432&y))return 0!==(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);_=v._value()}r[n]=_}var g=++this._totalResolved;return g>=o?(null!==a?this._filter(r,a):this._resolve(r),!0):!1},a.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,n=this._values;t.length>0&&this._inFlighto;++o)t[o]&&(r[i++]=e[o]);r.length=i,this._resolve(r)},a.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return c(this,t,e,null)},e.map=function(t,e,n,r){return c(t,e,n,r)}}},{"./util":36}],19:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util"),a=s.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+s.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var i=a(t).apply(this,arguments),s=r._popContext();return o.checkForgottenReturns(i,s,"Promise.method",r),r._resolveFromSyncValue(i),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return i("expecting a function but got "+s.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){o.deprecated("calling Promise.try with more than 1 argument");var u=arguments[1],l=arguments[2];c=s.isArray(u)?a(t).apply(l,u):a(t).call(l,u)}else c=a(t)();var p=r._popContext();return o.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&l.getPrototypeOf(t)===Error.prototype}function i(t){var e;if(r(t)){e=new u(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=l.keys(t),i=0;i1){var n,r=new Array(e-1),i=0;for(n=0;e-1>n;++n){var o=arguments[n];if(!f.isObject(o))return l("Catch statement predicate: expecting an object but got "+f.classString(o));r[i++]=o}if(r.length=i,t=arguments[n],"function"!=typeof t)throw new E("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,D(r,t,this))}return this.then(void 0,t)},i.prototype.reflect=function(){return this._then(u,u,void 0,this,void 0)},i.prototype.then=function(t,e){if(V.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},i.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},i.prototype.spread=function(t){return"function"!=typeof t?l("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,T,void 0)},i.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},i.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new S(this).promise()},i.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},i.getNewLibraryCopy=e.exports,i.is=function(t){return t instanceof i},i.fromNode=i.fromCallback=function(t){var e=new i(x);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=N(t)(I(e,n));return r===L&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},i.all=function(t){return new S(t).promise()},i.cast=function(t){var e=R(t);return e instanceof i||(e=new i(x),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},i.resolve=i.fulfilled=i.cast,i.reject=i.rejected=function(t){var e=new i(x);return e._captureStackTrace(),e._rejectCallback(t,!0),e},i.setScheduler=function(t){if("function"!=typeof t)throw new E("expecting a function but got "+f.classString(t));return j.setScheduler(t)},i.prototype._then=function(t,e,n,r,o){var s=void 0!==o,a=s?o:new i(x),c=this._target(),u=c._bitField;s||(a._propagateFrom(this,3),a._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&u)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,a));var l=g();if(0!==(50397184&u)){var p,h,_=c._settlePromiseCtx;0!==(33554432&u)?(h=c._rejectionHandler0,p=t):0!==(16777216&u)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(_=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),j.invoke(_,c,{handler:f.contextBind(l,p),promise:a,receiver:r,value:h})}else c._addCallbacks(t,e,a,r,l);return a},i.prototype._length=function(){return 65535&this._bitField},i.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},i.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},i.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},i.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},i.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},i.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},i.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},i.prototype._isFinal=function(){return(4194304&this._bitField)>0},i.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},i.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},i.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},i.prototype._setAsyncGuaranteed=function(){if(!j.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},i.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},i.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},i.prototype._promiseAt=function(t){return this[4*t-4+2]},i.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},i.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},i.prototype._boundValue=function(){},i.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=p),this._addCallbacks(e,n,r,i,null)},i.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=p),this._addCallbacks(n,r,i,o,null)},i.prototype._addCallbacks=function(t,e,n,r,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(i,e));else{var s=4*o-4;this[s+2]=n,this[s+3]=r,"function"==typeof t&&(this[s+0]=f.contextBind(i,t)),"function"==typeof e&&(this[s+1]=f.contextBind(i,e))}return this._setLength(o+1),o},i.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},i.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=R(t,this);if(!(n instanceof i))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var o=r._bitField;if(0===(50397184&o)){var s=this._length();s>0&&r._migrateCallback0(this);for(var a=1;s>a;++a)r._migrateCallbackAt(this,a);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&o))this._fulfill(r._value());else if(0!==(16777216&o))this._reject(r._reason());else{var u=new F("late cancellation observer");r._attachExtraTrace(u),this._reject(u)}}},i.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),i=r===t;if(!i&&!n&&V.warnings()){var o="a promise was rejected with a non-error: "+f.classString(t);this._warn(o,!0)}this._attachExtraTrace(r,e?i:!1),this._reject(t)},i.prototype._resolveFromExecutor=function(t){if(t!==x){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},i.prototype._settlePromiseFromHandler=function(t,e,n,r){var i=r._bitField;if(0===(65536&i)){r._pushContext();var o;e===T?n&&"number"==typeof n.length?o=N(t).apply(this._boundValue(),n):(o=L,o.e=new E("cannot .spread() a non-array: "+f.classString(n))):o=N(t).call(e,n);var s=r._popContext();i=r._bitField,0===(65536&i)&&(o===P?r._reject(n):o===L?r._rejectCallback(o.e,!1):(V.checkForgottenReturns(o,s,"",r,this),r._resolveCallback(o)))}},i.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},i.prototype._followee=function(){return this._rejectionHandler0},i.prototype._setFollowee=function(t){this._rejectionHandler0=t},i.prototype._settlePromise=function(t,e,r,o){var s=t instanceof i,a=this._bitField,c=0!==(134217728&a);0!==(65536&a)?(s&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,N(e).call(r,o)===L&&t._reject(L.e)):e===u?t._fulfill(u.call(r)):r instanceof n?r._promiseCancelled(t):s||t instanceof S?t._cancel():r.cancel()):"function"==typeof e?s?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,o,t)):e.call(r,o,t):r instanceof n?r._isResolved()||(0!==(33554432&a)?r._promiseFulfilled(o,t):r._promiseRejected(o,t)):s&&(c&&t._setAsyncGuaranteed(),0!==(33554432&a)?t._fulfill(o):t._reject(o))},i.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,o=t.value;"function"==typeof e?n instanceof i?this._settlePromiseFromHandler(e,r,o,n):e.call(r,o,n):n instanceof i&&n._reject(o)},i.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},i.prototype._settlePromise0=function(t,e,n){var r=this._promise0,i=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,i,e)},i.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},i.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():j.settlePromises(this),this._dereferenceTrace())}},i.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?j.fatalError(t,f.isNode):void((65535&e)>0?j.settlePromises(this):this._ensurePossibleRejectionHandled())},i.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},i.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&w.defineProperty(i.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),i.defer=i.pending=function(){V.deprecated("Promise.defer","new Promise");var t=new i(x);return{promise:t,resolve:o,reject:s}},f.notEnumerableProp(i,"_makeSelfResolutionError",c),t("./method")(i,x,R,l,V),t("./bind")(i,x,R,V),t("./cancel")(i,S,l,V),t("./direct_resolve")(i),t("./synchronous_inspection")(i),t("./join")(i,S,R,x,j),i.Promise=i,i.version="3.7.2",t("./call_get.js")(i),t("./generators.js")(i,l,x,R,n,V),t("./map.js")(i,S,l,R,x,V),t("./nodeify.js")(i),t("./promisify.js")(i,x),t("./props.js")(i,S,R,l),t("./race.js")(i,x,R,l),t("./reduce.js")(i,S,l,R,x,V),t("./settle.js")(i,S,V),t("./some.js")(i,S,l),t("./timers.js")(i,x,V),t("./using.js")(i,l,R,A,x,V),t("./any.js")(i),t("./each.js")(i,x),t("./filter.js")(i,x),f.toFastProperties(i),f.toFastProperties(i.prototype),a({a:1}),a({b:2}),a({c:3}),a(1),a(function(){}),a(void 0),a(!1),a(new i(x)),V.setBounds(C.firstLineError,f.lastLineError),i}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,async_hooks:void 0}],23:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){function s(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function a(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function u(t,n){var o=r(this._values,this._promise);if(o instanceof e){o=o._target();var a=o._bitField;if(this._values=o,0===(50397184&a))return this._promise._setAsyncGuaranteed(),o._then(u,this._reject,void 0,this,n);if(0===(33554432&a))return 0!==(16777216&a)?this._reject(o._reason()):this._cancel();o=o._value()}if(o=c.asArray(o),null===o){var l=i("expecting an array or an iterable object but got "+c.classString(o)).reason();return void this._promise._rejectCallback(l,!1)}return 0===o.length?void(-5===n?this._resolveEmptyArray():this._resolve(s(n))):void this._iterate(o)},a.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var i=this._promise,o=!1,s=null,a=0;n>a;++a){var c=r(t[a],i);c instanceof e?(c=c._target(),s=c._bitField):s=null,o?null!==s&&c.suppressUnhandledRejections():null!==s?0===(50397184&s)?(c._proxy(this,a),this._values[a]=c):o=0!==(33554432&s)?this._promiseFulfilled(c._value(),a):0!==(16777216&s)?this._promiseRejected(c._reason(),a):this._promiseCancelled(a):o=this._promiseFulfilled(c,a)}o||i._setAsyncGuaranteed()},a.prototype._isResolved=function(){return null===this._values},a.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},a.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},a.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},a.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;nc;c+=2){var l=s[c],p=s[c+1],_=l+e;if(r===E)t[_]=E(l,f,l,p,e,i);else{var d=r(p,function(){return E(l,f,l,p,e,i)});h.notEnumerableProp(d,"__isPromisified__",!0),t[_]=d}}return h.toFastProperties(t),t}function l(t,e,n){return E(t,e,void 0,t,null,n)}var p,f={},h=t("./util"),_=t("./nodeback"),d=h.withAppended,v=h.maybeWrapAsError,y=h.canEvaluate,g=t("./errors").TypeError,m="Async",b={__isPromisified__:!0},w=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],C=new RegExp("^(?:"+w.join("|")+")$"),j=function(t){return h.isIdentifier(t)&&"_"!==t.charAt(0)&&"constructor"!==t},k=function(t){return t.replace(/([$])/,"\\$")},E=y?p:c;e.promisify=function(t,e){if("function"!=typeof t)throw new g("expecting a function but got "+h.classString(t));if(i(t))return t;e=Object(e);var n=void 0===e.context?f:e.context,o=!!e.multiArgs,s=l(t,n,o);return h.copyDescriptors(t,s,r),s},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/MqrFmX\n");e=Object(e);var n=!!e.multiArgs,r=e.suffix;"string"!=typeof r&&(r=m);var i=e.filter;"function"!=typeof i&&(i=j);var o=e.promisifier;if("function"!=typeof o&&(o=E),!h.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/MqrFmX\n");for(var s=h.inheritedDataKeys(t),a=0;ao;++o){var s=r[o];e[o]=t[s],e[o+i]=s}}this.constructor$(e),this._isMap=n,this._init$(void 0,n?-6:-3)}function s(t){var n,s=r(t);return u(s)?(n=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&n._propagateFrom(s,2),n):i("cannot await properties of a non-object\n\n See http://goo.gl/MqrFmX\n")}var a,c=t("./util"),u=c.isObject,l=t("./es5");"function"==typeof Map&&(a=Map);var p=function(){function t(t,r){this[e]=t,this[e+n]=r,e++}var e=0,n=0;return function(r){n=r.size,e=0;var i=new Array(2*r.size);return r.forEach(t,i),i}}(),f=function(t){for(var e=new a,n=t.length/2|0,r=0;n>r;++r){var i=t[n+r],o=t[r];e.set(i,o)}return e};c.inherits(o,n),o.prototype._init=function(){},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;if(n>=this._length){var r;if(this._isMap)r=f(this._values);else{r={};for(var i=this.length(),o=0,s=this.length();s>o;++o)r[this._values[o+i]]=this._values[o]}return this._resolve(r),!0}return!1},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,n){"use strict";function r(t,e,n,r,i){for(var o=0;i>o;++o)n[o+r]=t[o+e],t[o+e]=void 0}function i(t){this._capacity=t,this._length=0,this._front=0}i.prototype._willBeOverCapacity=function(t){return this._capacityf;++f){var _=t[f];(void 0!==_||f in t)&&e.cast(_)._then(l,p,void 0,u,null)}return u}var s=t("./util"),a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util":36}],28:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t);var s=e._getContext();this._fn=f.contextBind(s,n),void 0!==r&&(r=e.resolve(r),r._attachCancellationCallback(this)),this._initialValue=r,this._currentCancellable=null,i===o?this._eachValues=Array(this._length):0===i?this._eachValues=null:this._eachValues=void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function c(t,e){this.isFulfilled()?e._resolve(t):e._reject(t)}function u(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+f.classString(e));var o=new a(t,e,n,i);return o.promise()}function l(t){this.accum=t,this.array._gotAccum(t);var n=i(this.value,this.array._promise);return n instanceof e?(this.array._currentCancellable=n,n._then(p,void 0,void 0,this,void 0)):p.call(this,n)}function p(t){var n=this.array,r=n._promise,i=h(n._fn);r._pushContext();var o;o=void 0!==n._eachValues?i.call(r._boundValue(),t,this.index,this.length):i.call(r._boundValue(),this.accum,t,this.index,this.length),o instanceof e&&(n._currentCancellable=o);var a=r._popContext();return s.checkForgottenReturns(o,a,void 0!==n._eachValues?"Promise.each":"Promise.reduce",r),o}var f=t("./util"),h=f.tryCatch;f.inherits(a,n),a.prototype._gotAccum=function(t){void 0!==this._eachValues&&null!==this._eachValues&&t!==o&&this._eachValues.push(t)},a.prototype._eachComplete=function(t){return null!==this._eachValues&&this._eachValues.push(t),this._eachValues},a.prototype._init=function(){},a.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},a.prototype.shouldCopyValues=function(){return!1},a.prototype._resolve=function(t){this._promise._resolveCallback(t),this._values=null},a.prototype._resultCancelled=function(t){return t===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof e&&this._currentCancellable.cancel(),this._initialValue instanceof e&&this._initialValue.cancel()))},a.prototype._iterate=function(t){this._values=t;var n,r,i=t.length;void 0!==this._initialValue?(n=this._initialValue,r=0):(n=e.resolve(t[0]),r=1),this._currentCancellable=n;for(var o=r;i>o;++o){var s=t[o];s instanceof e&&s.suppressUnhandledRejections()}if(!n.isRejected())for(;i>r;++r){var a={accum:null,value:t[r],index:r,length:i,array:this};n=n._then(l,void 0,void 0,a,void 0),0===(127&r)&&n._setNoAsyncGuarantee()}void 0!==this._eachValues&&(n=n._then(this._eachComplete,void 0,void 0,this,void 0)),n._then(c,c,void 0,n,this)},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,n,r){return u(t,e,n,r)}}},{"./util":36}],29:[function(t,e,n){"use strict";var r,i=t("./util"),o=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")},s=i.getNativePromise();if(i.isNode&&"undefined"==typeof MutationObserver){var a=global.setImmediate,c=process.nextTick;r=i.isRecentNode?function(t){a.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof s&&"function"==typeof s.resolve){ +var u=s.resolve();r=function(t){u.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),i=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});i.observe(r,e);var o=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),o()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:o;e.exports=r},{"./util":36}],30:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t)}var o=e.PromiseInspection,s=t("./util");s.inherits(i,n),i.prototype._promiseResolved=function(t,e){this._values[t]=e;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},i.prototype._promiseFulfilled=function(t,e){var n=new o;return n._bitField=33554432,n._settledValueField=t,this._promiseResolved(e,n)},i.prototype._promiseRejected=function(t,e){var n=new o;return n._bitField=16777216,n._settledValueField=t,this._promiseResolved(e,n)},e.settle=function(t){return r.deprecated(".settle()",".reflect()"),new i(t).promise()},e.allSettled=function(t){return new i(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return r("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");var n=new i(t),o=n.promise();return n.setHowMany(e),n.init(),o}var s=t("./util"),a=t("./errors").RangeError,c=t("./errors").AggregateError,u=s.isArray,l={};s.inherits(i,n),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=u(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},i.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},i.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(l),this._checkOutcome())},i.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new c,e=this.length();e0?this._reject(t):this._cancel(),!0}return!1},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors":12,"./util":36}],32:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(l(t)){if(t instanceof e)return t;var i=o(t);if(i===u){r&&r._pushContext();var c=e.reject(i.e);return r&&r._popContext(),c}if("function"==typeof i){if(s(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return a(t,i,r)}}return t}function i(t){return t.then}function o(t){try{return i(t)}catch(e){return u.e=e,u}}function s(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function a(t,r,i){function o(t){a&&(a._resolveCallback(t),a=null)}function s(t){a&&(a._rejectCallback(t,p,!0),a=null)}var a=new e(n),l=a;i&&i._pushContext(),a._captureStackTrace(),i&&i._popContext();var p=!0,f=c.tryCatch(r).call(t,o,s);return p=!1,a&&f===u&&(a._rejectCallback(f.e,!0,!0),a=null),l}var c=t("./util"),u=c.errorObj,l=c.isObject,p={}.hasOwnProperty;return r}},{"./util":36}],34:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.handle=t}function o(t){return clearTimeout(this.handle),t}function s(t){throw clearTimeout(this.handle),t}var a=t("./util"),c=e.TimeoutError;i.prototype._resultCancelled=function(){clearTimeout(this.handle)};var u=function(t){return l(+this).thenReturn(t)},l=e.delay=function(t,o){var s,a;return void 0!==o?(s=e.resolve(o)._then(u,null,null,t,void 0),r.cancellation()&&o instanceof e&&s._setOnCancel(o)):(s=new e(n),a=setTimeout(function(){s._fulfill()},+t),r.cancellation()&&s._setOnCancel(new i(a)),s._captureStackTrace()),s._setAsyncGuaranteed(),s};e.prototype.delay=function(t){return l(t,this)};var p=function(t,e,n){var r;r="string"!=typeof e?e instanceof Error?e:new c("operation timed out"):new c(e),a.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._reject(r),null!=n&&n.cancel()};e.prototype.timeout=function(t,e){t=+t;var n,a,c=new i(setTimeout(function(){n.isPending()&&p(n,e,a)},t));return r.cancellation()?(a=this.then(),n=a._then(o,s,void 0,c,void 0),n._setOnCancel(c)):n=this._then(o,s,void 0,c,void 0),n}}},{"./util":36}],35:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t){setTimeout(function(){throw t},0)}function c(t){var e=r(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,n){function i(){if(s>=u)return l._fulfill();var o=c(t[s++]);if(o instanceof e&&o._isDisposable()){try{o=r(o._getDisposer().tryDispose(n),t.promise)}catch(p){return a(p)}if(o instanceof e)return o._then(i,a,null,null,null)}i()}var s=0,u=t.length,l=new e(o);return i(),l}function l(t,e,n){this._data=t,this._promise=e,this._context=n}function p(t,e,n){this.constructor$(t,e,n)}function f(t){return l.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function h(t){this.length=t,this.promise=null,this[t-1]=null}var _=t("./util"),d=t("./errors").TypeError,v=t("./util").inherits,y=_.errorObj,g=_.tryCatch,m={};l.prototype.data=function(){return this._data},l.prototype.promise=function(){return this._promise},l.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():m},l.prototype.tryDispose=function(t){var e=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=e!==m?this.doDispose(e,t):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},l.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},v(p,l),p.prototype.doDispose=function(t,e){var n=this.data();return n.call(t,t,e)},h.prototype._resultCancelled=function(){for(var t=this.length,n=0;t>n;++n){var r=this[n];r instanceof e&&r.cancel()}},e.using=function(){var t=arguments.length;if(2>t)return n("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return n("expecting a function but got "+_.classString(i));var o,a=!0;2===t&&Array.isArray(arguments[0])?(o=arguments[0],t=o.length,a=!1):(o=arguments,t--);for(var c=new h(t),p=0;t>p;++p){var d=o[p];if(l.isDisposer(d)){var v=d;d=d.promise(),d._setDisposable(v)}else{var m=r(d);m instanceof e&&(d=m._then(f,null,null,{resources:c,index:p},void 0))}c[p]=d}for(var b=new Array(c.length),p=0;p0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new d}}},{"./errors":12,"./util":36}],36:[function(t,e,n){"use strict";function r(){try{var t=P;return P=null,t.apply(this,arguments)}catch(e){return T.e=e,T}}function i(t){return P=t,r}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return o(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,i=new Array(r+1);for(n=0;r>n;++n)i[n]=t[n];return i[n]=e,i}function u(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function l(t,e,n){if(o(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=A.test(t+"")&&F.names(t).length>0;if(n||r||i)return!0}return!1}catch(o){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function _(t){return V.test(t)}function d(t,e,n){for(var r=new Array(t),i=0;t>i;++i)r[i]=e+i+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{l(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function w(t){return{}.toString.call(t)}function C(t,e,n){for(var r=F.names(t),i=0;i10||t[0]>0}(),B.nodeSupportsAsyncResource=B.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),B.isNode&&B.toFastProperties(process);try{throw new Error}catch(M){B.lastLineError=M}e.exports=B},{"./es5":13,async_hooks:void 0}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise); \ No newline at end of file diff --git a/node_modules/bluebird/js/release/any.js b/node_modules/bluebird/js/release/any.js new file mode 100644 index 0000000..05a6228 --- /dev/null +++ b/node_modules/bluebird/js/release/any.js @@ -0,0 +1,21 @@ +"use strict"; +module.exports = function(Promise) { +var SomePromiseArray = Promise._SomePromiseArray; +function any(promises) { + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(1); + ret.setUnwrap(); + ret.init(); + return promise; +} + +Promise.any = function (promises) { + return any(promises); +}; + +Promise.prototype.any = function () { + return any(this); +}; + +}; diff --git a/node_modules/bluebird/js/release/assert.js b/node_modules/bluebird/js/release/assert.js new file mode 100644 index 0000000..4518231 --- /dev/null +++ b/node_modules/bluebird/js/release/assert.js @@ -0,0 +1,55 @@ +"use strict"; +module.exports = (function(){ +var AssertionError = (function() { + function AssertionError(a) { + this.constructor$(a); + this.message = a; + this.name = "AssertionError"; + } + AssertionError.prototype = new Error(); + AssertionError.prototype.constructor = AssertionError; + AssertionError.prototype.constructor$ = Error; + return AssertionError; +})(); + +function getParams(args) { + var params = []; + for (var i = 0; i < args.length; ++i) params.push("arg" + i); + return params; +} + +function nativeAssert(callName, args, expect) { + try { + var params = getParams(args); + var constructorArgs = params; + constructorArgs.push("return " + + callName + "("+ params.join(",") + ");"); + var fn = Function.apply(null, constructorArgs); + return fn.apply(null, args); + } catch (e) { + if (!(e instanceof SyntaxError)) { + throw e; + } else { + return expect; + } + } +} + +return function assert(boolExpr, message) { + if (boolExpr === true) return; + + if (typeof boolExpr === "string" && + boolExpr.charAt(0) === "%") { + var nativeCallName = boolExpr; + var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];}; + if (nativeAssert(nativeCallName, args, message) === message) return; + message = (nativeCallName + " !== " + message); + } + + var ret = new AssertionError(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(ret, assert); + } + throw ret; +}; +})(); diff --git a/node_modules/bluebird/js/release/async.js b/node_modules/bluebird/js/release/async.js new file mode 100644 index 0000000..8eab6f8 --- /dev/null +++ b/node_modules/bluebird/js/release/async.js @@ -0,0 +1,120 @@ +"use strict"; +var firstLineError; +try {throw new Error(); } catch (e) {firstLineError = e;} +var schedule = require("./schedule"); +var Queue = require("./queue"); + +function Async() { + this._customScheduler = false; + this._isTickUsed = false; + this._lateQueue = new Queue(16); + this._normalQueue = new Queue(16); + this._haveDrainedQueues = false; + var self = this; + this.drainQueues = function () { + self._drainQueues(); + }; + this._schedule = schedule; +} + +Async.prototype.setScheduler = function(fn) { + var prev = this._schedule; + this._schedule = fn; + this._customScheduler = true; + return prev; +}; + +Async.prototype.hasCustomScheduler = function() { + return this._customScheduler; +}; + +Async.prototype.haveItemsQueued = function () { + return this._isTickUsed || this._haveDrainedQueues; +}; + + +Async.prototype.fatalError = function(e, isNode) { + if (isNode) { + process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) + + "\n"); + process.exit(2); + } else { + this.throwLater(e); + } +}; + +Async.prototype.throwLater = function(fn, arg) { + if (arguments.length === 1) { + arg = fn; + fn = function () { throw arg; }; + } + if (typeof setTimeout !== "undefined") { + setTimeout(function() { + fn(arg); + }, 0); + } else try { + this._schedule(function() { + fn(arg); + }); + } catch (e) { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } +}; + +function AsyncInvokeLater(fn, receiver, arg) { + this._lateQueue.push(fn, receiver, arg); + this._queueTick(); +} + +function AsyncInvoke(fn, receiver, arg) { + this._normalQueue.push(fn, receiver, arg); + this._queueTick(); +} + +function AsyncSettlePromises(promise) { + this._normalQueue._pushOne(promise); + this._queueTick(); +} + +Async.prototype.invokeLater = AsyncInvokeLater; +Async.prototype.invoke = AsyncInvoke; +Async.prototype.settlePromises = AsyncSettlePromises; + + +function _drainQueue(queue) { + while (queue.length() > 0) { + _drainQueueStep(queue); + } +} + +function _drainQueueStep(queue) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + } else { + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } +} + +Async.prototype._drainQueues = function () { + _drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + _drainQueue(this._lateQueue); +}; + +Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } +}; + +Async.prototype._reset = function () { + this._isTickUsed = false; +}; + +module.exports = Async; +module.exports.firstLineError = firstLineError; diff --git a/node_modules/bluebird/js/release/bind.js b/node_modules/bluebird/js/release/bind.js new file mode 100644 index 0000000..fc3379d --- /dev/null +++ b/node_modules/bluebird/js/release/bind.js @@ -0,0 +1,67 @@ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { +var calledBind = false; +var rejectThis = function(_, e) { + this._reject(e); +}; + +var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); +}; + +var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } +}; + +var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); +}; + +Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; +}; + +Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } +}; + +Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; +}; + +Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); +}; +}; diff --git a/node_modules/bluebird/js/release/bluebird.js b/node_modules/bluebird/js/release/bluebird.js new file mode 100644 index 0000000..1c36cf3 --- /dev/null +++ b/node_modules/bluebird/js/release/bluebird.js @@ -0,0 +1,11 @@ +"use strict"; +var old; +if (typeof Promise !== "undefined") old = Promise; +function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; +} +var bluebird = require("./promise")(); +bluebird.noConflict = noConflict; +module.exports = bluebird; diff --git a/node_modules/bluebird/js/release/call_get.js b/node_modules/bluebird/js/release/call_get.js new file mode 100644 index 0000000..0ed7714 --- /dev/null +++ b/node_modules/bluebird/js/release/call_get.js @@ -0,0 +1,123 @@ +"use strict"; +var cr = Object.create; +if (cr) { + var callerCache = cr(null); + var getterCache = cr(null); + callerCache[" size"] = getterCache[" size"] = 0; +} + +module.exports = function(Promise) { +var util = require("./util"); +var canEvaluate = util.canEvaluate; +var isIdentifier = util.isIdentifier; + +var getMethodCaller; +var getGetter; +if (!false) { +var makeMethodCaller = function (methodName) { + return new Function("ensureMethod", " \n\ + return function(obj) { \n\ + 'use strict' \n\ + var len = this.length; \n\ + ensureMethod(obj, 'methodName'); \n\ + switch(len) { \n\ + case 1: return obj.methodName(this[0]); \n\ + case 2: return obj.methodName(this[0], this[1]); \n\ + case 3: return obj.methodName(this[0], this[1], this[2]); \n\ + case 0: return obj.methodName(); \n\ + default: \n\ + return obj.methodName.apply(obj, this); \n\ + } \n\ + }; \n\ + ".replace(/methodName/g, methodName))(ensureMethod); +}; + +var makeGetter = function (propertyName) { + return new Function("obj", " \n\ + 'use strict'; \n\ + return obj.propertyName; \n\ + ".replace("propertyName", propertyName)); +}; + +var getCompiled = function(name, compiler, cache) { + var ret = cache[name]; + if (typeof ret !== "function") { + if (!isIdentifier(name)) { + return null; + } + ret = compiler(name); + cache[name] = ret; + cache[" size"]++; + if (cache[" size"] > 512) { + var keys = Object.keys(cache); + for (var i = 0; i < 256; ++i) delete cache[keys[i]]; + cache[" size"] = keys.length - 256; + } + } + return ret; +}; + +getMethodCaller = function(name) { + return getCompiled(name, makeMethodCaller, callerCache); +}; + +getGetter = function(name) { + return getCompiled(name, makeGetter, getterCache); +}; +} + +function ensureMethod(obj, methodName) { + var fn; + if (obj != null) fn = obj[methodName]; + if (typeof fn !== "function") { + var message = "Object " + util.classString(obj) + " has no method '" + + util.toString(methodName) + "'"; + throw new Promise.TypeError(message); + } + return fn; +} + +function caller(obj) { + var methodName = this.pop(); + var fn = ensureMethod(obj, methodName); + return fn.apply(obj, this); +} +Promise.prototype.call = function (methodName) { + var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}; + if (!false) { + if (canEvaluate) { + var maybeCaller = getMethodCaller(methodName); + if (maybeCaller !== null) { + return this._then( + maybeCaller, undefined, undefined, args, undefined); + } + } + } + args.push(methodName); + return this._then(caller, undefined, undefined, args, undefined); +}; + +function namedGetter(obj) { + return obj[this]; +} +function indexedGetter(obj) { + var index = +this; + if (index < 0) index = Math.max(0, index + obj.length); + return obj[index]; +} +Promise.prototype.get = function (propertyName) { + var isIndex = (typeof propertyName === "number"); + var getter; + if (!isIndex) { + if (canEvaluate) { + var maybeGetter = getGetter(propertyName); + getter = maybeGetter !== null ? maybeGetter : namedGetter; + } else { + getter = namedGetter; + } + } else { + getter = indexedGetter; + } + return this._then(getter, undefined, undefined, propertyName, undefined); +}; +}; diff --git a/node_modules/bluebird/js/release/cancel.js b/node_modules/bluebird/js/release/cancel.js new file mode 100644 index 0000000..7a12415 --- /dev/null +++ b/node_modules/bluebird/js/release/cancel.js @@ -0,0 +1,129 @@ +"use strict"; +module.exports = function(Promise, PromiseArray, apiRejection, debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } +}; + +Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; +}; + +Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; +}; + +Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; +}; + +Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } +}; + +Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); +}; + +Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); +}; + +Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; +}; + +Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); +}; + +Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); +}; + +Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } +}; + +Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); +}; + +Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } +}; + +Promise.prototype._resultCancelled = function() { + this.cancel(); +}; + +}; diff --git a/node_modules/bluebird/js/release/catch_filter.js b/node_modules/bluebird/js/release/catch_filter.js new file mode 100644 index 0000000..0f24ce2 --- /dev/null +++ b/node_modules/bluebird/js/release/catch_filter.js @@ -0,0 +1,42 @@ +"use strict"; +module.exports = function(NEXT_FILTER) { +var util = require("./util"); +var getKeys = require("./es5").keys; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; +} + +return catchFilter; +}; diff --git a/node_modules/bluebird/js/release/context.js b/node_modules/bluebird/js/release/context.js new file mode 100644 index 0000000..c307414 --- /dev/null +++ b/node_modules/bluebird/js/release/context.js @@ -0,0 +1,69 @@ +"use strict"; +module.exports = function(Promise) { +var longStackTraces = false; +var contextStack = []; + +Promise.prototype._promiseCreated = function() {}; +Promise.prototype._pushContext = function() {}; +Promise.prototype._popContext = function() {return null;}; +Promise._peekContext = Promise.prototype._peekContext = function() {}; + +function Context() { + this._trace = new Context.CapturedTrace(peekContext()); +} +Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } +}; + +Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; +}; + +function createContext() { + if (longStackTraces) return new Context(); +} + +function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; +} +Context.CapturedTrace = null; +Context.create = createContext; +Context.deactivateLongStackTraces = function() {}; +Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; +}; +return Context; +}; diff --git a/node_modules/bluebird/js/release/debuggability.js b/node_modules/bluebird/js/release/debuggability.js new file mode 100644 index 0000000..ce997ee --- /dev/null +++ b/node_modules/bluebird/js/release/debuggability.js @@ -0,0 +1,1009 @@ +"use strict"; +module.exports = function(Promise, Context, + enableAsyncHooks, disableAsyncHooks) { +var async = Promise._async; +var Warning = require("./errors").Warning; +var util = require("./util"); +var es5 = require("./es5"); +var canAttachTrace = util.canAttachTrace; +var unhandledRejectionHandled; +var possiblyUnhandledRejection; +var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; +var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; +var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; +var stackFramePattern = null; +var formatStack = null; +var indentStackFrames = false; +var printWarning; +var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (false || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + +var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + +var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + +var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + +var deferUnhandledRejectionCheck; +(function() { + var promises = []; + + function unhandledRejectionCheck() { + for (var i = 0; i < promises.length; ++i) { + promises[i]._notifyUnhandledRejection(); + } + unhandledRejectionClear(); + } + + function unhandledRejectionClear() { + promises.length = 0; + } + + deferUnhandledRejectionCheck = function(promise) { + promises.push(promise); + setTimeout(unhandledRejectionCheck, 1); + }; + + es5.defineProperty(Promise, "_unhandledRejectionCheck", { + value: unhandledRejectionCheck + }); + es5.defineProperty(Promise, "_unhandledRejectionClear", { + value: unhandledRejectionClear + }); +})(); + +Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); +}; + +Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + deferUnhandledRejectionCheck(this); +}; + +Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); +}; + +Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; +}; + +Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; +}; + +Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } +}; + +Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; +}; + +Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); +}; + +Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; +}; + +Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; +}; + +Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } +}; + +Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; +}; + +Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); +}; + +Promise.onPossiblyUnhandledRejection = function (fn) { + var context = Promise._getContext(); + possiblyUnhandledRejection = util.contextBind(context, fn); +}; + +Promise.onUnhandledRejectionHandled = function (fn) { + var context = Promise._getContext(); + unhandledRejectionHandled = util.contextBind(context, fn); +}; + +var disableLongStackTraces = function() {}; +Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Promise.prototype._dereferenceTrace = Promise_dereferenceTrace; + Context.deactivateLongStackTraces(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace; + Context.activateLongStackTraces(); + } +}; + +Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); +}; + + +var legacyHandlers = { + unhandledrejection: { + before: function() { + var ret = util.global.onunhandledrejection; + util.global.onunhandledrejection = null; + return ret; + }, + after: function(fn) { + util.global.onunhandledrejection = fn; + } + }, + rejectionhandled: { + before: function() { + var ret = util.global.onrejectionhandled; + util.global.onrejectionhandled = null; + return ret; + }, + after: function(fn) { + util.global.onrejectionhandled = fn; + } + } +}; + +var fireDomEvent = (function() { + var dispatch = function(legacy, e) { + if (legacy) { + var fn; + try { + fn = legacy.before(); + return !util.global.dispatchEvent(e); + } finally { + legacy.after(fn); + } + } else { + return !util.global.dispatchEvent(e); + } + }; + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var eventData = { + detail: event, + cancelable: true + }; + var domEvent = new CustomEvent(name, eventData); + es5.defineProperty( + domEvent, "promise", {value: event.promise}); + es5.defineProperty( + domEvent, "reason", {value: event.reason}); + + return dispatch(legacyHandlers[name], domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = new Event(name, { + cancelable: true + }); + domEvent.detail = event; + es5.defineProperty(domEvent, "promise", {value: event.promise}); + es5.defineProperty(domEvent, "reason", {value: event.reason}); + return dispatch(legacyHandlers[name], domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name, false, true, + event); + return dispatch(legacyHandlers[name], domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; +})(); + +var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } +})(); + +function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; +} + +var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject +}; + +var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; +}; + +Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) { + var prev = config.asyncHooks; + var cur = !!opts.asyncHooks; + if (prev !== cur) { + config.asyncHooks = cur; + if (cur) { + enableAsyncHooks(); + } else { + disableAsyncHooks(); + } + } + } + return Promise; +}; + +function defaultFireEvent() { return false; } + +Promise.prototype._fireEvent = defaultFireEvent; +Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } +}; +Promise.prototype._onCancel = function () {}; +Promise.prototype._setOnCancel = function (handler) { ; }; +Promise.prototype._attachCancellationCallback = function(onCancel) { + ; +}; +Promise.prototype._captureStackTrace = function () {}; +Promise.prototype._attachExtraTrace = function () {}; +Promise.prototype._dereferenceTrace = function () {}; +Promise.prototype._clearCancellationData = function() {}; +Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; +}; + +function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } +} + +function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } +} + +function cancellationOnCancel() { + return this._onCancelField; +} + +function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; +} + +function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; +} + +function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} + +function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} +var propagateFromFunction = bindingPropagateFrom; + +function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; +} + +function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); +} + +function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } +} + +function longStackTracesDereferenceTrace() { + this._trace = undefined; +} + +function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } +} + +function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); +} + +function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } +} + +function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); +} + +function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } +} + +function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } +} + +function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; +} + +function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; +} + +function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; +} + +function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } +} + +function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } +} + +function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); +} + +function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; +} + +function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; +} + +var shouldIgnore = function() { return false; }; +var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; +function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } +} + +function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = (firstLineError.stack || "").split("\n"); + var lastStackLines = (lastLineError.stack || "").split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; +} + +function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); +} +util.inherits(CapturedTrace, Error); +Context.CapturedTrace = CapturedTrace; + +CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } +}; + +CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); +}; + +var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + +})([]); + +if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } +} + +var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false, + asyncHooks: false +}; + +if (longStackTraces) Promise.longStackTraces(); + +return { + asyncHooks: function() { + return config.asyncHooks; + }, + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent +}; +}; diff --git a/node_modules/bluebird/js/release/direct_resolve.js b/node_modules/bluebird/js/release/direct_resolve.js new file mode 100644 index 0000000..a890298 --- /dev/null +++ b/node_modules/bluebird/js/release/direct_resolve.js @@ -0,0 +1,46 @@ +"use strict"; +module.exports = function(Promise) { +function returner() { + return this.value; +} +function thrower() { + throw this.reason; +} + +Promise.prototype["return"] = +Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); +}; + +Promise.prototype["throw"] = +Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); +}; + +Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } +}; + +Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } +}; +}; diff --git a/node_modules/bluebird/js/release/each.js b/node_modules/bluebird/js/release/each.js new file mode 100644 index 0000000..e4f3d05 --- /dev/null +++ b/node_modules/bluebird/js/release/each.js @@ -0,0 +1,30 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseReduce = Promise.reduce; +var PromiseAll = Promise.all; + +function promiseAllThis() { + return PromiseAll(this); +} + +function PromiseMapSeries(promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, INTERNAL); +} + +Promise.prototype.each = function (fn) { + return PromiseReduce(this, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, this, undefined); +}; + +Promise.prototype.mapSeries = function (fn) { + return PromiseReduce(this, fn, INTERNAL, INTERNAL); +}; + +Promise.each = function (promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, promises, undefined); +}; + +Promise.mapSeries = PromiseMapSeries; +}; + diff --git a/node_modules/bluebird/js/release/errors.js b/node_modules/bluebird/js/release/errors.js new file mode 100644 index 0000000..f62f323 --- /dev/null +++ b/node_modules/bluebird/js/release/errors.js @@ -0,0 +1,116 @@ +"use strict"; +var es5 = require("./es5"); +var Objectfreeze = es5.freeze; +var util = require("./util"); +var inherits = util.inherits; +var notEnumerableProp = util.notEnumerableProp; + +function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; +} + +var _TypeError, _RangeError; +var Warning = subError("Warning", "warning"); +var CancellationError = subError("CancellationError", "cancellation error"); +var TimeoutError = subError("TimeoutError", "timeout error"); +var AggregateError = subError("AggregateError", "aggregate error"); +try { + _TypeError = TypeError; + _RangeError = RangeError; +} catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); +} + +var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + +for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } +} + +es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true +}); +AggregateError.prototype["isOperational"] = true; +var level = 0; +AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; +}; + +function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + +} +inherits(OperationalError, Error); + +var errorTypes = Error["__BluebirdErrorTypes__"]; +if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); +} + +module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning +}; diff --git a/node_modules/bluebird/js/release/es5.js b/node_modules/bluebird/js/release/es5.js new file mode 100644 index 0000000..ea41d5a --- /dev/null +++ b/node_modules/bluebird/js/release/es5.js @@ -0,0 +1,80 @@ +var isES5 = (function(){ + "use strict"; + return this === undefined; +})(); + +if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; +} else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; +} diff --git a/node_modules/bluebird/js/release/filter.js b/node_modules/bluebird/js/release/filter.js new file mode 100644 index 0000000..ed57bf0 --- /dev/null +++ b/node_modules/bluebird/js/release/filter.js @@ -0,0 +1,12 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseMap = Promise.map; + +Promise.prototype.filter = function (fn, options) { + return PromiseMap(this, fn, options, INTERNAL); +}; + +Promise.filter = function (promises, fn, options) { + return PromiseMap(promises, fn, options, INTERNAL); +}; +}; diff --git a/node_modules/bluebird/js/release/finally.js b/node_modules/bluebird/js/release/finally.js new file mode 100644 index 0000000..d57444b --- /dev/null +++ b/node_modules/bluebird/js/release/finally.js @@ -0,0 +1,146 @@ +"use strict"; +module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { +var util = require("./util"); +var CancellationError = Promise.CancellationError; +var errorObj = util.errorObj; +var catchFilter = require("./catch_filter")(NEXT_FILTER); + +function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; +} + +PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; +}; + +function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; +} + +FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); +}; + +function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; +} + +function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); +} +function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; +} +function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret === NEXT_FILTER) { + return ret; + } else if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } +} + +Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); +}; + +Promise.prototype.lastly = +Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); +}; + + +Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); +}; + +Promise.prototype.tapCatch = function (handlerOrPredicate) { + var len = arguments.length; + if(len === 1) { + return this._passThrough(handlerOrPredicate, + 1, + undefined, + finallyHandler); + } else { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return Promise.reject(new TypeError( + "tapCatch statement predicate: " + + "expecting an object but got " + util.classString(item) + )); + } + } + catchInstances.length = j; + var handler = arguments[i]; + return this._passThrough(catchFilter(catchInstances, handler, this), + 1, + undefined, + finallyHandler); + } + +}; + +return PassThroughHandlerContext; +}; diff --git a/node_modules/bluebird/js/release/generators.js b/node_modules/bluebird/js/release/generators.js new file mode 100644 index 0000000..500c280 --- /dev/null +++ b/node_modules/bluebird/js/release/generators.js @@ -0,0 +1,223 @@ +"use strict"; +module.exports = function(Promise, + apiRejection, + INTERNAL, + tryConvertToPromise, + Proxyable, + debug) { +var errors = require("./errors"); +var TypeError = errors.TypeError; +var util = require("./util"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +var yieldHandlers = []; + +function promiseFromYieldHandler(value, yieldHandlers, traceParent) { + for (var i = 0; i < yieldHandlers.length; ++i) { + traceParent._pushContext(); + var result = tryCatch(yieldHandlers[i])(value); + traceParent._popContext(); + if (result === errorObj) { + traceParent._pushContext(); + var ret = Promise.reject(errorObj.e); + traceParent._popContext(); + return ret; + } + var maybePromise = tryConvertToPromise(result, traceParent); + if (maybePromise instanceof Promise) return maybePromise; + } + return null; +} + +function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { + if (debug.cancellation()) { + var internal = new Promise(INTERNAL); + var _finallyPromise = this._finallyPromise = new Promise(INTERNAL); + this._promise = internal.lastly(function() { + return _finallyPromise; + }); + internal._captureStackTrace(); + internal._setOnCancel(this); + } else { + var promise = this._promise = new Promise(INTERNAL); + promise._captureStackTrace(); + } + this._stack = stack; + this._generatorFunction = generatorFunction; + this._receiver = receiver; + this._generator = undefined; + this._yieldHandlers = typeof yieldHandler === "function" + ? [yieldHandler].concat(yieldHandlers) + : yieldHandlers; + this._yieldedPromise = null; + this._cancellationPhase = false; +} +util.inherits(PromiseSpawn, Proxyable); + +PromiseSpawn.prototype._isResolved = function() { + return this._promise === null; +}; + +PromiseSpawn.prototype._cleanup = function() { + this._promise = this._generator = null; + if (debug.cancellation() && this._finallyPromise !== null) { + this._finallyPromise._fulfill(); + this._finallyPromise = null; + } +}; + +PromiseSpawn.prototype._promiseCancelled = function() { + if (this._isResolved()) return; + var implementsReturn = typeof this._generator["return"] !== "undefined"; + + var result; + if (!implementsReturn) { + var reason = new Promise.CancellationError( + "generator .return() sentinel"); + Promise.coroutine.returnSentinel = reason; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + result = tryCatch(this._generator["throw"]).call(this._generator, + reason); + this._promise._popContext(); + } else { + this._promise._pushContext(); + result = tryCatch(this._generator["return"]).call(this._generator, + undefined); + this._promise._popContext(); + } + this._cancellationPhase = true; + this._yieldedPromise = null; + this._continue(result); +}; + +PromiseSpawn.prototype._promiseFulfilled = function(value) { + this._yieldedPromise = null; + this._promise._pushContext(); + var result = tryCatch(this._generator.next).call(this._generator, value); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._promiseRejected = function(reason) { + this._yieldedPromise = null; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + var result = tryCatch(this._generator["throw"]) + .call(this._generator, reason); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._resultCancelled = function() { + if (this._yieldedPromise instanceof Promise) { + var promise = this._yieldedPromise; + this._yieldedPromise = null; + promise.cancel(); + } +}; + +PromiseSpawn.prototype.promise = function () { + return this._promise; +}; + +PromiseSpawn.prototype._run = function () { + this._generator = this._generatorFunction.call(this._receiver); + this._receiver = + this._generatorFunction = undefined; + this._promiseFulfilled(undefined); +}; + +PromiseSpawn.prototype._continue = function (result) { + var promise = this._promise; + if (result === errorObj) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._rejectCallback(result.e, false); + } + } + + var value = result.value; + if (result.done === true) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._resolveCallback(value); + } + } else { + var maybePromise = tryConvertToPromise(value, this._promise); + if (!(maybePromise instanceof Promise)) { + maybePromise = + promiseFromYieldHandler(maybePromise, + this._yieldHandlers, + this._promise); + if (maybePromise === null) { + this._promiseRejected( + new TypeError( + "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) + + "From coroutine:\u000a" + + this._stack.split("\n").slice(1, -7).join("\n") + ) + ); + return; + } + } + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + this._yieldedPromise = maybePromise; + maybePromise._proxy(this, null); + } else if (((bitField & 33554432) !== 0)) { + Promise._async.invoke( + this._promiseFulfilled, this, maybePromise._value() + ); + } else if (((bitField & 16777216) !== 0)) { + Promise._async.invoke( + this._promiseRejected, this, maybePromise._reason() + ); + } else { + this._promiseCancelled(); + } + } +}; + +Promise.coroutine = function (generatorFunction, options) { + if (typeof generatorFunction !== "function") { + throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var yieldHandler = Object(options).yieldHandler; + var PromiseSpawn$ = PromiseSpawn; + var stack = new Error().stack; + return function () { + var generator = generatorFunction.apply(this, arguments); + var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, + stack); + var ret = spawn.promise(); + spawn._generator = generator; + spawn._promiseFulfilled(undefined); + return ret; + }; +}; + +Promise.coroutine.addYieldHandler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + yieldHandlers.push(fn); +}; + +Promise.spawn = function (generatorFunction) { + debug.deprecated("Promise.spawn()", "Promise.coroutine()"); + if (typeof generatorFunction !== "function") { + return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var spawn = new PromiseSpawn(generatorFunction, this); + var ret = spawn.promise(); + spawn._run(Promise.spawn); + return ret; +}; +}; diff --git a/node_modules/bluebird/js/release/join.js b/node_modules/bluebird/js/release/join.js new file mode 100644 index 0000000..e7e19f0 --- /dev/null +++ b/node_modules/bluebird/js/release/join.js @@ -0,0 +1,165 @@ +"use strict"; +module.exports = +function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) { +var util = require("./util"); +var canEvaluate = util.canEvaluate; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var reject; + +if (!false) { +if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; +}} + +Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (!false) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var context = Promise._getContext(); + holder.fn = util.contextBind(context, holder.fn); + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i ];}; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; +}; + +}; diff --git a/node_modules/bluebird/js/release/map.js b/node_modules/bluebird/js/release/map.js new file mode 100644 index 0000000..91d5a82 --- /dev/null +++ b/node_modules/bluebird/js/release/map.js @@ -0,0 +1,175 @@ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +function MappingPromiseArray(promises, fn, limit, _filter) { + this.constructor$(promises); + this._promise._captureStackTrace(); + var context = Promise._getContext(); + this._callback = util.contextBind(context, fn); + this._preservedValues = _filter === INTERNAL + ? new Array(this.length()) + : null; + this._limit = limit; + this._inFlight = 0; + this._queue = []; + async.invoke(this._asyncInit, this, undefined); + if (util.isArray(promises)) { + for (var i = 0; i < promises.length; ++i) { + var maybePromise = promises[i]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + } +} +util.inherits(MappingPromiseArray, PromiseArray); + +MappingPromiseArray.prototype._asyncInit = function() { + this._init$(undefined, -2); +}; + +MappingPromiseArray.prototype._init = function () {}; + +MappingPromiseArray.prototype._promiseFulfilled = function (value, index) { + var values = this._values; + var length = this.length(); + var preservedValues = this._preservedValues; + var limit = this._limit; + + if (index < 0) { + index = (index * -1) - 1; + values[index] = value; + if (limit >= 1) { + this._inFlight--; + this._drainQueue(); + if (this._isResolved()) return true; + } + } else { + if (limit >= 1 && this._inFlight >= limit) { + values[index] = value; + this._queue.push(index); + return false; + } + if (preservedValues !== null) preservedValues[index] = value; + + var promise = this._promise; + var callback = this._callback; + var receiver = promise._boundValue(); + promise._pushContext(); + var ret = tryCatch(callback).call(receiver, value, index, length); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + preservedValues !== null ? "Promise.filter" : "Promise.map", + promise + ); + if (ret === errorObj) { + this._reject(ret.e); + return true; + } + + var maybePromise = tryConvertToPromise(ret, this._promise); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + if (limit >= 1) this._inFlight++; + values[index] = maybePromise; + maybePromise._proxy(this, (index + 1) * -1); + return false; + } else if (((bitField & 33554432) !== 0)) { + ret = maybePromise._value(); + } else if (((bitField & 16777216) !== 0)) { + this._reject(maybePromise._reason()); + return true; + } else { + this._cancel(); + return true; + } + } + values[index] = ret; + } + var totalResolved = ++this._totalResolved; + if (totalResolved >= length) { + if (preservedValues !== null) { + this._filter(values, preservedValues); + } else { + this._resolve(values); + } + return true; + } + return false; +}; + +MappingPromiseArray.prototype._drainQueue = function () { + var queue = this._queue; + var limit = this._limit; + var values = this._values; + while (queue.length > 0 && this._inFlight < limit) { + if (this._isResolved()) return; + var index = queue.pop(); + this._promiseFulfilled(values[index], index); + } +}; + +MappingPromiseArray.prototype._filter = function (booleans, values) { + var len = values.length; + var ret = new Array(len); + var j = 0; + for (var i = 0; i < len; ++i) { + if (booleans[i]) ret[j++] = values[i]; + } + ret.length = j; + this._resolve(ret); +}; + +MappingPromiseArray.prototype.preservedValues = function () { + return this._preservedValues; +}; + +function map(promises, fn, options, _filter) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + + var limit = 0; + if (options !== undefined) { + if (typeof options === "object" && options !== null) { + if (typeof options.concurrency !== "number") { + return Promise.reject( + new TypeError("'concurrency' must be a number but it is " + + util.classString(options.concurrency))); + } + limit = options.concurrency; + } else { + return Promise.reject(new TypeError( + "options argument must be an object but it is " + + util.classString(options))); + } + } + limit = typeof limit === "number" && + isFinite(limit) && limit >= 1 ? limit : 0; + return new MappingPromiseArray(promises, fn, limit, _filter).promise(); +} + +Promise.prototype.map = function (fn, options) { + return map(this, fn, options, null); +}; + +Promise.map = function (promises, fn, options, _filter) { + return map(promises, fn, options, _filter); +}; + + +}; diff --git a/node_modules/bluebird/js/release/method.js b/node_modules/bluebird/js/release/method.js new file mode 100644 index 0000000..ce9e4db --- /dev/null +++ b/node_modules/bluebird/js/release/method.js @@ -0,0 +1,55 @@ +"use strict"; +module.exports = +function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; + +Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; +}; + +Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; +}; + +Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } +}; +}; diff --git a/node_modules/bluebird/js/release/nodeback.js b/node_modules/bluebird/js/release/nodeback.js new file mode 100644 index 0000000..71e69eb --- /dev/null +++ b/node_modules/bluebird/js/release/nodeback.js @@ -0,0 +1,51 @@ +"use strict"; +var util = require("./util"); +var maybeWrapAsError = util.maybeWrapAsError; +var errors = require("./errors"); +var OperationalError = errors.OperationalError; +var es5 = require("./es5"); + +function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; +} + +var rErrorKey = /^(?:name|message|stack|cause)$/; +function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; +} + +function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}; + promise._fulfill(args); + } + promise = null; + }; +} + +module.exports = nodebackForPromise; diff --git a/node_modules/bluebird/js/release/nodeify.js b/node_modules/bluebird/js/release/nodeify.js new file mode 100644 index 0000000..ce2b190 --- /dev/null +++ b/node_modules/bluebird/js/release/nodeify.js @@ -0,0 +1,58 @@ +"use strict"; +module.exports = function(Promise) { +var util = require("./util"); +var async = Promise._async; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function spreadAdapter(val, nodeback) { + var promise = this; + if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); + var ret = + tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +function successAdapter(val, nodeback) { + var promise = this; + var receiver = promise._boundValue(); + var ret = val === undefined + ? tryCatch(nodeback).call(receiver, null) + : tryCatch(nodeback).call(receiver, null, val); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} +function errorAdapter(reason, nodeback) { + var promise = this; + if (!reason) { + var newReason = new Error(reason + ""); + newReason.cause = reason; + reason = newReason; + } + var ret = tryCatch(nodeback).call(promise._boundValue(), reason); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, + options) { + if (typeof nodeback == "function") { + var adapter = successAdapter; + if (options !== undefined && Object(options).spread) { + adapter = spreadAdapter; + } + this._then( + adapter, + errorAdapter, + undefined, + this, + nodeback + ); + } + return this; +}; +}; diff --git a/node_modules/bluebird/js/release/promise.js b/node_modules/bluebird/js/release/promise.js new file mode 100644 index 0000000..622a86f --- /dev/null +++ b/node_modules/bluebird/js/release/promise.js @@ -0,0 +1,819 @@ +"use strict"; +module.exports = function() { +var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); +}; +var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); +}; +function Proxyable() {} +var UNDEFINED_BINDING = {}; +var util = require("./util"); +util.setReflectHandler(reflectHandler); + +var getDomain = function() { + var domain = process.domain; + if (domain === undefined) { + return null; + } + return domain; +}; +var getContextDefault = function() { + return null; +}; +var getContextDomain = function() { + return { + domain: getDomain(), + async: null + }; +}; +var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? + require("async_hooks").AsyncResource : null; +var getContextAsyncHooks = function() { + return { + domain: getDomain(), + async: new AsyncResource("Bluebird::Promise") + }; +}; +var getContext = util.isNode ? getContextDomain : getContextDefault; +util.notEnumerableProp(Promise, "_getContext", getContext); +var enableAsyncHooks = function() { + getContext = getContextAsyncHooks; + util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); +}; +var disableAsyncHooks = function() { + getContext = getContextDomain; + util.notEnumerableProp(Promise, "_getContext", getContextDomain); +}; + +var es5 = require("./es5"); +var Async = require("./async"); +var async = new Async(); +es5.defineProperty(Promise, "_async", {value: async}); +var errors = require("./errors"); +var TypeError = Promise.TypeError = errors.TypeError; +Promise.RangeError = errors.RangeError; +var CancellationError = Promise.CancellationError = errors.CancellationError; +Promise.TimeoutError = errors.TimeoutError; +Promise.OperationalError = errors.OperationalError; +Promise.RejectionError = errors.OperationalError; +Promise.AggregateError = errors.AggregateError; +var INTERNAL = function(){}; +var APPLY = {}; +var NEXT_FILTER = {}; +var tryConvertToPromise = require("./thenables")(Promise, INTERNAL); +var PromiseArray = + require("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); +var Context = require("./context")(Promise); + /*jshint unused:false*/ +var createContext = Context.create; + +var debug = require("./debuggability")(Promise, Context, + enableAsyncHooks, disableAsyncHooks); +var CapturedTrace = debug.CapturedTrace; +var PassThroughHandlerContext = + require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); +var catchFilter = require("./catch_filter")(NEXT_FILTER); +var nodebackForPromise = require("./nodeback"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +function check(self, executor) { + if (self == null || self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + +} + +function Promise(executor) { + if (executor !== INTERNAL) { + check(this, executor); + } + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + this._resolveFromExecutor(executor); + this._promiseCreated(); + this._fireEvent("promiseCreated", this); +} + +Promise.prototype.toString = function () { + return "[object Promise]"; +}; + +Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("Catch statement predicate: " + + "expecting an object but got " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + + if (typeof fn !== "function") { + throw new TypeError("The last argument to .catch() " + + "must be a function, got " + util.toString(fn)); + } + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); +}; + +Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); +}; + +Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); +}; + +Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); +}; + +Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); +}; + +Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; +}; + +Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); +}; + +Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); +}; + +Promise.getNewLibraryCopy = module.exports; + +Promise.is = function (val) { + return val instanceof Promise; +}; + +Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.all = function (promises) { + return new PromiseArray(promises).promise(); +}; + +Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; +}; + +Promise.resolve = Promise.fulfilled = Promise.cast; + +Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; +}; + +Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); +}; + +Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData +) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var context = getContext(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: util.contextBind(context, handler), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, + receiver, context); + } + + return promise; +}; + +Promise.prototype._length = function () { + return this._bitField & 65535; +}; + +Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; +}; + +Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; +}; + +Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); +}; + +Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); +}; + +Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); +}; + +Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); +}; + +Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; +}; + +Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; +}; + +Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); +}; + +Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); +}; + +Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; +}; + +Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + var bitField = this._bitField; + this._bitField = bitField | + (((bitField & 536870912) >> 2) ^ + 134217728); +}; + +Promise.prototype._setNoAsyncGuarantee = function() { + this._bitField = (this._bitField | 536870912) & + (~134217728); +}; + +Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; +}; + +Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; +}; + +Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; +}; + +Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; +}; + +Promise.prototype._boundValue = function() {}; + +Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + context +) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = util.contextBind(context, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + util.contextBind(context, reject); + } + } + this._setLength(index + 1); + return index; +}; + +Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); +}; + +Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(maybePromise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } +}; + +Promise.prototype._rejectCallback = +function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); +}; + +Promise.prototype._resolveFromExecutor = function (executor) { + if (executor === INTERNAL) return; + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } +}; + +Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise +) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } +}; + +Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; +}; + +Promise.prototype._followee = function() { + return this._rejectionHandler0; +}; + +Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; +}; + +Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } +}; + +Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } +}; + +Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); +}; + +Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); +}; + +Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; +}; + +Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + this._dereferenceTrace(); + } +}; + +Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } +}; + +Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } +}; + +Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } +}; + +Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); +}; + +Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } +}; + +if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + es5.defineProperty(Promise.prototype, Symbol.toStringTag, { + get: function () { + return "Object"; + } + }); +} + +function deferResolve(v) {this.promise._resolveCallback(v);} +function deferReject(v) {this.promise._rejectCallback(v, false);} + +Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; +}; + +util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + +require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); +require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); +require("./cancel")(Promise, PromiseArray, apiRejection, debug); +require("./direct_resolve")(Promise); +require("./synchronous_inspection")(Promise); +require("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); +Promise.Promise = Promise; +Promise.version = "3.7.2"; +require('./call_get.js')(Promise); +require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); +require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +require('./nodeify.js')(Promise); +require('./promisify.js')(Promise, INTERNAL); +require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); +require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); +require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +require('./settle.js')(Promise, PromiseArray, debug); +require('./some.js')(Promise, PromiseArray, apiRejection); +require('./timers.js')(Promise, INTERNAL, debug); +require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); +require('./any.js')(Promise); +require('./each.js')(Promise, INTERNAL); +require('./filter.js')(Promise, INTERNAL); + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + +}; diff --git a/node_modules/bluebird/js/release/promise_array.js b/node_modules/bluebird/js/release/promise_array.js new file mode 100644 index 0000000..8fc665a --- /dev/null +++ b/node_modules/bluebird/js/release/promise_array.js @@ -0,0 +1,186 @@ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { +var util = require("./util"); +var isArray = util.isArray; + +function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + case -6: return new Map(); + } +} + +function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + values.suppressUnhandledRejections(); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); +} +util.inherits(PromiseArray, Proxyable); + +PromiseArray.prototype.length = function () { + return this._length; +}; + +PromiseArray.prototype.promise = function () { + return this._promise; +}; + +PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); +}; + +PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); +}; + +PromiseArray.prototype._isResolved = function () { + return this._values === null; +}; + +PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); +}; + +PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); +}; + +PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); +}; + +PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; +}; + +PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; +}; + +PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } +}; + +PromiseArray.prototype.shouldCopyValues = function () { + return true; +}; + +PromiseArray.prototype.getActualLength = function (len) { + return len; +}; + +return PromiseArray; +}; diff --git a/node_modules/bluebird/js/release/promisify.js b/node_modules/bluebird/js/release/promisify.js new file mode 100644 index 0000000..aa98e5b --- /dev/null +++ b/node_modules/bluebird/js/release/promisify.js @@ -0,0 +1,314 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var THIS = {}; +var util = require("./util"); +var nodebackForPromise = require("./nodeback"); +var withAppended = util.withAppended; +var maybeWrapAsError = util.maybeWrapAsError; +var canEvaluate = util.canEvaluate; +var TypeError = require("./errors").TypeError; +var defaultSuffix = "Async"; +var defaultPromisified = {__isPromisified__: true}; +var noCopyProps = [ + "arity", "length", + "name", + "arguments", + "caller", + "callee", + "prototype", + "__isPromisified__" +]; +var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$"); + +var defaultFilter = function(name) { + return util.isIdentifier(name) && + name.charAt(0) !== "_" && + name !== "constructor"; +}; + +function propsFilter(key) { + return !noCopyPropsPattern.test(key); +} + +function isPromisified(fn) { + try { + return fn.__isPromisified__ === true; + } + catch (e) { + return false; + } +} + +function hasPromisified(obj, key, suffix) { + var val = util.getDataPropertyOrDefault(obj, key + suffix, + defaultPromisified); + return val ? isPromisified(val) : false; +} +function checkValid(ret, suffix, suffixRegexp) { + for (var i = 0; i < ret.length; i += 2) { + var key = ret[i]; + if (suffixRegexp.test(key)) { + var keyWithoutAsyncSuffix = key.replace(suffixRegexp, ""); + for (var j = 0; j < ret.length; j += 2) { + if (ret[j] === keyWithoutAsyncSuffix) { + throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a" + .replace("%s", suffix)); + } + } + } + } +} + +function promisifiableMethods(obj, suffix, suffixRegexp, filter) { + var keys = util.inheritedDataKeys(obj); + var ret = []; + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var value = obj[key]; + var passesDefaultFilter = filter === defaultFilter + ? true : defaultFilter(key, value, obj); + if (typeof value === "function" && + !isPromisified(value) && + !hasPromisified(obj, key, suffix) && + filter(key, value, obj, passesDefaultFilter)) { + ret.push(key, value); + } + } + checkValid(ret, suffix, suffixRegexp); + return ret; +} + +var escapeIdentRegex = function(str) { + return str.replace(/([$])/, "\\$"); +}; + +var makeNodePromisifiedEval; +if (!false) { +var switchCaseArgumentOrder = function(likelyArgumentCount) { + var ret = [likelyArgumentCount]; + var min = Math.max(0, likelyArgumentCount - 1 - 3); + for(var i = likelyArgumentCount - 1; i >= min; --i) { + ret.push(i); + } + for(var i = likelyArgumentCount + 1; i <= 3; ++i) { + ret.push(i); + } + return ret; +}; + +var argumentSequence = function(argumentCount) { + return util.filledRange(argumentCount, "_arg", ""); +}; + +var parameterDeclaration = function(parameterCount) { + return util.filledRange( + Math.max(parameterCount, 3), "_arg", ""); +}; + +var parameterCount = function(fn) { + if (typeof fn.length === "number") { + return Math.max(Math.min(fn.length, 1023 + 1), 0); + } + return 0; +}; + +makeNodePromisifiedEval = +function(callback, receiver, originalName, fn, _, multiArgs) { + var newParameterCount = Math.max(0, parameterCount(fn) - 1); + var argumentOrder = switchCaseArgumentOrder(newParameterCount); + var shouldProxyThis = typeof callback === "string" || receiver === THIS; + + function generateCallForArgumentCount(count) { + var args = argumentSequence(count).join(", "); + var comma = count > 0 ? ", " : ""; + var ret; + if (shouldProxyThis) { + ret = "ret = callback.call(this, {{args}}, nodeback); break;\n"; + } else { + ret = receiver === undefined + ? "ret = callback({{args}}, nodeback); break;\n" + : "ret = callback.call(receiver, {{args}}, nodeback); break;\n"; + } + return ret.replace("{{args}}", args).replace(", ", comma); + } + + function generateArgumentSwitchCase() { + var ret = ""; + for (var i = 0; i < argumentOrder.length; ++i) { + ret += "case " + argumentOrder[i] +":" + + generateCallForArgumentCount(argumentOrder[i]); + } + + ret += " \n\ + default: \n\ + var args = new Array(len + 1); \n\ + var i = 0; \n\ + for (var i = 0; i < len; ++i) { \n\ + args[i] = arguments[i]; \n\ + } \n\ + args[i] = nodeback; \n\ + [CodeForCall] \n\ + break; \n\ + ".replace("[CodeForCall]", (shouldProxyThis + ? "ret = callback.apply(this, args);\n" + : "ret = callback.apply(receiver, args);\n")); + return ret; + } + + var getFunctionCode = typeof callback === "string" + ? ("this != null ? this['"+callback+"'] : fn") + : "fn"; + var body = "'use strict'; \n\ + var ret = function (Parameters) { \n\ + 'use strict'; \n\ + var len = arguments.length; \n\ + var promise = new Promise(INTERNAL); \n\ + promise._captureStackTrace(); \n\ + var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\ + var ret; \n\ + var callback = tryCatch([GetFunctionCode]); \n\ + switch(len) { \n\ + [CodeForSwitchCase] \n\ + } \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\ + } \n\ + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\ + return promise; \n\ + }; \n\ + notEnumerableProp(ret, '__isPromisified__', true); \n\ + return ret; \n\ + ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase()) + .replace("[GetFunctionCode]", getFunctionCode); + body = body.replace("Parameters", parameterDeclaration(newParameterCount)); + return new Function("Promise", + "fn", + "receiver", + "withAppended", + "maybeWrapAsError", + "nodebackForPromise", + "tryCatch", + "errorObj", + "notEnumerableProp", + "INTERNAL", + body)( + Promise, + fn, + receiver, + withAppended, + maybeWrapAsError, + nodebackForPromise, + util.tryCatch, + util.errorObj, + util.notEnumerableProp, + INTERNAL); +}; +} + +function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) { + var defaultThis = (function() {return this;})(); + var method = callback; + if (typeof method === "string") { + callback = fn; + } + function promisified() { + var _receiver = receiver; + if (receiver === THIS) _receiver = this; + var promise = new Promise(INTERNAL); + promise._captureStackTrace(); + var cb = typeof method === "string" && this !== defaultThis + ? this[method] : callback; + var fn = nodebackForPromise(promise, multiArgs); + try { + cb.apply(_receiver, withAppended(arguments, fn)); + } catch(e) { + promise._rejectCallback(maybeWrapAsError(e), true, true); + } + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); + return promise; + } + util.notEnumerableProp(promisified, "__isPromisified__", true); + return promisified; +} + +var makeNodePromisified = canEvaluate + ? makeNodePromisifiedEval + : makeNodePromisifiedClosure; + +function promisifyAll(obj, suffix, filter, promisifier, multiArgs) { + var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$"); + var methods = + promisifiableMethods(obj, suffix, suffixRegexp, filter); + + for (var i = 0, len = methods.length; i < len; i+= 2) { + var key = methods[i]; + var fn = methods[i+1]; + var promisifiedKey = key + suffix; + if (promisifier === makeNodePromisified) { + obj[promisifiedKey] = + makeNodePromisified(key, THIS, key, fn, suffix, multiArgs); + } else { + var promisified = promisifier(fn, function() { + return makeNodePromisified(key, THIS, key, + fn, suffix, multiArgs); + }); + util.notEnumerableProp(promisified, "__isPromisified__", true); + obj[promisifiedKey] = promisified; + } + } + util.toFastProperties(obj); + return obj; +} + +function promisify(callback, receiver, multiArgs) { + return makeNodePromisified(callback, receiver, undefined, + callback, null, multiArgs); +} + +Promise.promisify = function (fn, options) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + if (isPromisified(fn)) { + return fn; + } + options = Object(options); + var receiver = options.context === undefined ? THIS : options.context; + var multiArgs = !!options.multiArgs; + var ret = promisify(fn, receiver, multiArgs); + util.copyDescriptors(fn, ret, propsFilter); + return ret; +}; + +Promise.promisifyAll = function (target, options) { + if (typeof target !== "function" && typeof target !== "object") { + throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + options = Object(options); + var multiArgs = !!options.multiArgs; + var suffix = options.suffix; + if (typeof suffix !== "string") suffix = defaultSuffix; + var filter = options.filter; + if (typeof filter !== "function") filter = defaultFilter; + var promisifier = options.promisifier; + if (typeof promisifier !== "function") promisifier = makeNodePromisified; + + if (!util.isIdentifier(suffix)) { + throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + + var keys = util.inheritedDataKeys(target); + for (var i = 0; i < keys.length; ++i) { + var value = target[keys[i]]; + if (keys[i] !== "constructor" && + util.isClass(value)) { + promisifyAll(value.prototype, suffix, filter, promisifier, + multiArgs); + promisifyAll(value, suffix, filter, promisifier, multiArgs); + } + } + + return promisifyAll(target, suffix, filter, promisifier, multiArgs); +}; +}; + diff --git a/node_modules/bluebird/js/release/props.js b/node_modules/bluebird/js/release/props.js new file mode 100644 index 0000000..6a34aaf --- /dev/null +++ b/node_modules/bluebird/js/release/props.js @@ -0,0 +1,118 @@ +"use strict"; +module.exports = function( + Promise, PromiseArray, tryConvertToPromise, apiRejection) { +var util = require("./util"); +var isObject = util.isObject; +var es5 = require("./es5"); +var Es6Map; +if (typeof Map === "function") Es6Map = Map; + +var mapToEntries = (function() { + var index = 0; + var size = 0; + + function extractEntry(value, key) { + this[index] = value; + this[index + size] = key; + index++; + } + + return function mapToEntries(map) { + size = map.size; + index = 0; + var ret = new Array(map.size * 2); + map.forEach(extractEntry, ret); + return ret; + }; +})(); + +var entriesToMap = function(entries) { + var ret = new Es6Map(); + var length = entries.length / 2 | 0; + for (var i = 0; i < length; ++i) { + var key = entries[length + i]; + var value = entries[i]; + ret.set(key, value); + } + return ret; +}; + +function PropertiesPromiseArray(obj) { + var isMap = false; + var entries; + if (Es6Map !== undefined && obj instanceof Es6Map) { + entries = mapToEntries(obj); + isMap = true; + } else { + var keys = es5.keys(obj); + var len = keys.length; + entries = new Array(len * 2); + for (var i = 0; i < len; ++i) { + var key = keys[i]; + entries[i] = obj[key]; + entries[i + len] = key; + } + } + this.constructor$(entries); + this._isMap = isMap; + this._init$(undefined, isMap ? -6 : -3); +} +util.inherits(PropertiesPromiseArray, PromiseArray); + +PropertiesPromiseArray.prototype._init = function () {}; + +PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + var val; + if (this._isMap) { + val = entriesToMap(this._values); + } else { + val = {}; + var keyOffset = this.length(); + for (var i = 0, len = this.length(); i < len; ++i) { + val[this._values[i + keyOffset]] = this._values[i]; + } + } + this._resolve(val); + return true; + } + return false; +}; + +PropertiesPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +PropertiesPromiseArray.prototype.getActualLength = function (len) { + return len >> 1; +}; + +function props(promises) { + var ret; + var castValue = tryConvertToPromise(promises); + + if (!isObject(castValue)) { + return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } else if (castValue instanceof Promise) { + ret = castValue._then( + Promise.props, undefined, undefined, undefined, undefined); + } else { + ret = new PropertiesPromiseArray(castValue).promise(); + } + + if (castValue instanceof Promise) { + ret._propagateFrom(castValue, 2); + } + return ret; +} + +Promise.prototype.props = function () { + return props(this); +}; + +Promise.props = function (promises) { + return props(promises); +}; +}; diff --git a/node_modules/bluebird/js/release/queue.js b/node_modules/bluebird/js/release/queue.js new file mode 100644 index 0000000..ffd36fd --- /dev/null +++ b/node_modules/bluebird/js/release/queue.js @@ -0,0 +1,73 @@ +"use strict"; +function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } +} + +function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; +} + +Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; +}; + +Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; +}; + +Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; +}; + +Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; +}; + +Queue.prototype.length = function () { + return this._length; +}; + +Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } +}; + +Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); +}; + +module.exports = Queue; diff --git a/node_modules/bluebird/js/release/race.js b/node_modules/bluebird/js/release/race.js new file mode 100644 index 0000000..b862f46 --- /dev/null +++ b/node_modules/bluebird/js/release/race.js @@ -0,0 +1,49 @@ +"use strict"; +module.exports = function( + Promise, INTERNAL, tryConvertToPromise, apiRejection) { +var util = require("./util"); + +var raceLater = function (promise) { + return promise.then(function(array) { + return race(array, promise); + }); +}; + +function race(promises, parent) { + var maybePromise = tryConvertToPromise(promises); + + if (maybePromise instanceof Promise) { + return raceLater(maybePromise); + } else { + promises = util.asArray(promises); + if (promises === null) + return apiRejection("expecting an array or an iterable object but got " + util.classString(promises)); + } + + var ret = new Promise(INTERNAL); + if (parent !== undefined) { + ret._propagateFrom(parent, 3); + } + var fulfill = ret._fulfill; + var reject = ret._reject; + for (var i = 0, len = promises.length; i < len; ++i) { + var val = promises[i]; + + if (val === undefined && !(i in promises)) { + continue; + } + + Promise.cast(val)._then(fulfill, reject, undefined, ret, null); + } + return ret; +} + +Promise.race = function (promises) { + return race(promises, undefined); +}; + +Promise.prototype.race = function () { + return race(this, undefined); +}; + +}; diff --git a/node_modules/bluebird/js/release/reduce.js b/node_modules/bluebird/js/release/reduce.js new file mode 100644 index 0000000..101ac22 --- /dev/null +++ b/node_modules/bluebird/js/release/reduce.js @@ -0,0 +1,183 @@ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; + +function ReductionPromiseArray(promises, fn, initialValue, _each) { + this.constructor$(promises); + var context = Promise._getContext(); + this._fn = util.contextBind(context, fn); + if (initialValue !== undefined) { + initialValue = Promise.resolve(initialValue); + initialValue._attachCancellationCallback(this); + } + this._initialValue = initialValue; + this._currentCancellable = null; + if(_each === INTERNAL) { + this._eachValues = Array(this._length); + } else if (_each === 0) { + this._eachValues = null; + } else { + this._eachValues = undefined; + } + this._promise._captureStackTrace(); + this._init$(undefined, -5); +} +util.inherits(ReductionPromiseArray, PromiseArray); + +ReductionPromiseArray.prototype._gotAccum = function(accum) { + if (this._eachValues !== undefined && + this._eachValues !== null && + accum !== INTERNAL) { + this._eachValues.push(accum); + } +}; + +ReductionPromiseArray.prototype._eachComplete = function(value) { + if (this._eachValues !== null) { + this._eachValues.push(value); + } + return this._eachValues; +}; + +ReductionPromiseArray.prototype._init = function() {}; + +ReductionPromiseArray.prototype._resolveEmptyArray = function() { + this._resolve(this._eachValues !== undefined ? this._eachValues + : this._initialValue); +}; + +ReductionPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +ReductionPromiseArray.prototype._resolve = function(value) { + this._promise._resolveCallback(value); + this._values = null; +}; + +ReductionPromiseArray.prototype._resultCancelled = function(sender) { + if (sender === this._initialValue) return this._cancel(); + if (this._isResolved()) return; + this._resultCancelled$(); + if (this._currentCancellable instanceof Promise) { + this._currentCancellable.cancel(); + } + if (this._initialValue instanceof Promise) { + this._initialValue.cancel(); + } +}; + +ReductionPromiseArray.prototype._iterate = function (values) { + this._values = values; + var value; + var i; + var length = values.length; + if (this._initialValue !== undefined) { + value = this._initialValue; + i = 0; + } else { + value = Promise.resolve(values[0]); + i = 1; + } + + this._currentCancellable = value; + + for (var j = i; j < length; ++j) { + var maybePromise = values[j]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + + if (!value.isRejected()) { + for (; i < length; ++i) { + var ctx = { + accum: null, + value: values[i], + index: i, + length: length, + array: this + }; + + value = value._then(gotAccum, undefined, undefined, ctx, undefined); + + if ((i & 127) === 0) { + value._setNoAsyncGuarantee(); + } + } + } + + if (this._eachValues !== undefined) { + value = value + ._then(this._eachComplete, undefined, undefined, this, undefined); + } + value._then(completed, completed, undefined, value, this); +}; + +Promise.prototype.reduce = function (fn, initialValue) { + return reduce(this, fn, initialValue, null); +}; + +Promise.reduce = function (promises, fn, initialValue, _each) { + return reduce(promises, fn, initialValue, _each); +}; + +function completed(valueOrReason, array) { + if (this.isFulfilled()) { + array._resolve(valueOrReason); + } else { + array._reject(valueOrReason); + } +} + +function reduce(promises, fn, initialValue, _each) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var array = new ReductionPromiseArray(promises, fn, initialValue, _each); + return array.promise(); +} + +function gotAccum(accum) { + this.accum = accum; + this.array._gotAccum(accum); + var value = tryConvertToPromise(this.value, this.array._promise); + if (value instanceof Promise) { + this.array._currentCancellable = value; + return value._then(gotValue, undefined, undefined, this, undefined); + } else { + return gotValue.call(this, value); + } +} + +function gotValue(value) { + var array = this.array; + var promise = array._promise; + var fn = tryCatch(array._fn); + promise._pushContext(); + var ret; + if (array._eachValues !== undefined) { + ret = fn.call(promise._boundValue(), value, this.index, this.length); + } else { + ret = fn.call(promise._boundValue(), + this.accum, value, this.index, this.length); + } + if (ret instanceof Promise) { + array._currentCancellable = ret; + } + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", + promise + ); + return ret; +} +}; diff --git a/node_modules/bluebird/js/release/schedule.js b/node_modules/bluebird/js/release/schedule.js new file mode 100644 index 0000000..15197d1 --- /dev/null +++ b/node_modules/bluebird/js/release/schedule.js @@ -0,0 +1,62 @@ +"use strict"; +var util = require("./util"); +var schedule; +var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var NativePromise = util.getNativePromise(); +if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; +} else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova)) && + ("classList" in document.documentElement)) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); +} else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; +} else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; +} else { + schedule = noAsyncScheduler; +} +module.exports = schedule; diff --git a/node_modules/bluebird/js/release/settle.js b/node_modules/bluebird/js/release/settle.js new file mode 100644 index 0000000..e24b204 --- /dev/null +++ b/node_modules/bluebird/js/release/settle.js @@ -0,0 +1,47 @@ +"use strict"; +module.exports = + function(Promise, PromiseArray, debug) { +var PromiseInspection = Promise.PromiseInspection; +var util = require("./util"); + +function SettledPromiseArray(values) { + this.constructor$(values); +} +util.inherits(SettledPromiseArray, PromiseArray); + +SettledPromiseArray.prototype._promiseResolved = function (index, inspection) { + this._values[index] = inspection; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +SettledPromiseArray.prototype._promiseFulfilled = function (value, index) { + var ret = new PromiseInspection(); + ret._bitField = 33554432; + ret._settledValueField = value; + return this._promiseResolved(index, ret); +}; +SettledPromiseArray.prototype._promiseRejected = function (reason, index) { + var ret = new PromiseInspection(); + ret._bitField = 16777216; + ret._settledValueField = reason; + return this._promiseResolved(index, ret); +}; + +Promise.settle = function (promises) { + debug.deprecated(".settle()", ".reflect()"); + return new SettledPromiseArray(promises).promise(); +}; + +Promise.allSettled = function (promises) { + return new SettledPromiseArray(promises).promise(); +}; + +Promise.prototype.settle = function () { + return Promise.settle(this); +}; +}; diff --git a/node_modules/bluebird/js/release/some.js b/node_modules/bluebird/js/release/some.js new file mode 100644 index 0000000..400d852 --- /dev/null +++ b/node_modules/bluebird/js/release/some.js @@ -0,0 +1,148 @@ +"use strict"; +module.exports = +function(Promise, PromiseArray, apiRejection) { +var util = require("./util"); +var RangeError = require("./errors").RangeError; +var AggregateError = require("./errors").AggregateError; +var isArray = util.isArray; +var CANCELLATION = {}; + + +function SomePromiseArray(values) { + this.constructor$(values); + this._howMany = 0; + this._unwrap = false; + this._initialized = false; +} +util.inherits(SomePromiseArray, PromiseArray); + +SomePromiseArray.prototype._init = function () { + if (!this._initialized) { + return; + } + if (this._howMany === 0) { + this._resolve([]); + return; + } + this._init$(undefined, -5); + var isArrayResolved = isArray(this._values); + if (!this._isResolved() && + isArrayResolved && + this._howMany > this._canPossiblyFulfill()) { + this._reject(this._getRangeError(this.length())); + } +}; + +SomePromiseArray.prototype.init = function () { + this._initialized = true; + this._init(); +}; + +SomePromiseArray.prototype.setUnwrap = function () { + this._unwrap = true; +}; + +SomePromiseArray.prototype.howMany = function () { + return this._howMany; +}; + +SomePromiseArray.prototype.setHowMany = function (count) { + this._howMany = count; +}; + +SomePromiseArray.prototype._promiseFulfilled = function (value) { + this._addFulfilled(value); + if (this._fulfilled() === this.howMany()) { + this._values.length = this.howMany(); + if (this.howMany() === 1 && this._unwrap) { + this._resolve(this._values[0]); + } else { + this._resolve(this._values); + } + return true; + } + return false; + +}; +SomePromiseArray.prototype._promiseRejected = function (reason) { + this._addRejected(reason); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._promiseCancelled = function () { + if (this._values instanceof Promise || this._values == null) { + return this._cancel(); + } + this._addRejected(CANCELLATION); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._checkOutcome = function() { + if (this.howMany() > this._canPossiblyFulfill()) { + var e = new AggregateError(); + for (var i = this.length(); i < this._values.length; ++i) { + if (this._values[i] !== CANCELLATION) { + e.push(this._values[i]); + } + } + if (e.length > 0) { + this._reject(e); + } else { + this._cancel(); + } + return true; + } + return false; +}; + +SomePromiseArray.prototype._fulfilled = function () { + return this._totalResolved; +}; + +SomePromiseArray.prototype._rejected = function () { + return this._values.length - this.length(); +}; + +SomePromiseArray.prototype._addRejected = function (reason) { + this._values.push(reason); +}; + +SomePromiseArray.prototype._addFulfilled = function (value) { + this._values[this._totalResolved++] = value; +}; + +SomePromiseArray.prototype._canPossiblyFulfill = function () { + return this.length() - this._rejected(); +}; + +SomePromiseArray.prototype._getRangeError = function (count) { + var message = "Input array must contain at least " + + this._howMany + " items but contains only " + count + " items"; + return new RangeError(message); +}; + +SomePromiseArray.prototype._resolveEmptyArray = function () { + this._reject(this._getRangeError(0)); +}; + +function some(promises, howMany) { + if ((howMany | 0) !== howMany || howMany < 0) { + return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(howMany); + ret.init(); + return promise; +} + +Promise.some = function (promises, howMany) { + return some(promises, howMany); +}; + +Promise.prototype.some = function (howMany) { + return some(this, howMany); +}; + +Promise._SomePromiseArray = SomePromiseArray; +}; diff --git a/node_modules/bluebird/js/release/synchronous_inspection.js b/node_modules/bluebird/js/release/synchronous_inspection.js new file mode 100644 index 0000000..9c49d2e --- /dev/null +++ b/node_modules/bluebird/js/release/synchronous_inspection.js @@ -0,0 +1,103 @@ +"use strict"; +module.exports = function(Promise) { +function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } +} + +PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; +}; + +var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var reason = PromiseInspection.prototype.error = +PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; +}; + +var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; +}; + +var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; +}; + +var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; +}; + +PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; +}; + +Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; +}; + +Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); +}; + +Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; +}; + +Promise.prototype.isPending = function() { + return isPending.call(this._target()); +}; + +Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); +}; + +Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); +}; + +Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); +}; + +Promise.prototype.value = function() { + return value.call(this._target()); +}; + +Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); +}; + +Promise.prototype._value = function() { + return this._settledValue(); +}; + +Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); +}; + +Promise.PromiseInspection = PromiseInspection; +}; diff --git a/node_modules/bluebird/js/release/thenables.js b/node_modules/bluebird/js/release/thenables.js new file mode 100644 index 0000000..d6ab9aa --- /dev/null +++ b/node_modules/bluebird/js/release/thenables.js @@ -0,0 +1,86 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var util = require("./util"); +var errorObj = util.errorObj; +var isObject = util.isObject; + +function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; +} + +function doGetThen(obj) { + return obj.then; +} + +function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} + +var hasProp = {}.hasOwnProperty; +function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } +} + +function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; +} + +return tryConvertToPromise; +}; diff --git a/node_modules/bluebird/js/release/timers.js b/node_modules/bluebird/js/release/timers.js new file mode 100644 index 0000000..cb8f1f4 --- /dev/null +++ b/node_modules/bluebird/js/release/timers.js @@ -0,0 +1,93 @@ +"use strict"; +module.exports = function(Promise, INTERNAL, debug) { +var util = require("./util"); +var TimeoutError = Promise.TimeoutError; + +function HandleWrapper(handle) { + this.handle = handle; +} + +HandleWrapper.prototype._resultCancelled = function() { + clearTimeout(this.handle); +}; + +var afterValue = function(value) { return delay(+this).thenReturn(value); }; +var delay = Promise.delay = function (ms, value) { + var ret; + var handle; + if (value !== undefined) { + ret = Promise.resolve(value) + ._then(afterValue, null, null, ms, undefined); + if (debug.cancellation() && value instanceof Promise) { + ret._setOnCancel(value); + } + } else { + ret = new Promise(INTERNAL); + handle = setTimeout(function() { ret._fulfill(); }, +ms); + if (debug.cancellation()) { + ret._setOnCancel(new HandleWrapper(handle)); + } + ret._captureStackTrace(); + } + ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.prototype.delay = function (ms) { + return delay(ms, this); +}; + +var afterTimeout = function (promise, message, parent) { + var err; + if (typeof message !== "string") { + if (message instanceof Error) { + err = message; + } else { + err = new TimeoutError("operation timed out"); + } + } else { + err = new TimeoutError(message); + } + util.markAsOriginatingFromRejection(err); + promise._attachExtraTrace(err); + promise._reject(err); + + if (parent != null) { + parent.cancel(); + } +}; + +function successClear(value) { + clearTimeout(this.handle); + return value; +} + +function failureClear(reason) { + clearTimeout(this.handle); + throw reason; +} + +Promise.prototype.timeout = function (ms, message) { + ms = +ms; + var ret, parent; + + var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { + if (ret.isPending()) { + afterTimeout(ret, message, parent); + } + }, ms)); + + if (debug.cancellation()) { + parent = this.then(); + ret = parent._then(successClear, failureClear, + undefined, handleWrapper, undefined); + ret._setOnCancel(handleWrapper); + } else { + ret = this._then(successClear, failureClear, + undefined, handleWrapper, undefined); + } + + return ret; +}; + +}; diff --git a/node_modules/bluebird/js/release/using.js b/node_modules/bluebird/js/release/using.js new file mode 100644 index 0000000..65de531 --- /dev/null +++ b/node_modules/bluebird/js/release/using.js @@ -0,0 +1,226 @@ +"use strict"; +module.exports = function (Promise, apiRejection, tryConvertToPromise, + createContext, INTERNAL, debug) { + var util = require("./util"); + var TypeError = require("./errors").TypeError; + var inherits = require("./util").inherits; + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + var NULL = {}; + + function thrower(e) { + setTimeout(function(){throw e;}, 0); + } + + function castPreservingDisposable(thenable) { + var maybePromise = tryConvertToPromise(thenable); + if (maybePromise !== thenable && + typeof thenable._isDisposable === "function" && + typeof thenable._getDisposer === "function" && + thenable._isDisposable()) { + maybePromise._setDisposable(thenable._getDisposer()); + } + return maybePromise; + } + function dispose(resources, inspection) { + var i = 0; + var len = resources.length; + var ret = new Promise(INTERNAL); + function iterator() { + if (i >= len) return ret._fulfill(); + var maybePromise = castPreservingDisposable(resources[i++]); + if (maybePromise instanceof Promise && + maybePromise._isDisposable()) { + try { + maybePromise = tryConvertToPromise( + maybePromise._getDisposer().tryDispose(inspection), + resources.promise); + } catch (e) { + return thrower(e); + } + if (maybePromise instanceof Promise) { + return maybePromise._then(iterator, thrower, + null, null, null); + } + } + iterator(); + } + iterator(); + return ret; + } + + function Disposer(data, promise, context) { + this._data = data; + this._promise = promise; + this._context = context; + } + + Disposer.prototype.data = function () { + return this._data; + }; + + Disposer.prototype.promise = function () { + return this._promise; + }; + + Disposer.prototype.resource = function () { + if (this.promise().isFulfilled()) { + return this.promise().value(); + } + return NULL; + }; + + Disposer.prototype.tryDispose = function(inspection) { + var resource = this.resource(); + var context = this._context; + if (context !== undefined) context._pushContext(); + var ret = resource !== NULL + ? this.doDispose(resource, inspection) : null; + if (context !== undefined) context._popContext(); + this._promise._unsetDisposable(); + this._data = null; + return ret; + }; + + Disposer.isDisposer = function (d) { + return (d != null && + typeof d.resource === "function" && + typeof d.tryDispose === "function"); + }; + + function FunctionDisposer(fn, promise, context) { + this.constructor$(fn, promise, context); + } + inherits(FunctionDisposer, Disposer); + + FunctionDisposer.prototype.doDispose = function (resource, inspection) { + var fn = this.data(); + return fn.call(resource, resource, inspection); + }; + + function maybeUnwrapDisposer(value) { + if (Disposer.isDisposer(value)) { + this.resources[this.index]._setDisposable(value); + return value.promise(); + } + return value; + } + + function ResourceList(length) { + this.length = length; + this.promise = null; + this[length-1] = null; + } + + ResourceList.prototype._resultCancelled = function() { + var len = this.length; + for (var i = 0; i < len; ++i) { + var item = this[i]; + if (item instanceof Promise) { + item.cancel(); + } + } + }; + + Promise.using = function () { + var len = arguments.length; + if (len < 2) return apiRejection( + "you must pass at least 2 arguments to Promise.using"); + var fn = arguments[len - 1]; + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var input; + var spreadArgs = true; + if (len === 2 && Array.isArray(arguments[0])) { + input = arguments[0]; + len = input.length; + spreadArgs = false; + } else { + input = arguments; + len--; + } + var resources = new ResourceList(len); + for (var i = 0; i < len; ++i) { + var resource = input[i]; + if (Disposer.isDisposer(resource)) { + var disposer = resource; + resource = resource.promise(); + resource._setDisposable(disposer); + } else { + var maybePromise = tryConvertToPromise(resource); + if (maybePromise instanceof Promise) { + resource = + maybePromise._then(maybeUnwrapDisposer, null, null, { + resources: resources, + index: i + }, undefined); + } + } + resources[i] = resource; + } + + var reflectedResources = new Array(resources.length); + for (var i = 0; i < reflectedResources.length; ++i) { + reflectedResources[i] = Promise.resolve(resources[i]).reflect(); + } + + var resultPromise = Promise.all(reflectedResources) + .then(function(inspections) { + for (var i = 0; i < inspections.length; ++i) { + var inspection = inspections[i]; + if (inspection.isRejected()) { + errorObj.e = inspection.error(); + return errorObj; + } else if (!inspection.isFulfilled()) { + resultPromise.cancel(); + return; + } + inspections[i] = inspection.value(); + } + promise._pushContext(); + + fn = tryCatch(fn); + var ret = spreadArgs + ? fn.apply(undefined, inspections) : fn(inspections); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, promiseCreated, "Promise.using", promise); + return ret; + }); + + var promise = resultPromise.lastly(function() { + var inspection = new Promise.PromiseInspection(resultPromise); + return dispose(resources, inspection); + }); + resources.promise = promise; + promise._setOnCancel(resources); + return promise; + }; + + Promise.prototype._setDisposable = function (disposer) { + this._bitField = this._bitField | 131072; + this._disposer = disposer; + }; + + Promise.prototype._isDisposable = function () { + return (this._bitField & 131072) > 0; + }; + + Promise.prototype._getDisposer = function () { + return this._disposer; + }; + + Promise.prototype._unsetDisposable = function () { + this._bitField = this._bitField & (~131072); + this._disposer = undefined; + }; + + Promise.prototype.disposer = function (fn) { + if (typeof fn === "function") { + return new FunctionDisposer(fn, this, createContext()); + } + throw new TypeError(); + }; + +}; diff --git a/node_modules/bluebird/js/release/util.js b/node_modules/bluebird/js/release/util.js new file mode 100644 index 0000000..8ca4d91 --- /dev/null +++ b/node_modules/bluebird/js/release/util.js @@ -0,0 +1,421 @@ +"use strict"; +var es5 = require("./es5"); +var canEvaluate = typeof navigator == "undefined"; + +var errorObj = {e: {}}; +var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + +function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} +function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; +} + +var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; +}; + + +function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + +} + +function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; +} + +function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); +} + +function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; +} + +function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } +} + +function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; +} + +function thrower(r) { + throw r; +} + +var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + +})(); + +var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; +function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } +} + +function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var receiver = new FakeConstructor(); + function ic() { + return typeof receiver.foo; + } + ic(); + ic(); + return obj; + eval(obj); +} + +var rident = /^[a-z$_][a-z$_0-9]*$/i; +function isIdentifier(str) { + return rident.test(str); +} + +function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; +} + +function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } +} + +function isError(obj) { + return obj instanceof Error || + (obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"); +} + +function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} +} + +function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); +} + +function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); +} + +var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } +})(); + +function classString(obj) { + return {}.toString.call(obj); +} + +function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } +} + +var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; +}; + +if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; +} + +var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + +var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + +function env(key) { + return hasEnvVariables ? process.env[key] : undefined; +} + +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if (classString(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + +var reflectHandler; +function contextBind(ctx, cb) { + if (ctx === null || + typeof cb !== "function" || + cb === reflectHandler) { + return cb; + } + + if (ctx.domain !== null) { + cb = ctx.domain.bind(cb); + } + + var async = ctx.async; + if (async !== null) { + var old = cb; + cb = function() { + var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i - 2];}; + args[0] = old; + args[1] = this; + return async.runInAsyncScope.apply(async, args); + }; + } + return cb; +} + +var ret = { + setReflectHandler: function(fn) { + reflectHandler = fn; + }, + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + contextBind: contextBind +}; +ret.isRecentNode = ret.isNode && (function() { + var version; + if (process.versions && process.versions.node) { + version = process.versions.node.split(".").map(Number); + } else if (process.version) { + version = process.version.split(".").map(Number); + } + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); +})(); +ret.nodeSupportsAsyncResource = ret.isNode && (function() { + var supportsAsync = false; + try { + var res = require("async_hooks").AsyncResource; + supportsAsync = typeof res.prototype.runInAsyncScope === "function"; + } catch (e) { + supportsAsync = false; + } + return supportsAsync; +})(); + +if (ret.isNode) ret.toFastProperties(process); + +try {throw new Error(); } catch (e) {ret.lastLineError = e;} +module.exports = ret; diff --git a/node_modules/bluebird/package.json b/node_modules/bluebird/package.json new file mode 100644 index 0000000..7c23f36 --- /dev/null +++ b/node_modules/bluebird/package.json @@ -0,0 +1,105 @@ +{ + "_args": [ + [ + "bluebird@3.7.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "bluebird@3.7.2", + "_id": "bluebird@3.7.2", + "_inBundle": false, + "_integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "_location": "/bluebird", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "bluebird@3.7.2", + "name": "bluebird", + "escapedName": "bluebird", + "rawSpec": "3.7.2", + "saveSpec": null, + "fetchSpec": "3.7.2" + }, + "_requiredBy": [ + "/knex" + ], + "_resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "_spec": "3.7.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Petka Antonov", + "email": "petka_antonov@hotmail.com", + "url": "http://github.com/petkaantonov/" + }, + "browser": "./js/browser/bluebird.js", + "bugs": { + "url": "http://github.com/petkaantonov/bluebird/issues" + }, + "description": "Full featured Promises/A+ implementation with exceptionally good performance", + "devDependencies": { + "acorn": "^6.0.2", + "acorn-walk": "^6.1.0", + "baconjs": "^0.7.43", + "bluebird": "^2.9.2", + "body-parser": "^1.10.2", + "browserify": "^8.1.1", + "cli-table": "~0.3.1", + "co": "^4.2.0", + "cross-spawn": "^0.2.3", + "glob": "^4.3.2", + "grunt-saucelabs": "~8.4.1", + "highland": "^2.3.0", + "istanbul": "^0.3.5", + "jshint": "^2.6.0", + "jshint-stylish": "~0.2.0", + "kefir": "^2.4.1", + "mkdirp": "~0.5.0", + "mocha": "~2.1", + "open": "~0.0.5", + "optimist": "~0.6.1", + "rimraf": "~2.2.6", + "rx": "^2.3.25", + "serve-static": "^1.7.1", + "sinon": "~1.7.3", + "uglify-js": "~2.4.16" + }, + "files": [ + "js/browser", + "js/release", + "LICENSE" + ], + "homepage": "https://github.com/petkaantonov/bluebird", + "keywords": [ + "promise", + "performance", + "promises", + "promises-a", + "promises-aplus", + "async", + "await", + "deferred", + "deferreds", + "future", + "flow control", + "dsl", + "fluent interface" + ], + "license": "MIT", + "main": "./js/release/bluebird.js", + "name": "bluebird", + "repository": { + "type": "git", + "url": "git://github.com/petkaantonov/bluebird.git" + }, + "scripts": { + "generate-browser-core": "node tools/build.js --features=core --no-debug --release --zalgo --browser --minify && mv js/browser/bluebird.js js/browser/bluebird.core.js && mv js/browser/bluebird.min.js js/browser/bluebird.core.min.js", + "generate-browser-full": "node tools/build.js --no-clean --no-debug --release --browser --minify", + "istanbul": "istanbul", + "lint": "node scripts/jshint.js", + "prepublish": "npm run generate-browser-core && npm run generate-browser-full", + "test": "node --expose-gc tools/test.js" + }, + "version": "3.7.2", + "webpack": "./js/release/bluebird.js" +} diff --git a/node_modules/body-parser/HISTORY.md b/node_modules/body-parser/HISTORY.md new file mode 100644 index 0000000..a1d3fbf --- /dev/null +++ b/node_modules/body-parser/HISTORY.md @@ -0,0 +1,609 @@ +1.19.0 / 2019-04-25 +=================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + * deps: qs@6.7.0 + - Fix parsing array brackets after index + * deps: raw-body@2.4.0 + - deps: bytes@3.1.0 + - deps: http-errors@1.7.2 + - deps: iconv-lite@0.4.24 + * deps: type-is@~1.6.17 + - deps: mime-types@~2.1.24 + - perf: prevent internal `throw` on invalid type + +1.18.3 / 2018-05-14 +=================== + + * Fix stack trace for strict json parse error + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: http-errors@~1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + * deps: qs@6.5.2 + * deps: raw-body@2.3.3 + - deps: http-errors@1.6.3 + - deps: iconv-lite@0.4.23 + * deps: type-is@~1.6.16 + - deps: mime-types@~2.1.18 + +1.18.2 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: remove argument reassignment + +1.18.1 / 2017-09-12 +=================== + + * deps: content-type@~1.0.4 + - perf: remove argument reassignment + - perf: skip parameter parsing when no parameters + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + * deps: qs@6.5.1 + - Fix parsing & compacting very deep objects + * deps: raw-body@2.3.2 + - deps: iconv-lite@0.4.19 + +1.18.0 / 2017-09-08 +=================== + + * Fix JSON strict violation error to match native parse error + * Include the `body` property on verify errors + * Include the `type` property on all generated errors + * Use `http-errors` to set status code on errors + * deps: bytes@3.0.0 + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + * deps: qs@6.5.0 + * deps: raw-body@2.3.1 + - Use `http-errors` for standard emitted errors + - deps: bytes@3.0.0 + - deps: iconv-lite@0.4.18 + - perf: skip buffer decoding on overage chunk + * perf: prevent internal `throw` when missing charset + +1.17.2 / 2017-05-17 +=================== + + * deps: debug@2.6.7 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@2.0.0 + * deps: type-is@~1.6.15 + - deps: mime-types@~2.1.15 + +1.17.1 / 2017-03-06 +=================== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + +1.17.0 / 2017-03-01 +=================== + + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + * deps: qs@6.3.1 + - Fix compacting nested arrays + +1.16.1 / 2017-02-10 +=================== + + * deps: debug@2.6.1 + - Fix deprecation messages in WebStorm and other editors + - Undeprecate `DEBUG_FD` set to `1` or `2` + +1.16.0 / 2017-01-17 +=================== + + * deps: debug@2.6.0 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + * deps: qs@6.2.1 + - Fix array parsing from skipping empty values + * deps: raw-body@~2.2.0 + - deps: iconv-lite@0.4.15 + * deps: type-is@~1.6.14 + - deps: mime-types@~2.1.13 + +1.15.2 / 2016-06-19 +=================== + + * deps: bytes@2.4.0 + * deps: content-type@~1.0.2 + - perf: enable strict mode + * deps: http-errors@~1.5.0 + - Use `setprototypeof` module to replace `__proto__` setting + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: qs@6.2.0 + * deps: raw-body@~2.1.7 + - deps: bytes@2.4.0 + - perf: remove double-cleanup on happy path + * deps: type-is@~1.6.13 + - deps: mime-types@~2.1.11 + +1.15.1 / 2016-05-05 +=================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + * deps: raw-body@~2.1.6 + - deps: bytes@2.3.0 + * deps: type-is@~1.6.12 + - deps: mime-types@~2.1.10 + +1.15.0 / 2016-02-10 +=================== + + * deps: http-errors@~1.4.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.2.1 < 2' + * deps: qs@6.1.0 + * deps: type-is@~1.6.11 + - deps: mime-types@~2.1.9 + +1.14.2 / 2015-12-16 +=================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + * deps: qs@5.2.0 + * deps: raw-body@~2.1.5 + - deps: bytes@2.2.0 + - deps: iconv-lite@0.4.13 + * deps: type-is@~1.6.10 + - deps: mime-types@~2.1.8 + +1.14.1 / 2015-09-27 +=================== + + * Fix issue where invalid charset results in 400 when `verify` used + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + * deps: raw-body@~2.1.4 + - Fix masking critical errors from `iconv-lite` + - deps: iconv-lite@0.4.12 + * deps: type-is@~1.6.9 + - deps: mime-types@~2.1.7 + +1.14.0 / 2015-09-16 +=================== + + * Fix JSON strict parse error to match syntax errors + * Provide static `require` analysis in `urlencoded` parser + * deps: depd@~1.1.0 + - Support web browser loading + * deps: qs@5.1.0 + * deps: raw-body@~2.1.3 + - Fix sync callback when attaching data listener causes sync read + * deps: type-is@~1.6.8 + - Fix type error when given invalid type to match against + - deps: mime-types@~2.1.6 + +1.13.3 / 2015-07-31 +=================== + + * deps: type-is@~1.6.6 + - deps: mime-types@~2.1.4 + +1.13.2 / 2015-07-05 +=================== + + * deps: iconv-lite@0.4.11 + * deps: qs@4.0.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix user-visible incompatibilities from 3.1.0 + - Fix various parsing edge cases + * deps: raw-body@~2.1.2 + - Fix error stack traces to skip `makeError` + - deps: iconv-lite@0.4.11 + * deps: type-is@~1.6.4 + - deps: mime-types@~2.1.2 + - perf: enable strict mode + - perf: remove argument reassignment + +1.13.1 / 2015-06-16 +=================== + + * deps: qs@2.4.2 + - Downgraded from 3.1.0 because of user-visible incompatibilities + +1.13.0 / 2015-06-14 +=================== + + * Add `statusCode` property on `Error`s, in addition to `status` + * Change `type` default to `application/json` for JSON parser + * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser + * Provide static `require` analysis + * Use the `http-errors` module to generate errors + * deps: bytes@2.1.0 + - Slight optimizations + * deps: iconv-lite@0.4.10 + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + - Leading BOM is now removed when decoding + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * deps: qs@3.1.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix various parsing edge cases + - Parsed object now has `null` prototype + * deps: raw-body@~2.1.1 + - Use `unpipe` module for unpiping requests + - deps: iconv-lite@0.4.10 + * deps: type-is@~1.6.3 + - deps: mime-types@~2.1.1 + - perf: reduce try block size + - perf: remove bitwise operations + * perf: enable strict mode + * perf: remove argument reassignment + * perf: remove delete call + +1.12.4 / 2015-05-10 +=================== + + * deps: debug@~2.2.0 + * deps: qs@2.4.2 + - Fix allowing parameters like `constructor` + * deps: on-finished@~2.2.1 + * deps: raw-body@~2.0.1 + - Fix a false-positive when unpiping in Node.js 0.8 + - deps: bytes@2.0.1 + * deps: type-is@~1.6.2 + - deps: mime-types@~2.0.11 + +1.12.3 / 2015-04-15 +=================== + + * Slight efficiency improvement when not debugging + * deps: depd@~1.0.1 + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + * deps: raw-body@1.3.4 + - Fix hanging callback if request aborts during read + - deps: iconv-lite@0.4.8 + +1.12.2 / 2015-03-16 +=================== + + * deps: qs@2.4.1 + - Fix error when parameter `hasOwnProperty` is present + +1.12.1 / 2015-03-15 +=================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: type-is@~1.6.1 + - deps: mime-types@~2.0.10 + +1.12.0 / 2015-02-13 +=================== + + * add `debug` messages + * accept a function for the `type` option + * use `content-type` to parse `Content-Type` headers + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + * deps: raw-body@1.3.3 + - deps: iconv-lite@0.4.7 + * deps: type-is@~1.6.0 + - fix argument reassignment + - fix false-positives in `hasBody` `Transfer-Encoding` check + - support wildcard for both type and subtype (`*/*`) + - deps: mime-types@~2.0.9 + +1.11.0 / 2015-01-30 +=================== + + * make internal `extended: true` depth limit infinity + * deps: type-is@~1.5.6 + - deps: mime-types@~2.0.8 + +1.10.2 / 2015-01-20 +=================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + * deps: raw-body@1.3.2 + - deps: iconv-lite@0.4.6 + +1.10.1 / 2015-01-01 +=================== + + * deps: on-finished@~2.2.0 + * deps: type-is@~1.5.5 + - deps: mime-types@~2.0.7 + +1.10.0 / 2014-12-02 +=================== + + * make internal `extended: true` array limit dynamic + +1.9.3 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + * deps: qs@2.3.3 + - Fix `arrayLimit` behavior + * deps: raw-body@1.3.1 + - deps: iconv-lite@0.4.5 + * deps: type-is@~1.5.3 + - deps: mime-types@~2.0.3 + +1.9.2 / 2014-10-27 +================== + + * deps: qs@2.3.2 + - Fix parsing of mixed objects and values + +1.9.1 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + * deps: qs@2.3.0 + - Fix parsing of mixed implicit and explicit arrays + * deps: type-is@~1.5.2 + - deps: mime-types@~2.0.2 + +1.9.0 / 2014-09-24 +================== + + * include the charset in "unsupported charset" error message + * include the encoding in "unsupported content encoding" error message + * deps: depd@~1.0.0 + +1.8.4 / 2014-09-23 +================== + + * fix content encoding to be case-insensitive + +1.8.3 / 2014-09-19 +================== + + * deps: qs@2.2.4 + - Fix issue with object keys starting with numbers truncated + +1.8.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + +1.8.1 / 2014-09-07 +================== + + * deps: media-typer@0.3.0 + * deps: type-is@~1.5.1 + +1.8.0 / 2014-09-05 +================== + + * make empty-body-handling consistent between chunked requests + - empty `json` produces `{}` + - empty `raw` produces `new Buffer(0)` + - empty `text` produces `''` + - empty `urlencoded` produces `{}` + * deps: qs@2.2.3 + - Fix issue where first empty value in array is discarded + * deps: type-is@~1.5.0 + - fix `hasbody` to be true for `content-length: 0` + +1.7.0 / 2014-09-01 +================== + + * add `parameterLimit` option to `urlencoded` parser + * change `urlencoded` extended array limit to 100 + * respond with 413 when over `parameterLimit` in `urlencoded` + +1.6.7 / 2014-08-29 +================== + + * deps: qs@2.2.2 + - Remove unnecessary cloning + +1.6.6 / 2014-08-27 +================== + + * deps: qs@2.2.0 + - Array parsing fix + - Performance improvements + +1.6.5 / 2014-08-16 +================== + + * deps: on-finished@2.1.0 + +1.6.4 / 2014-08-14 +================== + + * deps: qs@1.2.2 + +1.6.3 / 2014-08-10 +================== + + * deps: qs@1.2.1 + +1.6.2 / 2014-08-07 +================== + + * deps: qs@1.2.0 + - Fix parsing array of objects + +1.6.1 / 2014-08-06 +================== + + * deps: qs@1.1.0 + - Accept urlencoded square brackets + - Accept empty values in implicit array notation + +1.6.0 / 2014-08-05 +================== + + * deps: qs@1.0.2 + - Complete rewrite + - Limits array length to 20 + - Limits object depth to 5 + - Limits parameters to 1,000 + +1.5.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +1.5.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +1.5.0 / 2014-07-20 +================== + + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + * deps: raw-body@1.3.0 + - deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + - Fix `Cannot switch to old mode now` error on Node.js 0.10+ + * deps: type-is@~1.3.2 + +1.4.3 / 2014-06-19 +================== + + * deps: type-is@1.3.1 + - fix global variable leak + +1.4.2 / 2014-06-19 +================== + + * deps: type-is@1.3.0 + - improve type parsing + +1.4.1 / 2014-06-19 +================== + + * fix urlencoded extended deprecation message + +1.4.0 / 2014-06-19 +================== + + * add `text` parser + * add `raw` parser + * check accepted charset in content-type (accepts utf-8) + * check accepted encoding in content-encoding (accepts identity) + * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed + * deprecate `urlencoded()` without provided `extended` option + * lazy-load urlencoded parsers + * parsers split into files for reduced mem usage + * support gzip and deflate bodies + - set `inflate: false` to turn off + * deps: raw-body@1.2.2 + - Support all encodings from `iconv-lite` + +1.3.1 / 2014-06-11 +================== + + * deps: type-is@1.2.1 + - Switch dependency from mime to mime-types@1.0.0 + +1.3.0 / 2014-05-31 +================== + + * add `extended` option to urlencoded parser + +1.2.2 / 2014-05-27 +================== + + * deps: raw-body@1.1.6 + - assert stream encoding on node.js 0.8 + - assert stream encoding on node.js < 0.10.6 + - deps: bytes@1 + +1.2.1 / 2014-05-26 +================== + + * invoke `next(err)` after request fully read + - prevents hung responses and socket hang ups + +1.2.0 / 2014-05-11 +================== + + * add `verify` option + * deps: type-is@1.2.0 + - support suffix matching + +1.1.2 / 2014-05-11 +================== + + * improve json parser speed + +1.1.1 / 2014-05-11 +================== + + * fix repeated limit parsing with every request + +1.1.0 / 2014-05-10 +================== + + * add `type` option + * deps: pin for safety and consistency + +1.0.2 / 2014-04-14 +================== + + * use `type-is` module + +1.0.1 / 2014-03-20 +================== + + * lower default limits to 100kb diff --git a/node_modules/body-parser/LICENSE b/node_modules/body-parser/LICENSE new file mode 100644 index 0000000..386b7b6 --- /dev/null +++ b/node_modules/body-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/body-parser/README.md b/node_modules/body-parser/README.md new file mode 100644 index 0000000..aba6297 --- /dev/null +++ b/node_modules/body-parser/README.md @@ -0,0 +1,443 @@ +# body-parser + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Node.js body parsing middleware. + +Parse incoming request bodies in a middleware before your handlers, available +under the `req.body` property. + +**Note** As `req.body`'s shape is based on user-controlled input, all +properties and values in this object are untrusted and should be validated +before trusting. For example, `req.body.foo.toString()` may fail in multiple +ways, for example the `foo` property may not be there or may not be a string, +and `toString` may not be a function and instead a string or other user input. + +[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). + +_This does not handle multipart bodies_, due to their complex and typically +large nature. For multipart bodies, you may be interested in the following +modules: + + * [busboy](https://www.npmjs.org/package/busboy#readme) and + [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) + * [multiparty](https://www.npmjs.org/package/multiparty#readme) and + [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) + * [formidable](https://www.npmjs.org/package/formidable#readme) + * [multer](https://www.npmjs.org/package/multer#readme) + +This module provides the following parsers: + + * [JSON body parser](#bodyparserjsonoptions) + * [Raw body parser](#bodyparserrawoptions) + * [Text body parser](#bodyparsertextoptions) + * [URL-encoded form body parser](#bodyparserurlencodedoptions) + +Other body parsers you might be interested in: + +- [body](https://www.npmjs.org/package/body#readme) +- [co-body](https://www.npmjs.org/package/co-body#readme) + +## Installation + +```sh +$ npm install body-parser +``` + +## API + + + +```js +var bodyParser = require('body-parser') +``` + +The `bodyParser` object exposes various factories to create middlewares. All +middlewares will populate the `req.body` property with the parsed body when +the `Content-Type` request header matches the `type` option, or an empty +object (`{}`) if there was no body to parse, the `Content-Type` was not matched, +or an error occurred. + +The various errors returned by this module are described in the +[errors section](#errors). + +### bodyParser.json([options]) + +Returns middleware that only parses `json` and only looks at requests where +the `Content-Type` header matches the `type` option. This parser accepts any +Unicode encoding of the body and supports automatic inflation of `gzip` and +`deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). + +#### Options + +The `json` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### reviver + +The `reviver` option is passed directly to `JSON.parse` as the second +argument. You can find more information on this argument +[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). + +##### strict + +When set to `true`, will only accept arrays and objects; when `false` will +accept anything `JSON.parse` accepts. Defaults to `true`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not a +function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `json`), a mime type (like `application/json`), or +a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a truthy +value. Defaults to `application/json`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.raw([options]) + +Returns middleware that parses all bodies as a `Buffer` and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a `Buffer` object +of the body. + +#### Options + +The `raw` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. +If not a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this +can be an extension name (like `bin`), a mime type (like +`application/octet-stream`), or a mime type with a wildcard (like `*/*` or +`application/*`). If a function, the `type` option is called as `fn(req)` +and the request is parsed if it returns a truthy value. Defaults to +`application/octet-stream`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.text([options]) + +Returns middleware that parses all bodies as a string and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` string containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a string of the +body. + +#### Options + +The `text` function takes an optional `options` object that may contain any of +the following keys: + +##### defaultCharset + +Specify the default character set for the text content if the charset is not +specified in the `Content-Type` header of the request. Defaults to `utf-8`. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `txt`), a mime type (like `text/plain`), or a mime +type with a wildcard (like `*/*` or `text/*`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a +truthy value. Defaults to `text/plain`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.urlencoded([options]) + +Returns middleware that only parses `urlencoded` bodies and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser accepts only UTF-8 encoding of the body and supports automatic +inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This object will contain +key-value pairs, where the value can be a string or array (when `extended` is +`false`), or any type (when `extended` is `true`). + +#### Options + +The `urlencoded` function takes an optional `options` object that may contain +any of the following keys: + +##### extended + +The `extended` option allows to choose between parsing the URL-encoded data +with the `querystring` library (when `false`) or the `qs` library (when +`true`). The "extended" syntax allows for rich objects and arrays to be +encoded into the URL-encoded format, allowing for a JSON-like experience +with URL-encoded. For more information, please +[see the qs library](https://www.npmjs.org/package/qs#readme). + +Defaults to `true`, but using the default has been deprecated. Please +research into the difference between `qs` and `querystring` and choose the +appropriate setting. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### parameterLimit + +The `parameterLimit` option controls the maximum number of parameters that +are allowed in the URL-encoded data. If a request contains more parameters +than this value, a 413 will be returned to the client. Defaults to `1000`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `urlencoded`), a mime type (like +`application/x-www-form-urlencoded`), or a mime type with a wildcard (like +`*/x-www-form-urlencoded`). If a function, the `type` option is called as +`fn(req)` and the request is parsed if it returns a truthy value. Defaults +to `application/x-www-form-urlencoded`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +## Errors + +The middlewares provided by this module create errors depending on the error +condition during parsing. The errors will typically have a `status`/`statusCode` +property that contains the suggested HTTP response code, an `expose` property +to determine if the `message` property should be displayed to the client, a +`type` property to determine the type of error without matching against the +`message`, and a `body` property containing the read body, if available. + +The following are the common errors emitted, though any error can come through +for various reasons. + +### content encoding unsupported + +This error will occur when the request had a `Content-Encoding` header that +contained an encoding but the "inflation" option was set to `false`. The +`status` property is set to `415`, the `type` property is set to +`'encoding.unsupported'`, and the `charset` property will be set to the +encoding that is unsupported. + +### request aborted + +This error will occur when the request is aborted by the client before reading +the body has finished. The `received` property will be set to the number of +bytes received before the request was aborted and the `expected` property is +set to the number of expected bytes. The `status` property is set to `400` +and `type` property is set to `'request.aborted'`. + +### request entity too large + +This error will occur when the request body's size is larger than the "limit" +option. The `limit` property will be set to the byte limit and the `length` +property will be set to the request body's length. The `status` property is +set to `413` and the `type` property is set to `'entity.too.large'`. + +### request size did not match content length + +This error will occur when the request's length did not match the length from +the `Content-Length` header. This typically occurs when the request is malformed, +typically when the `Content-Length` header was calculated based on characters +instead of bytes. The `status` property is set to `400` and the `type` property +is set to `'request.size.invalid'`. + +### stream encoding should not be set + +This error will occur when something called the `req.setEncoding` method prior +to this middleware. This module operates directly on bytes only and you cannot +call `req.setEncoding` when using this module. The `status` property is set to +`500` and the `type` property is set to `'stream.encoding.set'`. + +### too many parameters + +This error will occur when the content of the request exceeds the configured +`parameterLimit` for the `urlencoded` parser. The `status` property is set to +`413` and the `type` property is set to `'parameters.too.many'`. + +### unsupported charset "BOGUS" + +This error will occur when the request had a charset parameter in the +`Content-Type` header, but the `iconv-lite` module does not support it OR the +parser does not support it. The charset is contained in the message as well +as in the `charset` property. The `status` property is set to `415`, the +`type` property is set to `'charset.unsupported'`, and the `charset` property +is set to the charset that is unsupported. + +### unsupported content encoding "bogus" + +This error will occur when the request had a `Content-Encoding` header that +contained an unsupported encoding. The encoding is contained in the message +as well as in the `encoding` property. The `status` property is set to `415`, +the `type` property is set to `'encoding.unsupported'`, and the `encoding` +property is set to the encoding that is unsupported. + +## Examples + +### Express/Connect top-level generic + +This example demonstrates adding a generic JSON and URL-encoded parser as a +top-level middleware, which will parse the bodies of all incoming requests. +This is the simplest setup. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ extended: false })) + +// parse application/json +app.use(bodyParser.json()) + +app.use(function (req, res) { + res.setHeader('Content-Type', 'text/plain') + res.write('you posted:\n') + res.end(JSON.stringify(req.body, null, 2)) +}) +``` + +### Express route-specific + +This example demonstrates adding body parsers specifically to the routes that +need them. In general, this is the most recommended way to use body-parser with +Express. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// create application/json parser +var jsonParser = bodyParser.json() + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ extended: false }) + +// POST /login gets urlencoded bodies +app.post('/login', urlencodedParser, function (req, res) { + res.send('welcome, ' + req.body.username) +}) + +// POST /api/users gets JSON bodies +app.post('/api/users', jsonParser, function (req, res) { + // create user in req.body +}) +``` + +### Change accepted type for parsers + +All the parsers accept a `type` option which allows you to change the +`Content-Type` that the middleware will parse. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse various different custom JSON types as JSON +app.use(bodyParser.json({ type: 'application/*+json' })) + +// parse some custom thing into a Buffer +app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) + +// parse an HTML body into a string +app.use(bodyParser.text({ type: 'text/html' })) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/body-parser.svg +[npm-url]: https://npmjs.org/package/body-parser +[travis-image]: https://img.shields.io/travis/expressjs/body-parser/master.svg +[travis-url]: https://travis-ci.org/expressjs/body-parser +[coveralls-image]: https://img.shields.io/coveralls/expressjs/body-parser/master.svg +[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master +[downloads-image]: https://img.shields.io/npm/dm/body-parser.svg +[downloads-url]: https://npmjs.org/package/body-parser diff --git a/node_modules/body-parser/index.js b/node_modules/body-parser/index.js new file mode 100644 index 0000000..93c3a1f --- /dev/null +++ b/node_modules/body-parser/index.js @@ -0,0 +1,157 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('body-parser') + +/** + * Cache of loaded parsers. + * @private + */ + +var parsers = Object.create(null) + +/** + * @typedef Parsers + * @type {function} + * @property {function} json + * @property {function} raw + * @property {function} text + * @property {function} urlencoded + */ + +/** + * Module exports. + * @type {Parsers} + */ + +exports = module.exports = deprecate.function(bodyParser, + 'bodyParser: use individual json/urlencoded middlewares') + +/** + * JSON parser. + * @public + */ + +Object.defineProperty(exports, 'json', { + configurable: true, + enumerable: true, + get: createParserGetter('json') +}) + +/** + * Raw parser. + * @public + */ + +Object.defineProperty(exports, 'raw', { + configurable: true, + enumerable: true, + get: createParserGetter('raw') +}) + +/** + * Text parser. + * @public + */ + +Object.defineProperty(exports, 'text', { + configurable: true, + enumerable: true, + get: createParserGetter('text') +}) + +/** + * URL-encoded parser. + * @public + */ + +Object.defineProperty(exports, 'urlencoded', { + configurable: true, + enumerable: true, + get: createParserGetter('urlencoded') +}) + +/** + * Create a middleware to parse json and urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @deprecated + * @public + */ + +function bodyParser (options) { + var opts = {} + + // exclude type option + if (options) { + for (var prop in options) { + if (prop !== 'type') { + opts[prop] = options[prop] + } + } + } + + var _urlencoded = exports.urlencoded(opts) + var _json = exports.json(opts) + + return function bodyParser (req, res, next) { + _json(req, res, function (err) { + if (err) return next(err) + _urlencoded(req, res, next) + }) + } +} + +/** + * Create a getter for loading a parser. + * @private + */ + +function createParserGetter (name) { + return function get () { + return loadParser(name) + } +} + +/** + * Load a parser module. + * @private + */ + +function loadParser (parserName) { + var parser = parsers[parserName] + + if (parser !== undefined) { + return parser + } + + // this uses a switch for static require analysis + switch (parserName) { + case 'json': + parser = require('./lib/types/json') + break + case 'raw': + parser = require('./lib/types/raw') + break + case 'text': + parser = require('./lib/types/text') + break + case 'urlencoded': + parser = require('./lib/types/urlencoded') + break + } + + // store to prevent invoking require() + return (parsers[parserName] = parser) +} diff --git a/node_modules/body-parser/lib/read.js b/node_modules/body-parser/lib/read.js new file mode 100644 index 0000000..c102609 --- /dev/null +++ b/node_modules/body-parser/lib/read.js @@ -0,0 +1,181 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var getBody = require('raw-body') +var iconv = require('iconv-lite') +var onFinished = require('on-finished') +var zlib = require('zlib') + +/** + * Module exports. + */ + +module.exports = read + +/** + * Read a request into a buffer and parse. + * + * @param {object} req + * @param {object} res + * @param {function} next + * @param {function} parse + * @param {function} debug + * @param {object} options + * @private + */ + +function read (req, res, next, parse, debug, options) { + var length + var opts = options + var stream + + // flag as parsed + req._body = true + + // read options + var encoding = opts.encoding !== null + ? opts.encoding + : null + var verify = opts.verify + + try { + // get the content stream + stream = contentstream(req, debug, opts.inflate) + length = stream.length + stream.length = undefined + } catch (err) { + return next(err) + } + + // set raw-body options + opts.length = length + opts.encoding = verify + ? null + : encoding + + // assert charset is supported + if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { + return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + })) + } + + // read body + debug('read body') + getBody(stream, opts, function (error, body) { + if (error) { + var _error + + if (error.type === 'encoding.unsupported') { + // echo back charset + _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + }) + } else { + // set status code on error + _error = createError(400, error) + } + + // read off entire request + stream.resume() + onFinished(req, function onfinished () { + next(createError(400, _error)) + }) + return + } + + // verify + if (verify) { + try { + debug('verify body') + verify(req, res, body, encoding) + } catch (err) { + next(createError(403, err, { + body: body, + type: err.type || 'entity.verify.failed' + })) + return + } + } + + // parse + var str = body + try { + debug('parse body') + str = typeof body !== 'string' && encoding !== null + ? iconv.decode(body, encoding) + : body + req.body = parse(str) + } catch (err) { + next(createError(400, err, { + body: str, + type: err.type || 'entity.parse.failed' + })) + return + } + + next() + }) +} + +/** + * Get the content stream of the request. + * + * @param {object} req + * @param {function} debug + * @param {boolean} [inflate=true] + * @return {object} + * @api private + */ + +function contentstream (req, debug, inflate) { + var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() + var length = req.headers['content-length'] + var stream + + debug('content-encoding "%s"', encoding) + + if (inflate === false && encoding !== 'identity') { + throw createError(415, 'content encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + switch (encoding) { + case 'deflate': + stream = zlib.createInflate() + debug('inflate body') + req.pipe(stream) + break + case 'gzip': + stream = zlib.createGunzip() + debug('gunzip body') + req.pipe(stream) + break + case 'identity': + stream = req + stream.length = length + break + default: + throw createError(415, 'unsupported content encoding "' + encoding + '"', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + return stream +} diff --git a/node_modules/body-parser/lib/types/json.js b/node_modules/body-parser/lib/types/json.js new file mode 100644 index 0000000..2971dc1 --- /dev/null +++ b/node_modules/body-parser/lib/types/json.js @@ -0,0 +1,230 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:json') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = json + +/** + * RegExp to match the first non-space in a string. + * + * Allowed whitespace is defined in RFC 7159: + * + * ws = *( + * %x20 / ; Space + * %x09 / ; Horizontal tab + * %x0A / ; Line feed or New line + * %x0D ) ; Carriage return + */ + +var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*(.)/ // eslint-disable-line no-control-regex + +/** + * Create a middleware to parse JSON bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function json (options) { + var opts = options || {} + + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var inflate = opts.inflate !== false + var reviver = opts.reviver + var strict = opts.strict !== false + var type = opts.type || 'application/json' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + if (body.length === 0) { + // special-case empty json body, as it's a common client-side mistake + // TODO: maybe make this configurable or part of "strict" option + return {} + } + + if (strict) { + var first = firstchar(body) + + if (first !== '{' && first !== '[') { + debug('strict violation') + throw createStrictSyntaxError(body, first) + } + } + + try { + debug('parse json') + return JSON.parse(body, reviver) + } catch (e) { + throw normalizeJsonSyntaxError(e, { + message: e.message, + stack: e.stack + }) + } + } + + return function jsonParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset per RFC 7159 sec 8.1 + var charset = getCharset(req) || 'utf-8' + if (charset.substr(0, 4) !== 'utf-') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Create strict violation syntax error matching native error. + * + * @param {string} str + * @param {string} char + * @return {Error} + * @private + */ + +function createStrictSyntaxError (str, char) { + var index = str.indexOf(char) + var partial = str.substring(0, index) + '#' + + try { + JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') + } catch (e) { + return normalizeJsonSyntaxError(e, { + message: e.message.replace('#', char), + stack: e.stack + }) + } +} + +/** + * Get the first non-whitespace character in a string. + * + * @param {string} str + * @return {function} + * @private + */ + +function firstchar (str) { + return FIRST_CHAR_REGEXP.exec(str)[1] +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Normalize a SyntaxError for JSON.parse. + * + * @param {SyntaxError} error + * @param {object} obj + * @return {SyntaxError} + */ + +function normalizeJsonSyntaxError (error, obj) { + var keys = Object.getOwnPropertyNames(error) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + if (key !== 'stack' && key !== 'message') { + delete error[key] + } + } + + // replace stack before message for Node.js 0.10 and below + error.stack = obj.stack.replace(error.message, obj.message) + error.message = obj.message + + return error +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/lib/types/raw.js b/node_modules/body-parser/lib/types/raw.js new file mode 100644 index 0000000..f5d1b67 --- /dev/null +++ b/node_modules/body-parser/lib/types/raw.js @@ -0,0 +1,101 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var debug = require('debug')('body-parser:raw') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = raw + +/** + * Create a middleware to parse raw bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function raw (options) { + var opts = options || {} + + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/octet-stream' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function rawParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // read + read(req, res, next, parse, debug, { + encoding: null, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/lib/types/text.js b/node_modules/body-parser/lib/types/text.js new file mode 100644 index 0000000..083a009 --- /dev/null +++ b/node_modules/body-parser/lib/types/text.js @@ -0,0 +1,121 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var debug = require('debug')('body-parser:text') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = text + +/** + * Create a middleware to parse text bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function text (options) { + var opts = options || {} + + var defaultCharset = opts.defaultCharset || 'utf-8' + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'text/plain' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function textParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // get charset + var charset = getCharset(req) || defaultCharset + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/lib/types/urlencoded.js b/node_modules/body-parser/lib/types/urlencoded.js new file mode 100644 index 0000000..b2ca8f1 --- /dev/null +++ b/node_modules/body-parser/lib/types/urlencoded.js @@ -0,0 +1,284 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:urlencoded') +var deprecate = require('depd')('body-parser') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = urlencoded + +/** + * Cache of parser modules. + */ + +var parsers = Object.create(null) + +/** + * Create a middleware to parse urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function urlencoded (options) { + var opts = options || {} + + // notice because option default will flip in next major + if (opts.extended === undefined) { + deprecate('undefined extended: provide extended option') + } + + var extended = opts.extended !== false + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/x-www-form-urlencoded' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate query parser + var queryparse = extended + ? extendedparser(opts) + : simpleparser(opts) + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + return body.length + ? queryparse(body) + : {} + } + + return function urlencodedParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset + var charset = getCharset(req) || 'utf-8' + if (charset !== 'utf-8') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + debug: debug, + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the extended query parser. + * + * @param {object} options + */ + +function extendedparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('qs') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + var arrayLimit = Math.max(100, paramCount) + + debug('parse extended urlencoding') + return parse(body, { + allowPrototypes: true, + arrayLimit: arrayLimit, + depth: Infinity, + parameterLimit: parameterLimit + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Count the number of parameters, stopping once limit reached + * + * @param {string} body + * @param {number} limit + * @api private + */ + +function parameterCount (body, limit) { + var count = 0 + var index = 0 + + while ((index = body.indexOf('&', index)) !== -1) { + count++ + index++ + + if (count === limit) { + return undefined + } + } + + return count +} + +/** + * Get parser for module name dynamically. + * + * @param {string} name + * @return {function} + * @api private + */ + +function parser (name) { + var mod = parsers[name] + + if (mod !== undefined) { + return mod.parse + } + + // this uses a switch for static require analysis + switch (name) { + case 'qs': + mod = require('qs') + break + case 'querystring': + mod = require('querystring') + break + } + + // store to prevent invoking require() + parsers[name] = mod + + return mod.parse +} + +/** + * Get the simple query parser. + * + * @param {object} options + */ + +function simpleparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('querystring') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + debug('parse urlencoding') + return parse(body, undefined, undefined, { maxKeys: parameterLimit }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/package.json b/node_modules/body-parser/package.json new file mode 100644 index 0000000..52bafc9 --- /dev/null +++ b/node_modules/body-parser/package.json @@ -0,0 +1,94 @@ +{ + "_args": [ + [ + "body-parser@1.19.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "body-parser@1.19.0", + "_id": "body-parser@1.19.0", + "_inBundle": false, + "_integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "_location": "/body-parser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "body-parser@1.19.0", + "name": "body-parser", + "escapedName": "body-parser", + "rawSpec": "1.19.0", + "saveSpec": null, + "fetchSpec": "1.19.0" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "_spec": "1.19.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/expressjs/body-parser/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "description": "Node.js body parsing middleware", + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "methods": "1.1.2", + "mocha": "6.1.4", + "safe-buffer": "5.1.2", + "supertest": "4.0.2" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "lib/", + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/expressjs/body-parser#readme", + "license": "MIT", + "name": "body-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/expressjs/body-parser.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/" + }, + "version": "1.19.0" +} diff --git a/node_modules/bowser/CHANGELOG.md b/node_modules/bowser/CHANGELOG.md new file mode 100644 index 0000000..6dbfffc --- /dev/null +++ b/node_modules/bowser/CHANGELOG.md @@ -0,0 +1,208 @@ +# Bowser Changelog + +### 2.9.0 (Jan 28, 2020) +- [ADD] Export more methods and constants via .d.ts [#388], [#390] + +### 2.8.1 (Dec 26, 2019) +- [FIX] Reverted [#382] as it broke build + +### 2.8.0 (Dec 26, 2019) +- [ADD] Add polyfills for Array.find & Object.assign [#383] +- [ADD] Export constants with types.d.ts [#382] +- [FIX] Add support for WeChat on Windows [#381] +- [FIX] Fix detection of Firefox on iPad [#379] +- [FIX] Add detection of Electron [#375] +- [FIX] Updated dev-dependencies + +### 2.7.0 (Oct 2, 2019) +- [FIX] Add support for QQ Browser [#362] +- [FIX] Add support for GSA [#364] +- [FIX] Updated dependencies + +### 2.6.0 (Sep 6, 2019) +- [ADD] Define "module" export in package.json [#354] +- [FIX] Fix Tablet PC detection [#334] + +### 2.5.4 (Sep 2, 2019) +- [FIX] Exclude docs from the npm package [#349] + +### 2.5.3 (Aug 4, 2019) +- [FIX] Add MacOS names support [#338] +- [FIX] Point typings.d.ts from package.json [#341] +- [FIX] Upgrade dependencies + +### 2.5.2 (July 17, 2019) +- [FIX] Fixes the bug undefined method because of failed build (#335) + +### 2.5.1 (July 17, 2019) +- [FIX] Fixes the bug with a custom Error class (#335) +- [FIX] Fixes the settings for Babel to reduce the bundle size (#259) + +### 2.5.0 (July 16, 2019) +- [ADD] Add constant output so that users can quickly get all types (#325) +- [FIX] Add support for Roku OS (#332) +- [FIX] Update devDependencies +- [FIX] Fix docs, README and added funding information + +### 2.4.0 (May 3, 2019) +- [FIX] Update regexp for generic browsers (#310) +- [FIX] Fix issues with module.exports (#318) +- [FIX] Update devDependencies (#316, #321, #322) +- [FIX] Fix docs (#320) + +### 2.3.0 (April 14, 2019) +- [ADD] Add support for Blink-based MS Edge (#311) +- [ADD] Add more types for TS (#289) +- [FIX] Update dev-dependencies +- [FIX] Update docs + +### 2.2.1 (April 12, 2019) +- [ADD] Add an alias for Samsung Internet +- [FIX] Fix browser name detection for browsers without an alias (#313) + +### 2.2.0 (April 7, 2019) +- [ADD] Add short aliases for browser names (#295) +- [FIX] Fix Yandex Browser version detection (#308) + +### 2.1.2 (March 6, 2019) +- [FIX] Fix buggy `getFirstMatch` reference + +### 2.1.1 (March 6, 2019) +- [ADD] Add detection of PlayStation 4 (#291) +- [ADD] Deploy docs on GH Pages (#293) +- [FIX] Fix files extensions for importing (#294) +- [FIX] Fix docs (#295) + +### 2.1.0 (January 24, 2019) +- [ADD] Add new `Parser.getEngineName()` method (#288) +- [ADD] Add detection of ChromeOS (#287) +- [FIX] Fix README + +### 2.0.0 (January 19, 2019) +- [ADD] Support a non strict equality in `Parser.satisfies()` (#275) +- [ADD] Add Android versions names (#276) +- [ADD] Add a typings file (#277) +- [ADD] Added support for Googlebot recognition (#278) +- [FIX] Update building tools, avoid security issues + +### 2.0.0-beta.3 (September 15, 2018) +- [FIX] Fix Chrome Mobile detection (#253) +- [FIX] Use built bowser for CI (#252) +- [FIX] Update babel-plugin-add-module-exports (#251) + +### 2.0.0-beta.2 (September 9, 2018) +- [FIX] Fix failing comparing version through `Parser.satisfies` (#243) +- [FIX] Fix travis testing, include eslint into CI testing +- [FIX] Add support for Maxthon desktop browser (#246) +- [FIX] Add support for Swing browser (#248) +- [DOCS] Regenerate docs + +### 2.0.0-beta.1 (August 18, 2018) +- [ADD] Add loose version comparison to `Parser.compareVersion()` and `Parser.satisfies()` +- [CHORE] Add CONTRIBUTING.md +- [DOCS] Regenerate docs + +### 2.0.0-alpha.4 (August 2, 2018) +- [DOCS] Fix usage docs (#238) +- [CHANGE] Make `./es5.js` the main file of the package (#239) + +### 2.0.0-alpha.3 (July 22, 2018) +- [CHANGE] Rename split and rename `compiled.js` to `es5.js` and `bundled.js` (#231, #236, #237) +- [ADD] Add `Parser.some` (#235) + +### 2.0.0-alpha.2 (July 17, 2018) +- [CHANGE] Make `src/bowser` main file instead of the bundled one +- [CHANGE] Move the bundled file to the root of the package to make it possible to `require('bowser/compiled')` (#231) +- [REMOVE] Remove `typings.d.ts` before stable release (#232) +- [FIX] Improve Nexus devices detection (#233) + +### 2.0.0-alpha.1 (July 9, 2018) +- [ADD] `Bowser.getParser()` +- [ADD] `Bowser.parse` +- [ADD] `Parser` class which describes parsing process +- [CHANGE] Change bowser's returning object +- [REMOVE] Remove bower support + +### 1.9.4 (June 28, 2018) +- [FIX] Fix NAVER Whale browser detection (#220) +- [FIX] Fix MZ Browser browser detection (#219) +- [FIX] Fix Firefox Focus browser detection (#191) +- [FIX] Fix webOS browser detection (#186) + +### 1.9.3 (March 12, 2018) +- [FIX] Fix `typings.d.ts` — add `ipad`, `iphone`, `ipod` flags to the interface + +### 1.9.2 (February 5, 2018) +- [FIX] Fix `typings.d.ts` — add `osname` flag to the interface + +### 1.9.1 (December 22, 2017) +- [FIX] Fix `typings.d.ts` — add `chromium` flag to the interface + +### 1.9.0 (December 20, 2017) +- [ADD] Add a public method `.detect()` (#205) +- [DOCS] Fix description of `chromium` flag in docs (#206) + +### 1.8.1 (October 7, 2017) +- [FIX] Fix detection of MS Edge on Android and iOS (#201) + +### 1.8.0 (October 7, 2017) +- [ADD] Add `osname` into result object (#200) + +### 1.7.3 (August 30, 2017) +- [FIX] Fix detection of Chrome on Android 8 OPR6 (#193) + +### 1.7.2 (August 17, 2017) +- [FIX] Fix typings.d.ts according to #185 + +### 1.7.1 (July 13, 2017) +- [ADD] Fix detecting of Tablet PC as tablet (#183) + +### 1.7.0 (May 18, 2017) +- [ADD] Add OS version support for Windows and macOS (#178) + +### 1.6.0 (December 5, 2016) +- [ADD] Add some tests for Windows devices (#89) +- [ADD] Add `root` to initialization process (#170) +- [FIX] Upgrade .travis.yml config + +### 1.5.0 (October 31, 2016) +- [ADD] Throw an error when `minVersion` map has not a string as a version and fix readme (#165) +- [FIX] Fix truly detection of Windows Phones (#167) + +### 1.4.6 (September 19, 2016) +- [FIX] Fix mobile Opera's version detection on Android +- [FIX] Fix typescript typings — add `mobile` and `tablet` flags +- [DOC] Fix description of `bowser.check` + +### 1.4.5 (August 30, 2016) + +- [FIX] Add support of Samsung Internet for Android +- [FIX] Fix case when `navigator.userAgent` is `undefined` +- [DOC] Add information about `strictMode` in `check` function +- [DOC] Consistent use of `bowser` variable in the README + +### 1.4.4 (August 10, 2016) + +- [FIX] Fix AMD `define` call — pass name to the function + +### 1.4.3 (July 27, 2016) + +- [FIX] Fix error `Object doesn't support this property or method` on IE8 + +### 1.4.2 (July 26, 2016) + +- [FIX] Fix missing `isUnsupportedBrowser` in typings description +- [DOC] Fix `check`'s declaration in README + +### 1.4.1 (July 7, 2016) + +- [FIX] Fix `strictMode` logic for `isUnsupportedBrowser` + +### 1.4.0 (June 28, 2016) + +- [FEATURE] Add `bowser.compareVersions` method +- [FEATURE] Add `bowser.isUnsupportedBrowser` method +- [FEATURE] Add `bowser.check` method +- [DOC] Changelog started +- [DOC] Add API section to README +- [FIX] Fix detection of browser type (A/C/X) for Chromium diff --git a/node_modules/bowser/LICENSE b/node_modules/bowser/LICENSE new file mode 100644 index 0000000..94085f0 --- /dev/null +++ b/node_modules/bowser/LICENSE @@ -0,0 +1,39 @@ +Copyright 2015, Dustin Diaz (the "Original Author") +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. + +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/bowser/README.md b/node_modules/bowser/README.md new file mode 100644 index 0000000..8d8a2fb --- /dev/null +++ b/node_modules/bowser/README.md @@ -0,0 +1,179 @@ +## Bowser +A small, fast and rich-API browser/platform/engine detector for both browser and node. +- **Small.** Use plain ES5-version which is ~4.8kB gzipped. +- **Optimized.** Use only those parsers you need — it doesn't do useless work. +- **Multi-platform.** It's browser- and node-ready, so you can use it in any environment. + +Don't hesitate to support the project on Github or [OpenCollective](https://opencollective.com/bowser) if you like it ❤️ Also, contributors are always welcome! + +[![Financial Contributors on Open Collective](https://opencollective.com/bowser/all/badge.svg?label=financial+contributors)](https://opencollective.com/bowser) [![Build Status](https://travis-ci.org/lancedikson/bowser.svg?branch=master)](https://travis-ci.org/lancedikson/bowser/) [![Greenkeeper badge](https://badges.greenkeeper.io/lancedikson/bowser.svg)](https://greenkeeper.io/) [![Coverage Status](https://coveralls.io/repos/github/lancedikson/bowser/badge.svg?branch=master)](https://coveralls.io/github/lancedikson/bowser?branch=master) ![Downloads](https://img.shields.io/npm/dm/bowser) + +# Contents +- [Overview](#overview) +- [Use cases](#use-cases) +- [Advanced usage](#advanced-usage) +- [How can I help?](#contributing) + +# Overview + +The library is made to help to detect what browser your user has and gives you a convenient API to filter the users somehow depending on their browsers. + +### ⚠️ Version 2.0 breaking changes ⚠️ + +Version 2.0 has drastically changed the API. All available methods are on the [docs page](https://lancedikson.github.io/bowser/docs). + +_For legacy code, check out the [1.x](https://github.com/lancedikson/bowser/tree/v1.x) branch and install it through `npm install bowser@1.9.4`._ + +# Use cases + +First of all, require the library. This is a UMD Module, so it will work for AMD, TypeScript, ES6, and CommonJS module systems. + +```javascript +const Bowser = require("bowser"); // CommonJS + +import * as Bowser from "bowser"; // TypeScript + +import Bowser from "bowser"; // ES6 (and TypeScript with --esModuleInterop enabled) +``` + +By default, the exported version is the *ES5 transpiled version*, which **do not** include any polyfills. + +In case you don't use your own `babel-polyfill` you may need to have pre-built bundle with all needed polyfills. +So, for you it's suitable to require bowser like this: `require('bowser/bundled')`. +As the result, you get a ES5 version of bowser with `babel-polyfill` bundled together. + +You may need to use the source files, so they will be available in the package as well. + +## Browser props detection + +Often we need to pick users' browser properties such as the name, the version, the rendering engine and so on. Here is an example how to do it with Bowser: + +```javascript +const browser = Bowser.getParser(window.navigator.userAgent); + +console.log(`The current browser name is "${browser.getBrowserName()}"`); +// The current browser name is "Internet Explorer" +``` + +or + +```javascript +const browser = Bowser.getParser(window.navigator.userAgent); +console.log(browser.getBrowser()); + +// outputs +{ + name: "Internet Explorer" + version: "11.0" +} +``` + +or + +```javascript +console.log(Bowser.parse(window.navigator.userAgent)); + +// outputs +{ + browser: { + name: "Internet Explorer" + version: "11.0" + }, + os: { + name: "Windows" + version: "NT 6.3" + versionName: "8.1" + }, + platform: { + type: "desktop" + }, + engine: { + name: "Trident" + version: "7.0" + } +} +``` + + +## Filtering browsers + +You could want to filter some particular browsers to provide any special support for them or make any workarounds. +It could look like this: + +```javascript +const browser = Bowser.getParser(window.navigator.userAgent); +const isValidBrowser = browser.satisfies({ + // declare browsers per OS + windows: { + "internet explorer": ">10", + }, + macos: { + safari: ">10.1" + }, + + // per platform (mobile, desktop or tablet) + mobile: { + safari: '>=9', + 'android browser': '>3.10' + }, + + // or in general + chrome: "~20.1.1432", + firefox: ">31", + opera: ">=22", + + // also supports equality operator + chrome: "=20.1.1432", // will match particular build only + + // and loose-equality operator + chrome: "~20", // will match any 20.* sub-version + chrome: "~20.1" // will match any 20.1.* sub-version (20.1.19 as well as 20.1.12.42-alpha.1) +}); +``` + +Settings for any particular OS or platform has more priority and redefines settings of standalone browsers. +Thus, you can define OS or platform specific rules and they will have more priority in the end. + +More of API and possibilities you will find in the `docs` folder. + +### Browser names for `.satisfies()` + +By default you are supposed to use the full browser name for `.satisfies`. +But, there's a short way to define a browser using short aliases. The full +list of aliases can be found in [the file](src/constants.js). + +## Similar Projects +* [Kong](https://github.com/BigBadBleuCheese/Kong) - A C# port of Bowser. + +## Contributors + +### Code Contributors + +This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. + + +### Financial Contributors + +Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/bowser/contribute)] + +#### Individuals + + + +#### Organizations + +Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/bowser/contribute)] + + + + + + + + + + + + +## License +Licensed as MIT. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/bowser/bundled.js b/node_modules/bowser/bundled.js new file mode 100644 index 0000000..5b20ea6 --- /dev/null +++ b/node_modules/bowser/bundled.js @@ -0,0 +1 @@ +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.bowser=n():t.bowser=n()}(this,(function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=129)}([function(t,n,e){var r=e(1),i=e(7),o=e(14),u=e(11),a=e(19),c=function(t,n,e){var s,f,l,h,d=t&c.F,p=t&c.G,v=t&c.S,g=t&c.P,y=t&c.B,m=p?r:v?r[n]||(r[n]={}):(r[n]||{}).prototype,b=p?i:i[n]||(i[n]={}),S=b.prototype||(b.prototype={});for(s in p&&(e=n),e)l=((f=!d&&m&&void 0!==m[s])?m:e)[s],h=y&&f?a(l,r):g&&"function"==typeof l?a(Function.call,l):l,m&&u(m,s,l,t&c.U),b[s]!=l&&o(b,s,h),g&&S[s]!=l&&(S[s]=l)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(4);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,e){var r=e(50)("wks"),i=e(31),o=e(1).Symbol,u="function"==typeof o;(t.exports=function(t){return r[t]||(r[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=r},function(t,n,e){var r=e(21),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,n){var e=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=e)},function(t,n,e){t.exports=!e(2)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),i=e(96),o=e(28),u=Object.defineProperty;n.f=e(8)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(26);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(1),i=e(14),o=e(13),u=e(31)("src"),a=e(134),c=(""+a).split("toString");e(7).inspectSource=function(t){return a.call(t)},(t.exports=function(t,n,e,a){var s="function"==typeof e;s&&(o(e,"name")||i(e,"name",n)),t[n]!==e&&(s&&(o(e,u)||i(e,u,t[n]?""+t[n]:c.join(String(n)))),t===r?t[n]=e:a?t[n]?t[n]=e:i(t,n,e):(delete t[n],i(t,n,e)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[u]||a.call(this)}))},function(t,n,e){var r=e(0),i=e(2),o=e(26),u=/"/g,a=function(t,n,e,r){var i=String(o(t)),a="<"+n;return""!==e&&(a+=" "+e+'="'+String(r).replace(u,""")+'"'),a+">"+i+""};t.exports=function(t,n){var e={};e[t]=n(a),r(r.P+r.F*i((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3})),"String",e)}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(9),i=e(30);t.exports=e(8)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(46),i=e(26);t.exports=function(t){return r(i(t))}},function(t,n,e){"use strict";var r=e(2);t.exports=function(t,n){return!!t&&r((function(){n?t.call(null,(function(){}),1):t.call(null)}))}},function(t,n,e){"use strict";n.__esModule=!0,n.default=void 0;var r=e(18),i=function(){function t(){}return t.getFirstMatch=function(t,n){var e=n.match(t);return e&&e.length>0&&e[1]||""},t.getSecondMatch=function(t,n){var e=n.match(t);return e&&e.length>1&&e[2]||""},t.matchAndReturnConst=function(t,n,e){if(t.test(n))return e},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var n=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),10===n[0])switch(n[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var n=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(n.push(0),!(1===n[0]&&n[1]<5))return 1===n[0]&&n[1]<6?"Cupcake":1===n[0]&&n[1]>=6?"Donut":2===n[0]&&n[1]<2?"Eclair":2===n[0]&&2===n[1]?"Froyo":2===n[0]&&n[1]>2?"Gingerbread":3===n[0]?"Honeycomb":4===n[0]&&n[1]<1?"Ice Cream Sandwich":4===n[0]&&n[1]<4?"Jelly Bean":4===n[0]&&n[1]>=4?"KitKat":5===n[0]?"Lollipop":6===n[0]?"Marshmallow":7===n[0]?"Nougat":8===n[0]?"Oreo":9===n[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(n,e,r){void 0===r&&(r=!1);var i=t.getVersionPrecision(n),o=t.getVersionPrecision(e),u=Math.max(i,o),a=0,c=t.map([n,e],(function(n){var e=u-t.getVersionPrecision(n),r=n+new Array(e+1).join(".0");return t.map(r.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(r&&(a=u-Math.min(i,o)),u-=1;u>=a;){if(c[0][u]>c[1][u])return 1;if(c[0][u]===c[1][u]){if(u===a)return 0;u-=1}else if(c[0][u]1?i-1:0),u=1;u0?r:e)(t)}},function(t,n,e){var r=e(47),i=e(30),o=e(15),u=e(28),a=e(13),c=e(96),s=Object.getOwnPropertyDescriptor;n.f=e(8)?s:function(t,n){if(t=o(t),n=u(n,!0),c)try{return s(t,n)}catch(t){}if(a(t,n))return i(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(0),i=e(7),o=e(2);t.exports=function(t,n){var e=(i.Object||{})[t]||Object[t],u={};u[t]=n(e),r(r.S+r.F*o((function(){e(1)})),"Object",u)}},function(t,n,e){var r=e(19),i=e(46),o=e(10),u=e(6),a=e(112);t.exports=function(t,n){var e=1==t,c=2==t,s=3==t,f=4==t,l=6==t,h=5==t||l,d=n||a;return function(n,a,p){for(var v,g,y=o(n),m=i(y),b=r(a,p,3),S=u(m.length),w=0,_=e?d(n,S):c?d(n,0):void 0;S>w;w++)if((h||w in m)&&(g=b(v=m[w],w,y),t))if(e)_[w]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:_.push(v)}else if(f)return!1;return l?-1:s||f?f:_}}},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,e){"use strict";if(e(8)){var r=e(32),i=e(1),o=e(2),u=e(0),a=e(61),c=e(86),s=e(19),f=e(44),l=e(30),h=e(14),d=e(45),p=e(21),v=e(6),g=e(123),y=e(34),m=e(28),b=e(13),S=e(48),w=e(4),_=e(10),M=e(78),x=e(35),P=e(37),O=e(36).f,A=e(80),F=e(31),E=e(5),N=e(24),R=e(51),k=e(49),T=e(82),I=e(42),j=e(54),L=e(43),B=e(81),C=e(114),W=e(9),V=e(22),G=W.f,D=V.f,U=i.RangeError,z=i.TypeError,q=i.Uint8Array,K=Array.prototype,Y=c.ArrayBuffer,Q=c.DataView,H=N(0),J=N(2),X=N(3),Z=N(4),$=N(5),tt=N(6),nt=R(!0),et=R(!1),rt=T.values,it=T.keys,ot=T.entries,ut=K.lastIndexOf,at=K.reduce,ct=K.reduceRight,st=K.join,ft=K.sort,lt=K.slice,ht=K.toString,dt=K.toLocaleString,pt=E("iterator"),vt=E("toStringTag"),gt=F("typed_constructor"),yt=F("def_constructor"),mt=a.CONSTR,bt=a.TYPED,St=a.VIEW,wt=N(1,(function(t,n){return Ot(k(t,t[yt]),n)})),_t=o((function(){return 1===new q(new Uint16Array([1]).buffer)[0]})),Mt=!!q&&!!q.prototype.set&&o((function(){new q(1).set({})})),xt=function(t,n){var e=p(t);if(e<0||e%n)throw U("Wrong offset!");return e},Pt=function(t){if(w(t)&&bt in t)return t;throw z(t+" is not a typed array!")},Ot=function(t,n){if(!(w(t)&> in t))throw z("It is not a typed array constructor!");return new t(n)},At=function(t,n){return Ft(k(t,t[yt]),n)},Ft=function(t,n){for(var e=0,r=n.length,i=Ot(t,r);r>e;)i[e]=n[e++];return i},Et=function(t,n,e){G(t,n,{get:function(){return this._d[e]}})},Nt=function(t){var n,e,r,i,o,u,a=_(t),c=arguments.length,f=c>1?arguments[1]:void 0,l=void 0!==f,h=A(a);if(null!=h&&!M(h)){for(u=h.call(a),r=[],n=0;!(o=u.next()).done;n++)r.push(o.value);a=r}for(l&&c>2&&(f=s(f,arguments[2],2)),n=0,e=v(a.length),i=Ot(this,e);e>n;n++)i[n]=l?f(a[n],n):a[n];return i},Rt=function(){for(var t=0,n=arguments.length,e=Ot(this,n);n>t;)e[t]=arguments[t++];return e},kt=!!q&&o((function(){dt.call(new q(1))})),Tt=function(){return dt.apply(kt?lt.call(Pt(this)):Pt(this),arguments)},It={copyWithin:function(t,n){return C.call(Pt(this),t,n,arguments.length>2?arguments[2]:void 0)},every:function(t){return Z(Pt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return B.apply(Pt(this),arguments)},filter:function(t){return At(this,J(Pt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return $(Pt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return tt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){H(Pt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return et(Pt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return nt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return st.apply(Pt(this),arguments)},lastIndexOf:function(t){return ut.apply(Pt(this),arguments)},map:function(t){return wt(Pt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return at.apply(Pt(this),arguments)},reduceRight:function(t){return ct.apply(Pt(this),arguments)},reverse:function(){for(var t,n=Pt(this).length,e=Math.floor(n/2),r=0;r1?arguments[1]:void 0)},sort:function(t){return ft.call(Pt(this),t)},subarray:function(t,n){var e=Pt(this),r=e.length,i=y(t,r);return new(k(e,e[yt]))(e.buffer,e.byteOffset+i*e.BYTES_PER_ELEMENT,v((void 0===n?r:y(n,r))-i))}},jt=function(t,n){return At(this,lt.call(Pt(this),t,n))},Lt=function(t){Pt(this);var n=xt(arguments[1],1),e=this.length,r=_(t),i=v(r.length),o=0;if(i+n>e)throw U("Wrong length!");for(;o255?255:255&r),i.v[d](e*n+i.o,r,_t)}(this,e,t)},enumerable:!0})};b?(p=e((function(t,e,r,i){f(t,p,s,"_d");var o,u,a,c,l=0,d=0;if(w(e)){if(!(e instanceof Y||"ArrayBuffer"==(c=S(e))||"SharedArrayBuffer"==c))return bt in e?Ft(p,e):Nt.call(p,e);o=e,d=xt(r,n);var y=e.byteLength;if(void 0===i){if(y%n)throw U("Wrong length!");if((u=y-d)<0)throw U("Wrong length!")}else if((u=v(i)*n)+d>y)throw U("Wrong length!");a=u/n}else a=g(e),o=new Y(u=a*n);for(h(t,"_d",{b:o,o:d,l:u,e:a,v:new Q(o)});ldocument.F=Object<\/script>"),t.close(),c=t.F;r--;)delete c.prototype[o[r]];return c()};t.exports=Object.create||function(t,n){var e;return null!==t?(a.prototype=r(t),e=new a,a.prototype=null,e[u]=t):e=c(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(98),i=e(65).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,n,e){var r=e(13),i=e(10),o=e(64)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(5)("unscopables"),i=Array.prototype;null==i[r]&&e(14)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,n,e){var r=e(4);t.exports=function(t,n){if(!r(t)||t._t!==n)throw TypeError("Incompatible receiver, "+n+" required!");return t}},function(t,n,e){var r=e(9).f,i=e(13),o=e(5)("toStringTag");t.exports=function(t,n,e){t&&!i(t=e?t:t.prototype,o)&&r(t,o,{configurable:!0,value:n})}},function(t,n,e){var r=e(0),i=e(26),o=e(2),u=e(68),a="["+u+"]",c=RegExp("^"+a+a+"*"),s=RegExp(a+a+"*$"),f=function(t,n,e){var i={},a=o((function(){return!!u[t]()||"​…"!="​…"[t]()})),c=i[t]=a?n(l):u[t];e&&(i[e]=c),r(r.P+r.F*a,"String",i)},l=f.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(c,"")),2&n&&(t=t.replace(s,"")),t};t.exports=f},function(t,n){t.exports={}},function(t,n,e){"use strict";var r=e(1),i=e(9),o=e(8),u=e(5)("species");t.exports=function(t){var n=r[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,e,r){if(!(t instanceof n)||void 0!==r&&r in t)throw TypeError(e+": incorrect invocation!");return t}},function(t,n,e){var r=e(11);t.exports=function(t,n,e){for(var i in n)r(t,i,n[i],e);return t}},function(t,n,e){var r=e(25);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(25),i=e(5)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var n,e,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:o?r(n):"Object"==(u=r(n))&&"function"==typeof n.callee?"Arguments":u}},function(t,n,e){var r=e(3),i=e(20),o=e(5)("species");t.exports=function(t,n){var e,u=r(t).constructor;return void 0===u||null==(e=r(u)[o])?n:i(e)}},function(t,n,e){var r=e(7),i=e(1),o=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})("versions",[]).push({version:r.version,mode:e(32)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,n,e){var r=e(15),i=e(6),o=e(34);t.exports=function(t){return function(n,e,u){var a,c=r(n),s=i(c.length),f=o(u,s);if(t&&e!=e){for(;s>f;)if((a=c[f++])!=a)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===e)return t||f||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(25);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){var r=e(5)("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!i)return!1;var e=!1;try{var o=[7],u=o[r]();u.next=function(){return{done:e=!0}},o[r]=function(){return u},t(o)}catch(t){}return e}},function(t,n,e){"use strict";var r=e(3);t.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,e){"use strict";var r=e(48),i=RegExp.prototype.exec;t.exports=function(t,n){var e=t.exec;if("function"==typeof e){var o=e.call(t,n);if("object"!=typeof o)throw new TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return i.call(t,n)}},function(t,n,e){"use strict";e(116);var r=e(11),i=e(14),o=e(2),u=e(26),a=e(5),c=e(83),s=a("species"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e="ab".split(t);return 2===e.length&&"a"===e[0]&&"b"===e[1]}();t.exports=function(t,n,e){var h=a(t),d=!o((function(){var n={};return n[h]=function(){return 7},7!=""[t](n)})),p=d?!o((function(){var n=!1,e=/a/;return e.exec=function(){return n=!0,null},"split"===t&&(e.constructor={},e.constructor[s]=function(){return e}),e[h](""),!n})):void 0;if(!d||!p||"replace"===t&&!f||"split"===t&&!l){var v=/./[h],g=e(u,h,""[t],(function(t,n,e,r,i){return n.exec===c?d&&!i?{done:!0,value:v.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}})),y=g[0],m=g[1];r(String.prototype,t,y),i(RegExp.prototype,h,2==n?function(t,n){return m.call(t,this,n)}:function(t){return m.call(t,this)})}}},function(t,n,e){var r=e(19),i=e(111),o=e(78),u=e(3),a=e(6),c=e(80),s={},f={};(n=t.exports=function(t,n,e,l,h){var d,p,v,g,y=h?function(){return t}:c(t),m=r(e,l,n?2:1),b=0;if("function"!=typeof y)throw TypeError(t+" is not iterable!");if(o(y)){for(d=a(t.length);d>b;b++)if((g=n?m(u(p=t[b])[0],p[1]):m(t[b]))===s||g===f)return g}else for(v=y.call(t);!(p=v.next()).done;)if((g=i(v,m,p.value,n))===s||g===f)return g}).BREAK=s,n.RETURN=f},function(t,n,e){var r=e(1).navigator;t.exports=r&&r.userAgent||""},function(t,n,e){"use strict";var r=e(1),i=e(0),o=e(11),u=e(45),a=e(29),c=e(58),s=e(44),f=e(4),l=e(2),h=e(54),d=e(40),p=e(69);t.exports=function(t,n,e,v,g,y){var m=r[t],b=m,S=g?"set":"add",w=b&&b.prototype,_={},M=function(t){var n=w[t];o(w,t,"delete"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:"has"==t?function(t){return!(y&&!f(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return y&&!f(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,e){return n.call(this,0===t?0:t,e),this})};if("function"==typeof b&&(y||w.forEach&&!l((function(){(new b).entries().next()})))){var x=new b,P=x[S](y?{}:-0,1)!=x,O=l((function(){x.has(1)})),A=h((function(t){new b(t)})),F=!y&&l((function(){for(var t=new b,n=5;n--;)t[S](n,n);return!t.has(-0)}));A||((b=n((function(n,e){s(n,b,t);var r=p(new m,n,b);return null!=e&&c(e,g,r[S],r),r}))).prototype=w,w.constructor=b),(O||F)&&(M("delete"),M("has"),g&&M("get")),(F||P)&&M(S),y&&w.clear&&delete w.clear}else b=v.getConstructor(n,t,g,S),u(b.prototype,e),a.NEED=!0;return d(b,t),_[t]=b,i(i.G+i.W+i.F*(b!=m),_),y||v.setStrong(b,t,g),b}},function(t,n,e){for(var r,i=e(1),o=e(14),u=e(31),a=u("typed_array"),c=u("view"),s=!(!i.ArrayBuffer||!i.DataView),f=s,l=0,h="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");l<9;)(r=i[h[l++]])?(o(r.prototype,a,!0),o(r.prototype,c,!0)):f=!1;t.exports={ABV:s,CONSTR:f,TYPED:a,VIEW:c}},function(t,n,e){var r=e(4),i=e(1).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){n.f=e(5)},function(t,n,e){var r=e(50)("keys"),i=e(31);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n,e){var r=e(1).document;t.exports=r&&r.documentElement},function(t,n,e){var r=e(4),i=e(3),o=function(t,n){if(i(t),!r(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,n,r){try{(r=e(19)(Function.call,e(22).f(Object.prototype,"__proto__").set,2))(t,[]),n=!(t instanceof Array)}catch(t){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},function(t,n){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(t,n,e){var r=e(4),i=e(67).set;t.exports=function(t,n,e){var o,u=n.constructor;return u!==e&&"function"==typeof u&&(o=u.prototype)!==e.prototype&&r(o)&&i&&i(t,o),t}},function(t,n,e){"use strict";var r=e(21),i=e(26);t.exports=function(t){var n=String(i(this)),e="",o=r(t);if(o<0||o==1/0)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(e+=n);return e}},function(t,n){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var e=Math.expm1;t.exports=!e||e(10)>22025.465794806718||e(10)<22025.465794806718||-2e-17!=e(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:e},function(t,n,e){var r=e(21),i=e(26);t.exports=function(t){return function(n,e){var o,u,a=String(i(n)),c=r(e),s=a.length;return c<0||c>=s?t?"":void 0:(o=a.charCodeAt(c))<55296||o>56319||c+1===s||(u=a.charCodeAt(c+1))<56320||u>57343?t?a.charAt(c):o:t?a.slice(c,c+2):u-56320+(o-55296<<10)+65536}}},function(t,n,e){"use strict";var r=e(32),i=e(0),o=e(11),u=e(14),a=e(42),c=e(110),s=e(40),f=e(37),l=e(5)("iterator"),h=!([].keys&&"next"in[].keys()),d=function(){return this};t.exports=function(t,n,e,p,v,g,y){c(e,n,p);var m,b,S,w=function(t){if(!h&&t in P)return P[t];switch(t){case"keys":case"values":return function(){return new e(this,t)}}return function(){return new e(this,t)}},_=n+" Iterator",M="values"==v,x=!1,P=t.prototype,O=P[l]||P["@@iterator"]||v&&P[v],A=O||w(v),F=v?M?w("entries"):A:void 0,E="Array"==n&&P.entries||O;if(E&&(S=f(E.call(new t)))!==Object.prototype&&S.next&&(s(S,_,!0),r||"function"==typeof S[l]||u(S,l,d)),M&&O&&"values"!==O.name&&(x=!0,A=function(){return O.call(this)}),r&&!y||!h&&!x&&P[l]||u(P,l,A),a[n]=A,a[_]=d,v)if(m={values:M?A:w("values"),keys:g?A:w("keys"),entries:F},y)for(b in m)b in P||o(P,b,m[b]);else i(i.P+i.F*(h||x),n,m);return m}},function(t,n,e){var r=e(76),i=e(26);t.exports=function(t,n,e){if(r(n))throw TypeError("String#"+e+" doesn't accept regex!");return String(i(t))}},function(t,n,e){var r=e(4),i=e(25),o=e(5)("match");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[o])?!!n:"RegExp"==i(t))}},function(t,n,e){var r=e(5)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,!"/./"[t](n)}catch(t){}}return!0}},function(t,n,e){var r=e(42),i=e(5)("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},function(t,n,e){"use strict";var r=e(9),i=e(30);t.exports=function(t,n,e){n in t?r.f(t,n,i(0,e)):t[n]=e}},function(t,n,e){var r=e(48),i=e(5)("iterator"),o=e(42);t.exports=e(7).getIteratorMethod=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,n,e){"use strict";var r=e(10),i=e(34),o=e(6);t.exports=function(t){for(var n=r(this),e=o(n.length),u=arguments.length,a=i(u>1?arguments[1]:void 0,e),c=u>2?arguments[2]:void 0,s=void 0===c?e:i(c,e);s>a;)n[a++]=t;return n}},function(t,n,e){"use strict";var r=e(38),i=e(115),o=e(42),u=e(15);t.exports=e(74)(Array,"Array",(function(t,n){this._t=u(t),this._i=0,this._k=n}),(function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,i(1)):i(0,"keys"==n?e:"values"==n?t[e]:[e,t[e]])}),"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},function(t,n,e){"use strict";var r,i,o=e(55),u=RegExp.prototype.exec,a=String.prototype.replace,c=u,s=(r=/a/,i=/b*/g,u.call(r,"a"),u.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),f=void 0!==/()??/.exec("")[1];(s||f)&&(c=function(t){var n,e,r,i,c=this;return f&&(e=new RegExp("^"+c.source+"$(?!\\s)",o.call(c))),s&&(n=c.lastIndex),r=u.call(c,t),s&&r&&(c.lastIndex=c.global?r.index+r[0].length:n),f&&r&&r.length>1&&a.call(r[0],e,(function(){for(i=1;ie;)n.push(arguments[e++]);return y[++g]=function(){a("function"==typeof t?t:Function(t),n)},r(g),g},d=function(t){delete y[t]},"process"==e(25)(l)?r=function(t){l.nextTick(u(m,t,1))}:v&&v.now?r=function(t){v.now(u(m,t,1))}:p?(o=(i=new p).port2,i.port1.onmessage=b,r=u(o.postMessage,o,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+"","*")},f.addEventListener("message",b,!1)):r="onreadystatechange"in s("script")?function(t){c.appendChild(s("script")).onreadystatechange=function(){c.removeChild(this),m.call(t)}}:function(t){setTimeout(u(m,t,1),0)}),t.exports={set:h,clear:d}},function(t,n,e){"use strict";var r=e(1),i=e(8),o=e(32),u=e(61),a=e(14),c=e(45),s=e(2),f=e(44),l=e(21),h=e(6),d=e(123),p=e(36).f,v=e(9).f,g=e(81),y=e(40),m="prototype",b="Wrong index!",S=r.ArrayBuffer,w=r.DataView,_=r.Math,M=r.RangeError,x=r.Infinity,P=S,O=_.abs,A=_.pow,F=_.floor,E=_.log,N=_.LN2,R=i?"_b":"buffer",k=i?"_l":"byteLength",T=i?"_o":"byteOffset";function I(t,n,e){var r,i,o,u=new Array(e),a=8*e-n-1,c=(1<>1,f=23===n?A(2,-24)-A(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=O(t))!=t||t===x?(i=t!=t?1:0,r=c):(r=F(E(t)/N),t*(o=A(2,-r))<1&&(r--,o*=2),(t+=r+s>=1?f/o:f*A(2,1-s))*o>=2&&(r++,o/=2),r+s>=c?(i=0,r=c):r+s>=1?(i=(t*o-1)*A(2,n),r+=s):(i=t*A(2,s-1)*A(2,n),r=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(r=r<0;u[l++]=255&r,r/=256,a-=8);return u[--l]|=128*h,u}function j(t,n,e){var r,i=8*e-n-1,o=(1<>1,a=i-7,c=e-1,s=t[c--],f=127&s;for(s>>=7;a>0;f=256*f+t[c],c--,a-=8);for(r=f&(1<<-a)-1,f>>=-a,a+=n;a>0;r=256*r+t[c],c--,a-=8);if(0===f)f=1-u;else{if(f===o)return r?NaN:s?-x:x;r+=A(2,n),f-=u}return(s?-1:1)*r*A(2,f-n)}function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function B(t){return[255&t]}function C(t){return[255&t,t>>8&255]}function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function V(t){return I(t,52,8)}function G(t){return I(t,23,4)}function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}function U(t,n,e,r){var i=d(+e);if(i+n>t[k])throw M(b);var o=t[R]._b,u=i+t[T],a=o.slice(u,u+n);return r?a:a.reverse()}function z(t,n,e,r,i,o){var u=d(+e);if(u+n>t[k])throw M(b);for(var a=t[R]._b,c=u+t[T],s=r(+i),f=0;fQ;)(q=Y[Q++])in S||a(S,q,P[q]);o||(K.constructor=S)}var H=new w(new S(2)),J=w[m].setInt8;H.setInt8(0,2147483648),H.setInt8(1,2147483649),!H.getInt8(0)&&H.getInt8(1)||c(w[m],{setInt8:function(t,n){J.call(this,t,n<<24>>24)},setUint8:function(t,n){J.call(this,t,n<<24>>24)}},!0)}else S=function(t){f(this,S,"ArrayBuffer");var n=d(t);this._b=g.call(new Array(n),0),this[k]=n},w=function(t,n,e){f(this,w,"DataView"),f(t,S,"DataView");var r=t[k],i=l(n);if(i<0||i>r)throw M("Wrong offset!");if(i+(e=void 0===e?r-i:h(e))>r)throw M("Wrong length!");this[R]=t,this[T]=i,this[k]=e},i&&(D(S,"byteLength","_l"),D(w,"buffer","_b"),D(w,"byteLength","_l"),D(w,"byteOffset","_o")),c(w[m],{getInt8:function(t){return U(this,1,t)[0]<<24>>24},getUint8:function(t){return U(this,1,t)[0]},getInt16:function(t){var n=U(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function(t){var n=U(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function(t){return L(U(this,4,t,arguments[1]))},getUint32:function(t){return L(U(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return j(U(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return j(U(this,8,t,arguments[1]),52,8)},setInt8:function(t,n){z(this,1,t,B,n)},setUint8:function(t,n){z(this,1,t,B,n)},setInt16:function(t,n){z(this,2,t,C,n,arguments[2])},setUint16:function(t,n){z(this,2,t,C,n,arguments[2])},setInt32:function(t,n){z(this,4,t,W,n,arguments[2])},setUint32:function(t,n){z(this,4,t,W,n,arguments[2])},setFloat32:function(t,n){z(this,4,t,G,n,arguments[2])},setFloat64:function(t,n){z(this,8,t,V,n,arguments[2])}});y(S,"ArrayBuffer"),y(w,"DataView"),a(w[m],u.VIEW,!0),n.ArrayBuffer=S,n.DataView=w},function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,e){t.exports=!e(128)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,n,e){"use strict";n.__esModule=!0,n.default=void 0;var r,i=(r=e(91))&&r.__esModule?r:{default:r},o=e(18);function u(t,n){for(var e=0;e0){var u=Object.keys(e),c=a.default.find(u,(function(t){return n.isOS(t)}));if(c){var s=this.satisfies(e[c]);if(void 0!==s)return s}var f=a.default.find(u,(function(t){return n.isPlatform(t)}));if(f){var l=this.satisfies(e[f]);if(void 0!==l)return l}}if(o>0){var h=Object.keys(i),d=a.default.find(h,(function(t){return n.isBrowser(t,!0)}));if(void 0!==d)return this.compareVersion(i[d])}},n.isBrowser=function(t,n){void 0===n&&(n=!1);var e=this.getBrowserName().toLowerCase(),r=t.toLowerCase(),i=a.default.getBrowserTypeByAlias(r);return n&&i&&(r=i.toLowerCase()),r===e},n.compareVersion=function(t){var n=[0],e=t,r=!1,i=this.getBrowserVersion();if("string"==typeof i)return">"===t[0]||"<"===t[0]?(e=t.substr(1),"="===t[1]?(r=!0,e=t.substr(2)):n=[],">"===t[0]?n.push(1):n.push(-1)):"="===t[0]?e=t.substr(1):"~"===t[0]&&(r=!0,e=t.substr(1)),n.indexOf(a.default.compareVersions(i,e,r))>-1},n.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},n.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},n.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},n.is=function(t){return this.isBrowser(t)||this.isOS(t)||this.isPlatform(t)},n.some=function(t){var n=this;return void 0===t&&(t=[]),t.some((function(t){return n.is(t)}))},t}();n.default=s,t.exports=n.default},function(t,n,e){"use strict";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r};var o=/version\/(\d+(\.?_?\d+)+)/i,u=[{test:[/googlebot/i],describe:function(t){var n={name:"Googlebot"},e=i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/opera/i],describe:function(t){var n={name:"Opera"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/opr\/|opios/i],describe:function(t){var n={name:"Opera"},e=i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/SamsungBrowser/i],describe:function(t){var n={name:"Samsung Internet for Android"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Whale/i],describe:function(t){var n={name:"NAVER Whale Browser"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/MZBrowser/i],describe:function(t){var n={name:"MZ Browser"},e=i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/focus/i],describe:function(t){var n={name:"Focus"},e=i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/swing/i],describe:function(t){var n={name:"Swing"},e=i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/coast/i],describe:function(t){var n={name:"Opera Coast"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/yabrowser/i],describe:function(t){var n={name:"Yandex Browser"},e=i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/ucbrowser/i],describe:function(t){var n={name:"UC Browser"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/Maxthon|mxios/i],describe:function(t){var n={name:"Maxthon"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/epiphany/i],describe:function(t){var n={name:"Epiphany"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/puffin/i],describe:function(t){var n={name:"Puffin"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sleipnir/i],describe:function(t){var n={name:"Sleipnir"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/k-meleon/i],describe:function(t){var n={name:"K-Meleon"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/micromessenger/i],describe:function(t){var n={name:"WeChat"},e=i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qqbrowser/i],describe:function(t){var n={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},e=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/msie|trident/i],describe:function(t){var n={name:"Internet Explorer"},e=i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/\sedg\//i],describe:function(t){var n={name:"Microsoft Edge"},e=i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/edg([ea]|ios)/i],describe:function(t){var n={name:"Microsoft Edge"},e=i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/vivaldi/i],describe:function(t){var n={name:"Vivaldi"},e=i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/seamonkey/i],describe:function(t){var n={name:"SeaMonkey"},e=i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/sailfish/i],describe:function(t){var n={name:"Sailfish"},e=i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return e&&(n.version=e),n}},{test:[/silk/i],describe:function(t){var n={name:"Amazon Silk"},e=i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/phantom/i],describe:function(t){var n={name:"PhantomJS"},e=i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/slimerjs/i],describe:function(t){var n={name:"SlimerJS"},e=i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var n={name:"BlackBerry"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n={name:"WebOS Browser"},e=i.default.getFirstMatch(o,t)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/bada/i],describe:function(t){var n={name:"Bada"},e=i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/tizen/i],describe:function(t){var n={name:"Tizen"},e=i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/qupzilla/i],describe:function(t){var n={name:"QupZilla"},e=i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var n={name:"Firefox"},e=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/electron/i],describe:function(t){var n={name:"Electron"},e=i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/chromium/i],describe:function(t){var n={name:"Chromium"},e=i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/chrome|crios|crmo/i],describe:function(t){var n={name:"Chrome"},e=i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/GSA/i],describe:function(t){var n={name:"Google Search"},e=i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n={name:"Android Browser"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/playstation 4/i],describe:function(t){var n={name:"PlayStation 4"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/safari|applewebkit/i],describe:function(t){var n={name:"Safari"},e=i.default.getFirstMatch(o,t);return e&&(n.version=e),n}},{test:[/.*/i],describe:function(t){var n=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:i.default.getFirstMatch(n,t),version:i.default.getSecondMatch(n,t)}}}];n.default=u,t.exports=n.default},function(t,n,e){"use strict";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/Roku\/DVP/],describe:function(t){var n=i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:o.OS_MAP.Roku,version:n}}},{test:[/windows phone/i],describe:function(t){var n=i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:o.OS_MAP.WindowsPhone,version:n}}},{test:[/windows /i],describe:function(t){var n=i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),e=i.default.getWindowsVersionName(n);return{name:o.OS_MAP.Windows,version:n,versionName:e}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\//],describe:function(t){var n=i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return{name:o.OS_MAP.iOS,version:n}}},{test:[/macintosh/i],describe:function(t){var n=i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),e=i.default.getMacOSVersionName(n),r={name:o.OS_MAP.MacOS,version:n};return e&&(r.versionName=e),r}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var n=i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:o.OS_MAP.iOS,version:n}}},{test:function(t){var n=!t.test(/like android/i),e=t.test(/android/i);return n&&e},describe:function(t){var n=i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),e=i.default.getAndroidVersionName(n),r={name:o.OS_MAP.Android,version:n};return e&&(r.versionName=e),r}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var n=i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),e={name:o.OS_MAP.WebOS};return n&&n.length&&(e.version=n),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var n=i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||i.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:o.OS_MAP.BlackBerry,version:n}}},{test:[/bada/i],describe:function(t){var n=i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:o.OS_MAP.Bada,version:n}}},{test:[/tizen/i],describe:function(t){var n=i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:o.OS_MAP.Tizen,version:n}}},{test:[/linux/i],describe:function(){return{name:o.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:o.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var n=i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:o.OS_MAP.PlayStation4,version:n}}}];n.default=u,t.exports=n.default},function(t,n,e){"use strict";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var n=i.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",e={type:o.PLATFORMS_MAP.mobile,vendor:"Huawei"};return n&&(e.model=n),e}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\//],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){var n=t.test(/ipod|iphone/i),e=t.test(/like (ipod|iphone)/i);return n&&!e},describe:function(t){var n=i.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:o.PLATFORMS_MAP.mobile,vendor:"Apple",model:n}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var n=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&n>=3},describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}}];n.default=u,t.exports=n.default},function(t,n,e){"use strict";n.__esModule=!0,n.default=void 0;var r,i=(r=e(17))&&r.__esModule?r:{default:r},o=e(18);var u=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:o.ENGINE_MAP.Blink};var n=i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:o.ENGINE_MAP.EdgeHTML,version:n}}},{test:[/trident/i],describe:function(t){var n={name:o.ENGINE_MAP.Trident},e=i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){return t.test(/presto/i)},describe:function(t){var n={name:o.ENGINE_MAP.Presto},e=i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:function(t){var n=t.test(/gecko/i),e=t.test(/like gecko/i);return n&&!e},describe:function(t){var n={name:o.ENGINE_MAP.Gecko},e=i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:o.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var n={name:o.ENGINE_MAP.WebKit},e=i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return e&&(n.version=e),n}}];n.default=u,t.exports=n.default},function(t,n,e){t.exports=!e(8)&&!e(2)((function(){return 7!=Object.defineProperty(e(62)("div"),"a",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(1),i=e(7),o=e(32),u=e(63),a=e(9).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});"_"==t.charAt(0)||t in n||a(n,t,{value:u.f(t)})}},function(t,n,e){var r=e(13),i=e(15),o=e(51)(!1),u=e(64)("IE_PROTO");t.exports=function(t,n){var e,a=i(t),c=0,s=[];for(e in a)e!=u&&r(a,e)&&s.push(e);for(;n.length>c;)r(a,e=n[c++])&&(~o(s,e)||s.push(e));return s}},function(t,n,e){var r=e(9),i=e(3),o=e(33);t.exports=e(8)?Object.defineProperties:function(t,n){i(t);for(var e,u=o(n),a=u.length,c=0;a>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(15),i=e(36).f,o={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return u&&"[object Window]"==o.call(t)?function(t){try{return i(t)}catch(t){return u.slice()}}(t):i(r(t))}},function(t,n,e){"use strict";var r=e(8),i=e(33),o=e(52),u=e(47),a=e(10),c=e(46),s=Object.assign;t.exports=!s||e(2)((function(){var t={},n={},e=Symbol(),r="abcdefghijklmnopqrst";return t[e]=7,r.split("").forEach((function(t){n[t]=t})),7!=s({},t)[e]||Object.keys(s({},n)).join("")!=r}))?function(t,n){for(var e=a(t),s=arguments.length,f=1,l=o.f,h=u.f;s>f;)for(var d,p=c(arguments[f++]),v=l?i(p).concat(l(p)):i(p),g=v.length,y=0;g>y;)d=v[y++],r&&!h.call(p,d)||(e[d]=p[d]);return e}:s},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){"use strict";var r=e(20),i=e(4),o=e(104),u=[].slice,a={},c=function(t,n,e){if(!(n in a)){for(var r=[],i=0;i>>0||(u.test(e)?16:10))}:r},function(t,n,e){var r=e(1).parseFloat,i=e(41).trim;t.exports=1/r(e(68)+"-0")!=-1/0?function(t){var n=i(String(t),3),e=r(n);return 0===e&&"-"==n.charAt(0)?-0:e}:r},function(t,n,e){var r=e(25);t.exports=function(t,n){if("number"!=typeof t&&"Number"!=r(t))throw TypeError(n);return+t}},function(t,n,e){var r=e(4),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,n){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,e){"use strict";var r=e(35),i=e(30),o=e(40),u={};e(14)(u,e(5)("iterator"),(function(){return this})),t.exports=function(t,n,e){t.prototype=r(u,{next:i(1,e)}),o(t,n+" Iterator")}},function(t,n,e){var r=e(3);t.exports=function(t,n,e,i){try{return i?n(r(e)[0],e[1]):n(e)}catch(n){var o=t.return;throw void 0!==o&&r(o.call(t)),n}}},function(t,n,e){var r=e(224);t.exports=function(t,n){return new(r(t))(n)}},function(t,n,e){var r=e(20),i=e(10),o=e(46),u=e(6);t.exports=function(t,n,e,a,c){r(n);var s=i(t),f=o(s),l=u(s.length),h=c?l-1:0,d=c?-1:1;if(e<2)for(;;){if(h in f){a=f[h],h+=d;break}if(h+=d,c?h<0:l<=h)throw TypeError("Reduce of empty array with no initial value")}for(;c?h>=0:l>h;h+=d)h in f&&(a=n(a,f[h],h,s));return a}},function(t,n,e){"use strict";var r=e(10),i=e(34),o=e(6);t.exports=[].copyWithin||function(t,n){var e=r(this),u=o(e.length),a=i(t,u),c=i(n,u),s=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===s?u:i(s,u))-c,u-a),l=1;for(c0;)c in e?e[a]=e[c]:delete e[a],a+=l,c+=l;return e}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){"use strict";var r=e(83);e(0)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(t,n,e){e(8)&&"g"!=/./g.flags&&e(9).f(RegExp.prototype,"flags",{configurable:!0,get:e(55)})},function(t,n,e){"use strict";var r,i,o,u,a=e(32),c=e(1),s=e(19),f=e(48),l=e(0),h=e(4),d=e(20),p=e(44),v=e(58),g=e(49),y=e(85).set,m=e(244)(),b=e(119),S=e(245),w=e(59),_=e(120),M=c.TypeError,x=c.process,P=x&&x.versions,O=P&&P.v8||"",A=c.Promise,F="process"==f(x),E=function(){},N=i=b.f,R=!!function(){try{var t=A.resolve(1),n=(t.constructor={})[e(5)("species")]=function(t){t(E,E)};return(F||"function"==typeof PromiseRejectionEvent)&&t.then(E)instanceof n&&0!==O.indexOf("6.6")&&-1===w.indexOf("Chrome/66")}catch(t){}}(),k=function(t){var n;return!(!h(t)||"function"!=typeof(n=t.then))&&n},T=function(t,n){if(!t._n){t._n=!0;var e=t._c;m((function(){for(var r=t._v,i=1==t._s,o=0,u=function(n){var e,o,u,a=i?n.ok:n.fail,c=n.resolve,s=n.reject,f=n.domain;try{a?(i||(2==t._h&&L(t),t._h=1),!0===a?e=r:(f&&f.enter(),e=a(r),f&&(f.exit(),u=!0)),e===n.promise?s(M("Promise-chain cycle")):(o=k(e))?o.call(e,c,s):c(e)):s(r)}catch(t){f&&!u&&f.exit(),s(t)}};e.length>o;)u(e[o++]);t._c=[],t._n=!1,n&&!t._h&&I(t)}))}},I=function(t){y.call(c,(function(){var n,e,r,i=t._v,o=j(t);if(o&&(n=S((function(){F?x.emit("unhandledRejection",i,t):(e=c.onunhandledrejection)?e({promise:t,reason:i}):(r=c.console)&&r.error&&r.error("Unhandled promise rejection",i)})),t._h=F||j(t)?2:1),t._a=void 0,o&&n.e)throw n.v}))},j=function(t){return 1!==t._h&&0===(t._a||t._c).length},L=function(t){y.call(c,(function(){var n;F?x.emit("rejectionHandled",t):(n=c.onrejectionhandled)&&n({promise:t,reason:t._v})}))},B=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),T(n,!0))},C=function(t){var n,e=this;if(!e._d){e._d=!0,e=e._w||e;try{if(e===t)throw M("Promise can't be resolved itself");(n=k(t))?m((function(){var r={_w:e,_d:!1};try{n.call(t,s(C,r,1),s(B,r,1))}catch(t){B.call(r,t)}})):(e._v=t,e._s=1,T(e,!1))}catch(t){B.call({_w:e,_d:!1},t)}}};R||(A=function(t){p(this,A,"Promise","_h"),d(t),r.call(this);try{t(s(C,this,1),s(B,this,1))}catch(t){B.call(this,t)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=e(45)(A.prototype,{then:function(t,n){var e=N(g(this,A));return e.ok="function"!=typeof t||t,e.fail="function"==typeof n&&n,e.domain=F?x.domain:void 0,this._c.push(e),this._a&&this._a.push(e),this._s&&T(this,!1),e.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r;this.promise=t,this.resolve=s(C,t,1),this.reject=s(B,t,1)},b.f=N=function(t){return t===A||t===u?new o(t):i(t)}),l(l.G+l.W+l.F*!R,{Promise:A}),e(40)(A,"Promise"),e(43)("Promise"),u=e(7).Promise,l(l.S+l.F*!R,"Promise",{reject:function(t){var n=N(this);return(0,n.reject)(t),n.promise}}),l(l.S+l.F*(a||!R),"Promise",{resolve:function(t){return _(a&&this===u?A:this,t)}}),l(l.S+l.F*!(R&&e(54)((function(t){A.all(t).catch(E)}))),"Promise",{all:function(t){var n=this,e=N(n),r=e.resolve,i=e.reject,o=S((function(){var e=[],o=0,u=1;v(t,!1,(function(t){var a=o++,c=!1;e.push(void 0),u++,n.resolve(t).then((function(t){c||(c=!0,e[a]=t,--u||r(e))}),i)})),--u||r(e)}));return o.e&&i(o.v),e.promise},race:function(t){var n=this,e=N(n),r=e.reject,i=S((function(){v(t,!1,(function(t){n.resolve(t).then(e.resolve,r)}))}));return i.e&&r(i.v),e.promise}})},function(t,n,e){"use strict";var r=e(20);function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError("Bad Promise constructor");n=t,e=r})),this.resolve=r(n),this.reject=r(e)}t.exports.f=function(t){return new i(t)}},function(t,n,e){var r=e(3),i=e(4),o=e(119);t.exports=function(t,n){if(r(t),i(n)&&n.constructor===t)return n;var e=o.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){"use strict";var r=e(9).f,i=e(35),o=e(45),u=e(19),a=e(44),c=e(58),s=e(74),f=e(115),l=e(43),h=e(8),d=e(29).fastKey,p=e(39),v=h?"_s":"size",g=function(t,n){var e,r=d(n);if("F"!==r)return t._i[r];for(e=t._f;e;e=e.n)if(e.k==n)return e};t.exports={getConstructor:function(t,n,e,s){var f=t((function(t,r){a(t,f,n,"_i"),t._t=n,t._i=i(null),t._f=void 0,t._l=void 0,t[v]=0,null!=r&&c(r,e,t[s],t)}));return o(f.prototype,{clear:function(){for(var t=p(this,n),e=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete e[r.i];t._f=t._l=void 0,t[v]=0},delete:function(t){var e=p(this,n),r=g(e,t);if(r){var i=r.n,o=r.p;delete e._i[r.i],r.r=!0,o&&(o.n=i),i&&(i.p=o),e._f==r&&(e._f=i),e._l==r&&(e._l=o),e[v]--}return!!r},forEach:function(t){p(this,n);for(var e,r=u(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(r(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!g(p(this,n),t)}}),h&&r(f.prototype,"size",{get:function(){return p(this,n)[v]}}),f},def:function(t,n,e){var r,i,o=g(t,n);return o?o.v=e:(t._l=o={i:i=d(n,!0),k:n,v:e,p:r=t._l,n:void 0,r:!1},t._f||(t._f=o),r&&(r.n=o),t[v]++,"F"!==i&&(t._i[i]=o)),t},getEntry:g,setStrong:function(t,n,e){s(t,n,(function(t,e){this._t=p(t,n),this._k=e,this._l=void 0}),(function(){for(var t=this._k,n=this._l;n&&n.r;)n=n.p;return this._t&&(this._l=n=n?n.n:this._t._f)?f(0,"keys"==t?n.k:"values"==t?n.v:[n.k,n.v]):(this._t=void 0,f(1))}),e?"entries":"values",!e,!0),l(n)}}},function(t,n,e){"use strict";var r=e(45),i=e(29).getWeak,o=e(3),u=e(4),a=e(44),c=e(58),s=e(24),f=e(13),l=e(39),h=s(5),d=s(6),p=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},y=function(t,n){return h(t.a,(function(t){return t[0]===n}))};g.prototype={get:function(t){var n=y(this,t);if(n)return n[1]},has:function(t){return!!y(this,t)},set:function(t,n){var e=y(this,t);e?e[1]=n:this.a.push([t,n])},delete:function(t){var n=d(this.a,(function(n){return n[0]===t}));return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,o){var s=t((function(t,r){a(t,s,n,"_i"),t._t=n,t._i=p++,t._l=void 0,null!=r&&c(r,e,t[o],t)}));return r(s.prototype,{delete:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).delete(t):e&&f(e,this._i)&&delete e[this._i]},has:function(t){if(!u(t))return!1;var e=i(t);return!0===e?v(l(this,n)).has(t):e&&f(e,this._i)}}),s},def:function(t,n,e){var r=i(o(n),!0);return!0===r?v(t).set(n,e):r[t._i]=e,t},ufstore:v}},function(t,n,e){var r=e(21),i=e(6);t.exports=function(t){if(void 0===t)return 0;var n=r(t),e=i(n);if(n!==e)throw RangeError("Wrong length!");return e}},function(t,n,e){var r=e(36),i=e(52),o=e(3),u=e(1).Reflect;t.exports=u&&u.ownKeys||function(t){var n=r.f(o(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(6),i=e(70),o=e(26);t.exports=function(t,n,e,u){var a=String(o(t)),c=a.length,s=void 0===e?" ":String(e),f=r(n);if(f<=c||""==s)return a;var l=f-c,h=i.call(s,Math.ceil(l/s.length));return h.length>l&&(h=h.slice(0,l)),u?h+a:a+h}},function(t,n,e){var r=e(8),i=e(33),o=e(15),u=e(47).f;t.exports=function(t){return function(n){for(var e,a=o(n),c=i(a),s=c.length,f=0,l=[];s>f;)e=c[f++],r&&!u.call(a,e)||l.push(t?[e,a[e]]:a[e]);return l}}},function(t,n){var e=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){e(130),t.exports=e(90)},function(t,n,e){"use strict";e(131);var r,i=(r=e(303))&&r.__esModule?r:{default:r};i.default._babelPolyfill&&"undefined"!=typeof console&&console.warn&&console.warn("@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning."),i.default._babelPolyfill=!0},function(t,n,e){"use strict";e(132),e(275),e(277),e(280),e(282),e(284),e(286),e(288),e(290),e(292),e(294),e(296),e(298),e(302)},function(t,n,e){e(133),e(136),e(137),e(138),e(139),e(140),e(141),e(142),e(143),e(144),e(145),e(146),e(147),e(148),e(149),e(150),e(151),e(152),e(153),e(154),e(155),e(156),e(157),e(158),e(159),e(160),e(161),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(171),e(172),e(173),e(174),e(175),e(176),e(177),e(179),e(180),e(181),e(182),e(183),e(184),e(185),e(186),e(187),e(188),e(189),e(190),e(191),e(192),e(193),e(194),e(195),e(196),e(197),e(198),e(199),e(200),e(201),e(202),e(203),e(204),e(205),e(206),e(207),e(208),e(209),e(210),e(211),e(212),e(214),e(215),e(217),e(218),e(219),e(220),e(221),e(222),e(223),e(225),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(82),e(238),e(116),e(239),e(117),e(240),e(241),e(242),e(243),e(118),e(246),e(247),e(248),e(249),e(250),e(251),e(252),e(253),e(254),e(255),e(256),e(257),e(258),e(259),e(260),e(261),e(262),e(263),e(264),e(265),e(266),e(267),e(268),e(269),e(270),e(271),e(272),e(273),e(274),t.exports=e(7)},function(t,n,e){"use strict";var r=e(1),i=e(13),o=e(8),u=e(0),a=e(11),c=e(29).KEY,s=e(2),f=e(50),l=e(40),h=e(31),d=e(5),p=e(63),v=e(97),g=e(135),y=e(53),m=e(3),b=e(4),S=e(10),w=e(15),_=e(28),M=e(30),x=e(35),P=e(100),O=e(22),A=e(52),F=e(9),E=e(33),N=O.f,R=F.f,k=P.f,T=r.Symbol,I=r.JSON,j=I&&I.stringify,L=d("_hidden"),B=d("toPrimitive"),C={}.propertyIsEnumerable,W=f("symbol-registry"),V=f("symbols"),G=f("op-symbols"),D=Object.prototype,U="function"==typeof T&&!!A.f,z=r.QObject,q=!z||!z.prototype||!z.prototype.findChild,K=o&&s((function(){return 7!=x(R({},"a",{get:function(){return R(this,"a",{value:7}).a}})).a}))?function(t,n,e){var r=N(D,n);r&&delete D[n],R(t,n,e),r&&t!==D&&R(D,n,r)}:R,Y=function(t){var n=V[t]=x(T.prototype);return n._k=t,n},Q=U&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},H=function(t,n,e){return t===D&&H(G,n,e),m(t),n=_(n,!0),m(e),i(V,n)?(e.enumerable?(i(t,L)&&t[L][n]&&(t[L][n]=!1),e=x(e,{enumerable:M(0,!1)})):(i(t,L)||R(t,L,M(1,{})),t[L][n]=!0),K(t,n,e)):R(t,n,e)},J=function(t,n){m(t);for(var e,r=g(n=w(n)),i=0,o=r.length;o>i;)H(t,e=r[i++],n[e]);return t},X=function(t){var n=C.call(this,t=_(t,!0));return!(this===D&&i(V,t)&&!i(G,t))&&(!(n||!i(this,t)||!i(V,t)||i(this,L)&&this[L][t])||n)},Z=function(t,n){if(t=w(t),n=_(n,!0),t!==D||!i(V,n)||i(G,n)){var e=N(t,n);return!e||!i(V,n)||i(t,L)&&t[L][n]||(e.enumerable=!0),e}},$=function(t){for(var n,e=k(w(t)),r=[],o=0;e.length>o;)i(V,n=e[o++])||n==L||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===D,r=k(e?G:w(t)),o=[],u=0;r.length>u;)!i(V,n=r[u++])||e&&!i(D,n)||o.push(V[n]);return o};U||(a((T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=h(arguments.length>0?arguments[0]:void 0),n=function(e){this===D&&n.call(G,e),i(this,L)&&i(this[L],t)&&(this[L][t]=!1),K(this,t,M(1,e))};return o&&q&&K(D,t,{configurable:!0,set:n}),Y(t)}).prototype,"toString",(function(){return this._k})),O.f=Z,F.f=H,e(36).f=P.f=$,e(47).f=X,A.f=tt,o&&!e(32)&&a(D,"propertyIsEnumerable",X,!0),p.f=function(t){return Y(d(t))}),u(u.G+u.W+u.F*!U,{Symbol:T});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),et=0;nt.length>et;)d(nt[et++]);for(var rt=E(d.store),it=0;rt.length>it;)v(rt[it++]);u(u.S+u.F*!U,"Symbol",{for:function(t){return i(W,t+="")?W[t]:W[t]=T(t)},keyFor:function(t){if(!Q(t))throw TypeError(t+" is not a symbol!");for(var n in W)if(W[n]===t)return n},useSetter:function(){q=!0},useSimple:function(){q=!1}}),u(u.S+u.F*!U,"Object",{create:function(t,n){return void 0===n?x(t):J(x(t),n)},defineProperty:H,defineProperties:J,getOwnPropertyDescriptor:Z,getOwnPropertyNames:$,getOwnPropertySymbols:tt});var ot=s((function(){A.f(1)}));u(u.S+u.F*ot,"Object",{getOwnPropertySymbols:function(t){return A.f(S(t))}}),I&&u(u.S+u.F*(!U||s((function(){var t=T();return"[null]"!=j([t])||"{}"!=j({a:t})||"{}"!=j(Object(t))}))),"JSON",{stringify:function(t){for(var n,e,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);if(e=n=r[1],(b(n)||void 0!==t)&&!Q(t))return y(n)||(n=function(t,n){if("function"==typeof e&&(n=e.call(this,t,n)),!Q(n))return n}),r[1]=n,j.apply(I,r)}}),T.prototype[B]||e(14)(T.prototype,B,T.prototype.valueOf),l(T,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,n,e){t.exports=e(50)("native-function-to-string",Function.toString)},function(t,n,e){var r=e(33),i=e(52),o=e(47);t.exports=function(t){var n=r(t),e=i.f;if(e)for(var u,a=e(t),c=o.f,s=0;a.length>s;)c.call(t,u=a[s++])&&n.push(u);return n}},function(t,n,e){var r=e(0);r(r.S,"Object",{create:e(35)})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),"Object",{defineProperty:e(9).f})},function(t,n,e){var r=e(0);r(r.S+r.F*!e(8),"Object",{defineProperties:e(99)})},function(t,n,e){var r=e(15),i=e(22).f;e(23)("getOwnPropertyDescriptor",(function(){return function(t,n){return i(r(t),n)}}))},function(t,n,e){var r=e(10),i=e(37);e(23)("getPrototypeOf",(function(){return function(t){return i(r(t))}}))},function(t,n,e){var r=e(10),i=e(33);e(23)("keys",(function(){return function(t){return i(r(t))}}))},function(t,n,e){e(23)("getOwnPropertyNames",(function(){return e(100).f}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)("freeze",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)("seal",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4),i=e(29).onFreeze;e(23)("preventExtensions",(function(t){return function(n){return t&&r(n)?t(i(n)):n}}))},function(t,n,e){var r=e(4);e(23)("isFrozen",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)("isSealed",(function(t){return function(n){return!r(n)||!!t&&t(n)}}))},function(t,n,e){var r=e(4);e(23)("isExtensible",(function(t){return function(n){return!!r(n)&&(!t||t(n))}}))},function(t,n,e){var r=e(0);r(r.S+r.F,"Object",{assign:e(101)})},function(t,n,e){var r=e(0);r(r.S,"Object",{is:e(102)})},function(t,n,e){var r=e(0);r(r.S,"Object",{setPrototypeOf:e(67).set})},function(t,n,e){"use strict";var r=e(48),i={};i[e(5)("toStringTag")]="z",i+""!="[object z]"&&e(11)(Object.prototype,"toString",(function(){return"[object "+r(this)+"]"}),!0)},function(t,n,e){var r=e(0);r(r.P,"Function",{bind:e(103)})},function(t,n,e){var r=e(9).f,i=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in i||e(8)&&r(i,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(t){return""}}})},function(t,n,e){"use strict";var r=e(4),i=e(37),o=e(5)("hasInstance"),u=Function.prototype;o in u||e(9).f(u,o,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(0),i=e(105);r(r.G+r.F*(parseInt!=i),{parseInt:i})},function(t,n,e){var r=e(0),i=e(106);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(t,n,e){"use strict";var r=e(1),i=e(13),o=e(25),u=e(69),a=e(28),c=e(2),s=e(36).f,f=e(22).f,l=e(9).f,h=e(41).trim,d=r.Number,p=d,v=d.prototype,g="Number"==o(e(35)(v)),y="trim"in String.prototype,m=function(t){var n=a(t,!1);if("string"==typeof n&&n.length>2){var e,r,i,o=(n=y?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(e=n.charCodeAt(2))||120===e)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+n}for(var u,c=n.slice(2),s=0,f=c.length;si)return NaN;return parseInt(c,r)}}return+n};if(!d(" 0o1")||!d("0b1")||d("+0x1")){d=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof d&&(g?c((function(){v.valueOf.call(e)})):"Number"!=o(e))?u(new p(m(n)),e,d):m(n)};for(var b,S=e(8)?s(p):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;S.length>w;w++)i(p,b=S[w])&&!i(d,b)&&l(d,b,f(p,b));d.prototype=v,v.constructor=d,e(11)(r,"Number",d)}},function(t,n,e){"use strict";var r=e(0),i=e(21),o=e(107),u=e(70),a=1..toFixed,c=Math.floor,s=[0,0,0,0,0,0],f="Number.toFixed: incorrect invocation!",l=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*s[e],s[e]=r%1e7,r=c(r/1e7)},h=function(t){for(var n=6,e=0;--n>=0;)e+=s[n],s[n]=c(e/t),e=e%t*1e7},d=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==s[t]){var e=String(s[t]);n=""===n?e:n+u.call("0",7-e.length)+e}return n},p=function(t,n,e){return 0===n?e:n%2==1?p(t,n-1,e*t):p(t*t,n/2,e)};r(r.P+r.F*(!!a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!e(2)((function(){a.call({})}))),"Number",{toFixed:function(t){var n,e,r,a,c=o(this,f),s=i(t),v="",g="0";if(s<0||s>20)throw RangeError(f);if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(v="-",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*p(2,69,1))-69)<0?c*p(2,-n,1):c/p(2,n,1),e*=4503599627370496,(n=52-n)>0){for(l(0,e),r=s;r>=7;)l(1e7,0),r-=7;for(l(p(10,r,1),0),r=n-1;r>=23;)h(1<<23),r-=23;h(1<0?v+((a=g.length)<=s?"0."+u.call("0",s-a)+g:g.slice(0,a-s)+"."+g.slice(a-s)):v+g}})},function(t,n,e){"use strict";var r=e(0),i=e(2),o=e(107),u=1..toPrecision;r(r.P+r.F*(i((function(){return"1"!==u.call(1,void 0)}))||!i((function(){u.call({})}))),"Number",{toPrecision:function(t){var n=o(this,"Number#toPrecision: incorrect invocation!");return void 0===t?u.call(n):u.call(n,t)}})},function(t,n,e){var r=e(0);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,n,e){var r=e(0),i=e(1).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},function(t,n,e){var r=e(0);r(r.S,"Number",{isInteger:e(108)})},function(t,n,e){var r=e(0);r(r.S,"Number",{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(0),i=e(108),o=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,e){var r=e(0);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){var r=e(0);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(0),i=e(106);r(r.S+r.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,n,e){var r=e(0),i=e(105);r(r.S+r.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,n,e){var r=e(0),i=e(109),o=Math.sqrt,u=Math.acosh;r(r.S+r.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,e){var r=e(0),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),"Math",{asinh:function t(n){return isFinite(n=+n)&&0!=n?n<0?-t(-n):Math.log(n+Math.sqrt(n*n+1)):n}})},function(t,n,e){var r=e(0),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,e){var r=e(0),i=e(71);r(r.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,e){var r=e(0);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,e){var r=e(0),i=Math.exp;r(r.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,n,e){var r=e(0),i=e(72);r(r.S+r.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,n,e){var r=e(0);r(r.S,"Math",{fround:e(178)})},function(t,n,e){var r=e(71),i=Math.pow,o=i(2,-52),u=i(2,-23),a=i(2,127)*(2-u),c=i(2,-126);t.exports=Math.fround||function(t){var n,e,i=Math.abs(t),s=r(t);return ia||e!=e?s*(1/0):s*e}},function(t,n,e){var r=e(0),i=Math.abs;r(r.S,"Math",{hypot:function(t,n){for(var e,r,o=0,u=0,a=arguments.length,c=0;u0?(r=e/c)*r:e;return c===1/0?1/0:c*Math.sqrt(o)}})},function(t,n,e){var r=e(0),i=Math.imul;r(r.S+r.F*e(2)((function(){return-5!=i(4294967295,5)||2!=i.length})),"Math",{imul:function(t,n){var e=+t,r=+n,i=65535&e,o=65535&r;return 0|i*o+((65535&e>>>16)*o+i*(65535&r>>>16)<<16>>>0)}})},function(t,n,e){var r=e(0);r(r.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,n,e){var r=e(0);r(r.S,"Math",{log1p:e(109)})},function(t,n,e){var r=e(0);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,n,e){var r=e(0);r(r.S,"Math",{sign:e(71)})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S+r.F*e(2)((function(){return-2e-17!=!Math.sinh(-2e-17)})),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,e){var r=e(0),i=e(72),o=Math.exp;r(r.S,"Math",{tanh:function(t){var n=i(t=+t),e=i(-t);return n==1/0?1:e==1/0?-1:(n-e)/(o(t)+o(-t))}})},function(t,n,e){var r=e(0);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,e){var r=e(0),i=e(34),o=String.fromCharCode,u=String.fromCodePoint;r(r.S+r.F*(!!u&&1!=u.length),"String",{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,u=0;r>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+" is not a valid code point");e.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return e.join("")}})},function(t,n,e){var r=e(0),i=e(15),o=e(6);r(r.S,"String",{raw:function(t){for(var n=i(t.raw),e=o(n.length),r=arguments.length,u=[],a=0;e>a;)u.push(String(n[a++])),a=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})}))},function(t,n,e){"use strict";var r=e(0),i=e(73)(!1);r(r.P,"String",{codePointAt:function(t){return i(this,t)}})},function(t,n,e){"use strict";var r=e(0),i=e(6),o=e(75),u="".endsWith;r(r.P+r.F*e(77)("endsWith"),"String",{endsWith:function(t){var n=o(this,t,"endsWith"),e=arguments.length>1?arguments[1]:void 0,r=i(n.length),a=void 0===e?r:Math.min(i(e),r),c=String(t);return u?u.call(n,c,a):n.slice(a-c.length,a)===c}})},function(t,n,e){"use strict";var r=e(0),i=e(75);r(r.P+r.F*e(77)("includes"),"String",{includes:function(t){return!!~i(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(0);r(r.P,"String",{repeat:e(70)})},function(t,n,e){"use strict";var r=e(0),i=e(6),o=e(75),u="".startsWith;r(r.P+r.F*e(77)("startsWith"),"String",{startsWith:function(t){var n=o(this,t,"startsWith"),e=i(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return u?u.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){"use strict";e(12)("anchor",(function(t){return function(n){return t(this,"a","name",n)}}))},function(t,n,e){"use strict";e(12)("big",(function(t){return function(){return t(this,"big","","")}}))},function(t,n,e){"use strict";e(12)("blink",(function(t){return function(){return t(this,"blink","","")}}))},function(t,n,e){"use strict";e(12)("bold",(function(t){return function(){return t(this,"b","","")}}))},function(t,n,e){"use strict";e(12)("fixed",(function(t){return function(){return t(this,"tt","","")}}))},function(t,n,e){"use strict";e(12)("fontcolor",(function(t){return function(n){return t(this,"font","color",n)}}))},function(t,n,e){"use strict";e(12)("fontsize",(function(t){return function(n){return t(this,"font","size",n)}}))},function(t,n,e){"use strict";e(12)("italics",(function(t){return function(){return t(this,"i","","")}}))},function(t,n,e){"use strict";e(12)("link",(function(t){return function(n){return t(this,"a","href",n)}}))},function(t,n,e){"use strict";e(12)("small",(function(t){return function(){return t(this,"small","","")}}))},function(t,n,e){"use strict";e(12)("strike",(function(t){return function(){return t(this,"strike","","")}}))},function(t,n,e){"use strict";e(12)("sub",(function(t){return function(){return t(this,"sub","","")}}))},function(t,n,e){"use strict";e(12)("sup",(function(t){return function(){return t(this,"sup","","")}}))},function(t,n,e){var r=e(0);r(r.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,n,e){"use strict";var r=e(0),i=e(10),o=e(28);r(r.P+r.F*e(2)((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})})),"Date",{toJSON:function(t){var n=i(this),e=o(n);return"number"!=typeof e||isFinite(e)?n.toISOString():null}})},function(t,n,e){var r=e(0),i=e(213);r(r.P+r.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(t,n,e){"use strict";var r=e(2),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:"0"+t};t.exports=r((function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-5e13-1))}))||!r((function(){o.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),e=t.getUTCMilliseconds(),r=n<0?"-":n>9999?"+":"";return r+("00000"+Math.abs(n)).slice(r?-6:-4)+"-"+u(t.getUTCMonth()+1)+"-"+u(t.getUTCDate())+"T"+u(t.getUTCHours())+":"+u(t.getUTCMinutes())+":"+u(t.getUTCSeconds())+"."+(e>99?e:"0"+u(e))+"Z"}:o},function(t,n,e){var r=Date.prototype,i=r.toString,o=r.getTime;new Date(NaN)+""!="Invalid Date"&&e(11)(r,"toString",(function(){var t=o.call(this);return t==t?i.call(this):"Invalid Date"}))},function(t,n,e){var r=e(5)("toPrimitive"),i=Date.prototype;r in i||e(14)(i,r,e(216))},function(t,n,e){"use strict";var r=e(3),i=e(28);t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return i(r(this),"number"!=t)}},function(t,n,e){var r=e(0);r(r.S,"Array",{isArray:e(53)})},function(t,n,e){"use strict";var r=e(19),i=e(0),o=e(10),u=e(111),a=e(78),c=e(6),s=e(79),f=e(80);i(i.S+i.F*!e(54)((function(t){Array.from(t)})),"Array",{from:function(t){var n,e,i,l,h=o(t),d="function"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,g=void 0!==v,y=0,m=f(h);if(g&&(v=r(v,p>2?arguments[2]:void 0,2)),null==m||d==Array&&a(m))for(e=new d(n=c(h.length));n>y;y++)s(e,y,g?v(h[y],y):h[y]);else for(l=m.call(h),e=new d;!(i=l.next()).done;y++)s(e,y,g?u(l,v,[i.value,y],!0):i.value);return e.length=y,e}})},function(t,n,e){"use strict";var r=e(0),i=e(79);r(r.S+r.F*e(2)((function(){function t(){}return!(Array.of.call(t)instanceof t)})),"Array",{of:function(){for(var t=0,n=arguments.length,e=new("function"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){"use strict";var r=e(0),i=e(15),o=[].join;r(r.P+r.F*(e(46)!=Object||!e(16)(o)),"Array",{join:function(t){return o.call(i(this),void 0===t?",":t)}})},function(t,n,e){"use strict";var r=e(0),i=e(66),o=e(25),u=e(34),a=e(6),c=[].slice;r(r.P+r.F*e(2)((function(){i&&c.call(i)})),"Array",{slice:function(t,n){var e=a(this.length),r=o(this);if(n=void 0===n?e:n,"Array"==r)return c.call(this,t,n);for(var i=u(t,e),s=u(n,e),f=a(s-i),l=new Array(f),h=0;h1&&(r=Math.min(r,o(arguments[1]))),r<0&&(r=e+r);r>=0;r--)if(r in n&&n[r]===t)return r||0;return-1}})},function(t,n,e){var r=e(0);r(r.P,"Array",{copyWithin:e(114)}),e(38)("copyWithin")},function(t,n,e){var r=e(0);r(r.P,"Array",{fill:e(81)}),e(38)("fill")},function(t,n,e){"use strict";var r=e(0),i=e(24)(5),o=!0;"find"in[]&&Array(1).find((function(){o=!1})),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)("find")},function(t,n,e){"use strict";var r=e(0),i=e(24)(6),o="findIndex",u=!0;o in[]&&Array(1)[o]((function(){u=!1})),r(r.P+r.F*u,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)(o)},function(t,n,e){e(43)("Array")},function(t,n,e){var r=e(1),i=e(69),o=e(9).f,u=e(36).f,a=e(76),c=e(55),s=r.RegExp,f=s,l=s.prototype,h=/a/g,d=/a/g,p=new s(h)!==h;if(e(8)&&(!p||e(2)((function(){return d[e(5)("match")]=!1,s(h)!=h||s(d)==d||"/a/i"!=s(h,"i")})))){s=function(t,n){var e=this instanceof s,r=a(t),o=void 0===n;return!e&&r&&t.constructor===s&&o?t:i(p?new f(r&&!o?t.source:t,n):f((r=t instanceof s)?t.source:t,r&&o?c.call(t):n),e?this:l,s)};for(var v=function(t){t in s||o(s,t,{configurable:!0,get:function(){return f[t]},set:function(n){f[t]=n}})},g=u(f),y=0;g.length>y;)v(g[y++]);l.constructor=s,s.prototype=l,e(11)(r,"RegExp",s)}e(43)("RegExp")},function(t,n,e){"use strict";e(117);var r=e(3),i=e(55),o=e(8),u=/./.toString,a=function(t){e(11)(RegExp.prototype,"toString",t,!0)};e(2)((function(){return"/a/b"!=u.call({source:"a",flags:"b"})}))?a((function(){var t=r(this);return"/".concat(t.source,"/","flags"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)})):"toString"!=u.name&&a((function(){return u.call(this)}))},function(t,n,e){"use strict";var r=e(3),i=e(6),o=e(84),u=e(56);e(57)("match",1,(function(t,n,e,a){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=a(e,t,this);if(n.done)return n.value;var c=r(t),s=String(this);if(!c.global)return u(c,s);var f=c.unicode;c.lastIndex=0;for(var l,h=[],d=0;null!==(l=u(c,s));){var p=String(l[0]);h[d]=p,""===p&&(c.lastIndex=o(s,i(c.lastIndex),f)),d++}return 0===d?null:h}]}))},function(t,n,e){"use strict";var r=e(3),i=e(10),o=e(6),u=e(21),a=e(84),c=e(56),s=Math.max,f=Math.min,l=Math.floor,h=/\$([$&`']|\d\d?|<[^>]*>)/g,d=/\$([$&`']|\d\d?)/g;e(57)("replace",2,(function(t,n,e,p){return[function(r,i){var o=t(this),u=null==r?void 0:r[n];return void 0!==u?u.call(r,o,i):e.call(String(o),r,i)},function(t,n){var i=p(e,t,this,n);if(i.done)return i.value;var l=r(t),h=String(this),d="function"==typeof n;d||(n=String(n));var g=l.global;if(g){var y=l.unicode;l.lastIndex=0}for(var m=[];;){var b=c(l,h);if(null===b)break;if(m.push(b),!g)break;""===String(b[0])&&(l.lastIndex=a(h,o(l.lastIndex),y))}for(var S,w="",_=0,M=0;M=_&&(w+=h.slice(_,P)+N,_=P+x.length)}return w+h.slice(_)}];function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==u&&(u=i(u),f=h),e.call(a,f,(function(e,i){var a;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(c);case"<":a=u[i.slice(1,-1)];break;default:var f=+i;if(0===f)return e;if(f>s){var h=l(f/10);return 0===h?e:h<=s?void 0===o[h-1]?i.charAt(1):o[h-1]+i.charAt(1):e}a=o[f-1]}return void 0===a?"":a}))}}))},function(t,n,e){"use strict";var r=e(3),i=e(102),o=e(56);e(57)("search",1,(function(t,n,e,u){return[function(e){var r=t(this),i=null==e?void 0:e[n];return void 0!==i?i.call(e,r):new RegExp(e)[n](String(r))},function(t){var n=u(e,t,this);if(n.done)return n.value;var a=r(t),c=String(this),s=a.lastIndex;i(s,0)||(a.lastIndex=0);var f=o(a,c);return i(a.lastIndex,s)||(a.lastIndex=s),null===f?-1:f.index}]}))},function(t,n,e){"use strict";var r=e(76),i=e(3),o=e(49),u=e(84),a=e(6),c=e(56),s=e(83),f=e(2),l=Math.min,h=[].push,d=!f((function(){RegExp(4294967295,"y")}));e(57)("split",2,(function(t,n,e,f){var p;return p="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=String(this);if(void 0===t&&0===n)return[];if(!r(t))return e.call(i,t,n);for(var o,u,a,c=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),l=0,d=void 0===n?4294967295:n>>>0,p=new RegExp(t.source,f+"g");(o=s.call(p,i))&&!((u=p.lastIndex)>l&&(c.push(i.slice(l,o.index)),o.length>1&&o.index=d));)p.lastIndex===o.index&&p.lastIndex++;return l===i.length?!a&&p.test("")||c.push(""):c.push(i.slice(l)),c.length>d?c.slice(0,d):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,r){var i=t(this),o=null==e?void 0:e[n];return void 0!==o?o.call(e,i,r):p.call(String(i),e,r)},function(t,n){var r=f(p,t,this,n,p!==e);if(r.done)return r.value;var s=i(t),h=String(this),v=o(s,RegExp),g=s.unicode,y=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(d?"y":"g"),m=new v(d?s:"^(?:"+s.source+")",y),b=void 0===n?4294967295:n>>>0;if(0===b)return[];if(0===h.length)return null===c(m,h)?[h]:[];for(var S=0,w=0,_=[];w0?arguments[0]:void 0)}}),{get:function(t){var n=r.getEntry(i(this,"Map"),t);return n&&n.v},set:function(t,n){return r.def(i(this,"Map"),0===t?0:t,n)}},r,!0)},function(t,n,e){"use strict";var r=e(121),i=e(39);t.exports=e(60)("Set",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,"Set"),t=0===t?0:t,t)}},r)},function(t,n,e){"use strict";var r,i=e(1),o=e(24)(0),u=e(11),a=e(29),c=e(101),s=e(122),f=e(4),l=e(39),h=e(39),d=!i.ActiveXObject&&"ActiveXObject"in i,p=a.getWeak,v=Object.isExtensible,g=s.ufstore,y=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(t){if(f(t)){var n=p(t);return!0===n?g(l(this,"WeakMap")).get(t):n?n[this._i]:void 0}},set:function(t,n){return s.def(l(this,"WeakMap"),t,n)}},b=t.exports=e(60)("WeakMap",y,m,s,!0,!0);h&&d&&(c((r=s.getConstructor(y,"WeakMap")).prototype,m),a.NEED=!0,o(["delete","has","get","set"],(function(t){var n=b.prototype,e=n[t];u(n,t,(function(n,i){if(f(n)&&!v(n)){this._f||(this._f=new r);var o=this._f[t](n,i);return"set"==t?this:o}return e.call(this,n,i)}))})))},function(t,n,e){"use strict";var r=e(122),i=e(39);e(60)("WeakSet",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(i(this,"WeakSet"),t,!0)}},r,!1,!0)},function(t,n,e){"use strict";var r=e(0),i=e(61),o=e(86),u=e(3),a=e(34),c=e(6),s=e(4),f=e(1).ArrayBuffer,l=e(49),h=o.ArrayBuffer,d=o.DataView,p=i.ABV&&f.isView,v=h.prototype.slice,g=i.VIEW;r(r.G+r.W+r.F*(f!==h),{ArrayBuffer:h}),r(r.S+r.F*!i.CONSTR,"ArrayBuffer",{isView:function(t){return p&&p(t)||s(t)&&g in t}}),r(r.P+r.U+r.F*e(2)((function(){return!new h(2).slice(1,void 0).byteLength})),"ArrayBuffer",{slice:function(t,n){if(void 0!==v&&void 0===n)return v.call(u(this),t);for(var e=u(this).byteLength,r=a(t,e),i=a(void 0===n?e:n,e),o=new(l(this,h))(c(i-r)),s=new d(this),f=new d(o),p=0;r=n.length)return{value:void 0,done:!0}}while(!((t=n[this._i++])in this._t));return{value:t,done:!1}})),r(r.S,"Reflect",{enumerate:function(t){return new o(t)}})},function(t,n,e){var r=e(22),i=e(37),o=e(13),u=e(0),a=e(4),c=e(3);u(u.S,"Reflect",{get:function t(n,e){var u,s,f=arguments.length<3?n:arguments[2];return c(n)===f?n[e]:(u=r.f(n,e))?o(u,"value")?u.value:void 0!==u.get?u.get.call(f):void 0:a(s=i(n))?t(s,e,f):void 0}})},function(t,n,e){var r=e(22),i=e(0),o=e(3);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,n){return r.f(o(t),n)}})},function(t,n,e){var r=e(0),i=e(37),o=e(3);r(r.S,"Reflect",{getPrototypeOf:function(t){return i(o(t))}})},function(t,n,e){var r=e(0);r(r.S,"Reflect",{has:function(t,n){return n in t}})},function(t,n,e){var r=e(0),i=e(3),o=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,n,e){var r=e(0);r(r.S,"Reflect",{ownKeys:e(124)})},function(t,n,e){var r=e(0),i=e(3),o=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,n,e){var r=e(9),i=e(22),o=e(37),u=e(13),a=e(0),c=e(30),s=e(3),f=e(4);a(a.S,"Reflect",{set:function t(n,e,a){var l,h,d=arguments.length<4?n:arguments[3],p=i.f(s(n),e);if(!p){if(f(h=o(n)))return t(h,e,a,d);p=c(0)}if(u(p,"value")){if(!1===p.writable||!f(d))return!1;if(l=i.f(d,e)){if(l.get||l.set||!1===l.writable)return!1;l.value=a,r.f(d,e,l)}else r.f(d,e,c(0,a));return!0}return void 0!==p.set&&(p.set.call(d,a),!0)}})},function(t,n,e){var r=e(0),i=e(67);i&&r(r.S,"Reflect",{setPrototypeOf:function(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(t){return!1}}})},function(t,n,e){e(276),t.exports=e(7).Array.includes},function(t,n,e){"use strict";var r=e(0),i=e(51)(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),e(38)("includes")},function(t,n,e){e(278),t.exports=e(7).Array.flatMap},function(t,n,e){"use strict";var r=e(0),i=e(279),o=e(10),u=e(6),a=e(20),c=e(112);r(r.P,"Array",{flatMap:function(t){var n,e,r=o(this);return a(t),n=u(r.length),e=c(r,0),i(e,r,r,n,0,1,t,arguments[1]),e}}),e(38)("flatMap")},function(t,n,e){"use strict";var r=e(53),i=e(4),o=e(6),u=e(19),a=e(5)("isConcatSpreadable");t.exports=function t(n,e,c,s,f,l,h,d){for(var p,v,g=f,y=0,m=!!h&&u(h,d,3);y0)g=t(n,e,p,o(p.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();n[g]=p}g++}y++}return g}},function(t,n,e){e(281),t.exports=e(7).String.padStart},function(t,n,e){"use strict";var r=e(0),i=e(125),o=e(59),u=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o);r(r.P+r.F*u,"String",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,n,e){e(283),t.exports=e(7).String.padEnd},function(t,n,e){"use strict";var r=e(0),i=e(125),o=e(59),u=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o);r(r.P+r.F*u,"String",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,n,e){e(285),t.exports=e(7).String.trimLeft},function(t,n,e){"use strict";e(41)("trimLeft",(function(t){return function(){return t(this,1)}}),"trimStart")},function(t,n,e){e(287),t.exports=e(7).String.trimRight},function(t,n,e){"use strict";e(41)("trimRight",(function(t){return function(){return t(this,2)}}),"trimEnd")},function(t,n,e){e(289),t.exports=e(63).f("asyncIterator")},function(t,n,e){e(97)("asyncIterator")},function(t,n,e){e(291),t.exports=e(7).Object.getOwnPropertyDescriptors},function(t,n,e){var r=e(0),i=e(124),o=e(15),u=e(22),a=e(79);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var n,e,r=o(t),c=u.f,s=i(r),f={},l=0;s.length>l;)void 0!==(e=c(r,n=s[l++]))&&a(f,n,e);return f}})},function(t,n,e){e(293),t.exports=e(7).Object.values},function(t,n,e){var r=e(0),i=e(126)(!1);r(r.S,"Object",{values:function(t){return i(t)}})},function(t,n,e){e(295),t.exports=e(7).Object.entries},function(t,n,e){var r=e(0),i=e(126)(!0);r(r.S,"Object",{entries:function(t){return i(t)}})},function(t,n,e){"use strict";e(118),e(297),t.exports=e(7).Promise.finally},function(t,n,e){"use strict";var r=e(0),i=e(7),o=e(1),u=e(49),a=e(120);r(r.P+r.R,"Promise",{finally:function(t){var n=u(this,i.Promise||o.Promise),e="function"==typeof t;return this.then(e?function(e){return a(n,t()).then((function(){return e}))}:t,e?function(e){return a(n,t()).then((function(){throw e}))}:t)}})},function(t,n,e){e(299),e(300),e(301),t.exports=e(7)},function(t,n,e){var r=e(1),i=e(0),o=e(59),u=[].slice,a=/MSIE .\./.test(o),c=function(t){return function(n,e){var r=arguments.length>2,i=!!r&&u.call(arguments,2);return t(r?function(){("function"==typeof n?n:Function(n)).apply(this,i)}:n,e)}};i(i.G+i.B+i.F*a,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(t,n,e){var r=e(0),i=e(85);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,e){for(var r=e(82),i=e(33),o=e(11),u=e(1),a=e(14),c=e(42),s=e(5),f=s("iterator"),l=s("toStringTag"),h=c.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(d),v=0;v=0;--o){var u=this.tryEntries[o],a=u.completion;if("root"===u.tryLoc)return i("end");if(u.tryLoc<=this.prev){var c=r.call(u,"catchLoc"),s=r.call(u,"finallyLoc");if(c&&s){if(this.prev=0;--e){var i=this.tryEntries[e];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--n){var e=this.tryEntries[n];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),O(e),p}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.tryLoc===t){var r=e.completion;if("throw"===r.type){var i=r.arg;O(e)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:F(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=n),p}},t}(t.exports);try{regeneratorRuntime=r}catch(t){Function("r","regeneratorRuntime = r")(r)}},function(t,n,e){e(304),t.exports=e(127).global},function(t,n,e){var r=e(305);r(r.G,{global:e(87)})},function(t,n,e){var r=e(87),i=e(127),o=e(306),u=e(308),a=e(315),c=function(t,n,e){var s,f,l,h=t&c.F,d=t&c.G,p=t&c.S,v=t&c.P,g=t&c.B,y=t&c.W,m=d?i:i[n]||(i[n]={}),b=m.prototype,S=d?r:p?r[n]:(r[n]||{}).prototype;for(s in d&&(e=n),e)(f=!h&&S&&void 0!==S[s])&&a(m,s)||(l=f?S[s]:e[s],m[s]=d&&"function"!=typeof S[s]?e[s]:g&&f?o(l,r):y&&S[s]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n.prototype=t.prototype,n}(l):v&&"function"==typeof l?o(Function.call,l):l,v&&((m.virtual||(m.virtual={}))[s]=l,t&c.R&&b&&!b[s]&&u(b,s,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n,e){var r=e(307);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,i){return t.call(n,e,r,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n,e){var r=e(309),i=e(314);t.exports=e(89)?function(t,n,e){return r.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(310),i=e(311),o=e(313),u=Object.defineProperty;n.f=e(89)?Object.defineProperty:function(t,n,e){if(r(t),n=o(n,!0),r(e),i)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(88);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,n,e){t.exports=!e(89)&&!e(128)((function(){return 7!=Object.defineProperty(e(312)("div"),"a",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(88),i=e(87).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,e){var r=e(88);t.exports=function(t,n){if(!r(t))return t;var e,i;if(n&&"function"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;if("function"==typeof(e=t.valueOf)&&!r(i=e.call(t)))return i;if(!n&&"function"==typeof(e=t.toString)&&!r(i=e.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}}])})); \ No newline at end of file diff --git a/node_modules/bowser/bundled.js.gz b/node_modules/bowser/bundled.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..4b8194528e165af2e049d6cfa2d2c60a9784599a GIT binary patch literal 35085 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 z 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[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),o=Math.max(i,s),a=0,u=e.map([t,r],(function(t){var r=o-e.getVersionPrecision(t),n=t+new Array(r+1).join(".0");return e.map(n.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(n&&(a=o-Math.min(i,s)),o-=1;o>=a;){if(u[0][o]>u[1][o])return 1;if(u[0][o]===u[1][o]){if(o===a)return 0;o-=1}else if(u[0][o]1?i-1:0),o=1;o0){var o=Object.keys(r),u=a.default.find(o,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=a.default.find(o,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=a.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=a.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if("string"==typeof i)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(n=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(a.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e){return this.isBrowser(e)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\/(\d+(\.?_?\d+)+)/i,o=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=o,e.exports=t.default},93:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var o=[{test:[/Roku\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\//],describe:function(e){var t=i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return{name:s.OS_MAP.iOS,version:t}}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||i.default.getFirstMatch(/\bbb(\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=o,e.exports=t.default},94:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var o=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:s.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?) Version\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=o,e.exports=t.default},95:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var o=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=o,e.exports=t.default}})})); \ No newline at end of file diff --git a/node_modules/bowser/es5.js.gz b/node_modules/bowser/es5.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..13117643f591451cff05403021b7875627083a86 GIT binary patch literal 5711 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, + +export = Bowser; +export as namespace Bowser; + +declare namespace Bowser { + /** + * Creates a Parser instance + * @param {string} UA - User agent string + * @param {boolean} skipParsing + */ + + function getParser(UA: string, skipParsing?: boolean): Parser.Parser; + + /** + * Creates a Parser instance and runs Parser.getResult immediately + * @param UA - User agent string + * @returns {Parser.ParsedResult} + */ + + function parse(UA: string): Parser.ParsedResult; + + /** + * Constants exposed via bowser getters + */ + const BROWSER_MAP: Record; + const ENGINE_MAP: Record; + const OS_MAP: Record; + const PLATFORMS_MAP: Record; + + namespace Parser { + interface Parser { + constructor(UA: string, skipParsing?: boolean): Parser.Parser; + + /** + * Get parsed browser object + * @return {BrowserDetails} Browser's details + */ + + getBrowser(): BrowserDetails; + + /** + * Get browser's name + * @return {String} Browser's name or an empty string + */ + + getBrowserName(): string; + + /** + * Get browser's version + * @return {String} version of browser + */ + + getBrowserVersion(): string; + + /** + * Get OS + * @return {OSDetails} - OS Details + * + * @example + * this.getOS(); // { + * // name: 'macOS', + * // version: '10.11.12', + * // } + */ + + getOS(): OSDetails; + + /** + * Get OS name + * @param {Boolean} [toLowerCase] return lower-cased value + * @return {String} name of the OS — macOS, Windows, Linux, etc. + */ + + getOSName(toLowerCase?: boolean): string; + + /** + * Get OS version + * @return {String} full version with dots ('10.11.12', '5.6', etc) + */ + + getOSVersion(): string; + + /** + * Get parsed platform + * @returns {PlatformDetails} + */ + + getPlatform(): PlatformDetails; + + /** + * Get platform name + * @param {boolean} toLowerCase + */ + + getPlatformType(toLowerCase?: boolean): string; + + /** + * Get parsed engine + * @returns {EngineDetails} + */ + + getEngine(): EngineDetails; + + /** + * Get parsed result + * @return {ParsedResult} + */ + + getResult(): ParsedResult; + + /** + * Get UserAgent string of current Parser instance + * @return {String} User-Agent String of the current object + */ + + getUA(): string; + + /** + * Is anything? Check if the browser is called "anything", + * the OS called "anything" or the platform called "anything" + * @param {String} anything + * @returns {Boolean} + */ + + is(anything: any): boolean; + + /** + * Parse full information about the browser + */ + + parse(): void; + + /** + * Get parsed browser object + * @returns {BrowserDetails} + */ + + parseBrowser(): BrowserDetails; + + /** + * Get parsed engine + * @returns {EngineDetails} + */ + + parseEngine(): EngineDetails; + + /** + * Parse OS and save it to this.parsedResult.os + * @returns {OSDetails} + */ + + parseOS(): OSDetails; + + /** + * Get parsed platform + * @returns {PlatformDetails} + */ + + parsePlatform(): PlatformDetails; + + /** + * Check if parsed browser matches certain conditions + * + * @param {checkTree} checkTree It's one or two layered object, + * which can include a platform or an OS on the first layer + * and should have browsers specs on the bottom-laying layer + * + * @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not. + * Returns `undefined` when the browser is no described in the checkTree object. + * + * @example + * const browser = new Bowser(UA); + * if (browser.check({chrome: '>118.01.1322' })) + * // or with os + * if (browser.check({windows: { chrome: '>118.01.1322' } })) + * // or with platforms + * if (browser.check({desktop: { chrome: '>118.01.1322' } })) + */ + + satisfies(checkTree: checkTree): boolean | undefined; + + /** + * Check if the browser name equals the passed string + * @param browserName The string to compare with the browser name + * @param [includingAlias=false] The flag showing whether alias will be included into comparison + * @returns {boolean} + */ + + + isBrowser(browserName: string, includingAlias?: boolean): boolean; + + /** + * Check if any of the given values satifies `.is(anything)` + * @param {string[]} anythings + * @returns {boolean} true if at least one condition is satisfied, false otherwise. + */ + + some(anythings: string[]): boolean | undefined; + + /** + * Test a UA string for a regexp + * @param regex + * @returns {boolean} true if the regex matches the UA, false otherwise. + */ + + test(regex: RegExp): boolean; + } + + interface ParsedResult { + browser: BrowserDetails; + os: OSDetails; + platform: PlatformDetails; + engine: EngineDetails; + } + + interface Details { + name?: string; + version?: string; + } + + interface OSDetails extends Details { + versionName?: string; + } + + interface PlatformDetails { + type?: string; + vendor?: string; + model?: string; + } + + type BrowserDetails = Details; + type EngineDetails = Details; + + interface checkTree { + [key: string]: any; + } + } +} diff --git a/node_modules/bowser/jsdoc.json b/node_modules/bowser/jsdoc.json new file mode 100644 index 0000000..3ab6b9a --- /dev/null +++ b/node_modules/bowser/jsdoc.json @@ -0,0 +1,24 @@ +{ + "tags": { + "allowUnknownTags": true + }, + "source": { + "include": ["src", "README.md"], + "includePattern": ".js$", + "excludePattern": "(node_modules/|docs)" + }, + "plugins": [ + "plugins/markdown" + ], + "opts": { + "template": "node_modules/docdash", + "encoding": "utf8", + "destination": "docs/", + "recurse": true, + "verbose": true + }, + "templates": { + "cleverLinks": false, + "monospaceLinks": false + } +} diff --git a/node_modules/bowser/package.json b/node_modules/bowser/package.json new file mode 100644 index 0000000..00bac1f --- /dev/null +++ b/node_modules/bowser/package.json @@ -0,0 +1,116 @@ +{ + "_args": [ + [ + "bowser@2.9.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "bowser@2.9.0", + "_id": "bowser@2.9.0", + "_inBundle": false, + "_integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==", + "_location": "/bowser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "bowser@2.9.0", + "name": "bowser", + "escapedName": "bowser", + "rawSpec": "2.9.0", + "saveSpec": null, + "fetchSpec": "2.9.0" + }, + "_requiredBy": [ + "/helmet-csp" + ], + "_resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "_spec": "2.9.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Dustin Diaz", + "email": "dustin@dustindiaz.com", + "url": "http://dustindiaz.com" + }, + "ava": { + "require": [ + "@babel/register" + ] + }, + "browser": "es5.js", + "bugs": { + "url": "https://github.com/lancedikson/bowser/issues" + }, + "contributors": [ + { + "name": "Denis Demchenko", + "url": "http://twitter.com/lancedikson" + } + ], + "description": "Lightweight browser detector", + "devDependencies": { + "@babel/cli": "^7.8.3", + "@babel/core": "^7.8.0", + "@babel/polyfill": "^7.8.3", + "@babel/preset-env": "^7.8.2", + "@babel/register": "^7.8.3", + "ava": "^3.0.0", + "babel-eslint": "^10.0.3", + "babel-loader": "^8.0.6", + "babel-plugin-add-module-exports": "^1.0.2", + "babel-plugin-istanbul": "^6.0.0", + "compression-webpack-plugin": "^3.0.0", + "coveralls": "^3.0.6", + "docdash": "^1.1.1", + "eslint": "^6.5.1", + "eslint-config-airbnb-base": "^13.2.0", + "eslint-plugin-ava": "^10.0.0", + "eslint-plugin-import": "^2.18.2", + "gh-pages": "^2.1.1", + "jsdoc": "^3.6.3", + "nyc": "^15.0.0", + "sinon": "^8.0.0", + "testem": "^3.0.0", + "webpack": "^4.41.0", + "webpack-bundle-analyzer": "^3.5.2", + "webpack-cli": "^3.3.9", + "yamljs": "^0.3.0" + }, + "directories": { + "test": "test" + }, + "homepage": "https://github.com/lancedikson/bowser", + "keywords": [ + "browser", + "useragent", + "user-agent", + "parser", + "ua", + "detection", + "ender", + "sniff" + ], + "license": "MIT", + "main": "es5.js", + "module": "src/bowser.js", + "name": "bowser", + "repository": { + "type": "git", + "url": "git+https://github.com/lancedikson/bowser.git" + }, + "scripts": { + "build": "webpack --config webpack.config.js", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "deploy": "jsdoc -c jsdoc.json && gh-pages --dist docs --dest docs", + "generate-and-deploy-docs": "npm run generate-docs && gh-pages --dist docs --dest docs", + "generate-docs": "jsdoc -c jsdoc.json", + "lint": "eslint ./src", + "prepublishOnly": "npm run build", + "test": "nyc --reporter=html --reporter=text ava", + "test:watch": "ava --watch", + "testem": "testem", + "watch": "webpack --watch --config webpack.config.js" + }, + "types": "index.d.ts", + "version": "2.9.0" +} diff --git a/node_modules/bowser/src/bowser.js b/node_modules/bowser/src/bowser.js new file mode 100644 index 0000000..f79e6e0 --- /dev/null +++ b/node_modules/bowser/src/bowser.js @@ -0,0 +1,77 @@ +/*! + * Bowser - a browser detector + * https://github.com/lancedikson/bowser + * MIT License | (c) Dustin Diaz 2012-2015 + * MIT License | (c) Denis Demchenko 2015-2019 + */ +import Parser from './parser.js'; +import { + BROWSER_MAP, + ENGINE_MAP, + OS_MAP, + PLATFORMS_MAP, +} from './constants.js'; + +/** + * Bowser class. + * Keep it simple as much as it can be. + * It's supposed to work with collections of {@link Parser} instances + * rather then solve one-instance problems. + * All the one-instance stuff is located in Parser class. + * + * @class + * @classdesc Bowser is a static object, that provides an API to the Parsers + * @hideconstructor + */ +class Bowser { + /** + * Creates a {@link Parser} instance + * + * @param {String} UA UserAgent string + * @param {Boolean} [skipParsing=false] Will make the Parser postpone parsing until you ask it + * explicitly. Same as `skipParsing` for {@link Parser}. + * @returns {Parser} + * @throws {Error} when UA is not a String + * + * @example + * const parser = Bowser.getParser(window.navigator.userAgent); + * const result = parser.getResult(); + */ + static getParser(UA, skipParsing = false) { + if (typeof UA !== 'string') { + throw new Error('UserAgent should be a string'); + } + return new Parser(UA, skipParsing); + } + + /** + * Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately + * + * @param UA + * @return {ParsedResult} + * + * @example + * const result = Bowser.parse(window.navigator.userAgent); + */ + static parse(UA) { + return (new Parser(UA)).getResult(); + } + + static get BROWSER_MAP() { + return BROWSER_MAP; + } + + static get ENGINE_MAP() { + return ENGINE_MAP; + } + + static get OS_MAP() { + return OS_MAP; + } + + static get PLATFORMS_MAP() { + return PLATFORMS_MAP; + } +} + +export default Bowser; diff --git a/node_modules/bowser/src/constants.js b/node_modules/bowser/src/constants.js new file mode 100644 index 0000000..f335032 --- /dev/null +++ b/node_modules/bowser/src/constants.js @@ -0,0 +1,116 @@ +// NOTE: this list must be up-to-date with browsers listed in +// test/acceptance/useragentstrings.yml +export const BROWSER_ALIASES_MAP = { + 'Amazon Silk': 'amazon_silk', + 'Android Browser': 'android', + Bada: 'bada', + BlackBerry: 'blackberry', + Chrome: 'chrome', + Chromium: 'chromium', + Electron: 'electron', + Epiphany: 'epiphany', + Firefox: 'firefox', + Focus: 'focus', + Generic: 'generic', + 'Google Search': 'google_search', + Googlebot: 'googlebot', + 'Internet Explorer': 'ie', + 'K-Meleon': 'k_meleon', + Maxthon: 'maxthon', + 'Microsoft Edge': 'edge', + 'MZ Browser': 'mz', + 'NAVER Whale Browser': 'naver', + Opera: 'opera', + 'Opera Coast': 'opera_coast', + PhantomJS: 'phantomjs', + Puffin: 'puffin', + QupZilla: 'qupzilla', + QQ: 'qq', + QQLite: 'qqlite', + Safari: 'safari', + Sailfish: 'sailfish', + 'Samsung Internet for Android': 'samsung_internet', + SeaMonkey: 'seamonkey', + Sleipnir: 'sleipnir', + Swing: 'swing', + Tizen: 'tizen', + 'UC Browser': 'uc', + Vivaldi: 'vivaldi', + 'WebOS Browser': 'webos', + WeChat: 'wechat', + 'Yandex Browser': 'yandex', + Roku: 'roku', +}; + +export const BROWSER_MAP = { + amazon_silk: 'Amazon Silk', + android: 'Android Browser', + bada: 'Bada', + blackberry: 'BlackBerry', + chrome: 'Chrome', + chromium: 'Chromium', + electron: 'Electron', + epiphany: 'Epiphany', + firefox: 'Firefox', + focus: 'Focus', + generic: 'Generic', + googlebot: 'Googlebot', + google_search: 'Google Search', + ie: 'Internet Explorer', + k_meleon: 'K-Meleon', + maxthon: 'Maxthon', + edge: 'Microsoft Edge', + mz: 'MZ Browser', + naver: 'NAVER Whale Browser', + opera: 'Opera', + opera_coast: 'Opera Coast', + phantomjs: 'PhantomJS', + puffin: 'Puffin', + qupzilla: 'QupZilla', + qq: 'QQ Browser', + qqlite: 'QQ Browser Lite', + safari: 'Safari', + sailfish: 'Sailfish', + samsung_internet: 'Samsung Internet for Android', + seamonkey: 'SeaMonkey', + sleipnir: 'Sleipnir', + swing: 'Swing', + tizen: 'Tizen', + uc: 'UC Browser', + vivaldi: 'Vivaldi', + webos: 'WebOS Browser', + wechat: 'WeChat', + yandex: 'Yandex Browser', +}; + +export const PLATFORMS_MAP = { + tablet: 'tablet', + mobile: 'mobile', + desktop: 'desktop', + tv: 'tv', +}; + +export const OS_MAP = { + WindowsPhone: 'Windows Phone', + Windows: 'Windows', + MacOS: 'macOS', + iOS: 'iOS', + Android: 'Android', + WebOS: 'WebOS', + BlackBerry: 'BlackBerry', + Bada: 'Bada', + Tizen: 'Tizen', + Linux: 'Linux', + ChromeOS: 'Chrome OS', + PlayStation4: 'PlayStation 4', + Roku: 'Roku', +}; + +export const ENGINE_MAP = { + EdgeHTML: 'EdgeHTML', + Blink: 'Blink', + Trident: 'Trident', + Presto: 'Presto', + Gecko: 'Gecko', + WebKit: 'WebKit', +}; diff --git a/node_modules/bowser/src/parser-browsers.js b/node_modules/bowser/src/parser-browsers.js new file mode 100644 index 0000000..7fb4292 --- /dev/null +++ b/node_modules/bowser/src/parser-browsers.js @@ -0,0 +1,670 @@ +/** + * Browsers' descriptors + * + * The idea of descriptors is simple. You should know about them two simple things: + * 1. Every descriptor has a method or property called `test` and a `describe` method. + * 2. Order of descriptors is important. + * + * More details: + * 1. Method or property `test` serves as a way to detect whether the UA string + * matches some certain browser or not. The `describe` method helps to make a result + * object with params that show some browser-specific things: name, version, etc. + * 2. Order of descriptors is important because a Parser goes through them one by one + * in course. For example, if you insert Chrome's descriptor as the first one, + * more then a half of browsers will be described as Chrome, because they will pass + * the Chrome descriptor's test. + * + * Descriptor's `test` could be a property with an array of RegExps, where every RegExp + * will be applied to a UA string to test it whether it matches or not. + * If a descriptor has two or more regexps in the `test` array it tests them one by one + * with a logical sum operation. Parser stops if it has found any RegExp that matches the UA. + * + * Or `test` could be a method. In that case it gets a Parser instance and should + * return true/false to get the Parser know if this browser descriptor matches the UA or not. + */ + +import Utils from './utils.js'; + +const commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i; + +const browsersList = [ + /* Googlebot */ + { + test: [/googlebot/i], + describe(ua) { + const browser = { + name: 'Googlebot', + }; + const version = Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Opera < 13.0 */ + { + test: [/opera/i], + describe(ua) { + const browser = { + name: 'Opera', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Opera > 13.0 */ + { + test: [/opr\/|opios/i], + describe(ua) { + const browser = { + name: 'Opera', + }; + const version = Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/SamsungBrowser/i], + describe(ua) { + const browser = { + name: 'Samsung Internet for Android', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/Whale/i], + describe(ua) { + const browser = { + name: 'NAVER Whale Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/MZBrowser/i], + describe(ua) { + const browser = { + name: 'MZ Browser', + }; + const version = Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/focus/i], + describe(ua) { + const browser = { + name: 'Focus', + }; + const version = Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/swing/i], + describe(ua) { + const browser = { + name: 'Swing', + }; + const version = Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/coast/i], + describe(ua) { + const browser = { + name: 'Opera Coast', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/yabrowser/i], + describe(ua) { + const browser = { + name: 'Yandex Browser', + }; + const version = Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/ucbrowser/i], + describe(ua) { + const browser = { + name: 'UC Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/Maxthon|mxios/i], + describe(ua) { + const browser = { + name: 'Maxthon', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/epiphany/i], + describe(ua) { + const browser = { + name: 'Epiphany', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/puffin/i], + describe(ua) { + const browser = { + name: 'Puffin', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/sleipnir/i], + describe(ua) { + const browser = { + name: 'Sleipnir', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/k-meleon/i], + describe(ua) { + const browser = { + name: 'K-Meleon', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/micromessenger/i], + describe(ua) { + const browser = { + name: 'WeChat', + }; + const version = Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/qqbrowser/i], + describe(ua) { + const browser = { + name: (/qqbrowserlite/i).test(ua) ? 'QQ Browser Lite' : 'QQ Browser', + }; + const version = Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/msie|trident/i], + describe(ua) { + const browser = { + name: 'Internet Explorer', + }; + const version = Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/\sedg\//i], + describe(ua) { + const browser = { + name: 'Microsoft Edge', + }; + + const version = Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/edg([ea]|ios)/i], + describe(ua) { + const browser = { + name: 'Microsoft Edge', + }; + + const version = Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/vivaldi/i], + describe(ua) { + const browser = { + name: 'Vivaldi', + }; + const version = Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/seamonkey/i], + describe(ua) { + const browser = { + name: 'SeaMonkey', + }; + const version = Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/sailfish/i], + describe(ua) { + const browser = { + name: 'Sailfish', + }; + + const version = Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/silk/i], + describe(ua) { + const browser = { + name: 'Amazon Silk', + }; + const version = Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/phantom/i], + describe(ua) { + const browser = { + name: 'PhantomJS', + }; + const version = Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/slimerjs/i], + describe(ua) { + const browser = { + name: 'SlimerJS', + }; + const version = Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe(ua) { + const browser = { + name: 'BlackBerry', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/(web|hpw)[o0]s/i], + describe(ua) { + const browser = { + name: 'WebOS Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/bada/i], + describe(ua) { + const browser = { + name: 'Bada', + }; + const version = Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/tizen/i], + describe(ua) { + const browser = { + name: 'Tizen', + }; + const version = Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/qupzilla/i], + describe(ua) { + const browser = { + name: 'QupZilla', + }; + const version = Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/firefox|iceweasel|fxios/i], + describe(ua) { + const browser = { + name: 'Firefox', + }; + const version = Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/electron/i], + describe(ua) { + const browser = { + name: 'Electron', + }; + const version = Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/chromium/i], + describe(ua) { + const browser = { + name: 'Chromium', + }; + const version = Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/chrome|crios|crmo/i], + describe(ua) { + const browser = { + name: 'Chrome', + }; + const version = Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/GSA/i], + describe(ua) { + const browser = { + name: 'Google Search', + }; + const version = Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Android Browser */ + { + test(parser) { + const notLikeAndroid = !parser.test(/like android/i); + const butAndroid = parser.test(/android/i); + return notLikeAndroid && butAndroid; + }, + describe(ua) { + const browser = { + name: 'Android Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* PlayStation 4 */ + { + test: [/playstation 4/i], + describe(ua) { + const browser = { + name: 'PlayStation 4', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Safari */ + { + test: [/safari|applewebkit/i], + describe(ua) { + const browser = { + name: 'Safari', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Something else */ + { + test: [/.*/i], + describe(ua) { + /* Here we try to make sure that there are explicit details about the device + * in order to decide what regexp exactly we want to apply + * (as there is a specific decision based on that conclusion) + */ + const regexpWithoutDeviceSpec = /^(.*)\/(.*) /; + const regexpWithDeviceSpec = /^(.*)\/(.*)[ \t]\((.*)/; + const hasDeviceSpec = ua.search('\\(') !== -1; + const regexp = hasDeviceSpec ? regexpWithDeviceSpec : regexpWithoutDeviceSpec; + return { + name: Utils.getFirstMatch(regexp, ua), + version: Utils.getSecondMatch(regexp, ua), + }; + }, + }, +]; + +export default browsersList; diff --git a/node_modules/bowser/src/parser-engines.js b/node_modules/bowser/src/parser-engines.js new file mode 100644 index 0000000..d46d0e5 --- /dev/null +++ b/node_modules/bowser/src/parser-engines.js @@ -0,0 +1,120 @@ +import Utils from './utils.js'; +import { ENGINE_MAP } from './constants.js'; + +/* + * More specific goes first + */ +export default [ + /* EdgeHTML */ + { + test(parser) { + return parser.getBrowserName(true) === 'microsoft edge'; + }, + describe(ua) { + const isBlinkBased = /\sedg\//i.test(ua); + + // return blink if it's blink-based one + if (isBlinkBased) { + return { + name: ENGINE_MAP.Blink, + }; + } + + // otherwise match the version and return EdgeHTML + const version = Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, ua); + + return { + name: ENGINE_MAP.EdgeHTML, + version, + }; + }, + }, + + /* Trident */ + { + test: [/trident/i], + describe(ua) { + const engine = { + name: ENGINE_MAP.Trident, + }; + + const version = Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Presto */ + { + test(parser) { + return parser.test(/presto/i); + }, + describe(ua) { + const engine = { + name: ENGINE_MAP.Presto, + }; + + const version = Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Gecko */ + { + test(parser) { + const isGecko = parser.test(/gecko/i); + const likeGecko = parser.test(/like gecko/i); + return isGecko && !likeGecko; + }, + describe(ua) { + const engine = { + name: ENGINE_MAP.Gecko, + }; + + const version = Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Blink */ + { + test: [/(apple)?webkit\/537\.36/i], + describe() { + return { + name: ENGINE_MAP.Blink, + }; + }, + }, + + /* WebKit */ + { + test: [/(apple)?webkit/i], + describe(ua) { + const engine = { + name: ENGINE_MAP.WebKit, + }; + + const version = Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, +]; diff --git a/node_modules/bowser/src/parser-os.js b/node_modules/bowser/src/parser-os.js new file mode 100644 index 0000000..c95992d --- /dev/null +++ b/node_modules/bowser/src/parser-os.js @@ -0,0 +1,196 @@ +import Utils from './utils.js'; +import { OS_MAP } from './constants.js'; + +export default [ + /* Roku */ + { + test: [/Roku\/DVP/], + describe(ua) { + const version = Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, ua); + return { + name: OS_MAP.Roku, + version, + }; + }, + }, + + /* Windows Phone */ + { + test: [/windows phone/i], + describe(ua) { + const version = Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, ua); + return { + name: OS_MAP.WindowsPhone, + version, + }; + }, + }, + + /* Windows */ + { + test: [/windows /i], + describe(ua) { + const version = Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, ua); + const versionName = Utils.getWindowsVersionName(version); + + return { + name: OS_MAP.Windows, + version, + versionName, + }; + }, + }, + + /* Firefox on iPad */ + { + test: [/Macintosh(.*?) FxiOS(.*?) Version\//], + describe(ua) { + const version = Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/, ua); + return { + name: OS_MAP.iOS, + version, + }; + }, + }, + + /* macOS */ + { + test: [/macintosh/i], + describe(ua) { + const version = Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, ua).replace(/[_\s]/g, '.'); + const versionName = Utils.getMacOSVersionName(version); + + const os = { + name: OS_MAP.MacOS, + version, + }; + if (versionName) { + os.versionName = versionName; + } + return os; + }, + }, + + /* iOS */ + { + test: [/(ipod|iphone|ipad)/i], + describe(ua) { + const version = Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, ua).replace(/[_\s]/g, '.'); + + return { + name: OS_MAP.iOS, + version, + }; + }, + }, + + /* Android */ + { + test(parser) { + const notLikeAndroid = !parser.test(/like android/i); + const butAndroid = parser.test(/android/i); + return notLikeAndroid && butAndroid; + }, + describe(ua) { + const version = Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, ua); + const versionName = Utils.getAndroidVersionName(version); + const os = { + name: OS_MAP.Android, + version, + }; + if (versionName) { + os.versionName = versionName; + } + return os; + }, + }, + + /* WebOS */ + { + test: [/(web|hpw)[o0]s/i], + describe(ua) { + const version = Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, ua); + const os = { + name: OS_MAP.WebOS, + }; + + if (version && version.length) { + os.version = version; + } + return os; + }, + }, + + /* BlackBerry */ + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe(ua) { + const version = Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, ua) + || Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, ua) + || Utils.getFirstMatch(/\bbb(\d+)/i, ua); + + return { + name: OS_MAP.BlackBerry, + version, + }; + }, + }, + + /* Bada */ + { + test: [/bada/i], + describe(ua) { + const version = Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, ua); + + return { + name: OS_MAP.Bada, + version, + }; + }, + }, + + /* Tizen */ + { + test: [/tizen/i], + describe(ua) { + const version = Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, ua); + + return { + name: OS_MAP.Tizen, + version, + }; + }, + }, + + /* Linux */ + { + test: [/linux/i], + describe() { + return { + name: OS_MAP.Linux, + }; + }, + }, + + /* Chrome OS */ + { + test: [/CrOS/], + describe() { + return { + name: OS_MAP.ChromeOS, + }; + }, + }, + + /* Playstation 4 */ + { + test: [/PlayStation 4/], + describe(ua) { + const version = Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, ua); + return { + name: OS_MAP.PlayStation4, + version, + }; + }, + }, +]; diff --git a/node_modules/bowser/src/parser-platforms.js b/node_modules/bowser/src/parser-platforms.js new file mode 100644 index 0000000..9c191ba --- /dev/null +++ b/node_modules/bowser/src/parser-platforms.js @@ -0,0 +1,266 @@ +import Utils from './utils.js'; +import { PLATFORMS_MAP } from './constants.js'; + +/* + * Tablets go first since usually they have more specific + * signs to detect. + */ + +export default [ + /* Googlebot */ + { + test: [/googlebot/i], + describe() { + return { + type: 'bot', + vendor: 'Google', + }; + }, + }, + + /* Huawei */ + { + test: [/huawei/i], + describe(ua) { + const model = Utils.getFirstMatch(/(can-l01)/i, ua) && 'Nova'; + const platform = { + type: PLATFORMS_MAP.mobile, + vendor: 'Huawei', + }; + if (model) { + platform.model = model; + } + return platform; + }, + }, + + /* Nexus Tablet */ + { + test: [/nexus\s*(?:7|8|9|10).*/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Nexus', + }; + }, + }, + + /* iPad */ + { + test: [/ipad/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Apple', + model: 'iPad', + }; + }, + }, + + /* Firefox on iPad */ + { + test: [/Macintosh(.*?) FxiOS(.*?) Version\//], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Apple', + model: 'iPad', + }; + }, + }, + + /* Amazon Kindle Fire */ + { + test: [/kftt build/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Amazon', + model: 'Kindle Fire HD 7', + }; + }, + }, + + /* Another Amazon Tablet with Silk */ + { + test: [/silk/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Amazon', + }; + }, + }, + + /* Tablet */ + { + test: [/tablet(?! pc)/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + }; + }, + }, + + /* iPod/iPhone */ + { + test(parser) { + const iDevice = parser.test(/ipod|iphone/i); + const likeIDevice = parser.test(/like (ipod|iphone)/i); + return iDevice && !likeIDevice; + }, + describe(ua) { + const model = Utils.getFirstMatch(/(ipod|iphone)/i, ua); + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Apple', + model, + }; + }, + }, + + /* Nexus Mobile */ + { + test: [/nexus\s*[0-6].*/i, /galaxy nexus/i], + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Nexus', + }; + }, + }, + + /* Mobile */ + { + test: [/[^-]mobi/i], + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* BlackBerry */ + { + test(parser) { + return parser.getBrowserName(true) === 'blackberry'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'BlackBerry', + }; + }, + }, + + /* Bada */ + { + test(parser) { + return parser.getBrowserName(true) === 'bada'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* Windows Phone */ + { + test(parser) { + return parser.getBrowserName() === 'windows phone'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Microsoft', + }; + }, + }, + + /* Android Tablet */ + { + test(parser) { + const osMajorVersion = Number(String(parser.getOSVersion()).split('.')[0]); + return parser.getOSName(true) === 'android' && (osMajorVersion >= 3); + }, + describe() { + return { + type: PLATFORMS_MAP.tablet, + }; + }, + }, + + /* Android Mobile */ + { + test(parser) { + return parser.getOSName(true) === 'android'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* desktop */ + { + test(parser) { + return parser.getOSName(true) === 'macos'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + vendor: 'Apple', + }; + }, + }, + + /* Windows */ + { + test(parser) { + return parser.getOSName(true) === 'windows'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + }; + }, + }, + + /* Linux */ + { + test(parser) { + return parser.getOSName(true) === 'linux'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + }; + }, + }, + + /* PlayStation 4 */ + { + test(parser) { + return parser.getOSName(true) === 'playstation 4'; + }, + describe() { + return { + type: PLATFORMS_MAP.tv, + }; + }, + }, + + /* Roku */ + { + test(parser) { + return parser.getOSName(true) === 'roku'; + }, + describe() { + return { + type: PLATFORMS_MAP.tv, + }; + }, + }, +]; diff --git a/node_modules/bowser/src/parser.js b/node_modules/bowser/src/parser.js new file mode 100644 index 0000000..2fcfcab --- /dev/null +++ b/node_modules/bowser/src/parser.js @@ -0,0 +1,493 @@ +import browserParsersList from './parser-browsers.js'; +import osParsersList from './parser-os.js'; +import platformParsersList from './parser-platforms.js'; +import enginesParsersList from './parser-engines.js'; +import Utils from './utils.js'; + +/** + * The main class that arranges the whole parsing process. + */ +class Parser { + /** + * Create instance of Parser + * + * @param {String} UA User-Agent string + * @param {Boolean} [skipParsing=false] parser can skip parsing in purpose of performance + * improvements if you need to make a more particular parsing + * like {@link Parser#parseBrowser} or {@link Parser#parsePlatform} + * + * @throw {Error} in case of empty UA String + * + * @constructor + */ + constructor(UA, skipParsing = false) { + if (UA === void (0) || UA === null || UA === '') { + throw new Error("UserAgent parameter can't be empty"); + } + + this._ua = UA; + + /** + * @typedef ParsedResult + * @property {Object} browser + * @property {String|undefined} [browser.name] + * Browser name, like `"Chrome"` or `"Internet Explorer"` + * @property {String|undefined} [browser.version] Browser version as a String `"12.01.45334.10"` + * @property {Object} os + * @property {String|undefined} [os.name] OS name, like `"Windows"` or `"macOS"` + * @property {String|undefined} [os.version] OS version, like `"NT 5.1"` or `"10.11.1"` + * @property {String|undefined} [os.versionName] OS name, like `"XP"` or `"High Sierra"` + * @property {Object} platform + * @property {String|undefined} [platform.type] + * platform type, can be either `"desktop"`, `"tablet"` or `"mobile"` + * @property {String|undefined} [platform.vendor] Vendor of the device, + * like `"Apple"` or `"Samsung"` + * @property {String|undefined} [platform.model] Device model, + * like `"iPhone"` or `"Kindle Fire HD 7"` + * @property {Object} engine + * @property {String|undefined} [engine.name] + * Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML` + * @property {String|undefined} [engine.version] String version of the engine + */ + this.parsedResult = {}; + + if (skipParsing !== true) { + this.parse(); + } + } + + /** + * Get UserAgent string of current Parser instance + * @return {String} User-Agent String of the current object + * + * @public + */ + getUA() { + return this._ua; + } + + /** + * Test a UA string for a regexp + * @param {RegExp} regex + * @return {Boolean} + */ + test(regex) { + return regex.test(this._ua); + } + + /** + * Get parsed browser object + * @return {Object} + */ + parseBrowser() { + this.parsedResult.browser = {}; + + const browserDescriptor = Utils.find(browserParsersList, (_browser) => { + if (typeof _browser.test === 'function') { + return _browser.test(this); + } + + if (_browser.test instanceof Array) { + return _browser.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (browserDescriptor) { + this.parsedResult.browser = browserDescriptor.describe(this.getUA()); + } + + return this.parsedResult.browser; + } + + /** + * Get parsed browser object + * @return {Object} + * + * @public + */ + getBrowser() { + if (this.parsedResult.browser) { + return this.parsedResult.browser; + } + + return this.parseBrowser(); + } + + /** + * Get browser's name + * @return {String} Browser's name or an empty string + * + * @public + */ + getBrowserName(toLowerCase) { + if (toLowerCase) { + return String(this.getBrowser().name).toLowerCase() || ''; + } + return this.getBrowser().name || ''; + } + + + /** + * Get browser's version + * @return {String} version of browser + * + * @public + */ + getBrowserVersion() { + return this.getBrowser().version; + } + + /** + * Get OS + * @return {Object} + * + * @example + * this.getOS(); + * { + * name: 'macOS', + * version: '10.11.12' + * } + */ + getOS() { + if (this.parsedResult.os) { + return this.parsedResult.os; + } + + return this.parseOS(); + } + + /** + * Parse OS and save it to this.parsedResult.os + * @return {*|{}} + */ + parseOS() { + this.parsedResult.os = {}; + + const os = Utils.find(osParsersList, (_os) => { + if (typeof _os.test === 'function') { + return _os.test(this); + } + + if (_os.test instanceof Array) { + return _os.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (os) { + this.parsedResult.os = os.describe(this.getUA()); + } + + return this.parsedResult.os; + } + + /** + * Get OS name + * @param {Boolean} [toLowerCase] return lower-cased value + * @return {String} name of the OS — macOS, Windows, Linux, etc. + */ + getOSName(toLowerCase) { + const { name } = this.getOS(); + + if (toLowerCase) { + return String(name).toLowerCase() || ''; + } + + return name || ''; + } + + /** + * Get OS version + * @return {String} full version with dots ('10.11.12', '5.6', etc) + */ + getOSVersion() { + return this.getOS().version; + } + + /** + * Get parsed platform + * @return {{}} + */ + getPlatform() { + if (this.parsedResult.platform) { + return this.parsedResult.platform; + } + + return this.parsePlatform(); + } + + /** + * Get platform name + * @param {Boolean} [toLowerCase=false] + * @return {*} + */ + getPlatformType(toLowerCase = false) { + const { type } = this.getPlatform(); + + if (toLowerCase) { + return String(type).toLowerCase() || ''; + } + + return type || ''; + } + + /** + * Get parsed platform + * @return {{}} + */ + parsePlatform() { + this.parsedResult.platform = {}; + + const platform = Utils.find(platformParsersList, (_platform) => { + if (typeof _platform.test === 'function') { + return _platform.test(this); + } + + if (_platform.test instanceof Array) { + return _platform.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (platform) { + this.parsedResult.platform = platform.describe(this.getUA()); + } + + return this.parsedResult.platform; + } + + /** + * Get parsed engine + * @return {{}} + */ + getEngine() { + if (this.parsedResult.engine) { + return this.parsedResult.engine; + } + + return this.parseEngine(); + } + + /** + * Get engines's name + * @return {String} Engines's name or an empty string + * + * @public + */ + getEngineName(toLowerCase) { + if (toLowerCase) { + return String(this.getEngine().name).toLowerCase() || ''; + } + return this.getEngine().name || ''; + } + + /** + * Get parsed platform + * @return {{}} + */ + parseEngine() { + this.parsedResult.engine = {}; + + const engine = Utils.find(enginesParsersList, (_engine) => { + if (typeof _engine.test === 'function') { + return _engine.test(this); + } + + if (_engine.test instanceof Array) { + return _engine.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (engine) { + this.parsedResult.engine = engine.describe(this.getUA()); + } + + return this.parsedResult.engine; + } + + /** + * Parse full information about the browser + */ + parse() { + this.parseBrowser(); + this.parseOS(); + this.parsePlatform(); + this.parseEngine(); + + return this; + } + + /** + * Get parsed result + * @return {ParsedResult} + */ + getResult() { + return Utils.assign({}, this.parsedResult); + } + + /** + * Check if parsed browser matches certain conditions + * + * @param {Object} checkTree It's one or two layered object, + * which can include a platform or an OS on the first layer + * and should have browsers specs on the bottom-laying layer + * + * @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not. + * Returns `undefined` when the browser is no described in the checkTree object. + * + * @example + * const browser = Bowser.getParser(window.navigator.userAgent); + * if (browser.satisfies({chrome: '>118.01.1322' })) + * // or with os + * if (browser.satisfies({windows: { chrome: '>118.01.1322' } })) + * // or with platforms + * if (browser.satisfies({desktop: { chrome: '>118.01.1322' } })) + */ + satisfies(checkTree) { + const platformsAndOSes = {}; + let platformsAndOSCounter = 0; + const browsers = {}; + let browsersCounter = 0; + + const allDefinitions = Object.keys(checkTree); + + allDefinitions.forEach((key) => { + const currentDefinition = checkTree[key]; + if (typeof currentDefinition === 'string') { + browsers[key] = currentDefinition; + browsersCounter += 1; + } else if (typeof currentDefinition === 'object') { + platformsAndOSes[key] = currentDefinition; + platformsAndOSCounter += 1; + } + }); + + if (platformsAndOSCounter > 0) { + const platformsAndOSNames = Object.keys(platformsAndOSes); + const OSMatchingDefinition = Utils.find(platformsAndOSNames, name => (this.isOS(name))); + + if (OSMatchingDefinition) { + const osResult = this.satisfies(platformsAndOSes[OSMatchingDefinition]); + + if (osResult !== void 0) { + return osResult; + } + } + + const platformMatchingDefinition = Utils.find( + platformsAndOSNames, + name => (this.isPlatform(name)), + ); + if (platformMatchingDefinition) { + const platformResult = this.satisfies(platformsAndOSes[platformMatchingDefinition]); + + if (platformResult !== void 0) { + return platformResult; + } + } + } + + if (browsersCounter > 0) { + const browserNames = Object.keys(browsers); + const matchingDefinition = Utils.find(browserNames, name => (this.isBrowser(name, true))); + + if (matchingDefinition !== void 0) { + return this.compareVersion(browsers[matchingDefinition]); + } + } + + return undefined; + } + + /** + * Check if the browser name equals the passed string + * @param browserName The string to compare with the browser name + * @param [includingAlias=false] The flag showing whether alias will be included into comparison + * @returns {boolean} + */ + isBrowser(browserName, includingAlias = false) { + const defaultBrowserName = this.getBrowserName().toLowerCase(); + let browserNameLower = browserName.toLowerCase(); + const alias = Utils.getBrowserTypeByAlias(browserNameLower); + + if (includingAlias && alias) { + browserNameLower = alias.toLowerCase(); + } + return browserNameLower === defaultBrowserName; + } + + compareVersion(version) { + let expectedResults = [0]; + let comparableVersion = version; + let isLoose = false; + + const currentBrowserVersion = this.getBrowserVersion(); + + if (typeof currentBrowserVersion !== 'string') { + return void 0; + } + + if (version[0] === '>' || version[0] === '<') { + comparableVersion = version.substr(1); + if (version[1] === '=') { + isLoose = true; + comparableVersion = version.substr(2); + } else { + expectedResults = []; + } + if (version[0] === '>') { + expectedResults.push(1); + } else { + expectedResults.push(-1); + } + } else if (version[0] === '=') { + comparableVersion = version.substr(1); + } else if (version[0] === '~') { + isLoose = true; + comparableVersion = version.substr(1); + } + + return expectedResults.indexOf( + Utils.compareVersions(currentBrowserVersion, comparableVersion, isLoose), + ) > -1; + } + + isOS(osName) { + return this.getOSName(true) === String(osName).toLowerCase(); + } + + isPlatform(platformType) { + return this.getPlatformType(true) === String(platformType).toLowerCase(); + } + + isEngine(engineName) { + return this.getEngineName(true) === String(engineName).toLowerCase(); + } + + /** + * Is anything? Check if the browser is called "anything", + * the OS called "anything" or the platform called "anything" + * @param {String} anything + * @returns {Boolean} + */ + is(anything) { + return this.isBrowser(anything) || this.isOS(anything) || this.isPlatform(anything); + } + + /** + * Check if any of the given values satisfies this.is(anything) + * @param {String[]} anythings + * @returns {Boolean} + */ + some(anythings = []) { + return anythings.some(anything => this.is(anything)); + } +} + +export default Parser; diff --git a/node_modules/bowser/src/utils.js b/node_modules/bowser/src/utils.js new file mode 100644 index 0000000..d1174bf --- /dev/null +++ b/node_modules/bowser/src/utils.js @@ -0,0 +1,309 @@ +import { BROWSER_MAP, BROWSER_ALIASES_MAP } from './constants.js'; + +export default class Utils { + /** + * Get first matched item for a string + * @param {RegExp} regexp + * @param {String} ua + * @return {Array|{index: number, input: string}|*|boolean|string} + */ + static getFirstMatch(regexp, ua) { + const match = ua.match(regexp); + return (match && match.length > 0 && match[1]) || ''; + } + + /** + * Get second matched item for a string + * @param regexp + * @param {String} ua + * @return {Array|{index: number, input: string}|*|boolean|string} + */ + static getSecondMatch(regexp, ua) { + const match = ua.match(regexp); + return (match && match.length > 1 && match[2]) || ''; + } + + /** + * Match a regexp and return a constant or undefined + * @param {RegExp} regexp + * @param {String} ua + * @param {*} _const Any const that will be returned if regexp matches the string + * @return {*} + */ + static matchAndReturnConst(regexp, ua, _const) { + if (regexp.test(ua)) { + return _const; + } + return void (0); + } + + static getWindowsVersionName(version) { + switch (version) { + case 'NT': return 'NT'; + case 'XP': return 'XP'; + case 'NT 5.0': return '2000'; + case 'NT 5.1': return 'XP'; + case 'NT 5.2': return '2003'; + case 'NT 6.0': return 'Vista'; + case 'NT 6.1': return '7'; + case 'NT 6.2': return '8'; + case 'NT 6.3': return '8.1'; + case 'NT 10.0': return '10'; + default: return undefined; + } + } + + /** + * Get macOS version name + * 10.5 - Leopard + * 10.6 - Snow Leopard + * 10.7 - Lion + * 10.8 - Mountain Lion + * 10.9 - Mavericks + * 10.10 - Yosemite + * 10.11 - El Capitan + * 10.12 - Sierra + * 10.13 - High Sierra + * 10.14 - Mojave + * 10.15 - Catalina + * + * @example + * getMacOSVersionName("10.14") // 'Mojave' + * + * @param {string} version + * @return {string} versionName + */ + static getMacOSVersionName(version) { + const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); + v.push(0); + if (v[0] !== 10) return undefined; + switch (v[1]) { + case 5: return 'Leopard'; + case 6: return 'Snow Leopard'; + case 7: return 'Lion'; + case 8: return 'Mountain Lion'; + case 9: return 'Mavericks'; + case 10: return 'Yosemite'; + case 11: return 'El Capitan'; + case 12: return 'Sierra'; + case 13: return 'High Sierra'; + case 14: return 'Mojave'; + case 15: return 'Catalina'; + default: return undefined; + } + } + + /** + * Get Android version name + * 1.5 - Cupcake + * 1.6 - Donut + * 2.0 - Eclair + * 2.1 - Eclair + * 2.2 - Froyo + * 2.x - Gingerbread + * 3.x - Honeycomb + * 4.0 - Ice Cream Sandwich + * 4.1 - Jelly Bean + * 4.4 - KitKat + * 5.x - Lollipop + * 6.x - Marshmallow + * 7.x - Nougat + * 8.x - Oreo + * 9.x - Pie + * + * @example + * getAndroidVersionName("7.0") // 'Nougat' + * + * @param {string} version + * @return {string} versionName + */ + static getAndroidVersionName(version) { + const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); + v.push(0); + if (v[0] === 1 && v[1] < 5) return undefined; + if (v[0] === 1 && v[1] < 6) return 'Cupcake'; + if (v[0] === 1 && v[1] >= 6) return 'Donut'; + if (v[0] === 2 && v[1] < 2) return 'Eclair'; + if (v[0] === 2 && v[1] === 2) return 'Froyo'; + if (v[0] === 2 && v[1] > 2) return 'Gingerbread'; + if (v[0] === 3) return 'Honeycomb'; + if (v[0] === 4 && v[1] < 1) return 'Ice Cream Sandwich'; + if (v[0] === 4 && v[1] < 4) return 'Jelly Bean'; + if (v[0] === 4 && v[1] >= 4) return 'KitKat'; + if (v[0] === 5) return 'Lollipop'; + if (v[0] === 6) return 'Marshmallow'; + if (v[0] === 7) return 'Nougat'; + if (v[0] === 8) return 'Oreo'; + if (v[0] === 9) return 'Pie'; + return undefined; + } + + /** + * Get version precisions count + * + * @example + * getVersionPrecision("1.10.3") // 3 + * + * @param {string} version + * @return {number} + */ + static getVersionPrecision(version) { + return version.split('.').length; + } + + /** + * Calculate browser version weight + * + * @example + * compareVersions('1.10.2.1', '1.8.2.1.90') // 1 + * compareVersions('1.010.2.1', '1.09.2.1.90'); // 1 + * compareVersions('1.10.2.1', '1.10.2.1'); // 0 + * compareVersions('1.10.2.1', '1.0800.2'); // -1 + * compareVersions('1.10.2.1', '1.10', true); // 0 + * + * @param {String} versionA versions versions to compare + * @param {String} versionB versions versions to compare + * @param {boolean} [isLoose] enable loose comparison + * @return {Number} comparison result: -1 when versionA is lower, + * 1 when versionA is bigger, 0 when both equal + */ + /* eslint consistent-return: 1 */ + static compareVersions(versionA, versionB, isLoose = false) { + // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 + const versionAPrecision = Utils.getVersionPrecision(versionA); + const versionBPrecision = Utils.getVersionPrecision(versionB); + + let precision = Math.max(versionAPrecision, versionBPrecision); + let lastPrecision = 0; + + const chunks = Utils.map([versionA, versionB], (version) => { + const delta = precision - Utils.getVersionPrecision(version); + + // 2) "9" -> "9.0" (for precision = 2) + const _version = version + new Array(delta + 1).join('.0'); + + // 3) "9.0" -> ["000000000"", "000000009"] + return Utils.map(_version.split('.'), chunk => new Array(20 - chunk.length).join('0') + chunk).reverse(); + }); + + // adjust precision for loose comparison + if (isLoose) { + lastPrecision = precision - Math.min(versionAPrecision, versionBPrecision); + } + + // iterate in reverse order by reversed chunks array + precision -= 1; + while (precision >= lastPrecision) { + // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) + if (chunks[0][precision] > chunks[1][precision]) { + return 1; + } + + if (chunks[0][precision] === chunks[1][precision]) { + if (precision === lastPrecision) { + // all version chunks are same + return 0; + } + + precision -= 1; + } else if (chunks[0][precision] < chunks[1][precision]) { + return -1; + } + } + + return undefined; + } + + /** + * Array::map polyfill + * + * @param {Array} arr + * @param {Function} iterator + * @return {Array} + */ + static map(arr, iterator) { + const result = []; + let i; + if (Array.prototype.map) { + return Array.prototype.map.call(arr, iterator); + } + for (i = 0; i < arr.length; i += 1) { + result.push(iterator(arr[i])); + } + return result; + } + + /** + * Array::find polyfill + * + * @param {Array} arr + * @param {Function} predicate + * @return {Array} + */ + static find(arr, predicate) { + let i; + let l; + if (Array.prototype.find) { + return Array.prototype.find.call(arr, predicate); + } + for (i = 0, l = arr.length; i < l; i += 1) { + const value = arr[i]; + if (predicate(value, i)) { + return value; + } + } + return undefined; + } + + /** + * Object::assign polyfill + * + * @param {Object} obj + * @param {Object} ...objs + * @return {Object} + */ + static assign(obj, ...assigners) { + const result = obj; + let i; + let l; + if (Object.assign) { + return Object.assign(obj, ...assigners); + } + for (i = 0, l = assigners.length; i < l; i += 1) { + const assigner = assigners[i]; + if (typeof assigner === 'object' && assigner !== null) { + const keys = Object.keys(assigner); + keys.forEach((key) => { + result[key] = assigner[key]; + }); + } + } + return obj; + } + + /** + * Get short version/alias for a browser name + * + * @example + * getBrowserAlias('Microsoft Edge') // edge + * + * @param {string} browserName + * @return {string} + */ + static getBrowserAlias(browserName) { + return BROWSER_ALIASES_MAP[browserName]; + } + + /** + * Get short version/alias for a browser name + * + * @example + * getBrowserAlias('edge') // Microsoft Edge + * + * @param {string} browserAlias + * @return {string} + */ + static getBrowserTypeByAlias(browserAlias) { + return BROWSER_MAP[browserAlias] || ''; + } +} diff --git a/node_modules/bowser/webpack.config.js b/node_modules/bowser/webpack.config.js new file mode 100644 index 0000000..03b058b --- /dev/null +++ b/node_modules/bowser/webpack.config.js @@ -0,0 +1,43 @@ +const path = require('path'); +// const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); +const CompressionPlugin = require('compression-webpack-plugin'); + +module.exports = { + plugins: [ + new CompressionPlugin(), + ], + mode: 'production', // "production" | "development" | "none" + // Chosen mode tells webpack to use its built-in optimizations accordingly. + entry: { + bundled: ['@babel/polyfill', './src/bowser.js'], + es5: './src/bowser.js', + }, // string | object | array + // defaults to ./src + // Here the application starts executing + // and webpack starts bundling + output: { + // options related to how webpack emits results + path: path.resolve(__dirname, './'), // string + // the target directory for all output files + // must be an absolute path (use the Node.js path module) + filename: '[name].js', // string + // the filename template for entry chunks + library: 'bowser', + libraryTarget: 'umd', // universal module definition + // the type of the exported library + globalObject: 'this', + }, + module: { + // configuration regarding modules + rules: [ + // rules for modules (configure loaders, parser options, etc.) + { + test: /\.js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + }, + }, + ], + }, +}; diff --git a/node_modules/boxen/index.js b/node_modules/boxen/index.js new file mode 100644 index 0000000..b54b92d --- /dev/null +++ b/node_modules/boxen/index.js @@ -0,0 +1,138 @@ +'use strict'; +const stringWidth = require('string-width'); +const chalk = require('chalk'); +const widestLine = require('widest-line'); +const cliBoxes = require('cli-boxes'); +const camelCase = require('camelcase'); +const ansiAlign = require('ansi-align'); +const termSize = require('term-size'); + +const getObject = detail => { + let obj; + + if (typeof detail === 'number') { + obj = { + top: detail, + right: detail * 3, + bottom: detail, + left: detail * 3 + }; + } else { + obj = Object.assign({ + top: 0, + right: 0, + bottom: 0, + left: 0 + }, detail); + } + + return obj; +}; + +const getBorderChars = borderStyle => { + const sides = [ + 'topLeft', + 'topRight', + 'bottomRight', + 'bottomLeft', + 'vertical', + 'horizontal' + ]; + + let chars; + + if (typeof borderStyle === 'string') { + chars = cliBoxes[borderStyle]; + + if (!chars) { + throw new TypeError(`Invalid border style: ${borderStyle}`); + } + } else { + sides.forEach(key => { + if (!borderStyle[key] || typeof borderStyle[key] !== 'string') { + throw new TypeError(`Invalid border style: ${key}`); + } + }); + + chars = borderStyle; + } + + return chars; +}; + +const getBackgroundColorName = x => camelCase('bg', x); + +module.exports = (text, opts) => { + opts = Object.assign({ + padding: 0, + borderStyle: 'single', + dimBorder: false, + align: 'left', + float: 'left' + }, opts); + + if (opts.backgroundColor) { + opts.backgroundColor = getBackgroundColorName(opts.backgroundColor); + } + + if (opts.borderColor && !chalk[opts.borderColor]) { + throw new Error(`${opts.borderColor} is not a valid borderColor`); + } + + if (opts.backgroundColor && !chalk[opts.backgroundColor]) { + throw new Error(`${opts.backgroundColor} is not a valid backgroundColor`); + } + + const chars = getBorderChars(opts.borderStyle); + const padding = getObject(opts.padding); + const margin = getObject(opts.margin); + + const colorizeBorder = x => { + const ret = opts.borderColor ? chalk[opts.borderColor](x) : x; + return opts.dimBorder ? chalk.dim(ret) : ret; + }; + + const colorizeContent = x => opts.backgroundColor ? chalk[opts.backgroundColor](x) : x; + + text = ansiAlign(text, {align: opts.align}); + + const NL = '\n'; + const PAD = ' '; + + let lines = text.split(NL); + + if (padding.top > 0) { + lines = Array(padding.top).fill('').concat(lines); + } + + if (padding.bottom > 0) { + lines = lines.concat(Array(padding.bottom).fill('')); + } + + const contentWidth = widestLine(text) + padding.left + padding.right; + const paddingLeft = PAD.repeat(padding.left); + const columns = termSize().columns; + let marginLeft = PAD.repeat(margin.left); + + if (opts.float === 'center') { + const padWidth = Math.max((columns - contentWidth) / 2, 0); + marginLeft = PAD.repeat(padWidth); + } else if (opts.float === 'right') { + const padWidth = Math.max(columns - contentWidth - margin.right - 2, 0); + marginLeft = PAD.repeat(padWidth); + } + + const horizontal = chars.horizontal.repeat(contentWidth); + const top = colorizeBorder(NL.repeat(margin.top) + marginLeft + chars.topLeft + horizontal + chars.topRight); + const bottom = colorizeBorder(marginLeft + chars.bottomLeft + horizontal + chars.bottomRight + NL.repeat(margin.bottom)); + const side = colorizeBorder(chars.vertical); + + const middle = lines.map(line => { + const paddingRight = PAD.repeat(contentWidth - stringWidth(line) - padding.left); + return marginLeft + side + colorizeContent(paddingLeft + line + paddingRight) + side; + }).join(NL); + + return top + NL + middle + NL + bottom; +}; + +module.exports._borderStyles = cliBoxes; diff --git a/node_modules/boxen/license b/node_modules/boxen/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/boxen/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/boxen/node_modules/ansi-regex/index.js b/node_modules/boxen/node_modules/ansi-regex/index.js new file mode 100644 index 0000000..c4aaecf --- /dev/null +++ b/node_modules/boxen/node_modules/ansi-regex/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = () => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, 'g'); +}; diff --git a/node_modules/boxen/node_modules/ansi-regex/license b/node_modules/boxen/node_modules/ansi-regex/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/boxen/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/boxen/node_modules/ansi-regex/package.json b/node_modules/boxen/node_modules/ansi-regex/package.json new file mode 100644 index 0000000..8ec8a7e --- /dev/null +++ b/node_modules/boxen/node_modules/ansi-regex/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + "ansi-regex@3.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "ansi-regex@3.0.0", + "_id": "ansi-regex@3.0.0", + "_inBundle": false, + "_integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "_location": "/boxen/ansi-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ansi-regex@3.0.0", + "name": "ansi-regex", + "escapedName": "ansi-regex", + "rawSpec": "3.0.0", + "saveSpec": null, + "fetchSpec": "3.0.0" + }, + "_requiredBy": [ + "/boxen/strip-ansi" + ], + "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "_spec": "3.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/ansi-regex/issues" + }, + "description": "Regular expression for matching ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/ansi-regex#readme", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "license": "MIT", + "name": "ansi-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/ansi-regex.git" + }, + "scripts": { + "test": "xo && ava", + "view-supported": "node fixtures/view-codes.js" + }, + "version": "3.0.0" +} diff --git a/node_modules/boxen/node_modules/ansi-regex/readme.md b/node_modules/boxen/node_modules/ansi-regex/readme.md new file mode 100644 index 0000000..22db1c3 --- /dev/null +++ b/node_modules/boxen/node_modules/ansi-regex/readme.md @@ -0,0 +1,46 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] +``` + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/boxen/node_modules/is-fullwidth-code-point/index.js b/node_modules/boxen/node_modules/is-fullwidth-code-point/index.js new file mode 100644 index 0000000..d506327 --- /dev/null +++ b/node_modules/boxen/node_modules/is-fullwidth-code-point/index.js @@ -0,0 +1,46 @@ +'use strict'; +/* eslint-disable yoda */ +module.exports = x => { + if (Number.isNaN(x)) { + return false; + } + + // code points are derived from: + // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt + if ( + x >= 0x1100 && ( + x <= 0x115f || // Hangul Jamo + x === 0x2329 || // LEFT-POINTING ANGLE BRACKET + x === 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK Radicals Supplement .. Enclosed CJK Letters and Months + (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || + // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A + (0x3250 <= x && x <= 0x4dbf) || + // CJK Unified Ideographs .. Yi Radicals + (0x4e00 <= x && x <= 0xa4c6) || + // Hangul Jamo Extended-A + (0xa960 <= x && x <= 0xa97c) || + // Hangul Syllables + (0xac00 <= x && x <= 0xd7a3) || + // CJK Compatibility Ideographs + (0xf900 <= x && x <= 0xfaff) || + // Vertical Forms + (0xfe10 <= x && x <= 0xfe19) || + // CJK Compatibility Forms .. Small Form Variants + (0xfe30 <= x && x <= 0xfe6b) || + // Halfwidth and Fullwidth Forms + (0xff01 <= x && x <= 0xff60) || + (0xffe0 <= x && x <= 0xffe6) || + // Kana Supplement + (0x1b000 <= x && x <= 0x1b001) || + // Enclosed Ideographic Supplement + (0x1f200 <= x && x <= 0x1f251) || + // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane + (0x20000 <= x && x <= 0x3fffd) + ) + ) { + return true; + } + + return false; +}; diff --git a/node_modules/boxen/node_modules/is-fullwidth-code-point/license b/node_modules/boxen/node_modules/is-fullwidth-code-point/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/boxen/node_modules/is-fullwidth-code-point/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/boxen/node_modules/is-fullwidth-code-point/package.json b/node_modules/boxen/node_modules/is-fullwidth-code-point/package.json new file mode 100644 index 0000000..8d5fea4 --- /dev/null +++ b/node_modules/boxen/node_modules/is-fullwidth-code-point/package.json @@ -0,0 +1,81 @@ +{ + "_args": [ + [ + "is-fullwidth-code-point@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "is-fullwidth-code-point@2.0.0", + "_id": "is-fullwidth-code-point@2.0.0", + "_inBundle": false, + "_integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "_location": "/boxen/is-fullwidth-code-point", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "is-fullwidth-code-point@2.0.0", + "name": "is-fullwidth-code-point", + "escapedName": "is-fullwidth-code-point", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/boxen/string-width" + ], + "_resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues" + }, + "description": "Check if the character represented by a given Unicode code point is fullwidth", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme", + "keywords": [ + "fullwidth", + "full-width", + "full", + "width", + "unicode", + "character", + "char", + "string", + "str", + "codepoint", + "code", + "point", + "is", + "detect", + "check" + ], + "license": "MIT", + "name": "is-fullwidth-code-point", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.0", + "xo": { + "esnext": true + } +} diff --git a/node_modules/boxen/node_modules/is-fullwidth-code-point/readme.md b/node_modules/boxen/node_modules/is-fullwidth-code-point/readme.md new file mode 100644 index 0000000..093b028 --- /dev/null +++ b/node_modules/boxen/node_modules/is-fullwidth-code-point/readme.md @@ -0,0 +1,39 @@ +# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point) + +> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) + + +## Install + +``` +$ npm install --save is-fullwidth-code-point +``` + + +## Usage + +```js +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +isFullwidthCodePoint('谢'.codePointAt()); +//=> true + +isFullwidthCodePoint('a'.codePointAt()); +//=> false +``` + + +## API + +### isFullwidthCodePoint(input) + +#### input + +Type: `number` + +[Code point](https://en.wikipedia.org/wiki/Code_point) of a character. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/boxen/node_modules/string-width/index.js b/node_modules/boxen/node_modules/string-width/index.js new file mode 100644 index 0000000..bbc49d2 --- /dev/null +++ b/node_modules/boxen/node_modules/string-width/index.js @@ -0,0 +1,36 @@ +'use strict'; +const stripAnsi = require('strip-ansi'); +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +module.exports = str => { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + str = stripAnsi(str); + + let width = 0; + + for (let i = 0; i < str.length; i++) { + const code = str.codePointAt(i); + + // Ignore control characters + if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { + continue; + } + + // Ignore combining characters + if (code >= 0x300 && code <= 0x36F) { + continue; + } + + // Surrogates + if (code > 0xFFFF) { + i++; + } + + width += isFullwidthCodePoint(code) ? 2 : 1; + } + + return width; +}; diff --git a/node_modules/boxen/node_modules/string-width/license b/node_modules/boxen/node_modules/string-width/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/boxen/node_modules/string-width/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/boxen/node_modules/string-width/package.json b/node_modules/boxen/node_modules/string-width/package.json new file mode 100644 index 0000000..adc063f --- /dev/null +++ b/node_modules/boxen/node_modules/string-width/package.json @@ -0,0 +1,91 @@ +{ + "_args": [ + [ + "string-width@2.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "string-width@2.1.1", + "_id": "string-width@2.1.1", + "_inBundle": false, + "_integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "_location": "/boxen/string-width", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "string-width@2.1.1", + "name": "string-width", + "escapedName": "string-width", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/boxen" + ], + "_resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "_spec": "2.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/string-width/issues" + }, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "description": "Get the visual width of a string - the number of columns required to display it", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/string-width#readme", + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "license": "MIT", + "name": "string-width", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/string-width.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.1.1" +} diff --git a/node_modules/boxen/node_modules/string-width/readme.md b/node_modules/boxen/node_modules/string-width/readme.md new file mode 100644 index 0000000..df5b719 --- /dev/null +++ b/node_modules/boxen/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/boxen/node_modules/strip-ansi/index.js b/node_modules/boxen/node_modules/strip-ansi/index.js new file mode 100644 index 0000000..96e0292 --- /dev/null +++ b/node_modules/boxen/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +const ansiRegex = require('ansi-regex'); + +module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; diff --git a/node_modules/boxen/node_modules/strip-ansi/license b/node_modules/boxen/node_modules/strip-ansi/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/boxen/node_modules/strip-ansi/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/boxen/node_modules/strip-ansi/package.json b/node_modules/boxen/node_modules/strip-ansi/package.json new file mode 100644 index 0000000..26c40a5 --- /dev/null +++ b/node_modules/boxen/node_modules/strip-ansi/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "strip-ansi@4.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "strip-ansi@4.0.0", + "_id": "strip-ansi@4.0.0", + "_inBundle": false, + "_integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "_location": "/boxen/strip-ansi", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "strip-ansi@4.0.0", + "name": "strip-ansi", + "escapedName": "strip-ansi", + "rawSpec": "4.0.0", + "saveSpec": null, + "fetchSpec": "4.0.0" + }, + "_requiredBy": [ + "/boxen/string-width" + ], + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "_spec": "4.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/strip-ansi/issues" + }, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "description": "Strip ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/strip-ansi#readme", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "name": "strip-ansi", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/strip-ansi.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "4.0.0" +} diff --git a/node_modules/boxen/node_modules/strip-ansi/readme.md b/node_modules/boxen/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000..dc76f0c --- /dev/null +++ b/node_modules/boxen/node_modules/strip-ansi/readme.md @@ -0,0 +1,39 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install strip-ansi +``` + + +## Usage + +```js +const stripAnsi = require('strip-ansi'); + +stripAnsi('\u001B[4mUnicorn\u001B[0m'); +//=> 'Unicorn' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/boxen/package.json b/node_modules/boxen/package.json new file mode 100644 index 0000000..fe03da0 --- /dev/null +++ b/node_modules/boxen/package.json @@ -0,0 +1,83 @@ +{ + "_args": [ + [ + "boxen@1.3.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "boxen@1.3.0", + "_id": "boxen@1.3.0", + "_inBundle": false, + "_integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "_location": "/boxen", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "boxen@1.3.0", + "name": "boxen", + "escapedName": "boxen", + "rawSpec": "1.3.0", + "saveSpec": null, + "fetchSpec": "1.3.0" + }, + "_requiredBy": [ + "/update-notifier" + ], + "_resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "_spec": "1.3.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/boxen/issues" + }, + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "description": "Create boxes in the terminal", + "devDependencies": { + "ava": "*", + "nyc": "^11.0.3", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/boxen#readme", + "keywords": [ + "cli", + "box", + "boxes", + "terminal", + "term", + "console", + "ascii", + "unicode", + "border", + "text" + ], + "license": "MIT", + "name": "boxen", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/boxen.git" + }, + "scripts": { + "test": "xo && nyc ava" + }, + "version": "1.3.0" +} diff --git a/node_modules/boxen/readme.md b/node_modules/boxen/readme.md new file mode 100644 index 0000000..d8db8e9 --- /dev/null +++ b/node_modules/boxen/readme.md @@ -0,0 +1,175 @@ +# boxen + +> Create boxes in the terminal + +[![Build Status](https://travis-ci.org/sindresorhus/boxen.svg?branch=master)](https://travis-ci.org/sindresorhus/boxen) + + +## Install + +``` +$ npm install boxen +``` + + +## Usage + +```js +const boxen = require('boxen'); + +console.log(boxen('unicorn', {padding: 1})); +/* +┌─────────────┐ +│ │ +│ unicorn │ +│ │ +└─────────────┘ +*/ + +console.log(boxen('unicorn', {padding: 1, margin: 1, borderStyle: 'double'})); +/* + + ╔═════════════╗ + ║ ║ + ║ unicorn ║ + ║ ║ + ╚═════════════╝ + +*/ +``` + + +## API + +### boxen(input, [options]) + +#### input + +Type: `string` + +Text inside the box. + +#### options + +##### borderColor + +Type: `string`
+Values: `black` `red` `green` `yellow` `blue` `magenta` `cyan` `white` `gray` + +Color of the box border. + +##### borderStyle + +Type: `string` `object`
+Default: `single`
+Values: +- `single` +``` +┌───┐ +│foo│ +└───┘ +``` +- `double` +``` +╔═══╗ +║foo║ +╚═══╝ +``` +- `round` (`single` sides with round corners) +``` +╭───╮ +│foo│ +╰───╯ +``` +- `single-double` (`single` on top and bottom, `double` on right and left) +``` +╓───╖ +║foo║ +╙───╜ +``` +- `double-single` (`double` on top and bottom, `single` on right and left) +``` +╒═══╕ +│foo│ +╘═══╛ +``` +- `classic` +``` ++---+ +|foo| ++---+ +``` + +Style of the box border. + +Can be any of the above predefined styles or an object with the following keys: + +```js +{ + topLeft: '+', + topRight: '+', + bottomLeft: '+', + bottomRight: '+', + horizontal: '-', + vertical: '|' +} +``` + +##### dimBorder + +Type: `boolean`
+Default: `false` + +Reduce opacity of the border. + +##### padding + +Type: `number` `Object`
+Default: `0` + +Space between the text and box border. + +Accepts a number or an object with any of the `top`, `right`, `bottom`, `left` properties. When a number is specified, the left/right padding is 3 times the top/bottom to make it look nice. + +##### margin + +Type: `number` `Object`
+Default: `0` + +Space around the box. + +Accepts a number or an object with any of the `top`, `right`, `bottom`, `left` properties. When a number is specified, the left/right margin is 3 times the top/bottom to make it look nice. + +##### float + +Type: `string`
+Values: `right` `center` `left`
+Default: `left` + +Float the box on the available terminal screen space. + +##### backgroundColor + +Type: `string`
+Values: `black` `red` `green` `yellow` `blue` `magenta` `cyan` `white` + +Color of the background. + +##### align + +Type: `string`
+Default: `left`
+Values: `left` `center` `right` + +Align the text in the box based on the widest line. + + +## Related + +- [boxen-cli](https://github.com/sindresorhus/boxen-cli) - CLI for this module +- [cli-boxes](https://github.com/sindresorhus/cli-boxes) - Boxes for use in the terminal + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +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/brace-expansion/README.md b/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..6b4e0e1 --- /dev/null +++ b/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.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/brace-expansion/index.js b/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..0478be8 --- /dev/null +++ b/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..70cc3c6 --- /dev/null +++ b/node_modules/brace-expansion/package.json @@ -0,0 +1,78 @@ +{ + "_args": [ + [ + "brace-expansion@1.1.11", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "brace-expansion@1.1.11", + "_id": "brace-expansion@1.1.11", + "_inBundle": false, + "_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "_location": "/brace-expansion", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "brace-expansion@1.1.11", + "name": "brace-expansion", + "escapedName": "brace-expansion", + "rawSpec": "1.1.11", + "saveSpec": null, + "fetchSpec": "1.1.11" + }, + "_requiredBy": [ + "/minimatch" + ], + "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "_spec": "1.1.11", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/brace-expansion/issues" + }, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "description": "Brace expansion as known from sh/bash", + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "keywords": [], + "license": "MIT", + "main": "index.js", + "name": "brace-expansion", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "scripts": { + "bench": "matcha test/perf/bench.js", + "gentest": "bash test/generate.sh", + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.1.11" +} diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE new file mode 100644 index 0000000..d32ab44 --- /dev/null +++ b/node_modules/braces/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018, Jon Schlinkert. + +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/braces/README.md b/node_modules/braces/README.md new file mode 100644 index 0000000..f909bfb --- /dev/null +++ b/node_modules/braces/README.md @@ -0,0 +1,640 @@ +# braces [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) [![Windows Build Status](https://img.shields.io/appveyor/ci/micromatch/braces.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/micromatch/braces) + +> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save braces +``` + +## Why use braces? + +Brace patterns are great for matching ranges. Users (and implementors) shouldn't have to think about whether or not they will break their application (or yours) from accidentally defining an aggressive brace pattern. _Braces is the only library that offers a [solution to this problem](#performance)_. + +* **Safe(r)**: Braces isn't vulnerable to DoS attacks like [brace-expansion](https://github.com/juliangruber/brace-expansion), [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch) (a different bug than the [other regex DoS bug](https://medium.com/node-security/minimatch-redos-vulnerability-590da24e6d3c#.jew0b6mpc)). +* **Accurate**: complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) +* **[fast and performant](#benchmarks)**: Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. +* **Organized code base**: with parser and compiler that are eas(y|ier) to maintain and update when edge cases crop up. +* **Well-tested**: thousands of test assertions. Passes 100% of the [minimatch](https://github.com/isaacs/minimatch) and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests as well (as of the writing of this). + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +var braces = require('braces'); +braces(pattern[, options]); +``` + +By default, braces returns an optimized regex-source string. To get an array of brace patterns, use `brace.expand()`. + +The following section explains the difference in more detail. _(If you're curious about "why" braces does this by default, see [brace matching pitfalls](#brace-matching-pitfalls)_. + +### Optimized vs. expanded braces + +**Optimized** + +By default, patterns are optimized for regex and matching: + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +``` + +**Expanded** + +To expand patterns the same way as Bash or [minimatch](https://github.com/isaacs/minimatch), use the [.expand](#expand) method: + +```js +console.log(braces.expand('a/{x,y,z}/b')); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] +``` + +Or use [options.expand](#optionsexpand): + +```js +console.log(braces('a/{x,y,z}/b', {expand: true})); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] +``` + +## Features + +* [lists](#lists): Supports "lists": `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +* [sequences](#sequences): Supports alphabetical or numerical "sequences" (ranges): `{1..3}` => `['1', '2', '3']` +* [steps](#steps): Supports "steps" or increments: `{2..10..2}` => `['2', '4', '6', '8', '10']` +* [escaping](#escaping) +* [options](#options) + +### Lists + +Uses [fill-range](https://github.com/jonschlinkert/fill-range) for expanding alphabetical or numeric lists: + +```js +console.log(braces('a/{foo,bar,baz}/*.js')); +//=> ['a/(foo|bar|baz)/*.js'] + +console.log(braces.expand('a/{foo,bar,baz}/*.js')); +//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] +``` + +### Sequences + +Uses [fill-range](https://github.com/jonschlinkert/fill-range) for expanding alphabetical or numeric ranges (bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a{01..03}b')); // ['a01b', 'a02b', 'a03b'] +console.log(braces.expand('a{1..3}b')); // ['a1b', 'a2b', 'a3b'] +console.log(braces.expand('{a..c}')); // ['a', 'b', 'c'] +console.log(braces.expand('foo/{a..c}')); // ['foo/a', 'foo/b', 'foo/c'] + +// supports padded ranges +console.log(braces('a{01..03}b')); //=> [ 'a(0[1-3])b' ] +console.log(braces('a{001..300}b')); //=> [ 'a(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)b' ] +``` + +### Steps + +Steps, or increments, may be used with ranges: + +```js +console.log(braces.expand('{2..10..2}')); +//=> ['2', '4', '6', '8', '10'] + +console.log(braces('{2..10..2}')); +//=> ['(2|4|6|8|10)'] +``` + +When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. + +### Nesting + +Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. + +**"Expanded" braces** + +```js +console.log(braces.expand('a{b,c,/{x,y}}/e')); +//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] + +console.log(braces.expand('a/{x,{1..5},y}/c')); +//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] +``` + +**"Optimized" braces** + +```js +console.log(braces('a{b,c,/{x,y}}/e')); +//=> ['a(b|c|/(x|y))/e'] + +console.log(braces('a/{x,{1..5},y}/c')); +//=> ['a/(x|([1-5])|y)/c'] +``` + +### Escaping + +**Escaping braces** + +A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: + +```js +console.log(braces.expand('a\\{d,c,b}e')); +//=> ['a{d,c,b}e'] + +console.log(braces.expand('a{d,c,b\\}e')); +//=> ['a{d,c,b}e'] +``` + +**Escaping commas** + +Commas inside braces may also be escaped: + +```js +console.log(braces.expand('a{b\\,c}d')); +//=> ['a{b,c}d'] + +console.log(braces.expand('a{d\\,c,b}e')); +//=> ['ad,ce', 'abe'] +``` + +**Single items** + +Following bash conventions, a brace pattern is also not expanded when it contains a single character: + +```js +console.log(braces.expand('a{b}c')); +//=> ['a{b}c'] +``` + +## Options + +### options.maxLength + +**Type**: `Number` + +**Default**: `65,536` + +**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. + +```js +console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error +``` + +### options.expand + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Generate an "expanded" brace pattern (this option is unncessary with the `.expand` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', {expand: true})); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.optimize + +**Type**: `Boolean` + +**Default**: `true` + +**Description**: Enabled by default. + +```js +console.log(braces('a/{b,c}/d')); +//=> [ 'a/(b|c)/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `true` + +**Description**: Duplicates are removed by default. To keep duplicates, pass `{nodupes: false}` on the options + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `250` + +**Description**: When `braces.expand()` is used, or `options.expand` is true, brace patterns will automatically be [optimized](#optionsoptimize) when the difference between the range minimum and range maximum exceeds the `rangeLimit`. This is to prevent huge ranges from freezing your application. + +You can set this to any number, or change `options.rangeLimit` to `Inifinity` to disable this altogether. + +**Examples** + +```js +// pattern exceeds the "rangeLimit", so it's optimized automatically +console.log(braces.expand('{1..1000}')); +//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] + +// pattern does not exceed "rangeLimit", so it's NOT optimized +console.log(braces.expand('{1..100}')); +//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] +``` + +### options.transform + +**Type**: `Function` + +**Default**: `undefined` + +**Description**: Customize range expansion. + +```js +var range = braces.expand('x{a..e}y', { + transform: function(str) { + return 'foo' + str; + } +}); + +console.log(range); +//=> [ 'xfooay', 'xfooby', 'xfoocy', 'xfoody', 'xfooey' ] +``` + +### options.quantifiers + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. + +Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) + +The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. + +**Examples** + +```js +var braces = require('braces'); +console.log(braces('a/b{1,3}/{x,y,z}')); +//=> [ 'a/b(1|3)/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true})); +//=> [ 'a/b{1,3}/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true, expand: true})); +//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] +``` + +### options.unescape + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Strip backslashes that were used for escaping from the result. + +## What is "brace expansion"? + +Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). + +In addition to "expansion", braces are also used for matching. In other words: + +* [brace expansion](#brace-expansion) is for generating new lists +* [brace matching](#brace-matching) is for filtering existing lists + +
+More about brace expansion (click to expand) + +There are two main types of brace expansion: + +1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` +2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". + +Here are some example brace patterns to illustrate how they work: + +**Sets** + +``` +{a,b,c} => a b c +{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 +``` + +**Sequences** + +``` +{1..9} => 1 2 3 4 5 6 7 8 9 +{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 +{1..20..3} => 1 4 7 10 13 16 19 +{a..j} => a b c d e f g h i j +{j..a} => j i h g f e d c b a +{a..z..3} => a d g j m p s v y +``` + +**Combination** + +Sets and sequences can be mixed together or used along with any other strings. + +``` +{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 +foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar +``` + +The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. + +## Brace matching + +In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. + +For example, the pattern `foo/{1..3}/bar` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +``` + +But not: + +``` +baz/1/qux +baz/2/qux +baz/3/qux +``` + +Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` + +## Brace matching pitfalls + +Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. + +### tldr + +**"brace bombs"** + +* brace expansion can eat up a huge amount of processing resources +* as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially +* users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) + +For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. + +### The solution + +Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. + +### Geometric complexity + +At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. + +For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: + +``` +{1,2}{3,4} => (2X2) => 13 14 23 24 +{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 +``` + +But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: + +``` +{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 + 249 257 258 259 267 268 269 347 348 349 357 + 358 359 367 368 369 +``` + +Now, imagine how this complexity grows given that each element is a n-tuple: + +``` +{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) +{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) +``` + +Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. + +**More information** + +Interested in learning more about brace expansion? + +* [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) +* [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) +* [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) + +
+ +## Performance + +Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. + +### Better algorithms + +Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. + +Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. + +**The proof is in the numbers** + +Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. + +| **Pattern** | **braces** | **[minimatch](https://github.com/isaacs/minimatch)** | +| --- | --- | --- | +| `{1..9007199254740991}`
[1] | `298 B` (5ms 459μs) | N/A (freezes) | +| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | +| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | +| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | +| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | +| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | +| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | +| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | +| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | +| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | +| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | +| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | +| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | +| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | +| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | +| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | +| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | + +### Faster algorithms + +When you need expansion, braces is still much faster. + +_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ + +| **Pattern** | **braces** | **[minimatch](https://github.com/isaacs/minimatch)** | +| --- | --- | --- | +| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | +| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | +| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | +| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | +| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | +| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | +| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | +| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | + +If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). + +## Benchmarks + +### Running benchmarks + +Install dev dependencies: + +```bash +npm i -d && npm benchmark +``` + +### Latest results + +```bash +Benchmarking: (8 of 8) + · combination-nested + · combination + · escaped + · list-basic + · list-multiple + · no-braces + · sequence-basic + · sequence-multiple + +# benchmark/fixtures/combination-nested.js (52 bytes) + brace-expansion x 4,756 ops/sec ±1.09% (86 runs sampled) + braces x 11,202,303 ops/sec ±1.06% (88 runs sampled) + minimatch x 4,816 ops/sec ±0.99% (87 runs sampled) + + fastest is braces + +# benchmark/fixtures/combination.js (51 bytes) + brace-expansion x 625 ops/sec ±0.87% (87 runs sampled) + braces x 11,031,884 ops/sec ±0.72% (90 runs sampled) + minimatch x 637 ops/sec ±0.84% (88 runs sampled) + + fastest is braces + +# benchmark/fixtures/escaped.js (44 bytes) + brace-expansion x 163,325 ops/sec ±1.05% (87 runs sampled) + braces x 10,655,071 ops/sec ±1.22% (88 runs sampled) + minimatch x 147,495 ops/sec ±0.96% (88 runs sampled) + + fastest is braces + +# benchmark/fixtures/list-basic.js (40 bytes) + brace-expansion x 99,726 ops/sec ±1.07% (83 runs sampled) + braces x 10,596,584 ops/sec ±0.98% (88 runs sampled) + minimatch x 100,069 ops/sec ±1.17% (86 runs sampled) + + fastest is braces + +# benchmark/fixtures/list-multiple.js (52 bytes) + brace-expansion x 34,348 ops/sec ±1.08% (88 runs sampled) + braces x 9,264,131 ops/sec ±1.12% (88 runs sampled) + minimatch x 34,893 ops/sec ±0.87% (87 runs sampled) + + fastest is braces + +# benchmark/fixtures/no-braces.js (48 bytes) + brace-expansion x 275,368 ops/sec ±1.18% (89 runs sampled) + braces x 9,134,677 ops/sec ±0.95% (88 runs sampled) + minimatch x 3,755,954 ops/sec ±1.13% (89 runs sampled) + + fastest is braces + +# benchmark/fixtures/sequence-basic.js (41 bytes) + brace-expansion x 5,492 ops/sec ±1.35% (87 runs sampled) + braces x 8,485,034 ops/sec ±1.28% (89 runs sampled) + minimatch x 5,341 ops/sec ±1.17% (87 runs sampled) + + fastest is braces + +# benchmark/fixtures/sequence-multiple.js (51 bytes) + brace-expansion x 116 ops/sec ±0.77% (77 runs sampled) + braces x 9,445,118 ops/sec ±1.32% (84 runs sampled) + minimatch x 109 ops/sec ±1.16% (76 runs sampled) + + fastest is braces +``` + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Related projects + +You might also be interested in these projects: + +* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.") +* [extglob](https://www.npmjs.com/package/extglob): Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob… [more](https://github.com/micromatch/extglob) | [homepage](https://github.com/micromatch/extglob "Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob patterns.") +* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/micromatch/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") +* [nanomatch](https://www.npmjs.com/package/nanomatch): Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash… [more](https://github.com/micromatch/nanomatch) | [homepage](https://github.com/micromatch/nanomatch "Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 188 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [doowb](https://github.com/doowb) | +| 1 | [es128](https://github.com/es128) | +| 1 | [eush77](https://github.com/eush77) | +| 1 | [hemanth](https://github.com/hemanth) | + +### Author + +**Jon Schlinkert** + +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 17, 2018._ + +
+
+
    +
  1. this is the largest safe integer allowed in JavaScript. + +
  2. +
+
\ No newline at end of file diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js new file mode 100644 index 0000000..048e1c2 --- /dev/null +++ b/node_modules/braces/index.js @@ -0,0 +1,318 @@ +'use strict'; + +/** + * Module dependencies + */ + +var toRegex = require('to-regex'); +var unique = require('array-unique'); +var extend = require('extend-shallow'); + +/** + * Local dependencies + */ + +var compilers = require('./lib/compilers'); +var parsers = require('./lib/parsers'); +var Braces = require('./lib/braces'); +var utils = require('./lib/utils'); +var MAX_LENGTH = 1024 * 64; +var cache = {}; + +/** + * Convert the given `braces` pattern into a regex-compatible string. By default, only one string is generated for every input string. Set `options.expand` to true to return an array of patterns (similar to Bash or minimatch. Before using `options.expand`, it's recommended that you read the [performance notes](#performance)). + * + * ```js + * var braces = require('braces'); + * console.log(braces('{a,b,c}')); + * //=> ['(a|b|c)'] + * + * console.log(braces('{a,b,c}', {expand: true})); + * //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +function braces(pattern, options) { + var key = utils.createKey(String(pattern), options); + var arr = []; + + var disabled = options && options.cache === false; + if (!disabled && cache.hasOwnProperty(key)) { + return cache[key]; + } + + if (Array.isArray(pattern)) { + for (var i = 0; i < pattern.length; i++) { + arr.push.apply(arr, braces.create(pattern[i], options)); + } + } else { + arr = braces.create(pattern, options); + } + + if (options && options.nodupes === true) { + arr = unique(arr); + } + + if (!disabled) { + cache[key] = arr; + } + return arr; +} + +/** + * Expands a brace pattern into an array. This method is called by the main [braces](#braces) function when `options.expand` is true. Before using this method it's recommended that you read the [performance notes](#performance)) and advantages of using [.optimize](#optimize) instead. + * + * ```js + * var braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = function(pattern, options) { + return braces.create(pattern, extend({}, options, {expand: true})); +}; + +/** + * Expands a brace pattern into a regex-compatible, optimized string. This method is called by the main [braces](#braces) function by default. + * + * ```js + * var braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.optimize = function(pattern, options) { + return braces.create(pattern, options); +}; + +/** + * Processes a brace pattern and returns either an expanded array (if `options.expand` is true), a highly optimized regex-compatible string. This method is called by the main [braces](#braces) function. + * + * ```js + * var braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var maxLength = (options && options.maxLength) || MAX_LENGTH; + if (pattern.length >= maxLength) { + throw new Error('expected pattern to be less than ' + maxLength + ' characters'); + } + + function create() { + if (pattern === '' || pattern.length < 3) { + return [pattern]; + } + + if (utils.isEmptySets(pattern)) { + return []; + } + + if (utils.isQuotedString(pattern)) { + return [pattern.slice(1, -1)]; + } + + var proto = new Braces(options); + var result = !options || options.expand !== true + ? proto.optimize(pattern, options) + : proto.expand(pattern, options); + + // get the generated pattern(s) + var arr = result.output; + + // filter out empty strings if specified + if (options && options.noempty === true) { + arr = arr.filter(Boolean); + } + + // filter out duplicates if specified + if (options && options.nodupes === true) { + arr = unique(arr); + } + + Object.defineProperty(arr, 'result', { + enumerable: false, + value: result + }); + + return arr; + } + + return memoize('create', pattern, options, create); +}; + +/** + * Create a regular expression from the given string `pattern`. + * + * ```js + * var braces = require('braces'); + * + * console.log(braces.makeRe('id-{200..300}')); + * //=> /^(?:id-(20[0-9]|2[1-9][0-9]|300))$/ + * ``` + * @param {String} `pattern` The pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +braces.makeRe = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var maxLength = (options && options.maxLength) || MAX_LENGTH; + if (pattern.length >= maxLength) { + throw new Error('expected pattern to be less than ' + maxLength + ' characters'); + } + + function makeRe() { + var arr = braces(pattern, options); + var opts = extend({strictErrors: false}, options); + return toRegex(arr, opts); + } + + return memoize('makeRe', pattern, options, makeRe); +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * var braces = require('braces'); + * var ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * // { type: 'root', + * // errors: [], + * // input: 'a/{b,c}/d', + * // nodes: + * // [ { type: 'bos', val: '' }, + * // { type: 'text', val: 'a/' }, + * // { type: 'brace', + * // nodes: + * // [ { type: 'brace.open', val: '{' }, + * // { type: 'text', val: 'b,c' }, + * // { type: 'brace.close', val: '}' } ] }, + * // { type: 'text', val: '/d' }, + * // { type: 'eos', val: '' } ] } + * ``` + * @param {String} `pattern` Brace pattern to parse + * @param {Object} `options` + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = function(pattern, options) { + var proto = new Braces(options); + return proto.parse(pattern, options); +}; + +/** + * Compile the given `ast` or string with the given `options`. + * + * ```js + * var braces = require('braces'); + * var ast = braces.parse('a/{b,c}/d'); + * console.log(braces.compile(ast)); + * // { options: { source: 'string' }, + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // brace: [Function], + * // 'brace.open': [Function], + * // text: [Function], + * // 'brace.close': [Function] }, + * // output: [ 'a/(b|c)/d' ], + * // ast: + * // { ... }, + * // parsingErrors: [] } + * ``` + * @param {Object|String} `ast` AST from [.parse](#parse). If a string is passed it will be parsed first. + * @param {Object} `options` + * @return {Object} Returns an object that has an `output` property with the compiled string. + * @api public + */ + +braces.compile = function(ast, options) { + var proto = new Braces(options); + return proto.compile(ast, options); +}; + +/** + * Clear the regex cache. + * + * ```js + * braces.clearCache(); + * ``` + * @api public + */ + +braces.clearCache = function() { + cache = braces.cache = {}; +}; + +/** + * Memoize a generated regex or function. A unique key is generated + * from the method name, pattern, and user-defined options. Set + * options.memoize to false to disable. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + ':' + pattern, options); + var disabled = options && options.cache === false; + if (disabled) { + braces.clearCache(); + return fn(pattern, options); + } + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + + var res = fn(pattern, options); + cache[key] = res; + return res; +} + +/** + * Expose `Braces` constructor and methods + * @type {Function} + */ + +braces.Braces = Braces; +braces.compilers = compilers; +braces.parsers = parsers; +braces.cache = cache; + +/** + * Expose `braces` + * @type {Function} + */ + +module.exports = braces; diff --git a/node_modules/braces/lib/braces.js b/node_modules/braces/lib/braces.js new file mode 100644 index 0000000..baf6bf1 --- /dev/null +++ b/node_modules/braces/lib/braces.js @@ -0,0 +1,104 @@ +'use strict'; + +var extend = require('extend-shallow'); +var Snapdragon = require('snapdragon'); +var compilers = require('./compilers'); +var parsers = require('./parsers'); +var utils = require('./utils'); + +/** + * Customize Snapdragon parser and renderer + */ + +function Braces(options) { + this.options = extend({}, options); +} + +/** + * Initialize braces + */ + +Braces.prototype.init = function(options) { + if (this.isInitialized) return; + this.isInitialized = true; + var opts = utils.createOptions({}, this.options, options); + this.snapdragon = this.options.snapdragon || new Snapdragon(opts); + this.compiler = this.snapdragon.compiler; + this.parser = this.snapdragon.parser; + + compilers(this.snapdragon, opts); + parsers(this.snapdragon, opts); + + /** + * Call Snapdragon `.parse` method. When AST is returned, we check to + * see if any unclosed braces are left on the stack and, if so, we iterate + * over the stack and correct the AST so that compilers are called in the correct + * order and unbalance braces are properly escaped. + */ + + utils.define(this.snapdragon, 'parse', function(pattern, options) { + var parsed = Snapdragon.prototype.parse.apply(this, arguments); + this.parser.ast.input = pattern; + + var stack = this.parser.stack; + while (stack.length) { + addParent({type: 'brace.close', val: ''}, stack.pop()); + } + + function addParent(node, parent) { + utils.define(node, 'parent', parent); + parent.nodes.push(node); + } + + // add non-enumerable parser reference + utils.define(parsed, 'parser', this.parser); + return parsed; + }); +}; + +/** + * Decorate `.parse` method + */ + +Braces.prototype.parse = function(ast, options) { + if (ast && typeof ast === 'object' && ast.nodes) return ast; + this.init(options); + return this.snapdragon.parse(ast, options); +}; + +/** + * Decorate `.compile` method + */ + +Braces.prototype.compile = function(ast, options) { + if (typeof ast === 'string') { + ast = this.parse(ast, options); + } else { + this.init(options); + } + return this.snapdragon.compile(ast, options); +}; + +/** + * Expand + */ + +Braces.prototype.expand = function(pattern) { + var ast = this.parse(pattern, {expand: true}); + return this.compile(ast, {expand: true}); +}; + +/** + * Optimize + */ + +Braces.prototype.optimize = function(pattern) { + var ast = this.parse(pattern, {optimize: true}); + return this.compile(ast, {optimize: true}); +}; + +/** + * Expose `Braces` + */ + +module.exports = Braces; diff --git a/node_modules/braces/lib/compilers.js b/node_modules/braces/lib/compilers.js new file mode 100644 index 0000000..a3b820e --- /dev/null +++ b/node_modules/braces/lib/compilers.js @@ -0,0 +1,282 @@ +'use strict'; + +var utils = require('./utils'); + +module.exports = function(braces, options) { + braces.compiler + + /** + * bos + */ + + .set('bos', function() { + if (this.output) return; + this.ast.queue = isEscaped(this.ast) ? [this.ast.val] : []; + this.ast.count = 1; + }) + + /** + * Square brackets + */ + + .set('bracket', function(node) { + var close = node.close; + var open = !node.escaped ? '[' : '\\['; + var negated = node.negated; + var inner = node.inner; + + inner = inner.replace(/\\(?=[\\\w]|$)/g, '\\\\'); + if (inner === ']-') { + inner = '\\]\\-'; + } + + if (negated && inner.indexOf('.') === -1) { + inner += '.'; + } + if (negated && inner.indexOf('/') === -1) { + inner += '/'; + } + + var val = open + negated + inner + close; + var queue = node.parent.queue; + var last = utils.arrayify(queue.pop()); + + queue.push(utils.join(last, val)); + queue.push.apply(queue, []); + }) + + /** + * Brace + */ + + .set('brace', function(node) { + node.queue = isEscaped(node) ? [node.val] : []; + node.count = 1; + return this.mapVisit(node.nodes); + }) + + /** + * Open + */ + + .set('brace.open', function(node) { + node.parent.open = node.val; + }) + + /** + * Inner + */ + + .set('text', function(node) { + var queue = node.parent.queue; + var escaped = node.escaped; + var segs = [node.val]; + + if (node.optimize === false) { + options = utils.extend({}, options, {optimize: false}); + } + + if (node.multiplier > 1) { + node.parent.count *= node.multiplier; + } + + if (options.quantifiers === true && utils.isQuantifier(node.val)) { + escaped = true; + + } else if (node.val.length > 1) { + if (isType(node.parent, 'brace') && !isEscaped(node)) { + var expanded = utils.expand(node.val, options); + segs = expanded.segs; + + if (expanded.isOptimized) { + node.parent.isOptimized = true; + } + + // if nothing was expanded, we probably have a literal brace + if (!segs.length) { + var val = (expanded.val || node.val); + if (options.unescape !== false) { + // unescape unexpanded brace sequence/set separators + val = val.replace(/\\([,.])/g, '$1'); + // strip quotes + val = val.replace(/["'`]/g, ''); + } + + segs = [val]; + escaped = true; + } + } + + } else if (node.val === ',') { + if (options.expand) { + node.parent.queue.push(['']); + segs = ['']; + } else { + segs = ['|']; + } + } else { + escaped = true; + } + + if (escaped && isType(node.parent, 'brace')) { + if (node.parent.nodes.length <= 4 && node.parent.count === 1) { + node.parent.escaped = true; + } else if (node.parent.length <= 3) { + node.parent.escaped = true; + } + } + + if (!hasQueue(node.parent)) { + node.parent.queue = segs; + return; + } + + var last = utils.arrayify(queue.pop()); + if (node.parent.count > 1 && options.expand) { + last = multiply(last, node.parent.count); + node.parent.count = 1; + } + + queue.push(utils.join(utils.flatten(last), segs.shift())); + queue.push.apply(queue, segs); + }) + + /** + * Close + */ + + .set('brace.close', function(node) { + var queue = node.parent.queue; + var prev = node.parent.parent; + var last = prev.queue.pop(); + var open = node.parent.open; + var close = node.val; + + if (open && close && isOptimized(node, options)) { + open = '('; + close = ')'; + } + + // if a close brace exists, and the previous segment is one character + // don't wrap the result in braces or parens + var ele = utils.last(queue); + if (node.parent.count > 1 && options.expand) { + ele = multiply(queue.pop(), node.parent.count); + node.parent.count = 1; + queue.push(ele); + } + + if (close && typeof ele === 'string' && ele.length === 1) { + open = ''; + close = ''; + } + + if ((isLiteralBrace(node, options) || noInner(node)) && !node.parent.hasEmpty) { + queue.push(utils.join(open, queue.pop() || '')); + queue = utils.flatten(utils.join(queue, close)); + } + + if (typeof last === 'undefined') { + prev.queue = [queue]; + } else { + prev.queue.push(utils.flatten(utils.join(last, queue))); + } + }) + + /** + * eos + */ + + .set('eos', function(node) { + if (this.input) return; + + if (options.optimize !== false) { + this.output = utils.last(utils.flatten(this.ast.queue)); + } else if (Array.isArray(utils.last(this.ast.queue))) { + this.output = utils.flatten(this.ast.queue.pop()); + } else { + this.output = utils.flatten(this.ast.queue); + } + + if (node.parent.count > 1 && options.expand) { + this.output = multiply(this.output, node.parent.count); + } + + this.output = utils.arrayify(this.output); + this.ast.queue = []; + }); + +}; + +/** + * Multiply the segments in the current brace level + */ + +function multiply(queue, n, options) { + return utils.flatten(utils.repeat(utils.arrayify(queue), n)); +} + +/** + * Return true if `node` is escaped + */ + +function isEscaped(node) { + return node.escaped === true; +} + +/** + * Returns true if regex parens should be used for sets. If the parent `type` + * is not `brace`, then we're on a root node, which means we should never + * expand segments and open/close braces should be `{}` (since this indicates + * a brace is missing from the set) + */ + +function isOptimized(node, options) { + if (node.parent.isOptimized) return true; + return isType(node.parent, 'brace') + && !isEscaped(node.parent) + && options.expand !== true; +} + +/** + * Returns true if the value in `node` should be wrapped in a literal brace. + * @return {Boolean} + */ + +function isLiteralBrace(node, options) { + return isEscaped(node.parent) || options.optimize !== false; +} + +/** + * Returns true if the given `node` does not have an inner value. + * @return {Boolean} + */ + +function noInner(node, type) { + if (node.parent.queue.length === 1) { + return true; + } + var nodes = node.parent.nodes; + return nodes.length === 3 + && isType(nodes[0], 'brace.open') + && !isType(nodes[1], 'text') + && isType(nodes[2], 'brace.close'); +} + +/** + * Returns true if the given `node` is the given `type` + * @return {Boolean} + */ + +function isType(node, type) { + return typeof node !== 'undefined' && node.type === type; +} + +/** + * Returns true if the given `node` has a non-empty queue. + * @return {Boolean} + */ + +function hasQueue(node) { + return Array.isArray(node.queue) && node.queue.length; +} diff --git a/node_modules/braces/lib/parsers.js b/node_modules/braces/lib/parsers.js new file mode 100644 index 0000000..8bf3e92 --- /dev/null +++ b/node_modules/braces/lib/parsers.js @@ -0,0 +1,360 @@ +'use strict'; + +var Node = require('snapdragon-node'); +var utils = require('./utils'); + +/** + * Braces parsers + */ + +module.exports = function(braces, options) { + braces.parser + .set('bos', function() { + if (!this.parsed) { + this.ast = this.nodes[0] = new Node(this.ast); + } + }) + + /** + * Character parsers + */ + + .set('escape', function() { + var pos = this.position(); + var m = this.match(/^(?:\\(.)|\$\{)/); + if (!m) return; + + var prev = this.prev(); + var last = utils.last(prev.nodes); + + var node = pos(new Node({ + type: 'text', + multiplier: 1, + val: m[0] + })); + + if (node.val === '\\\\') { + return node; + } + + if (node.val === '${') { + var str = this.input; + var idx = -1; + var ch; + + while ((ch = str[++idx])) { + this.consume(1); + node.val += ch; + if (ch === '\\') { + node.val += str[++idx]; + continue; + } + if (ch === '}') { + break; + } + } + } + + if (this.options.unescape !== false) { + node.val = node.val.replace(/\\([{}])/g, '$1'); + } + + if (last.val === '"' && this.input.charAt(0) === '"') { + last.val = node.val; + this.consume(1); + return; + } + + return concatNodes.call(this, pos, node, prev, options); + }) + + /** + * Brackets: "[...]" (basic, this is overridden by + * other parsers in more advanced implementations) + */ + + .set('bracket', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^(?:\[([!^]?)([^\]]{2,}|\]-)(\]|[^*+?]+)|\[)/); + if (!m) return; + + var prev = this.prev(); + var val = m[0]; + var negated = m[1] ? '^' : ''; + var inner = m[2] || ''; + var close = m[3] || ''; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + var esc = this.input.slice(0, 2); + if (inner === '' && esc === '\\]') { + inner += esc; + this.consume(2); + + var str = this.input; + var idx = -1; + var ch; + + while ((ch = str[++idx])) { + this.consume(1); + if (ch === ']') { + close = ch; + break; + } + inner += ch; + } + } + + return pos(new Node({ + type: 'bracket', + val: val, + escaped: close !== ']', + negated: negated, + inner: inner, + close: close + })); + }) + + /** + * Empty braces (we capture these early to + * speed up processing in the compiler) + */ + + .set('multiplier', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^\{((?:,|\{,+\})+)\}/); + if (!m) return; + + this.multiplier = true; + var prev = this.prev(); + var val = m[0]; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + var node = pos(new Node({ + type: 'text', + multiplier: 1, + match: m, + val: val + })); + + return concatNodes.call(this, pos, node, prev, options); + }) + + /** + * Open + */ + + .set('brace.open', function() { + var pos = this.position(); + var m = this.match(/^\{(?!(?:[^\\}]?|,+)\})/); + if (!m) return; + + var prev = this.prev(); + var last = utils.last(prev.nodes); + + // if the last parsed character was an extglob character + // we need to _not optimize_ the brace pattern because + // it might be mistaken for an extglob by a downstream parser + if (last && last.val && isExtglobChar(last.val.slice(-1))) { + last.optimize = false; + } + + var open = pos(new Node({ + type: 'brace.open', + val: m[0] + })); + + var node = pos(new Node({ + type: 'brace', + nodes: [] + })); + + node.push(open); + prev.push(node); + this.push('brace', node); + }) + + /** + * Close + */ + + .set('brace.close', function() { + var pos = this.position(); + var m = this.match(/^\}/); + if (!m || !m[0]) return; + + var brace = this.pop('brace'); + var node = pos(new Node({ + type: 'brace.close', + val: m[0] + })); + + if (!this.isType(brace, 'brace')) { + if (this.options.strict) { + throw new Error('missing opening "{"'); + } + node.type = 'text'; + node.multiplier = 0; + node.escaped = true; + return node; + } + + var prev = this.prev(); + var last = utils.last(prev.nodes); + if (last.text) { + var lastNode = utils.last(last.nodes); + if (lastNode.val === ')' && /[!@*?+]\(/.test(last.text)) { + var open = last.nodes[0]; + var text = last.nodes[1]; + if (open.type === 'brace.open' && text && text.type === 'text') { + text.optimize = false; + } + } + } + + if (brace.nodes.length > 2) { + var first = brace.nodes[1]; + if (first.type === 'text' && first.val === ',') { + brace.nodes.splice(1, 1); + brace.nodes.push(first); + } + } + + brace.push(node); + }) + + /** + * Capture boundary characters + */ + + .set('boundary', function() { + var pos = this.position(); + var m = this.match(/^[$^](?!\{)/); + if (!m) return; + return pos(new Node({ + type: 'text', + val: m[0] + })); + }) + + /** + * One or zero, non-comma characters wrapped in braces + */ + + .set('nobrace', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^\{[^,]?\}/); + if (!m) return; + + var prev = this.prev(); + var val = m[0]; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + return pos(new Node({ + type: 'text', + multiplier: 0, + val: val + })); + }) + + /** + * Text + */ + + .set('text', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^((?!\\)[^${}[\]])+/); + if (!m) return; + + var prev = this.prev(); + var val = m[0]; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + var node = pos(new Node({ + type: 'text', + multiplier: 1, + val: val + })); + + return concatNodes.call(this, pos, node, prev, options); + }); +}; + +/** + * Returns true if the character is an extglob character. + */ + +function isExtglobChar(ch) { + return ch === '!' || ch === '@' || ch === '*' || ch === '?' || ch === '+'; +} + +/** + * Combine text nodes, and calculate empty sets (`{,,}`) + * @param {Function} `pos` Function to calculate node position + * @param {Object} `node` AST node + * @return {Object} + */ + +function concatNodes(pos, node, parent, options) { + node.orig = node.val; + var prev = this.prev(); + var last = utils.last(prev.nodes); + var isEscaped = false; + + if (node.val.length > 1) { + var a = node.val.charAt(0); + var b = node.val.slice(-1); + + isEscaped = (a === '"' && b === '"') + || (a === "'" && b === "'") + || (a === '`' && b === '`'); + } + + if (isEscaped && options.unescape !== false) { + node.val = node.val.slice(1, node.val.length - 1); + node.escaped = true; + } + + if (node.match) { + var match = node.match[1]; + if (!match || match.indexOf('}') === -1) { + match = node.match[0]; + } + + // replace each set with a single "," + var val = match.replace(/\{/g, ',').replace(/\}/g, ''); + node.multiplier *= val.length; + node.val = ''; + } + + var simpleText = last.type === 'text' + && last.multiplier === 1 + && node.multiplier === 1 + && node.val; + + if (simpleText) { + last.val += node.val; + return; + } + + prev.push(node); +} diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js new file mode 100644 index 0000000..4716671 --- /dev/null +++ b/node_modules/braces/lib/utils.js @@ -0,0 +1,343 @@ +'use strict'; + +var splitString = require('split-string'); +var utils = module.exports; + +/** + * Module dependencies + */ + +utils.extend = require('extend-shallow'); +utils.flatten = require('arr-flatten'); +utils.isObject = require('isobject'); +utils.fillRange = require('fill-range'); +utils.repeat = require('repeat-element'); +utils.unique = require('array-unique'); + +utils.define = function(obj, key, val) { + Object.defineProperty(obj, key, { + writable: true, + configurable: true, + enumerable: false, + value: val + }); +}; + +/** + * Returns true if the given string contains only empty brace sets. + */ + +utils.isEmptySets = function(str) { + return /^(?:\{,\})+$/.test(str); +}; + +/** + * Returns true if the given string contains only empty brace sets. + */ + +utils.isQuotedString = function(str) { + var open = str.charAt(0); + if (open === '\'' || open === '"' || open === '`') { + return str.slice(-1) === open; + } + return false; +}; + +/** + * Create the key to use for memoization. The unique key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +utils.createKey = function(pattern, options) { + var id = pattern; + if (typeof options === 'undefined') { + return id; + } + var keys = Object.keys(options); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + id += ';' + key + '=' + String(options[key]); + } + return id; +}; + +/** + * Normalize options + */ + +utils.createOptions = function(options) { + var opts = utils.extend.apply(null, arguments); + if (typeof opts.expand === 'boolean') { + opts.optimize = !opts.expand; + } + if (typeof opts.optimize === 'boolean') { + opts.expand = !opts.optimize; + } + if (opts.optimize === true) { + opts.makeRe = true; + } + return opts; +}; + +/** + * Join patterns in `a` to patterns in `b` + */ + +utils.join = function(a, b, options) { + options = options || {}; + a = utils.arrayify(a); + b = utils.arrayify(b); + + if (!a.length) return b; + if (!b.length) return a; + + var len = a.length; + var idx = -1; + var arr = []; + + while (++idx < len) { + var val = a[idx]; + if (Array.isArray(val)) { + for (var i = 0; i < val.length; i++) { + val[i] = utils.join(val[i], b, options); + } + arr.push(val); + continue; + } + + for (var j = 0; j < b.length; j++) { + var bval = b[j]; + + if (Array.isArray(bval)) { + arr.push(utils.join(val, bval, options)); + } else { + arr.push(val + bval); + } + } + } + return arr; +}; + +/** + * Split the given string on `,` if not escaped. + */ + +utils.split = function(str, options) { + var opts = utils.extend({sep: ','}, options); + if (typeof opts.keepQuotes !== 'boolean') { + opts.keepQuotes = true; + } + if (opts.unescape === false) { + opts.keepEscaping = true; + } + return splitString(str, opts, utils.escapeBrackets(opts)); +}; + +/** + * Expand ranges or sets in the given `pattern`. + * + * @param {String} `str` + * @param {Object} `options` + * @return {Object} + */ + +utils.expand = function(str, options) { + var opts = utils.extend({rangeLimit: 10000}, options); + var segs = utils.split(str, opts); + var tok = { segs: segs }; + + if (utils.isQuotedString(str)) { + return tok; + } + + if (opts.rangeLimit === true) { + opts.rangeLimit = 10000; + } + + if (segs.length > 1) { + if (opts.optimize === false) { + tok.val = segs[0]; + return tok; + } + + tok.segs = utils.stringifyArray(tok.segs); + } else if (segs.length === 1) { + var arr = str.split('..'); + + if (arr.length === 1) { + tok.val = tok.segs[tok.segs.length - 1] || tok.val || str; + tok.segs = []; + return tok; + } + + if (arr.length === 2 && arr[0] === arr[1]) { + tok.escaped = true; + tok.val = arr[0]; + tok.segs = []; + return tok; + } + + if (arr.length > 1) { + if (opts.optimize !== false) { + opts.optimize = true; + delete opts.expand; + } + + if (opts.optimize !== true) { + var min = Math.min(arr[0], arr[1]); + var max = Math.max(arr[0], arr[1]); + var step = arr[2] || 1; + + if (opts.rangeLimit !== false && ((max - min) / step >= opts.rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + } + + arr.push(opts); + tok.segs = utils.fillRange.apply(null, arr); + + if (!tok.segs.length) { + tok.escaped = true; + tok.val = str; + return tok; + } + + if (opts.optimize === true) { + tok.segs = utils.stringifyArray(tok.segs); + } + + if (tok.segs === '') { + tok.val = str; + } else { + tok.val = tok.segs[0]; + } + return tok; + } + } else { + tok.val = str; + } + return tok; +}; + +/** + * Ensure commas inside brackets and parens are not split. + * @param {Object} `tok` Token from the `split-string` module + * @return {undefined} + */ + +utils.escapeBrackets = function(options) { + return function(tok) { + if (tok.escaped && tok.val === 'b') { + tok.val = '\\b'; + return; + } + + if (tok.val !== '(' && tok.val !== '[') return; + var opts = utils.extend({}, options); + var brackets = []; + var parens = []; + var stack = []; + var val = tok.val; + var str = tok.str; + var i = tok.idx - 1; + + while (++i < str.length) { + var ch = str[i]; + + if (ch === '\\') { + val += (opts.keepEscaping === false ? '' : ch) + str[++i]; + continue; + } + + if (ch === '(') { + parens.push(ch); + stack.push(ch); + } + + if (ch === '[') { + brackets.push(ch); + stack.push(ch); + } + + if (ch === ')') { + parens.pop(); + stack.pop(); + if (!stack.length) { + val += ch; + break; + } + } + + if (ch === ']') { + brackets.pop(); + stack.pop(); + if (!stack.length) { + val += ch; + break; + } + } + val += ch; + } + + tok.split = false; + tok.val = val.slice(1); + tok.idx = i; + }; +}; + +/** + * Returns true if the given string looks like a regex quantifier + * @return {Boolean} + */ + +utils.isQuantifier = function(str) { + return /^(?:[0-9]?,[0-9]|[0-9],)$/.test(str); +}; + +/** + * Cast `val` to an array. + * @param {*} `val` + */ + +utils.stringifyArray = function(arr) { + return [utils.arrayify(arr).join('|')]; +}; + +/** + * Cast `val` to an array. + * @param {*} `val` + */ + +utils.arrayify = function(arr) { + if (typeof arr === 'undefined') { + return []; + } + if (typeof arr === 'string') { + return [arr]; + } + return arr; +}; + +/** + * Returns true if the given `str` is a non-empty string + * @return {Boolean} + */ + +utils.isString = function(str) { + return str != null && typeof str === 'string'; +}; + +/** + * Get the last element from `array` + * @param {Array} `array` + * @return {*} + */ + +utils.last = function(arr, n) { + return arr[arr.length - (n || 1)]; +}; + +utils.escapeRegex = function(str) { + return str.replace(/\\?([!^*?()[\]{}+?/])/g, '\\$1'); +}; diff --git a/node_modules/braces/node_modules/extend-shallow/LICENSE b/node_modules/braces/node_modules/extend-shallow/LICENSE new file mode 100644 index 0000000..fa30c4c --- /dev/null +++ b/node_modules/braces/node_modules/extend-shallow/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015, Jon Schlinkert. + +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/braces/node_modules/extend-shallow/README.md b/node_modules/braces/node_modules/extend-shallow/README.md new file mode 100644 index 0000000..cdc45d4 --- /dev/null +++ b/node_modules/braces/node_modules/extend-shallow/README.md @@ -0,0 +1,61 @@ +# extend-shallow [![NPM version](https://badge.fury.io/js/extend-shallow.svg)](http://badge.fury.io/js/extend-shallow) [![Build Status](https://travis-ci.org/jonschlinkert/extend-shallow.svg)](https://travis-ci.org/jonschlinkert/extend-shallow) + +> Extend an object with the properties of additional objects. node.js/javascript util. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i extend-shallow --save +``` + +## Usage + +```js +var extend = require('extend-shallow'); + +extend({a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +Pass an empty object to shallow clone: + +```js +var obj = {}; +extend(obj, {a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +## Related + +* [extend-shallow](https://github.com/jonschlinkert/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. +* [for-own](https://github.com/jonschlinkert/for-own): Iterate over the own enumerable properties of an object, and return an object with properties… [more](https://github.com/jonschlinkert/for-own) +* [for-in](https://github.com/jonschlinkert/for-in): Iterate over the own and inherited enumerable properties of an objecte, and return an object… [more](https://github.com/jonschlinkert/for-in) +* [is-plain-object](https://github.com/jonschlinkert/is-plain-object): Returns true if an object was created by the `Object` constructor. +* [isobject](https://github.com/jonschlinkert/isobject): Returns true if the value is an object and not an array or null. +* [kind-of](https://github.com/jonschlinkert/kind-of): Get the native type of a value. + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on June 29, 2015._ \ No newline at end of file diff --git a/node_modules/braces/node_modules/extend-shallow/index.js b/node_modules/braces/node_modules/extend-shallow/index.js new file mode 100644 index 0000000..92a067f --- /dev/null +++ b/node_modules/braces/node_modules/extend-shallow/index.js @@ -0,0 +1,33 @@ +'use strict'; + +var isObject = require('is-extendable'); + +module.exports = function extend(o/*, objects*/) { + if (!isObject(o)) { o = {}; } + + var len = arguments.length; + for (var i = 1; i < len; i++) { + var obj = arguments[i]; + + if (isObject(obj)) { + assign(o, obj); + } + } + return o; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} diff --git a/node_modules/braces/node_modules/extend-shallow/package.json b/node_modules/braces/node_modules/extend-shallow/package.json new file mode 100644 index 0000000..a5be663 --- /dev/null +++ b/node_modules/braces/node_modules/extend-shallow/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "extend-shallow@2.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "extend-shallow@2.0.1", + "_id": "extend-shallow@2.0.1", + "_inBundle": false, + "_integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "_location": "/braces/extend-shallow", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "extend-shallow@2.0.1", + "name": "extend-shallow", + "escapedName": "extend-shallow", + "rawSpec": "2.0.1", + "saveSpec": null, + "fetchSpec": "2.0.1" + }, + "_requiredBy": [ + "/braces" + ], + "_resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "_spec": "2.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/extend-shallow/issues" + }, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "description": "Extend an object with the properties of additional objects. node.js/javascript util.", + "devDependencies": { + "array-slice": "^0.2.3", + "benchmarked": "^0.1.4", + "chalk": "^1.0.0", + "for-own": "^0.1.3", + "glob": "^5.0.12", + "is-plain-object": "^2.0.1", + "kind-of": "^2.0.0", + "minimist": "^1.1.1", + "mocha": "^2.2.5", + "should": "^7.0.1" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/extend-shallow", + "keywords": [ + "assign", + "extend", + "javascript", + "js", + "keys", + "merge", + "obj", + "object", + "prop", + "properties", + "property", + "props", + "shallow", + "util", + "utility", + "utils", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "extend-shallow", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/extend-shallow.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "2.0.1" +} diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json new file mode 100644 index 0000000..e7f8962 --- /dev/null +++ b/node_modules/braces/package.json @@ -0,0 +1,159 @@ +{ + "_args": [ + [ + "braces@2.3.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "braces@2.3.2", + "_id": "braces@2.3.2", + "_inBundle": false, + "_integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "_location": "/braces", + "_phantomChildren": { + "is-extendable": "0.1.1" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "braces@2.3.2", + "name": "braces", + "escapedName": "braces", + "rawSpec": "2.3.2", + "saveSpec": null, + "fetchSpec": "2.3.2" + }, + "_requiredBy": [ + "/micromatch" + ], + "_resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "_spec": "2.3.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/micromatch/braces/issues" + }, + "contributors": [ + { + "name": "Brian Woodward", + "url": "https://twitter.com/doowb" + }, + { + "name": "Elan Shanker", + "url": "https://github.com/es128" + }, + { + "name": "Eugene Sharygin", + "url": "https://github.com/eush77" + }, + { + "name": "hemanth.hm", + "url": "http://h3manth.com" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + } + ], + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", + "devDependencies": { + "ansi-cyan": "^0.1.1", + "benchmarked": "^2.0.0", + "brace-expansion": "^1.1.8", + "cross-spawn": "^5.1.0", + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^1.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "gulp-unused": "^0.2.1", + "is-windows": "^1.0.1", + "minimatch": "^3.0.4", + "mocha": "^3.2.0", + "noncharacters": "^1.1.0", + "text-table": "^0.2.0", + "time-diff": "^0.3.1", + "yargs-parser": "^8.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js", + "lib" + ], + "homepage": "https://github.com/micromatch/braces", + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "braces", + "expand", + "expansion", + "filepath", + "fill", + "fs", + "glob", + "globbing", + "letter", + "match", + "matches", + "matching", + "number", + "numerical", + "path", + "range", + "ranges", + "sh" + ], + "license": "MIT", + "main": "index.js", + "name": "braces", + "repository": { + "type": "git", + "url": "git+https://github.com/micromatch/braces.git" + }, + "scripts": { + "benchmark": "node benchmark", + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + }, + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "expand-brackets", + "extglob", + "fill-range", + "micromatch", + "nanomatch" + ] + } + }, + "version": "2.3.2" +} diff --git a/node_modules/bytes/History.md b/node_modules/bytes/History.md new file mode 100644 index 0000000..cf6a5bb --- /dev/null +++ b/node_modules/bytes/History.md @@ -0,0 +1,87 @@ +3.1.0 / 2019-01-22 +================== + + * Add petabyte (`pb`) support + +3.0.0 / 2017-08-31 +================== + + * Change "kB" to "KB" in format output + * Remove support for Node.js 0.6 + * Remove support for ComponentJS + +2.5.0 / 2017-03-24 +================== + + * Add option "unit" + +2.4.0 / 2016-06-01 +================== + + * Add option "unitSeparator" + +2.3.0 / 2016-02-15 +================== + + * Drop partial bytes on all parsed units + * Fix non-finite numbers to `.format` to return `null` + * Fix parsing byte string that looks like hex + * perf: hoist regular expressions + +2.2.0 / 2015-11-13 +================== + + * add option "decimalPlaces" + * add option "fixedDecimals" + +2.1.0 / 2015-05-21 +================== + + * add `.format` export + * add `.parse` export + +2.0.2 / 2015-05-20 +================== + + * remove map recreation + * remove unnecessary object construction + +2.0.1 / 2015-05-07 +================== + + * fix browserify require + * remove node.extend dependency + +2.0.0 / 2015-04-12 +================== + + * add option "case" + * add option "thousandsSeparator" + * return "null" on invalid parse input + * support proper round-trip: bytes(bytes(num)) === num + * units no longer case sensitive when parsing + +1.0.0 / 2014-05-05 +================== + + * add negative support. fixes #6 + +0.3.0 / 2014-03-19 +================== + + * added terabyte support + +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/bytes/LICENSE b/node_modules/bytes/LICENSE new file mode 100644 index 0000000..63e95a9 --- /dev/null +++ b/node_modules/bytes/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +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/bytes/Readme.md b/node_modules/bytes/Readme.md new file mode 100644 index 0000000..6ad1ec6 --- /dev/null +++ b/node_modules/bytes/Readme.md @@ -0,0 +1,126 @@ +# Bytes utility + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install bytes +``` + +## Usage + +```js +var bytes = require('bytes'); +``` + +#### bytes.format(number value, [options]): string|null + +Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is + rounded. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number` | Value in bytes | +| options | `Object` | Conversion options | + +**Options** + +| Property | Type | Description | +|-------------------|--------|-----------------------------------------------------------------------------------------| +| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. | +| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` | +| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `.`... Default value to `''`. | +| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). | +| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`null` | Return null upon error. String value otherwise. | + +**Example** + +```js +bytes(1024); +// output: '1KB' + +bytes(1000); +// output: '1000B' + +bytes(1000, {thousandsSeparator: ' '}); +// output: '1 000B' + +bytes(1024 * 1.7, {decimalPlaces: 0}); +// output: '2KB' + +bytes(1024, {unitSeparator: ' '}); +// output: '1 KB' + +``` + +#### bytes.parse(string|number value): number|null + +Parse the string value into an integer in bytes. If no unit is given, or `value` +is a number, it is assumed the value is in bytes. + +Supported units and abbreviations are as follows and are case-insensitive: + + * `b` for bytes + * `kb` for kilobytes + * `mb` for megabytes + * `gb` for gigabytes + * `tb` for terabytes + * `pb` for petabytes + +The units are in powers of two, not ten. This means 1kb = 1024b according to this parser. + +**Arguments** + +| Name | Type | Description | +|---------------|--------|--------------------| +| value | `string`|`number` | String to parse, or number in bytes. | + +**Returns** + +| Name | Type | Description | +|---------|-------------|-------------------------| +| results | `number`|`null` | Return null upon error. Value in bytes otherwise. | + +**Example** + +```js +bytes('1KB'); +// output: 1024 + +bytes('1024'); +// output: 1024 + +bytes(1024); +// output: 1KB +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master +[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master +[downloads-image]: https://badgen.net/npm/dm/bytes +[downloads-url]: https://npmjs.org/package/bytes +[npm-image]: https://badgen.net/npm/node/bytes +[npm-url]: https://npmjs.org/package/bytes +[travis-image]: https://badgen.net/travis/visionmedia/bytes.js/master +[travis-url]: https://travis-ci.org/visionmedia/bytes.js diff --git a/node_modules/bytes/index.js b/node_modules/bytes/index.js new file mode 100644 index 0000000..4975bfb --- /dev/null +++ b/node_modules/bytes/index.js @@ -0,0 +1,162 @@ +/*! + * bytes + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015 Jed Watson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = bytes; +module.exports.format = format; +module.exports.parse = parse; + +/** + * Module variables. + * @private + */ + +var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; + +var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; + +var map = { + b: 1, + kb: 1 << 10, + mb: 1 << 20, + gb: 1 << 30, + tb: Math.pow(1024, 4), + pb: Math.pow(1024, 5), +}; + +var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i; + +/** + * Convert the given value in bytes into a string or parse to string to an integer in bytes. + * + * @param {string|number} value + * @param {{ + * case: [string], + * decimalPlaces: [number] + * fixedDecimals: [boolean] + * thousandsSeparator: [string] + * unitSeparator: [string] + * }} [options] bytes options. + * + * @returns {string|number|null} + */ + +function bytes(value, options) { + if (typeof value === 'string') { + return parse(value); + } + + if (typeof value === 'number') { + return format(value, options); + } + + return null; +} + +/** + * Format the given value in bytes into a string. + * + * If the value is negative, it is kept as such. If it is a float, + * it is rounded. + * + * @param {number} value + * @param {object} [options] + * @param {number} [options.decimalPlaces=2] + * @param {number} [options.fixedDecimals=false] + * @param {string} [options.thousandsSeparator=] + * @param {string} [options.unit=] + * @param {string} [options.unitSeparator=] + * + * @returns {string|null} + * @public + */ + +function format(value, options) { + if (!Number.isFinite(value)) { + return null; + } + + var mag = Math.abs(value); + var thousandsSeparator = (options && options.thousandsSeparator) || ''; + var unitSeparator = (options && options.unitSeparator) || ''; + var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; + var fixedDecimals = Boolean(options && options.fixedDecimals); + var unit = (options && options.unit) || ''; + + if (!unit || !map[unit.toLowerCase()]) { + if (mag >= map.pb) { + unit = 'PB'; + } else if (mag >= map.tb) { + unit = 'TB'; + } else if (mag >= map.gb) { + unit = 'GB'; + } else if (mag >= map.mb) { + unit = 'MB'; + } else if (mag >= map.kb) { + unit = 'KB'; + } else { + unit = 'B'; + } + } + + var val = value / map[unit.toLowerCase()]; + var str = val.toFixed(decimalPlaces); + + if (!fixedDecimals) { + str = str.replace(formatDecimalsRegExp, '$1'); + } + + if (thousandsSeparator) { + str = str.replace(formatThousandsRegExp, thousandsSeparator); + } + + return str + unitSeparator + unit; +} + +/** + * Parse the string value into an integer in bytes. + * + * If no unit is given, it is assumed the value is in bytes. + * + * @param {number|string} val + * + * @returns {number|null} + * @public + */ + +function parse(val) { + if (typeof val === 'number' && !isNaN(val)) { + return val; + } + + if (typeof val !== 'string') { + return null; + } + + // Test if the string passed is valid + var results = parseRegExp.exec(val); + var floatValue; + var unit = 'b'; + + if (!results) { + // Nothing could be extracted from the given string + floatValue = parseInt(val, 10); + unit = 'b' + } else { + // Retrieve the value and the unit + floatValue = parseFloat(results[1]); + unit = results[4].toLowerCase(); + } + + return Math.floor(map[unit] * floatValue); +} diff --git a/node_modules/bytes/package.json b/node_modules/bytes/package.json new file mode 100644 index 0000000..466369f --- /dev/null +++ b/node_modules/bytes/package.json @@ -0,0 +1,87 @@ +{ + "_args": [ + [ + "bytes@3.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "bytes@3.1.0", + "_id": "bytes@3.1.0", + "_inBundle": false, + "_integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "_location": "/bytes", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "bytes@3.1.0", + "name": "bytes", + "escapedName": "bytes", + "rawSpec": "3.1.0", + "saveSpec": null, + "fetchSpec": "3.1.0" + }, + "_requiredBy": [ + "/body-parser", + "/raw-body" + ], + "_resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "_spec": "3.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "bugs": { + "url": "https://github.com/visionmedia/bytes.js/issues" + }, + "contributors": [ + { + "name": "Jed Watson", + "email": "jed.watson@me.com" + }, + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Utility to parse a string bytes to bytes and vice-versa", + "devDependencies": { + "eslint": "5.12.1", + "mocha": "5.2.0", + "nyc": "13.1.0" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "History.md", + "LICENSE", + "Readme.md", + "index.js" + ], + "homepage": "https://github.com/visionmedia/bytes.js#readme", + "keywords": [ + "byte", + "bytes", + "utility", + "parse", + "parser", + "convert", + "converter" + ], + "license": "MIT", + "name": "bytes", + "repository": { + "type": "git", + "url": "git+https://github.com/visionmedia/bytes.js.git" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --check-leaks --reporter spec", + "test-ci": "nyc --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "version": "3.1.0" +} diff --git a/node_modules/cache-base/LICENSE b/node_modules/cache-base/LICENSE new file mode 100644 index 0000000..943e71d --- /dev/null +++ b/node_modules/cache-base/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert. + +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/cache-base/README.md b/node_modules/cache-base/README.md new file mode 100644 index 0000000..62c6ffe --- /dev/null +++ b/node_modules/cache-base/README.md @@ -0,0 +1,291 @@ +# cache-base [![NPM version](https://img.shields.io/npm/v/cache-base.svg?style=flat)](https://www.npmjs.com/package/cache-base) [![NPM monthly downloads](https://img.shields.io/npm/dm/cache-base.svg?style=flat)](https://npmjs.org/package/cache-base) [![NPM total downloads](https://img.shields.io/npm/dt/cache-base.svg?style=flat)](https://npmjs.org/package/cache-base) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/cache-base.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/cache-base) + +> Basic object cache with `get`, `set`, `del`, and `has` methods for node.js/javascript projects. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save cache-base +``` + +## Usage + +```js +var Cache = require('cache-base'); + +// instantiate +var app = new Cache(); + +// set values +app.set('a', 'b'); +app.set('c.d', 'e'); + +// get values +app.get('a'); +//=> 'b' +app.get('c'); +//=> {d: 'e'} + +console.log(app.cache); +//=> {a: 'b'} +``` + +**Inherit** + +```js +var util = require('util'); +var Cache = require('cache-base'); + +function MyApp() { + Cache.call(this); +} +util.inherits(MyApp, Cache); + +var app = new MyApp(); +app.set('a', 'b'); +app.get('a'); +//=> 'b' +``` + +**Namespace** + +Define a custom property for storing values. + +```js +var Cache = require('cache-base').namespace('data'); +var app = new Cache(); +app.set('a', 'b'); +console.log(app.data); +//=> {a: 'b'} +``` + +## API + +### [namespace](index.js#L29) + +Create a `Cache` constructor that when instantiated will store values on the given `prop`. + +**Params** + +* `prop` **{String}**: The property name to use for storing values. +* `returns` **{Function}**: Returns a custom `Cache` constructor + +**Example** + +```js +var Cache = require('cache-base').namespace('data'); +var cache = new Cache(); + +cache.set('foo', 'bar'); +//=> {data: {foo: 'bar'}} +``` + +### [Cache](index.js#L43) + +Create a new `Cache`. Internally the `Cache` constructor is created using the `namespace` function, with `cache` defined as the storage object. + +**Params** + +* `cache` **{Object}**: Optionally pass an object to initialize with. + +**Example** + +```js +var app = new Cache(); +``` + +### [.set](index.js#L84) + +Assign `value` to `key`. Also emits `set` with the key and value. + +**Params** + +* `key` **{String}** +* `value` **{any}** +* `returns` **{Object}**: Returns the instance for chaining. + +**Events** + +* `emits`: `set` with `key` and `value` as arguments. + +**Example** + +```js +app.on('set', function(key, val) { + // do something when `set` is emitted +}); + +app.set(key, value); + +// also takes an object or array +app.set({name: 'Halle'}); +app.set([{foo: 'bar'}, {baz: 'quux'}]); +console.log(app); +//=> {name: 'Halle', foo: 'bar', baz: 'quux'} +``` + +### [.union](index.js#L114) + +Union `array` to `key`. Also emits `set` with the key and value. + +**Params** + +* `key` **{String}** +* `value` **{any}** +* `returns` **{Object}**: Returns the instance for chaining. + +**Example** + +```js +app.union('a.b', ['foo']); +app.union('a.b', ['bar']); +console.log(app.get('a')); +//=> {b: ['foo', 'bar']} +``` + +### [.get](index.js#L144) + +Return the value of `key`. Dot notation may be used to get [nested property values](https://github.com/jonschlinkert/get-value). + +**Params** + +* `key` **{String}**: The name of the property to get. Dot-notation may be used. +* `returns` **{any}**: Returns the value of `key` + +**Events** + +* `emits`: `get` with `key` and `value` as arguments. + +**Example** + +```js +app.set('a.b.c', 'd'); +app.get('a.b'); +//=> {c: 'd'} + +app.get(['a', 'b']); +//=> {c: 'd'} +``` + +### [.has](index.js#L171) + +Return true if app has a stored value for `key`, false only if value is `undefined`. + +**Params** + +* `key` **{String}** +* `returns` **{Boolean}** + +**Events** + +* `emits`: `has` with `key` and true or false as arguments. + +**Example** + +```js +app.set('foo', 'bar'); +app.has('foo'); +//=> true +``` + +### [.del](index.js#L199) + +Delete one or more properties from the instance. + +**Params** + +* `key` **{String|Array}**: Property name or array of property names. +* `returns` **{Object}**: Returns the instance for chaining. + +**Events** + +* `emits`: `del` with the `key` as the only argument. + +**Example** + +```js +app.del(); // delete all +// or +app.del('foo'); +// or +app.del(['foo', 'bar']); +``` + +### [.clear](index.js#L218) + +Reset the entire cache to an empty object. + +**Example** + +```js +app.clear(); +``` + +### [.visit](index.js#L235) + +Visit `method` over the properties in the given object, or map +visit over the object-elements in an array. + +**Params** + +* `method` **{String}**: The name of the `base` method to call. +* `val` **{Object|Array}**: The object or array to iterate over. +* `returns` **{Object}**: Returns the instance for chaining. + +## About + +### Related projects + +* [base-methods](https://www.npmjs.com/package/base-methods): base-methods is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting… [more](https://github.com/jonschlinkert/base-methods) | [homepage](https://github.com/jonschlinkert/base-methods "base-methods is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`.") +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://github.com/jonschlinkert/has-value) | [homepage](https://github.com/jonschlinkert/has-value "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.") +* [option-cache](https://www.npmjs.com/package/option-cache): Simple API for managing options in JavaScript applications. | [homepage](https://github.com/jonschlinkert/option-cache "Simple API for managing options in JavaScript applications.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value "Delete nested properties from an object using dot notation.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 54 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 22, 2017._ \ No newline at end of file diff --git a/node_modules/cache-base/index.js b/node_modules/cache-base/index.js new file mode 100644 index 0000000..4128024 --- /dev/null +++ b/node_modules/cache-base/index.js @@ -0,0 +1,261 @@ +'use strict'; + +var isObject = require('isobject'); +var Emitter = require('component-emitter'); +var visit = require('collection-visit'); +var toPath = require('to-object-path'); +var union = require('union-value'); +var del = require('unset-value'); +var get = require('get-value'); +var has = require('has-value'); +var set = require('set-value'); + +/** + * Create a `Cache` constructor that when instantiated will + * store values on the given `prop`. + * + * ```js + * var Cache = require('cache-base').namespace('data'); + * var cache = new Cache(); + * + * cache.set('foo', 'bar'); + * //=> {data: {foo: 'bar'}} + * ``` + * @param {String} `prop` The property name to use for storing values. + * @return {Function} Returns a custom `Cache` constructor + * @api public + */ + +function namespace(prop) { + + /** + * Create a new `Cache`. Internally the `Cache` constructor is created using + * the `namespace` function, with `cache` defined as the storage object. + * + * ```js + * var app = new Cache(); + * ``` + * @param {Object} `cache` Optionally pass an object to initialize with. + * @constructor + * @api public + */ + + function Cache(cache) { + if (prop) { + this[prop] = {}; + } + if (cache) { + this.set(cache); + } + } + + /** + * Inherit Emitter + */ + + Emitter(Cache.prototype); + + /** + * Assign `value` to `key`. Also emits `set` with + * the key and value. + * + * ```js + * app.on('set', function(key, val) { + * // do something when `set` is emitted + * }); + * + * app.set(key, value); + * + * // also takes an object or array + * app.set({name: 'Halle'}); + * app.set([{foo: 'bar'}, {baz: 'quux'}]); + * console.log(app); + * //=> {name: 'Halle', foo: 'bar', baz: 'quux'} + * ``` + * + * @name .set + * @emits `set` with `key` and `value` as arguments. + * @param {String} `key` + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.set = function(key, val) { + if (Array.isArray(key) && arguments.length === 2) { + key = toPath(key); + } + if (isObject(key) || Array.isArray(key)) { + this.visit('set', key); + } else { + set(prop ? this[prop] : this, key, val); + this.emit('set', key, val); + } + return this; + }; + + /** + * Union `array` to `key`. Also emits `set` with + * the key and value. + * + * ```js + * app.union('a.b', ['foo']); + * app.union('a.b', ['bar']); + * console.log(app.get('a')); + * //=> {b: ['foo', 'bar']} + * ``` + * @name .union + * @param {String} `key` + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.union = function(key, val) { + if (Array.isArray(key) && arguments.length === 2) { + key = toPath(key); + } + var ctx = prop ? this[prop] : this; + union(ctx, key, arrayify(val)); + this.emit('union', val); + return this; + }; + + /** + * Return the value of `key`. Dot notation may be used + * to get [nested property values][get-value]. + * + * ```js + * app.set('a.b.c', 'd'); + * app.get('a.b'); + * //=> {c: 'd'} + * + * app.get(['a', 'b']); + * //=> {c: 'd'} + * ``` + * + * @name .get + * @emits `get` with `key` and `value` as arguments. + * @param {String} `key` The name of the property to get. Dot-notation may be used. + * @return {any} Returns the value of `key` + * @api public + */ + + Cache.prototype.get = function(key) { + key = toPath(arguments); + + var ctx = prop ? this[prop] : this; + var val = get(ctx, key); + + this.emit('get', key, val); + return val; + }; + + /** + * Return true if app has a stored value for `key`, + * false only if value is `undefined`. + * + * ```js + * app.set('foo', 'bar'); + * app.has('foo'); + * //=> true + * ``` + * + * @name .has + * @emits `has` with `key` and true or false as arguments. + * @param {String} `key` + * @return {Boolean} + * @api public + */ + + Cache.prototype.has = function(key) { + key = toPath(arguments); + + var ctx = prop ? this[prop] : this; + var val = get(ctx, key); + + var has = typeof val !== 'undefined'; + this.emit('has', key, has); + return has; + }; + + /** + * Delete one or more properties from the instance. + * + * ```js + * app.del(); // delete all + * // or + * app.del('foo'); + * // or + * app.del(['foo', 'bar']); + * ``` + * @name .del + * @emits `del` with the `key` as the only argument. + * @param {String|Array} `key` Property name or array of property names. + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.del = function(key) { + if (Array.isArray(key)) { + this.visit('del', key); + } else { + del(prop ? this[prop] : this, key); + this.emit('del', key); + } + return this; + }; + + /** + * Reset the entire cache to an empty object. + * + * ```js + * app.clear(); + * ``` + * @api public + */ + + Cache.prototype.clear = function() { + if (prop) { + this[prop] = {}; + } + }; + + /** + * Visit `method` over the properties in the given object, or map + * visit over the object-elements in an array. + * + * @name .visit + * @param {String} `method` The name of the `base` method to call. + * @param {Object|Array} `val` The object or array to iterate over. + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.visit = function(method, val) { + visit(this, method, val); + return this; + }; + + return Cache; +} + +/** + * Cast val to an array + */ + +function arrayify(val) { + return val ? (Array.isArray(val) ? val : [val]) : []; +} + +/** + * Expose `Cache` + */ + +module.exports = namespace(); + +/** + * Expose `Cache.namespace` + */ + +module.exports.namespace = namespace; diff --git a/node_modules/cache-base/package.json b/node_modules/cache-base/package.json new file mode 100644 index 0000000..514e79f --- /dev/null +++ b/node_modules/cache-base/package.json @@ -0,0 +1,121 @@ +{ + "_args": [ + [ + "cache-base@1.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "cache-base@1.0.1", + "_id": "cache-base@1.0.1", + "_inBundle": false, + "_integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "_location": "/cache-base", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "cache-base@1.0.1", + "name": "cache-base", + "escapedName": "cache-base", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/base" + ], + "_resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "_spec": "1.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/cache-base/issues" + }, + "contributors": [ + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "url": "https://github.com/wtgtybhertgeghgtwtg" + } + ], + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "description": "Basic object cache with `get`, `set`, `del`, and `has` methods for node.js/javascript projects.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.4.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/cache-base", + "keywords": [ + "base", + "cache", + "config", + "data", + "get", + "has", + "hash", + "hasown", + "object", + "set", + "store" + ], + "license": "MIT", + "main": "index.js", + "name": "cache-base", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/cache-base.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "highligh": "base", + "list": [ + "base-methods", + "get-value", + "has-value", + "option-cache", + "set-value", + "unset-value" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.0.1" +} diff --git a/node_modules/camelcase/index.js b/node_modules/camelcase/index.js new file mode 100644 index 0000000..c8492a2 --- /dev/null +++ b/node_modules/camelcase/index.js @@ -0,0 +1,64 @@ +'use strict'; + +function preserveCamelCase(str) { + let isLastCharLower = false; + let isLastCharUpper = false; + let isLastLastCharUpper = false; + + for (let i = 0; i < str.length; i++) { + const c = str[i]; + + if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) { + str = str.substr(0, i) + '-' + str.substr(i); + isLastCharLower = false; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = true; + i++; + } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) { + str = str.substr(0, i - 1) + '-' + str.substr(i - 1); + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = false; + isLastCharLower = true; + } else { + isLastCharLower = c.toLowerCase() === c; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = c.toUpperCase() === c; + } + } + + return str; +} + +module.exports = function (str) { + if (arguments.length > 1) { + str = Array.from(arguments) + .map(x => x.trim()) + .filter(x => x.length) + .join('-'); + } else { + str = str.trim(); + } + + if (str.length === 0) { + return ''; + } + + if (str.length === 1) { + return str.toLowerCase(); + } + + if (/^[a-z0-9]+$/.test(str)) { + return str; + } + + const hasUpperCase = str !== str.toLowerCase(); + + if (hasUpperCase) { + str = preserveCamelCase(str); + } + + return str + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase()); +}; diff --git a/node_modules/camelcase/license b/node_modules/camelcase/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/camelcase/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/camelcase/package.json b/node_modules/camelcase/package.json new file mode 100644 index 0000000..0e9d850 --- /dev/null +++ b/node_modules/camelcase/package.json @@ -0,0 +1,78 @@ +{ + "_args": [ + [ + "camelcase@4.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "camelcase@4.1.0", + "_id": "camelcase@4.1.0", + "_inBundle": false, + "_integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "_location": "/camelcase", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "camelcase@4.1.0", + "name": "camelcase", + "escapedName": "camelcase", + "rawSpec": "4.1.0", + "saveSpec": null, + "fetchSpec": "4.1.0" + }, + "_requiredBy": [ + "/boxen" + ], + "_resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "_spec": "4.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/camelcase/issues" + }, + "description": "Convert a dash/dot/underscore/space separated string to camelCase: foo-bar → fooBar", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/camelcase#readme", + "keywords": [ + "camelcase", + "camel-case", + "camel", + "case", + "dash", + "hyphen", + "dot", + "underscore", + "separator", + "string", + "text", + "convert" + ], + "license": "MIT", + "name": "camelcase", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/camelcase.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "4.1.0", + "xo": { + "esnext": true + } +} diff --git a/node_modules/camelcase/readme.md b/node_modules/camelcase/readme.md new file mode 100644 index 0000000..0610dc6 --- /dev/null +++ b/node_modules/camelcase/readme.md @@ -0,0 +1,57 @@ +# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase) + +> Convert a dash/dot/underscore/space separated string to camelCase: `foo-bar` → `fooBar` + + +## Install + +``` +$ npm install --save camelcase +``` + + +## Usage + +```js +const camelCase = require('camelcase'); + +camelCase('foo-bar'); +//=> 'fooBar' + +camelCase('foo_bar'); +//=> 'fooBar' + +camelCase('Foo-Bar'); +//=> 'fooBar' + +camelCase('--foo.bar'); +//=> 'fooBar' + +camelCase('__foo__bar__'); +//=> 'fooBar' + +camelCase('foo bar'); +//=> 'fooBar' + +console.log(process.argv[3]); +//=> '--foo-bar' +camelCase(process.argv[3]); +//=> 'fooBar' + +camelCase('foo', 'bar'); +//=> 'fooBar' + +camelCase('__foo__', '--bar'); +//=> 'fooBar' +``` + + +## Related + +- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module +- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/camelize/.travis.yml b/node_modules/camelize/.travis.yml new file mode 100644 index 0000000..cc4dba2 --- /dev/null +++ b/node_modules/camelize/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/camelize/LICENSE b/node_modules/camelize/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/camelize/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/camelize/example/camel.js b/node_modules/camelize/example/camel.js new file mode 100644 index 0000000..e6c7d88 --- /dev/null +++ b/node_modules/camelize/example/camel.js @@ -0,0 +1,10 @@ +var camelize = require('../'); +var obj = { + fee_fie_foe: 'fum', + beep_boop: [ + { 'abc.xyz': 'mno' }, + { 'foo-bar': 'baz' } + ] +}; +var res = camelize(obj); +console.log(JSON.stringify(res, null, 2)); diff --git a/node_modules/camelize/index.js b/node_modules/camelize/index.js new file mode 100644 index 0000000..88f8b15 --- /dev/null +++ b/node_modules/camelize/index.js @@ -0,0 +1,59 @@ +module.exports = function(obj) { + if (typeof obj === 'string') return camelCase(obj); + return walk(obj); +}; + +function walk (obj) { + if (!obj || typeof obj !== 'object') return obj; + if (isDate(obj) || isRegex(obj)) return obj; + if (isArray(obj)) return map(obj, walk); + return reduce(objectKeys(obj), function (acc, key) { + var camel = camelCase(key); + acc[camel] = walk(obj[key]); + return acc; + }, {}); +} + +function camelCase(str) { + return str.replace(/[_.-](\w|$)/g, function (_,x) { + return x.toUpperCase(); + }); +} + +var isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; +}; + +var isDate = function (obj) { + return Object.prototype.toString.call(obj) === '[object Date]'; +}; + +var isRegex = function (obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var has = Object.prototype.hasOwnProperty; +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (has.call(obj, key)) keys.push(key); + } + return keys; +}; + +function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; +} + +function reduce (xs, f, acc) { + if (xs.reduce) return xs.reduce(f, acc); + for (var i = 0; i < xs.length; i++) { + acc = f(acc, xs[i], i); + } + return acc; +} diff --git a/node_modules/camelize/package.json b/node_modules/camelize/package.json new file mode 100644 index 0000000..3daf8e8 --- /dev/null +++ b/node_modules/camelize/package.json @@ -0,0 +1,83 @@ +{ + "_args": [ + [ + "camelize@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "camelize@1.0.0", + "_id": "camelize@1.0.0", + "_inBundle": false, + "_integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", + "_location": "/camelize", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "camelize@1.0.0", + "name": "camelize", + "escapedName": "camelize", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/helmet-csp" + ], + "_resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/substack/camelize/issues" + }, + "description": "recursively transform key strings to camel-case", + "devDependencies": { + "tape": "~2.3.2" + }, + "homepage": "https://github.com/substack/camelize", + "keywords": [ + "camel-case", + "json", + "transform" + ], + "license": "MIT", + "main": "index.js", + "name": "camelize", + "repository": { + "type": "git", + "url": "git://github.com/substack/camelize.git" + }, + "scripts": { + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": { + "iexplore": [ + "6.0", + "7.0", + "8.0", + "9.0" + ], + "chrome": [ + "20.0" + ], + "firefox": [ + "10.0", + "15.0" + ], + "safari": [ + "5.1" + ], + "opera": [ + "12.0" + ] + } + }, + "version": "1.0.0" +} diff --git a/node_modules/camelize/readme.markdown b/node_modules/camelize/readme.markdown new file mode 100644 index 0000000..6e2d284 --- /dev/null +++ b/node_modules/camelize/readme.markdown @@ -0,0 +1,62 @@ +# camelize + +recursively transform key strings to camel-case + +[![build status](https://secure.travis-ci.org/substack/camelize.png)](http://travis-ci.org/substack/camelize) + +[![browser support](https://ci.testling.com/substack/camelize.png)](http://ci.testling.com/substack/camelize) + +# example + +``` js +var camelize = require('camelize'); +var obj = { + fee_fie_foe: 'fum', + beep_boop: [ + { 'abc.xyz': 'mno' }, + { 'foo-bar': 'baz' } + ] +}; +var res = camelize(obj); +console.log(JSON.stringify(res, null, 2)); +``` + +output: + +``` +{ + "feeFieFoe": "fum", + "beepBoop": [ + { + "abcXyz": "mno" + }, + { + "fooBar": "baz" + } + ] +} +``` + +# methods + +``` js +var camelize = require('camelize') +``` + +## camelize(obj) + +Convert the key strings in `obj` to camel-case recursively. + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install camelize +``` + +To use in the browser, use [browserify](http://browserify.org). + +# license + +MIT diff --git a/node_modules/camelize/test/camel.js b/node_modules/camelize/test/camel.js new file mode 100644 index 0000000..a432ee1 --- /dev/null +++ b/node_modules/camelize/test/camel.js @@ -0,0 +1,46 @@ +var test = require('tape'); +var camelize = require('../'); + +var obj = { + fee_fie_foe: 'fum', + beep_boop: [ + { 'abc.xyz': 'mno' }, + { 'foo-bar': 'baz' } + ] +}; + +test('camelize a nested object', function (t) { + t.plan(1); + var res = camelize(obj); + t.deepEqual(res, { + "feeFieFoe": "fum", + "beepBoop": [ + { "abcXyz": "mno" }, + { "fooBar": "baz" } + ] + }); +}); + +test('string', function (t) { + t.plan(1); + t.equal(camelize('one_two'), 'oneTwo'); +}); + +test('date', function (t) { + t.plan(1); + var d = new Date(); + t.equal(camelize(d), d); +}); + +test('regex', function (t) { + t.plan(1); + var r = /1234/; + t.equal(camelize(r), r); +}); + +test('only camelize strings that are the root value', function (t) { + t.plan(2); + t.equal(camelize('foo-bar'), 'fooBar'); + var res = camelize({ 'foo-bar': 'baz-foo' }); + t.deepEqual(res, { fooBar: 'baz-foo' }); +}); diff --git a/node_modules/capture-stack-trace/index.js b/node_modules/capture-stack-trace/index.js new file mode 100644 index 0000000..1b696c8 --- /dev/null +++ b/node_modules/capture-stack-trace/index.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = Error.captureStackTrace || function (error) { + var container = new Error(); + + Object.defineProperty(error, 'stack', { + configurable: true, + get: function getStack() { + var stack = container.stack; + + Object.defineProperty(this, 'stack', { + value: stack + }); + + return stack; + } + }); +}; diff --git a/node_modules/capture-stack-trace/license b/node_modules/capture-stack-trace/license new file mode 100644 index 0000000..1aeb74f --- /dev/null +++ b/node_modules/capture-stack-trace/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +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/capture-stack-trace/package.json b/node_modules/capture-stack-trace/package.json new file mode 100644 index 0000000..4c72a67 --- /dev/null +++ b/node_modules/capture-stack-trace/package.json @@ -0,0 +1,65 @@ +{ + "_args": [ + [ + "capture-stack-trace@1.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "capture-stack-trace@1.0.1", + "_id": "capture-stack-trace@1.0.1", + "_inBundle": false, + "_integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "_location": "/capture-stack-trace", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "capture-stack-trace@1.0.1", + "name": "capture-stack-trace", + "escapedName": "capture-stack-trace", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/create-error-class" + ], + "_resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "_spec": "1.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Vsevolod Strukchinsky", + "email": "floatdrop@gmail.com", + "url": "github.com/floatdrop" + }, + "bugs": { + "url": "https://github.com/floatdrop/capture-stack-trace/issues" + }, + "dependencies": {}, + "description": "Error.captureStackTrace ponyfill", + "devDependencies": { + "mocha": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/floatdrop/capture-stack-trace#readme", + "keywords": [ + "Error", + "captureStackTrace" + ], + "license": "MIT", + "name": "capture-stack-trace", + "repository": { + "type": "git", + "url": "git+https://github.com/floatdrop/capture-stack-trace.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "1.0.1" +} diff --git a/node_modules/capture-stack-trace/readme.md b/node_modules/capture-stack-trace/readme.md new file mode 100644 index 0000000..a944ab9 --- /dev/null +++ b/node_modules/capture-stack-trace/readme.md @@ -0,0 +1,36 @@ +# capture-stack-trace [![Build Status](https://travis-ci.org/floatdrop/capture-stack-trace.svg?branch=master)](https://travis-ci.org/floatdrop/capture-stack-trace) + +> Ponyfill for Error.captureStackTrace + + +## Install + +``` +$ npm install --save capture-stack-trace +``` + + +## Usage + +```js +var captureStackTrace = require('capture-stack-trace'); + +captureStackTrace({}); +// => {stack: ...} +``` + + +## API + +### captureStackTrace(error) + +#### error + +*Required* +Type: `Object` + +Target Object, that will recieve stack property. + +## License + +MIT © [Vsevolod Strukchinsky](http://github.com/floatdrop) diff --git a/node_modules/caseless/LICENSE b/node_modules/caseless/LICENSE new file mode 100644 index 0000000..61789f4 --- /dev/null +++ b/node_modules/caseless/LICENSE @@ -0,0 +1,28 @@ +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: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +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 +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 \ No newline at end of file diff --git a/node_modules/caseless/README.md b/node_modules/caseless/README.md new file mode 100644 index 0000000..e5077a2 --- /dev/null +++ b/node_modules/caseless/README.md @@ -0,0 +1,45 @@ +## Caseless -- wrap an object to set and get property with caseless semantics but also preserve caseing. + +This library is incredibly useful when working with HTTP headers. It allows you to get/set/check for headers in a caseless manner while also preserving the caseing of headers the first time they are set. + +## Usage + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'asdf') +c.get('a-header') === 'asdf' +``` + +## has(key) + +Has takes a name and if it finds a matching header will return that header name with the preserved caseing it was set with. + +```javascript +c.has('a-header') === 'a-Header' +``` + +## set(key, value[, clobber=true]) + +Set is fairly straight forward except that if the header exists and clobber is disabled it will add `','+value` to the existing header. + +```javascript +c.set('a-Header', 'fdas') +c.set('a-HEADER', 'more', false) +c.get('a-header') === 'fdsa,more' +``` + +## swap(key) + +Swaps the casing of a header with the new one that is passed in. + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'fdas') +c.swap('a-HEADER') +c.has('a-header') === 'a-HEADER' +headers === {'a-HEADER': 'fdas'} +``` diff --git a/node_modules/caseless/index.js b/node_modules/caseless/index.js new file mode 100644 index 0000000..b194734 --- /dev/null +++ b/node_modules/caseless/index.js @@ -0,0 +1,67 @@ +function Caseless (dict) { + this.dict = dict || {} +} +Caseless.prototype.set = function (name, value, clobber) { + if (typeof name === 'object') { + for (var i in name) { + this.set(i, name[i], value) + } + } else { + if (typeof clobber === 'undefined') clobber = true + var has = this.has(name) + + if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value + else this.dict[has || name] = value + return has + } +} +Caseless.prototype.has = function (name) { + var keys = Object.keys(this.dict) + , name = name.toLowerCase() + ; + for (var i=0;i 0; +} + +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; + + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); + + chalk.template.constructor = Chalk; + + return chalk.template; + } + + applyOptions(this, options); +} + +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} + +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} + +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; + +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } + + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, styles); + +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; + + builder._styles = _styles; + builder._empty = _empty; + + const self = this; + + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; +} + +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; + } + + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; + + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; + + return str; +} + +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; + + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } + + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript diff --git a/node_modules/chalk/index.js.flow b/node_modules/chalk/index.js.flow new file mode 100644 index 0000000..622caaa --- /dev/null +++ b/node_modules/chalk/index.js.flow @@ -0,0 +1,93 @@ +// @flow strict + +type TemplateStringsArray = $ReadOnlyArray; + +export type Level = $Values<{ + None: 0, + Basic: 1, + Ansi256: 2, + TrueColor: 3 +}>; + +export type ChalkOptions = {| + enabled?: boolean, + level?: Level +|}; + +export type ColorSupport = {| + level: Level, + hasBasic: boolean, + has256: boolean, + has16m: boolean +|}; + +export interface Chalk { + (...text: string[]): string, + (text: TemplateStringsArray, ...placeholders: string[]): string, + constructor(options?: ChalkOptions): Chalk, + enabled: boolean, + level: Level, + rgb(r: number, g: number, b: number): Chalk, + hsl(h: number, s: number, l: number): Chalk, + hsv(h: number, s: number, v: number): Chalk, + hwb(h: number, w: number, b: number): Chalk, + bgHex(color: string): Chalk, + bgKeyword(color: string): Chalk, + bgRgb(r: number, g: number, b: number): Chalk, + bgHsl(h: number, s: number, l: number): Chalk, + bgHsv(h: number, s: number, v: number): Chalk, + bgHwb(h: number, w: number, b: number): Chalk, + hex(color: string): Chalk, + keyword(color: string): Chalk, + + +reset: Chalk, + +bold: Chalk, + +dim: Chalk, + +italic: Chalk, + +underline: Chalk, + +inverse: Chalk, + +hidden: Chalk, + +strikethrough: Chalk, + + +visible: Chalk, + + +black: Chalk, + +red: Chalk, + +green: Chalk, + +yellow: Chalk, + +blue: Chalk, + +magenta: Chalk, + +cyan: Chalk, + +white: Chalk, + +gray: Chalk, + +grey: Chalk, + +blackBright: Chalk, + +redBright: Chalk, + +greenBright: Chalk, + +yellowBright: Chalk, + +blueBright: Chalk, + +magentaBright: Chalk, + +cyanBright: Chalk, + +whiteBright: Chalk, + + +bgBlack: Chalk, + +bgRed: Chalk, + +bgGreen: Chalk, + +bgYellow: Chalk, + +bgBlue: Chalk, + +bgMagenta: Chalk, + +bgCyan: Chalk, + +bgWhite: Chalk, + +bgBlackBright: Chalk, + +bgRedBright: Chalk, + +bgGreenBright: Chalk, + +bgYellowBright: Chalk, + +bgBlueBright: Chalk, + +bgMagentaBright: Chalk, + +bgCyanBright: Chalk, + +bgWhiteBrigh: Chalk, + + supportsColor: ColorSupport +}; + +declare module.exports: Chalk; diff --git a/node_modules/chalk/license b/node_modules/chalk/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/chalk/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/chalk/package.json b/node_modules/chalk/package.json new file mode 100644 index 0000000..890ac1b --- /dev/null +++ b/node_modules/chalk/package.json @@ -0,0 +1,108 @@ +{ + "_args": [ + [ + "chalk@2.4.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "chalk@2.4.2", + "_id": "chalk@2.4.2", + "_inBundle": false, + "_integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "_location": "/chalk", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "chalk@2.4.2", + "name": "chalk", + "escapedName": "chalk", + "rawSpec": "2.4.2", + "saveSpec": null, + "fetchSpec": "2.4.2" + }, + "_requiredBy": [ + "/boxen", + "/update-notifier" + ], + "_resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "_spec": "2.4.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/chalk/chalk/issues" + }, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "description": "Terminal string styling done right", + "devDependencies": { + "ava": "*", + "coveralls": "^3.0.0", + "execa": "^0.9.0", + "flow-bin": "^0.68.0", + "import-fresh": "^2.0.0", + "matcha": "^0.7.0", + "nyc": "^11.0.2", + "resolve-from": "^4.0.0", + "typescript": "^2.5.3", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js", + "templates.js", + "types/index.d.ts", + "index.js.flow" + ], + "homepage": "https://github.com/chalk/chalk#readme", + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "str", + "ansi", + "style", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "name": "chalk", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/chalk.git" + }, + "scripts": { + "bench": "matcha benchmark.js", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "test": "xo && tsc --project types && flow --max-warnings=0 && nyc ava" + }, + "types": "types/index.d.ts", + "version": "2.4.2", + "xo": { + "envs": [ + "node", + "mocha" + ], + "ignores": [ + "test/_flow.js" + ] + } +} diff --git a/node_modules/chalk/readme.md b/node_modules/chalk/readme.md new file mode 100644 index 0000000..d298e2c --- /dev/null +++ b/node_modules/chalk/readme.md @@ -0,0 +1,314 @@ +

+
+
+ Chalk +
+
+
+

+ +> Terminal string styling done right + +[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs) + +### [See what's new in Chalk 2](https://github.com/chalk/chalk/releases/tag/v2.0.0) + + + + +## Highlights + +- Expressive API +- Highly performant +- Ability to nest styles +- [256/Truecolor color support](#256-and-truecolor-color-support) +- Auto-detects color support +- Doesn't extend `String.prototype` +- Clean and focused +- Actively maintained +- [Used by ~23,000 packages](https://www.npmjs.com/browse/depended/chalk) as of December 31, 2017 + + +## Install + +```console +$ npm install chalk +``` + + + + + + +## Usage + +```js +const chalk = require('chalk'); + +console.log(chalk.blue('Hello world!')); +``` + +Chalk comes with an easy to use composable API where you just chain and nest the styles you want. + +```js +const chalk = require('chalk'); +const log = console.log; + +// Combine styled and normal strings +log(chalk.blue('Hello') + ' World' + chalk.red('!')); + +// Compose multiple styles using the chainable API +log(chalk.blue.bgRed.bold('Hello world!')); + +// Pass in multiple arguments +log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')); + +// Nest styles +log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!')); + +// Nest styles of the same type even (color, underline, background) +log(chalk.green( + 'I am a green line ' + + chalk.blue.underline.bold('with a blue substring') + + ' that becomes green again!' +)); + +// ES2015 template literal +log(` +CPU: ${chalk.red('90%')} +RAM: ${chalk.green('40%')} +DISK: ${chalk.yellow('70%')} +`); + +// ES2015 tagged template literal +log(chalk` +CPU: {red ${cpu.totalPercent}%} +RAM: {green ${ram.used / ram.total * 100}%} +DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} +`); + +// Use RGB colors in terminal emulators that support it. +log(chalk.keyword('orange')('Yay for orange colored text!')); +log(chalk.rgb(123, 45, 67).underline('Underlined reddish color')); +log(chalk.hex('#DEADED').bold('Bold gray!')); +``` + +Easily define your own themes: + +```js +const chalk = require('chalk'); + +const error = chalk.bold.red; +const warning = chalk.keyword('orange'); + +console.log(error('Error!')); +console.log(warning('Warning!')); +``` + +Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args): + +```js +const name = 'Sindre'; +console.log(chalk.green('Hello %s'), name); +//=> 'Hello Sindre' +``` + + +## API + +### chalk.` +Browserstack-logo-white + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/node_modules/psl/data/rules.json b/node_modules/psl/data/rules.json new file mode 100644 index 0000000..0ebfff2 --- /dev/null +++ b/node_modules/psl/data/rules.json @@ -0,0 +1,8812 @@ +[ +"ac", +"com.ac", +"edu.ac", +"gov.ac", +"net.ac", +"mil.ac", +"org.ac", +"ad", +"nom.ad", +"ae", +"co.ae", +"net.ae", +"org.ae", +"sch.ae", +"ac.ae", +"gov.ae", +"mil.ae", +"aero", +"accident-investigation.aero", +"accident-prevention.aero", +"aerobatic.aero", +"aeroclub.aero", +"aerodrome.aero", +"agents.aero", +"aircraft.aero", +"airline.aero", +"airport.aero", +"air-surveillance.aero", +"airtraffic.aero", +"air-traffic-control.aero", +"ambulance.aero", +"amusement.aero", +"association.aero", +"author.aero", +"ballooning.aero", +"broker.aero", +"caa.aero", +"cargo.aero", +"catering.aero", +"certification.aero", +"championship.aero", +"charter.aero", +"civilaviation.aero", +"club.aero", +"conference.aero", +"consultant.aero", +"consulting.aero", +"control.aero", +"council.aero", +"crew.aero", +"design.aero", +"dgca.aero", +"educator.aero", +"emergency.aero", +"engine.aero", +"engineer.aero", +"entertainment.aero", +"equipment.aero", +"exchange.aero", +"express.aero", +"federation.aero", +"flight.aero", +"freight.aero", +"fuel.aero", +"gliding.aero", +"government.aero", +"groundhandling.aero", +"group.aero", +"hanggliding.aero", +"homebuilt.aero", +"insurance.aero", +"journal.aero", +"journalist.aero", +"leasing.aero", +"logistics.aero", +"magazine.aero", +"maintenance.aero", +"media.aero", +"microlight.aero", +"modelling.aero", +"navigation.aero", +"parachuting.aero", +"paragliding.aero", +"passenger-association.aero", +"pilot.aero", +"press.aero", +"production.aero", +"recreation.aero", +"repbody.aero", +"res.aero", +"research.aero", +"rotorcraft.aero", +"safety.aero", +"scientist.aero", +"services.aero", +"show.aero", +"skydiving.aero", +"software.aero", +"student.aero", +"trader.aero", +"trading.aero", +"trainer.aero", +"union.aero", +"workinggroup.aero", +"works.aero", +"af", +"gov.af", +"com.af", +"org.af", +"net.af", +"edu.af", +"ag", +"com.ag", +"org.ag", +"net.ag", +"co.ag", +"nom.ag", +"ai", +"off.ai", +"com.ai", +"net.ai", +"org.ai", +"al", +"com.al", +"edu.al", +"gov.al", +"mil.al", +"net.al", +"org.al", +"am", +"co.am", +"com.am", +"commune.am", +"net.am", +"org.am", +"ao", +"ed.ao", +"gv.ao", +"og.ao", +"co.ao", +"pb.ao", +"it.ao", +"aq", +"ar", +"com.ar", +"edu.ar", +"gob.ar", +"gov.ar", +"int.ar", +"mil.ar", +"musica.ar", +"net.ar", +"org.ar", +"tur.ar", +"arpa", +"e164.arpa", +"in-addr.arpa", +"ip6.arpa", +"iris.arpa", +"uri.arpa", +"urn.arpa", +"as", +"gov.as", +"asia", +"at", +"ac.at", +"co.at", +"gv.at", +"or.at", +"au", +"com.au", +"net.au", +"org.au", +"edu.au", +"gov.au", +"asn.au", +"id.au", +"info.au", +"conf.au", +"oz.au", +"act.au", +"nsw.au", +"nt.au", +"qld.au", +"sa.au", +"tas.au", +"vic.au", +"wa.au", +"act.edu.au", +"catholic.edu.au", +"nsw.edu.au", +"nt.edu.au", +"qld.edu.au", +"sa.edu.au", +"tas.edu.au", +"vic.edu.au", +"wa.edu.au", +"qld.gov.au", +"sa.gov.au", +"tas.gov.au", +"vic.gov.au", +"wa.gov.au", +"education.tas.edu.au", +"schools.nsw.edu.au", +"aw", +"com.aw", +"ax", +"az", +"com.az", +"net.az", +"int.az", +"gov.az", +"org.az", +"edu.az", +"info.az", +"pp.az", +"mil.az", +"name.az", +"pro.az", +"biz.az", +"ba", +"com.ba", +"edu.ba", +"gov.ba", +"mil.ba", +"net.ba", +"org.ba", +"bb", +"biz.bb", +"co.bb", +"com.bb", +"edu.bb", +"gov.bb", +"info.bb", +"net.bb", +"org.bb", +"store.bb", +"tv.bb", +"*.bd", +"be", +"ac.be", +"bf", +"gov.bf", +"bg", +"a.bg", +"b.bg", +"c.bg", +"d.bg", +"e.bg", +"f.bg", +"g.bg", +"h.bg", +"i.bg", +"j.bg", +"k.bg", +"l.bg", +"m.bg", +"n.bg", +"o.bg", +"p.bg", +"q.bg", +"r.bg", +"s.bg", +"t.bg", +"u.bg", +"v.bg", +"w.bg", +"x.bg", +"y.bg", +"z.bg", +"0.bg", +"1.bg", +"2.bg", +"3.bg", +"4.bg", +"5.bg", +"6.bg", +"7.bg", +"8.bg", +"9.bg", +"bh", +"com.bh", +"edu.bh", +"net.bh", +"org.bh", +"gov.bh", +"bi", +"co.bi", +"com.bi", +"edu.bi", +"or.bi", +"org.bi", +"biz", +"bj", +"asso.bj", +"barreau.bj", +"gouv.bj", +"bm", +"com.bm", +"edu.bm", +"gov.bm", +"net.bm", +"org.bm", +"bn", +"com.bn", +"edu.bn", +"gov.bn", +"net.bn", +"org.bn", +"bo", +"com.bo", +"edu.bo", +"gob.bo", +"int.bo", +"org.bo", +"net.bo", +"mil.bo", +"tv.bo", +"web.bo", +"academia.bo", +"agro.bo", +"arte.bo", +"blog.bo", +"bolivia.bo", +"ciencia.bo", +"cooperativa.bo", +"democracia.bo", +"deporte.bo", +"ecologia.bo", +"economia.bo", +"empresa.bo", +"indigena.bo", +"industria.bo", +"info.bo", +"medicina.bo", +"movimiento.bo", +"musica.bo", +"natural.bo", +"nombre.bo", +"noticias.bo", +"patria.bo", +"politica.bo", +"profesional.bo", +"plurinacional.bo", +"pueblo.bo", +"revista.bo", +"salud.bo", +"tecnologia.bo", +"tksat.bo", +"transporte.bo", +"wiki.bo", +"br", +"9guacu.br", +"abc.br", +"adm.br", +"adv.br", +"agr.br", +"aju.br", +"am.br", +"anani.br", +"aparecida.br", +"arq.br", +"art.br", +"ato.br", +"b.br", +"barueri.br", +"belem.br", +"bhz.br", +"bio.br", +"blog.br", +"bmd.br", +"boavista.br", +"bsb.br", +"campinagrande.br", +"campinas.br", +"caxias.br", +"cim.br", +"cng.br", +"cnt.br", +"com.br", +"contagem.br", +"coop.br", +"cri.br", +"cuiaba.br", +"curitiba.br", +"def.br", +"ecn.br", +"eco.br", +"edu.br", +"emp.br", +"eng.br", +"esp.br", +"etc.br", +"eti.br", +"far.br", +"feira.br", +"flog.br", +"floripa.br", +"fm.br", +"fnd.br", +"fortal.br", +"fot.br", +"foz.br", +"fst.br", +"g12.br", +"ggf.br", +"goiania.br", +"gov.br", +"ac.gov.br", +"al.gov.br", +"am.gov.br", +"ap.gov.br", +"ba.gov.br", +"ce.gov.br", +"df.gov.br", +"es.gov.br", +"go.gov.br", +"ma.gov.br", +"mg.gov.br", +"ms.gov.br", +"mt.gov.br", +"pa.gov.br", +"pb.gov.br", +"pe.gov.br", +"pi.gov.br", +"pr.gov.br", +"rj.gov.br", +"rn.gov.br", +"ro.gov.br", +"rr.gov.br", +"rs.gov.br", +"sc.gov.br", +"se.gov.br", +"sp.gov.br", +"to.gov.br", +"gru.br", +"imb.br", +"ind.br", +"inf.br", +"jab.br", +"jampa.br", +"jdf.br", +"joinville.br", +"jor.br", +"jus.br", +"leg.br", +"lel.br", +"londrina.br", +"macapa.br", +"maceio.br", +"manaus.br", +"maringa.br", +"mat.br", +"med.br", +"mil.br", +"morena.br", +"mp.br", +"mus.br", +"natal.br", +"net.br", +"niteroi.br", +"*.nom.br", +"not.br", +"ntr.br", +"odo.br", +"ong.br", +"org.br", +"osasco.br", +"palmas.br", +"poa.br", +"ppg.br", +"pro.br", +"psc.br", +"psi.br", +"pvh.br", +"qsl.br", +"radio.br", +"rec.br", +"recife.br", +"ribeirao.br", +"rio.br", +"riobranco.br", +"riopreto.br", +"salvador.br", +"sampa.br", +"santamaria.br", +"santoandre.br", +"saobernardo.br", +"saogonca.br", +"sjc.br", +"slg.br", +"slz.br", +"sorocaba.br", +"srv.br", +"taxi.br", +"tc.br", +"teo.br", +"the.br", +"tmp.br", +"trd.br", +"tur.br", +"tv.br", +"udi.br", +"vet.br", +"vix.br", +"vlog.br", +"wiki.br", +"zlg.br", +"bs", +"com.bs", +"net.bs", +"org.bs", +"edu.bs", +"gov.bs", +"bt", +"com.bt", +"edu.bt", +"gov.bt", +"net.bt", +"org.bt", +"bv", +"bw", +"co.bw", +"org.bw", +"by", +"gov.by", +"mil.by", +"com.by", +"of.by", +"bz", +"com.bz", +"net.bz", +"org.bz", +"edu.bz", +"gov.bz", +"ca", +"ab.ca", +"bc.ca", +"mb.ca", +"nb.ca", +"nf.ca", +"nl.ca", +"ns.ca", +"nt.ca", +"nu.ca", +"on.ca", +"pe.ca", +"qc.ca", +"sk.ca", +"yk.ca", +"gc.ca", +"cat", +"cc", +"cd", +"gov.cd", +"cf", +"cg", +"ch", +"ci", +"org.ci", +"or.ci", +"com.ci", +"co.ci", +"edu.ci", +"ed.ci", +"ac.ci", +"net.ci", +"go.ci", +"asso.ci", +"aéroport.ci", +"int.ci", +"presse.ci", +"md.ci", +"gouv.ci", +"*.ck", +"!www.ck", +"cl", +"gov.cl", +"gob.cl", +"co.cl", +"mil.cl", +"cm", +"co.cm", +"com.cm", +"gov.cm", +"net.cm", +"cn", +"ac.cn", +"com.cn", +"edu.cn", +"gov.cn", +"net.cn", +"org.cn", +"mil.cn", +"公司.cn", +"网络.cn", +"網絡.cn", +"ah.cn", +"bj.cn", +"cq.cn", +"fj.cn", +"gd.cn", +"gs.cn", +"gz.cn", +"gx.cn", +"ha.cn", +"hb.cn", +"he.cn", +"hi.cn", +"hl.cn", +"hn.cn", +"jl.cn", +"js.cn", +"jx.cn", +"ln.cn", +"nm.cn", +"nx.cn", +"qh.cn", +"sc.cn", +"sd.cn", +"sh.cn", +"sn.cn", +"sx.cn", +"tj.cn", +"xj.cn", +"xz.cn", +"yn.cn", +"zj.cn", +"hk.cn", +"mo.cn", +"tw.cn", +"co", +"arts.co", +"com.co", +"edu.co", +"firm.co", +"gov.co", +"info.co", +"int.co", +"mil.co", +"net.co", +"nom.co", +"org.co", +"rec.co", +"web.co", +"com", +"coop", +"cr", +"ac.cr", +"co.cr", +"ed.cr", +"fi.cr", +"go.cr", +"or.cr", +"sa.cr", +"cu", +"com.cu", +"edu.cu", +"org.cu", +"net.cu", +"gov.cu", +"inf.cu", +"cv", +"cw", +"com.cw", +"edu.cw", +"net.cw", +"org.cw", +"cx", +"gov.cx", +"cy", +"ac.cy", +"biz.cy", +"com.cy", +"ekloges.cy", +"gov.cy", +"ltd.cy", +"name.cy", +"net.cy", +"org.cy", +"parliament.cy", +"press.cy", +"pro.cy", +"tm.cy", +"cz", +"de", +"dj", +"dk", +"dm", +"com.dm", +"net.dm", +"org.dm", +"edu.dm", +"gov.dm", +"do", +"art.do", +"com.do", +"edu.do", +"gob.do", +"gov.do", +"mil.do", +"net.do", +"org.do", +"sld.do", +"web.do", +"dz", +"com.dz", +"org.dz", +"net.dz", +"gov.dz", +"edu.dz", +"asso.dz", +"pol.dz", +"art.dz", +"ec", +"com.ec", +"info.ec", +"net.ec", +"fin.ec", +"k12.ec", +"med.ec", +"pro.ec", +"org.ec", +"edu.ec", +"gov.ec", +"gob.ec", +"mil.ec", +"edu", +"ee", +"edu.ee", +"gov.ee", +"riik.ee", +"lib.ee", +"med.ee", +"com.ee", +"pri.ee", +"aip.ee", +"org.ee", +"fie.ee", +"eg", +"com.eg", +"edu.eg", +"eun.eg", +"gov.eg", +"mil.eg", +"name.eg", +"net.eg", +"org.eg", +"sci.eg", +"*.er", +"es", +"com.es", +"nom.es", +"org.es", +"gob.es", +"edu.es", +"et", +"com.et", +"gov.et", +"org.et", +"edu.et", +"biz.et", +"name.et", +"info.et", +"net.et", +"eu", +"fi", +"aland.fi", +"*.fj", +"*.fk", +"fm", +"fo", +"fr", +"asso.fr", +"com.fr", +"gouv.fr", +"nom.fr", +"prd.fr", +"tm.fr", +"aeroport.fr", +"avocat.fr", +"avoues.fr", +"cci.fr", +"chambagri.fr", +"chirurgiens-dentistes.fr", +"experts-comptables.fr", +"geometre-expert.fr", +"greta.fr", +"huissier-justice.fr", +"medecin.fr", +"notaires.fr", +"pharmacien.fr", +"port.fr", +"veterinaire.fr", +"ga", +"gb", +"gd", +"ge", +"com.ge", +"edu.ge", +"gov.ge", +"org.ge", +"mil.ge", +"net.ge", +"pvt.ge", +"gf", +"gg", +"co.gg", +"net.gg", +"org.gg", +"gh", +"com.gh", +"edu.gh", +"gov.gh", +"org.gh", +"mil.gh", +"gi", +"com.gi", +"ltd.gi", +"gov.gi", +"mod.gi", +"edu.gi", +"org.gi", +"gl", +"co.gl", +"com.gl", +"edu.gl", +"net.gl", +"org.gl", +"gm", +"gn", +"ac.gn", +"com.gn", +"edu.gn", +"gov.gn", +"org.gn", +"net.gn", +"gov", +"gp", +"com.gp", +"net.gp", +"mobi.gp", +"edu.gp", +"org.gp", +"asso.gp", +"gq", +"gr", +"com.gr", +"edu.gr", +"net.gr", +"org.gr", +"gov.gr", +"gs", +"gt", +"com.gt", +"edu.gt", +"gob.gt", +"ind.gt", +"mil.gt", +"net.gt", +"org.gt", +"gu", +"com.gu", +"edu.gu", +"gov.gu", +"guam.gu", +"info.gu", +"net.gu", +"org.gu", +"web.gu", +"gw", +"gy", +"co.gy", +"com.gy", +"edu.gy", +"gov.gy", +"net.gy", +"org.gy", +"hk", +"com.hk", +"edu.hk", +"gov.hk", +"idv.hk", +"net.hk", +"org.hk", +"公司.hk", +"教育.hk", +"敎育.hk", +"政府.hk", +"個人.hk", +"个人.hk", +"箇人.hk", +"網络.hk", +"网络.hk", +"组織.hk", +"網絡.hk", +"网絡.hk", +"组织.hk", +"組織.hk", +"組织.hk", +"hm", +"hn", +"com.hn", +"edu.hn", +"org.hn", +"net.hn", +"mil.hn", +"gob.hn", +"hr", +"iz.hr", +"from.hr", +"name.hr", +"com.hr", +"ht", +"com.ht", +"shop.ht", +"firm.ht", +"info.ht", +"adult.ht", +"net.ht", +"pro.ht", +"org.ht", +"med.ht", +"art.ht", +"coop.ht", +"pol.ht", +"asso.ht", +"edu.ht", +"rel.ht", +"gouv.ht", +"perso.ht", +"hu", +"co.hu", +"info.hu", +"org.hu", +"priv.hu", +"sport.hu", +"tm.hu", +"2000.hu", +"agrar.hu", +"bolt.hu", +"casino.hu", +"city.hu", +"erotica.hu", +"erotika.hu", +"film.hu", +"forum.hu", +"games.hu", +"hotel.hu", +"ingatlan.hu", +"jogasz.hu", +"konyvelo.hu", +"lakas.hu", +"media.hu", +"news.hu", +"reklam.hu", +"sex.hu", +"shop.hu", +"suli.hu", +"szex.hu", +"tozsde.hu", +"utazas.hu", +"video.hu", +"id", +"ac.id", +"biz.id", +"co.id", +"desa.id", +"go.id", +"mil.id", +"my.id", +"net.id", +"or.id", +"ponpes.id", +"sch.id", +"web.id", +"ie", +"gov.ie", +"il", +"ac.il", +"co.il", +"gov.il", +"idf.il", +"k12.il", +"muni.il", +"net.il", +"org.il", +"im", +"ac.im", +"co.im", +"com.im", +"ltd.co.im", +"net.im", +"org.im", +"plc.co.im", +"tt.im", +"tv.im", +"in", +"co.in", +"firm.in", +"net.in", +"org.in", +"gen.in", +"ind.in", +"nic.in", +"ac.in", +"edu.in", +"res.in", +"gov.in", +"mil.in", +"info", +"int", +"eu.int", +"io", +"com.io", +"iq", +"gov.iq", +"edu.iq", +"mil.iq", +"com.iq", +"org.iq", +"net.iq", +"ir", +"ac.ir", +"co.ir", +"gov.ir", +"id.ir", +"net.ir", +"org.ir", +"sch.ir", +"ایران.ir", +"ايران.ir", +"is", +"net.is", +"com.is", +"edu.is", +"gov.is", +"org.is", +"int.is", +"it", +"gov.it", +"edu.it", +"abr.it", +"abruzzo.it", +"aosta-valley.it", +"aostavalley.it", +"bas.it", +"basilicata.it", +"cal.it", +"calabria.it", +"cam.it", +"campania.it", +"emilia-romagna.it", +"emiliaromagna.it", +"emr.it", +"friuli-v-giulia.it", +"friuli-ve-giulia.it", +"friuli-vegiulia.it", +"friuli-venezia-giulia.it", +"friuli-veneziagiulia.it", +"friuli-vgiulia.it", +"friuliv-giulia.it", +"friulive-giulia.it", +"friulivegiulia.it", +"friulivenezia-giulia.it", +"friuliveneziagiulia.it", +"friulivgiulia.it", +"fvg.it", +"laz.it", +"lazio.it", +"lig.it", +"liguria.it", +"lom.it", +"lombardia.it", +"lombardy.it", +"lucania.it", +"mar.it", +"marche.it", +"mol.it", +"molise.it", +"piedmont.it", +"piemonte.it", +"pmn.it", +"pug.it", +"puglia.it", +"sar.it", +"sardegna.it", +"sardinia.it", +"sic.it", +"sicilia.it", +"sicily.it", +"taa.it", +"tos.it", +"toscana.it", +"trentin-sud-tirol.it", +"trentin-süd-tirol.it", +"trentin-sudtirol.it", +"trentin-südtirol.it", +"trentin-sued-tirol.it", +"trentin-suedtirol.it", +"trentino-a-adige.it", +"trentino-aadige.it", +"trentino-alto-adige.it", +"trentino-altoadige.it", +"trentino-s-tirol.it", +"trentino-stirol.it", +"trentino-sud-tirol.it", +"trentino-süd-tirol.it", +"trentino-sudtirol.it", +"trentino-südtirol.it", +"trentino-sued-tirol.it", +"trentino-suedtirol.it", +"trentino.it", +"trentinoa-adige.it", +"trentinoaadige.it", +"trentinoalto-adige.it", +"trentinoaltoadige.it", +"trentinos-tirol.it", +"trentinostirol.it", +"trentinosud-tirol.it", +"trentinosüd-tirol.it", +"trentinosudtirol.it", +"trentinosüdtirol.it", +"trentinosued-tirol.it", +"trentinosuedtirol.it", +"trentinsud-tirol.it", +"trentinsüd-tirol.it", +"trentinsudtirol.it", +"trentinsüdtirol.it", +"trentinsued-tirol.it", +"trentinsuedtirol.it", +"tuscany.it", +"umb.it", +"umbria.it", +"val-d-aosta.it", +"val-daosta.it", +"vald-aosta.it", +"valdaosta.it", +"valle-aosta.it", +"valle-d-aosta.it", +"valle-daosta.it", +"valleaosta.it", +"valled-aosta.it", +"valledaosta.it", +"vallee-aoste.it", +"vallée-aoste.it", +"vallee-d-aoste.it", +"vallée-d-aoste.it", +"valleeaoste.it", +"valléeaoste.it", +"valleedaoste.it", +"valléedaoste.it", +"vao.it", +"vda.it", +"ven.it", +"veneto.it", +"ag.it", +"agrigento.it", +"al.it", +"alessandria.it", +"alto-adige.it", +"altoadige.it", +"an.it", +"ancona.it", +"andria-barletta-trani.it", +"andria-trani-barletta.it", +"andriabarlettatrani.it", +"andriatranibarletta.it", +"ao.it", +"aosta.it", +"aoste.it", +"ap.it", +"aq.it", +"aquila.it", +"ar.it", +"arezzo.it", +"ascoli-piceno.it", +"ascolipiceno.it", +"asti.it", +"at.it", +"av.it", +"avellino.it", +"ba.it", +"balsan-sudtirol.it", +"balsan-südtirol.it", +"balsan-suedtirol.it", +"balsan.it", +"bari.it", +"barletta-trani-andria.it", +"barlettatraniandria.it", +"belluno.it", +"benevento.it", +"bergamo.it", +"bg.it", +"bi.it", +"biella.it", +"bl.it", +"bn.it", +"bo.it", +"bologna.it", +"bolzano-altoadige.it", +"bolzano.it", +"bozen-sudtirol.it", +"bozen-südtirol.it", +"bozen-suedtirol.it", +"bozen.it", +"br.it", +"brescia.it", +"brindisi.it", +"bs.it", +"bt.it", +"bulsan-sudtirol.it", +"bulsan-südtirol.it", +"bulsan-suedtirol.it", +"bulsan.it", +"bz.it", +"ca.it", +"cagliari.it", +"caltanissetta.it", +"campidano-medio.it", +"campidanomedio.it", +"campobasso.it", +"carbonia-iglesias.it", +"carboniaiglesias.it", +"carrara-massa.it", +"carraramassa.it", +"caserta.it", +"catania.it", +"catanzaro.it", +"cb.it", +"ce.it", +"cesena-forli.it", +"cesena-forlì.it", +"cesenaforli.it", +"cesenaforlì.it", +"ch.it", +"chieti.it", +"ci.it", +"cl.it", +"cn.it", +"co.it", +"como.it", +"cosenza.it", +"cr.it", +"cremona.it", +"crotone.it", +"cs.it", +"ct.it", +"cuneo.it", +"cz.it", +"dell-ogliastra.it", +"dellogliastra.it", +"en.it", +"enna.it", +"fc.it", +"fe.it", +"fermo.it", +"ferrara.it", +"fg.it", +"fi.it", +"firenze.it", +"florence.it", +"fm.it", +"foggia.it", +"forli-cesena.it", +"forlì-cesena.it", +"forlicesena.it", +"forlìcesena.it", +"fr.it", +"frosinone.it", +"ge.it", +"genoa.it", +"genova.it", +"go.it", +"gorizia.it", +"gr.it", +"grosseto.it", +"iglesias-carbonia.it", +"iglesiascarbonia.it", +"im.it", +"imperia.it", +"is.it", +"isernia.it", +"kr.it", +"la-spezia.it", +"laquila.it", +"laspezia.it", +"latina.it", +"lc.it", +"le.it", +"lecce.it", +"lecco.it", +"li.it", +"livorno.it", +"lo.it", +"lodi.it", +"lt.it", +"lu.it", +"lucca.it", +"macerata.it", +"mantova.it", +"massa-carrara.it", +"massacarrara.it", +"matera.it", +"mb.it", +"mc.it", +"me.it", +"medio-campidano.it", +"mediocampidano.it", +"messina.it", +"mi.it", +"milan.it", +"milano.it", +"mn.it", +"mo.it", +"modena.it", +"monza-brianza.it", +"monza-e-della-brianza.it", +"monza.it", +"monzabrianza.it", +"monzaebrianza.it", +"monzaedellabrianza.it", +"ms.it", +"mt.it", +"na.it", +"naples.it", +"napoli.it", +"no.it", +"novara.it", +"nu.it", +"nuoro.it", +"og.it", +"ogliastra.it", +"olbia-tempio.it", +"olbiatempio.it", +"or.it", +"oristano.it", +"ot.it", +"pa.it", +"padova.it", +"padua.it", +"palermo.it", +"parma.it", +"pavia.it", +"pc.it", +"pd.it", +"pe.it", +"perugia.it", +"pesaro-urbino.it", +"pesarourbino.it", +"pescara.it", +"pg.it", +"pi.it", +"piacenza.it", +"pisa.it", +"pistoia.it", +"pn.it", +"po.it", +"pordenone.it", +"potenza.it", +"pr.it", +"prato.it", +"pt.it", +"pu.it", +"pv.it", +"pz.it", +"ra.it", +"ragusa.it", +"ravenna.it", +"rc.it", +"re.it", +"reggio-calabria.it", +"reggio-emilia.it", +"reggiocalabria.it", +"reggioemilia.it", +"rg.it", +"ri.it", +"rieti.it", +"rimini.it", +"rm.it", +"rn.it", +"ro.it", +"roma.it", +"rome.it", +"rovigo.it", +"sa.it", +"salerno.it", +"sassari.it", +"savona.it", +"si.it", +"siena.it", +"siracusa.it", +"so.it", +"sondrio.it", +"sp.it", +"sr.it", +"ss.it", +"suedtirol.it", +"südtirol.it", +"sv.it", +"ta.it", +"taranto.it", +"te.it", +"tempio-olbia.it", +"tempioolbia.it", +"teramo.it", +"terni.it", +"tn.it", +"to.it", +"torino.it", +"tp.it", +"tr.it", +"trani-andria-barletta.it", +"trani-barletta-andria.it", +"traniandriabarletta.it", +"tranibarlettaandria.it", +"trapani.it", +"trento.it", +"treviso.it", +"trieste.it", +"ts.it", +"turin.it", +"tv.it", +"ud.it", +"udine.it", +"urbino-pesaro.it", +"urbinopesaro.it", +"va.it", +"varese.it", +"vb.it", +"vc.it", +"ve.it", +"venezia.it", +"venice.it", +"verbania.it", +"vercelli.it", +"verona.it", +"vi.it", +"vibo-valentia.it", +"vibovalentia.it", +"vicenza.it", +"viterbo.it", +"vr.it", +"vs.it", +"vt.it", +"vv.it", +"je", +"co.je", +"net.je", +"org.je", +"*.jm", +"jo", +"com.jo", +"org.jo", +"net.jo", +"edu.jo", +"sch.jo", +"gov.jo", +"mil.jo", +"name.jo", +"jobs", +"jp", +"ac.jp", +"ad.jp", +"co.jp", +"ed.jp", +"go.jp", +"gr.jp", +"lg.jp", +"ne.jp", +"or.jp", +"aichi.jp", +"akita.jp", +"aomori.jp", +"chiba.jp", +"ehime.jp", +"fukui.jp", +"fukuoka.jp", +"fukushima.jp", +"gifu.jp", +"gunma.jp", +"hiroshima.jp", +"hokkaido.jp", +"hyogo.jp", +"ibaraki.jp", +"ishikawa.jp", +"iwate.jp", +"kagawa.jp", +"kagoshima.jp", +"kanagawa.jp", +"kochi.jp", +"kumamoto.jp", +"kyoto.jp", +"mie.jp", +"miyagi.jp", +"miyazaki.jp", +"nagano.jp", +"nagasaki.jp", +"nara.jp", +"niigata.jp", +"oita.jp", +"okayama.jp", +"okinawa.jp", +"osaka.jp", +"saga.jp", +"saitama.jp", +"shiga.jp", +"shimane.jp", +"shizuoka.jp", +"tochigi.jp", +"tokushima.jp", +"tokyo.jp", +"tottori.jp", +"toyama.jp", +"wakayama.jp", +"yamagata.jp", +"yamaguchi.jp", +"yamanashi.jp", +"栃木.jp", +"愛知.jp", +"愛媛.jp", +"兵庫.jp", +"熊本.jp", +"茨城.jp", +"北海道.jp", +"千葉.jp", +"和歌山.jp", +"長崎.jp", +"長野.jp", +"新潟.jp", +"青森.jp", +"静岡.jp", +"東京.jp", +"石川.jp", +"埼玉.jp", +"三重.jp", +"京都.jp", +"佐賀.jp", +"大分.jp", +"大阪.jp", +"奈良.jp", +"宮城.jp", +"宮崎.jp", +"富山.jp", +"山口.jp", +"山形.jp", +"山梨.jp", +"岩手.jp", +"岐阜.jp", +"岡山.jp", +"島根.jp", +"広島.jp", +"徳島.jp", +"沖縄.jp", +"滋賀.jp", +"神奈川.jp", +"福井.jp", +"福岡.jp", +"福島.jp", +"秋田.jp", +"群馬.jp", +"香川.jp", +"高知.jp", +"鳥取.jp", +"鹿児島.jp", +"*.kawasaki.jp", +"*.kitakyushu.jp", +"*.kobe.jp", +"*.nagoya.jp", +"*.sapporo.jp", +"*.sendai.jp", +"*.yokohama.jp", +"!city.kawasaki.jp", +"!city.kitakyushu.jp", +"!city.kobe.jp", +"!city.nagoya.jp", +"!city.sapporo.jp", +"!city.sendai.jp", +"!city.yokohama.jp", +"aisai.aichi.jp", +"ama.aichi.jp", +"anjo.aichi.jp", +"asuke.aichi.jp", +"chiryu.aichi.jp", +"chita.aichi.jp", +"fuso.aichi.jp", +"gamagori.aichi.jp", +"handa.aichi.jp", +"hazu.aichi.jp", +"hekinan.aichi.jp", +"higashiura.aichi.jp", +"ichinomiya.aichi.jp", +"inazawa.aichi.jp", +"inuyama.aichi.jp", +"isshiki.aichi.jp", +"iwakura.aichi.jp", +"kanie.aichi.jp", +"kariya.aichi.jp", +"kasugai.aichi.jp", +"kira.aichi.jp", +"kiyosu.aichi.jp", +"komaki.aichi.jp", +"konan.aichi.jp", +"kota.aichi.jp", +"mihama.aichi.jp", +"miyoshi.aichi.jp", +"nishio.aichi.jp", +"nisshin.aichi.jp", +"obu.aichi.jp", +"oguchi.aichi.jp", +"oharu.aichi.jp", +"okazaki.aichi.jp", +"owariasahi.aichi.jp", +"seto.aichi.jp", +"shikatsu.aichi.jp", +"shinshiro.aichi.jp", +"shitara.aichi.jp", +"tahara.aichi.jp", +"takahama.aichi.jp", +"tobishima.aichi.jp", +"toei.aichi.jp", +"togo.aichi.jp", +"tokai.aichi.jp", +"tokoname.aichi.jp", +"toyoake.aichi.jp", +"toyohashi.aichi.jp", +"toyokawa.aichi.jp", +"toyone.aichi.jp", +"toyota.aichi.jp", +"tsushima.aichi.jp", +"yatomi.aichi.jp", +"akita.akita.jp", +"daisen.akita.jp", +"fujisato.akita.jp", +"gojome.akita.jp", +"hachirogata.akita.jp", +"happou.akita.jp", +"higashinaruse.akita.jp", +"honjo.akita.jp", +"honjyo.akita.jp", +"ikawa.akita.jp", +"kamikoani.akita.jp", +"kamioka.akita.jp", +"katagami.akita.jp", +"kazuno.akita.jp", +"kitaakita.akita.jp", +"kosaka.akita.jp", +"kyowa.akita.jp", +"misato.akita.jp", +"mitane.akita.jp", +"moriyoshi.akita.jp", +"nikaho.akita.jp", +"noshiro.akita.jp", +"odate.akita.jp", +"oga.akita.jp", +"ogata.akita.jp", +"semboku.akita.jp", +"yokote.akita.jp", +"yurihonjo.akita.jp", +"aomori.aomori.jp", +"gonohe.aomori.jp", +"hachinohe.aomori.jp", +"hashikami.aomori.jp", +"hiranai.aomori.jp", +"hirosaki.aomori.jp", +"itayanagi.aomori.jp", +"kuroishi.aomori.jp", +"misawa.aomori.jp", +"mutsu.aomori.jp", +"nakadomari.aomori.jp", +"noheji.aomori.jp", +"oirase.aomori.jp", +"owani.aomori.jp", +"rokunohe.aomori.jp", +"sannohe.aomori.jp", +"shichinohe.aomori.jp", +"shingo.aomori.jp", +"takko.aomori.jp", +"towada.aomori.jp", +"tsugaru.aomori.jp", +"tsuruta.aomori.jp", +"abiko.chiba.jp", +"asahi.chiba.jp", +"chonan.chiba.jp", +"chosei.chiba.jp", +"choshi.chiba.jp", +"chuo.chiba.jp", +"funabashi.chiba.jp", +"futtsu.chiba.jp", +"hanamigawa.chiba.jp", +"ichihara.chiba.jp", +"ichikawa.chiba.jp", +"ichinomiya.chiba.jp", +"inzai.chiba.jp", +"isumi.chiba.jp", +"kamagaya.chiba.jp", +"kamogawa.chiba.jp", +"kashiwa.chiba.jp", +"katori.chiba.jp", +"katsuura.chiba.jp", +"kimitsu.chiba.jp", +"kisarazu.chiba.jp", +"kozaki.chiba.jp", +"kujukuri.chiba.jp", +"kyonan.chiba.jp", +"matsudo.chiba.jp", +"midori.chiba.jp", +"mihama.chiba.jp", +"minamiboso.chiba.jp", +"mobara.chiba.jp", +"mutsuzawa.chiba.jp", +"nagara.chiba.jp", +"nagareyama.chiba.jp", +"narashino.chiba.jp", +"narita.chiba.jp", +"noda.chiba.jp", +"oamishirasato.chiba.jp", +"omigawa.chiba.jp", +"onjuku.chiba.jp", +"otaki.chiba.jp", +"sakae.chiba.jp", +"sakura.chiba.jp", +"shimofusa.chiba.jp", +"shirako.chiba.jp", +"shiroi.chiba.jp", +"shisui.chiba.jp", +"sodegaura.chiba.jp", +"sosa.chiba.jp", +"tako.chiba.jp", +"tateyama.chiba.jp", +"togane.chiba.jp", +"tohnosho.chiba.jp", +"tomisato.chiba.jp", +"urayasu.chiba.jp", +"yachimata.chiba.jp", +"yachiyo.chiba.jp", +"yokaichiba.chiba.jp", +"yokoshibahikari.chiba.jp", +"yotsukaido.chiba.jp", +"ainan.ehime.jp", +"honai.ehime.jp", +"ikata.ehime.jp", +"imabari.ehime.jp", +"iyo.ehime.jp", +"kamijima.ehime.jp", +"kihoku.ehime.jp", +"kumakogen.ehime.jp", +"masaki.ehime.jp", +"matsuno.ehime.jp", +"matsuyama.ehime.jp", +"namikata.ehime.jp", +"niihama.ehime.jp", +"ozu.ehime.jp", +"saijo.ehime.jp", +"seiyo.ehime.jp", +"shikokuchuo.ehime.jp", +"tobe.ehime.jp", +"toon.ehime.jp", +"uchiko.ehime.jp", +"uwajima.ehime.jp", +"yawatahama.ehime.jp", +"echizen.fukui.jp", +"eiheiji.fukui.jp", +"fukui.fukui.jp", +"ikeda.fukui.jp", +"katsuyama.fukui.jp", +"mihama.fukui.jp", +"minamiechizen.fukui.jp", +"obama.fukui.jp", +"ohi.fukui.jp", +"ono.fukui.jp", +"sabae.fukui.jp", +"sakai.fukui.jp", +"takahama.fukui.jp", +"tsuruga.fukui.jp", +"wakasa.fukui.jp", +"ashiya.fukuoka.jp", +"buzen.fukuoka.jp", +"chikugo.fukuoka.jp", +"chikuho.fukuoka.jp", +"chikujo.fukuoka.jp", +"chikushino.fukuoka.jp", +"chikuzen.fukuoka.jp", +"chuo.fukuoka.jp", +"dazaifu.fukuoka.jp", +"fukuchi.fukuoka.jp", +"hakata.fukuoka.jp", +"higashi.fukuoka.jp", +"hirokawa.fukuoka.jp", +"hisayama.fukuoka.jp", +"iizuka.fukuoka.jp", +"inatsuki.fukuoka.jp", +"kaho.fukuoka.jp", +"kasuga.fukuoka.jp", +"kasuya.fukuoka.jp", +"kawara.fukuoka.jp", +"keisen.fukuoka.jp", +"koga.fukuoka.jp", +"kurate.fukuoka.jp", +"kurogi.fukuoka.jp", +"kurume.fukuoka.jp", +"minami.fukuoka.jp", +"miyako.fukuoka.jp", +"miyama.fukuoka.jp", +"miyawaka.fukuoka.jp", +"mizumaki.fukuoka.jp", +"munakata.fukuoka.jp", +"nakagawa.fukuoka.jp", +"nakama.fukuoka.jp", +"nishi.fukuoka.jp", +"nogata.fukuoka.jp", +"ogori.fukuoka.jp", +"okagaki.fukuoka.jp", +"okawa.fukuoka.jp", +"oki.fukuoka.jp", +"omuta.fukuoka.jp", +"onga.fukuoka.jp", +"onojo.fukuoka.jp", +"oto.fukuoka.jp", +"saigawa.fukuoka.jp", +"sasaguri.fukuoka.jp", +"shingu.fukuoka.jp", +"shinyoshitomi.fukuoka.jp", +"shonai.fukuoka.jp", +"soeda.fukuoka.jp", +"sue.fukuoka.jp", +"tachiarai.fukuoka.jp", +"tagawa.fukuoka.jp", +"takata.fukuoka.jp", +"toho.fukuoka.jp", +"toyotsu.fukuoka.jp", +"tsuiki.fukuoka.jp", +"ukiha.fukuoka.jp", +"umi.fukuoka.jp", +"usui.fukuoka.jp", +"yamada.fukuoka.jp", +"yame.fukuoka.jp", +"yanagawa.fukuoka.jp", +"yukuhashi.fukuoka.jp", +"aizubange.fukushima.jp", +"aizumisato.fukushima.jp", +"aizuwakamatsu.fukushima.jp", +"asakawa.fukushima.jp", +"bandai.fukushima.jp", +"date.fukushima.jp", +"fukushima.fukushima.jp", +"furudono.fukushima.jp", +"futaba.fukushima.jp", +"hanawa.fukushima.jp", +"higashi.fukushima.jp", +"hirata.fukushima.jp", +"hirono.fukushima.jp", +"iitate.fukushima.jp", +"inawashiro.fukushima.jp", +"ishikawa.fukushima.jp", +"iwaki.fukushima.jp", +"izumizaki.fukushima.jp", +"kagamiishi.fukushima.jp", +"kaneyama.fukushima.jp", +"kawamata.fukushima.jp", +"kitakata.fukushima.jp", +"kitashiobara.fukushima.jp", +"koori.fukushima.jp", +"koriyama.fukushima.jp", +"kunimi.fukushima.jp", +"miharu.fukushima.jp", +"mishima.fukushima.jp", +"namie.fukushima.jp", +"nango.fukushima.jp", +"nishiaizu.fukushima.jp", +"nishigo.fukushima.jp", +"okuma.fukushima.jp", +"omotego.fukushima.jp", +"ono.fukushima.jp", +"otama.fukushima.jp", +"samegawa.fukushima.jp", +"shimogo.fukushima.jp", +"shirakawa.fukushima.jp", +"showa.fukushima.jp", +"soma.fukushima.jp", +"sukagawa.fukushima.jp", +"taishin.fukushima.jp", +"tamakawa.fukushima.jp", +"tanagura.fukushima.jp", +"tenei.fukushima.jp", +"yabuki.fukushima.jp", +"yamato.fukushima.jp", +"yamatsuri.fukushima.jp", +"yanaizu.fukushima.jp", +"yugawa.fukushima.jp", +"anpachi.gifu.jp", +"ena.gifu.jp", +"gifu.gifu.jp", +"ginan.gifu.jp", +"godo.gifu.jp", +"gujo.gifu.jp", +"hashima.gifu.jp", +"hichiso.gifu.jp", +"hida.gifu.jp", +"higashishirakawa.gifu.jp", +"ibigawa.gifu.jp", +"ikeda.gifu.jp", +"kakamigahara.gifu.jp", +"kani.gifu.jp", +"kasahara.gifu.jp", +"kasamatsu.gifu.jp", +"kawaue.gifu.jp", +"kitagata.gifu.jp", +"mino.gifu.jp", +"minokamo.gifu.jp", +"mitake.gifu.jp", +"mizunami.gifu.jp", +"motosu.gifu.jp", +"nakatsugawa.gifu.jp", +"ogaki.gifu.jp", +"sakahogi.gifu.jp", +"seki.gifu.jp", +"sekigahara.gifu.jp", +"shirakawa.gifu.jp", +"tajimi.gifu.jp", +"takayama.gifu.jp", +"tarui.gifu.jp", +"toki.gifu.jp", +"tomika.gifu.jp", +"wanouchi.gifu.jp", +"yamagata.gifu.jp", +"yaotsu.gifu.jp", +"yoro.gifu.jp", +"annaka.gunma.jp", +"chiyoda.gunma.jp", +"fujioka.gunma.jp", +"higashiagatsuma.gunma.jp", +"isesaki.gunma.jp", +"itakura.gunma.jp", +"kanna.gunma.jp", +"kanra.gunma.jp", +"katashina.gunma.jp", +"kawaba.gunma.jp", +"kiryu.gunma.jp", +"kusatsu.gunma.jp", +"maebashi.gunma.jp", +"meiwa.gunma.jp", +"midori.gunma.jp", +"minakami.gunma.jp", +"naganohara.gunma.jp", +"nakanojo.gunma.jp", +"nanmoku.gunma.jp", +"numata.gunma.jp", +"oizumi.gunma.jp", +"ora.gunma.jp", +"ota.gunma.jp", +"shibukawa.gunma.jp", +"shimonita.gunma.jp", +"shinto.gunma.jp", +"showa.gunma.jp", +"takasaki.gunma.jp", +"takayama.gunma.jp", +"tamamura.gunma.jp", +"tatebayashi.gunma.jp", +"tomioka.gunma.jp", +"tsukiyono.gunma.jp", +"tsumagoi.gunma.jp", +"ueno.gunma.jp", +"yoshioka.gunma.jp", +"asaminami.hiroshima.jp", +"daiwa.hiroshima.jp", +"etajima.hiroshima.jp", +"fuchu.hiroshima.jp", +"fukuyama.hiroshima.jp", +"hatsukaichi.hiroshima.jp", +"higashihiroshima.hiroshima.jp", +"hongo.hiroshima.jp", +"jinsekikogen.hiroshima.jp", +"kaita.hiroshima.jp", +"kui.hiroshima.jp", +"kumano.hiroshima.jp", +"kure.hiroshima.jp", +"mihara.hiroshima.jp", +"miyoshi.hiroshima.jp", +"naka.hiroshima.jp", +"onomichi.hiroshima.jp", +"osakikamijima.hiroshima.jp", +"otake.hiroshima.jp", +"saka.hiroshima.jp", +"sera.hiroshima.jp", +"seranishi.hiroshima.jp", +"shinichi.hiroshima.jp", +"shobara.hiroshima.jp", +"takehara.hiroshima.jp", +"abashiri.hokkaido.jp", +"abira.hokkaido.jp", +"aibetsu.hokkaido.jp", +"akabira.hokkaido.jp", +"akkeshi.hokkaido.jp", +"asahikawa.hokkaido.jp", +"ashibetsu.hokkaido.jp", +"ashoro.hokkaido.jp", +"assabu.hokkaido.jp", +"atsuma.hokkaido.jp", +"bibai.hokkaido.jp", +"biei.hokkaido.jp", +"bifuka.hokkaido.jp", +"bihoro.hokkaido.jp", +"biratori.hokkaido.jp", +"chippubetsu.hokkaido.jp", +"chitose.hokkaido.jp", +"date.hokkaido.jp", +"ebetsu.hokkaido.jp", +"embetsu.hokkaido.jp", +"eniwa.hokkaido.jp", +"erimo.hokkaido.jp", +"esan.hokkaido.jp", +"esashi.hokkaido.jp", +"fukagawa.hokkaido.jp", +"fukushima.hokkaido.jp", +"furano.hokkaido.jp", +"furubira.hokkaido.jp", +"haboro.hokkaido.jp", +"hakodate.hokkaido.jp", +"hamatonbetsu.hokkaido.jp", +"hidaka.hokkaido.jp", +"higashikagura.hokkaido.jp", +"higashikawa.hokkaido.jp", +"hiroo.hokkaido.jp", +"hokuryu.hokkaido.jp", +"hokuto.hokkaido.jp", +"honbetsu.hokkaido.jp", +"horokanai.hokkaido.jp", +"horonobe.hokkaido.jp", +"ikeda.hokkaido.jp", +"imakane.hokkaido.jp", +"ishikari.hokkaido.jp", +"iwamizawa.hokkaido.jp", +"iwanai.hokkaido.jp", +"kamifurano.hokkaido.jp", +"kamikawa.hokkaido.jp", +"kamishihoro.hokkaido.jp", +"kamisunagawa.hokkaido.jp", +"kamoenai.hokkaido.jp", +"kayabe.hokkaido.jp", +"kembuchi.hokkaido.jp", +"kikonai.hokkaido.jp", +"kimobetsu.hokkaido.jp", +"kitahiroshima.hokkaido.jp", +"kitami.hokkaido.jp", +"kiyosato.hokkaido.jp", +"koshimizu.hokkaido.jp", +"kunneppu.hokkaido.jp", +"kuriyama.hokkaido.jp", +"kuromatsunai.hokkaido.jp", +"kushiro.hokkaido.jp", +"kutchan.hokkaido.jp", +"kyowa.hokkaido.jp", +"mashike.hokkaido.jp", +"matsumae.hokkaido.jp", +"mikasa.hokkaido.jp", +"minamifurano.hokkaido.jp", +"mombetsu.hokkaido.jp", +"moseushi.hokkaido.jp", +"mukawa.hokkaido.jp", +"muroran.hokkaido.jp", +"naie.hokkaido.jp", +"nakagawa.hokkaido.jp", +"nakasatsunai.hokkaido.jp", +"nakatombetsu.hokkaido.jp", +"nanae.hokkaido.jp", +"nanporo.hokkaido.jp", +"nayoro.hokkaido.jp", +"nemuro.hokkaido.jp", +"niikappu.hokkaido.jp", +"niki.hokkaido.jp", +"nishiokoppe.hokkaido.jp", +"noboribetsu.hokkaido.jp", +"numata.hokkaido.jp", +"obihiro.hokkaido.jp", +"obira.hokkaido.jp", +"oketo.hokkaido.jp", +"okoppe.hokkaido.jp", +"otaru.hokkaido.jp", +"otobe.hokkaido.jp", +"otofuke.hokkaido.jp", +"otoineppu.hokkaido.jp", +"oumu.hokkaido.jp", +"ozora.hokkaido.jp", +"pippu.hokkaido.jp", +"rankoshi.hokkaido.jp", +"rebun.hokkaido.jp", +"rikubetsu.hokkaido.jp", +"rishiri.hokkaido.jp", +"rishirifuji.hokkaido.jp", +"saroma.hokkaido.jp", +"sarufutsu.hokkaido.jp", +"shakotan.hokkaido.jp", +"shari.hokkaido.jp", +"shibecha.hokkaido.jp", +"shibetsu.hokkaido.jp", +"shikabe.hokkaido.jp", +"shikaoi.hokkaido.jp", +"shimamaki.hokkaido.jp", +"shimizu.hokkaido.jp", +"shimokawa.hokkaido.jp", +"shinshinotsu.hokkaido.jp", +"shintoku.hokkaido.jp", +"shiranuka.hokkaido.jp", +"shiraoi.hokkaido.jp", +"shiriuchi.hokkaido.jp", +"sobetsu.hokkaido.jp", +"sunagawa.hokkaido.jp", +"taiki.hokkaido.jp", +"takasu.hokkaido.jp", +"takikawa.hokkaido.jp", +"takinoue.hokkaido.jp", +"teshikaga.hokkaido.jp", +"tobetsu.hokkaido.jp", +"tohma.hokkaido.jp", +"tomakomai.hokkaido.jp", +"tomari.hokkaido.jp", +"toya.hokkaido.jp", +"toyako.hokkaido.jp", +"toyotomi.hokkaido.jp", +"toyoura.hokkaido.jp", +"tsubetsu.hokkaido.jp", +"tsukigata.hokkaido.jp", +"urakawa.hokkaido.jp", +"urausu.hokkaido.jp", +"uryu.hokkaido.jp", +"utashinai.hokkaido.jp", +"wakkanai.hokkaido.jp", +"wassamu.hokkaido.jp", +"yakumo.hokkaido.jp", +"yoichi.hokkaido.jp", +"aioi.hyogo.jp", +"akashi.hyogo.jp", +"ako.hyogo.jp", +"amagasaki.hyogo.jp", +"aogaki.hyogo.jp", +"asago.hyogo.jp", +"ashiya.hyogo.jp", +"awaji.hyogo.jp", +"fukusaki.hyogo.jp", +"goshiki.hyogo.jp", +"harima.hyogo.jp", +"himeji.hyogo.jp", +"ichikawa.hyogo.jp", +"inagawa.hyogo.jp", +"itami.hyogo.jp", +"kakogawa.hyogo.jp", +"kamigori.hyogo.jp", +"kamikawa.hyogo.jp", +"kasai.hyogo.jp", +"kasuga.hyogo.jp", +"kawanishi.hyogo.jp", +"miki.hyogo.jp", +"minamiawaji.hyogo.jp", +"nishinomiya.hyogo.jp", +"nishiwaki.hyogo.jp", +"ono.hyogo.jp", +"sanda.hyogo.jp", +"sannan.hyogo.jp", +"sasayama.hyogo.jp", +"sayo.hyogo.jp", +"shingu.hyogo.jp", +"shinonsen.hyogo.jp", +"shiso.hyogo.jp", +"sumoto.hyogo.jp", +"taishi.hyogo.jp", +"taka.hyogo.jp", +"takarazuka.hyogo.jp", +"takasago.hyogo.jp", +"takino.hyogo.jp", +"tamba.hyogo.jp", +"tatsuno.hyogo.jp", +"toyooka.hyogo.jp", +"yabu.hyogo.jp", +"yashiro.hyogo.jp", +"yoka.hyogo.jp", +"yokawa.hyogo.jp", +"ami.ibaraki.jp", +"asahi.ibaraki.jp", +"bando.ibaraki.jp", +"chikusei.ibaraki.jp", +"daigo.ibaraki.jp", +"fujishiro.ibaraki.jp", +"hitachi.ibaraki.jp", +"hitachinaka.ibaraki.jp", +"hitachiomiya.ibaraki.jp", +"hitachiota.ibaraki.jp", +"ibaraki.ibaraki.jp", +"ina.ibaraki.jp", +"inashiki.ibaraki.jp", +"itako.ibaraki.jp", +"iwama.ibaraki.jp", +"joso.ibaraki.jp", +"kamisu.ibaraki.jp", +"kasama.ibaraki.jp", +"kashima.ibaraki.jp", +"kasumigaura.ibaraki.jp", +"koga.ibaraki.jp", +"miho.ibaraki.jp", +"mito.ibaraki.jp", +"moriya.ibaraki.jp", +"naka.ibaraki.jp", +"namegata.ibaraki.jp", +"oarai.ibaraki.jp", +"ogawa.ibaraki.jp", +"omitama.ibaraki.jp", +"ryugasaki.ibaraki.jp", +"sakai.ibaraki.jp", +"sakuragawa.ibaraki.jp", +"shimodate.ibaraki.jp", +"shimotsuma.ibaraki.jp", +"shirosato.ibaraki.jp", +"sowa.ibaraki.jp", +"suifu.ibaraki.jp", +"takahagi.ibaraki.jp", +"tamatsukuri.ibaraki.jp", +"tokai.ibaraki.jp", +"tomobe.ibaraki.jp", +"tone.ibaraki.jp", +"toride.ibaraki.jp", +"tsuchiura.ibaraki.jp", +"tsukuba.ibaraki.jp", +"uchihara.ibaraki.jp", +"ushiku.ibaraki.jp", +"yachiyo.ibaraki.jp", +"yamagata.ibaraki.jp", +"yawara.ibaraki.jp", +"yuki.ibaraki.jp", +"anamizu.ishikawa.jp", +"hakui.ishikawa.jp", +"hakusan.ishikawa.jp", +"kaga.ishikawa.jp", +"kahoku.ishikawa.jp", +"kanazawa.ishikawa.jp", +"kawakita.ishikawa.jp", +"komatsu.ishikawa.jp", +"nakanoto.ishikawa.jp", +"nanao.ishikawa.jp", +"nomi.ishikawa.jp", +"nonoichi.ishikawa.jp", +"noto.ishikawa.jp", +"shika.ishikawa.jp", +"suzu.ishikawa.jp", +"tsubata.ishikawa.jp", +"tsurugi.ishikawa.jp", +"uchinada.ishikawa.jp", +"wajima.ishikawa.jp", +"fudai.iwate.jp", +"fujisawa.iwate.jp", +"hanamaki.iwate.jp", +"hiraizumi.iwate.jp", +"hirono.iwate.jp", +"ichinohe.iwate.jp", +"ichinoseki.iwate.jp", +"iwaizumi.iwate.jp", +"iwate.iwate.jp", +"joboji.iwate.jp", +"kamaishi.iwate.jp", +"kanegasaki.iwate.jp", +"karumai.iwate.jp", +"kawai.iwate.jp", +"kitakami.iwate.jp", +"kuji.iwate.jp", +"kunohe.iwate.jp", +"kuzumaki.iwate.jp", +"miyako.iwate.jp", +"mizusawa.iwate.jp", +"morioka.iwate.jp", +"ninohe.iwate.jp", +"noda.iwate.jp", +"ofunato.iwate.jp", +"oshu.iwate.jp", +"otsuchi.iwate.jp", +"rikuzentakata.iwate.jp", +"shiwa.iwate.jp", +"shizukuishi.iwate.jp", +"sumita.iwate.jp", +"tanohata.iwate.jp", +"tono.iwate.jp", +"yahaba.iwate.jp", +"yamada.iwate.jp", +"ayagawa.kagawa.jp", +"higashikagawa.kagawa.jp", +"kanonji.kagawa.jp", +"kotohira.kagawa.jp", +"manno.kagawa.jp", +"marugame.kagawa.jp", +"mitoyo.kagawa.jp", +"naoshima.kagawa.jp", +"sanuki.kagawa.jp", +"tadotsu.kagawa.jp", +"takamatsu.kagawa.jp", +"tonosho.kagawa.jp", +"uchinomi.kagawa.jp", +"utazu.kagawa.jp", +"zentsuji.kagawa.jp", +"akune.kagoshima.jp", +"amami.kagoshima.jp", +"hioki.kagoshima.jp", +"isa.kagoshima.jp", +"isen.kagoshima.jp", +"izumi.kagoshima.jp", +"kagoshima.kagoshima.jp", +"kanoya.kagoshima.jp", +"kawanabe.kagoshima.jp", +"kinko.kagoshima.jp", +"kouyama.kagoshima.jp", +"makurazaki.kagoshima.jp", +"matsumoto.kagoshima.jp", +"minamitane.kagoshima.jp", +"nakatane.kagoshima.jp", +"nishinoomote.kagoshima.jp", +"satsumasendai.kagoshima.jp", +"soo.kagoshima.jp", +"tarumizu.kagoshima.jp", +"yusui.kagoshima.jp", +"aikawa.kanagawa.jp", +"atsugi.kanagawa.jp", +"ayase.kanagawa.jp", +"chigasaki.kanagawa.jp", +"ebina.kanagawa.jp", +"fujisawa.kanagawa.jp", +"hadano.kanagawa.jp", +"hakone.kanagawa.jp", +"hiratsuka.kanagawa.jp", +"isehara.kanagawa.jp", +"kaisei.kanagawa.jp", +"kamakura.kanagawa.jp", +"kiyokawa.kanagawa.jp", +"matsuda.kanagawa.jp", +"minamiashigara.kanagawa.jp", +"miura.kanagawa.jp", +"nakai.kanagawa.jp", +"ninomiya.kanagawa.jp", +"odawara.kanagawa.jp", +"oi.kanagawa.jp", +"oiso.kanagawa.jp", +"sagamihara.kanagawa.jp", +"samukawa.kanagawa.jp", +"tsukui.kanagawa.jp", +"yamakita.kanagawa.jp", +"yamato.kanagawa.jp", +"yokosuka.kanagawa.jp", +"yugawara.kanagawa.jp", +"zama.kanagawa.jp", +"zushi.kanagawa.jp", +"aki.kochi.jp", +"geisei.kochi.jp", +"hidaka.kochi.jp", +"higashitsuno.kochi.jp", +"ino.kochi.jp", +"kagami.kochi.jp", +"kami.kochi.jp", +"kitagawa.kochi.jp", +"kochi.kochi.jp", +"mihara.kochi.jp", +"motoyama.kochi.jp", +"muroto.kochi.jp", +"nahari.kochi.jp", +"nakamura.kochi.jp", +"nankoku.kochi.jp", +"nishitosa.kochi.jp", +"niyodogawa.kochi.jp", +"ochi.kochi.jp", +"okawa.kochi.jp", +"otoyo.kochi.jp", +"otsuki.kochi.jp", +"sakawa.kochi.jp", +"sukumo.kochi.jp", +"susaki.kochi.jp", +"tosa.kochi.jp", +"tosashimizu.kochi.jp", +"toyo.kochi.jp", +"tsuno.kochi.jp", +"umaji.kochi.jp", +"yasuda.kochi.jp", +"yusuhara.kochi.jp", +"amakusa.kumamoto.jp", +"arao.kumamoto.jp", +"aso.kumamoto.jp", +"choyo.kumamoto.jp", +"gyokuto.kumamoto.jp", +"kamiamakusa.kumamoto.jp", +"kikuchi.kumamoto.jp", +"kumamoto.kumamoto.jp", +"mashiki.kumamoto.jp", +"mifune.kumamoto.jp", +"minamata.kumamoto.jp", +"minamioguni.kumamoto.jp", +"nagasu.kumamoto.jp", +"nishihara.kumamoto.jp", +"oguni.kumamoto.jp", +"ozu.kumamoto.jp", +"sumoto.kumamoto.jp", +"takamori.kumamoto.jp", +"uki.kumamoto.jp", +"uto.kumamoto.jp", +"yamaga.kumamoto.jp", +"yamato.kumamoto.jp", +"yatsushiro.kumamoto.jp", +"ayabe.kyoto.jp", +"fukuchiyama.kyoto.jp", +"higashiyama.kyoto.jp", +"ide.kyoto.jp", +"ine.kyoto.jp", +"joyo.kyoto.jp", +"kameoka.kyoto.jp", +"kamo.kyoto.jp", +"kita.kyoto.jp", +"kizu.kyoto.jp", +"kumiyama.kyoto.jp", +"kyotamba.kyoto.jp", +"kyotanabe.kyoto.jp", +"kyotango.kyoto.jp", +"maizuru.kyoto.jp", +"minami.kyoto.jp", +"minamiyamashiro.kyoto.jp", +"miyazu.kyoto.jp", +"muko.kyoto.jp", +"nagaokakyo.kyoto.jp", +"nakagyo.kyoto.jp", +"nantan.kyoto.jp", +"oyamazaki.kyoto.jp", +"sakyo.kyoto.jp", +"seika.kyoto.jp", +"tanabe.kyoto.jp", +"uji.kyoto.jp", +"ujitawara.kyoto.jp", +"wazuka.kyoto.jp", +"yamashina.kyoto.jp", +"yawata.kyoto.jp", +"asahi.mie.jp", +"inabe.mie.jp", +"ise.mie.jp", +"kameyama.mie.jp", +"kawagoe.mie.jp", +"kiho.mie.jp", +"kisosaki.mie.jp", +"kiwa.mie.jp", +"komono.mie.jp", +"kumano.mie.jp", +"kuwana.mie.jp", +"matsusaka.mie.jp", +"meiwa.mie.jp", +"mihama.mie.jp", +"minamiise.mie.jp", +"misugi.mie.jp", +"miyama.mie.jp", +"nabari.mie.jp", +"shima.mie.jp", +"suzuka.mie.jp", +"tado.mie.jp", +"taiki.mie.jp", +"taki.mie.jp", +"tamaki.mie.jp", +"toba.mie.jp", +"tsu.mie.jp", +"udono.mie.jp", +"ureshino.mie.jp", +"watarai.mie.jp", +"yokkaichi.mie.jp", +"furukawa.miyagi.jp", +"higashimatsushima.miyagi.jp", +"ishinomaki.miyagi.jp", +"iwanuma.miyagi.jp", +"kakuda.miyagi.jp", +"kami.miyagi.jp", +"kawasaki.miyagi.jp", +"marumori.miyagi.jp", +"matsushima.miyagi.jp", +"minamisanriku.miyagi.jp", +"misato.miyagi.jp", +"murata.miyagi.jp", +"natori.miyagi.jp", +"ogawara.miyagi.jp", +"ohira.miyagi.jp", +"onagawa.miyagi.jp", +"osaki.miyagi.jp", +"rifu.miyagi.jp", +"semine.miyagi.jp", +"shibata.miyagi.jp", +"shichikashuku.miyagi.jp", +"shikama.miyagi.jp", +"shiogama.miyagi.jp", +"shiroishi.miyagi.jp", +"tagajo.miyagi.jp", +"taiwa.miyagi.jp", +"tome.miyagi.jp", +"tomiya.miyagi.jp", +"wakuya.miyagi.jp", +"watari.miyagi.jp", +"yamamoto.miyagi.jp", +"zao.miyagi.jp", +"aya.miyazaki.jp", +"ebino.miyazaki.jp", +"gokase.miyazaki.jp", +"hyuga.miyazaki.jp", +"kadogawa.miyazaki.jp", +"kawaminami.miyazaki.jp", +"kijo.miyazaki.jp", +"kitagawa.miyazaki.jp", +"kitakata.miyazaki.jp", +"kitaura.miyazaki.jp", +"kobayashi.miyazaki.jp", +"kunitomi.miyazaki.jp", +"kushima.miyazaki.jp", +"mimata.miyazaki.jp", +"miyakonojo.miyazaki.jp", +"miyazaki.miyazaki.jp", +"morotsuka.miyazaki.jp", +"nichinan.miyazaki.jp", +"nishimera.miyazaki.jp", +"nobeoka.miyazaki.jp", +"saito.miyazaki.jp", +"shiiba.miyazaki.jp", +"shintomi.miyazaki.jp", +"takaharu.miyazaki.jp", +"takanabe.miyazaki.jp", +"takazaki.miyazaki.jp", +"tsuno.miyazaki.jp", +"achi.nagano.jp", +"agematsu.nagano.jp", +"anan.nagano.jp", +"aoki.nagano.jp", +"asahi.nagano.jp", +"azumino.nagano.jp", +"chikuhoku.nagano.jp", +"chikuma.nagano.jp", +"chino.nagano.jp", +"fujimi.nagano.jp", +"hakuba.nagano.jp", +"hara.nagano.jp", +"hiraya.nagano.jp", +"iida.nagano.jp", +"iijima.nagano.jp", +"iiyama.nagano.jp", +"iizuna.nagano.jp", +"ikeda.nagano.jp", +"ikusaka.nagano.jp", +"ina.nagano.jp", +"karuizawa.nagano.jp", +"kawakami.nagano.jp", +"kiso.nagano.jp", +"kisofukushima.nagano.jp", +"kitaaiki.nagano.jp", +"komagane.nagano.jp", +"komoro.nagano.jp", +"matsukawa.nagano.jp", +"matsumoto.nagano.jp", +"miasa.nagano.jp", +"minamiaiki.nagano.jp", +"minamimaki.nagano.jp", +"minamiminowa.nagano.jp", +"minowa.nagano.jp", +"miyada.nagano.jp", +"miyota.nagano.jp", +"mochizuki.nagano.jp", +"nagano.nagano.jp", +"nagawa.nagano.jp", +"nagiso.nagano.jp", +"nakagawa.nagano.jp", +"nakano.nagano.jp", +"nozawaonsen.nagano.jp", +"obuse.nagano.jp", +"ogawa.nagano.jp", +"okaya.nagano.jp", +"omachi.nagano.jp", +"omi.nagano.jp", +"ookuwa.nagano.jp", +"ooshika.nagano.jp", +"otaki.nagano.jp", +"otari.nagano.jp", +"sakae.nagano.jp", +"sakaki.nagano.jp", +"saku.nagano.jp", +"sakuho.nagano.jp", +"shimosuwa.nagano.jp", +"shinanomachi.nagano.jp", +"shiojiri.nagano.jp", +"suwa.nagano.jp", +"suzaka.nagano.jp", +"takagi.nagano.jp", +"takamori.nagano.jp", +"takayama.nagano.jp", +"tateshina.nagano.jp", +"tatsuno.nagano.jp", +"togakushi.nagano.jp", +"togura.nagano.jp", +"tomi.nagano.jp", +"ueda.nagano.jp", +"wada.nagano.jp", +"yamagata.nagano.jp", +"yamanouchi.nagano.jp", +"yasaka.nagano.jp", +"yasuoka.nagano.jp", +"chijiwa.nagasaki.jp", +"futsu.nagasaki.jp", +"goto.nagasaki.jp", +"hasami.nagasaki.jp", +"hirado.nagasaki.jp", +"iki.nagasaki.jp", +"isahaya.nagasaki.jp", +"kawatana.nagasaki.jp", +"kuchinotsu.nagasaki.jp", +"matsuura.nagasaki.jp", +"nagasaki.nagasaki.jp", +"obama.nagasaki.jp", +"omura.nagasaki.jp", +"oseto.nagasaki.jp", +"saikai.nagasaki.jp", +"sasebo.nagasaki.jp", +"seihi.nagasaki.jp", +"shimabara.nagasaki.jp", +"shinkamigoto.nagasaki.jp", +"togitsu.nagasaki.jp", +"tsushima.nagasaki.jp", +"unzen.nagasaki.jp", +"ando.nara.jp", +"gose.nara.jp", +"heguri.nara.jp", +"higashiyoshino.nara.jp", +"ikaruga.nara.jp", +"ikoma.nara.jp", +"kamikitayama.nara.jp", +"kanmaki.nara.jp", +"kashiba.nara.jp", +"kashihara.nara.jp", +"katsuragi.nara.jp", +"kawai.nara.jp", +"kawakami.nara.jp", +"kawanishi.nara.jp", +"koryo.nara.jp", +"kurotaki.nara.jp", +"mitsue.nara.jp", +"miyake.nara.jp", +"nara.nara.jp", +"nosegawa.nara.jp", +"oji.nara.jp", +"ouda.nara.jp", +"oyodo.nara.jp", +"sakurai.nara.jp", +"sango.nara.jp", +"shimoichi.nara.jp", +"shimokitayama.nara.jp", +"shinjo.nara.jp", +"soni.nara.jp", +"takatori.nara.jp", +"tawaramoto.nara.jp", +"tenkawa.nara.jp", +"tenri.nara.jp", +"uda.nara.jp", +"yamatokoriyama.nara.jp", +"yamatotakada.nara.jp", +"yamazoe.nara.jp", +"yoshino.nara.jp", +"aga.niigata.jp", +"agano.niigata.jp", +"gosen.niigata.jp", +"itoigawa.niigata.jp", +"izumozaki.niigata.jp", +"joetsu.niigata.jp", +"kamo.niigata.jp", +"kariwa.niigata.jp", +"kashiwazaki.niigata.jp", +"minamiuonuma.niigata.jp", +"mitsuke.niigata.jp", +"muika.niigata.jp", +"murakami.niigata.jp", +"myoko.niigata.jp", +"nagaoka.niigata.jp", +"niigata.niigata.jp", +"ojiya.niigata.jp", +"omi.niigata.jp", +"sado.niigata.jp", +"sanjo.niigata.jp", +"seiro.niigata.jp", +"seirou.niigata.jp", +"sekikawa.niigata.jp", +"shibata.niigata.jp", +"tagami.niigata.jp", +"tainai.niigata.jp", +"tochio.niigata.jp", +"tokamachi.niigata.jp", +"tsubame.niigata.jp", +"tsunan.niigata.jp", +"uonuma.niigata.jp", +"yahiko.niigata.jp", +"yoita.niigata.jp", +"yuzawa.niigata.jp", +"beppu.oita.jp", +"bungoono.oita.jp", +"bungotakada.oita.jp", +"hasama.oita.jp", +"hiji.oita.jp", +"himeshima.oita.jp", +"hita.oita.jp", +"kamitsue.oita.jp", +"kokonoe.oita.jp", +"kuju.oita.jp", +"kunisaki.oita.jp", +"kusu.oita.jp", +"oita.oita.jp", +"saiki.oita.jp", +"taketa.oita.jp", +"tsukumi.oita.jp", +"usa.oita.jp", +"usuki.oita.jp", +"yufu.oita.jp", +"akaiwa.okayama.jp", +"asakuchi.okayama.jp", +"bizen.okayama.jp", +"hayashima.okayama.jp", +"ibara.okayama.jp", +"kagamino.okayama.jp", +"kasaoka.okayama.jp", +"kibichuo.okayama.jp", +"kumenan.okayama.jp", +"kurashiki.okayama.jp", +"maniwa.okayama.jp", +"misaki.okayama.jp", +"nagi.okayama.jp", +"niimi.okayama.jp", +"nishiawakura.okayama.jp", +"okayama.okayama.jp", +"satosho.okayama.jp", +"setouchi.okayama.jp", +"shinjo.okayama.jp", +"shoo.okayama.jp", +"soja.okayama.jp", +"takahashi.okayama.jp", +"tamano.okayama.jp", +"tsuyama.okayama.jp", +"wake.okayama.jp", +"yakage.okayama.jp", +"aguni.okinawa.jp", +"ginowan.okinawa.jp", +"ginoza.okinawa.jp", +"gushikami.okinawa.jp", +"haebaru.okinawa.jp", +"higashi.okinawa.jp", +"hirara.okinawa.jp", +"iheya.okinawa.jp", +"ishigaki.okinawa.jp", +"ishikawa.okinawa.jp", +"itoman.okinawa.jp", +"izena.okinawa.jp", +"kadena.okinawa.jp", +"kin.okinawa.jp", +"kitadaito.okinawa.jp", +"kitanakagusuku.okinawa.jp", +"kumejima.okinawa.jp", +"kunigami.okinawa.jp", +"minamidaito.okinawa.jp", +"motobu.okinawa.jp", +"nago.okinawa.jp", +"naha.okinawa.jp", +"nakagusuku.okinawa.jp", +"nakijin.okinawa.jp", +"nanjo.okinawa.jp", +"nishihara.okinawa.jp", +"ogimi.okinawa.jp", +"okinawa.okinawa.jp", +"onna.okinawa.jp", +"shimoji.okinawa.jp", +"taketomi.okinawa.jp", +"tarama.okinawa.jp", +"tokashiki.okinawa.jp", +"tomigusuku.okinawa.jp", +"tonaki.okinawa.jp", +"urasoe.okinawa.jp", +"uruma.okinawa.jp", +"yaese.okinawa.jp", +"yomitan.okinawa.jp", +"yonabaru.okinawa.jp", +"yonaguni.okinawa.jp", +"zamami.okinawa.jp", +"abeno.osaka.jp", +"chihayaakasaka.osaka.jp", +"chuo.osaka.jp", +"daito.osaka.jp", +"fujiidera.osaka.jp", +"habikino.osaka.jp", +"hannan.osaka.jp", +"higashiosaka.osaka.jp", +"higashisumiyoshi.osaka.jp", +"higashiyodogawa.osaka.jp", +"hirakata.osaka.jp", +"ibaraki.osaka.jp", +"ikeda.osaka.jp", +"izumi.osaka.jp", +"izumiotsu.osaka.jp", +"izumisano.osaka.jp", +"kadoma.osaka.jp", +"kaizuka.osaka.jp", +"kanan.osaka.jp", +"kashiwara.osaka.jp", +"katano.osaka.jp", +"kawachinagano.osaka.jp", +"kishiwada.osaka.jp", +"kita.osaka.jp", +"kumatori.osaka.jp", +"matsubara.osaka.jp", +"minato.osaka.jp", +"minoh.osaka.jp", +"misaki.osaka.jp", +"moriguchi.osaka.jp", +"neyagawa.osaka.jp", +"nishi.osaka.jp", +"nose.osaka.jp", +"osakasayama.osaka.jp", +"sakai.osaka.jp", +"sayama.osaka.jp", +"sennan.osaka.jp", +"settsu.osaka.jp", +"shijonawate.osaka.jp", +"shimamoto.osaka.jp", +"suita.osaka.jp", +"tadaoka.osaka.jp", +"taishi.osaka.jp", +"tajiri.osaka.jp", +"takaishi.osaka.jp", +"takatsuki.osaka.jp", +"tondabayashi.osaka.jp", +"toyonaka.osaka.jp", +"toyono.osaka.jp", +"yao.osaka.jp", +"ariake.saga.jp", +"arita.saga.jp", +"fukudomi.saga.jp", +"genkai.saga.jp", +"hamatama.saga.jp", +"hizen.saga.jp", +"imari.saga.jp", +"kamimine.saga.jp", +"kanzaki.saga.jp", +"karatsu.saga.jp", +"kashima.saga.jp", +"kitagata.saga.jp", +"kitahata.saga.jp", +"kiyama.saga.jp", +"kouhoku.saga.jp", +"kyuragi.saga.jp", +"nishiarita.saga.jp", +"ogi.saga.jp", +"omachi.saga.jp", +"ouchi.saga.jp", +"saga.saga.jp", +"shiroishi.saga.jp", +"taku.saga.jp", +"tara.saga.jp", +"tosu.saga.jp", +"yoshinogari.saga.jp", +"arakawa.saitama.jp", +"asaka.saitama.jp", +"chichibu.saitama.jp", +"fujimi.saitama.jp", +"fujimino.saitama.jp", +"fukaya.saitama.jp", +"hanno.saitama.jp", +"hanyu.saitama.jp", +"hasuda.saitama.jp", +"hatogaya.saitama.jp", +"hatoyama.saitama.jp", +"hidaka.saitama.jp", +"higashichichibu.saitama.jp", +"higashimatsuyama.saitama.jp", +"honjo.saitama.jp", +"ina.saitama.jp", +"iruma.saitama.jp", +"iwatsuki.saitama.jp", +"kamiizumi.saitama.jp", +"kamikawa.saitama.jp", +"kamisato.saitama.jp", +"kasukabe.saitama.jp", +"kawagoe.saitama.jp", +"kawaguchi.saitama.jp", +"kawajima.saitama.jp", +"kazo.saitama.jp", +"kitamoto.saitama.jp", +"koshigaya.saitama.jp", +"kounosu.saitama.jp", +"kuki.saitama.jp", +"kumagaya.saitama.jp", +"matsubushi.saitama.jp", +"minano.saitama.jp", +"misato.saitama.jp", +"miyashiro.saitama.jp", +"miyoshi.saitama.jp", +"moroyama.saitama.jp", +"nagatoro.saitama.jp", +"namegawa.saitama.jp", +"niiza.saitama.jp", +"ogano.saitama.jp", +"ogawa.saitama.jp", +"ogose.saitama.jp", +"okegawa.saitama.jp", +"omiya.saitama.jp", +"otaki.saitama.jp", +"ranzan.saitama.jp", +"ryokami.saitama.jp", +"saitama.saitama.jp", +"sakado.saitama.jp", +"satte.saitama.jp", +"sayama.saitama.jp", +"shiki.saitama.jp", +"shiraoka.saitama.jp", +"soka.saitama.jp", +"sugito.saitama.jp", +"toda.saitama.jp", +"tokigawa.saitama.jp", +"tokorozawa.saitama.jp", +"tsurugashima.saitama.jp", +"urawa.saitama.jp", +"warabi.saitama.jp", +"yashio.saitama.jp", +"yokoze.saitama.jp", +"yono.saitama.jp", +"yorii.saitama.jp", +"yoshida.saitama.jp", +"yoshikawa.saitama.jp", +"yoshimi.saitama.jp", +"aisho.shiga.jp", +"gamo.shiga.jp", +"higashiomi.shiga.jp", +"hikone.shiga.jp", +"koka.shiga.jp", +"konan.shiga.jp", +"kosei.shiga.jp", +"koto.shiga.jp", +"kusatsu.shiga.jp", +"maibara.shiga.jp", +"moriyama.shiga.jp", +"nagahama.shiga.jp", +"nishiazai.shiga.jp", +"notogawa.shiga.jp", +"omihachiman.shiga.jp", +"otsu.shiga.jp", +"ritto.shiga.jp", +"ryuoh.shiga.jp", +"takashima.shiga.jp", +"takatsuki.shiga.jp", +"torahime.shiga.jp", +"toyosato.shiga.jp", +"yasu.shiga.jp", +"akagi.shimane.jp", +"ama.shimane.jp", +"gotsu.shimane.jp", +"hamada.shimane.jp", +"higashiizumo.shimane.jp", +"hikawa.shimane.jp", +"hikimi.shimane.jp", +"izumo.shimane.jp", +"kakinoki.shimane.jp", +"masuda.shimane.jp", +"matsue.shimane.jp", +"misato.shimane.jp", +"nishinoshima.shimane.jp", +"ohda.shimane.jp", +"okinoshima.shimane.jp", +"okuizumo.shimane.jp", +"shimane.shimane.jp", +"tamayu.shimane.jp", +"tsuwano.shimane.jp", +"unnan.shimane.jp", +"yakumo.shimane.jp", +"yasugi.shimane.jp", +"yatsuka.shimane.jp", +"arai.shizuoka.jp", +"atami.shizuoka.jp", +"fuji.shizuoka.jp", +"fujieda.shizuoka.jp", +"fujikawa.shizuoka.jp", +"fujinomiya.shizuoka.jp", +"fukuroi.shizuoka.jp", +"gotemba.shizuoka.jp", +"haibara.shizuoka.jp", +"hamamatsu.shizuoka.jp", +"higashiizu.shizuoka.jp", +"ito.shizuoka.jp", +"iwata.shizuoka.jp", +"izu.shizuoka.jp", +"izunokuni.shizuoka.jp", +"kakegawa.shizuoka.jp", +"kannami.shizuoka.jp", +"kawanehon.shizuoka.jp", +"kawazu.shizuoka.jp", +"kikugawa.shizuoka.jp", +"kosai.shizuoka.jp", +"makinohara.shizuoka.jp", +"matsuzaki.shizuoka.jp", +"minamiizu.shizuoka.jp", +"mishima.shizuoka.jp", +"morimachi.shizuoka.jp", +"nishiizu.shizuoka.jp", +"numazu.shizuoka.jp", +"omaezaki.shizuoka.jp", +"shimada.shizuoka.jp", +"shimizu.shizuoka.jp", +"shimoda.shizuoka.jp", +"shizuoka.shizuoka.jp", +"susono.shizuoka.jp", +"yaizu.shizuoka.jp", +"yoshida.shizuoka.jp", +"ashikaga.tochigi.jp", +"bato.tochigi.jp", +"haga.tochigi.jp", +"ichikai.tochigi.jp", +"iwafune.tochigi.jp", +"kaminokawa.tochigi.jp", +"kanuma.tochigi.jp", +"karasuyama.tochigi.jp", +"kuroiso.tochigi.jp", +"mashiko.tochigi.jp", +"mibu.tochigi.jp", +"moka.tochigi.jp", +"motegi.tochigi.jp", +"nasu.tochigi.jp", +"nasushiobara.tochigi.jp", +"nikko.tochigi.jp", +"nishikata.tochigi.jp", +"nogi.tochigi.jp", +"ohira.tochigi.jp", +"ohtawara.tochigi.jp", +"oyama.tochigi.jp", +"sakura.tochigi.jp", +"sano.tochigi.jp", +"shimotsuke.tochigi.jp", +"shioya.tochigi.jp", +"takanezawa.tochigi.jp", +"tochigi.tochigi.jp", +"tsuga.tochigi.jp", +"ujiie.tochigi.jp", +"utsunomiya.tochigi.jp", +"yaita.tochigi.jp", +"aizumi.tokushima.jp", +"anan.tokushima.jp", +"ichiba.tokushima.jp", +"itano.tokushima.jp", +"kainan.tokushima.jp", +"komatsushima.tokushima.jp", +"matsushige.tokushima.jp", +"mima.tokushima.jp", +"minami.tokushima.jp", +"miyoshi.tokushima.jp", +"mugi.tokushima.jp", +"nakagawa.tokushima.jp", +"naruto.tokushima.jp", +"sanagochi.tokushima.jp", +"shishikui.tokushima.jp", +"tokushima.tokushima.jp", +"wajiki.tokushima.jp", +"adachi.tokyo.jp", +"akiruno.tokyo.jp", +"akishima.tokyo.jp", +"aogashima.tokyo.jp", +"arakawa.tokyo.jp", +"bunkyo.tokyo.jp", +"chiyoda.tokyo.jp", +"chofu.tokyo.jp", +"chuo.tokyo.jp", +"edogawa.tokyo.jp", +"fuchu.tokyo.jp", +"fussa.tokyo.jp", +"hachijo.tokyo.jp", +"hachioji.tokyo.jp", +"hamura.tokyo.jp", +"higashikurume.tokyo.jp", +"higashimurayama.tokyo.jp", +"higashiyamato.tokyo.jp", +"hino.tokyo.jp", +"hinode.tokyo.jp", +"hinohara.tokyo.jp", +"inagi.tokyo.jp", +"itabashi.tokyo.jp", +"katsushika.tokyo.jp", +"kita.tokyo.jp", +"kiyose.tokyo.jp", +"kodaira.tokyo.jp", +"koganei.tokyo.jp", +"kokubunji.tokyo.jp", +"komae.tokyo.jp", +"koto.tokyo.jp", +"kouzushima.tokyo.jp", +"kunitachi.tokyo.jp", +"machida.tokyo.jp", +"meguro.tokyo.jp", +"minato.tokyo.jp", +"mitaka.tokyo.jp", +"mizuho.tokyo.jp", +"musashimurayama.tokyo.jp", +"musashino.tokyo.jp", +"nakano.tokyo.jp", +"nerima.tokyo.jp", +"ogasawara.tokyo.jp", +"okutama.tokyo.jp", +"ome.tokyo.jp", +"oshima.tokyo.jp", +"ota.tokyo.jp", +"setagaya.tokyo.jp", +"shibuya.tokyo.jp", +"shinagawa.tokyo.jp", +"shinjuku.tokyo.jp", +"suginami.tokyo.jp", +"sumida.tokyo.jp", +"tachikawa.tokyo.jp", +"taito.tokyo.jp", +"tama.tokyo.jp", +"toshima.tokyo.jp", +"chizu.tottori.jp", +"hino.tottori.jp", +"kawahara.tottori.jp", +"koge.tottori.jp", +"kotoura.tottori.jp", +"misasa.tottori.jp", +"nanbu.tottori.jp", +"nichinan.tottori.jp", +"sakaiminato.tottori.jp", +"tottori.tottori.jp", +"wakasa.tottori.jp", +"yazu.tottori.jp", +"yonago.tottori.jp", +"asahi.toyama.jp", +"fuchu.toyama.jp", +"fukumitsu.toyama.jp", +"funahashi.toyama.jp", +"himi.toyama.jp", +"imizu.toyama.jp", +"inami.toyama.jp", +"johana.toyama.jp", +"kamiichi.toyama.jp", +"kurobe.toyama.jp", +"nakaniikawa.toyama.jp", +"namerikawa.toyama.jp", +"nanto.toyama.jp", +"nyuzen.toyama.jp", +"oyabe.toyama.jp", +"taira.toyama.jp", +"takaoka.toyama.jp", +"tateyama.toyama.jp", +"toga.toyama.jp", +"tonami.toyama.jp", +"toyama.toyama.jp", +"unazuki.toyama.jp", +"uozu.toyama.jp", +"yamada.toyama.jp", +"arida.wakayama.jp", +"aridagawa.wakayama.jp", +"gobo.wakayama.jp", +"hashimoto.wakayama.jp", +"hidaka.wakayama.jp", +"hirogawa.wakayama.jp", +"inami.wakayama.jp", +"iwade.wakayama.jp", +"kainan.wakayama.jp", +"kamitonda.wakayama.jp", +"katsuragi.wakayama.jp", +"kimino.wakayama.jp", +"kinokawa.wakayama.jp", +"kitayama.wakayama.jp", +"koya.wakayama.jp", +"koza.wakayama.jp", +"kozagawa.wakayama.jp", +"kudoyama.wakayama.jp", +"kushimoto.wakayama.jp", +"mihama.wakayama.jp", +"misato.wakayama.jp", +"nachikatsuura.wakayama.jp", +"shingu.wakayama.jp", +"shirahama.wakayama.jp", +"taiji.wakayama.jp", +"tanabe.wakayama.jp", +"wakayama.wakayama.jp", +"yuasa.wakayama.jp", +"yura.wakayama.jp", +"asahi.yamagata.jp", +"funagata.yamagata.jp", +"higashine.yamagata.jp", +"iide.yamagata.jp", +"kahoku.yamagata.jp", +"kaminoyama.yamagata.jp", +"kaneyama.yamagata.jp", +"kawanishi.yamagata.jp", +"mamurogawa.yamagata.jp", +"mikawa.yamagata.jp", +"murayama.yamagata.jp", +"nagai.yamagata.jp", +"nakayama.yamagata.jp", +"nanyo.yamagata.jp", +"nishikawa.yamagata.jp", +"obanazawa.yamagata.jp", +"oe.yamagata.jp", +"oguni.yamagata.jp", +"ohkura.yamagata.jp", +"oishida.yamagata.jp", +"sagae.yamagata.jp", +"sakata.yamagata.jp", +"sakegawa.yamagata.jp", +"shinjo.yamagata.jp", +"shirataka.yamagata.jp", +"shonai.yamagata.jp", +"takahata.yamagata.jp", +"tendo.yamagata.jp", +"tozawa.yamagata.jp", +"tsuruoka.yamagata.jp", +"yamagata.yamagata.jp", +"yamanobe.yamagata.jp", +"yonezawa.yamagata.jp", +"yuza.yamagata.jp", +"abu.yamaguchi.jp", +"hagi.yamaguchi.jp", +"hikari.yamaguchi.jp", +"hofu.yamaguchi.jp", +"iwakuni.yamaguchi.jp", +"kudamatsu.yamaguchi.jp", +"mitou.yamaguchi.jp", +"nagato.yamaguchi.jp", +"oshima.yamaguchi.jp", +"shimonoseki.yamaguchi.jp", +"shunan.yamaguchi.jp", +"tabuse.yamaguchi.jp", +"tokuyama.yamaguchi.jp", +"toyota.yamaguchi.jp", +"ube.yamaguchi.jp", +"yuu.yamaguchi.jp", +"chuo.yamanashi.jp", +"doshi.yamanashi.jp", +"fuefuki.yamanashi.jp", +"fujikawa.yamanashi.jp", +"fujikawaguchiko.yamanashi.jp", +"fujiyoshida.yamanashi.jp", +"hayakawa.yamanashi.jp", +"hokuto.yamanashi.jp", +"ichikawamisato.yamanashi.jp", +"kai.yamanashi.jp", +"kofu.yamanashi.jp", +"koshu.yamanashi.jp", +"kosuge.yamanashi.jp", +"minami-alps.yamanashi.jp", +"minobu.yamanashi.jp", +"nakamichi.yamanashi.jp", +"nanbu.yamanashi.jp", +"narusawa.yamanashi.jp", +"nirasaki.yamanashi.jp", +"nishikatsura.yamanashi.jp", +"oshino.yamanashi.jp", +"otsuki.yamanashi.jp", +"showa.yamanashi.jp", +"tabayama.yamanashi.jp", +"tsuru.yamanashi.jp", +"uenohara.yamanashi.jp", +"yamanakako.yamanashi.jp", +"yamanashi.yamanashi.jp", +"ke", +"ac.ke", +"co.ke", +"go.ke", +"info.ke", +"me.ke", +"mobi.ke", +"ne.ke", +"or.ke", +"sc.ke", +"kg", +"org.kg", +"net.kg", +"com.kg", +"edu.kg", +"gov.kg", +"mil.kg", +"*.kh", +"ki", +"edu.ki", +"biz.ki", +"net.ki", +"org.ki", +"gov.ki", +"info.ki", +"com.ki", +"km", +"org.km", +"nom.km", +"gov.km", +"prd.km", +"tm.km", +"edu.km", +"mil.km", +"ass.km", +"com.km", +"coop.km", +"asso.km", +"presse.km", +"medecin.km", +"notaires.km", +"pharmaciens.km", +"veterinaire.km", +"gouv.km", +"kn", +"net.kn", +"org.kn", +"edu.kn", +"gov.kn", +"kp", +"com.kp", +"edu.kp", +"gov.kp", +"org.kp", +"rep.kp", +"tra.kp", +"kr", +"ac.kr", +"co.kr", +"es.kr", +"go.kr", +"hs.kr", +"kg.kr", +"mil.kr", +"ms.kr", +"ne.kr", +"or.kr", +"pe.kr", +"re.kr", +"sc.kr", +"busan.kr", +"chungbuk.kr", +"chungnam.kr", +"daegu.kr", +"daejeon.kr", +"gangwon.kr", +"gwangju.kr", +"gyeongbuk.kr", +"gyeonggi.kr", +"gyeongnam.kr", +"incheon.kr", +"jeju.kr", +"jeonbuk.kr", +"jeonnam.kr", +"seoul.kr", +"ulsan.kr", +"kw", +"com.kw", +"edu.kw", +"emb.kw", +"gov.kw", +"ind.kw", +"net.kw", +"org.kw", +"ky", +"edu.ky", +"gov.ky", +"com.ky", +"org.ky", +"net.ky", +"kz", +"org.kz", +"edu.kz", +"net.kz", +"gov.kz", +"mil.kz", +"com.kz", +"la", +"int.la", +"net.la", +"info.la", +"edu.la", +"gov.la", +"per.la", +"com.la", +"org.la", +"lb", +"com.lb", +"edu.lb", +"gov.lb", +"net.lb", +"org.lb", +"lc", +"com.lc", +"net.lc", +"co.lc", +"org.lc", +"edu.lc", +"gov.lc", +"li", +"lk", +"gov.lk", +"sch.lk", +"net.lk", +"int.lk", +"com.lk", +"org.lk", +"edu.lk", +"ngo.lk", +"soc.lk", +"web.lk", +"ltd.lk", +"assn.lk", +"grp.lk", +"hotel.lk", +"ac.lk", +"lr", +"com.lr", +"edu.lr", +"gov.lr", +"org.lr", +"net.lr", +"ls", +"ac.ls", +"biz.ls", +"co.ls", +"edu.ls", +"gov.ls", +"info.ls", +"net.ls", +"org.ls", +"sc.ls", +"lt", +"gov.lt", +"lu", +"lv", +"com.lv", +"edu.lv", +"gov.lv", +"org.lv", +"mil.lv", +"id.lv", +"net.lv", +"asn.lv", +"conf.lv", +"ly", +"com.ly", +"net.ly", +"gov.ly", +"plc.ly", +"edu.ly", +"sch.ly", +"med.ly", +"org.ly", +"id.ly", +"ma", +"co.ma", +"net.ma", +"gov.ma", +"org.ma", +"ac.ma", +"press.ma", +"mc", +"tm.mc", +"asso.mc", +"md", +"me", +"co.me", +"net.me", +"org.me", +"edu.me", +"ac.me", +"gov.me", +"its.me", +"priv.me", +"mg", +"org.mg", +"nom.mg", +"gov.mg", +"prd.mg", +"tm.mg", +"edu.mg", +"mil.mg", +"com.mg", +"co.mg", +"mh", +"mil", +"mk", +"com.mk", +"org.mk", +"net.mk", +"edu.mk", +"gov.mk", +"inf.mk", +"name.mk", +"ml", +"com.ml", +"edu.ml", +"gouv.ml", +"gov.ml", +"net.ml", +"org.ml", +"presse.ml", +"*.mm", +"mn", +"gov.mn", +"edu.mn", +"org.mn", +"mo", +"com.mo", +"net.mo", +"org.mo", +"edu.mo", +"gov.mo", +"mobi", +"mp", +"mq", +"mr", +"gov.mr", +"ms", +"com.ms", +"edu.ms", +"gov.ms", +"net.ms", +"org.ms", +"mt", +"com.mt", +"edu.mt", +"net.mt", +"org.mt", +"mu", +"com.mu", +"net.mu", +"org.mu", +"gov.mu", +"ac.mu", +"co.mu", +"or.mu", +"museum", +"academy.museum", +"agriculture.museum", +"air.museum", +"airguard.museum", +"alabama.museum", +"alaska.museum", +"amber.museum", +"ambulance.museum", +"american.museum", +"americana.museum", +"americanantiques.museum", +"americanart.museum", +"amsterdam.museum", +"and.museum", +"annefrank.museum", +"anthro.museum", +"anthropology.museum", +"antiques.museum", +"aquarium.museum", +"arboretum.museum", +"archaeological.museum", +"archaeology.museum", +"architecture.museum", +"art.museum", +"artanddesign.museum", +"artcenter.museum", +"artdeco.museum", +"arteducation.museum", +"artgallery.museum", +"arts.museum", +"artsandcrafts.museum", +"asmatart.museum", +"assassination.museum", +"assisi.museum", +"association.museum", +"astronomy.museum", +"atlanta.museum", +"austin.museum", +"australia.museum", +"automotive.museum", +"aviation.museum", +"axis.museum", +"badajoz.museum", +"baghdad.museum", +"bahn.museum", +"bale.museum", +"baltimore.museum", +"barcelona.museum", +"baseball.museum", +"basel.museum", +"baths.museum", +"bauern.museum", +"beauxarts.museum", +"beeldengeluid.museum", +"bellevue.museum", +"bergbau.museum", +"berkeley.museum", +"berlin.museum", +"bern.museum", +"bible.museum", +"bilbao.museum", +"bill.museum", +"birdart.museum", +"birthplace.museum", +"bonn.museum", +"boston.museum", +"botanical.museum", +"botanicalgarden.museum", +"botanicgarden.museum", +"botany.museum", +"brandywinevalley.museum", +"brasil.museum", +"bristol.museum", +"british.museum", +"britishcolumbia.museum", +"broadcast.museum", +"brunel.museum", +"brussel.museum", +"brussels.museum", +"bruxelles.museum", +"building.museum", +"burghof.museum", +"bus.museum", +"bushey.museum", +"cadaques.museum", +"california.museum", +"cambridge.museum", +"can.museum", +"canada.museum", +"capebreton.museum", +"carrier.museum", +"cartoonart.museum", +"casadelamoneda.museum", +"castle.museum", +"castres.museum", +"celtic.museum", +"center.museum", +"chattanooga.museum", +"cheltenham.museum", +"chesapeakebay.museum", +"chicago.museum", +"children.museum", +"childrens.museum", +"childrensgarden.museum", +"chiropractic.museum", +"chocolate.museum", +"christiansburg.museum", +"cincinnati.museum", +"cinema.museum", +"circus.museum", +"civilisation.museum", +"civilization.museum", +"civilwar.museum", +"clinton.museum", +"clock.museum", +"coal.museum", +"coastaldefence.museum", +"cody.museum", +"coldwar.museum", +"collection.museum", +"colonialwilliamsburg.museum", +"coloradoplateau.museum", +"columbia.museum", +"columbus.museum", +"communication.museum", +"communications.museum", +"community.museum", +"computer.museum", +"computerhistory.museum", +"comunicações.museum", +"contemporary.museum", +"contemporaryart.museum", +"convent.museum", +"copenhagen.museum", +"corporation.museum", +"correios-e-telecomunicações.museum", +"corvette.museum", +"costume.museum", +"countryestate.museum", +"county.museum", +"crafts.museum", +"cranbrook.museum", +"creation.museum", +"cultural.museum", +"culturalcenter.museum", +"culture.museum", +"cyber.museum", +"cymru.museum", +"dali.museum", +"dallas.museum", +"database.museum", +"ddr.museum", +"decorativearts.museum", +"delaware.museum", +"delmenhorst.museum", +"denmark.museum", +"depot.museum", +"design.museum", +"detroit.museum", +"dinosaur.museum", +"discovery.museum", +"dolls.museum", +"donostia.museum", +"durham.museum", +"eastafrica.museum", +"eastcoast.museum", +"education.museum", +"educational.museum", +"egyptian.museum", +"eisenbahn.museum", +"elburg.museum", +"elvendrell.museum", +"embroidery.museum", +"encyclopedic.museum", +"england.museum", +"entomology.museum", +"environment.museum", +"environmentalconservation.museum", +"epilepsy.museum", +"essex.museum", +"estate.museum", +"ethnology.museum", +"exeter.museum", +"exhibition.museum", +"family.museum", +"farm.museum", +"farmequipment.museum", +"farmers.museum", +"farmstead.museum", +"field.museum", +"figueres.museum", +"filatelia.museum", +"film.museum", +"fineart.museum", +"finearts.museum", +"finland.museum", +"flanders.museum", +"florida.museum", +"force.museum", +"fortmissoula.museum", +"fortworth.museum", +"foundation.museum", +"francaise.museum", +"frankfurt.museum", +"franziskaner.museum", +"freemasonry.museum", +"freiburg.museum", +"fribourg.museum", +"frog.museum", +"fundacio.museum", +"furniture.museum", +"gallery.museum", +"garden.museum", +"gateway.museum", +"geelvinck.museum", +"gemological.museum", +"geology.museum", +"georgia.museum", +"giessen.museum", +"glas.museum", +"glass.museum", +"gorge.museum", +"grandrapids.museum", +"graz.museum", +"guernsey.museum", +"halloffame.museum", +"hamburg.museum", +"handson.museum", +"harvestcelebration.museum", +"hawaii.museum", +"health.museum", +"heimatunduhren.museum", +"hellas.museum", +"helsinki.museum", +"hembygdsforbund.museum", +"heritage.museum", +"histoire.museum", +"historical.museum", +"historicalsociety.museum", +"historichouses.museum", +"historisch.museum", +"historisches.museum", +"history.museum", +"historyofscience.museum", +"horology.museum", +"house.museum", +"humanities.museum", +"illustration.museum", +"imageandsound.museum", +"indian.museum", +"indiana.museum", +"indianapolis.museum", +"indianmarket.museum", +"intelligence.museum", +"interactive.museum", +"iraq.museum", +"iron.museum", +"isleofman.museum", +"jamison.museum", +"jefferson.museum", +"jerusalem.museum", +"jewelry.museum", +"jewish.museum", +"jewishart.museum", +"jfk.museum", +"journalism.museum", +"judaica.museum", +"judygarland.museum", +"juedisches.museum", +"juif.museum", +"karate.museum", +"karikatur.museum", +"kids.museum", +"koebenhavn.museum", +"koeln.museum", +"kunst.museum", +"kunstsammlung.museum", +"kunstunddesign.museum", +"labor.museum", +"labour.museum", +"lajolla.museum", +"lancashire.museum", +"landes.museum", +"lans.museum", +"läns.museum", +"larsson.museum", +"lewismiller.museum", +"lincoln.museum", +"linz.museum", +"living.museum", +"livinghistory.museum", +"localhistory.museum", +"london.museum", +"losangeles.museum", +"louvre.museum", +"loyalist.museum", +"lucerne.museum", +"luxembourg.museum", +"luzern.museum", +"mad.museum", +"madrid.museum", +"mallorca.museum", +"manchester.museum", +"mansion.museum", +"mansions.museum", +"manx.museum", +"marburg.museum", +"maritime.museum", +"maritimo.museum", +"maryland.museum", +"marylhurst.museum", +"media.museum", +"medical.museum", +"medizinhistorisches.museum", +"meeres.museum", +"memorial.museum", +"mesaverde.museum", +"michigan.museum", +"midatlantic.museum", +"military.museum", +"mill.museum", +"miners.museum", +"mining.museum", +"minnesota.museum", +"missile.museum", +"missoula.museum", +"modern.museum", +"moma.museum", +"money.museum", +"monmouth.museum", +"monticello.museum", +"montreal.museum", +"moscow.museum", +"motorcycle.museum", +"muenchen.museum", +"muenster.museum", +"mulhouse.museum", +"muncie.museum", +"museet.museum", +"museumcenter.museum", +"museumvereniging.museum", +"music.museum", +"national.museum", +"nationalfirearms.museum", +"nationalheritage.museum", +"nativeamerican.museum", +"naturalhistory.museum", +"naturalhistorymuseum.museum", +"naturalsciences.museum", +"nature.museum", +"naturhistorisches.museum", +"natuurwetenschappen.museum", +"naumburg.museum", +"naval.museum", +"nebraska.museum", +"neues.museum", +"newhampshire.museum", +"newjersey.museum", +"newmexico.museum", +"newport.museum", +"newspaper.museum", +"newyork.museum", +"niepce.museum", +"norfolk.museum", +"north.museum", +"nrw.museum", +"nyc.museum", +"nyny.museum", +"oceanographic.museum", +"oceanographique.museum", +"omaha.museum", +"online.museum", +"ontario.museum", +"openair.museum", +"oregon.museum", +"oregontrail.museum", +"otago.museum", +"oxford.museum", +"pacific.museum", +"paderborn.museum", +"palace.museum", +"paleo.museum", +"palmsprings.museum", +"panama.museum", +"paris.museum", +"pasadena.museum", +"pharmacy.museum", +"philadelphia.museum", +"philadelphiaarea.museum", +"philately.museum", +"phoenix.museum", +"photography.museum", +"pilots.museum", +"pittsburgh.museum", +"planetarium.museum", +"plantation.museum", +"plants.museum", +"plaza.museum", +"portal.museum", +"portland.museum", +"portlligat.museum", +"posts-and-telecommunications.museum", +"preservation.museum", +"presidio.museum", +"press.museum", +"project.museum", +"public.museum", +"pubol.museum", +"quebec.museum", +"railroad.museum", +"railway.museum", +"research.museum", +"resistance.museum", +"riodejaneiro.museum", +"rochester.museum", +"rockart.museum", +"roma.museum", +"russia.museum", +"saintlouis.museum", +"salem.museum", +"salvadordali.museum", +"salzburg.museum", +"sandiego.museum", +"sanfrancisco.museum", +"santabarbara.museum", +"santacruz.museum", +"santafe.museum", +"saskatchewan.museum", +"satx.museum", +"savannahga.museum", +"schlesisches.museum", +"schoenbrunn.museum", +"schokoladen.museum", +"school.museum", +"schweiz.museum", +"science.museum", +"scienceandhistory.museum", +"scienceandindustry.museum", +"sciencecenter.museum", +"sciencecenters.museum", +"science-fiction.museum", +"sciencehistory.museum", +"sciences.museum", +"sciencesnaturelles.museum", +"scotland.museum", +"seaport.museum", +"settlement.museum", +"settlers.museum", +"shell.museum", +"sherbrooke.museum", +"sibenik.museum", +"silk.museum", +"ski.museum", +"skole.museum", +"society.museum", +"sologne.museum", +"soundandvision.museum", +"southcarolina.museum", +"southwest.museum", +"space.museum", +"spy.museum", +"square.museum", +"stadt.museum", +"stalbans.museum", +"starnberg.museum", +"state.museum", +"stateofdelaware.museum", +"station.museum", +"steam.museum", +"steiermark.museum", +"stjohn.museum", +"stockholm.museum", +"stpetersburg.museum", +"stuttgart.museum", +"suisse.museum", +"surgeonshall.museum", +"surrey.museum", +"svizzera.museum", +"sweden.museum", +"sydney.museum", +"tank.museum", +"tcm.museum", +"technology.museum", +"telekommunikation.museum", +"television.museum", +"texas.museum", +"textile.museum", +"theater.museum", +"time.museum", +"timekeeping.museum", +"topology.museum", +"torino.museum", +"touch.museum", +"town.museum", +"transport.museum", +"tree.museum", +"trolley.museum", +"trust.museum", +"trustee.museum", +"uhren.museum", +"ulm.museum", +"undersea.museum", +"university.museum", +"usa.museum", +"usantiques.museum", +"usarts.museum", +"uscountryestate.museum", +"usculture.museum", +"usdecorativearts.museum", +"usgarden.museum", +"ushistory.museum", +"ushuaia.museum", +"uslivinghistory.museum", +"utah.museum", +"uvic.museum", +"valley.museum", +"vantaa.museum", +"versailles.museum", +"viking.museum", +"village.museum", +"virginia.museum", +"virtual.museum", +"virtuel.museum", +"vlaanderen.museum", +"volkenkunde.museum", +"wales.museum", +"wallonie.museum", +"war.museum", +"washingtondc.museum", +"watchandclock.museum", +"watch-and-clock.museum", +"western.museum", +"westfalen.museum", +"whaling.museum", +"wildlife.museum", +"williamsburg.museum", +"windmill.museum", +"workshop.museum", +"york.museum", +"yorkshire.museum", +"yosemite.museum", +"youth.museum", +"zoological.museum", +"zoology.museum", +"ירושלים.museum", +"иком.museum", +"mv", +"aero.mv", +"biz.mv", +"com.mv", +"coop.mv", +"edu.mv", +"gov.mv", +"info.mv", +"int.mv", +"mil.mv", +"museum.mv", +"name.mv", +"net.mv", +"org.mv", +"pro.mv", +"mw", +"ac.mw", +"biz.mw", +"co.mw", +"com.mw", +"coop.mw", +"edu.mw", +"gov.mw", +"int.mw", +"museum.mw", +"net.mw", +"org.mw", +"mx", +"com.mx", +"org.mx", +"gob.mx", +"edu.mx", +"net.mx", +"my", +"com.my", +"net.my", +"org.my", +"gov.my", +"edu.my", +"mil.my", +"name.my", +"mz", +"ac.mz", +"adv.mz", +"co.mz", +"edu.mz", +"gov.mz", +"mil.mz", +"net.mz", +"org.mz", +"na", +"info.na", +"pro.na", +"name.na", +"school.na", +"or.na", +"dr.na", +"us.na", +"mx.na", +"ca.na", +"in.na", +"cc.na", +"tv.na", +"ws.na", +"mobi.na", +"co.na", +"com.na", +"org.na", +"name", +"nc", +"asso.nc", +"nom.nc", +"ne", +"net", +"nf", +"com.nf", +"net.nf", +"per.nf", +"rec.nf", +"web.nf", +"arts.nf", +"firm.nf", +"info.nf", +"other.nf", +"store.nf", +"ng", +"com.ng", +"edu.ng", +"gov.ng", +"i.ng", +"mil.ng", +"mobi.ng", +"name.ng", +"net.ng", +"org.ng", +"sch.ng", +"ni", +"ac.ni", +"biz.ni", +"co.ni", +"com.ni", +"edu.ni", +"gob.ni", +"in.ni", +"info.ni", +"int.ni", +"mil.ni", +"net.ni", +"nom.ni", +"org.ni", +"web.ni", +"nl", +"no", +"fhs.no", +"vgs.no", +"fylkesbibl.no", +"folkebibl.no", +"museum.no", +"idrett.no", +"priv.no", +"mil.no", +"stat.no", +"dep.no", +"kommune.no", +"herad.no", +"aa.no", +"ah.no", +"bu.no", +"fm.no", +"hl.no", +"hm.no", +"jan-mayen.no", +"mr.no", +"nl.no", +"nt.no", +"of.no", +"ol.no", +"oslo.no", +"rl.no", +"sf.no", +"st.no", +"svalbard.no", +"tm.no", +"tr.no", +"va.no", +"vf.no", +"gs.aa.no", +"gs.ah.no", +"gs.bu.no", +"gs.fm.no", +"gs.hl.no", +"gs.hm.no", +"gs.jan-mayen.no", +"gs.mr.no", +"gs.nl.no", +"gs.nt.no", +"gs.of.no", +"gs.ol.no", +"gs.oslo.no", +"gs.rl.no", +"gs.sf.no", +"gs.st.no", +"gs.svalbard.no", +"gs.tm.no", +"gs.tr.no", +"gs.va.no", +"gs.vf.no", +"akrehamn.no", +"åkrehamn.no", +"algard.no", +"ålgård.no", +"arna.no", +"brumunddal.no", +"bryne.no", +"bronnoysund.no", +"brønnøysund.no", +"drobak.no", +"drøbak.no", +"egersund.no", +"fetsund.no", +"floro.no", +"florø.no", +"fredrikstad.no", +"hokksund.no", +"honefoss.no", +"hønefoss.no", +"jessheim.no", +"jorpeland.no", +"jørpeland.no", +"kirkenes.no", +"kopervik.no", +"krokstadelva.no", +"langevag.no", +"langevåg.no", +"leirvik.no", +"mjondalen.no", +"mjøndalen.no", +"mo-i-rana.no", +"mosjoen.no", +"mosjøen.no", +"nesoddtangen.no", +"orkanger.no", +"osoyro.no", +"osøyro.no", +"raholt.no", +"råholt.no", +"sandnessjoen.no", +"sandnessjøen.no", +"skedsmokorset.no", +"slattum.no", +"spjelkavik.no", +"stathelle.no", +"stavern.no", +"stjordalshalsen.no", +"stjørdalshalsen.no", +"tananger.no", +"tranby.no", +"vossevangen.no", +"afjord.no", +"åfjord.no", +"agdenes.no", +"al.no", +"ål.no", +"alesund.no", +"ålesund.no", +"alstahaug.no", +"alta.no", +"áltá.no", +"alaheadju.no", +"álaheadju.no", +"alvdal.no", +"amli.no", +"åmli.no", +"amot.no", +"åmot.no", +"andebu.no", +"andoy.no", +"andøy.no", +"andasuolo.no", +"ardal.no", +"årdal.no", +"aremark.no", +"arendal.no", +"ås.no", +"aseral.no", +"åseral.no", +"asker.no", +"askim.no", +"askvoll.no", +"askoy.no", +"askøy.no", +"asnes.no", +"åsnes.no", +"audnedaln.no", +"aukra.no", +"aure.no", +"aurland.no", +"aurskog-holand.no", +"aurskog-høland.no", +"austevoll.no", +"austrheim.no", +"averoy.no", +"averøy.no", +"balestrand.no", +"ballangen.no", +"balat.no", +"bálát.no", +"balsfjord.no", +"bahccavuotna.no", +"báhccavuotna.no", +"bamble.no", +"bardu.no", +"beardu.no", +"beiarn.no", +"bajddar.no", +"bájddar.no", +"baidar.no", +"báidár.no", +"berg.no", +"bergen.no", +"berlevag.no", +"berlevåg.no", +"bearalvahki.no", +"bearalváhki.no", +"bindal.no", +"birkenes.no", +"bjarkoy.no", +"bjarkøy.no", +"bjerkreim.no", +"bjugn.no", +"bodo.no", +"bodø.no", +"badaddja.no", +"bådåddjå.no", +"budejju.no", +"bokn.no", +"bremanger.no", +"bronnoy.no", +"brønnøy.no", +"bygland.no", +"bykle.no", +"barum.no", +"bærum.no", +"bo.telemark.no", +"bø.telemark.no", +"bo.nordland.no", +"bø.nordland.no", +"bievat.no", +"bievát.no", +"bomlo.no", +"bømlo.no", +"batsfjord.no", +"båtsfjord.no", +"bahcavuotna.no", +"báhcavuotna.no", +"dovre.no", +"drammen.no", +"drangedal.no", +"dyroy.no", +"dyrøy.no", +"donna.no", +"dønna.no", +"eid.no", +"eidfjord.no", +"eidsberg.no", +"eidskog.no", +"eidsvoll.no", +"eigersund.no", +"elverum.no", +"enebakk.no", +"engerdal.no", +"etne.no", +"etnedal.no", +"evenes.no", +"evenassi.no", +"evenášši.no", +"evje-og-hornnes.no", +"farsund.no", +"fauske.no", +"fuossko.no", +"fuoisku.no", +"fedje.no", +"fet.no", +"finnoy.no", +"finnøy.no", +"fitjar.no", +"fjaler.no", +"fjell.no", +"flakstad.no", +"flatanger.no", +"flekkefjord.no", +"flesberg.no", +"flora.no", +"fla.no", +"flå.no", +"folldal.no", +"forsand.no", +"fosnes.no", +"frei.no", +"frogn.no", +"froland.no", +"frosta.no", +"frana.no", +"fræna.no", +"froya.no", +"frøya.no", +"fusa.no", +"fyresdal.no", +"forde.no", +"førde.no", +"gamvik.no", +"gangaviika.no", +"gáŋgaviika.no", +"gaular.no", +"gausdal.no", +"gildeskal.no", +"gildeskål.no", +"giske.no", +"gjemnes.no", +"gjerdrum.no", +"gjerstad.no", +"gjesdal.no", +"gjovik.no", +"gjøvik.no", +"gloppen.no", +"gol.no", +"gran.no", +"grane.no", +"granvin.no", +"gratangen.no", +"grimstad.no", +"grong.no", +"kraanghke.no", +"kråanghke.no", +"grue.no", +"gulen.no", +"hadsel.no", +"halden.no", +"halsa.no", +"hamar.no", +"hamaroy.no", +"habmer.no", +"hábmer.no", +"hapmir.no", +"hápmir.no", +"hammerfest.no", +"hammarfeasta.no", +"hámmárfeasta.no", +"haram.no", +"hareid.no", +"harstad.no", +"hasvik.no", +"aknoluokta.no", +"ákŋoluokta.no", +"hattfjelldal.no", +"aarborte.no", +"haugesund.no", +"hemne.no", +"hemnes.no", +"hemsedal.no", +"heroy.more-og-romsdal.no", +"herøy.møre-og-romsdal.no", +"heroy.nordland.no", +"herøy.nordland.no", +"hitra.no", +"hjartdal.no", +"hjelmeland.no", +"hobol.no", +"hobøl.no", +"hof.no", +"hol.no", +"hole.no", +"holmestrand.no", +"holtalen.no", +"holtålen.no", +"hornindal.no", +"horten.no", +"hurdal.no", +"hurum.no", +"hvaler.no", +"hyllestad.no", +"hagebostad.no", +"hægebostad.no", +"hoyanger.no", +"høyanger.no", +"hoylandet.no", +"høylandet.no", +"ha.no", +"hå.no", +"ibestad.no", +"inderoy.no", +"inderøy.no", +"iveland.no", +"jevnaker.no", +"jondal.no", +"jolster.no", +"jølster.no", +"karasjok.no", +"karasjohka.no", +"kárášjohka.no", +"karlsoy.no", +"galsa.no", +"gálsá.no", +"karmoy.no", +"karmøy.no", +"kautokeino.no", +"guovdageaidnu.no", +"klepp.no", +"klabu.no", +"klæbu.no", +"kongsberg.no", +"kongsvinger.no", +"kragero.no", +"kragerø.no", +"kristiansand.no", +"kristiansund.no", +"krodsherad.no", +"krødsherad.no", +"kvalsund.no", +"rahkkeravju.no", +"ráhkkerávju.no", +"kvam.no", +"kvinesdal.no", +"kvinnherad.no", +"kviteseid.no", +"kvitsoy.no", +"kvitsøy.no", +"kvafjord.no", +"kvæfjord.no", +"giehtavuoatna.no", +"kvanangen.no", +"kvænangen.no", +"navuotna.no", +"návuotna.no", +"kafjord.no", +"kåfjord.no", +"gaivuotna.no", +"gáivuotna.no", +"larvik.no", +"lavangen.no", +"lavagis.no", +"loabat.no", +"loabát.no", +"lebesby.no", +"davvesiida.no", +"leikanger.no", +"leirfjord.no", +"leka.no", +"leksvik.no", +"lenvik.no", +"leangaviika.no", +"leaŋgaviika.no", +"lesja.no", +"levanger.no", +"lier.no", +"lierne.no", +"lillehammer.no", +"lillesand.no", +"lindesnes.no", +"lindas.no", +"lindås.no", +"lom.no", +"loppa.no", +"lahppi.no", +"láhppi.no", +"lund.no", +"lunner.no", +"luroy.no", +"lurøy.no", +"luster.no", +"lyngdal.no", +"lyngen.no", +"ivgu.no", +"lardal.no", +"lerdal.no", +"lærdal.no", +"lodingen.no", +"lødingen.no", +"lorenskog.no", +"lørenskog.no", +"loten.no", +"løten.no", +"malvik.no", +"masoy.no", +"måsøy.no", +"muosat.no", +"muosát.no", +"mandal.no", +"marker.no", +"marnardal.no", +"masfjorden.no", +"meland.no", +"meldal.no", +"melhus.no", +"meloy.no", +"meløy.no", +"meraker.no", +"meråker.no", +"moareke.no", +"moåreke.no", +"midsund.no", +"midtre-gauldal.no", +"modalen.no", +"modum.no", +"molde.no", +"moskenes.no", +"moss.no", +"mosvik.no", +"malselv.no", +"målselv.no", +"malatvuopmi.no", +"málatvuopmi.no", +"namdalseid.no", +"aejrie.no", +"namsos.no", +"namsskogan.no", +"naamesjevuemie.no", +"nååmesjevuemie.no", +"laakesvuemie.no", +"nannestad.no", +"narvik.no", +"narviika.no", +"naustdal.no", +"nedre-eiker.no", +"nes.akershus.no", +"nes.buskerud.no", +"nesna.no", +"nesodden.no", +"nesseby.no", +"unjarga.no", +"unjárga.no", +"nesset.no", +"nissedal.no", +"nittedal.no", +"nord-aurdal.no", +"nord-fron.no", +"nord-odal.no", +"norddal.no", +"nordkapp.no", +"davvenjarga.no", +"davvenjárga.no", +"nordre-land.no", +"nordreisa.no", +"raisa.no", +"ráisa.no", +"nore-og-uvdal.no", +"notodden.no", +"naroy.no", +"nærøy.no", +"notteroy.no", +"nøtterøy.no", +"odda.no", +"oksnes.no", +"øksnes.no", +"oppdal.no", +"oppegard.no", +"oppegård.no", +"orkdal.no", +"orland.no", +"ørland.no", +"orskog.no", +"ørskog.no", +"orsta.no", +"ørsta.no", +"os.hedmark.no", +"os.hordaland.no", +"osen.no", +"osteroy.no", +"osterøy.no", +"ostre-toten.no", +"østre-toten.no", +"overhalla.no", +"ovre-eiker.no", +"øvre-eiker.no", +"oyer.no", +"øyer.no", +"oygarden.no", +"øygarden.no", +"oystre-slidre.no", +"øystre-slidre.no", +"porsanger.no", +"porsangu.no", +"porsáŋgu.no", +"porsgrunn.no", +"radoy.no", +"radøy.no", +"rakkestad.no", +"rana.no", +"ruovat.no", +"randaberg.no", +"rauma.no", +"rendalen.no", +"rennebu.no", +"rennesoy.no", +"rennesøy.no", +"rindal.no", +"ringebu.no", +"ringerike.no", +"ringsaker.no", +"rissa.no", +"risor.no", +"risør.no", +"roan.no", +"rollag.no", +"rygge.no", +"ralingen.no", +"rælingen.no", +"rodoy.no", +"rødøy.no", +"romskog.no", +"rømskog.no", +"roros.no", +"røros.no", +"rost.no", +"røst.no", +"royken.no", +"røyken.no", +"royrvik.no", +"røyrvik.no", +"rade.no", +"råde.no", +"salangen.no", +"siellak.no", +"saltdal.no", +"salat.no", +"sálát.no", +"sálat.no", +"samnanger.no", +"sande.more-og-romsdal.no", +"sande.møre-og-romsdal.no", +"sande.vestfold.no", +"sandefjord.no", +"sandnes.no", +"sandoy.no", +"sandøy.no", +"sarpsborg.no", +"sauda.no", +"sauherad.no", +"sel.no", +"selbu.no", +"selje.no", +"seljord.no", +"sigdal.no", +"siljan.no", +"sirdal.no", +"skaun.no", +"skedsmo.no", +"ski.no", +"skien.no", +"skiptvet.no", +"skjervoy.no", +"skjervøy.no", +"skierva.no", +"skiervá.no", +"skjak.no", +"skjåk.no", +"skodje.no", +"skanland.no", +"skånland.no", +"skanit.no", +"skánit.no", +"smola.no", +"smøla.no", +"snillfjord.no", +"snasa.no", +"snåsa.no", +"snoasa.no", +"snaase.no", +"snåase.no", +"sogndal.no", +"sokndal.no", +"sola.no", +"solund.no", +"songdalen.no", +"sortland.no", +"spydeberg.no", +"stange.no", +"stavanger.no", +"steigen.no", +"steinkjer.no", +"stjordal.no", +"stjørdal.no", +"stokke.no", +"stor-elvdal.no", +"stord.no", +"stordal.no", +"storfjord.no", +"omasvuotna.no", +"strand.no", +"stranda.no", +"stryn.no", +"sula.no", +"suldal.no", +"sund.no", +"sunndal.no", +"surnadal.no", +"sveio.no", +"svelvik.no", +"sykkylven.no", +"sogne.no", +"søgne.no", +"somna.no", +"sømna.no", +"sondre-land.no", +"søndre-land.no", +"sor-aurdal.no", +"sør-aurdal.no", +"sor-fron.no", +"sør-fron.no", +"sor-odal.no", +"sør-odal.no", +"sor-varanger.no", +"sør-varanger.no", +"matta-varjjat.no", +"mátta-várjjat.no", +"sorfold.no", +"sørfold.no", +"sorreisa.no", +"sørreisa.no", +"sorum.no", +"sørum.no", +"tana.no", +"deatnu.no", +"time.no", +"tingvoll.no", +"tinn.no", +"tjeldsund.no", +"dielddanuorri.no", +"tjome.no", +"tjøme.no", +"tokke.no", +"tolga.no", +"torsken.no", +"tranoy.no", +"tranøy.no", +"tromso.no", +"tromsø.no", +"tromsa.no", +"romsa.no", +"trondheim.no", +"troandin.no", +"trysil.no", +"trana.no", +"træna.no", +"trogstad.no", +"trøgstad.no", +"tvedestrand.no", +"tydal.no", +"tynset.no", +"tysfjord.no", +"divtasvuodna.no", +"divttasvuotna.no", +"tysnes.no", +"tysvar.no", +"tysvær.no", +"tonsberg.no", +"tønsberg.no", +"ullensaker.no", +"ullensvang.no", +"ulvik.no", +"utsira.no", +"vadso.no", +"vadsø.no", +"cahcesuolo.no", +"čáhcesuolo.no", +"vaksdal.no", +"valle.no", +"vang.no", +"vanylven.no", +"vardo.no", +"vardø.no", +"varggat.no", +"várggát.no", +"vefsn.no", +"vaapste.no", +"vega.no", +"vegarshei.no", +"vegårshei.no", +"vennesla.no", +"verdal.no", +"verran.no", +"vestby.no", +"vestnes.no", +"vestre-slidre.no", +"vestre-toten.no", +"vestvagoy.no", +"vestvågøy.no", +"vevelstad.no", +"vik.no", +"vikna.no", +"vindafjord.no", +"volda.no", +"voss.no", +"varoy.no", +"værøy.no", +"vagan.no", +"vågan.no", +"voagat.no", +"vagsoy.no", +"vågsøy.no", +"vaga.no", +"vågå.no", +"valer.ostfold.no", +"våler.østfold.no", +"valer.hedmark.no", +"våler.hedmark.no", +"*.np", +"nr", +"biz.nr", +"info.nr", +"gov.nr", +"edu.nr", +"org.nr", +"net.nr", +"com.nr", +"nu", +"nz", +"ac.nz", +"co.nz", +"cri.nz", +"geek.nz", +"gen.nz", +"govt.nz", +"health.nz", +"iwi.nz", +"kiwi.nz", +"maori.nz", +"mil.nz", +"māori.nz", +"net.nz", +"org.nz", +"parliament.nz", +"school.nz", +"om", +"co.om", +"com.om", +"edu.om", +"gov.om", +"med.om", +"museum.om", +"net.om", +"org.om", +"pro.om", +"onion", +"org", +"pa", +"ac.pa", +"gob.pa", +"com.pa", +"org.pa", +"sld.pa", +"edu.pa", +"net.pa", +"ing.pa", +"abo.pa", +"med.pa", +"nom.pa", +"pe", +"edu.pe", +"gob.pe", +"nom.pe", +"mil.pe", +"org.pe", +"com.pe", +"net.pe", +"pf", +"com.pf", +"org.pf", +"edu.pf", +"*.pg", +"ph", +"com.ph", +"net.ph", +"org.ph", +"gov.ph", +"edu.ph", +"ngo.ph", +"mil.ph", +"i.ph", +"pk", +"com.pk", +"net.pk", +"edu.pk", +"org.pk", +"fam.pk", +"biz.pk", +"web.pk", +"gov.pk", +"gob.pk", +"gok.pk", +"gon.pk", +"gop.pk", +"gos.pk", +"info.pk", +"pl", +"com.pl", +"net.pl", +"org.pl", +"aid.pl", +"agro.pl", +"atm.pl", +"auto.pl", +"biz.pl", +"edu.pl", +"gmina.pl", +"gsm.pl", +"info.pl", +"mail.pl", +"miasta.pl", +"media.pl", +"mil.pl", +"nieruchomosci.pl", +"nom.pl", +"pc.pl", +"powiat.pl", +"priv.pl", +"realestate.pl", +"rel.pl", +"sex.pl", +"shop.pl", +"sklep.pl", +"sos.pl", +"szkola.pl", +"targi.pl", +"tm.pl", +"tourism.pl", +"travel.pl", +"turystyka.pl", +"gov.pl", +"ap.gov.pl", +"ic.gov.pl", +"is.gov.pl", +"us.gov.pl", +"kmpsp.gov.pl", +"kppsp.gov.pl", +"kwpsp.gov.pl", +"psp.gov.pl", +"wskr.gov.pl", +"kwp.gov.pl", +"mw.gov.pl", +"ug.gov.pl", +"um.gov.pl", +"umig.gov.pl", +"ugim.gov.pl", +"upow.gov.pl", +"uw.gov.pl", +"starostwo.gov.pl", +"pa.gov.pl", +"po.gov.pl", +"psse.gov.pl", +"pup.gov.pl", +"rzgw.gov.pl", +"sa.gov.pl", +"so.gov.pl", +"sr.gov.pl", +"wsa.gov.pl", +"sko.gov.pl", +"uzs.gov.pl", +"wiih.gov.pl", +"winb.gov.pl", +"pinb.gov.pl", +"wios.gov.pl", +"witd.gov.pl", +"wzmiuw.gov.pl", +"piw.gov.pl", +"wiw.gov.pl", +"griw.gov.pl", +"wif.gov.pl", +"oum.gov.pl", +"sdn.gov.pl", +"zp.gov.pl", +"uppo.gov.pl", +"mup.gov.pl", +"wuoz.gov.pl", +"konsulat.gov.pl", +"oirm.gov.pl", +"augustow.pl", +"babia-gora.pl", +"bedzin.pl", +"beskidy.pl", +"bialowieza.pl", +"bialystok.pl", +"bielawa.pl", +"bieszczady.pl", +"boleslawiec.pl", +"bydgoszcz.pl", +"bytom.pl", +"cieszyn.pl", +"czeladz.pl", +"czest.pl", +"dlugoleka.pl", +"elblag.pl", +"elk.pl", +"glogow.pl", +"gniezno.pl", +"gorlice.pl", +"grajewo.pl", +"ilawa.pl", +"jaworzno.pl", +"jelenia-gora.pl", +"jgora.pl", +"kalisz.pl", +"kazimierz-dolny.pl", +"karpacz.pl", +"kartuzy.pl", +"kaszuby.pl", +"katowice.pl", +"kepno.pl", +"ketrzyn.pl", +"klodzko.pl", +"kobierzyce.pl", +"kolobrzeg.pl", +"konin.pl", +"konskowola.pl", +"kutno.pl", +"lapy.pl", +"lebork.pl", +"legnica.pl", +"lezajsk.pl", +"limanowa.pl", +"lomza.pl", +"lowicz.pl", +"lubin.pl", +"lukow.pl", +"malbork.pl", +"malopolska.pl", +"mazowsze.pl", +"mazury.pl", +"mielec.pl", +"mielno.pl", +"mragowo.pl", +"naklo.pl", +"nowaruda.pl", +"nysa.pl", +"olawa.pl", +"olecko.pl", +"olkusz.pl", +"olsztyn.pl", +"opoczno.pl", +"opole.pl", +"ostroda.pl", +"ostroleka.pl", +"ostrowiec.pl", +"ostrowwlkp.pl", +"pila.pl", +"pisz.pl", +"podhale.pl", +"podlasie.pl", +"polkowice.pl", +"pomorze.pl", +"pomorskie.pl", +"prochowice.pl", +"pruszkow.pl", +"przeworsk.pl", +"pulawy.pl", +"radom.pl", +"rawa-maz.pl", +"rybnik.pl", +"rzeszow.pl", +"sanok.pl", +"sejny.pl", +"slask.pl", +"slupsk.pl", +"sosnowiec.pl", +"stalowa-wola.pl", +"skoczow.pl", +"starachowice.pl", +"stargard.pl", +"suwalki.pl", +"swidnica.pl", +"swiebodzin.pl", +"swinoujscie.pl", +"szczecin.pl", +"szczytno.pl", +"tarnobrzeg.pl", +"tgory.pl", +"turek.pl", +"tychy.pl", +"ustka.pl", +"walbrzych.pl", +"warmia.pl", +"warszawa.pl", +"waw.pl", +"wegrow.pl", +"wielun.pl", +"wlocl.pl", +"wloclawek.pl", +"wodzislaw.pl", +"wolomin.pl", +"wroclaw.pl", +"zachpomor.pl", +"zagan.pl", +"zarow.pl", +"zgora.pl", +"zgorzelec.pl", +"pm", +"pn", +"gov.pn", +"co.pn", +"org.pn", +"edu.pn", +"net.pn", +"post", +"pr", +"com.pr", +"net.pr", +"org.pr", +"gov.pr", +"edu.pr", +"isla.pr", +"pro.pr", +"biz.pr", +"info.pr", +"name.pr", +"est.pr", +"prof.pr", +"ac.pr", +"pro", +"aaa.pro", +"aca.pro", +"acct.pro", +"avocat.pro", +"bar.pro", +"cpa.pro", +"eng.pro", +"jur.pro", +"law.pro", +"med.pro", +"recht.pro", +"ps", +"edu.ps", +"gov.ps", +"sec.ps", +"plo.ps", +"com.ps", +"org.ps", +"net.ps", +"pt", +"net.pt", +"gov.pt", +"org.pt", +"edu.pt", +"int.pt", +"publ.pt", +"com.pt", +"nome.pt", +"pw", +"co.pw", +"ne.pw", +"or.pw", +"ed.pw", +"go.pw", +"belau.pw", +"py", +"com.py", +"coop.py", +"edu.py", +"gov.py", +"mil.py", +"net.py", +"org.py", +"qa", +"com.qa", +"edu.qa", +"gov.qa", +"mil.qa", +"name.qa", +"net.qa", +"org.qa", +"sch.qa", +"re", +"asso.re", +"com.re", +"nom.re", +"ro", +"arts.ro", +"com.ro", +"firm.ro", +"info.ro", +"nom.ro", +"nt.ro", +"org.ro", +"rec.ro", +"store.ro", +"tm.ro", +"www.ro", +"rs", +"ac.rs", +"co.rs", +"edu.rs", +"gov.rs", +"in.rs", +"org.rs", +"ru", +"rw", +"ac.rw", +"co.rw", +"coop.rw", +"gov.rw", +"mil.rw", +"net.rw", +"org.rw", +"sa", +"com.sa", +"net.sa", +"org.sa", +"gov.sa", +"med.sa", +"pub.sa", +"edu.sa", +"sch.sa", +"sb", +"com.sb", +"edu.sb", +"gov.sb", +"net.sb", +"org.sb", +"sc", +"com.sc", +"gov.sc", +"net.sc", +"org.sc", +"edu.sc", +"sd", +"com.sd", +"net.sd", +"org.sd", +"edu.sd", +"med.sd", +"tv.sd", +"gov.sd", +"info.sd", +"se", +"a.se", +"ac.se", +"b.se", +"bd.se", +"brand.se", +"c.se", +"d.se", +"e.se", +"f.se", +"fh.se", +"fhsk.se", +"fhv.se", +"g.se", +"h.se", +"i.se", +"k.se", +"komforb.se", +"kommunalforbund.se", +"komvux.se", +"l.se", +"lanbib.se", +"m.se", +"n.se", +"naturbruksgymn.se", +"o.se", +"org.se", +"p.se", +"parti.se", +"pp.se", +"press.se", +"r.se", +"s.se", +"t.se", +"tm.se", +"u.se", +"w.se", +"x.se", +"y.se", +"z.se", +"sg", +"com.sg", +"net.sg", +"org.sg", +"gov.sg", +"edu.sg", +"per.sg", +"sh", +"com.sh", +"net.sh", +"gov.sh", +"org.sh", +"mil.sh", +"si", +"sj", +"sk", +"sl", +"com.sl", +"net.sl", +"edu.sl", +"gov.sl", +"org.sl", +"sm", +"sn", +"art.sn", +"com.sn", +"edu.sn", +"gouv.sn", +"org.sn", +"perso.sn", +"univ.sn", +"so", +"com.so", +"edu.so", +"gov.so", +"me.so", +"net.so", +"org.so", +"sr", +"ss", +"biz.ss", +"com.ss", +"edu.ss", +"gov.ss", +"net.ss", +"org.ss", +"st", +"co.st", +"com.st", +"consulado.st", +"edu.st", +"embaixada.st", +"gov.st", +"mil.st", +"net.st", +"org.st", +"principe.st", +"saotome.st", +"store.st", +"su", +"sv", +"com.sv", +"edu.sv", +"gob.sv", +"org.sv", +"red.sv", +"sx", +"gov.sx", +"sy", +"edu.sy", +"gov.sy", +"net.sy", +"mil.sy", +"com.sy", +"org.sy", +"sz", +"co.sz", +"ac.sz", +"org.sz", +"tc", +"td", +"tel", +"tf", +"tg", +"th", +"ac.th", +"co.th", +"go.th", +"in.th", +"mi.th", +"net.th", +"or.th", +"tj", +"ac.tj", +"biz.tj", +"co.tj", +"com.tj", +"edu.tj", +"go.tj", +"gov.tj", +"int.tj", +"mil.tj", +"name.tj", +"net.tj", +"nic.tj", +"org.tj", +"test.tj", +"web.tj", +"tk", +"tl", +"gov.tl", +"tm", +"com.tm", +"co.tm", +"org.tm", +"net.tm", +"nom.tm", +"gov.tm", +"mil.tm", +"edu.tm", +"tn", +"com.tn", +"ens.tn", +"fin.tn", +"gov.tn", +"ind.tn", +"intl.tn", +"nat.tn", +"net.tn", +"org.tn", +"info.tn", +"perso.tn", +"tourism.tn", +"edunet.tn", +"rnrt.tn", +"rns.tn", +"rnu.tn", +"mincom.tn", +"agrinet.tn", +"defense.tn", +"turen.tn", +"to", +"com.to", +"gov.to", +"net.to", +"org.to", +"edu.to", +"mil.to", +"tr", +"av.tr", +"bbs.tr", +"bel.tr", +"biz.tr", +"com.tr", +"dr.tr", +"edu.tr", +"gen.tr", +"gov.tr", +"info.tr", +"mil.tr", +"k12.tr", +"kep.tr", +"name.tr", +"net.tr", +"org.tr", +"pol.tr", +"tel.tr", +"tsk.tr", +"tv.tr", +"web.tr", +"nc.tr", +"gov.nc.tr", +"tt", +"co.tt", +"com.tt", +"org.tt", +"net.tt", +"biz.tt", +"info.tt", +"pro.tt", +"int.tt", +"coop.tt", +"jobs.tt", +"mobi.tt", +"travel.tt", +"museum.tt", +"aero.tt", +"name.tt", +"gov.tt", +"edu.tt", +"tv", +"tw", +"edu.tw", +"gov.tw", +"mil.tw", +"com.tw", +"net.tw", +"org.tw", +"idv.tw", +"game.tw", +"ebiz.tw", +"club.tw", +"網路.tw", +"組織.tw", +"商業.tw", +"tz", +"ac.tz", +"co.tz", +"go.tz", +"hotel.tz", +"info.tz", +"me.tz", +"mil.tz", +"mobi.tz", +"ne.tz", +"or.tz", +"sc.tz", +"tv.tz", +"ua", +"com.ua", +"edu.ua", +"gov.ua", +"in.ua", +"net.ua", +"org.ua", +"cherkassy.ua", +"cherkasy.ua", +"chernigov.ua", +"chernihiv.ua", +"chernivtsi.ua", +"chernovtsy.ua", +"ck.ua", +"cn.ua", +"cr.ua", +"crimea.ua", +"cv.ua", +"dn.ua", +"dnepropetrovsk.ua", +"dnipropetrovsk.ua", +"dominic.ua", +"donetsk.ua", +"dp.ua", +"if.ua", +"ivano-frankivsk.ua", +"kh.ua", +"kharkiv.ua", +"kharkov.ua", +"kherson.ua", +"khmelnitskiy.ua", +"khmelnytskyi.ua", +"kiev.ua", +"kirovograd.ua", +"km.ua", +"kr.ua", +"krym.ua", +"ks.ua", +"kv.ua", +"kyiv.ua", +"lg.ua", +"lt.ua", +"lugansk.ua", +"lutsk.ua", +"lv.ua", +"lviv.ua", +"mk.ua", +"mykolaiv.ua", +"nikolaev.ua", +"od.ua", +"odesa.ua", +"odessa.ua", +"pl.ua", +"poltava.ua", +"rivne.ua", +"rovno.ua", +"rv.ua", +"sb.ua", +"sebastopol.ua", +"sevastopol.ua", +"sm.ua", +"sumy.ua", +"te.ua", +"ternopil.ua", +"uz.ua", +"uzhgorod.ua", +"vinnica.ua", +"vinnytsia.ua", +"vn.ua", +"volyn.ua", +"yalta.ua", +"zaporizhzhe.ua", +"zaporizhzhia.ua", +"zhitomir.ua", +"zhytomyr.ua", +"zp.ua", +"zt.ua", +"ug", +"co.ug", +"or.ug", +"ac.ug", +"sc.ug", +"go.ug", +"ne.ug", +"com.ug", +"org.ug", +"uk", +"ac.uk", +"co.uk", +"gov.uk", +"ltd.uk", +"me.uk", +"net.uk", +"nhs.uk", +"org.uk", +"plc.uk", +"police.uk", +"*.sch.uk", +"us", +"dni.us", +"fed.us", +"isa.us", +"kids.us", +"nsn.us", +"ak.us", +"al.us", +"ar.us", +"as.us", +"az.us", +"ca.us", +"co.us", +"ct.us", +"dc.us", +"de.us", +"fl.us", +"ga.us", +"gu.us", +"hi.us", +"ia.us", +"id.us", +"il.us", +"in.us", +"ks.us", +"ky.us", +"la.us", +"ma.us", +"md.us", +"me.us", +"mi.us", +"mn.us", +"mo.us", +"ms.us", +"mt.us", +"nc.us", +"nd.us", +"ne.us", +"nh.us", +"nj.us", +"nm.us", +"nv.us", +"ny.us", +"oh.us", +"ok.us", +"or.us", +"pa.us", +"pr.us", +"ri.us", +"sc.us", +"sd.us", +"tn.us", +"tx.us", +"ut.us", +"vi.us", +"vt.us", +"va.us", +"wa.us", +"wi.us", +"wv.us", +"wy.us", +"k12.ak.us", +"k12.al.us", +"k12.ar.us", +"k12.as.us", +"k12.az.us", +"k12.ca.us", +"k12.co.us", +"k12.ct.us", +"k12.dc.us", +"k12.de.us", +"k12.fl.us", +"k12.ga.us", +"k12.gu.us", +"k12.ia.us", +"k12.id.us", +"k12.il.us", +"k12.in.us", +"k12.ks.us", +"k12.ky.us", +"k12.la.us", +"k12.ma.us", +"k12.md.us", +"k12.me.us", +"k12.mi.us", +"k12.mn.us", +"k12.mo.us", +"k12.ms.us", +"k12.mt.us", +"k12.nc.us", +"k12.ne.us", +"k12.nh.us", +"k12.nj.us", +"k12.nm.us", +"k12.nv.us", +"k12.ny.us", +"k12.oh.us", +"k12.ok.us", +"k12.or.us", +"k12.pa.us", +"k12.pr.us", +"k12.ri.us", +"k12.sc.us", +"k12.tn.us", +"k12.tx.us", +"k12.ut.us", +"k12.vi.us", +"k12.vt.us", +"k12.va.us", +"k12.wa.us", +"k12.wi.us", +"k12.wy.us", +"cc.ak.us", +"cc.al.us", +"cc.ar.us", +"cc.as.us", +"cc.az.us", +"cc.ca.us", +"cc.co.us", +"cc.ct.us", +"cc.dc.us", +"cc.de.us", +"cc.fl.us", +"cc.ga.us", +"cc.gu.us", +"cc.hi.us", +"cc.ia.us", +"cc.id.us", +"cc.il.us", +"cc.in.us", +"cc.ks.us", +"cc.ky.us", +"cc.la.us", +"cc.ma.us", +"cc.md.us", +"cc.me.us", +"cc.mi.us", +"cc.mn.us", +"cc.mo.us", +"cc.ms.us", +"cc.mt.us", +"cc.nc.us", +"cc.nd.us", +"cc.ne.us", +"cc.nh.us", +"cc.nj.us", +"cc.nm.us", +"cc.nv.us", +"cc.ny.us", +"cc.oh.us", +"cc.ok.us", +"cc.or.us", +"cc.pa.us", +"cc.pr.us", +"cc.ri.us", +"cc.sc.us", +"cc.sd.us", +"cc.tn.us", +"cc.tx.us", +"cc.ut.us", +"cc.vi.us", +"cc.vt.us", +"cc.va.us", +"cc.wa.us", +"cc.wi.us", +"cc.wv.us", +"cc.wy.us", +"lib.ak.us", +"lib.al.us", +"lib.ar.us", +"lib.as.us", +"lib.az.us", +"lib.ca.us", +"lib.co.us", +"lib.ct.us", +"lib.dc.us", +"lib.fl.us", +"lib.ga.us", +"lib.gu.us", +"lib.hi.us", +"lib.ia.us", +"lib.id.us", +"lib.il.us", +"lib.in.us", +"lib.ks.us", +"lib.ky.us", +"lib.la.us", +"lib.ma.us", +"lib.md.us", +"lib.me.us", +"lib.mi.us", +"lib.mn.us", +"lib.mo.us", +"lib.ms.us", +"lib.mt.us", +"lib.nc.us", +"lib.nd.us", +"lib.ne.us", +"lib.nh.us", +"lib.nj.us", +"lib.nm.us", +"lib.nv.us", +"lib.ny.us", +"lib.oh.us", +"lib.ok.us", +"lib.or.us", +"lib.pa.us", +"lib.pr.us", +"lib.ri.us", +"lib.sc.us", +"lib.sd.us", +"lib.tn.us", +"lib.tx.us", +"lib.ut.us", +"lib.vi.us", +"lib.vt.us", +"lib.va.us", +"lib.wa.us", +"lib.wi.us", +"lib.wy.us", +"pvt.k12.ma.us", +"chtr.k12.ma.us", +"paroch.k12.ma.us", +"ann-arbor.mi.us", +"cog.mi.us", +"dst.mi.us", +"eaton.mi.us", +"gen.mi.us", +"mus.mi.us", +"tec.mi.us", +"washtenaw.mi.us", +"uy", +"com.uy", +"edu.uy", +"gub.uy", +"mil.uy", +"net.uy", +"org.uy", +"uz", +"co.uz", +"com.uz", +"net.uz", +"org.uz", +"va", +"vc", +"com.vc", +"net.vc", +"org.vc", +"gov.vc", +"mil.vc", +"edu.vc", +"ve", +"arts.ve", +"co.ve", +"com.ve", +"e12.ve", +"edu.ve", +"firm.ve", +"gob.ve", +"gov.ve", +"info.ve", +"int.ve", +"mil.ve", +"net.ve", +"org.ve", +"rec.ve", +"store.ve", +"tec.ve", +"web.ve", +"vg", +"vi", +"co.vi", +"com.vi", +"k12.vi", +"net.vi", +"org.vi", +"vn", +"com.vn", +"net.vn", +"org.vn", +"edu.vn", +"gov.vn", +"int.vn", +"ac.vn", +"biz.vn", +"info.vn", +"name.vn", +"pro.vn", +"health.vn", +"vu", +"com.vu", +"edu.vu", +"net.vu", +"org.vu", +"wf", +"ws", +"com.ws", +"net.ws", +"org.ws", +"gov.ws", +"edu.ws", +"yt", +"امارات", +"հայ", +"বাংলা", +"бг", +"бел", +"中国", +"中國", +"الجزائر", +"مصر", +"ею", +"موريتانيا", +"გე", +"ελ", +"香港", +"公司.香港", +"教育.香港", +"政府.香港", +"個人.香港", +"網絡.香港", +"組織.香港", +"ಭಾರತ", +"ଭାରତ", +"ভাৰত", +"भारतम्", +"भारोत", +"ڀارت", +"ഭാരതം", +"भारत", +"بارت", +"بھارت", +"భారత్", +"ભારત", +"ਭਾਰਤ", +"ভারত", +"இந்தியா", +"ایران", +"ايران", +"عراق", +"الاردن", +"한국", +"қаз", +"ලංකා", +"இலங்கை", +"المغرب", +"мкд", +"мон", +"澳門", +"澳门", +"مليسيا", +"عمان", +"پاکستان", +"پاكستان", +"فلسطين", +"срб", +"пр.срб", +"орг.срб", +"обр.срб", +"од.срб", +"упр.срб", +"ак.срб", +"рф", +"قطر", +"السعودية", +"السعودیة", +"السعودیۃ", +"السعوديه", +"سودان", +"新加坡", +"சிங்கப்பூர்", +"سورية", +"سوريا", +"ไทย", +"ศึกษา.ไทย", +"ธุรกิจ.ไทย", +"รัฐบาล.ไทย", +"ทหาร.ไทย", +"เน็ต.ไทย", +"องค์กร.ไทย", +"تونس", +"台灣", +"台湾", +"臺灣", +"укр", +"اليمن", +"xxx", +"*.ye", +"ac.za", +"agric.za", +"alt.za", +"co.za", +"edu.za", +"gov.za", +"grondar.za", +"law.za", +"mil.za", +"net.za", +"ngo.za", +"nic.za", +"nis.za", +"nom.za", +"org.za", +"school.za", +"tm.za", +"web.za", +"zm", +"ac.zm", +"biz.zm", +"co.zm", +"com.zm", +"edu.zm", +"gov.zm", +"info.zm", +"mil.zm", +"net.zm", +"org.zm", +"sch.zm", +"zw", +"ac.zw", +"co.zw", +"gov.zw", +"mil.zw", +"org.zw", +"aaa", +"aarp", +"abarth", +"abb", +"abbott", +"abbvie", +"abc", +"able", +"abogado", +"abudhabi", +"academy", +"accenture", +"accountant", +"accountants", +"aco", +"actor", +"adac", +"ads", +"adult", +"aeg", +"aetna", +"afamilycompany", +"afl", +"africa", +"agakhan", +"agency", +"aig", +"aigo", +"airbus", +"airforce", +"airtel", +"akdn", +"alfaromeo", +"alibaba", +"alipay", +"allfinanz", +"allstate", +"ally", +"alsace", +"alstom", +"amazon", +"americanexpress", +"americanfamily", +"amex", +"amfam", +"amica", +"amsterdam", +"analytics", +"android", +"anquan", +"anz", +"aol", +"apartments", +"app", +"apple", +"aquarelle", +"arab", +"aramco", +"archi", +"army", +"art", +"arte", +"asda", +"associates", +"athleta", +"attorney", +"auction", +"audi", +"audible", +"audio", +"auspost", +"author", +"auto", +"autos", +"avianca", +"aws", +"axa", +"azure", +"baby", +"baidu", +"banamex", +"bananarepublic", +"band", +"bank", +"bar", +"barcelona", +"barclaycard", +"barclays", +"barefoot", +"bargains", +"baseball", +"basketball", +"bauhaus", +"bayern", +"bbc", +"bbt", +"bbva", +"bcg", +"bcn", +"beats", +"beauty", +"beer", +"bentley", +"berlin", +"best", +"bestbuy", +"bet", +"bharti", +"bible", +"bid", +"bike", +"bing", +"bingo", +"bio", +"black", +"blackfriday", +"blockbuster", +"blog", +"bloomberg", +"blue", +"bms", +"bmw", +"bnpparibas", +"boats", +"boehringer", +"bofa", +"bom", +"bond", +"boo", +"book", +"booking", +"bosch", +"bostik", +"boston", +"bot", +"boutique", +"box", +"bradesco", +"bridgestone", +"broadway", +"broker", +"brother", +"brussels", +"budapest", +"bugatti", +"build", +"builders", +"business", +"buy", +"buzz", +"bzh", +"cab", +"cafe", +"cal", +"call", +"calvinklein", +"cam", +"camera", +"camp", +"cancerresearch", +"canon", +"capetown", +"capital", +"capitalone", +"car", +"caravan", +"cards", +"care", +"career", +"careers", +"cars", +"casa", +"case", +"caseih", +"cash", +"casino", +"catering", +"catholic", +"cba", +"cbn", +"cbre", +"cbs", +"ceb", +"center", +"ceo", +"cern", +"cfa", +"cfd", +"chanel", +"channel", +"charity", +"chase", +"chat", +"cheap", +"chintai", +"christmas", +"chrome", +"church", +"cipriani", +"circle", +"cisco", +"citadel", +"citi", +"citic", +"city", +"cityeats", +"claims", +"cleaning", +"click", +"clinic", +"clinique", +"clothing", +"cloud", +"club", +"clubmed", +"coach", +"codes", +"coffee", +"college", +"cologne", +"comcast", +"commbank", +"community", +"company", +"compare", +"computer", +"comsec", +"condos", +"construction", +"consulting", +"contact", +"contractors", +"cooking", +"cookingchannel", +"cool", +"corsica", +"country", +"coupon", +"coupons", +"courses", +"cpa", +"credit", +"creditcard", +"creditunion", +"cricket", +"crown", +"crs", +"cruise", +"cruises", +"csc", +"cuisinella", +"cymru", +"cyou", +"dabur", +"dad", +"dance", +"data", +"date", +"dating", +"datsun", +"day", +"dclk", +"dds", +"deal", +"dealer", +"deals", +"degree", +"delivery", +"dell", +"deloitte", +"delta", +"democrat", +"dental", +"dentist", +"desi", +"design", +"dev", +"dhl", +"diamonds", +"diet", +"digital", +"direct", +"directory", +"discount", +"discover", +"dish", +"diy", +"dnp", +"docs", +"doctor", +"dog", +"domains", +"dot", +"download", +"drive", +"dtv", +"dubai", +"duck", +"dunlop", +"dupont", +"durban", +"dvag", +"dvr", +"earth", +"eat", +"eco", +"edeka", +"education", +"email", +"emerck", +"energy", +"engineer", +"engineering", +"enterprises", +"epson", +"equipment", +"ericsson", +"erni", +"esq", +"estate", +"esurance", +"etisalat", +"eurovision", +"eus", +"events", +"exchange", +"expert", +"exposed", +"express", +"extraspace", +"fage", +"fail", +"fairwinds", +"faith", +"family", +"fan", +"fans", +"farm", +"farmers", +"fashion", +"fast", +"fedex", +"feedback", +"ferrari", +"ferrero", +"fiat", +"fidelity", +"fido", +"film", +"final", +"finance", +"financial", +"fire", +"firestone", +"firmdale", +"fish", +"fishing", +"fit", +"fitness", +"flickr", +"flights", +"flir", +"florist", +"flowers", +"fly", +"foo", +"food", +"foodnetwork", +"football", +"ford", +"forex", +"forsale", +"forum", +"foundation", +"fox", +"free", +"fresenius", +"frl", +"frogans", +"frontdoor", +"frontier", +"ftr", +"fujitsu", +"fujixerox", +"fun", +"fund", +"furniture", +"futbol", +"fyi", +"gal", +"gallery", +"gallo", +"gallup", +"game", +"games", +"gap", +"garden", +"gay", +"gbiz", +"gdn", +"gea", +"gent", +"genting", +"george", +"ggee", +"gift", +"gifts", +"gives", +"giving", +"glade", +"glass", +"gle", +"global", +"globo", +"gmail", +"gmbh", +"gmo", +"gmx", +"godaddy", +"gold", +"goldpoint", +"golf", +"goo", +"goodyear", +"goog", +"google", +"gop", +"got", +"grainger", +"graphics", +"gratis", +"green", +"gripe", +"grocery", +"group", +"guardian", +"gucci", +"guge", +"guide", +"guitars", +"guru", +"hair", +"hamburg", +"hangout", +"haus", +"hbo", +"hdfc", +"hdfcbank", +"health", +"healthcare", +"help", +"helsinki", +"here", +"hermes", +"hgtv", +"hiphop", +"hisamitsu", +"hitachi", +"hiv", +"hkt", +"hockey", +"holdings", +"holiday", +"homedepot", +"homegoods", +"homes", +"homesense", +"honda", +"horse", +"hospital", +"host", +"hosting", +"hot", +"hoteles", +"hotels", +"hotmail", +"house", +"how", +"hsbc", +"hughes", +"hyatt", +"hyundai", +"ibm", +"icbc", +"ice", +"icu", +"ieee", +"ifm", +"ikano", +"imamat", +"imdb", +"immo", +"immobilien", +"inc", +"industries", +"infiniti", +"ing", +"ink", +"institute", +"insurance", +"insure", +"intel", +"international", +"intuit", +"investments", +"ipiranga", +"irish", +"ismaili", +"ist", +"istanbul", +"itau", +"itv", +"iveco", +"jaguar", +"java", +"jcb", +"jcp", +"jeep", +"jetzt", +"jewelry", +"jio", +"jll", +"jmp", +"jnj", +"joburg", +"jot", +"joy", +"jpmorgan", +"jprs", +"juegos", +"juniper", +"kaufen", +"kddi", +"kerryhotels", +"kerrylogistics", +"kerryproperties", +"kfh", +"kia", +"kim", +"kinder", +"kindle", +"kitchen", +"kiwi", +"koeln", +"komatsu", +"kosher", +"kpmg", +"kpn", +"krd", +"kred", +"kuokgroup", +"kyoto", +"lacaixa", +"lamborghini", +"lamer", +"lancaster", +"lancia", +"land", +"landrover", +"lanxess", +"lasalle", +"lat", +"latino", +"latrobe", +"law", +"lawyer", +"lds", +"lease", +"leclerc", +"lefrak", +"legal", +"lego", +"lexus", +"lgbt", +"liaison", +"lidl", +"life", +"lifeinsurance", +"lifestyle", +"lighting", +"like", +"lilly", +"limited", +"limo", +"lincoln", +"linde", +"link", +"lipsy", +"live", +"living", +"lixil", +"llc", +"llp", +"loan", +"loans", +"locker", +"locus", +"loft", +"lol", +"london", +"lotte", +"lotto", +"love", +"lpl", +"lplfinancial", +"ltd", +"ltda", +"lundbeck", +"lupin", +"luxe", +"luxury", +"macys", +"madrid", +"maif", +"maison", +"makeup", +"man", +"management", +"mango", +"map", +"market", +"marketing", +"markets", +"marriott", +"marshalls", +"maserati", +"mattel", +"mba", +"mckinsey", +"med", +"media", +"meet", +"melbourne", +"meme", +"memorial", +"men", +"menu", +"merckmsd", +"metlife", +"miami", +"microsoft", +"mini", +"mint", +"mit", +"mitsubishi", +"mlb", +"mls", +"mma", +"mobile", +"moda", +"moe", +"moi", +"mom", +"monash", +"money", +"monster", +"mormon", +"mortgage", +"moscow", +"moto", +"motorcycles", +"mov", +"movie", +"msd", +"mtn", +"mtr", +"mutual", +"nab", +"nadex", +"nagoya", +"nationwide", +"natura", +"navy", +"nba", +"nec", +"netbank", +"netflix", +"network", +"neustar", +"new", +"newholland", +"news", +"next", +"nextdirect", +"nexus", +"nfl", +"ngo", +"nhk", +"nico", +"nike", +"nikon", +"ninja", +"nissan", +"nissay", +"nokia", +"northwesternmutual", +"norton", +"now", +"nowruz", +"nowtv", +"nra", +"nrw", +"ntt", +"nyc", +"obi", +"observer", +"off", +"office", +"okinawa", +"olayan", +"olayangroup", +"oldnavy", +"ollo", +"omega", +"one", +"ong", +"onl", +"online", +"onyourside", +"ooo", +"open", +"oracle", +"orange", +"organic", +"origins", +"osaka", +"otsuka", +"ott", +"ovh", +"page", +"panasonic", +"paris", +"pars", +"partners", +"parts", +"party", +"passagens", +"pay", +"pccw", +"pet", +"pfizer", +"pharmacy", +"phd", +"philips", +"phone", +"photo", +"photography", +"photos", +"physio", +"pics", +"pictet", +"pictures", +"pid", +"pin", +"ping", +"pink", +"pioneer", +"pizza", +"place", +"play", +"playstation", +"plumbing", +"plus", +"pnc", +"pohl", +"poker", +"politie", +"porn", +"pramerica", +"praxi", +"press", +"prime", +"prod", +"productions", +"prof", +"progressive", +"promo", +"properties", +"property", +"protection", +"pru", +"prudential", +"pub", +"pwc", +"qpon", +"quebec", +"quest", +"qvc", +"racing", +"radio", +"raid", +"read", +"realestate", +"realtor", +"realty", +"recipes", +"red", +"redstone", +"redumbrella", +"rehab", +"reise", +"reisen", +"reit", +"reliance", +"ren", +"rent", +"rentals", +"repair", +"report", +"republican", +"rest", +"restaurant", +"review", +"reviews", +"rexroth", +"rich", +"richardli", +"ricoh", +"rightathome", +"ril", +"rio", +"rip", +"rmit", +"rocher", +"rocks", +"rodeo", +"rogers", +"room", +"rsvp", +"rugby", +"ruhr", +"run", +"rwe", +"ryukyu", +"saarland", +"safe", +"safety", +"sakura", +"sale", +"salon", +"samsclub", +"samsung", +"sandvik", +"sandvikcoromant", +"sanofi", +"sap", +"sarl", +"sas", +"save", +"saxo", +"sbi", +"sbs", +"sca", +"scb", +"schaeffler", +"schmidt", +"scholarships", +"school", +"schule", +"schwarz", +"science", +"scjohnson", +"scor", +"scot", +"search", +"seat", +"secure", +"security", +"seek", +"select", +"sener", +"services", +"ses", +"seven", +"sew", +"sex", +"sexy", +"sfr", +"shangrila", +"sharp", +"shaw", +"shell", +"shia", +"shiksha", +"shoes", +"shop", +"shopping", +"shouji", +"show", +"showtime", +"shriram", +"silk", +"sina", +"singles", +"site", +"ski", +"skin", +"sky", +"skype", +"sling", +"smart", +"smile", +"sncf", +"soccer", +"social", +"softbank", +"software", +"sohu", +"solar", +"solutions", +"song", +"sony", +"soy", +"spa", +"space", +"sport", +"spot", +"spreadbetting", +"srl", +"stada", +"staples", +"star", +"statebank", +"statefarm", +"stc", +"stcgroup", +"stockholm", +"storage", +"store", +"stream", +"studio", +"study", +"style", +"sucks", +"supplies", +"supply", +"support", +"surf", +"surgery", +"suzuki", +"swatch", +"swiftcover", +"swiss", +"sydney", +"symantec", +"systems", +"tab", +"taipei", +"talk", +"taobao", +"target", +"tatamotors", +"tatar", +"tattoo", +"tax", +"taxi", +"tci", +"tdk", +"team", +"tech", +"technology", +"temasek", +"tennis", +"teva", +"thd", +"theater", +"theatre", +"tiaa", +"tickets", +"tienda", +"tiffany", +"tips", +"tires", +"tirol", +"tjmaxx", +"tjx", +"tkmaxx", +"tmall", +"today", +"tokyo", +"tools", +"top", +"toray", +"toshiba", +"total", +"tours", +"town", +"toyota", +"toys", +"trade", +"trading", +"training", +"travel", +"travelchannel", +"travelers", +"travelersinsurance", +"trust", +"trv", +"tube", +"tui", +"tunes", +"tushu", +"tvs", +"ubank", +"ubs", +"unicom", +"university", +"uno", +"uol", +"ups", +"vacations", +"vana", +"vanguard", +"vegas", +"ventures", +"verisign", +"versicherung", +"vet", +"viajes", +"video", +"vig", +"viking", +"villas", +"vin", +"vip", +"virgin", +"visa", +"vision", +"vistaprint", +"viva", +"vivo", +"vlaanderen", +"vodka", +"volkswagen", +"volvo", +"vote", +"voting", +"voto", +"voyage", +"vuelos", +"wales", +"walmart", +"walter", +"wang", +"wanggou", +"watch", +"watches", +"weather", +"weatherchannel", +"webcam", +"weber", +"website", +"wed", +"wedding", +"weibo", +"weir", +"whoswho", +"wien", +"wiki", +"williamhill", +"win", +"windows", +"wine", +"winners", +"wme", +"wolterskluwer", +"woodside", +"work", +"works", +"world", +"wow", +"wtc", +"wtf", +"xbox", +"xerox", +"xfinity", +"xihuan", +"xin", +"कॉम", +"セール", +"佛山", +"慈善", +"集团", +"在线", +"大众汽车", +"点看", +"คอม", +"八卦", +"موقع", +"公益", +"公司", +"香格里拉", +"网站", +"移动", +"我爱你", +"москва", +"католик", +"онлайн", +"сайт", +"联通", +"קום", +"时尚", +"微博", +"淡马锡", +"ファッション", +"орг", +"नेट", +"ストア", +"アマゾン", +"삼성", +"商标", +"商店", +"商城", +"дети", +"ポイント", +"新闻", +"工行", +"家電", +"كوم", +"中文网", +"中信", +"娱乐", +"谷歌", +"電訊盈科", +"购物", +"クラウド", +"通販", +"网店", +"संगठन", +"餐厅", +"网络", +"ком", +"亚马逊", +"诺基亚", +"食品", +"飞利浦", +"手表", +"手机", +"ارامكو", +"العليان", +"اتصالات", +"بازار", +"ابوظبي", +"كاثوليك", +"همراه", +"닷컴", +"政府", +"شبكة", +"بيتك", +"عرب", +"机构", +"组织机构", +"健康", +"招聘", +"рус", +"珠宝", +"大拿", +"みんな", +"グーグル", +"世界", +"書籍", +"网址", +"닷넷", +"コム", +"天主教", +"游戏", +"vermögensberater", +"vermögensberatung", +"企业", +"信息", +"嘉里大酒店", +"嘉里", +"广东", +"政务", +"xyz", +"yachts", +"yahoo", +"yamaxun", +"yandex", +"yodobashi", +"yoga", +"yokohama", +"you", +"youtube", +"yun", +"zappos", +"zara", +"zero", +"zip", +"zone", +"zuerich", +"cc.ua", +"inf.ua", +"ltd.ua", +"adobeaemcloud.com", +"adobeaemcloud.net", +"*.dev.adobeaemcloud.com", +"beep.pl", +"barsy.ca", +"*.compute.estate", +"*.alces.network", +"altervista.org", +"alwaysdata.net", +"cloudfront.net", +"*.compute.amazonaws.com", +"*.compute-1.amazonaws.com", +"*.compute.amazonaws.com.cn", +"us-east-1.amazonaws.com", +"cn-north-1.eb.amazonaws.com.cn", +"cn-northwest-1.eb.amazonaws.com.cn", +"elasticbeanstalk.com", +"ap-northeast-1.elasticbeanstalk.com", +"ap-northeast-2.elasticbeanstalk.com", +"ap-northeast-3.elasticbeanstalk.com", +"ap-south-1.elasticbeanstalk.com", +"ap-southeast-1.elasticbeanstalk.com", +"ap-southeast-2.elasticbeanstalk.com", +"ca-central-1.elasticbeanstalk.com", +"eu-central-1.elasticbeanstalk.com", +"eu-west-1.elasticbeanstalk.com", +"eu-west-2.elasticbeanstalk.com", +"eu-west-3.elasticbeanstalk.com", +"sa-east-1.elasticbeanstalk.com", +"us-east-1.elasticbeanstalk.com", +"us-east-2.elasticbeanstalk.com", +"us-gov-west-1.elasticbeanstalk.com", +"us-west-1.elasticbeanstalk.com", +"us-west-2.elasticbeanstalk.com", +"*.elb.amazonaws.com", +"*.elb.amazonaws.com.cn", +"s3.amazonaws.com", +"s3-ap-northeast-1.amazonaws.com", +"s3-ap-northeast-2.amazonaws.com", +"s3-ap-south-1.amazonaws.com", +"s3-ap-southeast-1.amazonaws.com", +"s3-ap-southeast-2.amazonaws.com", +"s3-ca-central-1.amazonaws.com", +"s3-eu-central-1.amazonaws.com", +"s3-eu-west-1.amazonaws.com", +"s3-eu-west-2.amazonaws.com", +"s3-eu-west-3.amazonaws.com", +"s3-external-1.amazonaws.com", +"s3-fips-us-gov-west-1.amazonaws.com", +"s3-sa-east-1.amazonaws.com", +"s3-us-gov-west-1.amazonaws.com", +"s3-us-east-2.amazonaws.com", +"s3-us-west-1.amazonaws.com", +"s3-us-west-2.amazonaws.com", +"s3.ap-northeast-2.amazonaws.com", +"s3.ap-south-1.amazonaws.com", +"s3.cn-north-1.amazonaws.com.cn", +"s3.ca-central-1.amazonaws.com", +"s3.eu-central-1.amazonaws.com", +"s3.eu-west-2.amazonaws.com", +"s3.eu-west-3.amazonaws.com", +"s3.us-east-2.amazonaws.com", +"s3.dualstack.ap-northeast-1.amazonaws.com", +"s3.dualstack.ap-northeast-2.amazonaws.com", +"s3.dualstack.ap-south-1.amazonaws.com", +"s3.dualstack.ap-southeast-1.amazonaws.com", +"s3.dualstack.ap-southeast-2.amazonaws.com", +"s3.dualstack.ca-central-1.amazonaws.com", +"s3.dualstack.eu-central-1.amazonaws.com", +"s3.dualstack.eu-west-1.amazonaws.com", +"s3.dualstack.eu-west-2.amazonaws.com", +"s3.dualstack.eu-west-3.amazonaws.com", +"s3.dualstack.sa-east-1.amazonaws.com", +"s3.dualstack.us-east-1.amazonaws.com", +"s3.dualstack.us-east-2.amazonaws.com", +"s3-website-us-east-1.amazonaws.com", +"s3-website-us-west-1.amazonaws.com", +"s3-website-us-west-2.amazonaws.com", +"s3-website-ap-northeast-1.amazonaws.com", +"s3-website-ap-southeast-1.amazonaws.com", +"s3-website-ap-southeast-2.amazonaws.com", +"s3-website-eu-west-1.amazonaws.com", +"s3-website-sa-east-1.amazonaws.com", +"s3-website.ap-northeast-2.amazonaws.com", +"s3-website.ap-south-1.amazonaws.com", +"s3-website.ca-central-1.amazonaws.com", +"s3-website.eu-central-1.amazonaws.com", +"s3-website.eu-west-2.amazonaws.com", +"s3-website.eu-west-3.amazonaws.com", +"s3-website.us-east-2.amazonaws.com", +"amsw.nl", +"t3l3p0rt.net", +"tele.amune.org", +"apigee.io", +"on-aptible.com", +"user.aseinet.ne.jp", +"gv.vc", +"d.gv.vc", +"user.party.eus", +"pimienta.org", +"poivron.org", +"potager.org", +"sweetpepper.org", +"myasustor.com", +"myfritz.net", +"*.awdev.ca", +"*.advisor.ws", +"b-data.io", +"backplaneapp.io", +"balena-devices.com", +"app.banzaicloud.io", +"betainabox.com", +"bnr.la", +"blackbaudcdn.net", +"boomla.net", +"boxfuse.io", +"square7.ch", +"bplaced.com", +"bplaced.de", +"square7.de", +"bplaced.net", +"square7.net", +"browsersafetymark.io", +"uk0.bigv.io", +"dh.bytemark.co.uk", +"vm.bytemark.co.uk", +"mycd.eu", +"carrd.co", +"crd.co", +"uwu.ai", +"ae.org", +"ar.com", +"br.com", +"cn.com", +"com.de", +"com.se", +"de.com", +"eu.com", +"gb.com", +"gb.net", +"hu.com", +"hu.net", +"jp.net", +"jpn.com", +"kr.com", +"mex.com", +"no.com", +"qc.com", +"ru.com", +"sa.com", +"se.net", +"uk.com", +"uk.net", +"us.com", +"uy.com", +"za.bz", +"za.com", +"africa.com", +"gr.com", +"in.net", +"us.org", +"co.com", +"c.la", +"certmgr.org", +"xenapponazure.com", +"discourse.group", +"virtueeldomein.nl", +"cleverapps.io", +"*.lcl.dev", +"*.stg.dev", +"c66.me", +"cloud66.ws", +"cloud66.zone", +"jdevcloud.com", +"wpdevcloud.com", +"cloudaccess.host", +"freesite.host", +"cloudaccess.net", +"cloudcontrolled.com", +"cloudcontrolapp.com", +"cloudera.site", +"trycloudflare.com", +"workers.dev", +"wnext.app", +"co.ca", +"*.otap.co", +"co.cz", +"c.cdn77.org", +"cdn77-ssl.net", +"r.cdn77.net", +"rsc.cdn77.org", +"ssl.origin.cdn77-secure.org", +"cloudns.asia", +"cloudns.biz", +"cloudns.club", +"cloudns.cc", +"cloudns.eu", +"cloudns.in", +"cloudns.info", +"cloudns.org", +"cloudns.pro", +"cloudns.pw", +"cloudns.us", +"cloudeity.net", +"cnpy.gdn", +"co.nl", +"co.no", +"webhosting.be", +"hosting-cluster.nl", +"ac.ru", +"edu.ru", +"gov.ru", +"int.ru", +"mil.ru", +"test.ru", +"dyn.cosidns.de", +"dynamisches-dns.de", +"dnsupdater.de", +"internet-dns.de", +"l-o-g-i-n.de", +"dynamic-dns.info", +"feste-ip.net", +"knx-server.net", +"static-access.net", +"realm.cz", +"*.cryptonomic.net", +"cupcake.is", +"*.customer-oci.com", +"*.oci.customer-oci.com", +"*.ocp.customer-oci.com", +"*.ocs.customer-oci.com", +"cyon.link", +"cyon.site", +"daplie.me", +"localhost.daplie.me", +"dattolocal.com", +"dattorelay.com", +"dattoweb.com", +"mydatto.com", +"dattolocal.net", +"mydatto.net", +"biz.dk", +"co.dk", +"firm.dk", +"reg.dk", +"store.dk", +"*.dapps.earth", +"*.bzz.dapps.earth", +"builtwithdark.com", +"edgestack.me", +"debian.net", +"dedyn.io", +"dnshome.de", +"online.th", +"shop.th", +"drayddns.com", +"dreamhosters.com", +"mydrobo.com", +"drud.io", +"drud.us", +"duckdns.org", +"dy.fi", +"tunk.org", +"dyndns-at-home.com", +"dyndns-at-work.com", +"dyndns-blog.com", +"dyndns-free.com", +"dyndns-home.com", +"dyndns-ip.com", +"dyndns-mail.com", +"dyndns-office.com", +"dyndns-pics.com", +"dyndns-remote.com", +"dyndns-server.com", +"dyndns-web.com", +"dyndns-wiki.com", +"dyndns-work.com", +"dyndns.biz", +"dyndns.info", +"dyndns.org", +"dyndns.tv", +"at-band-camp.net", +"ath.cx", +"barrel-of-knowledge.info", +"barrell-of-knowledge.info", +"better-than.tv", +"blogdns.com", +"blogdns.net", +"blogdns.org", +"blogsite.org", +"boldlygoingnowhere.org", +"broke-it.net", +"buyshouses.net", +"cechire.com", +"dnsalias.com", +"dnsalias.net", +"dnsalias.org", +"dnsdojo.com", +"dnsdojo.net", +"dnsdojo.org", +"does-it.net", +"doesntexist.com", +"doesntexist.org", +"dontexist.com", +"dontexist.net", +"dontexist.org", +"doomdns.com", +"doomdns.org", +"dvrdns.org", +"dyn-o-saur.com", +"dynalias.com", +"dynalias.net", +"dynalias.org", +"dynathome.net", +"dyndns.ws", +"endofinternet.net", +"endofinternet.org", +"endoftheinternet.org", +"est-a-la-maison.com", +"est-a-la-masion.com", +"est-le-patron.com", +"est-mon-blogueur.com", +"for-better.biz", +"for-more.biz", +"for-our.info", +"for-some.biz", +"for-the.biz", +"forgot.her.name", +"forgot.his.name", +"from-ak.com", +"from-al.com", +"from-ar.com", +"from-az.net", +"from-ca.com", +"from-co.net", +"from-ct.com", +"from-dc.com", +"from-de.com", +"from-fl.com", +"from-ga.com", +"from-hi.com", +"from-ia.com", +"from-id.com", +"from-il.com", +"from-in.com", +"from-ks.com", +"from-ky.com", +"from-la.net", +"from-ma.com", +"from-md.com", +"from-me.org", +"from-mi.com", +"from-mn.com", +"from-mo.com", +"from-ms.com", +"from-mt.com", +"from-nc.com", +"from-nd.com", +"from-ne.com", +"from-nh.com", +"from-nj.com", +"from-nm.com", +"from-nv.com", +"from-ny.net", +"from-oh.com", +"from-ok.com", +"from-or.com", +"from-pa.com", +"from-pr.com", +"from-ri.com", +"from-sc.com", +"from-sd.com", +"from-tn.com", +"from-tx.com", +"from-ut.com", +"from-va.com", +"from-vt.com", +"from-wa.com", +"from-wi.com", +"from-wv.com", +"from-wy.com", +"ftpaccess.cc", +"fuettertdasnetz.de", +"game-host.org", +"game-server.cc", +"getmyip.com", +"gets-it.net", +"go.dyndns.org", +"gotdns.com", +"gotdns.org", +"groks-the.info", +"groks-this.info", +"ham-radio-op.net", +"here-for-more.info", +"hobby-site.com", +"hobby-site.org", +"home.dyndns.org", +"homedns.org", +"homeftp.net", +"homeftp.org", +"homeip.net", +"homelinux.com", +"homelinux.net", +"homelinux.org", +"homeunix.com", +"homeunix.net", +"homeunix.org", +"iamallama.com", +"in-the-band.net", +"is-a-anarchist.com", +"is-a-blogger.com", +"is-a-bookkeeper.com", +"is-a-bruinsfan.org", +"is-a-bulls-fan.com", +"is-a-candidate.org", +"is-a-caterer.com", +"is-a-celticsfan.org", +"is-a-chef.com", +"is-a-chef.net", +"is-a-chef.org", +"is-a-conservative.com", +"is-a-cpa.com", +"is-a-cubicle-slave.com", +"is-a-democrat.com", +"is-a-designer.com", +"is-a-doctor.com", +"is-a-financialadvisor.com", +"is-a-geek.com", +"is-a-geek.net", +"is-a-geek.org", +"is-a-green.com", +"is-a-guru.com", +"is-a-hard-worker.com", +"is-a-hunter.com", +"is-a-knight.org", +"is-a-landscaper.com", +"is-a-lawyer.com", +"is-a-liberal.com", +"is-a-libertarian.com", +"is-a-linux-user.org", +"is-a-llama.com", +"is-a-musician.com", +"is-a-nascarfan.com", +"is-a-nurse.com", +"is-a-painter.com", +"is-a-patsfan.org", +"is-a-personaltrainer.com", +"is-a-photographer.com", +"is-a-player.com", +"is-a-republican.com", +"is-a-rockstar.com", +"is-a-socialist.com", +"is-a-soxfan.org", +"is-a-student.com", +"is-a-teacher.com", +"is-a-techie.com", +"is-a-therapist.com", +"is-an-accountant.com", +"is-an-actor.com", +"is-an-actress.com", +"is-an-anarchist.com", +"is-an-artist.com", +"is-an-engineer.com", +"is-an-entertainer.com", +"is-by.us", +"is-certified.com", +"is-found.org", +"is-gone.com", +"is-into-anime.com", +"is-into-cars.com", +"is-into-cartoons.com", +"is-into-games.com", +"is-leet.com", +"is-lost.org", +"is-not-certified.com", +"is-saved.org", +"is-slick.com", +"is-uberleet.com", +"is-very-bad.org", +"is-very-evil.org", +"is-very-good.org", +"is-very-nice.org", +"is-very-sweet.org", +"is-with-theband.com", +"isa-geek.com", +"isa-geek.net", +"isa-geek.org", +"isa-hockeynut.com", +"issmarterthanyou.com", +"isteingeek.de", +"istmein.de", +"kicks-ass.net", +"kicks-ass.org", +"knowsitall.info", +"land-4-sale.us", +"lebtimnetz.de", +"leitungsen.de", +"likes-pie.com", +"likescandy.com", +"merseine.nu", +"mine.nu", +"misconfused.org", +"mypets.ws", +"myphotos.cc", +"neat-url.com", +"office-on-the.net", +"on-the-web.tv", +"podzone.net", +"podzone.org", +"readmyblog.org", +"saves-the-whales.com", +"scrapper-site.net", +"scrapping.cc", +"selfip.biz", +"selfip.com", +"selfip.info", +"selfip.net", +"selfip.org", +"sells-for-less.com", +"sells-for-u.com", +"sells-it.net", +"sellsyourhome.org", +"servebbs.com", +"servebbs.net", +"servebbs.org", +"serveftp.net", +"serveftp.org", +"servegame.org", +"shacknet.nu", +"simple-url.com", +"space-to-rent.com", +"stuff-4-sale.org", +"stuff-4-sale.us", +"teaches-yoga.com", +"thruhere.net", +"traeumtgerade.de", +"webhop.biz", +"webhop.info", +"webhop.net", +"webhop.org", +"worse-than.tv", +"writesthisblog.com", +"ddnss.de", +"dyn.ddnss.de", +"dyndns.ddnss.de", +"dyndns1.de", +"dyn-ip24.de", +"home-webserver.de", +"dyn.home-webserver.de", +"myhome-server.de", +"ddnss.org", +"definima.net", +"definima.io", +"bci.dnstrace.pro", +"ddnsfree.com", +"ddnsgeek.com", +"giize.com", +"gleeze.com", +"kozow.com", +"loseyourip.com", +"ooguy.com", +"theworkpc.com", +"casacam.net", +"dynu.net", +"accesscam.org", +"camdvr.org", +"freeddns.org", +"mywire.org", +"webredirect.org", +"myddns.rocks", +"blogsite.xyz", +"dynv6.net", +"e4.cz", +"en-root.fr", +"mytuleap.com", +"onred.one", +"staging.onred.one", +"enonic.io", +"customer.enonic.io", +"eu.org", +"al.eu.org", +"asso.eu.org", +"at.eu.org", +"au.eu.org", +"be.eu.org", +"bg.eu.org", +"ca.eu.org", +"cd.eu.org", +"ch.eu.org", +"cn.eu.org", +"cy.eu.org", +"cz.eu.org", +"de.eu.org", +"dk.eu.org", +"edu.eu.org", +"ee.eu.org", +"es.eu.org", +"fi.eu.org", +"fr.eu.org", +"gr.eu.org", +"hr.eu.org", +"hu.eu.org", +"ie.eu.org", +"il.eu.org", +"in.eu.org", +"int.eu.org", +"is.eu.org", +"it.eu.org", +"jp.eu.org", +"kr.eu.org", +"lt.eu.org", +"lu.eu.org", +"lv.eu.org", +"mc.eu.org", +"me.eu.org", +"mk.eu.org", +"mt.eu.org", +"my.eu.org", +"net.eu.org", +"ng.eu.org", +"nl.eu.org", +"no.eu.org", +"nz.eu.org", +"paris.eu.org", +"pl.eu.org", +"pt.eu.org", +"q-a.eu.org", +"ro.eu.org", +"ru.eu.org", +"se.eu.org", +"si.eu.org", +"sk.eu.org", +"tr.eu.org", +"uk.eu.org", +"us.eu.org", +"eu-1.evennode.com", +"eu-2.evennode.com", +"eu-3.evennode.com", +"eu-4.evennode.com", +"us-1.evennode.com", +"us-2.evennode.com", +"us-3.evennode.com", +"us-4.evennode.com", +"twmail.cc", +"twmail.net", +"twmail.org", +"mymailer.com.tw", +"url.tw", +"apps.fbsbx.com", +"ru.net", +"adygeya.ru", +"bashkiria.ru", +"bir.ru", +"cbg.ru", +"com.ru", +"dagestan.ru", +"grozny.ru", +"kalmykia.ru", +"kustanai.ru", +"marine.ru", +"mordovia.ru", +"msk.ru", +"mytis.ru", +"nalchik.ru", +"nov.ru", +"pyatigorsk.ru", +"spb.ru", +"vladikavkaz.ru", +"vladimir.ru", +"abkhazia.su", +"adygeya.su", +"aktyubinsk.su", +"arkhangelsk.su", +"armenia.su", +"ashgabad.su", +"azerbaijan.su", +"balashov.su", +"bashkiria.su", +"bryansk.su", +"bukhara.su", +"chimkent.su", +"dagestan.su", +"east-kazakhstan.su", +"exnet.su", +"georgia.su", +"grozny.su", +"ivanovo.su", +"jambyl.su", +"kalmykia.su", +"kaluga.su", +"karacol.su", +"karaganda.su", +"karelia.su", +"khakassia.su", +"krasnodar.su", +"kurgan.su", +"kustanai.su", +"lenug.su", +"mangyshlak.su", +"mordovia.su", +"msk.su", +"murmansk.su", +"nalchik.su", +"navoi.su", +"north-kazakhstan.su", +"nov.su", +"obninsk.su", +"penza.su", +"pokrovsk.su", +"sochi.su", +"spb.su", +"tashkent.su", +"termez.su", +"togliatti.su", +"troitsk.su", +"tselinograd.su", +"tula.su", +"tuva.su", +"vladikavkaz.su", +"vladimir.su", +"vologda.su", +"channelsdvr.net", +"fastly-terrarium.com", +"fastlylb.net", +"map.fastlylb.net", +"freetls.fastly.net", +"map.fastly.net", +"a.prod.fastly.net", +"global.prod.fastly.net", +"a.ssl.fastly.net", +"b.ssl.fastly.net", +"global.ssl.fastly.net", +"fastpanel.direct", +"fastvps-server.com", +"fhapp.xyz", +"fedorainfracloud.org", +"fedorapeople.org", +"cloud.fedoraproject.org", +"app.os.fedoraproject.org", +"app.os.stg.fedoraproject.org", +"mydobiss.com", +"filegear.me", +"filegear-au.me", +"filegear-de.me", +"filegear-gb.me", +"filegear-ie.me", +"filegear-jp.me", +"filegear-sg.me", +"firebaseapp.com", +"flynnhub.com", +"flynnhosting.net", +"0e.vc", +"freebox-os.com", +"freeboxos.com", +"fbx-os.fr", +"fbxos.fr", +"freebox-os.fr", +"freeboxos.fr", +"freedesktop.org", +"*.futurecms.at", +"*.ex.futurecms.at", +"*.in.futurecms.at", +"futurehosting.at", +"futuremailing.at", +"*.ex.ortsinfo.at", +"*.kunden.ortsinfo.at", +"*.statics.cloud", +"service.gov.uk", +"gehirn.ne.jp", +"usercontent.jp", +"gentapps.com", +"lab.ms", +"github.io", +"githubusercontent.com", +"gitlab.io", +"glitch.me", +"lolipop.io", +"cloudapps.digital", +"london.cloudapps.digital", +"homeoffice.gov.uk", +"ro.im", +"shop.ro", +"goip.de", +"run.app", +"a.run.app", +"web.app", +"*.0emm.com", +"appspot.com", +"*.r.appspot.com", +"blogspot.ae", +"blogspot.al", +"blogspot.am", +"blogspot.ba", +"blogspot.be", +"blogspot.bg", +"blogspot.bj", +"blogspot.ca", +"blogspot.cf", +"blogspot.ch", +"blogspot.cl", +"blogspot.co.at", +"blogspot.co.id", +"blogspot.co.il", +"blogspot.co.ke", +"blogspot.co.nz", +"blogspot.co.uk", +"blogspot.co.za", +"blogspot.com", +"blogspot.com.ar", +"blogspot.com.au", +"blogspot.com.br", +"blogspot.com.by", +"blogspot.com.co", +"blogspot.com.cy", +"blogspot.com.ee", +"blogspot.com.eg", +"blogspot.com.es", +"blogspot.com.mt", +"blogspot.com.ng", +"blogspot.com.tr", +"blogspot.com.uy", +"blogspot.cv", +"blogspot.cz", +"blogspot.de", +"blogspot.dk", +"blogspot.fi", +"blogspot.fr", +"blogspot.gr", +"blogspot.hk", +"blogspot.hr", +"blogspot.hu", +"blogspot.ie", +"blogspot.in", +"blogspot.is", +"blogspot.it", +"blogspot.jp", +"blogspot.kr", +"blogspot.li", +"blogspot.lt", +"blogspot.lu", +"blogspot.md", +"blogspot.mk", +"blogspot.mr", +"blogspot.mx", +"blogspot.my", +"blogspot.nl", +"blogspot.no", +"blogspot.pe", +"blogspot.pt", +"blogspot.qa", +"blogspot.re", +"blogspot.ro", +"blogspot.rs", +"blogspot.ru", +"blogspot.se", +"blogspot.sg", +"blogspot.si", +"blogspot.sk", +"blogspot.sn", +"blogspot.td", +"blogspot.tw", +"blogspot.ug", +"blogspot.vn", +"cloudfunctions.net", +"cloud.goog", +"codespot.com", +"googleapis.com", +"googlecode.com", +"pagespeedmobilizer.com", +"publishproxy.com", +"withgoogle.com", +"withyoutube.com", +"awsmppl.com", +"fin.ci", +"free.hr", +"caa.li", +"ua.rs", +"conf.se", +"hs.zone", +"hs.run", +"hashbang.sh", +"hasura.app", +"hasura-app.io", +"hepforge.org", +"herokuapp.com", +"herokussl.com", +"myravendb.com", +"ravendb.community", +"ravendb.me", +"development.run", +"ravendb.run", +"bpl.biz", +"orx.biz", +"ng.city", +"biz.gl", +"ng.ink", +"col.ng", +"firm.ng", +"gen.ng", +"ltd.ng", +"ngo.ng", +"ng.school", +"sch.so", +"häkkinen.fi", +"*.moonscale.io", +"moonscale.net", +"iki.fi", +"dyn-berlin.de", +"in-berlin.de", +"in-brb.de", +"in-butter.de", +"in-dsl.de", +"in-dsl.net", +"in-dsl.org", +"in-vpn.de", +"in-vpn.net", +"in-vpn.org", +"biz.at", +"info.at", +"info.cx", +"ac.leg.br", +"al.leg.br", +"am.leg.br", +"ap.leg.br", +"ba.leg.br", +"ce.leg.br", +"df.leg.br", +"es.leg.br", +"go.leg.br", +"ma.leg.br", +"mg.leg.br", +"ms.leg.br", +"mt.leg.br", +"pa.leg.br", +"pb.leg.br", +"pe.leg.br", +"pi.leg.br", +"pr.leg.br", +"rj.leg.br", +"rn.leg.br", +"ro.leg.br", +"rr.leg.br", +"rs.leg.br", +"sc.leg.br", +"se.leg.br", +"sp.leg.br", +"to.leg.br", +"pixolino.com", +"ipifony.net", +"mein-iserv.de", +"test-iserv.de", +"iserv.dev", +"iobb.net", +"myjino.ru", +"*.hosting.myjino.ru", +"*.landing.myjino.ru", +"*.spectrum.myjino.ru", +"*.vps.myjino.ru", +"*.triton.zone", +"*.cns.joyent.com", +"js.org", +"kaas.gg", +"khplay.nl", +"keymachine.de", +"kinghost.net", +"uni5.net", +"knightpoint.systems", +"oya.to", +"co.krd", +"edu.krd", +"git-repos.de", +"lcube-server.de", +"svn-repos.de", +"leadpages.co", +"lpages.co", +"lpusercontent.com", +"lelux.site", +"co.business", +"co.education", +"co.events", +"co.financial", +"co.network", +"co.place", +"co.technology", +"app.lmpm.com", +"linkitools.space", +"linkyard.cloud", +"linkyard-cloud.ch", +"members.linode.com", +"nodebalancer.linode.com", +"we.bs", +"loginline.app", +"loginline.dev", +"loginline.io", +"loginline.services", +"loginline.site", +"krasnik.pl", +"leczna.pl", +"lubartow.pl", +"lublin.pl", +"poniatowa.pl", +"swidnik.pl", +"uklugs.org", +"glug.org.uk", +"lug.org.uk", +"lugs.org.uk", +"barsy.bg", +"barsy.co.uk", +"barsyonline.co.uk", +"barsycenter.com", +"barsyonline.com", +"barsy.club", +"barsy.de", +"barsy.eu", +"barsy.in", +"barsy.info", +"barsy.io", +"barsy.me", +"barsy.menu", +"barsy.mobi", +"barsy.net", +"barsy.online", +"barsy.org", +"barsy.pro", +"barsy.pub", +"barsy.shop", +"barsy.site", +"barsy.support", +"barsy.uk", +"*.magentosite.cloud", +"mayfirst.info", +"mayfirst.org", +"hb.cldmail.ru", +"miniserver.com", +"memset.net", +"cloud.metacentrum.cz", +"custom.metacentrum.cz", +"flt.cloud.muni.cz", +"usr.cloud.muni.cz", +"meteorapp.com", +"eu.meteorapp.com", +"co.pl", +"azurecontainer.io", +"azurewebsites.net", +"azure-mobile.net", +"cloudapp.net", +"mozilla-iot.org", +"bmoattachments.org", +"net.ru", +"org.ru", +"pp.ru", +"ui.nabu.casa", +"pony.club", +"of.fashion", +"on.fashion", +"of.football", +"in.london", +"of.london", +"for.men", +"and.mom", +"for.mom", +"for.one", +"for.sale", +"of.work", +"to.work", +"nctu.me", +"bitballoon.com", +"netlify.com", +"4u.com", +"ngrok.io", +"nh-serv.co.uk", +"nfshost.com", +"dnsking.ch", +"mypi.co", +"n4t.co", +"001www.com", +"ddnslive.com", +"myiphost.com", +"forumz.info", +"16-b.it", +"32-b.it", +"64-b.it", +"soundcast.me", +"tcp4.me", +"dnsup.net", +"hicam.net", +"now-dns.net", +"ownip.net", +"vpndns.net", +"dynserv.org", +"now-dns.org", +"x443.pw", +"now-dns.top", +"ntdll.top", +"freeddns.us", +"crafting.xyz", +"zapto.xyz", +"nsupdate.info", +"nerdpol.ovh", +"blogsyte.com", +"brasilia.me", +"cable-modem.org", +"ciscofreak.com", +"collegefan.org", +"couchpotatofries.org", +"damnserver.com", +"ddns.me", +"ditchyourip.com", +"dnsfor.me", +"dnsiskinky.com", +"dvrcam.info", +"dynns.com", +"eating-organic.net", +"fantasyleague.cc", +"geekgalaxy.com", +"golffan.us", +"health-carereform.com", +"homesecuritymac.com", +"homesecuritypc.com", +"hopto.me", +"ilovecollege.info", +"loginto.me", +"mlbfan.org", +"mmafan.biz", +"myactivedirectory.com", +"mydissent.net", +"myeffect.net", +"mymediapc.net", +"mypsx.net", +"mysecuritycamera.com", +"mysecuritycamera.net", +"mysecuritycamera.org", +"net-freaks.com", +"nflfan.org", +"nhlfan.net", +"no-ip.ca", +"no-ip.co.uk", +"no-ip.net", +"noip.us", +"onthewifi.com", +"pgafan.net", +"point2this.com", +"pointto.us", +"privatizehealthinsurance.net", +"quicksytes.com", +"read-books.org", +"securitytactics.com", +"serveexchange.com", +"servehumour.com", +"servep2p.com", +"servesarcasm.com", +"stufftoread.com", +"ufcfan.org", +"unusualperson.com", +"workisboring.com", +"3utilities.com", +"bounceme.net", +"ddns.net", +"ddnsking.com", +"gotdns.ch", +"hopto.org", +"myftp.biz", +"myftp.org", +"myvnc.com", +"no-ip.biz", +"no-ip.info", +"no-ip.org", +"noip.me", +"redirectme.net", +"servebeer.com", +"serveblog.net", +"servecounterstrike.com", +"serveftp.com", +"servegame.com", +"servehalflife.com", +"servehttp.com", +"serveirc.com", +"serveminecraft.net", +"servemp3.com", +"servepics.com", +"servequake.com", +"sytes.net", +"webhop.me", +"zapto.org", +"stage.nodeart.io", +"nodum.co", +"nodum.io", +"pcloud.host", +"nyc.mn", +"nom.ae", +"nom.af", +"nom.ai", +"nom.al", +"nym.by", +"nym.bz", +"nom.cl", +"nym.ec", +"nom.gd", +"nom.ge", +"nom.gl", +"nym.gr", +"nom.gt", +"nym.gy", +"nym.hk", +"nom.hn", +"nym.ie", +"nom.im", +"nom.ke", +"nym.kz", +"nym.la", +"nym.lc", +"nom.li", +"nym.li", +"nym.lt", +"nym.lu", +"nym.me", +"nom.mk", +"nym.mn", +"nym.mx", +"nom.nu", +"nym.nz", +"nym.pe", +"nym.pt", +"nom.pw", +"nom.qa", +"nym.ro", +"nom.rs", +"nom.si", +"nym.sk", +"nom.st", +"nym.su", +"nym.sx", +"nom.tj", +"nym.tw", +"nom.ug", +"nom.uy", +"nom.vc", +"nom.vg", +"static.observableusercontent.com", +"cya.gg", +"cloudycluster.net", +"nid.io", +"opencraft.hosting", +"operaunite.com", +"skygearapp.com", +"outsystemscloud.com", +"ownprovider.com", +"own.pm", +"ox.rs", +"oy.lc", +"pgfog.com", +"pagefrontapp.com", +"art.pl", +"gliwice.pl", +"krakow.pl", +"poznan.pl", +"wroc.pl", +"zakopane.pl", +"pantheonsite.io", +"gotpantheon.com", +"mypep.link", +"perspecta.cloud", +"on-web.fr", +"*.platform.sh", +"*.platformsh.site", +"dyn53.io", +"co.bn", +"xen.prgmr.com", +"priv.at", +"prvcy.page", +"*.dweb.link", +"protonet.io", +"chirurgiens-dentistes-en-france.fr", +"byen.site", +"pubtls.org", +"qualifioapp.com", +"instantcloud.cn", +"ras.ru", +"qa2.com", +"qcx.io", +"*.sys.qcx.io", +"dev-myqnapcloud.com", +"alpha-myqnapcloud.com", +"myqnapcloud.com", +"*.quipelements.com", +"vapor.cloud", +"vaporcloud.io", +"rackmaze.com", +"rackmaze.net", +"*.on-k3s.io", +"*.on-rancher.cloud", +"*.on-rio.io", +"readthedocs.io", +"rhcloud.com", +"app.render.com", +"onrender.com", +"repl.co", +"repl.run", +"resindevice.io", +"devices.resinstaging.io", +"hzc.io", +"wellbeingzone.eu", +"ptplus.fit", +"wellbeingzone.co.uk", +"git-pages.rit.edu", +"sandcats.io", +"logoip.de", +"logoip.com", +"schokokeks.net", +"gov.scot", +"scrysec.com", +"firewall-gateway.com", +"firewall-gateway.de", +"my-gateway.de", +"my-router.de", +"spdns.de", +"spdns.eu", +"firewall-gateway.net", +"my-firewall.org", +"myfirewall.org", +"spdns.org", +"biz.ua", +"co.ua", +"pp.ua", +"shiftedit.io", +"myshopblocks.com", +"shopitsite.com", +"mo-siemens.io", +"1kapp.com", +"appchizi.com", +"applinzi.com", +"sinaapp.com", +"vipsinaapp.com", +"siteleaf.net", +"bounty-full.com", +"alpha.bounty-full.com", +"beta.bounty-full.com", +"stackhero-network.com", +"static.land", +"dev.static.land", +"sites.static.land", +"apps.lair.io", +"*.stolos.io", +"spacekit.io", +"customer.speedpartner.de", +"api.stdlib.com", +"storj.farm", +"utwente.io", +"soc.srcf.net", +"user.srcf.net", +"temp-dns.com", +"applicationcloud.io", +"scapp.io", +"*.s5y.io", +"*.sensiosite.cloud", +"syncloud.it", +"diskstation.me", +"dscloud.biz", +"dscloud.me", +"dscloud.mobi", +"dsmynas.com", +"dsmynas.net", +"dsmynas.org", +"familyds.com", +"familyds.net", +"familyds.org", +"i234.me", +"myds.me", +"synology.me", +"vpnplus.to", +"direct.quickconnect.to", +"taifun-dns.de", +"gda.pl", +"gdansk.pl", +"gdynia.pl", +"med.pl", +"sopot.pl", +"edugit.org", +"telebit.app", +"telebit.io", +"*.telebit.xyz", +"gwiddle.co.uk", +"thingdustdata.com", +"cust.dev.thingdust.io", +"cust.disrec.thingdust.io", +"cust.prod.thingdust.io", +"cust.testing.thingdust.io", +"arvo.network", +"azimuth.network", +"bloxcms.com", +"townnews-staging.com", +"12hp.at", +"2ix.at", +"4lima.at", +"lima-city.at", +"12hp.ch", +"2ix.ch", +"4lima.ch", +"lima-city.ch", +"trafficplex.cloud", +"de.cool", +"12hp.de", +"2ix.de", +"4lima.de", +"lima-city.de", +"1337.pictures", +"clan.rip", +"lima-city.rocks", +"webspace.rocks", +"lima.zone", +"*.transurl.be", +"*.transurl.eu", +"*.transurl.nl", +"tuxfamily.org", +"dd-dns.de", +"diskstation.eu", +"diskstation.org", +"dray-dns.de", +"draydns.de", +"dyn-vpn.de", +"dynvpn.de", +"mein-vigor.de", +"my-vigor.de", +"my-wan.de", +"syno-ds.de", +"synology-diskstation.de", +"synology-ds.de", +"uber.space", +"*.uberspace.de", +"hk.com", +"hk.org", +"ltd.hk", +"inc.hk", +"virtualuser.de", +"virtual-user.de", +"lib.de.us", +"2038.io", +"router.management", +"v-info.info", +"voorloper.cloud", +"v.ua", +"wafflecell.com", +"*.webhare.dev", +"wedeploy.io", +"wedeploy.me", +"wedeploy.sh", +"remotewd.com", +"wmflabs.org", +"half.host", +"xnbay.com", +"u2.xnbay.com", +"u2-local.xnbay.com", +"cistron.nl", +"demon.nl", +"xs4all.space", +"yandexcloud.net", +"storage.yandexcloud.net", +"website.yandexcloud.net", +"official.academy", +"yolasite.com", +"ybo.faith", +"yombo.me", +"homelink.one", +"ybo.party", +"ybo.review", +"ybo.science", +"ybo.trade", +"nohost.me", +"noho.st", +"za.net", +"za.org", +"now.sh", +"bss.design", +"basicserver.io", +"virtualserver.io", +"site.builder.nu", +"enterprisecloud.nu" +] \ No newline at end of file diff --git a/node_modules/psl/dist/psl.js b/node_modules/psl/dist/psl.js new file mode 100644 index 0000000..bcbebed --- /dev/null +++ b/node_modules/psl/dist/psl.js @@ -0,0 +1,9623 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.psl = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= punySuffix.length) { + // return memo; + // } + //} + return rule; + }, null); +}; + + +// +// Error codes and messages. +// +exports.errorCodes = { + DOMAIN_TOO_SHORT: 'Domain name too short.', + DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.', + LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.', + LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.', + LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.', + LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.', + LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.' +}; + + +// +// Validate domain name and throw if not valid. +// +// From wikipedia: +// +// Hostnames are composed of series of labels concatenated with dots, as are all +// domain names. Each label must be between 1 and 63 characters long, and the +// entire hostname (including the delimiting dots) has a maximum of 255 chars. +// +// Allowed chars: +// +// * `a-z` +// * `0-9` +// * `-` but not as a starting or ending character +// * `.` as a separator for the textual portions of a domain name +// +// * http://en.wikipedia.org/wiki/Domain_name +// * http://en.wikipedia.org/wiki/Hostname +// +internals.validate = function (input) { + + // Before we can validate we need to take care of IDNs with unicode chars. + var ascii = Punycode.toASCII(input); + + if (ascii.length < 1) { + return 'DOMAIN_TOO_SHORT'; + } + if (ascii.length > 255) { + return 'DOMAIN_TOO_LONG'; + } + + // Check each part's length and allowed chars. + var labels = ascii.split('.'); + var label; + + for (var i = 0; i < labels.length; ++i) { + label = labels[i]; + if (!label.length) { + return 'LABEL_TOO_SHORT'; + } + if (label.length > 63) { + return 'LABEL_TOO_LONG'; + } + if (label.charAt(0) === '-') { + return 'LABEL_STARTS_WITH_DASH'; + } + if (label.charAt(label.length - 1) === '-') { + return 'LABEL_ENDS_WITH_DASH'; + } + if (!/^[a-z0-9\-]+$/.test(label)) { + return 'LABEL_INVALID_CHARS'; + } + } +}; + + +// +// Public API +// + + +// +// Parse domain. +// +exports.parse = function (input) { + + if (typeof input !== 'string') { + throw new TypeError('Domain name must be a string.'); + } + + // Force domain to lowercase. + var domain = input.slice(0).toLowerCase(); + + // Handle FQDN. + // TODO: Simply remove trailing dot? + if (domain.charAt(domain.length - 1) === '.') { + domain = domain.slice(0, domain.length - 1); + } + + // Validate and sanitise input. + var error = internals.validate(domain); + if (error) { + return { + input: input, + error: { + message: exports.errorCodes[error], + code: error + } + }; + } + + var parsed = { + input: input, + tld: null, + sld: null, + domain: null, + subdomain: null, + listed: false + }; + + var domainParts = domain.split('.'); + + // Non-Internet TLD + if (domainParts[domainParts.length - 1] === 'local') { + return parsed; + } + + var handlePunycode = function () { + + if (!/xn--/.test(domain)) { + return parsed; + } + if (parsed.domain) { + parsed.domain = Punycode.toASCII(parsed.domain); + } + if (parsed.subdomain) { + parsed.subdomain = Punycode.toASCII(parsed.subdomain); + } + return parsed; + }; + + var rule = internals.findRule(domain); + + // Unlisted tld. + if (!rule) { + if (domainParts.length < 2) { + return parsed; + } + parsed.tld = domainParts.pop(); + parsed.sld = domainParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + if (domainParts.length) { + parsed.subdomain = domainParts.pop(); + } + return handlePunycode(); + } + + // At this point we know the public suffix is listed. + parsed.listed = true; + + var tldParts = rule.suffix.split('.'); + var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); + + if (rule.exception) { + privateParts.push(tldParts.shift()); + } + + parsed.tld = tldParts.join('.'); + + if (!privateParts.length) { + return handlePunycode(); + } + + if (rule.wildcard) { + tldParts.unshift(privateParts.pop()); + parsed.tld = tldParts.join('.'); + } + + if (!privateParts.length) { + return handlePunycode(); + } + + parsed.sld = privateParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + + if (privateParts.length) { + parsed.subdomain = privateParts.join('.'); + } + + return handlePunycode(); +}; + + +// +// Get domain. +// +exports.get = function (domain) { + + if (!domain) { + return null; + } + return exports.parse(domain).domain || null; +}; + + +// +// Check whether domain belongs to a known public suffix. +// +exports.isValid = function (domain) { + + var parsed = exports.parse(domain); + return Boolean(parsed.domain && parsed.listed); +}; + +},{"./data/rules.json":1,"punycode":3}],3:[function(require,module,exports){ +(function (global){ +/*! https://mths.be/punycode v1.4.1 by @mathias */ +;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.4.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { + // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[2])(2) +}); diff --git a/node_modules/psl/dist/psl.min.js b/node_modules/psl/dist/psl.min.js new file mode 100644 index 0000000..f294e87 --- /dev/null +++ b/node_modules/psl/dist/psl.min.js @@ -0,0 +1 @@ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}}(function(){return function s(m,t,u){function r(o,a){if(!t[o]){if(!m[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(p)return p(o,!0);var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}var n=t[o]={exports:{}};m[o][0].call(n.exports,function(a){return r(m[o][1][a]||a)},n,n.exports,s,m,t,u)}return t[o].exports}for(var p="function"==typeof require&&require,a=0;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},c=b-y,x=Math.floor,q=String.fromCharCode;function A(a){throw new RangeError(k[a])}function l(a,o){for(var i=a.length,e=[];i--;)e[i]=o(a[i]);return e}function g(a,o){var i=a.split("@"),e="";return 1>>10&1023|55296),a=56320|1023&a),o+=q(a)}).join("")}function L(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function I(a,o,i){var e=0;for(a=i?x(a/t):a>>1,a+=x(a/o);c*f>>1x((d-g)/m))&&A("overflow"),g+=u*m,!(u<(r=t<=j?y:j+f<=t?f:t-j));t+=b)m>x(d/(p=b-r))&&A("overflow"),m*=p;j=I(g-s,o=c.length+1,0==s),x(g/o)>d-h&&A("overflow"),h+=x(g/o),g%=o,c.splice(g++,0,h)}return _(c)}function j(a){var o,i,e,n,s,m,t,u,r,p,k,c,l,g,h,j=[];for(c=(a=O(a)).length,o=w,s=v,m=i=0;mx((d-i)/(l=e+1))&&A("overflow"),i+=(t-o)*l,o=t,m=0;md&&A("overflow"),k==o){for(u=i,r=b;!(u<(p=r<=s?y:s+f<=r?f:r-s));r+=b)h=u-p,g=b-p,j.push(q(L(p+h%g,0))),u=x(h/g);j.push(q(L(u,0))),s=I(i,l,e==n),i=0,++e}++i,++o}return j.join("")}if(n={version:"1.4.1",ucs2:{decode:O,encode:_},decode:h,encode:j,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+j(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?h(a.slice(4).toLowerCase()):a})}},0,o&&i)if(T.exports==o)i.exports=n;else for(s in n)n.hasOwnProperty(s)&&(o[s]=n[s]);else a.punycode=n}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[2])(2)}); diff --git a/node_modules/psl/index.js b/node_modules/psl/index.js new file mode 100644 index 0000000..da7bc12 --- /dev/null +++ b/node_modules/psl/index.js @@ -0,0 +1,269 @@ +/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */ +'use strict'; + + +var Punycode = require('punycode'); + + +var internals = {}; + + +// +// Read rules from file. +// +internals.rules = require('./data/rules.json').map(function (rule) { + + return { + rule: rule, + suffix: rule.replace(/^(\*\.|\!)/, ''), + punySuffix: -1, + wildcard: rule.charAt(0) === '*', + exception: rule.charAt(0) === '!' + }; +}); + + +// +// Check is given string ends with `suffix`. +// +internals.endsWith = function (str, suffix) { + + return str.indexOf(suffix, str.length - suffix.length) !== -1; +}; + + +// +// Find rule for a given domain. +// +internals.findRule = function (domain) { + + var punyDomain = Punycode.toASCII(domain); + return internals.rules.reduce(function (memo, rule) { + + if (rule.punySuffix === -1){ + rule.punySuffix = Punycode.toASCII(rule.suffix); + } + if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) { + return memo; + } + // This has been commented out as it never seems to run. This is because + // sub tlds always appear after their parents and we never find a shorter + // match. + //if (memo) { + // var memoSuffix = Punycode.toASCII(memo.suffix); + // if (memoSuffix.length >= punySuffix.length) { + // return memo; + // } + //} + return rule; + }, null); +}; + + +// +// Error codes and messages. +// +exports.errorCodes = { + DOMAIN_TOO_SHORT: 'Domain name too short.', + DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.', + LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.', + LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.', + LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.', + LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.', + LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.' +}; + + +// +// Validate domain name and throw if not valid. +// +// From wikipedia: +// +// Hostnames are composed of series of labels concatenated with dots, as are all +// domain names. Each label must be between 1 and 63 characters long, and the +// entire hostname (including the delimiting dots) has a maximum of 255 chars. +// +// Allowed chars: +// +// * `a-z` +// * `0-9` +// * `-` but not as a starting or ending character +// * `.` as a separator for the textual portions of a domain name +// +// * http://en.wikipedia.org/wiki/Domain_name +// * http://en.wikipedia.org/wiki/Hostname +// +internals.validate = function (input) { + + // Before we can validate we need to take care of IDNs with unicode chars. + var ascii = Punycode.toASCII(input); + + if (ascii.length < 1) { + return 'DOMAIN_TOO_SHORT'; + } + if (ascii.length > 255) { + return 'DOMAIN_TOO_LONG'; + } + + // Check each part's length and allowed chars. + var labels = ascii.split('.'); + var label; + + for (var i = 0; i < labels.length; ++i) { + label = labels[i]; + if (!label.length) { + return 'LABEL_TOO_SHORT'; + } + if (label.length > 63) { + return 'LABEL_TOO_LONG'; + } + if (label.charAt(0) === '-') { + return 'LABEL_STARTS_WITH_DASH'; + } + if (label.charAt(label.length - 1) === '-') { + return 'LABEL_ENDS_WITH_DASH'; + } + if (!/^[a-z0-9\-]+$/.test(label)) { + return 'LABEL_INVALID_CHARS'; + } + } +}; + + +// +// Public API +// + + +// +// Parse domain. +// +exports.parse = function (input) { + + if (typeof input !== 'string') { + throw new TypeError('Domain name must be a string.'); + } + + // Force domain to lowercase. + var domain = input.slice(0).toLowerCase(); + + // Handle FQDN. + // TODO: Simply remove trailing dot? + if (domain.charAt(domain.length - 1) === '.') { + domain = domain.slice(0, domain.length - 1); + } + + // Validate and sanitise input. + var error = internals.validate(domain); + if (error) { + return { + input: input, + error: { + message: exports.errorCodes[error], + code: error + } + }; + } + + var parsed = { + input: input, + tld: null, + sld: null, + domain: null, + subdomain: null, + listed: false + }; + + var domainParts = domain.split('.'); + + // Non-Internet TLD + if (domainParts[domainParts.length - 1] === 'local') { + return parsed; + } + + var handlePunycode = function () { + + if (!/xn--/.test(domain)) { + return parsed; + } + if (parsed.domain) { + parsed.domain = Punycode.toASCII(parsed.domain); + } + if (parsed.subdomain) { + parsed.subdomain = Punycode.toASCII(parsed.subdomain); + } + return parsed; + }; + + var rule = internals.findRule(domain); + + // Unlisted tld. + if (!rule) { + if (domainParts.length < 2) { + return parsed; + } + parsed.tld = domainParts.pop(); + parsed.sld = domainParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + if (domainParts.length) { + parsed.subdomain = domainParts.pop(); + } + return handlePunycode(); + } + + // At this point we know the public suffix is listed. + parsed.listed = true; + + var tldParts = rule.suffix.split('.'); + var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); + + if (rule.exception) { + privateParts.push(tldParts.shift()); + } + + parsed.tld = tldParts.join('.'); + + if (!privateParts.length) { + return handlePunycode(); + } + + if (rule.wildcard) { + tldParts.unshift(privateParts.pop()); + parsed.tld = tldParts.join('.'); + } + + if (!privateParts.length) { + return handlePunycode(); + } + + parsed.sld = privateParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + + if (privateParts.length) { + parsed.subdomain = privateParts.join('.'); + } + + return handlePunycode(); +}; + + +// +// Get domain. +// +exports.get = function (domain) { + + if (!domain) { + return null; + } + return exports.parse(domain).domain || null; +}; + + +// +// Check whether domain belongs to a known public suffix. +// +exports.isValid = function (domain) { + + var parsed = exports.parse(domain); + return Boolean(parsed.domain && parsed.listed); +}; diff --git a/node_modules/psl/package.json b/node_modules/psl/package.json new file mode 100644 index 0000000..30bbc38 --- /dev/null +++ b/node_modules/psl/package.json @@ -0,0 +1,80 @@ +{ + "_args": [ + [ + "psl@1.7.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "psl@1.7.0", + "_id": "psl@1.7.0", + "_inBundle": false, + "_integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "_location": "/psl", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "psl@1.7.0", + "name": "psl", + "escapedName": "psl", + "rawSpec": "1.7.0", + "saveSpec": null, + "fetchSpec": "1.7.0" + }, + "_requiredBy": [ + "/tough-cookie" + ], + "_resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "_spec": "1.7.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Lupo Montero", + "email": "lupomontero@gmail.com", + "url": "https://lupomontero.com/" + }, + "bugs": { + "url": "https://github.com/lupomontero/psl/issues" + }, + "description": "Domain name parser based on the Public Suffix List", + "devDependencies": { + "JSONStream": "^1.3.5", + "browserify": "^16.5.0", + "commit-and-pr": "^1.0.4", + "eslint": "^6.8.0", + "eslint-config-hapi": "^12.0.0", + "eslint-plugin-hapi": "^4.1.0", + "karma": "^4.4.1", + "karma-browserify": "^6.1.0", + "karma-mocha": "^1.3.0", + "karma-mocha-reporter": "^2.2.5", + "karma-phantomjs-launcher": "^1.0.4", + "mocha": "^6.2.2", + "phantomjs-prebuilt": "^2.1.16", + "request": "^2.88.0", + "uglify-js": "^3.7.3", + "watchify": "^3.11.1" + }, + "homepage": "https://github.com/lupomontero/psl#readme", + "keywords": [ + "publicsuffix", + "publicsuffixlist" + ], + "license": "MIT", + "main": "index.js", + "name": "psl", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/lupomontero/psl.git" + }, + "scripts": { + "build": "browserify ./index.js --standalone=psl > ./dist/psl.js", + "changelog": "git log $(git describe --tags --abbrev=0)..HEAD --oneline --format=\"%h %s (%an <%ae>)\"", + "commit-and-pr": "commit-and-pr", + "postbuild": "cat ./dist/psl.js | uglifyjs -c -m > ./dist/psl.min.js", + "prebuild": "./scripts/update-rules.js", + "pretest": "eslint .", + "test": "mocha test && karma start ./karma.conf.js --single-run", + "watch": "mocha test --watch" + }, + "version": "1.7.0" +} diff --git a/node_modules/pstree.remy/.travis.yml b/node_modules/pstree.remy/.travis.yml new file mode 100644 index 0000000..5bf093e --- /dev/null +++ b/node_modules/pstree.remy/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +cache: + directories: + - ~/.npm +notifications: + email: false +node_js: + - '8' diff --git a/node_modules/pstree.remy/LICENSE b/node_modules/pstree.remy/LICENSE new file mode 100644 index 0000000..e83bea6 --- /dev/null +++ b/node_modules/pstree.remy/LICENSE @@ -0,0 +1,7 @@ +The MIT License (MIT) +Copyright © 2019 Remy Sharp, https://remysharp.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/pstree.remy/lib/index.js b/node_modules/pstree.remy/lib/index.js new file mode 100644 index 0000000..6ea7e02 --- /dev/null +++ b/node_modules/pstree.remy/lib/index.js @@ -0,0 +1,32 @@ +const exec = require('child_process').exec; +const tree = require('./tree'); +const utils = require('./utils'); +var hasPS = true; + +// discover if the OS has `ps`, and therefore can use psTree +exec('ps', error => { + module.exports.hasPS = hasPS = !error; +}); + +module.exports = function main(pid, callback) { + if (typeof pid === 'number') { + pid = pid.toString(); + } + + if (hasPS && !process.env.NO_PS) { + return tree(pid, callback); + } + + utils + .getStat() + .then(utils.tree) + .then(tree => utils.pidsForTree(tree, pid)) + .then(res => callback(null, res.map(p => p.PID))) + .catch(error => callback(error)); +}; + +if (!module.parent) { + module.exports(process.argv[2], (e, pids) => console.log(pids)); +} + +module.exports.hasPS = hasPS; diff --git a/node_modules/pstree.remy/lib/tree.js b/node_modules/pstree.remy/lib/tree.js new file mode 100644 index 0000000..d8c49f7 --- /dev/null +++ b/node_modules/pstree.remy/lib/tree.js @@ -0,0 +1,34 @@ +const spawn = require('child_process').spawn; + +module.exports = function(rootPid, callback) { + const tree = {}; + var output = ''; + + // *nix + const ps = spawn('ps', ['-A', '-o', 'ppid,pid']); + ps.stdout.on('data', data => { + output += data.toString('ascii'); + }); + + ps.on('close', () => { + try { + const res = output + .split('\n') + .slice(1) + .map(_ => _.trim()) + .reduce((acc, line) => { + if (line.indexOf(rootPid + ' ') === 0) { + const pid = line.split(/\s+/).pop(); + acc.push(parseInt(pid, 10)); + rootPid = pid; + } + + return acc; + }, []); + + callback(null, res); + } catch (e) { + callback(e, null); + } + }); +}; diff --git a/node_modules/pstree.remy/lib/utils.js b/node_modules/pstree.remy/lib/utils.js new file mode 100644 index 0000000..e438af9 --- /dev/null +++ b/node_modules/pstree.remy/lib/utils.js @@ -0,0 +1,56 @@ +const spawn = require('child_process').spawn; + +module.exports = { tree, pidsForTree, getStat }; + +function getStat() { + return new Promise(resolve => { + const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`; + const child = spawn('sh', ['-c', command], { + stdio: ['pipe', 'pipe', 'pipe'], + }); + + var res = ''; + child.stdout.on('data', data => (res += data)); + child.on('close', () => resolve(res)); + }); +} + +function template(s) { + var stat = null; + // 'pid', 'comm', 'state', 'ppid', 'pgrp' + // %d (%s) %c %d %d + s.replace( + /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g, + (all, PID, COMMAND, STAT, PPID) => { + stat = { PID, COMMAND, PPID, STAT }; + } + ); + + return stat; +} + +function tree(stats) { + const processes = stats + .split('\n') + .map(template) + .filter(Boolean); + + return processes; +} + +function pidsForTree(tree, pid) { + if (typeof pid === 'number') { + pid = pid.toString(); + } + const parents = [pid]; + const children = []; + + tree.forEach(proc => { + if (parents.indexOf(proc.PPID) !== -1) { + parents.push(proc.PID); + children.push(proc); + } + }); + + return children; +} diff --git a/node_modules/pstree.remy/package.json b/node_modules/pstree.remy/package.json new file mode 100644 index 0000000..dc7b5ab --- /dev/null +++ b/node_modules/pstree.remy/package.json @@ -0,0 +1,55 @@ +{ + "_args": [ + [ + "pstree.remy@1.1.7", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "pstree.remy@1.1.7", + "_id": "pstree.remy@1.1.7", + "_inBundle": false, + "_integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "_location": "/pstree.remy", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "pstree.remy@1.1.7", + "name": "pstree.remy", + "escapedName": "pstree.remy", + "rawSpec": "1.1.7", + "saveSpec": null, + "fetchSpec": "1.1.7" + }, + "_requiredBy": [ + "/nodemon" + ], + "_resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "_spec": "1.1.7", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Remy Sharp" + }, + "dependencies": {}, + "description": "Collects the full tree of processes from /proc", + "devDependencies": { + "tap": "^11.0.0" + }, + "directories": { + "test": "tests" + }, + "keywords": [ + "ps", + "pstree", + "ps tree" + ], + "license": "MIT", + "main": "lib/index.js", + "name": "pstree.remy", + "scripts": { + "_prepublish": "npm test", + "test": "tap tests/*.test.js" + }, + "version": "1.1.7" +} diff --git a/node_modules/pstree.remy/tests/fixtures/index.js b/node_modules/pstree.remy/tests/fixtures/index.js new file mode 100644 index 0000000..4c171f9 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/index.js @@ -0,0 +1,8 @@ +const spawn = require('child_process').spawn; +const sub = spawn( + 'sh', + ['-c', 'node -e "setInterval(() => console.log(`running`), 200)"'], + { + stdio: 'pipe', + } +); diff --git a/node_modules/pstree.remy/tests/fixtures/out1 b/node_modules/pstree.remy/tests/fixtures/out1 new file mode 100644 index 0000000..abfe581 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/out1 @@ -0,0 +1,10 @@ +1 (npm) S 0 1 1 34816 1 4210944 11112 0 0 0 45 8 0 0 20 0 10 0 330296 1089871872 11809 18446744073709551615 4194304 29343848 140726436642896 0 0 0 0 4096 2072112895 0 0 0 17 0 0 0 0 0 0 31441000 31537208 37314560 140726436650815 140726436650847 140726436650847 140726436650986 0 +15 (sh) S 1 1 1 34816 1 4210688 115 0 0 0 0 0 0 0 20 0 1 0 330372 4399104 187 18446744073709551615 94374393548800 94374393655428 140722913272992 0 0 0 0 0 65538 0 0 0 17 0 0 0 0 0 0 94374395756424 94374395761184 94374404673536 140722913278928 140722913278959 140722913278959 140722913284080 0 +16 (node) S 15 1 1 34816 1 4210688 6930 103 0 0 32 2 0 0 20 0 10 0 330373 1068478464 8412 18446744073709551615 4194304 29343848 140727228046064 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 1 0 0 31441000 31537208 52584448 140727228050313 140727228050383 140727228050383 140727228055530 0 +27 (sh) S 16 1 1 34816 1 4210688 111 0 0 0 0 0 0 0 20 0 1 0 330410 4399104 193 18446744073709551615 94848235986944 94848236093572 140727019991184 0 0 0 0 0 65538 0 0 0 17 1 0 0 0 0 0 94848238194568 94848238199328 94848261660672 140727019998122 140727019998165 140727019998165 140727020003312 0 +28 (node) S 27 1 1 34816 1 4210688 3576 268 0 0 12 2 0 0 20 0 10 0 330411 930213888 6760 18446744073709551615 4194304 29343848 140726559664992 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 0 0 0 31441000 31537208 32591872 140726559669117 140726559669199 140726559669199 140726559674346 0 +39 (node) S 28 1 1 34816 1 4210688 47517 0 0 0 151 9 0 0 20 0 6 0 330427 985739264 31859 18446744073709551615 4194304 29343848 140737324503920 0 0 0 0 4096 134234626 0 0 0 17 0 0 0 0 0 0 31441000 31537208 51585024 140737324510060 140737324510159 140737324510159 140737324515306 0 +45 (bash) S 0 45 45 34817 50 4210944 752 256 0 0 2 0 0 0 20 0 1 0 331039 18628608 789 18446744073709551615 4194304 5242124 140724425887696 0 0 0 65536 3670020 1266777851 0 0 0 17 1 0 0 0 0 0 7341384 7388228 30310400 140724425891678 140724425891683 140724425891683 140724425891822 0 +cat: /proc/50/stat: No such file or directory +cat: /proc/51/stat: No such file or directory +52 (xargs) S 45 50 45 34817 50 4210688 179 661 0 0 0 0 0 0 20 0 1 0 331544 4608000 346 18446744073709551615 94587588550656 94587588614028 140735223856048 0 0 0 0 0 2560 0 0 0 17 1 0 0 0 0 0 94587590711464 94587590713504 94587603169280 140735223861006 140735223861035 140735223861035 140735223861225 0 diff --git a/node_modules/pstree.remy/tests/fixtures/out2 b/node_modules/pstree.remy/tests/fixtures/out2 new file mode 100644 index 0000000..3b31137 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/out2 @@ -0,0 +1,29 @@ +cat: /proc/4087/stat: No such file or directory +cat: /proc/4088/stat: No such file or directory +1 (init) S 0 1 1 0 -1 4210944 9227 55994 29 319 7 5 68 16 20 0 1 0 1286281 33660928 855 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 0 0 0 17 4 0 0 3 0 0 0 0 0 0 0 0 0 0 +1032 (ntpd) S 1 1032 1032 0 -1 4211008 178 0 1 0 0 0 0 0 20 0 1 0 1287033 25743360 1058 18446744073709551615 1 1 0 0 0 0 0 4096 27207 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +126 (irqbalance) S 1 126 126 0 -1 1077952832 1217 0 0 0 1 6 0 0 20 0 1 0 1286749 20189184 647 18446744073709551615 1 1 0 0 0 0 0 0 3 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +181 (mysqld) S 1 181 181 0 -1 4210944 6399 0 46 0 8 6 0 0 20 0 22 0 1286761 748453888 14476 18446744073709551615 1 1 0 0 0 0 552967 4096 26345 0 0 0 17 4 0 0 10 0 0 0 0 0 0 0 0 0 0 +194 (memcached) S 1 187 187 0 -1 4210944 252 0 4 0 0 0 0 0 20 0 6 0 1286766 333221888 648 18446744073709551615 1 1 0 0 0 0 0 4096 2 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +243 (dbus-daemon) S 1 243 243 0 -1 4211008 67 0 0 0 0 0 0 0 20 0 1 0 1286779 40087552 598 18446744073709551615 1 1 0 0 0 0 0 0 16385 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +254 (rsyslogd) S 1 254 254 0 -1 4211008 107 0 0 0 2 2 0 0 20 0 3 0 1286782 186601472 696 18446744073709551615 1 1 0 0 0 0 0 16781830 1133601 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +265 (systemd-logind) S 1 265 265 0 -1 4210944 276 0 2 0 0 0 0 0 20 0 1 0 1286786 35880960 720 18446744073709551615 1 1 0 0 0 0 0 0 0 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +333 (postgres) S 1 303 303 0 -1 4210688 3169 3466 15 18 0 1 1 1 20 0 1 0 1286817 156073984 5002 18446744073709551615 1 1 0 0 0 0 0 19935232 84487 0 0 0 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0 +359 (postgres) S 333 359 359 0 -1 4210752 90 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16805888 2567 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +360 (postgres) S 333 360 360 0 -1 4210752 119 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791554 16901 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +361 (postgres) S 333 361 361 0 -1 4210752 87 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791552 16903 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +362 (postgres) S 333 362 362 0 -1 4210752 292 0 3 0 0 0 0 0 20 0 1 0 1286822 156930048 1373 18446744073709551615 1 1 0 0 0 0 0 19927040 27271 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +363 (postgres) S 333 363 363 0 -1 4210752 82 0 0 0 0 0 0 0 20 0 1 0 1286822 115924992 887 18446744073709551615 1 1 0 0 0 0 0 16808450 5 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +4050 (npm) S 50 50 50 34817 50 4210688 5109 0 0 0 36 3 0 0 20 0 10 0 1292968 738025472 10051 18446744073709551615 4194304 33165900 140723623956256 0 0 0 0 4096 134300162 0 0 0 17 4 0 0 0 0 0 35263056 35370992 48369664 140723623964237 140723623964294 140723623964294 140723623968712 0 +4060 (sh) S 4050 50 50 34817 50 4210688 121 0 0 0 0 0 0 0 20 0 1 0 1293007 4579328 174 18446744073709551615 94347643936768 94347644049516 140735136055088 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347646148008 94347646153216 94347660038144 140735136063095 140735136063129 140735136063129 140735136071664 0 +4061 (node) S 4060 50 50 34817 50 4210688 6501 0 0 0 42 2 0 0 20 0 6 0 1293008 705769472 10211 18446744073709551615 4194304 33165900 140730532686288 0 0 0 0 4096 2072111671 0 0 0 17 5 0 0 0 0 0 35263056 35370992 45867008 140730532695579 140730532695657 140730532695657 140730532704200 0 +4067 (node) S 4061 50 50 34817 50 4210688 6746 221 0 0 38 3 0 0 20 0 10 0 1293051 738910208 10527 18446744073709551615 4194304 33165900 140724824971632 0 0 0 0 4096 2072111671 0 0 0 17 4 0 0 0 0 0 35263056 35370992 68595712 140724824980995 140724824981063 140724824981063 140724824989640 0 +4079 (sh) S 4067 50 50 34817 50 4210688 118 0 0 0 0 0 0 0 20 0 1 0 1293092 4579328 194 18446744073709551615 94573702131712 94573702244460 140724712357120 0 0 0 0 0 65538 1 0 0 17 4 0 0 0 0 0 94573704342952 94573704348160 94573718511616 140724712361487 140724712361583 140724712361583 140724712370160 0 +4080 (node) S 4079 50 50 34817 50 4210688 2428 0 0 0 8 1 0 0 20 0 6 0 1293093 693059584 7251 18446744073709551615 4194304 33165900 140726023392816 0 0 0 0 4096 134234626 0 0 0 17 5 0 0 0 0 0 35263056 35370992 55226368 140726023396847 140726023396935 140726023396935 140726023405512 0 +4086 (sh) S 4067 50 50 34817 50 4210688 131 244 0 0 0 0 0 0 20 0 1 0 1293143 4579328 200 18446744073709551615 94347550273536 94347550386284 140737219399136 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347552484776 94347552489984 94347554299904 140737219403308 140737219403375 140737219403375 140737219411952 0 +4089 (xargs) S 4086 50 50 34817 50 4210688 333 1924 0 0 0 0 0 0 20 0 1 0 1293143 17600512 477 18446744073709551615 4194304 4232732 140721633759248 0 0 0 0 0 0 1 0 0 17 5 0 0 0 0 0 6331920 6332980 32182272 140721633762891 140721633762920 140721633762920 140721633771497 0 +50 (bash) S 0 50 50 34817 50 4210944 43914 1032463 9 705 44 21 4213 818 20 0 1 0 1286336 42266624 3599 18446744073709551615 4194304 5173404 140732749083280 0 0 0 65536 4 1132560123 1 0 0 17 4 0 0 410 0 0 7273968 7310504 21196800 140732749086490 140732749086517 140732749086517 140732749086702 0 +79 (acpid) S 1 79 79 0 -1 4210752 46 0 0 0 0 0 0 0 20 0 1 0 1286717 4493312 407 18446744073709551615 1 1 0 0 0 0 0 4096 16391 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +83 (sshd) S 1 83 83 0 -1 4210944 354 0 27 0 0 0 0 0 20 0 1 0 1286718 62873600 1290 18446744073709551615 1 1 0 0 0 0 0 4096 81925 0 0 0 17 4 0 0 30 0 0 0 0 0 0 0 0 0 0 +94 (cron) S 1 94 94 0 -1 1077952576 103 449 0 1 0 0 0 0 20 0 1 0 1286743 24240128 559 18446744073709551615 1 1 0 0 0 0 0 0 65537 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +95 (atd) S 1 95 95 0 -1 1077952576 28 0 0 0 0 0 0 0 20 0 1 0 1286743 19615744 41 18446744073709551615 1 1 0 0 0 0 0 0 81923 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/node_modules/pstree.remy/tests/index.test.js b/node_modules/pstree.remy/tests/index.test.js new file mode 100644 index 0000000..0bc3053 --- /dev/null +++ b/node_modules/pstree.remy/tests/index.test.js @@ -0,0 +1,40 @@ +const tap = require('tap'); +const test = tap.test; +const readFile = require('fs').readFileSync; +const spawn = require('child_process').spawn; +const pstree = require('../'); +const { tree, pidsForTree, getStat } = require('../lib/utils'); + +if (process.platform !== 'darwin') { + test('reads from /proc', async t => { + const ps = await getStat(); + t.ok(ps.split('\n').length > 1); + }); +} + +test('tree for live env', async t => { + const pid = 4079; + const fixture = readFile(__dirname + '/fixtures/out2', 'utf8'); + const ps = await tree(fixture); + t.deepEqual(pidsForTree(ps, pid).map(_ => _.PID), ['4080']); +}); + +test('can read full child process tree', t => { + const sub = spawn('node', [`${__dirname}/fixtures/index.js`], { + stdio: 'pipe', + }); + setTimeout(() => { + const pid = sub.pid; + + pstree(pid, (error, children) => { + children.concat([pid]).forEach(p => { + spawn('kill', ['-s', 'SIGTERM', p]); + }); + + console.log(children); + + t.equal(children.length, 2); + t.end(); + }); + }, 1000); +}); diff --git a/node_modules/punycode/LICENSE-MIT.txt b/node_modules/punycode/LICENSE-MIT.txt new file mode 100644 index 0000000..a41e0a7 --- /dev/null +++ b/node_modules/punycode/LICENSE-MIT.txt @@ -0,0 +1,20 @@ +Copyright Mathias Bynens + +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/punycode/README.md b/node_modules/punycode/README.md new file mode 100644 index 0000000..ee2f9d6 --- /dev/null +++ b/node_modules/punycode/README.md @@ -0,0 +1,122 @@ +# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/codecov/c/github/bestiejs/punycode.js.svg)](https://codecov.io/gh/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js) + +Punycode.js is a robust Punycode converter that fully complies to [RFC 3492](https://tools.ietf.org/html/rfc3492) and [RFC 5891](https://tools.ietf.org/html/rfc5891). + +This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm: + +* [The C example code from RFC 3492](https://tools.ietf.org/html/rfc3492#appendix-C) +* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c) +* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c) +* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287) +* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072)) + +This project was [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with Node.js from [v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc) until [v7](https://github.com/nodejs/node/pull/7941) (soft-deprecated). + +The current version supports recent versions of Node.js only. It provides a CommonJS module and an ES6 module. For the old version that offers the same functionality with broader support, including Rhino, Ringo, Narwhal, and web browsers, see [v1.4.1](https://github.com/bestiejs/punycode.js/releases/tag/v1.4.1). + +## Installation + +Via [npm](https://www.npmjs.com/): + +```bash +npm install punycode --save +``` + +In [Node.js](https://nodejs.org/): + +```js +const punycode = require('punycode'); +``` + +## API + +### `punycode.decode(string)` + +Converts a Punycode string of ASCII symbols to a string of Unicode symbols. + +```js +// decode domain name parts +punycode.decode('maana-pta'); // 'mañana' +punycode.decode('--dqo34k'); // '☃-⌘' +``` + +### `punycode.encode(string)` + +Converts a string of Unicode symbols to a Punycode string of ASCII symbols. + +```js +// encode domain name parts +punycode.encode('mañana'); // 'maana-pta' +punycode.encode('☃-⌘'); // '--dqo34k' +``` + +### `punycode.toUnicode(input)` + +Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode. + +```js +// decode domain names +punycode.toUnicode('xn--maana-pta.com'); +// → 'mañana.com' +punycode.toUnicode('xn----dqo34k.com'); +// → '☃-⌘.com' + +// decode email addresses +punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'); +// → 'джумла@джpумлатест.bрфa' +``` + +### `punycode.toASCII(input)` + +Converts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII. + +```js +// encode domain names +punycode.toASCII('mañana.com'); +// → 'xn--maana-pta.com' +punycode.toASCII('☃-⌘.com'); +// → 'xn----dqo34k.com' + +// encode email addresses +punycode.toASCII('джумла@джpумлатест.bрфa'); +// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq' +``` + +### `punycode.ucs2` + +#### `punycode.ucs2.decode(string)` + +Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16. + +```js +punycode.ucs2.decode('abc'); +// → [0x61, 0x62, 0x63] +// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE: +punycode.ucs2.decode('\uD834\uDF06'); +// → [0x1D306] +``` + +#### `punycode.ucs2.encode(codePoints)` + +Creates a string based on an array of numeric code point values. + +```js +punycode.ucs2.encode([0x61, 0x62, 0x63]); +// → 'abc' +punycode.ucs2.encode([0x1D306]); +// → '\uD834\uDF06' +``` + +### `punycode.version` + +A string representing the current Punycode.js version number. + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](https://mathiasbynens.be/) | + +## License + +Punycode.js is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/punycode/package.json b/node_modules/punycode/package.json new file mode 100644 index 0000000..7a69ca7 --- /dev/null +++ b/node_modules/punycode/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "punycode@2.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "punycode@2.1.1", + "_id": "punycode@2.1.1", + "_inBundle": false, + "_integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "_location": "/punycode", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "punycode@2.1.1", + "name": "punycode", + "escapedName": "punycode", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/uri-js" + ], + "_resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "_spec": "2.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + }, + "bugs": { + "url": "https://github.com/bestiejs/punycode.js/issues" + }, + "contributors": [ + { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + } + ], + "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", + "devDependencies": { + "codecov": "^1.0.1", + "istanbul": "^0.4.1", + "mocha": "^2.5.3" + }, + "engines": { + "node": ">=6" + }, + "files": [ + "LICENSE-MIT.txt", + "punycode.js", + "punycode.es6.js" + ], + "homepage": "https://mths.be/punycode", + "jsnext:main": "punycode.es6.js", + "jspm": { + "map": { + "./punycode.js": { + "node": "@node/punycode" + } + } + }, + "keywords": [ + "punycode", + "unicode", + "idn", + "idna", + "dns", + "url", + "domain" + ], + "license": "MIT", + "main": "punycode.js", + "module": "punycode.es6.js", + "name": "punycode", + "repository": { + "type": "git", + "url": "git+https://github.com/bestiejs/punycode.js.git" + }, + "scripts": { + "prepublish": "node scripts/prepublish.js", + "test": "mocha tests" + }, + "version": "2.1.1" +} diff --git a/node_modules/punycode/punycode.es6.js b/node_modules/punycode/punycode.es6.js new file mode 100644 index 0000000..4610bc9 --- /dev/null +++ b/node_modules/punycode/punycode.es6.js @@ -0,0 +1,441 @@ +'use strict'; + +/** Highest positive signed 32-bit float value */ +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + const result = []; + let length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + const parts = string.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + const labels = string.split('.'); + const encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = array => String.fromCodePoint(...array); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +const basicToDigit = function(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function(delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function(input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + let oldi = i; + for (let w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + const digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + + } + + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +const encode = function(input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + let inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + let basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for (let k = base; /* no condition */; k += base) { + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +const toUnicode = function(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +const toASCII = function(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode }; +export default punycode; diff --git a/node_modules/punycode/punycode.js b/node_modules/punycode/punycode.js new file mode 100644 index 0000000..ea61fd0 --- /dev/null +++ b/node_modules/punycode/punycode.js @@ -0,0 +1,440 @@ +'use strict'; + +/** Highest positive signed 32-bit float value */ +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + const result = []; + let length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + const parts = string.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + const labels = string.split('.'); + const encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = array => String.fromCodePoint(...array); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +const basicToDigit = function(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function(delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function(input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + let oldi = i; + for (let w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + const digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + + } + + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +const encode = function(input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + let inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + let basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for (let k = base; /* no condition */; k += base) { + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +const toUnicode = function(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +const toASCII = function(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +module.exports = punycode; diff --git a/node_modules/qs/.editorconfig b/node_modules/qs/.editorconfig new file mode 100644 index 0000000..a4893dd --- /dev/null +++ b/node_modules/qs/.editorconfig @@ -0,0 +1,30 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 160 + +[test/*] +max_line_length = off + +[*.md] +max_line_length = off + +[*.json] +max_line_length = off + +[Makefile] +max_line_length = off + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[LICENSE] +indent_size = 2 +max_line_length = off diff --git a/node_modules/qs/.eslintignore b/node_modules/qs/.eslintignore new file mode 100644 index 0000000..1521c8b --- /dev/null +++ b/node_modules/qs/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/node_modules/qs/.eslintrc b/node_modules/qs/.eslintrc new file mode 100644 index 0000000..e3bde89 --- /dev/null +++ b/node_modules/qs/.eslintrc @@ -0,0 +1,21 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-lines-per-function": [2, { "max": 150 }], + "max-params": [2, 14], + "max-statements": [2, 52], + "multiline-comment-style": 0, + "no-continue": 1, + "no-magic-numbers": 0, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + "operator-linebreak": [2, "before"], + } +} diff --git a/node_modules/qs/CHANGELOG.md b/node_modules/qs/CHANGELOG.md new file mode 100644 index 0000000..50505c4 --- /dev/null +++ b/node_modules/qs/CHANGELOG.md @@ -0,0 +1,256 @@ +## **6.7.0** +- [New] `stringify`/`parse`: add `comma` as an `arrayFormat` option (#276, #219) +- [Fix] correctly parse nested arrays (#212) +- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source, also with an array source +- [Robustness] `stringify`: cache `Object.prototype.hasOwnProperty` +- [Refactor] `utils`: `isBuffer`: small tweak; add tests +- [Refactor] use cached `Array.isArray` +- [Refactor] `parse`/`stringify`: make a function to normalize the options +- [Refactor] `utils`: reduce observable [[Get]]s +- [Refactor] `stringify`/`utils`: cache `Array.isArray` +- [Tests] always use `String(x)` over `x.toString()` +- [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10 +- [Tests] temporarily allow coverage to fail + +## **6.6.0** +- [New] Add support for iso-8859-1, utf8 "sentinel" and numeric entities (#268) +- [New] move two-value combine to a `utils` function (#189) +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` (#260) +- [Fix] `stringify`: do not crash in an obscure combo of `interpretNumericEntities`, a bad custom `decoder`, & `iso-8859-1` +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [Refactor] `parse`: only need to reassign the var once +- [Refactor] `parse`/`stringify`: clean up `charset` options checking; fix defaults +- [Refactor] add missing defaults +- [Refactor] `parse`: one less `concat` call +- [Refactor] `utils`: `compactQueue`: make it explicitly side-effecting +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`, `iconv-lite`, `safe-publish-latest`, `tape` +- [Tests] up to `node` `v10.10`, `v9.11`, `v8.12`, `v6.14`, `v4.9`; pin included builds to LTS + +## **6.5.2** +- [Fix] use `safer-buffer` instead of `Buffer` constructor +- [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230) +- [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify` + +## **6.5.1** +- [Fix] Fix parsing & compacting very deep objects (#224) +- [Refactor] name utils functions +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` +- [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node +- [Tests] Use precise dist for Node.js 0.6 runtime (#225) +- [Tests] make 0.6 required, now that it’s passing +- [Tests] on `node` `v8.2`; fix npm on node 0.6 + +## **6.5.0** +- [New] add `utils.assign` +- [New] pass default encoder/decoder to custom encoder/decoder functions (#206) +- [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213) +- [Fix] Handle stringifying empty objects with addQueryPrefix (#217) +- [Fix] do not mutate `options` argument (#207) +- [Refactor] `parse`: cache index to reuse in else statement (#182) +- [Docs] add various badges to readme (#208) +- [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape` +- [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4 +- [Tests] add `editorconfig-tools` + +## **6.4.0** +- [New] `qs.stringify`: add `encodeValuesOnly` option +- [Fix] follow `allowPrototypes` option during merge (#201, #201) +- [Fix] support keys starting with brackets (#202, #200) +- [Fix] chmod a-x +- [Dev Deps] update `eslint` +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds +- [eslint] reduce warnings + +## **6.3.2** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Dev Deps] update `eslint` +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.3.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape` +- [Tests] on all node minors; improve test matrix +- [Docs] document stringify option `allowDots` (#195) +- [Docs] add empty object and array values example (#195) +- [Docs] Fix minor inconsistency/typo (#192) +- [Docs] document stringify option `sort` (#191) +- [Refactor] `stringify`: throw faster with an invalid encoder +- [Refactor] remove unnecessary escapes (#184) +- Remove contributing.md, since `qs` is no longer part of `hapi` (#183) + +## **6.3.0** +- [New] Add support for RFC 1738 (#174, #173) +- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) +- [Fix] ensure `utils.merge` handles merging two arrays +- [Refactor] only constructors should be capitalized +- [Refactor] capitalized var names are for constructors only +- [Refactor] avoid using a sparse array +- [Robustness] `formats`: cache `String#replace` +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` +- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix +- [Tests] flesh out arrayLimit/arrayFormat tests (#107) +- [Tests] skip Object.create tests when null objects are not available +- [Tests] Turn on eslint for test files (#175) + +## **6.2.3** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.2.2** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## **6.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values +- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` +- [Tests] remove `parallelshell` since it does not reliably report failures +- [Tests] up to `node` `v6.3`, `v5.12` +- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` + +## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) +- [New] pass Buffers to the encoder/decoder directly (#161) +- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) +- [Fix] fix compacting of nested sparse arrays (#150) + +## **6.1.2 +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.1.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) +- [New] allowDots option for `stringify` (#151) +- [Fix] "sort" option should work at a depth of 3 or more (#151) +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## **6.0.4** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.0.3** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) +- Revert ES6 requirement and restore support for node down to v0.8. + +## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) +- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json + +## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) +- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 + +## **5.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values + +## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) +- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string + +## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) +- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional +- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify + +## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) +- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false +- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm + +## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) +- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional + +## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) +- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" + +## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) +- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties +- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost +- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing +- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object +- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option +- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. +- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 +- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 +- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign +- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute + +## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) +- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object # is not a function + +## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) +- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option + +## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) +- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 +- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader + +## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) +- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object + +## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) +- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". + +## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) +- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 + +## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) +- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? +- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 +- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 + +## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) +- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number + +## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) +- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array +- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x + +## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) +- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value +- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty +- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? + +## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) +- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 +- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects + +## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) +- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present +- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays +- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge +- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? + +## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) +- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter + +## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) +- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? +- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit +- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 + +## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) +- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values + +## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) +- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters +- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block + +## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) +- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument +- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed + +## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) +- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted +- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null +- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README + +## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) +- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/node_modules/qs/LICENSE b/node_modules/qs/LICENSE new file mode 100644 index 0000000..d456948 --- /dev/null +++ b/node_modules/qs/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014 Nathan LaFreniere and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not 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 HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/node_modules/qs/README.md b/node_modules/qs/README.md new file mode 100644 index 0000000..8590cfd --- /dev/null +++ b/node_modules/qs/README.md @@ -0,0 +1,570 @@ +# qs [![Version Badge][2]][1] + +[![Build Status][3]][4] +[![dependency status][5]][6] +[![dev dependency status][7]][8] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][11]][1] + +A querystring parsing and stringifying library with some added security. + +Lead Maintainer: [Jordan Harband](https://github.com/ljharb) + +The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). + +## Usage + +```javascript +var qs = require('qs'); +var assert = require('assert'); + +var obj = qs.parse('a=c'); +assert.deepEqual(obj, { a: 'c' }); + +var str = qs.stringify(obj); +assert.equal(str, 'a=c'); +``` + +### Parsing Objects + +[](#preventEval) +```javascript +qs.parse(string, [options]); +``` + +**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. +For example, the string `'foo[bar]=baz'` converts to: + +```javascript +assert.deepEqual(qs.parse('foo[bar]=baz'), { + foo: { + bar: 'baz' + } +}); +``` + +When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: + +```javascript +var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); +assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); +``` + +By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. + +```javascript +var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); +assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); +``` + +URI encoded strings work too: + +```javascript +assert.deepEqual(qs.parse('a%5Bb%5D=c'), { + a: { b: 'c' } +}); +``` + +You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: + +```javascript +assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { + foo: { + bar: { + baz: 'foobarbaz' + } + } +}); +``` + +By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like +`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: + +```javascript +var expected = { + a: { + b: { + c: { + d: { + e: { + f: { + '[g][h][i]': 'j' + } + } + } + } + } + } +}; +var string = 'a[b][c][d][e][f][g][h][i]=j'; +assert.deepEqual(qs.parse(string), expected); +``` + +This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: + +```javascript +var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); +assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); +``` + +The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. + +For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: + +```javascript +var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); +assert.deepEqual(limited, { a: 'b' }); +``` + +To bypass the leading question mark, use `ignoreQueryPrefix`: + +```javascript +var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true }); +assert.deepEqual(prefixed, { a: 'b', c: 'd' }); +``` + +An optional delimiter can also be passed: + +```javascript +var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); +assert.deepEqual(delimited, { a: 'b', c: 'd' }); +``` + +Delimiters can be a regular expression too: + +```javascript +var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); +assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); +``` + +Option `allowDots` can be used to enable dot notation: + +```javascript +var withDots = qs.parse('a.b=c', { allowDots: true }); +assert.deepEqual(withDots, { a: { b: 'c' } }); +``` + +If you have to deal with legacy browsers or services, there's +also support for decoding percent-encoded octets as iso-8859-1: + +```javascript +var oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' }); +assert.deepEqual(oldCharset, { a: '§' }); +``` + +Some services add an initial `utf8=✓` value to forms so that old +Internet Explorer versions are more likely to submit the form as +utf-8. Additionally, the server can check the value against wrong +encodings of the checkmark character and detect that a query string +or `application/x-www-form-urlencoded` body was *not* sent as +utf-8, eg. if the form had an `accept-charset` parameter or the +containing page had a different character set. + +**qs** supports this mechanism via the `charsetSentinel` option. +If specified, the `utf8` parameter will be omitted from the +returned object. It will be used to switch to `iso-8859-1`/`utf-8` +mode depending on how the checkmark is encoded. + +**Important**: When you specify both the `charset` option and the +`charsetSentinel` option, the `charset` will be overridden when +the request contains a `utf8` parameter from which the actual +charset can be deduced. In that sense the `charset` will behave +as the default charset rather than the authoritative charset. + +```javascript +var detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', { + charset: 'iso-8859-1', + charsetSentinel: true +}); +assert.deepEqual(detectedAsUtf8, { a: 'ø' }); + +// Browsers encode the checkmark as ✓ when submitting as iso-8859-1: +var detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', { + charset: 'utf-8', + charsetSentinel: true +}); +assert.deepEqual(detectedAsIso8859_1, { a: 'ø' }); +``` + +If you want to decode the `&#...;` syntax to the actual character, +you can specify the `interpretNumericEntities` option as well: + +```javascript +var detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', { + charset: 'iso-8859-1', + interpretNumericEntities: true +}); +assert.deepEqual(detectedAsIso8859_1, { a: '☺' }); +``` + +It also works when the charset has been detected in `charsetSentinel` +mode. + +### Parsing Arrays + +**qs** can also parse arrays using a similar `[]` notation: + +```javascript +var withArray = qs.parse('a[]=b&a[]=c'); +assert.deepEqual(withArray, { a: ['b', 'c'] }); +``` + +You may specify an index as well: + +```javascript +var withIndexes = qs.parse('a[1]=c&a[0]=b'); +assert.deepEqual(withIndexes, { a: ['b', 'c'] }); +``` + +Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number +to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving +their order: + +```javascript +var noSparse = qs.parse('a[1]=b&a[15]=c'); +assert.deepEqual(noSparse, { a: ['b', 'c'] }); +``` + +Note that an empty string is also a value, and will be preserved: + +```javascript +var withEmptyString = qs.parse('a[]=&a[]=b'); +assert.deepEqual(withEmptyString, { a: ['', 'b'] }); + +var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); +assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); +``` + +**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will +instead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array. + +```javascript +var withMaxIndex = qs.parse('a[100]=b'); +assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); +``` + +This limit can be overridden by passing an `arrayLimit` option: + +```javascript +var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); +assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); +``` + +To disable array parsing entirely, set `parseArrays` to `false`. + +```javascript +var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); +assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); +``` + +If you mix notations, **qs** will merge the two items into an object: + +```javascript +var mixedNotation = qs.parse('a[0]=b&a[b]=c'); +assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); +``` + +You can also create arrays of objects: + +```javascript +var arraysOfObjects = qs.parse('a[][b]=c'); +assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); +``` + +Some people use comma to join array, **qs** can parse it: +```javascript +var arraysOfObjects = qs.parse('a=b,c', { comma: true }) +assert.deepEqual(arraysOfObjects, { a: ['b', 'c'] }) +``` +(_this cannot convert nested objects, such as `a={b:1},{c:d}`_) + +### Stringifying + +[](#preventEval) +```javascript +qs.stringify(object, [options]); +``` + +When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: + +```javascript +assert.equal(qs.stringify({ a: 'b' }), 'a=b'); +assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); +``` + +This encoding can be disabled by setting the `encode` option to `false`: + +```javascript +var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); +assert.equal(unencoded, 'a[b]=c'); +``` + +Encoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`: +```javascript +var encodedValues = qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } +); +assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'); +``` + +This encoding can also be replaced by a custom encoding method set as `encoder` option: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { + // Passed in values `a`, `b`, `c` + return // Return encoded string +}}) +``` + +_(Note: the `encoder` option does not apply if `encode` is `false`)_ + +Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str) { + // Passed in values `x`, `z` + return // Return decoded string +}}) +``` + +Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. + +When arrays are stringified, by default they are given explicit indices: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }); +// 'a[0]=b&a[1]=c&a[2]=d' +``` + +You may override this by setting the `indices` option to `false`: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); +// 'a=b&a=c&a=d' +``` + +You may use the `arrayFormat` option to specify the format of the output array: + +```javascript +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) +// 'a[0]=b&a[1]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) +// 'a[]=b&a[]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) +// 'a=b&a=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' }) +// 'a=b,c' +``` + +When objects are stringified, by default they use bracket notation: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }); +// 'a[b][c]=d&a[b][e]=f' +``` + +You may override this to use dot notation by setting the `allowDots` option to `true`: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true }); +// 'a.b.c=d&a.b.e=f' +``` + +Empty strings and null values will omit the value, but the equals sign (=) remains in place: + +```javascript +assert.equal(qs.stringify({ a: '' }), 'a='); +``` + +Key with no values (such as an empty object or array) will return nothing: + +```javascript +assert.equal(qs.stringify({ a: [] }), ''); +assert.equal(qs.stringify({ a: {} }), ''); +assert.equal(qs.stringify({ a: [{}] }), ''); +assert.equal(qs.stringify({ a: { b: []} }), ''); +assert.equal(qs.stringify({ a: { b: {}} }), ''); +``` + +Properties that are set to `undefined` will be omitted entirely: + +```javascript +assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); +``` + +The query string may optionally be prepended with a question mark: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d'); +``` + +The delimiter may be overridden with stringify as well: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); +``` + +If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: + +```javascript +var date = new Date(7); +assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); +assert.equal( + qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), + 'a=7' +); +``` + +You may use the `sort` option to affect the order of parameter keys: + +```javascript +function alphabeticalSort(a, b) { + return a.localeCompare(b); +} +assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y'); +``` + +Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. +If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you +pass an array, it will be used to select properties and array indices for stringification: + +```javascript +function filterFunc(prefix, value) { + if (prefix == 'b') { + // Return an `undefined` value to omit a property. + return; + } + if (prefix == 'e[f]') { + return value.getTime(); + } + if (prefix == 'e[g][0]') { + return value * 2; + } + return value; +} +qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); +// 'a=b&c=d&e[f]=123&e[g][0]=4' +qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); +// 'a=b&e=f' +qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); +// 'a[0]=b&a[2]=d' +``` + +### Handling of `null` values + +By default, `null` values are treated like empty strings: + +```javascript +var withNull = qs.stringify({ a: null, b: '' }); +assert.equal(withNull, 'a=&b='); +``` + +Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. + +```javascript +var equalsInsensitive = qs.parse('a&b='); +assert.deepEqual(equalsInsensitive, { a: '', b: '' }); +``` + +To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` +values have no `=` sign: + +```javascript +var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); +assert.equal(strictNull, 'a&b='); +``` + +To parse values without `=` back to `null` use the `strictNullHandling` flag: + +```javascript +var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); +assert.deepEqual(parsedStrictNull, { a: null, b: '' }); +``` + +To completely skip rendering keys with `null` values, use the `skipNulls` flag: + +```javascript +var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); +assert.equal(nullsSkipped, 'a=b'); +``` + +If you're communicating with legacy systems, you can switch to `iso-8859-1` +using the `charset` option: + +```javascript +var iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }); +assert.equal(iso, '%E6=%E6'); +``` + +Characters that don't exist in `iso-8859-1` will be converted to numeric +entities, similar to what browsers do: + +```javascript +var numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }); +assert.equal(numeric, 'a=%26%239786%3B'); +``` + +You can use the `charsetSentinel` option to announce the character by +including an `utf8=✓` parameter with the proper encoding if the checkmark, +similar to what Ruby on Rails and others do when submitting forms. + +```javascript +var sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true }); +assert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA'); + +var isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }); +assert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6'); +``` + +### Dealing with special character sets + +By default the encoding and decoding of characters is done in `utf-8`, +and `iso-8859-1` support is also built in via the `charset` parameter. + +If you wish to encode querystrings to a different character set (i.e. +[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the +[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: + +```javascript +var encoder = require('qs-iconv/encoder')('shift_jis'); +var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder }); +assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); +``` + +This also works for decoding of query strings: + +```javascript +var decoder = require('qs-iconv/decoder')('shift_jis'); +var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); +assert.deepEqual(obj, { a: 'こんにちは!' }); +``` + +### RFC 3986 and RFC 1738 space encoding + +RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. +In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. + +``` +assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); +``` + +[1]: https://npmjs.org/package/qs +[2]: http://versionbadg.es/ljharb/qs.svg +[3]: https://api.travis-ci.org/ljharb/qs.svg +[4]: https://travis-ci.org/ljharb/qs +[5]: https://david-dm.org/ljharb/qs.svg +[6]: https://david-dm.org/ljharb/qs +[7]: https://david-dm.org/ljharb/qs/dev-status.svg +[8]: https://david-dm.org/ljharb/qs?type=dev +[9]: https://ci.testling.com/ljharb/qs.png +[10]: https://ci.testling.com/ljharb/qs +[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: http://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/qs.svg +[downloads-url]: http://npm-stat.com/charts.html?package=qs diff --git a/node_modules/qs/dist/qs.js b/node_modules/qs/dist/qs.js new file mode 100644 index 0000000..17f4e60 --- /dev/null +++ b/node_modules/qs/dist/qs.js @@ -0,0 +1,782 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i -1) { + val = val.split(','); + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + depth: typeof opts.depth === 'number' ? opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; + +},{"./utils":5}],4:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + formatter: formats.formatters[formats['default']], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = obj.join(','); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (isArray(obj)) { + pushToArray(values, stringify( + obj[key], + typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } else { + pushToArray(values, stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.formatter, + options.encodeValuesOnly, + options.charset + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; + +},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ +'use strict'; + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; + +},{}]},{},[2])(2) +}); diff --git a/node_modules/qs/lib/formats.js b/node_modules/qs/lib/formats.js new file mode 100644 index 0000000..df45997 --- /dev/null +++ b/node_modules/qs/lib/formats.js @@ -0,0 +1,18 @@ +'use strict'; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +module.exports = { + 'default': 'RFC3986', + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return value; + } + }, + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; diff --git a/node_modules/qs/lib/index.js b/node_modules/qs/lib/index.js new file mode 100644 index 0000000..0d6a97d --- /dev/null +++ b/node_modules/qs/lib/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var stringify = require('./stringify'); +var parse = require('./parse'); +var formats = require('./formats'); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; diff --git a/node_modules/qs/lib/parse.js b/node_modules/qs/lib/parse.js new file mode 100644 index 0000000..d81628b --- /dev/null +++ b/node_modules/qs/lib/parse.js @@ -0,0 +1,242 @@ +'use strict'; + +var utils = require('./utils'); + +var has = Object.prototype.hasOwnProperty; + +var defaults = { + allowDots: false, + allowPrototypes: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decoder: utils.decode, + delimiter: '&', + depth: 5, + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictNullHandling: false +}; + +var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); +}; + +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset); + val = options.decoder(part.slice(pos + 1), defaults.decoder, charset); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (val && options.comma && val.indexOf(',') > -1) { + val = val.split(','); + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + depth: typeof opts.depth === 'number' ? opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; diff --git a/node_modules/qs/lib/stringify.js b/node_modules/qs/lib/stringify.js new file mode 100644 index 0000000..7455049 --- /dev/null +++ b/node_modules/qs/lib/stringify.js @@ -0,0 +1,269 @@ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + formatter: formats.formatters[formats['default']], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = obj.join(','); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (isArray(obj)) { + pushToArray(values, stringify( + obj[key], + typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } else { + pushToArray(values, stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.formatter, + options.encodeValuesOnly, + options.charset + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; diff --git a/node_modules/qs/lib/utils.js b/node_modules/qs/lib/utils.js new file mode 100644 index 0000000..1b219cd --- /dev/null +++ b/node_modules/qs/lib/utils.js @@ -0,0 +1,230 @@ +'use strict'; + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; diff --git a/node_modules/qs/package.json b/node_modules/qs/package.json new file mode 100644 index 0000000..d8937d1 --- /dev/null +++ b/node_modules/qs/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "qs@6.7.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "qs@6.7.0", + "_id": "qs@6.7.0", + "_inBundle": false, + "_integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "_location": "/qs", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "qs@6.7.0", + "name": "qs", + "escapedName": "qs", + "rawSpec": "6.7.0", + "saveSpec": null, + "fetchSpec": "6.7.0" + }, + "_requiredBy": [ + "/body-parser", + "/express" + ], + "_resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "_spec": "6.7.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/ljharb/qs/issues" + }, + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + } + ], + "dependencies": {}, + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "devDependencies": { + "@ljharb/eslint-config": "^13.1.1", + "browserify": "^16.2.3", + "covert": "^1.1.1", + "editorconfig-tools": "^0.1.1", + "eslint": "^5.15.3", + "evalmd": "^0.0.17", + "for-each": "^0.3.3", + "iconv-lite": "^0.4.24", + "mkdirp": "^0.5.1", + "object-inspect": "^1.6.0", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^1.1.2", + "safer-buffer": "^2.1.2", + "tape": "^4.10.1" + }, + "engines": { + "node": ">=0.6" + }, + "homepage": "https://github.com/ljharb/qs", + "keywords": [ + "querystring", + "qs", + "query", + "url", + "parse", + "stringify" + ], + "license": "BSD-3-Clause", + "main": "lib/index.js", + "name": "qs", + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/qs.git" + }, + "scripts": { + "coverage": "covert test", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js", + "lint": "eslint lib/*.js test/*.js", + "postlint": "editorconfig-tools check * lib/* test/*", + "prepublish": "safe-publish-latest && npm run dist", + "pretest": "npm run --silent readme && npm run --silent lint", + "readme": "evalmd README.md", + "test": "npm run --silent coverage", + "tests-only": "node test" + }, + "version": "6.7.0" +} diff --git a/node_modules/qs/test/.eslintrc b/node_modules/qs/test/.eslintrc new file mode 100644 index 0000000..9ebbb92 --- /dev/null +++ b/node_modules/qs/test/.eslintrc @@ -0,0 +1,17 @@ +{ + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "consistent-return": 2, + "function-paren-newline": 0, + "max-lines": 0, + "max-lines-per-function": 0, + "max-nested-callbacks": [2, 3], + "max-statements": 0, + "no-buffer-constructor": 0, + "no-extend-native": 0, + "no-magic-numbers": 0, + "object-curly-newline": 0, + "sort-keys": 0 + } +} diff --git a/node_modules/qs/test/index.js b/node_modules/qs/test/index.js new file mode 100644 index 0000000..5e6bc8f --- /dev/null +++ b/node_modules/qs/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('./parse'); + +require('./stringify'); + +require('./utils'); diff --git a/node_modules/qs/test/parse.js b/node_modules/qs/test/parse.js new file mode 100644 index 0000000..8967789 --- /dev/null +++ b/node_modules/qs/test/parse.js @@ -0,0 +1,676 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('parse()', function (t) { + t.test('parses a simple string', function (st) { + st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); + st.deepEqual(qs.parse('foo=c++'), { foo: 'c ' }); + st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); + st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); + st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); + st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); + st.deepEqual(qs.parse('foo'), { foo: '' }); + st.deepEqual(qs.parse('foo='), { foo: '' }); + st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); + st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); + st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); + st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); + st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); + st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); + st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); + st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { + cht: 'p3', + chd: 't:60,40', + chs: '250x100', + chl: 'Hello|World' + }); + st.end(); + }); + + t.test('allows enabling dot notation', function (st) { + st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); + st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); + t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); + t.deepEqual( + qs.parse('a[b][c][d][e][f][g][h]=i'), + { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, + 'defaults to a depth of 5' + ); + + t.test('only parses one level when depth = 1', function (st) { + st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); + st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); + st.end(); + }); + + t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); + + t.test('parses an explicit array', function (st) { + st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); + st.end(); + }); + + t.test('parses a mix of simple and explicit arrays', function (st) { + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + + st.end(); + }); + + t.test('parses a nested array', function (st) { + st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); + st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); + st.end(); + }); + + t.test('allows to specify array indices', function (st) { + st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); + st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); + st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); + st.end(); + }); + + t.test('limits specific array indices to arrayLimit', function (st) { + st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); + st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); + + t.test('supports encoded = signs', function (st) { + st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); + st.end(); + }); + + t.test('is ok with url encoded strings', function (st) { + st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); + st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); + st.end(); + }); + + t.test('allows brackets in the value', function (st) { + st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); + st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); + st.end(); + }); + + t.test('allows empty values', function (st) { + st.deepEqual(qs.parse(''), {}); + st.deepEqual(qs.parse(null), {}); + st.deepEqual(qs.parse(undefined), {}); + st.end(); + }); + + t.test('transforms arrays to objects', function (st) { + st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } }); + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); + st.end(); + }); + + t.test('transforms arrays to objects (dot notation)', function (st) { + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); + st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); + st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + st.end(); + }); + + t.test('correctly prunes undefined values when converting an array to an object', function (st) { + st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); + st.end(); + }); + + t.test('supports malformed uri characters', function (st) { + st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); + st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); + st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); + st.end(); + }); + + t.test('doesn\'t produce empty keys', function (st) { + st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); + st.end(); + }); + + t.test('cannot access Object prototype', function (st) { + qs.parse('constructor[prototype][bad]=bad'); + qs.parse('bad[constructor][prototype][bad]=bad'); + st.equal(typeof Object.prototype.bad, 'undefined'); + st.end(); + }); + + t.test('parses arrays of objects', function (st) { + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); + st.end(); + }); + + t.test('allows for empty strings in arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); + + st.deepEqual( + qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 20 + array indices: null then empty string works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 0 + array brackets: null then empty string works' + ); + + st.deepEqual( + qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 20 + array indices: empty string then null works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 0 + array brackets: empty string then null works' + ); + + st.deepEqual( + qs.parse('a[]=&a[]=b&a[]=c'), + { a: ['', 'b', 'c'] }, + 'array brackets: empty strings work' + ); + st.end(); + }); + + t.test('compacts sparse arrays', function (st) { + st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); + st.end(); + }); + + t.test('parses semi-parsed strings', function (st) { + st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); + st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); + st.end(); + }); + + t.test('parses buffers correctly', function (st) { + var b = SaferBuffer.from('test'); + st.deepEqual(qs.parse({ a: b }), { a: b }); + st.end(); + }); + + t.test('parses jquery-param strings', function (st) { + // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8' + var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8'; + var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] }; + st.deepEqual(qs.parse(encoded), expected); + st.end(); + }); + + t.test('continues parsing when no parent is found', function (st) { + st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); + st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); + st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); + st.end(); + }); + + t.test('does not error when parsing a very long array', function (st) { + var str = 'a[]=a'; + while (Buffer.byteLength(str) < 128 * 1024) { + str = str + '&' + str; + } + + st.doesNotThrow(function () { + qs.parse(str); + }); + + st.end(); + }); + + t.test('should not throw when a native prototype has an enumerable property', function (st) { + Object.prototype.crash = ''; + Array.prototype.crash = ''; + st.doesNotThrow(qs.parse.bind(null, 'a=b')); + st.deepEqual(qs.parse('a=b'), { a: 'b' }); + st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + delete Object.prototype.crash; + delete Array.prototype.crash; + st.end(); + }); + + t.test('parses a string with an alternative string delimiter', function (st) { + st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('parses a string with an alternative RegExp delimiter', function (st) { + st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not use non-splittable objects as delimiters', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding parameter limit', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); + st.end(); + }); + + t.test('allows setting the parameter limit to Infinity', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding array limit', function (st) { + st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); + st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows disabling array parsing', function (st) { + var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false }); + st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } }); + st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array'); + + var emptyBrackets = qs.parse('a[]=b', { parseArrays: false }); + st.deepEqual(emptyBrackets, { a: { 0: 'b' } }); + st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array'); + + st.end(); + }); + + t.test('allows for query string prefix', function (st) { + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' }); + st.end(); + }); + + t.test('parses an object', function (st) { + var input = { + 'user[name]': { 'pop[bob]': 3 }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses string with comma as array divider', function (st) { + st.deepEqual(qs.parse('foo=bar,tee', { comma: true }), { foo: ['bar', 'tee'] }); + st.deepEqual(qs.parse('foo[bar]=coffee,tee', { comma: true }), { foo: { bar: ['coffee', 'tee'] } }); + st.deepEqual(qs.parse('foo=', { comma: true }), { foo: '' }); + st.deepEqual(qs.parse('foo', { comma: true }), { foo: '' }); + st.deepEqual(qs.parse('foo', { comma: true, strictNullHandling: true }), { foo: null }); + st.end(); + }); + + t.test('parses an object in dot notation', function (st) { + var input = { + 'user.name': { 'pop[bob]': 3 }, + 'user.email.': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input, { allowDots: true }); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object and not child values', function (st) { + var input = { + 'user[name]': { 'pop[bob]': { test: 3 } }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': { test: 3 } }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('does not blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.parse('a=b&c=d'); + global.Buffer = tempBuffer; + st.deepEqual(result, { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + var parsed; + + st.doesNotThrow(function () { + parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + st.equal('bar' in parsed.foo, true); + st.equal('baz' in parsed.foo, true); + st.equal(parsed.foo.bar, 'baz'); + st.deepEqual(parsed.foo.baz, a); + st.end(); + }); + + t.test('does not crash when parsing deep objects', function (st) { + var parsed; + var str = 'foo'; + + for (var i = 0; i < 5000; i++) { + str += '[p]'; + } + + str += '=bar'; + + st.doesNotThrow(function () { + parsed = qs.parse(str, { depth: 5000 }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + + var depth = 0; + var ref = parsed.foo; + while ((ref = ref.p)) { + depth += 1; + } + + st.equal(depth, 5000, 'parsed is 5000 properties deep'); + + st.end(); + }); + + t.test('parses null objects correctly', { skip: !Object.create }, function (st) { + var a = Object.create(null); + a.b = 'c'; + + st.deepEqual(qs.parse(a), { b: 'c' }); + var result = qs.parse({ a: a }); + st.equal('a' in result, true, 'result has "a" property'); + st.deepEqual(result.a, a); + st.end(); + }); + + t.test('parses dates correctly', function (st) { + var now = new Date(); + st.deepEqual(qs.parse({ a: now }), { a: now }); + st.end(); + }); + + t.test('parses regular expressions correctly', function (st) { + var re = /^test$/; + st.deepEqual(qs.parse({ a: re }), { a: re }); + st.end(); + }); + + t.test('does not allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {}); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {}); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: false }), + {}, + 'bare "toString" results in {}' + ); + + st.end(); + }); + + t.test('can allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: true }), + { toString: '' }, + 'bare "toString" results in { toString: "" }' + ); + + st.end(); + }); + + t.test('params starting with a closing bracket', function (st) { + st.deepEqual(qs.parse(']=toString'), { ']': 'toString' }); + st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' }); + st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' }); + st.end(); + }); + + t.test('params starting with a starting bracket', function (st) { + st.deepEqual(qs.parse('[=toString'), { '[': 'toString' }); + st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' }); + st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' }); + st.end(); + }); + + t.test('add keys to objects', function (st) { + st.deepEqual( + qs.parse('a[b]=c&a=d'), + { a: { b: 'c', d: true } }, + 'can add keys to objects' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString'), + { a: { b: 'c' } }, + 'can not overwrite prototype' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { allowPrototypes: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with allowPrototypes true' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { plainObjects: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('can return null objects', { skip: !Object.create }, function (st) { + var expected = Object.create(null); + expected.a = Object.create(null); + expected.a.b = 'c'; + expected.a.hasOwnProperty = 'd'; + st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); + st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); + var expectedArray = Object.create(null); + expectedArray.a = Object.create(null); + expectedArray.a[0] = 'b'; + expectedArray.a.c = 'd'; + st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); + st.end(); + }); + + t.test('can parse with custom encoding', function (st) { + st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { + decoder: function (str) { + var reg = /%([0-9A-F]{2})/ig; + var result = []; + var parts = reg.exec(str); + while (parts) { + result.push(parseInt(parts[1], 16)); + parts = reg.exec(str); + } + return String(iconv.decode(SaferBuffer.from(result), 'shift_jis')); + } + }), { 県: '大阪府' }); + st.end(); + }); + + t.test('receives the default decoder as a second argument', function (st) { + st.plan(1); + qs.parse('a', { + decoder: function (str, defaultDecoder) { + st.equal(defaultDecoder, utils.decode); + } + }); + st.end(); + }); + + t.test('throws error with wrong decoder', function (st) { + st['throws'](function () { + qs.parse({}, { decoder: 'string' }); + }, new TypeError('Decoder has to be a function.')); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.parse('a[b]=true', options); + st.deepEqual(options, {}); + st.end(); + }); + + t.test('throws if an invalid charset is specified', function (st) { + st['throws'](function () { + qs.parse('a=b', { charset: 'foobar' }); + }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); + st.end(); + }); + + t.test('parses an iso-8859-1 string if asked to', function (st) { + st.deepEqual(qs.parse('%A2=%BD', { charset: 'iso-8859-1' }), { '¢': '½' }); + st.end(); + }); + + var urlEncodedCheckmarkInUtf8 = '%E2%9C%93'; + var urlEncodedOSlashInUtf8 = '%C3%B8'; + var urlEncodedNumCheckmark = '%26%2310003%3B'; + var urlEncodedNumSmiley = '%26%239786%3B'; + + t.test('prefers an utf-8 charset specified by the utf8 sentinel to a default charset of iso-8859-1', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'iso-8859-1' }), { ø: 'ø' }); + st.end(); + }); + + t.test('prefers an iso-8859-1 charset specified by the utf8 sentinel to a default charset of utf-8', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { 'ø': 'ø' }); + st.end(); + }); + + t.test('does not require the utf8 sentinel to be defined before the parameters whose decoding it affects', function (st) { + st.deepEqual(qs.parse('a=' + urlEncodedOSlashInUtf8 + '&utf8=' + urlEncodedNumCheckmark, { charsetSentinel: true, charset: 'utf-8' }), { a: 'ø' }); + st.end(); + }); + + t.test('should ignore an utf8 sentinel with an unknown value', function (st) { + st.deepEqual(qs.parse('utf8=foo&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { ø: 'ø' }); + st.end(); + }); + + t.test('uses the utf8 sentinel to switch to utf-8 when no default charset is given', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { ø: 'ø' }); + st.end(); + }); + + t.test('uses the utf8 sentinel to switch to iso-8859-1 when no default charset is given', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { 'ø': 'ø' }); + st.end(); + }); + + t.test('interprets numeric entities in iso-8859-1 when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1', interpretNumericEntities: true }), { foo: '☺' }); + st.end(); + }); + + t.test('handles a custom decoder returning `null`, in the `iso-8859-1` charset, when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=&bar=' + urlEncodedNumSmiley, { + charset: 'iso-8859-1', + decoder: function (str, defaultDecoder, charset) { + return str ? defaultDecoder(str, defaultDecoder, charset) : null; + }, + interpretNumericEntities: true + }), { foo: null, bar: '☺' }); + st.end(); + }); + + t.test('does not interpret numeric entities in iso-8859-1 when `interpretNumericEntities` is absent', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1' }), { foo: '☺' }); + st.end(); + }); + + t.test('does not interpret numeric entities when the charset is utf-8, even when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'utf-8', interpretNumericEntities: true }), { foo: '☺' }); + st.end(); + }); + + t.test('does not interpret %uXXXX syntax in iso-8859-1 mode', function (st) { + st.deepEqual(qs.parse('%u263A=%u263A', { charset: 'iso-8859-1' }), { '%u263A': '%u263A' }); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/qs/test/stringify.js b/node_modules/qs/test/stringify.js new file mode 100644 index 0000000..53041c2 --- /dev/null +++ b/node_modules/qs/test/stringify.js @@ -0,0 +1,679 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('stringify()', function (t) { + t.test('stringifies a querystring object', function (st) { + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: 1 }), 'a=1'); + st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); + st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); + st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); + st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); + st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90'); + st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7'); + st.end(); + }); + + t.test('stringifies falsy values', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(null, { strictNullHandling: true }), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(0), ''); + st.end(); + }); + + t.test('adds query prefix', function (st) { + st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b'); + st.end(); + }); + + t.test('with query prefix, outputs blank string given an empty object', function (st) { + st.equal(qs.stringify({}, { addQueryPrefix: true }), ''); + st.end(); + }); + + t.test('stringifies nested falsy values', function (st) { + st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D='); + st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D'); + st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies a nested object', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies a nested object with dots notation', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); + st.end(); + }); + + t.test('stringifies an array value', function (st) { + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), + 'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'comma' }), + 'a=b%2Cc%2Cd', + 'comma => comma' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'default => indices' + ); + st.end(); + }); + + t.test('omits nulls when asked', function (st) { + st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); + st.end(); + }); + + t.test('omits nested nulls when asked', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('omits array indices when asked', function (st) { + st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); + st.end(); + }); + + t.test('stringifies a nested array value', function (st) { + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'comma' }), 'a%5Bb%5D=c%2Cd'); // a[b]=c,d + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.end(); + }); + + t.test('stringifies a nested array value with dots notation', function (st) { + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a.b[0]=c&a.b[1]=d', + 'indices: stringifies with dots + indices' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a.b[]=c&a.b[]=d', + 'brackets: stringifies with dots + brackets' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'comma' } + ), + 'a.b=c,d', + 'comma: stringifies with dots + comma' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false } + ), + 'a.b[0]=c&a.b[1]=d', + 'default: stringifies with dots + indices' + ); + st.end(); + }); + + t.test('stringifies an object inside an array', function (st) { + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D=c', // a[0][b]=c + 'indices => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D=c', // a[][b]=c + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }), + 'a%5B0%5D%5Bb%5D=c', + 'default => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'indices => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', + 'brackets => brackets' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an array with mixed objects and primitives', function (st) { + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), + 'a[][b]=1&a[]=2&a[]=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an object inside an array with dots notation', function (st) { + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b=c', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false } + ), + 'a[0].b=c', + 'default => indices' + ); + + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b.c[0]=1', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b.c[]=1', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false } + ), + 'a[0].b.c[0]=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('does not omit object keys when indices = false', function (st) { + st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when indices=true', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); + st.end(); + }); + + t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); + st.end(); + }); + + t.test('stringifies a complicated object', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies an empty value', function (st) { + st.equal(qs.stringify({ a: '' }), 'a='); + st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); + + st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); + st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); + + st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); + + st.end(); + }); + + t.test('stringifies a null object', { skip: !Object.create }, function (st) { + var obj = Object.create(null); + obj.a = 'b'; + st.equal(qs.stringify(obj), 'a=b'); + st.end(); + }); + + t.test('returns an empty string for invalid input', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(''), ''); + st.end(); + }); + + t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { + var obj = { a: Object.create(null) }; + + obj.a.b = 'c'; + st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('drops keys with a value of undefined', function (st) { + st.equal(qs.stringify({ a: undefined }), ''); + + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); + st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); + st.end(); + }); + + t.test('url encodes values', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('stringifies a date', function (st) { + var now = new Date(); + var str = 'a=' + encodeURIComponent(now.toISOString()); + st.equal(qs.stringify({ a: now }), str); + st.end(); + }); + + t.test('stringifies the weird object from qs', function (st) { + st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); + st.end(); + }); + + t.test('skips properties that are part of the object prototype', function (st) { + Object.prototype.crash = 'test'; + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + delete Object.prototype.crash; + st.end(); + }); + + t.test('stringifies boolean values', function (st) { + st.equal(qs.stringify({ a: true }), 'a=true'); + st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); + st.equal(qs.stringify({ b: false }), 'b=false'); + st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies buffer values', function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test'); + st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test'); + st.end(); + }); + + t.test('stringifies an object using an alternative delimiter', function (st) { + st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); + st.end(); + }); + + t.test('doesn\'t blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.stringify({ a: 'b', c: 'd' }); + global.Buffer = tempBuffer; + st.equal(result, 'a=b&c=d'); + st.end(); + }); + + t.test('selects properties when filter=array', function (st) { + st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); + st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); + + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } + ), + 'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2] } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('supports custom representations when filter=function', function (st) { + var calls = 0; + var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; + var filterFunc = function (prefix, value) { + calls += 1; + if (calls === 1) { + st.equal(prefix, '', 'prefix is empty'); + st.equal(value, obj); + } else if (prefix === 'c') { + return void 0; + } else if (value instanceof Date) { + st.equal(prefix, 'e[f]'); + return value.getTime(); + } + return value; + }; + + st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); + st.equal(calls, 5); + st.end(); + }); + + t.test('can disable uri encoding', function (st) { + st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); + st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); + st.end(); + }); + + t.test('can sort the keys', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); + st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); + st.end(); + }); + + t.test('can sort the keys at depth 3 or more too', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: sort, encode: false } + ), + 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' + ); + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: null, encode: false } + ), + 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' + ); + st.end(); + }); + + t.test('can stringify with custom encoding', function (st) { + st.equal(qs.stringify({ 県: '大阪府', '': '' }, { + encoder: function (str) { + if (str.length === 0) { + return ''; + } + var buf = iconv.encode(str, 'shiftjis'); + var result = []; + for (var i = 0; i < buf.length; ++i) { + result.push(buf.readUInt8(i).toString(16)); + } + return '%' + result.join('%'); + } + }), '%8c%a7=%91%e5%8d%e3%95%7b&='); + st.end(); + }); + + t.test('receives the default encoder as a second argument', function (st) { + st.plan(2); + qs.stringify({ a: 1 }, { + encoder: function (str, defaultEncoder) { + st.equal(defaultEncoder, utils.encode); + } + }); + st.end(); + }); + + t.test('throws error with wrong encoder', function (st) { + st['throws'](function () { + qs.stringify({}, { encoder: 'string' }); + }, new TypeError('Encoder has to be a function.')); + st.end(); + }); + + t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, { + encoder: function (buffer) { + if (typeof buffer === 'string') { + return buffer; + } + return String.fromCharCode(buffer.readUInt8(0) + 97); + } + }), 'a=b'); + st.end(); + }); + + t.test('serializeDate option', function (st) { + var date = new Date(); + st.equal( + qs.stringify({ a: date }), + 'a=' + date.toISOString().replace(/:/g, '%3A'), + 'default is toISOString' + ); + + var mutatedDate = new Date(); + mutatedDate.toISOString = function () { + throw new SyntaxError(); + }; + st['throws'](function () { + mutatedDate.toISOString(); + }, SyntaxError); + st.equal( + qs.stringify({ a: mutatedDate }), + 'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), + 'toISOString works even when method is not locally present' + ); + + var specificDate = new Date(6); + st.equal( + qs.stringify( + { a: specificDate }, + { serializeDate: function (d) { return d.getTime() * 7; } } + ), + 'a=42', + 'custom serializeDate function called' + ); + + st.end(); + }); + + t.test('RFC 1738 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); + st.end(); + }); + + t.test('RFC 3986 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('Edge cases and unknown formats', function (st) { + ['UFO1234', false, 1234, null, {}, []].forEach( + function (format) { + st['throws']( + function () { + qs.stringify({ a: 'b c' }, { format: format }); + }, + new TypeError('Unknown format option provided.') + ); + } + ); + st.end(); + }); + + t.test('encodeValuesOnly', function (st) { + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } + ), + 'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h' + ); + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] } + ), + 'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h' + ); + st.end(); + }); + + t.test('encodeValuesOnly - strictNullHandling', function (st) { + st.equal( + qs.stringify( + { a: { b: null } }, + { encodeValuesOnly: true, strictNullHandling: true } + ), + 'a[b]' + ); + st.end(); + }); + + t.test('throws if an invalid charset is specified', function (st) { + st['throws'](function () { + qs.stringify({ a: 'b' }, { charset: 'foobar' }); + }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); + st.end(); + }); + + t.test('respects a charset of iso-8859-1', function (st) { + st.equal(qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }), '%E6=%E6'); + st.end(); + }); + + t.test('encodes unrepresentable chars as numeric entities in iso-8859-1 mode', function (st) { + st.equal(qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }), 'a=%26%239786%3B'); + st.end(); + }); + + t.test('respects an explicit charset of utf-8 (the default)', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charset: 'utf-8' }), 'a=%C3%A6'); + st.end(); + }); + + t.test('adds the right sentinel when instructed to and the charset is utf-8', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'utf-8' }), 'utf8=%E2%9C%93&a=%C3%A6'); + st.end(); + }); + + t.test('adds the right sentinel when instructed to and the charset is iso-8859-1', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }), 'utf8=%26%2310003%3B&a=%E6'); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.stringify({}, options); + st.deepEqual(options, {}); + st.end(); + }); + + t.test('strictNullHandling works with custom filter', function (st) { + var filter = function (prefix, value) { + return value; + }; + + var options = { strictNullHandling: true, filter: filter }; + st.equal(qs.stringify({ key: null }, options), 'key'); + st.end(); + }); + + t.test('strictNullHandling works with null serializeDate', function (st) { + var serializeDate = function () { + return null; + }; + var options = { strictNullHandling: true, serializeDate: serializeDate }; + var date = new Date(); + st.equal(qs.stringify({ key: date }, options), 'key'); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/qs/test/utils.js b/node_modules/qs/test/utils.js new file mode 100644 index 0000000..da31ce5 --- /dev/null +++ b/node_modules/qs/test/utils.js @@ -0,0 +1,136 @@ +'use strict'; + +var test = require('tape'); +var inspect = require('object-inspect'); +var SaferBuffer = require('safer-buffer').Buffer; +var forEach = require('for-each'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null'); + + t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array'); + + t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); + + var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); + t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); + + var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); + t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); + + var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); + t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); + + var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); + t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); + + var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar'); + t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true }); + + t.test( + 'avoids invoking array setters unnecessarily', + { skip: typeof Object.defineProperty !== 'function' }, + function (st) { + var setCount = 0; + var getCount = 0; + var observed = []; + Object.defineProperty(observed, 0, { + get: function () { + getCount += 1; + return { bar: 'baz' }; + }, + set: function () { setCount += 1; } + }); + utils.merge(observed, [null]); + st.equal(setCount, 0); + st.equal(getCount, 1); + observed[0] = observed[0]; // eslint-disable-line no-self-assign + st.equal(setCount, 1); + st.equal(getCount, 2); + st.end(); + } + ); + + t.end(); +}); + +test('assign()', function (t) { + var target = { a: 1, b: 2 }; + var source = { b: 3, c: 4 }; + var result = utils.assign(target, source); + + t.equal(result, target, 'returns the target'); + t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged'); + t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched'); + + t.end(); +}); + +test('combine()', function (t) { + t.test('both arrays', function (st) { + var a = [1]; + var b = [2]; + var combined = utils.combine(a, b); + + st.deepEqual(a, [1], 'a is not mutated'); + st.deepEqual(b, [2], 'b is not mutated'); + st.notEqual(a, combined, 'a !== combined'); + st.notEqual(b, combined, 'b !== combined'); + st.deepEqual(combined, [1, 2], 'combined is a + b'); + + st.end(); + }); + + t.test('one array, one non-array', function (st) { + var aN = 1; + var a = [aN]; + var bN = 2; + var b = [bN]; + + var combinedAnB = utils.combine(aN, b); + st.deepEqual(b, [bN], 'b is not mutated'); + st.notEqual(aN, combinedAnB, 'aN + b !== aN'); + st.notEqual(a, combinedAnB, 'aN + b !== a'); + st.notEqual(bN, combinedAnB, 'aN + b !== bN'); + st.notEqual(b, combinedAnB, 'aN + b !== b'); + st.deepEqual([1, 2], combinedAnB, 'first argument is array-wrapped when not an array'); + + var combinedABn = utils.combine(a, bN); + st.deepEqual(a, [aN], 'a is not mutated'); + st.notEqual(aN, combinedABn, 'a + bN !== aN'); + st.notEqual(a, combinedABn, 'a + bN !== a'); + st.notEqual(bN, combinedABn, 'a + bN !== bN'); + st.notEqual(b, combinedABn, 'a + bN !== b'); + st.deepEqual([1, 2], combinedABn, 'second argument is array-wrapped when not an array'); + + st.end(); + }); + + t.test('neither is an array', function (st) { + var combined = utils.combine(1, 2); + st.notEqual(1, combined, '1 + 2 !== 1'); + st.notEqual(2, combined, '1 + 2 !== 2'); + st.deepEqual([1, 2], combined, 'both arguments are array-wrapped when not an array'); + + st.end(); + }); + + t.end(); +}); + +test('isBuffer()', function (t) { + forEach([null, undefined, true, false, '', 'abc', 42, 0, NaN, {}, [], function () {}, /a/g], function (x) { + t.equal(utils.isBuffer(x), false, inspect(x) + ' is not a buffer'); + }); + + var fakeBuffer = { constructor: Buffer }; + t.equal(utils.isBuffer(fakeBuffer), false, 'fake buffer is not a buffer'); + + var saferBuffer = SaferBuffer.from('abc'); + t.equal(utils.isBuffer(saferBuffer), true, 'SaferBuffer instance is a buffer'); + + var buffer = Buffer.from ? Buffer.from('abc') : new Buffer('abc'); + t.equal(utils.isBuffer(buffer), true, 'real Buffer instance is a buffer'); + t.end(); +}); diff --git a/node_modules/range-parser/HISTORY.md b/node_modules/range-parser/HISTORY.md new file mode 100644 index 0000000..70a973d --- /dev/null +++ b/node_modules/range-parser/HISTORY.md @@ -0,0 +1,56 @@ +1.2.1 / 2019-05-10 +================== + + * Improve error when `str` is not a string + +1.2.0 / 2016-06-01 +================== + + * Add `combine` option to combine overlapping ranges + +1.1.0 / 2016-05-13 +================== + + * Fix incorrectly returning -1 when there is at least one valid range + * perf: remove internal function + +1.0.3 / 2015-10-29 +================== + + * perf: enable strict mode + +1.0.2 / 2014-09-08 +================== + + * Support Node.js 0.6 + +1.0.1 / 2014-09-07 +================== + + * Move repository to jshttp + +1.0.0 / 2013-12-11 +================== + + * Add repository to package.json + * Add MIT license + +0.0.4 / 2012-06-17 +================== + + * Change 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` + +0.0.1 / 2012-06-11 +================== + + * Initial release diff --git a/node_modules/range-parser/LICENSE b/node_modules/range-parser/LICENSE new file mode 100644 index 0000000..3599954 --- /dev/null +++ b/node_modules/range-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +```js +var parseRange = require('range-parser') +``` + +### parseRange(size, header, options) + +Parse the given `header` string where `size` is the maximum size of the resource. +An array of ranges will be returned or negative numbers indicating an error parsing. + + * `-2` signals a malformed header string + * `-1` signals an unsatisfiable range + + + +```js +// parse header from request +var range = parseRange(size, req.headers.range) + +// the type of the range +if (range.type === 'bytes') { + // the ranges + range.forEach(function (r) { + // do something with r.start and r.end + }) +} +``` + +#### Options + +These properties are accepted in the options object. + +##### combine + +Specifies if overlapping & adjacent ranges should be combined, defaults to `false`. +When `true`, ranges will be combined and returned as if they were specified that +way in the header. + + + +```js +parseRange(100, 'bytes=50-55,0-10,5-10,56-60', { combine: true }) +// => [ +// { start: 0, end: 10 }, +// { start: 50, end: 60 } +// ] +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/range-parser/master +[coveralls-url]: https://coveralls.io/r/jshttp/range-parser?branch=master +[node-image]: https://badgen.net/npm/node/range-parser +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/range-parser +[npm-url]: https://npmjs.org/package/range-parser +[npm-version-image]: https://badgen.net/npm/v/range-parser +[travis-image]: https://badgen.net/travis/jshttp/range-parser/master +[travis-url]: https://travis-ci.org/jshttp/range-parser diff --git a/node_modules/range-parser/index.js b/node_modules/range-parser/index.js new file mode 100644 index 0000000..b7dc5c0 --- /dev/null +++ b/node_modules/range-parser/index.js @@ -0,0 +1,162 @@ +/*! + * range-parser + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = rangeParser + +/** + * Parse "Range" header `str` relative to the given file `size`. + * + * @param {Number} size + * @param {String} str + * @param {Object} [options] + * @return {Array} + * @public + */ + +function rangeParser (size, str, options) { + if (typeof str !== 'string') { + throw new TypeError('argument str must be a string') + } + + var index = str.indexOf('=') + + if (index === -1) { + return -2 + } + + // split the range string + var arr = str.slice(index + 1).split(',') + var ranges = [] + + // add ranges type + ranges.type = str.slice(0, index) + + // parse all ranges + for (var i = 0; i < arr.length; i++) { + var range = arr[i].split('-') + var start = parseInt(range[0], 10) + var 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 or unsatisifiable + if (isNaN(start) || isNaN(end) || start > end || start < 0) { + continue + } + + // add range + ranges.push({ + start: start, + end: end + }) + } + + if (ranges.length < 1) { + // unsatisifiable + return -1 + } + + return options && options.combine + ? combineRanges(ranges) + : ranges +} + +/** + * Combine overlapping & adjacent ranges. + * @private + */ + +function combineRanges (ranges) { + var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart) + + for (var j = 0, i = 1; i < ordered.length; i++) { + var range = ordered[i] + var current = ordered[j] + + if (range.start > current.end + 1) { + // next range + ordered[++j] = range + } else if (range.end > current.end) { + // extend range + current.end = range.end + current.index = Math.min(current.index, range.index) + } + } + + // trim ordered array + ordered.length = j + 1 + + // generate combined range + var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex) + + // copy ranges type + combined.type = ranges.type + + return combined +} + +/** + * Map function to add index value to ranges. + * @private + */ + +function mapWithIndex (range, index) { + return { + start: range.start, + end: range.end, + index: index + } +} + +/** + * Map function to remove index value from ranges. + * @private + */ + +function mapWithoutIndex (range) { + return { + start: range.start, + end: range.end + } +} + +/** + * Sort function to sort ranges by index. + * @private + */ + +function sortByRangeIndex (a, b) { + return a.index - b.index +} + +/** + * Sort function to sort ranges by start position. + * @private + */ + +function sortByRangeStart (a, b) { + return a.start - b.start +} diff --git a/node_modules/range-parser/package.json b/node_modules/range-parser/package.json new file mode 100644 index 0000000..0c45fde --- /dev/null +++ b/node_modules/range-parser/package.json @@ -0,0 +1,94 @@ +{ + "_args": [ + [ + "range-parser@1.2.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "range-parser@1.2.1", + "_id": "range-parser@1.2.1", + "_inBundle": false, + "_integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "_location": "/range-parser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "range-parser@1.2.1", + "name": "range-parser", + "escapedName": "range-parser", + "rawSpec": "1.2.1", + "saveSpec": null, + "fetchSpec": "1.2.1" + }, + "_requiredBy": [ + "/express", + "/send" + ], + "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "_spec": "1.2.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "bugs": { + "url": "https://github.com/jshttp/range-parser/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "James Wyatt Cready", + "email": "wyatt.cready@lanetix.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "description": "Range header field string parser", + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.1.1" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/jshttp/range-parser#readme", + "keywords": [ + "range", + "parser", + "http" + ], + "license": "MIT", + "name": "range-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/range-parser.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "version": "1.2.1" +} diff --git a/node_modules/raw-body/HISTORY.md b/node_modules/raw-body/HISTORY.md new file mode 100644 index 0000000..88c79fc --- /dev/null +++ b/node_modules/raw-body/HISTORY.md @@ -0,0 +1,270 @@ +2.4.0 / 2019-04-17 +================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + +2.3.3 / 2018-05-08 +================== + + * deps: http-errors@1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + +2.3.2 / 2017-09-09 +================== + + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + +2.3.1 / 2017-09-07 +================== + + * deps: bytes@3.0.0 + * deps: http-errors@1.6.2 + - deps: depd@1.1.1 + * perf: skip buffer decoding on overage chunk + +2.3.0 / 2017-08-04 +================== + + * Add TypeScript definitions + * Use `http-errors` for standard emitted errors + * deps: bytes@2.5.0 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + +2.2.0 / 2017-01-02 +================== + + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + +2.1.7 / 2016-06-19 +================== + + * deps: bytes@2.4.0 + * perf: remove double-cleanup on happy path + +2.1.6 / 2016-03-07 +================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + +2.1.5 / 2015-11-30 +================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + +2.1.4 / 2015-09-27 +================== + + * Fix masking critical errors from `iconv-lite` + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + +2.1.3 / 2015-09-12 +================== + + * Fix sync callback when attaching data listener causes sync read + - Node.js 0.10 compatibility issue + +2.1.2 / 2015-07-05 +================== + + * Fix error stack traces to skip `makeError` + * deps: iconv-lite@0.4.11 + - Add encoding CESU-8 + +2.1.1 / 2015-06-14 +================== + + * Use `unpipe` module for unpiping requests + +2.1.0 / 2015-05-28 +================== + + * deps: iconv-lite@0.4.10 + - Improved UTF-16 endianness detection + - Leading BOM is now removed when decoding + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + +2.0.2 / 2015-05-21 +================== + + * deps: bytes@2.1.0 + - Slight optimizations + +2.0.1 / 2015-05-10 +================== + + * Fix a false-positive when unpiping in Node.js 0.8 + +2.0.0 / 2015-05-08 +================== + + * Return a promise without callback instead of thunk + * deps: bytes@2.0.1 + - units no longer case sensitive when parsing + +1.3.4 / 2015-04-15 +================== + + * Fix hanging callback if request aborts during read + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + +1.3.3 / 2015-02-08 +================== + + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + +1.3.2 / 2015-01-20 +================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + +1.3.1 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + +1.3.0 / 2014-07-20 +================== + + * Fully unpipe the stream on error + - Fixes `Cannot switch to old mode now` error on Node.js 0.10+ + +1.2.3 / 2014-07-20 +================== + + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + +1.2.2 / 2014-06-19 +================== + + * Send invalid encoding error to callback + +1.2.1 / 2014-06-15 +================== + + * deps: iconv-lite@0.4.3 + - Added encodings UTF-16BE and UTF-16 with BOM + +1.2.0 / 2014-06-13 +================== + + * Passing string as `options` interpreted as encoding + * Support all encodings from `iconv-lite` + +1.1.7 / 2014-06-12 +================== + + * use `string_decoder` module from npm + +1.1.6 / 2014-05-27 +================== + + * check encoding for old streams1 + * support node.js < 0.10.6 + +1.1.5 / 2014-05-14 +================== + + * bump bytes + +1.1.4 / 2014-04-19 +================== + + * allow true as an option + * bump bytes + +1.1.3 / 2014-03-02 +================== + + * fix case when length=null + +1.1.2 / 2013-12-01 +================== + + * be less strict on state.encoding check + +1.1.1 / 2013-11-27 +================== + + * add engines + +1.1.0 / 2013-11-27 +================== + + * add err.statusCode and err.type + * allow for encoding option to be true + * pause the stream instead of dumping on error + * throw if the stream's encoding is set + +1.0.1 / 2013-11-19 +================== + + * dont support streams1, throw if dev set encoding + +1.0.0 / 2013-11-17 +================== + + * rename `expected` option to `length` + +0.2.0 / 2013-11-15 +================== + + * republish + +0.1.1 / 2013-11-15 +================== + + * use bytes + +0.1.0 / 2013-11-11 +================== + + * generator support + +0.0.3 / 2013-10-10 +================== + + * update repo + +0.0.2 / 2013-09-14 +================== + + * dump stream on bad headers + * listen to events after defining received and buffers + +0.0.1 / 2013-09-14 +================== + + * Initial release diff --git a/node_modules/raw-body/LICENSE b/node_modules/raw-body/LICENSE new file mode 100644 index 0000000..d695c8f --- /dev/null +++ b/node_modules/raw-body/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2013-2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/raw-body/README.md b/node_modules/raw-body/README.md new file mode 100644 index 0000000..2ce79d2 --- /dev/null +++ b/node_modules/raw-body/README.md @@ -0,0 +1,219 @@ +# raw-body + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +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. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install raw-body +``` + +### TypeScript + +This module includes a [TypeScript](https://www.typescriptlang.org/) +declaration file to enable auto complete in compatible editors and type +information for TypeScript projects. This module depends on the Node.js +types, so install `@types/node`: + +```sh +$ npm install @types/node +``` + +## API + + + +```js +var getRawBody = require('raw-body') +``` + +### getRawBody(stream, [options], [callback]) + +**Returns a promise if no callback specified and global `Promise` exists.** + +Options: + +- `length` - The 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. + This is the number of bytes or any string format supported by + [bytes](https://www.npmjs.com/package/bytes), + for example `1000`, `'500kb'` or `'3mb'`. + If the body ends up being larger than this limit, + a `413` error code is returned. +- `encoding` - The encoding to use to decode the body into a string. + By default, a `Buffer` instance will be returned when no encoding is specified. + Most likely, you want `utf-8`, so setting `encoding` to `true` will decode as `utf-8`. + You can use any type of encoding supported by [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme). + +You can also pass a string in place of options to just specify the encoding. + +If an error occurs, the stream will be paused, everything unpiped, +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. + +## Errors + +This module creates errors depending on the error condition during reading. +The error may be an error from the underlying Node.js implementation, but is +otherwise an error created by this module, which has the following attributes: + + * `limit` - the limit in bytes + * `length` and `expected` - the expected length of the stream + * `received` - the received bytes + * `encoding` - the invalid encoding + * `status` and `statusCode` - the corresponding status code for the error + * `type` - the error type + +### Types + +The errors from this module have a `type` property which allows for the progamatic +determination of the type of error returned. + +#### encoding.unsupported + +This error will occur when the `encoding` option is specified, but the value does +not map to an encoding supported by the [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme) +module. + +#### entity.too.large + +This error will occur when the `limit` option is specified, but the stream has +an entity that is larger. + +#### request.aborted + +This error will occur when the request stream is aborted by the client before +reading the body has finished. + +#### request.size.invalid + +This error will occur when the `length` option is specified, but the stream has +emitted more bytes. + +#### stream.encoding.set + +This error will occur when the given stream has an encoding set on it, making it +a decoded stream. The stream should not have an encoding set and is expected to +emit `Buffer` objects. + +## Examples + +### Simple Express example + +```js +var contentType = require('content-type') +var express = require('express') +var getRawBody = require('raw-body') + +var app = express() + +app.use(function (req, res, next) { + getRawBody(req, { + length: req.headers['content-length'], + limit: '1mb', + encoding: contentType.parse(req).parameters.charset + }, function (err, string) { + if (err) return next(err) + req.text = string + next() + }) +}) + +// now access req.text +``` + +### Simple Koa example + +```js +var contentType = require('content-type') +var getRawBody = require('raw-body') +var koa = require('koa') + +var app = koa() + +app.use(function * (next) { + this.text = yield getRawBody(this.req, { + length: this.req.headers['content-length'], + limit: '1mb', + encoding: contentType.parse(this.req).parameters.charset + }) + yield next +}) + +// now access this.text +``` + +### Using as a promise + +To use this library as a promise, simply omit the `callback` and a promise is +returned, provided that a global `Promise` is defined. + +```js +var getRawBody = require('raw-body') +var http = require('http') + +var server = http.createServer(function (req, res) { + getRawBody(req) + .then(function (buf) { + res.statusCode = 200 + res.end(buf.length + ' bytes submitted') + }) + .catch(function (err) { + res.statusCode = 500 + res.end(err.message) + }) +}) + +server.listen(3000) +``` + +### Using with TypeScript + +```ts +import * as getRawBody from 'raw-body'; +import * as http from 'http'; + +const server = http.createServer((req, res) => { + getRawBody(req) + .then((buf) => { + res.statusCode = 200; + res.end(buf.length + ' bytes submitted'); + }) + .catch((err) => { + res.statusCode = err.statusCode; + res.end(err.message); + }); +}); + +server.listen(3000); +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/raw-body.svg +[npm-url]: https://npmjs.org/package/raw-body +[node-version-image]: https://img.shields.io/node/v/raw-body.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/stream-utils/raw-body/master.svg +[travis-url]: https://travis-ci.org/stream-utils/raw-body +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/raw-body/master.svg +[coveralls-url]: https://coveralls.io/r/stream-utils/raw-body?branch=master +[downloads-image]: https://img.shields.io/npm/dm/raw-body.svg +[downloads-url]: https://npmjs.org/package/raw-body diff --git a/node_modules/raw-body/index.d.ts b/node_modules/raw-body/index.d.ts new file mode 100644 index 0000000..dcbbebd --- /dev/null +++ b/node_modules/raw-body/index.d.ts @@ -0,0 +1,87 @@ +import { Readable } from 'stream'; + +declare namespace getRawBody { + export type Encoding = string | true; + + export interface Options { + /** + * The expected length of the stream. + */ + length?: number | string | null; + /** + * The byte limit of the body. This is the number of bytes or any string + * format supported by `bytes`, for example `1000`, `'500kb'` or `'3mb'`. + */ + limit?: number | string | null; + /** + * The encoding to use to decode the body into a string. By default, a + * `Buffer` instance will be returned when no encoding is specified. Most + * likely, you want `utf-8`, so setting encoding to `true` will decode as + * `utf-8`. You can use any type of encoding supported by `iconv-lite`. + */ + encoding?: Encoding | null; + } + + export interface RawBodyError extends Error { + /** + * The limit in bytes. + */ + limit?: number; + /** + * The expected length of the stream. + */ + length?: number; + expected?: number; + /** + * The received bytes. + */ + received?: number; + /** + * The encoding. + */ + encoding?: string; + /** + * The corresponding status code for the error. + */ + status: number; + statusCode: number; + /** + * The error type. + */ + type: string; + } +} + +/** + * 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. + */ +declare function getRawBody( + stream: Readable, + callback: (err: getRawBody.RawBodyError, body: Buffer) => void +): void; + +declare function getRawBody( + stream: Readable, + options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding, + callback: (err: getRawBody.RawBodyError, body: string) => void +): void; + +declare function getRawBody( + stream: Readable, + options: getRawBody.Options, + callback: (err: getRawBody.RawBodyError, body: Buffer) => void +): void; + +declare function getRawBody( + stream: Readable, + options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding +): Promise; + +declare function getRawBody( + stream: Readable, + options?: getRawBody.Options +): Promise; + +export = getRawBody; diff --git a/node_modules/raw-body/index.js b/node_modules/raw-body/index.js new file mode 100644 index 0000000..7fe8186 --- /dev/null +++ b/node_modules/raw-body/index.js @@ -0,0 +1,286 @@ +/*! + * raw-body + * Copyright(c) 2013-2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var createError = require('http-errors') +var iconv = require('iconv-lite') +var unpipe = require('unpipe') + +/** + * Module exports. + * @public + */ + +module.exports = getRawBody + +/** + * Module variables. + * @private + */ + +var ICONV_ENCODING_MESSAGE_REGEXP = /^Encoding not recognized: / + +/** + * Get the decoder for a given encoding. + * + * @param {string} encoding + * @private + */ + +function getDecoder (encoding) { + if (!encoding) return null + + try { + return iconv.getDecoder(encoding) + } catch (e) { + // error getting decoder + if (!ICONV_ENCODING_MESSAGE_REGEXP.test(e.message)) throw e + + // the encoding was not found + throw createError(415, 'specified encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } +} + +/** + * Get the raw body of a stream (typically HTTP). + * + * @param {object} stream + * @param {object|string|function} [options] + * @param {function} [callback] + * @public + */ + +function getRawBody (stream, options, callback) { + var done = callback + var opts = options || {} + + if (options === true || typeof options === 'string') { + // short cut for encoding + opts = { + encoding: options + } + } + + if (typeof options === 'function') { + done = options + opts = {} + } + + // validate callback is a function, if provided + if (done !== undefined && typeof done !== 'function') { + throw new TypeError('argument callback must be a function') + } + + // require the callback without promises + if (!done && !global.Promise) { + throw new TypeError('argument callback is required') + } + + // get encoding + var encoding = opts.encoding !== true + ? opts.encoding + : 'utf-8' + + // convert the limit to an integer + var limit = bytes.parse(opts.limit) + + // convert the expected length to an integer + var length = opts.length != null && !isNaN(opts.length) + ? parseInt(opts.length, 10) + : null + + if (done) { + // classic callback style + return readStream(stream, encoding, length, limit, done) + } + + return new Promise(function executor (resolve, reject) { + readStream(stream, encoding, length, limit, function onRead (err, buf) { + if (err) return reject(err) + resolve(buf) + }) + }) +} + +/** + * Halt a stream. + * + * @param {Object} stream + * @private + */ + +function halt (stream) { + // unpipe everything from the stream + unpipe(stream) + + // pause stream + if (typeof stream.pause === 'function') { + stream.pause() + } +} + +/** + * Read the data from the stream. + * + * @param {object} stream + * @param {string} encoding + * @param {number} length + * @param {number} limit + * @param {function} callback + * @public + */ + +function readStream (stream, encoding, length, limit, callback) { + var complete = false + var sync = true + + // 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) { + return done(createError(413, 'request entity too large', { + expected: length, + length: length, + limit: limit, + type: 'entity.too.large' + })) + } + + // streams1: assert request encoding is buffer. + // streams2+: assert the stream encoding is buffer. + // stream._decoder: streams1 + // state.encoding: streams2 + // state.decoder: streams2, specifically < 0.10.6 + var state = stream._readableState + if (stream._decoder || (state && (state.encoding || state.decoder))) { + // developer error + return done(createError(500, 'stream encoding should not be set', { + type: 'stream.encoding.set' + })) + } + + var received = 0 + var decoder + + try { + decoder = getDecoder(encoding) + } catch (err) { + return done(err) + } + + var buffer = decoder + ? '' + : [] + + // attach listeners + stream.on('aborted', onAborted) + stream.on('close', cleanup) + stream.on('data', onData) + stream.on('end', onEnd) + stream.on('error', onEnd) + + // mark sync section complete + sync = false + + function done () { + var args = new Array(arguments.length) + + // copy arguments + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + + // mark complete + complete = true + + if (sync) { + process.nextTick(invokeCallback) + } else { + invokeCallback() + } + + function invokeCallback () { + cleanup() + + if (args[0]) { + // halt the stream on error + halt(stream) + } + + callback.apply(null, args) + } + } + + function onAborted () { + if (complete) return + + done(createError(400, 'request aborted', { + code: 'ECONNABORTED', + expected: length, + length: length, + received: received, + type: 'request.aborted' + })) + } + + function onData (chunk) { + if (complete) return + + received += chunk.length + + if (limit !== null && received > limit) { + done(createError(413, 'request entity too large', { + limit: limit, + received: received, + type: 'entity.too.large' + })) + } else if (decoder) { + buffer += decoder.write(chunk) + } else { + buffer.push(chunk) + } + } + + function onEnd (err) { + if (complete) return + if (err) return done(err) + + if (length !== null && received !== length) { + done(createError(400, 'request size did not match content length', { + expected: length, + length: length, + received: received, + type: 'request.size.invalid' + })) + } else { + var string = decoder + ? buffer + (decoder.end() || '') + : Buffer.concat(buffer) + done(null, string) + } + } + + function cleanup () { + buffer = null + + stream.removeListener('aborted', onAborted) + stream.removeListener('data', onData) + stream.removeListener('end', onEnd) + stream.removeListener('error', onEnd) + stream.removeListener('close', cleanup) + } +} diff --git a/node_modules/raw-body/package.json b/node_modules/raw-body/package.json new file mode 100644 index 0000000..57ad446 --- /dev/null +++ b/node_modules/raw-body/package.json @@ -0,0 +1,93 @@ +{ + "_args": [ + [ + "raw-body@2.4.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "raw-body@2.4.0", + "_id": "raw-body@2.4.0", + "_inBundle": false, + "_integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "_location": "/raw-body", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "raw-body@2.4.0", + "name": "raw-body", + "escapedName": "raw-body", + "rawSpec": "2.4.0", + "saveSpec": null, + "fetchSpec": "2.4.0" + }, + "_requiredBy": [ + "/body-parser" + ], + "_resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "_spec": "2.4.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "bugs": { + "url": "https://github.com/stream-utils/raw-body/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Raynos", + "email": "raynos2@gmail.com" + } + ], + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "description": "Get and validate the raw body of a readable stream.", + "devDependencies": { + "bluebird": "3.5.4", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "6.1.3", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.d.ts", + "index.js" + ], + "homepage": "https://github.com/stream-utils/raw-body#readme", + "license": "MIT", + "name": "raw-body", + "repository": { + "type": "git", + "url": "git+https://github.com/stream-utils/raw-body.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --trace-deprecation --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --trace-deprecation --reporter spec --check-leaks test/" + }, + "version": "2.4.0" +} diff --git a/node_modules/rc/LICENSE.APACHE2 b/node_modules/rc/LICENSE.APACHE2 new file mode 100644 index 0000000..6366c04 --- /dev/null +++ b/node_modules/rc/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/rc/LICENSE.BSD b/node_modules/rc/LICENSE.BSD new file mode 100644 index 0000000..96bb796 --- /dev/null +++ b/node_modules/rc/LICENSE.BSD @@ -0,0 +1,26 @@ +Copyright (c) 2013, Dominic Tarr +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. diff --git a/node_modules/rc/LICENSE.MIT b/node_modules/rc/LICENSE.MIT new file mode 100644 index 0000000..6eafbd7 --- /dev/null +++ b/node_modules/rc/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/rc/README.md b/node_modules/rc/README.md new file mode 100644 index 0000000..e6522e2 --- /dev/null +++ b/node_modules/rc/README.md @@ -0,0 +1,227 @@ +# rc + +The non-configurable configuration loader for lazy people. + +## Usage + +The only option is to pass rc the name of your app, and your default configuration. + +```javascript +var conf = require('rc')(appname, { + //defaults go here. + port: 2468, + + //defaults which are objects will be merged, not replaced + views: { + engine: 'jade' + } +}); +``` + +`rc` will return your configuration options merged with the defaults you specify. +If you pass in a predefined defaults object, it will be mutated: + +```javascript +var conf = {}; +require('rc')(appname, conf); +``` + +If `rc` finds any config files for your app, the returned config object will have +a `configs` array containing their paths: + +```javascript +var appCfg = require('rc')(appname, conf); +appCfg.configs[0] // /etc/appnamerc +appCfg.configs[1] // /home/dominictarr/.config/appname +appCfg.config // same as appCfg.configs[appCfg.configs.length - 1] +``` + +## Standards + +Given your application name (`appname`), rc will look in all the obvious places for configuration. + + * command line arguments, parsed by minimist _(e.g. `--foo baz`, also nested: `--foo.bar=baz`)_ + * environment variables prefixed with `${appname}_` + * or use "\_\_" to indicate nested properties
_(e.g. `appname_foo__bar__baz` => `foo.bar.baz`)_ + * if you passed an option `--config file` then from that file + * a local `.${appname}rc` or the first found looking in `./ ../ ../../ ../../../` etc. + * `$HOME/.${appname}rc` + * `$HOME/.${appname}/config` + * `$HOME/.config/${appname}` + * `$HOME/.config/${appname}/config` + * `/etc/${appname}rc` + * `/etc/${appname}/config` + * the defaults object you passed in. + +All configuration sources that were found will be flattened into one object, +so that sources **earlier** in this list override later ones. + + +## Configuration File Formats + +Configuration files (e.g. `.appnamerc`) may be in either [json](http://json.org/example) or [ini](http://en.wikipedia.org/wiki/INI_file) format. **No** file extension (`.json` or `.ini`) should be used. The example configurations below are equivalent: + + +#### Formatted as `ini` + +``` +; You can include comments in `ini` format if you want. + +dependsOn=0.10.0 + + +; `rc` has built-in support for ini sections, see? + +[commands] + www = ./commands/www + console = ./commands/repl + + +; You can even do nested sections + +[generators.options] + engine = ejs + +[generators.modules] + new = generate-new + engine = generate-backend + +``` + +#### Formatted as `json` + +```javascript +{ + // You can even comment your JSON, if you want + "dependsOn": "0.10.0", + "commands": { + "www": "./commands/www", + "console": "./commands/repl" + }, + "generators": { + "options": { + "engine": "ejs" + }, + "modules": { + "new": "generate-new", + "backend": "generate-backend" + } + } +} +``` + +Comments are stripped from JSON config via [strip-json-comments](https://github.com/sindresorhus/strip-json-comments). + +> Since ini, and env variables do not have a standard for types, your application needs be prepared for strings. + +To ensure that string representations of booleans and numbers are always converted into their proper types (especially useful if you intend to do strict `===` comparisons), consider using a module such as [parse-strings-in-object](https://github.com/anselanza/parse-strings-in-object) to wrap the config object returned from rc. + + +## Simple example demonstrating precedence +Assume you have an application like this (notice the hard-coded defaults passed to rc): +``` +const conf = require('rc')('myapp', { + port: 12345, + mode: 'test' +}); + +console.log(JSON.stringify(conf, null, 2)); +``` +You also have a file `config.json`, with these contents: +``` +{ + "port": 9000, + "foo": "from config json", + "something": "else" +} +``` +And a file `.myapprc` in the same folder, with these contents: +``` +{ + "port": "3001", + "foo": "bar" +} +``` +Here is the expected output from various commands: + +`node .` +``` +{ + "port": "3001", + "mode": "test", + "foo": "bar", + "_": [], + "configs": [ + "/Users/stephen/repos/conftest/.myapprc" + ], + "config": "/Users/stephen/repos/conftest/.myapprc" +} +``` +*Default `mode` from hard-coded object is retained, but port is overridden by `.myapprc` file (automatically found based on appname match), and `foo` is added.* + + +`node . --foo baz` +``` +{ + "port": "3001", + "mode": "test", + "foo": "baz", + "_": [], + "configs": [ + "/Users/stephen/repos/conftest/.myapprc" + ], + "config": "/Users/stephen/repos/conftest/.myapprc" +} +``` +*Same result as above but `foo` is overridden because command-line arguments take precedence over `.myapprc` file.* + +`node . --foo barbar --config config.json` +``` +{ + "port": 9000, + "mode": "test", + "foo": "barbar", + "something": "else", + "_": [], + "config": "config.json", + "configs": [ + "/Users/stephen/repos/conftest/.myapprc", + "config.json" + ] +} +``` +*Now the `port` comes from the `config.json` file specified (overriding the value from `.myapprc`), and `foo` value is overriden by command-line despite also being specified in the `config.json` file.* + + + +## Advanced Usage + +#### Pass in your own `argv` + +You may pass in your own `argv` as the third argument to `rc`. This is in case you want to [use your own command-line opts parser](https://github.com/dominictarr/rc/pull/12). + +```javascript +require('rc')(appname, defaults, customArgvParser); +``` + +## Pass in your own parser + +If you have a special need to use a non-standard parser, +you can do so by passing in the parser as the 4th argument. +(leave the 3rd as null to get the default args parser) + +```javascript +require('rc')(appname, defaults, null, parser); +``` + +This may also be used to force a more strict format, +such as strict, valid JSON only. + +## Note on Performance + +`rc` is running `fs.statSync`-- so make sure you don't use it in a hot code path (e.g. a request handler) + + +## License + +Multi-licensed under the two-clause BSD License, MIT License, or Apache License, version 2.0 diff --git a/node_modules/rc/browser.js b/node_modules/rc/browser.js new file mode 100644 index 0000000..8c230c5 --- /dev/null +++ b/node_modules/rc/browser.js @@ -0,0 +1,7 @@ + +// when this is loaded into the browser, +// just use the defaults... + +module.exports = function (name, defaults) { + return defaults +} diff --git a/node_modules/rc/cli.js b/node_modules/rc/cli.js new file mode 100755 index 0000000..ab05b60 --- /dev/null +++ b/node_modules/rc/cli.js @@ -0,0 +1,4 @@ +#! /usr/bin/env node +var rc = require('./index') + +console.log(JSON.stringify(rc(process.argv[2]), false, 2)) diff --git a/node_modules/rc/index.js b/node_modules/rc/index.js new file mode 100755 index 0000000..65eb47a --- /dev/null +++ b/node_modules/rc/index.js @@ -0,0 +1,53 @@ +var cc = require('./lib/utils') +var join = require('path').join +var deepExtend = require('deep-extend') +var etc = '/etc' +var win = process.platform === "win32" +var home = win + ? process.env.USERPROFILE + : process.env.HOME + +module.exports = function (name, defaults, argv, parse) { + if('string' !== typeof name) + throw new Error('rc(name): name *must* be string') + if(!argv) + argv = require('minimist')(process.argv.slice(2)) + defaults = ( + 'string' === typeof defaults + ? cc.json(defaults) : defaults + ) || {} + + parse = parse || cc.parse + + var env = cc.env(name + '_') + + var configs = [defaults] + var configFiles = [] + function addConfigFile (file) { + if (configFiles.indexOf(file) >= 0) return + var fileConfig = cc.file(file) + if (fileConfig) { + configs.push(parse(fileConfig)) + configFiles.push(file) + } + } + + // which files do we look at? + if (!win) + [join(etc, name, 'config'), + join(etc, name + 'rc')].forEach(addConfigFile) + if (home) + [join(home, '.config', name, 'config'), + join(home, '.config', name), + join(home, '.' + name, 'config'), + join(home, '.' + name + 'rc')].forEach(addConfigFile) + addConfigFile(cc.find('.'+name+'rc')) + if (env.config) addConfigFile(env.config) + if (argv.config) addConfigFile(argv.config) + + return deepExtend.apply(null, configs.concat([ + env, + argv, + configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined, + ])) +} diff --git a/node_modules/rc/lib/utils.js b/node_modules/rc/lib/utils.js new file mode 100644 index 0000000..8b3beff --- /dev/null +++ b/node_modules/rc/lib/utils.js @@ -0,0 +1,104 @@ +'use strict'; +var fs = require('fs') +var ini = require('ini') +var path = require('path') +var stripJsonComments = require('strip-json-comments') + +var parse = exports.parse = function (content) { + + //if it ends in .json or starts with { then it must be json. + //must be done this way, because ini accepts everything. + //can't just try and parse it and let it throw if it's not ini. + //everything is ini. even json with a syntax error. + + if(/^\s*{/.test(content)) + return JSON.parse(stripJsonComments(content)) + return ini.parse(content) + +} + +var file = exports.file = function () { + var args = [].slice.call(arguments).filter(function (arg) { return arg != null }) + + //path.join breaks if it's a not a string, so just skip this. + for(var i in args) + if('string' !== typeof args[i]) + return + + var file = path.join.apply(null, args) + var content + try { + return fs.readFileSync(file,'utf-8') + } catch (err) { + return + } +} + +var json = exports.json = function () { + var content = file.apply(null, arguments) + return content ? parse(content) : null +} + +var env = exports.env = function (prefix, env) { + env = env || process.env + var obj = {} + var l = prefix.length + for(var k in env) { + if(k.toLowerCase().indexOf(prefix.toLowerCase()) === 0) { + + var keypath = k.substring(l).split('__') + + // Trim empty strings from keypath array + var _emptyStringIndex + while ((_emptyStringIndex=keypath.indexOf('')) > -1) { + keypath.splice(_emptyStringIndex, 1) + } + + var cursor = obj + keypath.forEach(function _buildSubObj(_subkey,i){ + + // (check for _subkey first so we ignore empty strings) + // (check for cursor to avoid assignment to primitive objects) + if (!_subkey || typeof cursor !== 'object') + return + + // If this is the last key, just stuff the value in there + // Assigns actual value from env variable to final key + // (unless it's just an empty string- in that case use the last valid key) + if (i === keypath.length-1) + cursor[_subkey] = env[k] + + + // Build sub-object if nothing already exists at the keypath + if (cursor[_subkey] === undefined) + cursor[_subkey] = {} + + // Increment cursor used to track the object at the current depth + cursor = cursor[_subkey] + + }) + + } + + } + + return obj +} + +var find = exports.find = function () { + var rel = path.join.apply(null, [].slice.call(arguments)) + + function find(start, rel) { + var file = path.join(start, rel) + try { + fs.statSync(file) + return file + } catch (err) { + if(path.dirname(start) !== start) // root + return find(path.dirname(start), rel) + } + } + return find(process.cwd(), rel) +} + + diff --git a/node_modules/rc/node_modules/minimist/.travis.yml b/node_modules/rc/node_modules/minimist/.travis.yml new file mode 100644 index 0000000..74c57bf --- /dev/null +++ b/node_modules/rc/node_modules/minimist/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - "0.8" + - "0.10" + - "0.12" + - "iojs" +before_install: + - npm install -g npm@~1.4.6 diff --git a/node_modules/rc/node_modules/minimist/LICENSE b/node_modules/rc/node_modules/minimist/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/rc/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/rc/node_modules/minimist/example/parse.js b/node_modules/rc/node_modules/minimist/example/parse.js new file mode 100644 index 0000000..f7c8d49 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/example/parse.js @@ -0,0 +1,2 @@ +var argv = require('../')(process.argv.slice(2)); +console.log(argv); diff --git a/node_modules/rc/node_modules/minimist/index.js b/node_modules/rc/node_modules/minimist/index.js new file mode 100644 index 0000000..d2afe5e --- /dev/null +++ b/node_modules/rc/node_modules/minimist/index.js @@ -0,0 +1,245 @@ +module.exports = function (args, opts) { + if (!opts) opts = {}; + + var flags = { bools : {}, strings : {}, unknownFn: null }; + + if (typeof opts['unknown'] === 'function') { + flags.unknownFn = opts['unknown']; + } + + if (typeof opts['boolean'] === 'boolean' && opts['boolean']) { + flags.allBools = true; + } else { + [].concat(opts['boolean']).filter(Boolean).forEach(function (key) { + flags.bools[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; + })); + }); + }); + + [].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true; + if (aliases[key]) { + flags.strings[aliases[key]] = true; + } + }); + + 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 argDefined(key, arg) { + return (flags.allBools && /^--[^=]+$/.test(arg)) || + flags.strings[key] || flags.bools[key] || aliases[key]; + } + + function setArg (key, val, arg) { + if (arg && flags.unknownFn && !argDefined(key, arg)) { + if (flags.unknownFn(arg) === false) return; + } + + 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); + }); + } + + function setKey (obj, keys, value) { + var o = obj; + for (var i = 0; i < keys.length-1; i++) { + var key = keys[i]; + if (key === '__proto__') return; + if (o[key] === undefined) o[key] = {}; + if (o[key] === Object.prototype || o[key] === Number.prototype + || o[key] === String.prototype) o[key] = {}; + if (o[key] === Array.prototype) o[key] = []; + o = o[key]; + } + + var key = keys[keys.length - 1]; + if (key === '__proto__') return; + if (o === Object.prototype || o === Number.prototype + || o === String.prototype) o = {}; + if (o === Array.prototype) o = []; + if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') { + o[key] = value; + } + else if (Array.isArray(o[key])) { + o[key].push(value); + } + else { + o[key] = [ o[key], value ]; + } + } + + function aliasIsBoolean(key) { + return aliases[key].some(function (x) { + return flags.bools[x]; + }); + } + + 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]*)$/); + var key = m[1]; + var value = m[2]; + if (flags.bools[key]) { + value = value !== 'false'; + } + setArg(key, value, arg); + } + else if (/^--no-.+/.test(arg)) { + var key = arg.match(/^--no-(.+)/)[1]; + setArg(key, false, arg); + } + else if (/^--.+/.test(arg)) { + var key = arg.match(/^--(.+)/)[1]; + var next = args[i + 1]; + if (next !== undefined && !/^-/.test(next) + && !flags.bools[key] + && !flags.allBools + && (aliases[key] ? !aliasIsBoolean(key) : true)) { + setArg(key, next, arg); + i++; + } + else if (/^(true|false)$/.test(next)) { + setArg(key, next === 'true', arg); + i++; + } + else { + setArg(key, flags.strings[key] ? '' : true, arg); + } + } + 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, arg) + continue; + } + + if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) { + setArg(letters[j], next.split('=')[1], arg); + broken = true; + break; + } + + if (/[A-Za-z]/.test(letters[j]) + && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { + setArg(letters[j], next, arg); + broken = true; + break; + } + + if (letters[j+1] && letters[j+1].match(/\W/)) { + setArg(letters[j], arg.slice(j+2), arg); + broken = true; + break; + } + else { + setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg); + } + } + + var key = arg.slice(-1)[0]; + if (!broken && key !== '-') { + if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) + && !flags.bools[key] + && (aliases[key] ? !aliasIsBoolean(key) : true)) { + setArg(key, args[i+1], arg); + i++; + } + else if (args[i+1] && /^(true|false)$/.test(args[i+1])) { + setArg(key, args[i+1] === 'true', arg); + i++; + } + else { + setArg(key, flags.strings[key] ? '' : true, arg); + } + } + } + else { + if (!flags.unknownFn || flags.unknownFn(arg) !== false) { + argv._.push( + flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) + ); + } + if (opts.stopEarly) { + argv._.push.apply(argv._, args.slice(i + 1)); + break; + } + } + } + + 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]); + }); + } + }); + + if (opts['--']) { + argv['--'] = new Array(); + notFlags.forEach(function(key) { + argv['--'].push(key); + }); + } + else { + 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 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); +} + diff --git a/node_modules/rc/node_modules/minimist/package.json b/node_modules/rc/node_modules/minimist/package.json new file mode 100644 index 0000000..7dcd5c7 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/package.json @@ -0,0 +1,76 @@ +{ + "_args": [ + [ + "minimist@1.2.5", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "minimist@1.2.5", + "_id": "minimist@1.2.5", + "_inBundle": false, + "_integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "_location": "/rc/minimist", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "minimist@1.2.5", + "name": "minimist", + "escapedName": "minimist", + "rawSpec": "1.2.5", + "saveSpec": null, + "fetchSpec": "1.2.5" + }, + "_requiredBy": [ + "/rc" + ], + "_resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "_spec": "1.2.5", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/substack/minimist/issues" + }, + "description": "parse argument options", + "devDependencies": { + "covert": "^1.0.0", + "tap": "~0.4.0", + "tape": "^3.5.0" + }, + "homepage": "https://github.com/substack/minimist", + "keywords": [ + "argv", + "getopt", + "parser", + "optimist" + ], + "license": "MIT", + "main": "index.js", + "name": "minimist", + "repository": { + "type": "git", + "url": "git://github.com/substack/minimist.git" + }, + "scripts": { + "coverage": "covert test/*.js", + "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" + ] + }, + "version": "1.2.5" +} diff --git a/node_modules/rc/node_modules/minimist/readme.markdown b/node_modules/rc/node_modules/minimist/readme.markdown new file mode 100644 index 0000000..5fd97ab --- /dev/null +++ b/node_modules/rc/node_modules/minimist/readme.markdown @@ -0,0 +1,95 @@ +# minimist + +parse argument options + +This module is the guts of optimist's argument parser without all the +fanciful decoration. + +# example + +``` js +var argv = require('minimist')(process.argv.slice(2)); +console.log(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' } +``` + +# security + +Previous versions had a prototype pollution bug that could cause privilege +escalation in some circumstances when handling untrusted user input. + +Please use version 1.2.3 or later: https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 + +# 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 boolean, string or array of strings to always treat as +booleans. if `true` will treat all double hyphenated arguments without equal signs +as boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`) +* `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 +* `opts.stopEarly` - when true, populate `argv._` with everything after the +first non-option +* `opts['--']` - when true, populate `argv._` with everything before the `--` +and `argv['--']` with everything after the `--`. Here's an example: + + ``` + > require('./')('one two three -- four five --six'.split(' '), { '--': true }) + { _: [ 'one', 'two', 'three' ], + '--': [ 'four', 'five', '--six' ] } + ``` + + Note that with `opts['--']` set, parsing for arguments still stops after the + `--`. + +* `opts.unknown` - a function which is invoked with a command line parameter not +defined in the `opts` configuration object. If the function returns `false`, the +unknown option is not added to `argv`. + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install minimist +``` + +# license + +MIT diff --git a/node_modules/rc/node_modules/minimist/test/all_bool.js b/node_modules/rc/node_modules/minimist/test/all_bool.js new file mode 100644 index 0000000..ac83548 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/all_bool.js @@ -0,0 +1,32 @@ +var parse = require('../'); +var test = require('tape'); + +test('flag boolean true (default all --args to boolean)', function (t) { + var argv = parse(['moo', '--honk', 'cow'], { + boolean: true + }); + + t.deepEqual(argv, { + honk: true, + _: ['moo', 'cow'] + }); + + t.deepEqual(typeof argv.honk, 'boolean'); + t.end(); +}); + +test('flag boolean true only affects double hyphen arguments without equals signs', function (t) { + var argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], { + boolean: true + }); + + t.deepEqual(argv, { + honk: true, + tacos: 'good', + p: 55, + _: ['moo', 'cow'] + }); + + t.deepEqual(typeof argv.honk, 'boolean'); + t.end(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/bool.js b/node_modules/rc/node_modules/minimist/test/bool.js new file mode 100644 index 0000000..5f7dbde --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/bool.js @@ -0,0 +1,178 @@ +var parse = require('../'); +var test = require('tape'); + +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('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 array with options hash', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var alt = [ '--harp', 'derp' ]; + var opts = { + alias: { 'h': ['herp', 'harp'] }, + boolean: 'h' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var altPropertyArgv = parse(alt, opts); + var expected = { + harp: true, + herp: true, + h: true, + '_': [ 'derp' ] + }; + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.same(altPropertyArgv, 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(); +}); + +test('boolean --boool=true', function (t) { + var parsed = parse(['--boool=true'], { + default: { + boool: false + }, + boolean: ['boool'] + }); + + t.same(parsed.boool, true); + t.end(); +}); + +test('boolean --boool=false', function (t) { + var parsed = parse(['--boool=false'], { + default: { + boool: true + }, + boolean: ['boool'] + }); + + t.same(parsed.boool, false); + t.end(); +}); + +test('boolean using something similar to true', function (t) { + var opts = { boolean: 'h' }; + var result = parse(['-h', 'true.txt'], opts); + var expected = { + h: true, + '_': ['true.txt'] + }; + + t.same(result, expected); + t.end(); +}); \ No newline at end of file diff --git a/node_modules/rc/node_modules/minimist/test/dash.js b/node_modules/rc/node_modules/minimist/test/dash.js new file mode 100644 index 0000000..5a4fa5b --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/dash.js @@ -0,0 +1,31 @@ +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' ] }); +}); + +test('move arguments after the -- into their own `--` array', function(t) { + t.plan(1); + t.deepEqual( + parse([ '--name', 'John', 'before', '--', 'after' ], { '--': true }), + { name: 'John', _: [ 'before' ], '--': [ 'after' ] }); +}); diff --git a/node_modules/rc/node_modules/minimist/test/default_bool.js b/node_modules/rc/node_modules/minimist/test/default_bool.js new file mode 100644 index 0000000..780a311 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/default_bool.js @@ -0,0 +1,35 @@ +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(); +}); + +test('boolean default to null', function (t) { + var argv = parse([], { + boolean: 'maybe', + default: { maybe: null } + }); + t.equal(argv.maybe, null); + var argv = parse(['--maybe'], { + boolean: 'maybe', + default: { maybe: null } + }); + t.equal(argv.maybe, true); + t.end(); + +}) diff --git a/node_modules/rc/node_modules/minimist/test/dotted.js b/node_modules/rc/node_modules/minimist/test/dotted.js new file mode 100644 index 0000000..d8b3e85 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/dotted.js @@ -0,0 +1,22 @@ +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(); +}); + +test('dotted default with no alias', function (t) { + var argv = parse('', {default: {'a.b': 11}}); + t.equal(argv.a.b, 11); + t.end(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/kv_short.js b/node_modules/rc/node_modules/minimist/test/kv_short.js new file mode 100644 index 0000000..f813b30 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/kv_short.js @@ -0,0 +1,16 @@ +var parse = require('../'); +var test = require('tape'); + +test('short -k=v' , function (t) { + t.plan(1); + + var argv = parse([ '-b=123' ]); + t.deepEqual(argv, { b: 123, _: [] }); +}); + +test('multi short -k=v' , function (t) { + t.plan(1); + + var argv = parse([ '-a=whatever', '-b=robots' ]); + t.deepEqual(argv, { a: 'whatever', b: 'robots', _: [] }); +}); diff --git a/node_modules/rc/node_modules/minimist/test/long.js b/node_modules/rc/node_modules/minimist/test/long.js new file mode 100644 index 0000000..5d3a1e0 --- /dev/null +++ b/node_modules/rc/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/rc/node_modules/minimist/test/num.js b/node_modules/rc/node_modules/minimist/test/num.js new file mode 100644 index 0000000..2cc77f4 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/num.js @@ -0,0 +1,36 @@ +var parse = require('../'); +var test = require('tape'); + +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('already a number', function (t) { + var argv = parse([ '-x', 1234, 789 ]); + t.deepEqual(argv, { x : 1234, _ : [ 789 ] }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/parse.js b/node_modules/rc/node_modules/minimist/test/parse.js new file mode 100644 index 0000000..7b4a2a1 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/parse.js @@ -0,0 +1,197 @@ +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('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('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('empty strings', function(t) { + var s = parse([ '-s' ], { string: 's' }).s; + t.equal(s, ''); + t.equal(typeof s, 'string'); + + var str = parse([ '--str' ], { string: 'str' }).str; + t.equal(str, ''); + t.equal(typeof str, 'string'); + + var letters = parse([ '-art' ], { + string: [ 'a', 't' ] + }); + + t.equal(letters.a, ''); + t.equal(letters.r, true); + t.equal(letters.t, ''); + + t.end(); +}); + + +test('string and alias', function(t) { + var x = parse([ '--str', '000123' ], { + string: 's', + alias: { s: 'str' } + }); + + t.equal(x.str, '000123'); + t.equal(typeof x.str, 'string'); + t.equal(x.s, '000123'); + t.equal(typeof x.s, 'string'); + + var y = parse([ '-s', '000123' ], { + string: 'str', + alias: { str: 's' } + }); + + t.equal(y.str, '000123'); + t.equal(typeof y.str, 'string'); + t.equal(y.s, '000123'); + t.equal(typeof y.s, 'string'); + 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(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/parse_modified.js b/node_modules/rc/node_modules/minimist/test/parse_modified.js new file mode 100644 index 0000000..ab620dc --- /dev/null +++ b/node_modules/rc/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/rc/node_modules/minimist/test/proto.js b/node_modules/rc/node_modules/minimist/test/proto.js new file mode 100644 index 0000000..8649107 --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/proto.js @@ -0,0 +1,44 @@ +var parse = require('../'); +var test = require('tape'); + +test('proto pollution', function (t) { + var argv = parse(['--__proto__.x','123']); + t.equal({}.x, undefined); + t.equal(argv.__proto__.x, undefined); + t.equal(argv.x, undefined); + t.end(); +}); + +test('proto pollution (array)', function (t) { + var argv = parse(['--x','4','--x','5','--x.__proto__.z','789']); + t.equal({}.z, undefined); + t.deepEqual(argv.x, [4,5]); + t.equal(argv.x.z, undefined); + t.equal(argv.x.__proto__.z, undefined); + t.end(); +}); + +test('proto pollution (number)', function (t) { + var argv = parse(['--x','5','--x.__proto__.z','100']); + t.equal({}.z, undefined); + t.equal((4).z, undefined); + t.equal(argv.x, 5); + t.equal(argv.x.z, undefined); + t.end(); +}); + +test('proto pollution (string)', function (t) { + var argv = parse(['--x','abc','--x.__proto__.z','def']); + t.equal({}.z, undefined); + t.equal('...'.z, undefined); + t.equal(argv.x, 'abc'); + t.equal(argv.x.z, undefined); + t.end(); +}); + +test('proto pollution (constructor)', function (t) { + var argv = parse(['--constructor.prototype.y','123']); + t.equal({}.y, undefined); + t.equal(argv.y, undefined); + t.end(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/short.js b/node_modules/rc/node_modules/minimist/test/short.js new file mode 100644 index 0000000..d513a1c --- /dev/null +++ b/node_modules/rc/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/rc/node_modules/minimist/test/stop_early.js b/node_modules/rc/node_modules/minimist/test/stop_early.js new file mode 100644 index 0000000..bdf9fbc --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/stop_early.js @@ -0,0 +1,15 @@ +var parse = require('../'); +var test = require('tape'); + +test('stops parsing on the first non-option when stopEarly is set', function (t) { + var argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], { + stopEarly: true + }); + + t.deepEqual(argv, { + aaa: 'bbb', + _: ['ccc', '--ddd'] + }); + + t.end(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/unknown.js b/node_modules/rc/node_modules/minimist/test/unknown.js new file mode 100644 index 0000000..462a36b --- /dev/null +++ b/node_modules/rc/node_modules/minimist/test/unknown.js @@ -0,0 +1,102 @@ +var parse = require('../'); +var test = require('tape'); + +test('boolean and alias is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = [ '-h', 'true', '--derp', 'true' ]; + var regular = [ '--herp', 'true', '-d', 'true' ]; + var opts = { + alias: { h: 'herp' }, + boolean: 'h', + unknown: unknownFn + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + + t.same(unknown, ['--derp', '-d']); + t.end(); +}); + +test('flag boolean true any double hyphen argument is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], { + boolean: true, + unknown: unknownFn + }); + t.same(unknown, ['--tacos=good', 'cow', '-p']); + t.same(argv, { + honk: true, + _: [] + }); + t.end(); +}); + +test('string and alias is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = [ '-h', 'hello', '--derp', 'goodbye' ]; + var regular = [ '--herp', 'hello', '-d', 'moon' ]; + var opts = { + alias: { h: 'herp' }, + string: 'h', + unknown: unknownFn + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + + t.same(unknown, ['--derp', '-d']); + t.end(); +}); + +test('default and alias is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = [ '-h', 'hello' ]; + var regular = [ '--herp', 'hello' ]; + var opts = { + default: { 'h': 'bar' }, + alias: { 'h': 'herp' }, + unknown: unknownFn + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + + t.same(unknown, []); + t.end(); + unknownFn(); // exercise fn for 100% coverage +}); + +test('value following -- is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = [ '--bad', '--', 'good', 'arg' ]; + var opts = { + '--': true, + unknown: unknownFn + }; + var argv = parse(aliased, opts); + + t.same(unknown, ['--bad']); + t.same(argv, { + '--': ['good', 'arg'], + '_': [] + }) + t.end(); +}); diff --git a/node_modules/rc/node_modules/minimist/test/whitespace.js b/node_modules/rc/node_modules/minimist/test/whitespace.js new file mode 100644 index 0000000..8a52a58 --- /dev/null +++ b/node_modules/rc/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/rc/package.json b/node_modules/rc/package.json new file mode 100644 index 0000000..5deab88 --- /dev/null +++ b/node_modules/rc/package.json @@ -0,0 +1,69 @@ +{ + "_args": [ + [ + "rc@1.2.8", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "rc@1.2.8", + "_id": "rc@1.2.8", + "_inBundle": false, + "_integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "_location": "/rc", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "rc@1.2.8", + "name": "rc", + "escapedName": "rc", + "rawSpec": "1.2.8", + "saveSpec": null, + "fetchSpec": "1.2.8" + }, + "_requiredBy": [ + "/node-pre-gyp", + "/registry-auth-token", + "/registry-url" + ], + "_resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "_spec": "1.2.8", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "bin": { + "rc": "cli.js" + }, + "browser": "browser.js", + "bugs": { + "url": "https://github.com/dominictarr/rc/issues" + }, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "description": "hardwired configuration loader", + "homepage": "https://github.com/dominictarr/rc#readme", + "keywords": [ + "config", + "rc", + "unix", + "defaults" + ], + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "main": "index.js", + "name": "rc", + "repository": { + "type": "git", + "url": "git+https://github.com/dominictarr/rc.git" + }, + "scripts": { + "test": "set -e; node test/test.js; node test/ini.js; node test/nested-env-vars.js" + }, + "version": "1.2.8" +} diff --git a/node_modules/rc/test/ini.js b/node_modules/rc/test/ini.js new file mode 100644 index 0000000..e6857f8 --- /dev/null +++ b/node_modules/rc/test/ini.js @@ -0,0 +1,16 @@ +var cc =require('../lib/utils') +var INI = require('ini') +var assert = require('assert') + +function test(obj) { + + var _json, _ini + var json = cc.parse (_json = JSON.stringify(obj)) + var ini = cc.parse (_ini = INI.stringify(obj)) + console.log(_ini, _json) + assert.deepEqual(json, ini) +} + + +test({hello: true}) + diff --git a/node_modules/rc/test/nested-env-vars.js b/node_modules/rc/test/nested-env-vars.js new file mode 100644 index 0000000..0ecd176 --- /dev/null +++ b/node_modules/rc/test/nested-env-vars.js @@ -0,0 +1,50 @@ + +var seed = Math.random(); +var n = 'rc'+ seed; +var N = 'RC'+ seed; +var assert = require('assert') + + +// Basic usage +process.env[n+'_someOpt__a'] = 42 +process.env[n+'_someOpt__x__'] = 99 +process.env[n+'_someOpt__a__b'] = 186 +process.env[n+'_someOpt__a__b__c'] = 243 +process.env[n+'_someOpt__x__y'] = 1862 +process.env[n+'_someOpt__z'] = 186577 + +// Should ignore empty strings from orphaned '__' +process.env[n+'_someOpt__z__x__'] = 18629 +process.env[n+'_someOpt__w__w__'] = 18629 + +// Leading '__' should ignore everything up to 'z' +process.env[n+'___z__i__'] = 9999 + +// should ignore case for config name section. +process.env[N+'_test_upperCase'] = 187 + +function testPrefix(prefix) { + var config = require('../')(prefix, { + option: true + }) + + console.log('\n\n------ nested-env-vars ------\n',{prefix: prefix}, '\n', config); + + assert.equal(config.option, true) + assert.equal(config.someOpt.a, 42) + assert.equal(config.someOpt.x, 99) + // Should not override `a` once it's been set + assert.equal(config.someOpt.a/*.b*/, 42) + // Should not override `x` once it's been set + assert.equal(config.someOpt.x/*.y*/, 99) + assert.equal(config.someOpt.z, 186577) + // Should not override `z` once it's been set + assert.equal(config.someOpt.z/*.x*/, 186577) + assert.equal(config.someOpt.w.w, 18629) + assert.equal(config.z.i, 9999) + + assert.equal(config.test_upperCase, 187) +} + +testPrefix(n); +testPrefix(N); diff --git a/node_modules/rc/test/test.js b/node_modules/rc/test/test.js new file mode 100644 index 0000000..4f63351 --- /dev/null +++ b/node_modules/rc/test/test.js @@ -0,0 +1,59 @@ + +var n = 'rc'+Math.random() +var assert = require('assert') + +process.env[n+'_envOption'] = 42 + +var config = require('../')(n, { + option: true +}) + +console.log(config) + +assert.equal(config.option, true) +assert.equal(config.envOption, 42) + +var customArgv = require('../')(n, { + option: true +}, { // nopt-like argv + option: false, + envOption: 24, + argv: { + remain: [], + cooked: ['--no-option', '--envOption', '24'], + original: ['--no-option', '--envOption=24'] + } +}) + +console.log(customArgv) + +assert.equal(customArgv.option, false) +assert.equal(customArgv.envOption, 24) + +var fs = require('fs') +var path = require('path') +var jsonrc = path.resolve('.' + n + 'rc'); + +fs.writeFileSync(jsonrc, [ + '{', + '// json overrides default', + '"option": false,', + '/* env overrides json */', + '"envOption": 24', + '}' +].join('\n')); + +var commentedJSON = require('../')(n, { + option: true +}) + +fs.unlinkSync(jsonrc); + +console.log(commentedJSON) + +assert.equal(commentedJSON.option, false) +assert.equal(commentedJSON.envOption, 42) + +assert.equal(commentedJSON.config, jsonrc) +assert.equal(commentedJSON.configs.length, 1) +assert.equal(commentedJSON.configs[0], jsonrc) diff --git a/node_modules/readable-stream/.travis.yml b/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000..f62cdac --- /dev/null +++ b/node_modules/readable-stream/.travis.yml @@ -0,0 +1,34 @@ +sudo: false +language: node_js +before_install: + - (test $NPM_LEGACY && npm install -g npm@2 && npm install -g npm@3) || true +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: NPM_LEGACY=true + - node_js: '0.10' + env: NPM_LEGACY=true + - node_js: '0.11' + env: NPM_LEGACY=true + - node_js: '0.12' + env: NPM_LEGACY=true + - node_js: 1 + env: NPM_LEGACY=true + - node_js: 2 + env: NPM_LEGACY=true + - node_js: 3 + env: NPM_LEGACY=true + - node_js: 4 + - node_js: 5 + - node_js: 6 + - node_js: 7 + - node_js: 8 + - node_js: 9 +script: "npm run test" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000..f478d58 --- /dev/null +++ b/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/readable-stream/GOVERNANCE.md b/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000..16ffb93 --- /dev/null +++ b/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/readable-stream/LICENSE b/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000..2873b3b --- /dev/null +++ b/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/readable-stream/README.md b/node_modules/readable-stream/README.md new file mode 100644 index 0000000..23fe3f3 --- /dev/null +++ b/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000..83275f1 --- /dev/null +++ b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/readable-stream/duplex-browser.js b/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000..f8b2db8 --- /dev/null +++ b/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/readable-stream/duplex.js b/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000..46924cb --- /dev/null +++ b/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000..57003c3 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + 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); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// 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. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000..612edb4 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +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); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000..0f80764 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // 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; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // 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 readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + 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 event 'readable'/'data' is emitted + // 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 read 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; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // 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'; + + // 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) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// 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; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + 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); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// 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); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// 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 > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (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); + } else 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 (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!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) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + 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) pna.nextTick(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; + pna.nextTick(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('_read() is 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 : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + 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); + + var cleanedUp = false; + 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', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // 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(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + 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 (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // 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 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // 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, unpipeInfo); + 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, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + 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 (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// 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; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + 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); + while (state.flowing && stream.read() !== null) {} +} + +// 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 _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.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 (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// 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. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + 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; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000..fcfc105 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // 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; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +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('_transform() is 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 (ts.writechunk !== null && 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; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000..b0b0220 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // 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 writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + 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; + + // has it been destroyed + this.destroyed = 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.bufferedRequest = null; + this.lastBufferedRequest = null; + + // 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; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + 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, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, 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.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// 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, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } 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) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +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(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(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; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + 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); + entry = entry.next; + state.bufferedRequestCount--; + // 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) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) 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(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000..aefc68b --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000..5a0a0d8 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000..9332a3f --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000..ce2ad5b --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json new file mode 100644 index 0000000..2bd3825 --- /dev/null +++ b/node_modules/readable-stream/package.json @@ -0,0 +1,84 @@ +{ + "_args": [ + [ + "readable-stream@2.3.7", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "readable-stream@2.3.7", + "_id": "readable-stream@2.3.7", + "_inBundle": false, + "_integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "_location": "/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "readable-stream@2.3.7", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "2.3.7", + "saveSpec": null, + "fetchSpec": "2.3.7" + }, + "_requiredBy": [ + "/are-we-there-yet" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "_spec": "2.3.7", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.7" +} diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000..ffd791d --- /dev/null +++ b/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/readable-stream/readable-browser.js b/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000..e503725 --- /dev/null +++ b/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +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/readable-stream/readable.js b/node_modules/readable-stream/readable.js new file mode 100644 index 0000000..ec89ec5 --- /dev/null +++ b/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + 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/readable-stream/transform.js b/node_modules/readable-stream/transform.js new file mode 100644 index 0000000..b1baba2 --- /dev/null +++ b/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/readable-stream/writable-browser.js b/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000..ebdde6a --- /dev/null +++ b/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/readable-stream/writable.js b/node_modules/readable-stream/writable.js new file mode 100644 index 0000000..3211a6f --- /dev/null +++ b/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/readdirp/LICENSE b/node_modules/readdirp/LICENSE new file mode 100644 index 0000000..037cbb4 --- /dev/null +++ b/node_modules/readdirp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.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/readdirp/README.md b/node_modules/readdirp/README.md new file mode 100644 index 0000000..b3b3127 --- /dev/null +++ b/node_modules/readdirp/README.md @@ -0,0 +1,120 @@ +# readdirp [![Weekly downloads](https://img.shields.io/npm/dw/readdirp.svg)](https://github.com/paulmillr/readdirp) + +> Recursive version of [fs.readdir](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback). Exposes a **stream API** and a **promise API**. + +[![NPM](https://nodei.co/npm/readdirp.png)](https://www.npmjs.com/package/readdirp) + +```sh +npm install readdirp +``` + +```javascript +const readdirp = require('readdirp'); + +// Use streams to achieve small RAM & CPU footprint. +// 1) Streams example with for-await. +for await (const entry of readdirp('.')) { + const {path} = entry; + console.log(`${JSON.stringify({path})}`); +} + +// 2) Streams example, non for-await. +// Print out all JS files along with their size within the current folder & subfolders. +readdirp('.', {fileFilter: '*.js', alwaysStat: true}) + .on('data', (entry) => { + const {path, stats: {size}} = entry; + console.log(`${JSON.stringify({path, size})}`); + }) + // Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted + .on('warn', error => console.error('non-fatal error', error)) + .on('error', error => console.error('fatal error', error)) + .on('end', () => console.log('done')); + +// 3) Promise example. More RAM and CPU than streams / for-await. +const files = await readdirp.promise('.'); +console.log(files.map(file => file.path)); + +// Other options. +readdirp('test', { + fileFilter: '*.js', + directoryFilter: ['!.git', '!*modules'] + // directoryFilter: (di) => di.basename.length === 9 + type: 'files_directories', + depth: 1 +}); +``` + +For more examples, check out `examples` directory. + +## API + +`const stream = readdirp(root[, options])` — **Stream API** + +- Reads given root recursively and returns a `stream` of [entry infos](#entryinfo) +- Optionally can be used like `for await (const entry of stream)` with node.js 10+ (`asyncIterator`). +- `on('data', (entry) => {})` [entry info](#entryinfo) for every file / dir. +- `on('warn', (error) => {})` non-fatal `Error` that prevents a file / dir from being processed. Example: inaccessible to the user. +- `on('error', (error) => {})` fatal `Error` which also ends the stream. Example: illegal options where passed. +- `on('end')` — we are done. Called when all entries were found and no more will be emitted. +- `on('close')` — stream is destroyed via `stream.destroy()`. + Could be useful if you want to manually abort even on a non fatal error. + At that point the stream is no longer `readable` and no more entries, warning or errors are emitted +- To learn more about streams, consult the very detailed [nodejs streams documentation](https://nodejs.org/api/stream.html) + or the [stream-handbook](https://github.com/substack/stream-handbook) + +`const entries = await readdirp.promise(root[, options])` — **Promise API**. Returns a list of [entry infos](#entryinfo). + +First argument is awalys `root`, path in which to start reading and recursing into subdirectories. + +### options + +- `fileFilter: ["*.js"]`: filter to include or exclude files. A `Function`, Glob string or Array of glob strings. + - **Function**: a function that takes an entry info as a parameter and returns true to include or false to exclude the entry + - **Glob string**: a string (e.g., `*.js`) which is matched using [picomatch](https://github.com/micromatch/picomatch), so go there for more + information. Globstars (`**`) are not supported since specifying a recursive pattern for an already recursive function doesn't make sense. Negated globs (as explained in the minimatch documentation) are allowed, e.g., `!*.txt` matches everything but text files. + - **Array of glob strings**: either need to be all inclusive or all exclusive (negated) patterns otherwise an error is thrown. + `['*.json', '*.js']` includes all JavaScript and Json files. + `['!.git', '!node_modules']` includes all directories except the '.git' and 'node_modules'. + - Directories that do not pass a filter will not be recursed into. +- `directoryFilter: ['!.git']`: filter to include/exclude directories found and to recurse into. Directories that do not pass a filter will not be recursed into. +- `depth: 5`: depth at which to stop recursing even if more subdirectories are found +- `type: 'files'`: determines if data events on the stream should be emitted for `'files'` (default), `'directories'`, `'files_directories'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes. +- `alwaysStat: false`: always return `stats` property for every file. Setting it to `true` can double readdir execution time - use it only when you need file `size`, `mtime` etc. Cannot be enabled on node <10.10.0. +- `lstat: false`: include symlink entries in the stream along with files. When `true`, `fs.lstat` would be used instead of `fs.stat` + +### `EntryInfo` + +Has the following properties: + +- `path: 'assets/javascripts/react.js'`: path to the file/directory (relative to given root) +- `fullPath: '/Users/dev/projects/app/assets/javascripts/react.js'`: full path to the file/directory found +- `basename: 'react.js'`: name of the file/directory +- `dirent: fs.Dirent`: built-in [dir entry object](https://nodejs.org/api/fs.html#fs_class_fs_dirent) - only with `alwaysStat: false` +- `stats: fs.Stats`: built in [stat object](https://nodejs.org/api/fs.html#fs_class_fs_stats) - only with `alwaysStat: true` + +## Changelog + +- 3.3 (Dec 6, 2019) stabilizes RAM consumption and enables perf management with `highWaterMark` option. Fixes race conditions related to `for-await` looping. +- 3.2 (Oct 14, 2019) improves performance by 250% and makes streams implementation more idiomatic. +- 3.1 (Jul 7, 2019) brings `bigint` support to `stat` output on Windows. This is backwards-incompatible for some cases. Be careful. It you use it incorrectly, you'll see "TypeError: Cannot mix BigInt and other types, use explicit conversions". +- 3.0 brings huge performance improvements and stream backpressure support. +- Upgrading 2.x to 3.x: + - Signature changed from `readdirp(options)` to `readdirp(root, options)` + - Replaced callback API with promise API. + - Renamed `entryType` option to `type` + - Renamed `entryType: 'both'` to `'files_directories'` + - `EntryInfo` + - Renamed `stat` to `stats` + - Emitted only when `alwaysStat: true` + - `dirent` is emitted instead of `stats` by default with `alwaysStat: false` + - Renamed `name` to `basename` + - Removed `parentDir` and `fullParentDir` properties +- Supported node.js versions: + - 3.x: node 8+ + - 2.x: node 0.6+ + +## License + +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller () + +MIT License, see [LICENSE](LICENSE) file. diff --git a/node_modules/readdirp/index.d.ts b/node_modules/readdirp/index.d.ts new file mode 100644 index 0000000..2ef9860 --- /dev/null +++ b/node_modules/readdirp/index.d.ts @@ -0,0 +1,43 @@ +// TypeScript Version: 3.2 + +/// + +import * as fs from 'fs'; +import { Readable } from 'stream'; + +declare namespace readdir { + interface EntryInfo { + path: string; + fullPath: string; + basename: string; + stats?: fs.Stats; + dirent?: fs.Dirent; + } + + interface ReaddirpOptions { + root?: string; + fileFilter?: string | string[] | ((entry: EntryInfo) => boolean); + directoryFilter?: (entry: EntryInfo) => boolean; + type?: 'files' | 'directories' | 'files_directories' | 'all'; + lstat?: boolean; + depth?: number; + alwaysStat?: boolean; + } + + interface ReaddirpStream extends Readable, AsyncIterable { + read(): EntryInfo; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + + function promise( + root: string, + options?: ReaddirpOptions + ): Promise; +} + +declare function readdir( + root: string, + options?: readdir.ReaddirpOptions +): readdir.ReaddirpStream; + +export = readdir; diff --git a/node_modules/readdirp/index.js b/node_modules/readdirp/index.js new file mode 100644 index 0000000..d033a3f --- /dev/null +++ b/node_modules/readdirp/index.js @@ -0,0 +1,254 @@ +'use strict'; + +const fs = require('fs'); +const { Readable } = require('stream'); +const sysPath = require('path'); +const { promisify } = require('util'); +const picomatch = require('picomatch'); + +const readdir = promisify(fs.readdir); +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); + +/** + * @typedef {Object} EntryInfo + * @property {String} path + * @property {String} fullPath + * @property {fs.Stats=} stats + * @property {fs.Dirent=} dirent + * @property {String} basename + */ + +const BANG = '!'; +const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP']); +const FILE_TYPE = 'files'; +const DIR_TYPE = 'directories'; +const FILE_DIR_TYPE = 'files_directories'; +const EVERYTHING_TYPE = 'all'; +const ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE]; + +const isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code); + +const normalizeFilter = filter => { + if (filter === undefined) return; + if (typeof filter === 'function') return filter; + + if (typeof filter === 'string') { + const glob = picomatch(filter.trim()); + return entry => glob(entry.basename); + } + + if (Array.isArray(filter)) { + const positive = []; + const negative = []; + for (const item of filter) { + const trimmed = item.trim(); + if (trimmed.charAt(0) === BANG) { + negative.push(picomatch(trimmed.slice(1))); + } else { + positive.push(picomatch(trimmed)); + } + } + + if (negative.length > 0) { + if (positive.length > 0) { + return entry => + positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename)); + } + return entry => !negative.some(f => f(entry.basename)); + } + return entry => positive.some(f => f(entry.basename)); + } +}; + +class ReaddirpStream extends Readable { + static get defaultOptions() { + return { + root: '.', + /* eslint-disable no-unused-vars */ + fileFilter: (path) => true, + directoryFilter: (path) => true, + /* eslint-enable no-unused-vars */ + type: FILE_TYPE, + lstat: false, + depth: 2147483648, + alwaysStat: false + }; + } + + constructor(options = {}) { + super({ + objectMode: true, + autoDestroy: true, + highWaterMark: options.highWaterMark || 4096 + }); + const opts = { ...ReaddirpStream.defaultOptions, ...options }; + const { root, type } = opts; + + this._fileFilter = normalizeFilter(opts.fileFilter); + this._directoryFilter = normalizeFilter(opts.directoryFilter); + + const statMethod = opts.lstat ? lstat : stat; + // Use bigint stats if it's windows and stat() supports options (node 10+). + if (process.platform === 'win32' && stat.length === 3) { + this._stat = path => statMethod(path, { bigint: true }); + } else { + this._stat = statMethod; + } + + this._maxDepth = opts.depth; + this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsEverything = type === EVERYTHING_TYPE; + this._root = sysPath.resolve(root); + this._isDirent = ('Dirent' in fs) && !opts.alwaysStat; + this._statsProp = this._isDirent ? 'dirent' : 'stats'; + this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent }; + + // Launch stream with one parent, the root dir. + try { + this.parents = [this._exploreDir(root, 1)]; + } catch (error) { + this.destroy(error); + } + this.reading = false; + this.parent = undefined; + } + + async _read(batch) { + if (this.reading) return; + this.reading = true; + + try { + while (!this.destroyed && batch > 0) { + const { path, depth, files = [] } = this.parent || {}; + + if (files.length > 0) { + const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path)); + for (const entry of await Promise.all(slice)) { + if (this._isDirAndMatchesFilter(entry)) { + if (depth <= this._maxDepth) { + this.parents.push(this._exploreDir(entry.fullPath, depth + 1)); + } + + if (this._wantsDir) { + this.push(entry); + batch--; + } + } else if (this._isFileAndMatchesFilter(entry)) { + if (this._wantsFile) { + this.push(entry); + batch--; + } + } + } + } else { + const parent = this.parents.pop(); + if (!parent) { + this.push(null); + break; + } + this.parent = await parent; + } + } + } catch (error) { + this.destroy(error); + } finally { + this.reading = false; + } + } + + async _exploreDir(path, depth) { + let files; + try { + files = await readdir(path, this._rdOptions); + } catch (error) { + this._onError(error); + } + return {files, depth, path}; + } + + async _formatEntry(dirent, path) { + const basename = this._isDirent ? dirent.name : dirent; + const fullPath = sysPath.resolve(sysPath.join(path, basename)); + const entry = {path: sysPath.relative(this._root, fullPath), fullPath, basename}; + try { + entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath); + } catch (err) { + this._onError(err); + } + return entry; + } + + _onError(err) { + if (isNormalFlowError(err) && !this.destroyed) { + this.emit('warn', err); + } else { + throw err; + } + } + + _isDirAndMatchesFilter(entry) { + // entry may be undefined, because a warning or an error were emitted + // and the statsProp is undefined + const stats = entry && entry[this._statsProp]; + return stats && stats.isDirectory() && this._directoryFilter(entry); + } + + _isFileAndMatchesFilter(entry) { + const stats = entry && entry[this._statsProp]; + const isFileType = stats && ( + (this._wantsEverything && !stats.isDirectory()) || + (stats.isFile() || stats.isSymbolicLink()) + ); + return isFileType && this._fileFilter(entry); + } +} + +/** + * @typedef {Object} ReaddirpArguments + * @property {Function=} fileFilter + * @property {Function=} directoryFilter + * @property {String=} type + * @property {Number=} depth + * @property {String=} root + * @property {Boolean=} lstat + * @property {Boolean=} bigint + */ + +/** + * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. + * @param {String} root Root directory + * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth + */ +const readdirp = (root, options = {}) => { + let type = options.entryType || options.type; + if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility + if (type) options.type = type; + if (!root) { + throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)'); + } else if (typeof root !== 'string') { + throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)'); + } else if (type && !ALL_TYPES.includes(type)) { + throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`); + } + + options.root = root; + return new ReaddirpStream(options); +}; + +const readdirpPromise = (root, options = {}) => { + return new Promise((resolve, reject) => { + const files = []; + readdirp(root, options) + .on('data', entry => files.push(entry)) + .on('end', () => resolve(files)) + .on('error', error => reject(error)); + }); +}; + +readdirp.promise = readdirpPromise; +readdirp.ReaddirpStream = ReaddirpStream; +readdirp.default = readdirp; + +module.exports = readdirp; diff --git a/node_modules/readdirp/package.json b/node_modules/readdirp/package.json new file mode 100644 index 0000000..1a0db25 --- /dev/null +++ b/node_modules/readdirp/package.json @@ -0,0 +1,161 @@ +{ + "_args": [ + [ + "readdirp@3.3.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "readdirp@3.3.0", + "_id": "readdirp@3.3.0", + "_inBundle": false, + "_integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "_location": "/readdirp", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "readdirp@3.3.0", + "name": "readdirp", + "escapedName": "readdirp", + "rawSpec": "3.3.0", + "saveSpec": null, + "fetchSpec": "3.3.0" + }, + "_requiredBy": [ + "/chokidar" + ], + "_resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "_spec": "3.3.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Thorsten Lorenz", + "email": "thlorenz@gmx.de", + "url": "thlorenz.com" + }, + "bugs": { + "url": "https://github.com/paulmillr/readdirp/issues" + }, + "contributors": [ + { + "name": "Thorsten Lorenz", + "email": "thlorenz@gmx.de", + "url": "thlorenz.com" + }, + { + "name": "Paul Miller", + "url": "https://paulmillr.com" + } + ], + "dependencies": { + "picomatch": "^2.0.7" + }, + "description": "Recursive version of fs.readdir with streaming API.", + "devDependencies": { + "@types/node": "^12", + "chai": "^4.2", + "chai-subset": "^1.6", + "dtslint": "^2.0.0", + "eslint": "^6.6.0", + "mocha": "^6.2.2", + "nyc": "^14.1.1", + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "eslintConfig": { + "root": true, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 9, + "sourceType": "script" + }, + "env": { + "node": true, + "es6": true + }, + "rules": { + "array-callback-return": "error", + "no-empty": [ + "error", + { + "allowEmptyCatch": true + } + ], + "no-else-return": [ + "error", + { + "allowElseIf": false + } + ], + "no-lonely-if": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-arrow-callback": [ + "error", + { + "allowNamedFunctions": true + } + ], + "prefer-const": [ + "error", + { + "ignoreReadBeforeAssign": true + } + ], + "prefer-destructuring": [ + "error", + { + "object": true, + "array": false + } + ], + "prefer-spread": "error", + "prefer-template": "error", + "radix": "error", + "semi": "error", + "strict": "error", + "quotes": [ + "error", + "single" + ] + } + }, + "files": [ + "index.js", + "index.d.ts" + ], + "homepage": "https://github.com/paulmillr/readdirp", + "keywords": [ + "recursive", + "fs", + "stream", + "streams", + "readdir", + "filesystem", + "find", + "filter" + ], + "license": "MIT", + "main": "index.js", + "name": "readdirp", + "nyc": { + "reporter": [ + "html", + "text" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/paulmillr/readdirp.git" + }, + "scripts": { + "dtslint": "dtslint", + "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", + "mocha": "mocha --exit", + "nyc": "nyc", + "test": "npm run lint && nyc npm run mocha" + }, + "version": "3.3.0" +} diff --git a/node_modules/rechoir/.npmignore b/node_modules/rechoir/.npmignore new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/node_modules/rechoir/.npmignore @@ -0,0 +1 @@ +test diff --git a/node_modules/rechoir/.travis.yml b/node_modules/rechoir/.travis.yml new file mode 100644 index 0000000..57e9fda --- /dev/null +++ b/node_modules/rechoir/.travis.yml @@ -0,0 +1,24 @@ +sudo: false +language: node_js +node_js: + - "0.10" + - "0.12" +env: + global: + - REMOVE_DEPS="" + matrix: + - "CUSTOM_DEPS=coffee-script@~1.3" + - "CUSTOM_DEPS=coffee-script@~1.5" + - "CUSTOM_DEPS=coffee-script@~1.7" + - "CUSTOM_DEPS=coffee-script@latest" + - "CUSTOM_DEPS=iced-coffee-script@1.6.3-j" + - "CUSTOM_DEPS=iced-coffee-script@latest" + - "CUSTOM_DEPS=LiveScript@1.3.1 REMOVE_DEPS=livescript" + - "CUSTOM_DEPS=typescript-require REMOVE_DEPS=typescript-register" +matrix: + fast_finish: true +before_install: + - "npm install -g npm" # needs the newest version of npm +before_script: + - "[ \"${REMOVE_DEPS}\" == \"\" ] || npm rm $REMOVE_DEPS" + - "npm install $CUSTOM_DEPS" # install a specific version of dependencies diff --git a/node_modules/rechoir/CHANGELOG b/node_modules/rechoir/CHANGELOG new file mode 100644 index 0000000..e10327b --- /dev/null +++ b/node_modules/rechoir/CHANGELOG @@ -0,0 +1,38 @@ +v0.6.2: + date: 2015-07-22 + changes: + - Return `undefined` when an unknown extension is provided to prepare and + the `nothrow` option is specified. +v0.6.1: + date: 2015-05-22 + changes: + - Add option for not throwing. +v0.6.0: + date: 2015-05-20 + changes: + - Include module name when prepare is successful. +v0.5.0: + date: 2015-05-20 + changes: + - Overhaul to support interpret 0.6.0. +v0.3.0: + date: 2015-01-10 + changes: + - Breaking: `load` method removed. + - Improved extension recognition. + - No longer fails upon dots in filenames. + - Support confuration objects. + - Support and test ES6. + - Support legacy module loading. +v0.2.2: + date: 2014-12-17 + changes: + - Expose interpret. +v0.2.0: + date: 2014-04-20 + changes: + - Simplify loading of coffee-script and iced-coffee-script. +v0.1.0: + date: 2014-04-20 + changes: + - Initial public release. diff --git a/node_modules/rechoir/LICENSE b/node_modules/rechoir/LICENSE new file mode 100644 index 0000000..f467993 --- /dev/null +++ b/node_modules/rechoir/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 Tyler Kellen + +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/rechoir/README.md b/node_modules/rechoir/README.md new file mode 100644 index 0000000..32280c0 --- /dev/null +++ b/node_modules/rechoir/README.md @@ -0,0 +1,42 @@ +# rechoir [![Build Status](https://secure.travis-ci.org/tkellen/js-rechoir.png)](http://travis-ci.org/tkellen/js-rechoir) +> Require any supported file as a node module. + +[![NPM](https://nodei.co/npm/rechoir.png)](https://nodei.co/npm/rechoir/) + +## What is it? +This module, in conjunction with [interpret]-like objects can register any file type the npm ecosystem has a module loader for. This library is a dependency of [Liftoff]. + +## API + +### prepare(config, filepath, requireFrom) +Look for a module loader associated with the provided file and attempt require it. If necessary, run any setup required to inject it into [require.extensions](http://nodejs.org/api/globals.html#globals_require_extensions). + +`config` An [interpret]-like configuration object. + +`filepath` A file whose type you'd like to register a module loader for. + +`requireFrom` An optional path to start searching for the module required to load the requested file. Defaults to the directory of `filepath`. + +If calling this method is successful (aka: it doesn't throw), you can now require files of the type you requested natively. + +An error with a `failures` property will be thrown if the module loader(s) configured for a given extension cannot be registered. + +If a loader is already registered, this will simply return `true`. + +**Note:** While rechoir will automatically load and register transpilers like `coffee-script`, you must provide a local installation. The transpilers are **not** bundled with this module. + +#### Usage +```js +const config = require('interpret').extensions; +const rechoir = require('rechoir'); +rechoir.prepare(config, './test/fixtures/test.coffee'); +rechoir.prepare(config, './test/fixtures/test.csv'); +rechoir.prepare(config, './test/fixtures/test.toml'); + +console.log(require('./test/fixtures/test.coffee')); +console.log(require('./test/fixtures/test.csv')); +console.log(require('./test/fixtures/test.toml')); +``` + +[interpret]: http://github.com/tkellen/js-interpret +[Liftoff]: http://github.com/tkellen/js-liftoff diff --git a/node_modules/rechoir/index.js b/node_modules/rechoir/index.js new file mode 100644 index 0000000..0c36d05 --- /dev/null +++ b/node_modules/rechoir/index.js @@ -0,0 +1,59 @@ +const path = require('path'); + +const extension = require('./lib/extension'); +const normalize = require('./lib/normalize'); +const register = require('./lib/register'); + +exports.prepare = function (extensions, filepath, cwd, nothrow) { + var option, attempt; + var attempts = []; + var err; + var onlyErrors = false; + var ext = extension(filepath); + if (Object.keys(require.extensions).indexOf(ext) !== -1) { + return true; + } + var config = normalize(extensions[ext]); + if (!config) { + if (nothrow) { + return; + } else { + throw new Error('No module loader found for "'+ext+'".'); + } + } + if (!cwd) { + cwd = path.dirname(path.resolve(filepath)); + } + if (!Array.isArray(config)) { + config = [config]; + } + for (var i in config) { + option = config[i]; + attempt = register(cwd, option.module, option.register); + error = (attempt instanceof Error) ? attempt : null; + if (error) { + attempt = null; + } + attempts.push({ + moduleName: option.module, + module: attempt, + error: error + }); + if (!error) { + onlyErrors = false; + break; + } else { + onlyErrors = true; + } + } + if (onlyErrors) { + err = new Error('Unable to use specified module loaders for "'+ext+'".'); + err.failures = attempts; + if (nothrow) { + return err; + } else { + throw err; + } + } + return attempts; +}; diff --git a/node_modules/rechoir/lib/extension.js b/node_modules/rechoir/lib/extension.js new file mode 100644 index 0000000..60f19da --- /dev/null +++ b/node_modules/rechoir/lib/extension.js @@ -0,0 +1,11 @@ +const path = require('path'); + +const EXTRE = /^[.]?[^.]+([.].*)$/; + +module.exports = function (input) { + var extension = EXTRE.exec(path.basename(input)); + if (!extension) { + return; + } + return extension[1]; +}; diff --git a/node_modules/rechoir/lib/normalize.js b/node_modules/rechoir/lib/normalize.js new file mode 100644 index 0000000..0da5e58 --- /dev/null +++ b/node_modules/rechoir/lib/normalize.js @@ -0,0 +1,15 @@ +function normalizer (config) { + if (typeof config === 'string') { + return { + module: config + } + } + return config; +}; + +module.exports = function (config) { + if (Array.isArray(config)) { + return config.map(normalizer); + } + return normalizer(config); +}; diff --git a/node_modules/rechoir/lib/register.js b/node_modules/rechoir/lib/register.js new file mode 100644 index 0000000..20e8ca7 --- /dev/null +++ b/node_modules/rechoir/lib/register.js @@ -0,0 +1,15 @@ +const path = require('path'); +const resolve = require('resolve'); + +module.exports = function (cwd, moduleName, register) { + try { + var modulePath = resolve.sync(moduleName, {basedir: cwd}); + var result = require(modulePath); + if (typeof register === 'function') { + register(result); + } + } catch (e) { + result = e; + } + return result; +}; diff --git a/node_modules/rechoir/package.json b/node_modules/rechoir/package.json new file mode 100644 index 0000000..dc1440a --- /dev/null +++ b/node_modules/rechoir/package.json @@ -0,0 +1,116 @@ +{ + "_args": [ + [ + "rechoir@0.6.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "rechoir@0.6.2", + "_id": "rechoir@0.6.2", + "_inBundle": false, + "_integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "_location": "/rechoir", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "rechoir@0.6.2", + "name": "rechoir", + "escapedName": "rechoir", + "rawSpec": "0.6.2", + "saveSpec": null, + "fetchSpec": "0.6.2" + }, + "_requiredBy": [ + "/liftoff" + ], + "_resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "_spec": "0.6.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Tyler Kellen", + "url": "http://goingslowly.com/" + }, + "bugs": { + "url": "https://github.com/tkellen/node-rechoir/issues" + }, + "dependencies": { + "resolve": "^1.1.6" + }, + "description": "Require any supported file as a node module.", + "devDependencies": { + "babel": "^5.4.3", + "chai": "^2.3.0", + "coco": "^0.9.1", + "coffee-script": "^1.9.2", + "earlgrey": "0.0.9", + "iced-coffee-script": "^1.8.0-d", + "interpret": "^0.6.1", + "json5": "^0.4.0", + "livescript": "^1.4.0", + "mocha": "^2.2.5", + "node-jsx": "^0.13.3", + "require-csv": "0.0.1", + "require-ini": "0.0.1", + "require-uncached": "^1.0.2", + "require-xml": "0.0.1", + "require-yaml": "0.0.1", + "rimraf": "^2.3.4", + "semver": "^4.3.4", + "sinon": "^1.14.1", + "toml-require": "^1.0.1", + "typescript-register": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + }, + "homepage": "https://github.com/tkellen/node-rechoir", + "keywords": [ + "require", + "cjsx", + "co", + "coco", + "coffee-script", + "coffee", + "coffee.md", + "csv", + "earlgrey", + "es", + "es6", + "iced", + "iced.md", + "iced-coffee-script", + "ini", + "js", + "json", + "json5", + "jsx", + "react", + "litcoffee", + "liticed", + "ls", + "livescript", + "toml", + "ts", + "typescript", + "xml", + "yaml", + "yml" + ], + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/tkellen/node-rechoir/blob/master/LICENSE" + } + ], + "main": "index.js", + "name": "rechoir", + "repository": { + "type": "git", + "url": "git://github.com/tkellen/node-rechoir.git" + }, + "scripts": { + "test": "mocha -R spec test/index.js" + }, + "version": "0.6.2" +} diff --git a/node_modules/referrer-policy/CHANGELOG.md b/node_modules/referrer-policy/CHANGELOG.md new file mode 100644 index 0000000..39a701a --- /dev/null +++ b/node_modules/referrer-policy/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +## 1.2.0 - 2019-05-03 +### Added +- Allow multiple values to be set. See [#7](https://github.com/helmetjs/referrer-policy/issues/7) +- Added TypeScript type definitions. See [helmetjs/helmet#188](https://github.com/helmetjs/helmet/issues/188) +- Created a changelog + +### Changed +- Updated documentation + +Changes in versions 1.1.0 and below can be found in [Helmet's changelog](https://github.com/helmetjs/helmet/blob/master/CHANGELOG.md). diff --git a/node_modules/referrer-policy/LICENSE b/node_modules/referrer-policy/LICENSE new file mode 100644 index 0000000..5460b01 --- /dev/null +++ b/node_modules/referrer-policy/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-2019 Evan Hahn + +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/referrer-policy/README.md b/node_modules/referrer-policy/README.md new file mode 100644 index 0000000..e7c6841 --- /dev/null +++ b/node_modules/referrer-policy/README.md @@ -0,0 +1,22 @@ +Referrer Policy +=============== +[![Build Status](https://travis-ci.org/helmetjs/referrer-policy.svg?branch=master)](https://travis-ci.org/helmetjs/referrer-policy) + +The [Referer HTTP header](https://en.wikipedia.org/wiki/HTTP_referer) is typically set by web browsers to tell the server where it's coming from. For example, if you click a link on *example.com/index.html* that takes you to *wikipedia.org*, Wikipedia's servers will see `Referer: example.com`. This can have privacy implications—websites can see where you are coming from. The new [`Referrer-Policy` HTTP header](https://www.w3.org/TR/referrer-policy/#referrer-policy-header) lets authors control how browsers set the Referer header. + +[Read the spec](https://www.w3.org/TR/referrer-policy/#referrer-policies) to see the options you can provide. + +Usage: + +```javascript +const referrerPolicy = require('referrer-policy') + +app.use(referrerPolicy({ policy: 'same-origin' })) +// Referrer-Policy: same-origin + +app.use(referrerPolicy({ policy: 'unsafe-url' })) +// Referrer-Policy: unsafe-url + +app.use(referrerPolicy()) +// Referrer-Policy: no-referrer +``` diff --git a/node_modules/referrer-policy/dist/index.d.ts b/node_modules/referrer-policy/dist/index.d.ts new file mode 100644 index 0000000..9a0605a --- /dev/null +++ b/node_modules/referrer-policy/dist/index.d.ts @@ -0,0 +1,7 @@ +/// +import { IncomingMessage, ServerResponse } from 'http'; +interface ReferrerPolicyOptions { + policy?: string | string[]; +} +declare const _default: (options?: ReferrerPolicyOptions | undefined) => (_req: IncomingMessage, res: ServerResponse, next: () => void) => void; +export = _default; diff --git a/node_modules/referrer-policy/dist/index.js b/node_modules/referrer-policy/dist/index.js new file mode 100644 index 0000000..e974650 --- /dev/null +++ b/node_modules/referrer-policy/dist/index.js @@ -0,0 +1,53 @@ +"use strict"; +function getHeaderValueFromOptions(options) { + var DEFAULT_POLICY = 'no-referrer'; + var ALLOWED_POLICIES = [ + 'no-referrer', + 'no-referrer-when-downgrade', + 'same-origin', + 'origin', + 'strict-origin', + 'origin-when-cross-origin', + 'strict-origin-when-cross-origin', + 'unsafe-url', + '' + ]; + options = options || {}; + var policyOption; + if ('policy' in options) { + policyOption = options.policy; + } + else { + policyOption = DEFAULT_POLICY; + } + var policies = Array.isArray(policyOption) ? policyOption : [policyOption]; + if (policies.length === 0) { + throw new Error('At least one policy must be supplied.'); + } + var policiesSeen = new Set(); + policies.forEach(function (policy) { + if ((typeof policy !== 'string') || (ALLOWED_POLICIES.indexOf(policy) === -1)) { + var allowedPoliciesErrorList = ALLOWED_POLICIES.map(function (policy) { + if (policy.length) { + return "\"" + policy + "\""; + } + else { + return 'and the empty string'; + } + }).join(', '); + throw new Error("\"" + policy + "\" is not a valid policy. Allowed policies: " + allowedPoliciesErrorList + "."); + } + if (policiesSeen.has(policy)) { + throw new Error("\"" + policy + "\" specified more than once. No duplicates are allowed."); + } + policiesSeen.add(policy); + }); + return policies.join(','); +} +module.exports = function referrerPolicy(options) { + var headerValue = getHeaderValueFromOptions(options); + return function referrerPolicy(_req, res, next) { + res.setHeader('Referrer-Policy', headerValue); + next(); + }; +}; diff --git a/node_modules/referrer-policy/package.json b/node_modules/referrer-policy/package.json new file mode 100644 index 0000000..e2c4c19 --- /dev/null +++ b/node_modules/referrer-policy/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + "referrer-policy@1.2.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "referrer-policy@1.2.0", + "_id": "referrer-policy@1.2.0", + "_inBundle": false, + "_integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "_location": "/referrer-policy", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "referrer-policy@1.2.0", + "name": "referrer-policy", + "escapedName": "referrer-policy", + "rawSpec": "1.2.0", + "saveSpec": null, + "fetchSpec": "1.2.0" + }, + "_requiredBy": [ + "/helmet" + ], + "_resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "_spec": "1.2.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Evan Hahn", + "email": "me@evanhahn.com", + "url": "https://evanhahn.com" + }, + "bugs": { + "url": "https://github.com/helmetjs/referrer-policy/issues" + }, + "description": "Middleware to set the Referrer-Policy HTTP header", + "devDependencies": { + "@types/connect": "^3.4.32", + "@types/jest": "^24.0.11", + "@types/supertest": "^2.0.7", + "@typescript-eslint/eslint-plugin": "^1.7.0", + "@typescript-eslint/parser": "^1.7.0", + "connect": "^3.6.6", + "eslint": "^5.16.0", + "jest": "^24.7.1", + "supertest": "^3.4.2", + "ts-jest": "^24.0.2", + "typescript": "^3.4.5" + }, + "engines": { + "node": ">=4.0.0" + }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "dist/index.js", + "dist/index.d.ts" + ], + "homepage": "https://helmetjs.github.io/docs/referrer-policy/", + "keywords": [ + "helmet", + "security", + "express", + "connect", + "referer", + "referrer", + "privacy" + ], + "license": "MIT", + "main": "./dist/index.js", + "name": "referrer-policy", + "repository": { + "type": "git", + "url": "git://github.com/helmetjs/referrer-policy.git" + }, + "scripts": { + "build": "npm run clean && tsc", + "clean": "rm -rf dist", + "lint": "eslint --fix '**/*.ts'", + "prepublishOnly": "npm run build", + "pretest": "npm run lint", + "test": "jest --config test/jest-config.json" + }, + "typings": "./dist/index.d.ts", + "version": "1.2.0" +} diff --git a/node_modules/regex-not/LICENSE b/node_modules/regex-not/LICENSE new file mode 100644 index 0000000..8ee09d9 --- /dev/null +++ b/node_modules/regex-not/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016, 2018, Jon Schlinkert. + +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/regex-not/README.md b/node_modules/regex-not/README.md new file mode 100644 index 0000000..24d00e7 --- /dev/null +++ b/node_modules/regex-not/README.md @@ -0,0 +1,133 @@ +# regex-not [![NPM version](https://img.shields.io/npm/v/regex-not.svg?style=flat)](https://www.npmjs.com/package/regex-not) [![NPM monthly downloads](https://img.shields.io/npm/dm/regex-not.svg?style=flat)](https://npmjs.org/package/regex-not) [![NPM total downloads](https://img.shields.io/npm/dt/regex-not.svg?style=flat)](https://npmjs.org/package/regex-not) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/regex-not.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/regex-not) + +> Create a javascript regular expression for matching everything except for the given string. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save regex-not +``` + +## Usage + +```js +var not = require('regex-not'); +``` + +The main export is a function that takes a string an options object. + +```js +not(string[, options]); +``` + +**Example** + +```js +var not = require('regex-not'); +console.log(not('foo')); +//=> /^(?:(?!^(?:foo)$).)+$/ +``` + +**Strict matching** + +By default, the returned regex is for strictly (not) matching the exact given pattern (in other words, "match this string if it does NOT _exactly equal_ `foo`"): + +```js +var re = not('foo'); +console.log(re.test('foo')); //=> false +console.log(re.test('bar')); //=> true +console.log(re.test('foobar')); //=> true +console.log(re.test('barfoo')); //=> true +``` + +### .create + +Returns a string to allow you to create your own regex: + +```js +console.log(not.create('foo')); +//=> '(?:(?!^(?:foo)$).)+' +``` + +### Options + +**options.contains** + +You can relax strict matching by setting `options.contains` to true (in other words, "match this string if it does NOT _contain_ `foo`"): + +```js +var re = not('foo'); +console.log(re.test('foo', {contains: true})); //=> false +console.log(re.test('bar', {contains: true})); //=> true +console.log(re.test('foobar', {contains: true})); //=> false +console.log(re.test('barfoo', {contains: true})); //=> false +``` + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Related projects + +You might also be interested in these projects: + +* [regex-cache](https://www.npmjs.com/package/regex-cache): Memoize the results of a call to the RegExp constructor, avoiding repetitious runtime compilation of… [more](https://github.com/jonschlinkert/regex-cache) | [homepage](https://github.com/jonschlinkert/regex-cache "Memoize the results of a call to the RegExp constructor, avoiding repetitious runtime compilation of the same string and options, resulting in surprising performance improvements.") +* [to-regex](https://www.npmjs.com/package/to-regex): Generate a regex from a string or array of strings. | [homepage](https://github.com/jonschlinkert/to-regex "Generate a regex from a string or array of strings.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 9 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [doowb](https://github.com/doowb) | +| 1 | [EdwardBetts](https://github.com/EdwardBetts) | + +### Author + +**Jon Schlinkert** + +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 19, 2018._ \ No newline at end of file diff --git a/node_modules/regex-not/index.js b/node_modules/regex-not/index.js new file mode 100644 index 0000000..02bfed4 --- /dev/null +++ b/node_modules/regex-not/index.js @@ -0,0 +1,72 @@ +'use strict'; + +var extend = require('extend-shallow'); +var safe = require('safe-regex'); + +/** + * The main export is a function that takes a `pattern` string and an `options` object. + * + * ```js + & var not = require('regex-not'); + & console.log(not('foo')); + & //=> /^(?:(?!^(?:foo)$).)*$/ + * ``` + * + * @param {String} `pattern` + * @param {Object} `options` + * @return {RegExp} Converts the given `pattern` to a regex using the specified `options`. + * @api public + */ + +function toRegex(pattern, options) { + return new RegExp(toRegex.create(pattern, options)); +} + +/** + * Create a regex-compatible string from the given `pattern` and `options`. + * + * ```js + & var not = require('regex-not'); + & console.log(not.create('foo')); + & //=> '^(?:(?!^(?:foo)$).)*$' + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {String} + * @api public + */ + +toRegex.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var opts = extend({}, options); + if (opts.contains === true) { + opts.strictNegate = false; + } + + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var endChar = opts.endChar ? opts.endChar : '+'; + var str = pattern; + + if (opts.strictNegate === false) { + str = '(?:(?!(?:' + pattern + ')).)' + endChar; + } else { + str = '(?:(?!^(?:' + pattern + ')$).)' + endChar; + } + + var res = open + str + close; + if (opts.safe === true && safe(res) === false) { + throw new Error('potentially unsafe regular expression: ' + res); + } + + return res; +}; + +/** + * Expose `toRegex` + */ + +module.exports = toRegex; diff --git a/node_modules/regex-not/package.json b/node_modules/regex-not/package.json new file mode 100644 index 0000000..bcb53ab --- /dev/null +++ b/node_modules/regex-not/package.json @@ -0,0 +1,101 @@ +{ + "_args": [ + [ + "regex-not@1.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "regex-not@1.0.2", + "_id": "regex-not@1.0.2", + "_inBundle": false, + "_integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "_location": "/regex-not", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "regex-not@1.0.2", + "name": "regex-not", + "escapedName": "regex-not", + "rawSpec": "1.0.2", + "saveSpec": null, + "fetchSpec": "1.0.2" + }, + "_requiredBy": [ + "/expand-brackets", + "/extglob", + "/micromatch", + "/nanomatch", + "/to-regex" + ], + "_resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "_spec": "1.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/regex-not/issues" + }, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "description": "Create a javascript regular expression for matching everything except for the given string.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/regex-not", + "keywords": [ + "exec", + "match", + "negate", + "negation", + "not", + "regex", + "regular expression", + "test" + ], + "license": "MIT", + "main": "index.js", + "name": "regex-not", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/regex-not.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "regex-cache", + "to-regex" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.0.2" +} diff --git a/node_modules/registry-auth-token/.npmignore b/node_modules/registry-auth-token/.npmignore new file mode 100644 index 0000000..4196028 --- /dev/null +++ b/node_modules/registry-auth-token/.npmignore @@ -0,0 +1,6 @@ +.editorconfig +.eslintignore +.eslintrc +.travis.yml +npm-debug.log +coverage diff --git a/node_modules/registry-auth-token/CHANGELOG.md b/node_modules/registry-auth-token/CHANGELOG.md new file mode 100644 index 0000000..20e82e8 --- /dev/null +++ b/node_modules/registry-auth-token/CHANGELOG.md @@ -0,0 +1,112 @@ +# Change Log + +All notable changes will be documented in this file. + +## [3.4.0] - 2019-03-20 + +### Changes + +- Enabled legacy auth token to be read from environment variable (Martin Flodin) + +## [3.3.2] - 2018-01-26 + +### Changes + +- Support password with ENV variable tokens (Nowell Strite) + +## [3.3.1] - 2017-05-02 + +### Fixes + +- Auth legacy token is basic auth (Hutson Betts) + +## [3.3.0] - 2017-04-24 + +### Changes + +- Support legacy auth token config key (Zoltan Kochan) +- Use safe-buffer module for backwards-compatible base64 encoding/decoding (Espen Hovlandsdal) +- Change to standard.js coding style (Espen Hovlandsdal) + +## [3.2.0] - 2017-04-20 + +### Changes + +- Allow passing parsed npmrc from outside (Zoltan Kochan) + +## [3.1.2] - 2017-04-07 + +### Changes + +- Avoid infinite loop on invalid URL (Zoltan Kochan) + +## [3.1.1] - 2017-04-06 + +### Changes + +- Nerf-dart URLs even if recursive is set to false (Espen Hovlandsdal) + +## [3.1.0] - 2016-10-19 + +### Changes + +- Return the password and username for Basic authorization (Zoltan Kochan) + +## [3.0.1] - 2016-08-07 + +### Changes + +- Fix recursion bug (Lukas Eipert) +- Implement alternative base64 encoding/decoding implementation for Node 6 (Lukas Eipert) + +## [3.0.0] - 2016-08-04 + +### Added + +- Support for Basic Authentication (username/password) (Lukas Eipert) + +### Changes + +- The result format of the output changed from a simple string to an object which contains the token type + +```js + // before: returns 'tokenString' + // after: returns {token: 'tokenString', type: 'Bearer'} + getAuthToken() +``` + +## [2.1.1] - 2016-07-10 + +### Changes + +- Fix infinite loop when recursively resolving registry URLs on Windows (Espen Hovlandsdal) + +## [2.1.0] - 2016-07-07 + +### Added + +- Add feature to find configured registry URL for a scope (Espen Hovlandsdal) + +## [2.0.0] - 2016-06-17 + +### Changes + +- Fix tokens defined by reference to environment variables (Dan MacTough) + +## [1.1.1] - 2016-04-26 + +### Changes + +- Fix for registries with port number in URL (Ryan Day) + +[1.1.1]: https://github.com/rexxars/registry-auth-token/compare/a5b4fe2f5ff982110eb8a813ba1b3b3c5d851af1...v1.1.1 +[2.0.0]: https://github.com/rexxars/registry-auth-token/compare/v1.1.1...v2.0.0 +[2.1.0]: https://github.com/rexxars/registry-auth-token/compare/v2.0.0...v2.1.0 +[2.1.1]: https://github.com/rexxars/registry-auth-token/compare/v2.1.0...v2.1.1 +[3.0.0]: https://github.com/rexxars/registry-auth-token/compare/v2.1.1...v3.0.0 +[3.0.1]: https://github.com/rexxars/registry-auth-token/compare/v3.0.0...v3.0.1 +[3.1.0]: https://github.com/rexxars/registry-auth-token/compare/v3.0.1...v3.1.0 +[3.1.1]: https://github.com/rexxars/registry-auth-token/compare/v3.1.0...v3.1.1 +[3.1.2]: https://github.com/rexxars/registry-auth-token/compare/v3.1.1...v3.1.2 +[3.2.0]: https://github.com/rexxars/registry-auth-token/compare/v3.1.2...v3.2.0 +[3.3.0]: https://github.com/rexxars/registry-auth-token/compare/v3.2.0...v3.3.0 diff --git a/node_modules/registry-auth-token/LICENSE b/node_modules/registry-auth-token/LICENSE new file mode 100644 index 0000000..0de12e3 --- /dev/null +++ b/node_modules/registry-auth-token/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Espen Hovlandsdal + +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/registry-auth-token/README.md b/node_modules/registry-auth-token/README.md new file mode 100644 index 0000000..5ac9c1a --- /dev/null +++ b/node_modules/registry-auth-token/README.md @@ -0,0 +1,65 @@ +# registry-auth-token + +[![npm version](http://img.shields.io/npm/v/registry-auth-token.svg?style=flat-square)](http://browsenpm.org/package/registry-auth-token)[![Build Status](http://img.shields.io/travis/rexxars/registry-auth-token/master.svg?style=flat-square)](https://travis-ci.org/rexxars/registry-auth-token) + +Get the auth token set for an npm registry from `.npmrc`. Also allows fetching the configured registry URL for a given npm scope. + +## Installing + +``` +npm install --save registry-auth-token +``` + +## Usage + +Returns an object containing `token` and `type`, or `undefined` if no token can be found. `type` can be either `Bearer` or `Basic`. + +```js +var getAuthToken = require('registry-auth-token') +var getRegistryUrl = require('registry-auth-token/registry-url') + +// Get auth token and type for default `registry` set in `.npmrc` +console.log(getAuthToken()) // {token: 'someToken', type: 'Bearer'} + +// Get auth token for a specific registry URL +console.log(getAuthToken('//registry.foo.bar')) + +// Find the registry auth token for a given URL (with deep path): +// If registry is at `//some.host/registry` +// URL passed is `//some.host/registry/deep/path` +// Will find token the closest matching path; `//some.host/registry` +console.log(getAuthToken('//some.host/registry/deep/path', {recursive: true})) + +// Find the configured registry url for scope `@foobar`. +// Falls back to the global registry if not defined. +console.log(getRegistryUrl('@foobar')) + +// Use the npm config that is passed in +console.log(getRegistryUrl('http://registry.foobar.eu/', { + npmrc: { + 'registry': 'http://registry.foobar.eu/', + '//registry.foobar.eu/:_authToken': 'qar' + } +})) +``` + +## Return value + +```js +// If auth info can be found: +{token: 'someToken', type: 'Bearer'} + +// Or: +{token: 'someOtherToken', type: 'Basic'} + +// Or, if nothing is found: +undefined +``` + +## Security + +Please be careful when using this. Leaking your auth token is dangerous. + +## License + +MIT-licensed. See LICENSE. diff --git a/node_modules/registry-auth-token/base64.js b/node_modules/registry-auth-token/base64.js new file mode 100644 index 0000000..d208ae1 --- /dev/null +++ b/node_modules/registry-auth-token/base64.js @@ -0,0 +1,14 @@ +const safeBuffer = require('safe-buffer').Buffer + +function decodeBase64 (base64) { + return safeBuffer.from(base64, 'base64').toString('utf8') +} + +function encodeBase64 (string) { + return safeBuffer.from(string, 'utf8').toString('base64') +} + +module.exports = { + decodeBase64: decodeBase64, + encodeBase64: encodeBase64 +} diff --git a/node_modules/registry-auth-token/index.js b/node_modules/registry-auth-token/index.js new file mode 100644 index 0000000..f8c6216 --- /dev/null +++ b/node_modules/registry-auth-token/index.js @@ -0,0 +1,123 @@ +var url = require('url') +var base64 = require('./base64') + +var decodeBase64 = base64.decodeBase64 +var encodeBase64 = base64.encodeBase64 + +var tokenKey = ':_authToken' +var userKey = ':username' +var passwordKey = ':_password' + +module.exports = function () { + var checkUrl + var options + if (arguments.length >= 2) { + checkUrl = arguments[0] + options = arguments[1] + } else if (typeof arguments[0] === 'string') { + checkUrl = arguments[0] + } else { + options = arguments[0] + } + options = options || {} + options.npmrc = options.npmrc || require('rc')('npm', {registry: 'https://registry.npmjs.org/'}) + checkUrl = checkUrl || options.npmrc.registry + return getRegistryAuthInfo(checkUrl, options) || getLegacyAuthInfo(options.npmrc) +} + +function getRegistryAuthInfo (checkUrl, options) { + var parsed = url.parse(checkUrl, false, true) + var pathname + + while (pathname !== '/' && parsed.pathname !== pathname) { + pathname = parsed.pathname || '/' + + var regUrl = '//' + parsed.host + pathname.replace(/\/$/, '') + var authInfo = getAuthInfoForUrl(regUrl, options.npmrc) + if (authInfo) { + return authInfo + } + + // break if not recursive + if (!options.recursive) { + return /\/$/.test(checkUrl) + ? undefined + : getRegistryAuthInfo(url.resolve(checkUrl, '.'), options) + } + + parsed.pathname = url.resolve(normalizePath(pathname), '..') || '/' + } + + return undefined +} + +function getLegacyAuthInfo (npmrc) { + if (!npmrc._auth) { + return undefined + } + + var token = replaceEnvironmentVariable(npmrc._auth) + + return {token: token, type: 'Basic'} +} + +function normalizePath (path) { + return path[path.length - 1] === '/' ? path : path + '/' +} + +function getAuthInfoForUrl (regUrl, npmrc) { + // try to get bearer token + var bearerAuth = getBearerToken(npmrc[regUrl + tokenKey] || npmrc[regUrl + '/' + tokenKey]) + if (bearerAuth) { + return bearerAuth + } + + // try to get basic token + var username = npmrc[regUrl + userKey] || npmrc[regUrl + '/' + userKey] + var password = npmrc[regUrl + passwordKey] || npmrc[regUrl + '/' + passwordKey] + var basicAuth = getTokenForUsernameAndPassword(username, password) + if (basicAuth) { + return basicAuth + } + + return undefined +} + +function replaceEnvironmentVariable (token) { + return token.replace(/^\$\{?([^}]*)\}?$/, function (fullMatch, envVar) { + return process.env[envVar] + }) +} + +function getBearerToken (tok) { + if (!tok) { + return undefined + } + + // check if bearer token is set as environment variable + var token = replaceEnvironmentVariable(tok) + + return {token: token, type: 'Bearer'} +} + +function getTokenForUsernameAndPassword (username, password) { + if (!username || !password) { + return undefined + } + + // passwords are base64 encoded, so we need to decode it + // See https://github.com/npm/npm/blob/v3.10.6/lib/config/set-credentials-by-uri.js#L26 + var pass = decodeBase64(replaceEnvironmentVariable(password)) + + // a basic auth token is base64 encoded 'username:password' + // See https://github.com/npm/npm/blob/v3.10.6/lib/config/get-credentials-by-uri.js#L70 + var token = encodeBase64(username + ':' + pass) + + // we found a basicToken token so let's exit the loop + return { + token: token, + type: 'Basic', + password: pass, + username: username + } +} diff --git a/node_modules/registry-auth-token/package.json b/node_modules/registry-auth-token/package.json new file mode 100644 index 0000000..cc435c1 --- /dev/null +++ b/node_modules/registry-auth-token/package.json @@ -0,0 +1,78 @@ +{ + "_args": [ + [ + "registry-auth-token@3.4.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "registry-auth-token@3.4.0", + "_id": "registry-auth-token@3.4.0", + "_inBundle": false, + "_integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "_location": "/registry-auth-token", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "registry-auth-token@3.4.0", + "name": "registry-auth-token", + "escapedName": "registry-auth-token", + "rawSpec": "3.4.0", + "saveSpec": null, + "fetchSpec": "3.4.0" + }, + "_requiredBy": [ + "/package-json" + ], + "_resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "_spec": "3.4.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Espen Hovlandsdal", + "email": "espen@hovlandsdal.com" + }, + "bugs": { + "url": "https://github.com/rexxars/registry-auth-token/issues" + }, + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + }, + "description": "Get the auth token set for an npm registry (if any)", + "devDependencies": { + "istanbul": "^0.4.2", + "mocha": "^3.3.0", + "require-uncached": "^1.0.2", + "standard": "^10.0.2" + }, + "homepage": "https://github.com/rexxars/registry-auth-token#readme", + "keywords": [ + "npm", + "conf", + "config", + "npmconf", + "registry", + "auth", + "token", + "authtoken" + ], + "license": "MIT", + "main": "index.js", + "name": "registry-auth-token", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/rexxars/registry-auth-token.git" + }, + "scripts": { + "coverage": "istanbul cover _mocha", + "posttest": "standard", + "test": "mocha" + }, + "standard": { + "ignore": [ + "coverage/**" + ] + }, + "version": "3.4.0" +} diff --git a/node_modules/registry-auth-token/registry-url.js b/node_modules/registry-auth-token/registry-url.js new file mode 100644 index 0000000..9da9a44 --- /dev/null +++ b/node_modules/registry-auth-token/registry-url.js @@ -0,0 +1,5 @@ +module.exports = function (scope, npmrc) { + var rc = npmrc || require('rc')('npm', {registry: 'https://registry.npmjs.org/'}) + var url = rc[scope + ':registry'] || rc.registry + return url.slice(-1) === '/' ? url : url + '/' +} diff --git a/node_modules/registry-auth-token/test/auth-token.test.js b/node_modules/registry-auth-token/test/auth-token.test.js new file mode 100644 index 0000000..5db6f5a --- /dev/null +++ b/node_modules/registry-auth-token/test/auth-token.test.js @@ -0,0 +1,455 @@ +var fs = require('fs') +var path = require('path') +var mocha = require('mocha') +var assert = require('assert') +var requireUncached = require('require-uncached') + +var npmRcPath = path.join(__dirname, '..', '.npmrc') +var afterEach = mocha.afterEach +var describe = mocha.describe +var it = mocha.it + +var base64 = require('../base64') +var decodeBase64 = base64.decodeBase64 +var encodeBase64 = base64.encodeBase64 + +/* eslint max-nested-callbacks: ["error", 4] */ + +describe('auth-token', function () { + afterEach(function (done) { + fs.unlink(npmRcPath, function () { + done() + }) + }) + + it('should read global if no local is found', function () { + var getAuthToken = requireUncached('../index') + getAuthToken() + }) + + it('should return undefined if no auth token is given for registry', function (done) { + fs.writeFile(npmRcPath, 'registry=http://registry.npmjs.eu/', function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert(!getAuthToken()) + done() + }) + }) + + describe('legacy auth token', function () { + it('should return auth token if it is defined in the legacy way via the `_auth` key', function (done) { + var content = [ + '_auth=foobar', + 'registry=http://registry.foobar.eu/' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Basic'}) + done() + }) + }) + + it('should return legacy auth token defined by reference to an environment variable (with curly braces)', function (done) { + var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__' + var content = [ + '_auth=${' + environmentVariable + '}', + 'registry=http://registry.foobar.eu/' + ].join('\n') + + process.env[environmentVariable] = 'foobar' + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Basic'}) + delete process.env[environmentVariable] + done() + }) + }) + + it('should return legacy auth token defined by reference to an environment variable (without curly braces)', function (done) { + var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__' + var content = [ + '_auth=$' + environmentVariable, + 'registry=http://registry.foobar.eu/' + ].join('\n') + + process.env[environmentVariable] = 'foobar' + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Basic'}) + delete process.env[environmentVariable] + done() + }) + }) + }) + + describe('bearer token', function () { + it('should return auth token if registry is defined', function (done) { + var content = [ + 'registry=http://registry.foobar.eu/', + '//registry.foobar.eu/:_authToken=foobar', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Bearer'}) + done() + }) + }) + + it('should use npmrc passed in', function (done) { + var content = [ + 'registry=http://registry.foobar.eu/', + '//registry.foobar.eu/:_authToken=foobar', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + const npmrc = { + 'registry': 'http://registry.foobar.eu/', + '//registry.foobar.eu/:_authToken': 'qar' + } + assert.deepEqual(getAuthToken({npmrc: npmrc}), {token: 'qar', type: 'Bearer'}) + done() + }) + }) + + it('should return auth token if registry url has port specified', function (done) { + var content = [ + 'registry=http://localhost:8770/', + // before the patch this token was selected. + '//localhost/:_authToken=ohno', + '//localhost:8770/:_authToken=beepboop', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'beepboop', type: 'Bearer'}) + done() + }) + }) + + it('should return auth token defined by reference to an environment variable (with curly braces)', function (done) { + var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__' + var content = [ + 'registry=http://registry.foobar.cc/', + '//registry.foobar.cc/:_authToken=${' + environmentVariable + '}', '' + ].join('\n') + process.env[environmentVariable] = 'foobar' + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Bearer'}) + delete process.env[environmentVariable] + done() + }) + }) + + it('should return auth token defined by reference to an environment variable (without curly braces)', function (done) { + var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__' + var content = [ + 'registry=http://registry.foobar.cc/', + '//registry.foobar.cc/:_authToken=$' + environmentVariable, '' + ].join('\n') + process.env[environmentVariable] = 'foobar' + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Bearer'}) + delete process.env[environmentVariable] + done() + }) + }) + + it('should try with and without a slash at the end of registry url', function (done) { + var content = [ + 'registry=http://registry.foobar.eu', + '//registry.foobar.eu:_authToken=barbaz', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken(), {token: 'barbaz', type: 'Bearer'}) + done() + }) + }) + + it('should fetch for the registry given (if defined)', function (done) { + var content = [ + '//registry.foobar.eu:_authToken=barbaz', + '//registry.blah.foo:_authToken=whatev', + '//registry.last.thing:_authToken=yep', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken('//registry.blah.foo'), {token: 'whatev', type: 'Bearer'}) + done() + }) + }) + + it('recursively finds registries for deep url if option is set', function (done, undef) { + var opts = {recursive: true} + var content = [ + '//registry.blah.com/foo:_authToken=whatev', + '//registry.blah.org/foo/bar:_authToken=recurseExactlyOneLevel', + '//registry.blah.edu/foo/bar/baz:_authToken=recurseNoLevel', + '//registry.blah.eu:_authToken=yep', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken('https://registry.blah.edu/foo/bar/baz', opts), {token: 'recurseNoLevel', type: 'Bearer'}) + assert.deepEqual(getAuthToken('https://registry.blah.org/foo/bar/baz', opts), {token: 'recurseExactlyOneLevel', type: 'Bearer'}) + assert.deepEqual(getAuthToken('https://registry.blah.com/foo/bar/baz', opts), {token: 'whatev', type: 'Bearer'}) + assert.deepEqual(getAuthToken('http://registry.blah.eu/what/ever', opts), {token: 'yep', type: 'Bearer'}) + assert.deepEqual(getAuthToken('http://registry.blah.eu//what/ever', opts), undefined, 'does not hang') + assert.equal(getAuthToken('//some.registry', opts), undef) + done() + }) + }) + + it('should try both with and without trailing slash', function (done) { + fs.writeFile(npmRcPath, '//registry.blah.com:_authToken=whatev', function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken('https://registry.blah.com'), {token: 'whatev', type: 'Bearer'}) + done() + }) + }) + + it('should prefer bearer token over basic token', function (done) { + var content = [ + 'registry=http://registry.foobar.eu/', + 'registry=http://registry.foobar.eu/', + '//registry.foobar.eu/:_authToken=bearerToken', + '//registry.foobar.eu/:_password=' + encodeBase64('foobar'), + '//registry.foobar.eu/:username=foobar', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual(getAuthToken('//registry.foobar.eu'), {token: 'bearerToken', type: 'Bearer'}) + done() + }) + }) + + it('"nerf darts" registry urls', function (done, undef) { + fs.writeFile(npmRcPath, '//contoso.pkgs.visualstudio.com/_packaging/MyFeed/npm/:_authToken=heider', function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.deepEqual( + getAuthToken('https://contoso.pkgs.visualstudio.com/_packaging/MyFeed/npm/registry'), + {token: 'heider', type: 'Bearer'} + ) + done() + }) + }) + }) + + describe('basic token', function () { + it('should return undefined if password or username are missing', function (done, undef) { + var content = [ + 'registry=http://registry.foobar.eu/', + '//registry.foobar.eu/:_password=' + encodeBase64('foobar'), + '//registry.foobar.com/:username=foobar', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + assert.equal(getAuthToken('//registry.foobar.eu'), undef) + assert.equal(getAuthToken('//registry.foobar.com'), undef) + done() + }) + }) + + it('should return basic token if username and password are defined', function (done) { + var content = [ + 'registry=http://registry.foobar.eu/', + '//registry.foobar.eu/:_password=' + encodeBase64('foobar'), + '//registry.foobar.eu/:username=foobar', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken() + assert.deepEqual(token, { + token: 'Zm9vYmFyOmZvb2Jhcg==', + type: 'Basic', + username: 'foobar', + password: 'foobar' + }) + assert.equal(decodeBase64(token.token), 'foobar:foobar') + done() + }) + }) + + it('should return basic token if registry url has port specified', function (done) { + var content = [ + 'registry=http://localhost:8770/', + // before the patch this token was selected. + '//localhost/:_authToken=ohno', + '//localhost:8770/:_password=' + encodeBase64('foobar'), + '//localhost:8770/:username=foobar', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken() + assert.deepEqual(token, { + token: 'Zm9vYmFyOmZvb2Jhcg==', + type: 'Basic', + username: 'foobar', + password: 'foobar' + }) + assert.equal(decodeBase64(token.token), 'foobar:foobar') + done() + }) + }) + + it('should return password defined by reference to an environment variable (with curly braces)', function (done) { + var environmentVariable = '__REGISTRY_PASSWORD__' + var content = [ + 'registry=http://registry.foobar.cc/', + '//registry.foobar.cc/:username=username', + '//registry.foobar.cc/:_password=${' + environmentVariable + '}', '' + ].join('\n') + process.env[environmentVariable] = encodeBase64('password') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken() + assert.deepEqual(token, { + type: 'Basic', + username: 'username', + password: 'password', + token: 'dXNlcm5hbWU6cGFzc3dvcmQ=' + }) + assert.equal(decodeBase64(token.token), 'username:password') + delete process.env[environmentVariable] + done() + }) + }) + + it('should return password defined by reference to an environment variable (without curly braces)', function (done) { + var environmentVariable = '__REGISTRY_PASSWORD__' + var content = [ + 'registry=http://registry.foobar.cc/', + '//registry.foobar.cc/:username=username', + '//registry.foobar.cc/:_password=$' + environmentVariable, '' + ].join('\n') + process.env[environmentVariable] = encodeBase64('password') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken() + assert.deepEqual(token, { + type: 'Basic', + username: 'username', + password: 'password', + token: 'dXNlcm5hbWU6cGFzc3dvcmQ=' + }) + assert.equal(decodeBase64(token.token), 'username:password') + delete process.env[environmentVariable] + done() + }) + }) + + it('should try with and without a slash at the end of registry url', function (done) { + var content = [ + 'registry=http://registry.foobar.eu', + '//registry.foobar.eu:_password=' + encodeBase64('barbay'), + '//registry.foobar.eu:username=barbaz', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken() + assert.deepEqual(token, { + token: 'YmFyYmF6OmJhcmJheQ==', + type: 'Basic', + password: 'barbay', + username: 'barbaz' + }) + assert.equal(decodeBase64(token.token), 'barbaz:barbay') + done() + }) + }) + + it('should fetch for the registry given (if defined)', function (done) { + var content = [ + '//registry.foobar.eu:_authToken=barbaz', + '//registry.blah.foo:_password=' + encodeBase64('barbay'), + '//registry.blah.foo:username=barbaz', + '//registry.last.thing:_authToken=yep', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken('//registry.blah.foo') + assert.deepEqual(token, { + token: 'YmFyYmF6OmJhcmJheQ==', + type: 'Basic', + password: 'barbay', + username: 'barbaz' + }) + assert.equal(decodeBase64(token.token), 'barbaz:barbay') + done() + }) + }) + + it('recursively finds registries for deep url if option is set', function (done, undef) { + var opts = {recursive: true} + var content = [ + '//registry.blah.com/foo:_password=' + encodeBase64('barbay'), + '//registry.blah.com/foo:username=barbaz', + '//registry.blah.eu:username=barbaz', + '//registry.blah.eu:_password=' + encodeBase64('foobaz'), '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getAuthToken = requireUncached('../index') + assert(!err, err) + var token = getAuthToken('https://registry.blah.com/foo/bar/baz', opts) + assert.deepEqual(token, { + token: 'YmFyYmF6OmJhcmJheQ==', + type: 'Basic', + password: 'barbay', + username: 'barbaz' + }) + assert.equal(decodeBase64(token.token), 'barbaz:barbay') + token = getAuthToken('https://registry.blah.eu/foo/bar/baz', opts) + assert.deepEqual(token, { + token: 'YmFyYmF6OmZvb2Jheg==', + type: 'Basic', + password: 'foobaz', + username: 'barbaz' + }) + assert.equal(decodeBase64(token.token), 'barbaz:foobaz') + assert.equal(getAuthToken('//some.registry', opts), undef) + done() + }) + }) + }) +}) diff --git a/node_modules/registry-auth-token/test/registry-url.test.js b/node_modules/registry-auth-token/test/registry-url.test.js new file mode 100644 index 0000000..adb6951 --- /dev/null +++ b/node_modules/registry-auth-token/test/registry-url.test.js @@ -0,0 +1,64 @@ +var fs = require('fs') +var path = require('path') +var mocha = require('mocha') +var assert = require('assert') +var requireUncached = require('require-uncached') + +var npmRcPath = path.join(__dirname, '..', '.npmrc') +var afterEach = mocha.afterEach +var describe = mocha.describe +var it = mocha.it + +describe('registry-url', function () { + afterEach(function (done) { + fs.unlink(npmRcPath, function () { + done() + }) + }) + + it('should read global if no local is found', function () { + var getRegistryUrl = requireUncached('../registry-url') + getRegistryUrl() + }) + + it('should return default registry if no url is given for scope', function (done) { + fs.writeFile(npmRcPath, 'registry=https://registry.npmjs.org/', function (err) { + var getRegistryUrl = requireUncached('../registry-url') + assert(!err, err) + assert.equal(getRegistryUrl('@somescope'), 'https://registry.npmjs.org/') + done() + }) + }) + + it('should return registry url if url is given for scope ', function (done) { + fs.writeFile(npmRcPath, '@somescope:registry=https://some.registry/', function (err) { + var getRegistryUrl = requireUncached('../registry-url') + assert(!err, err) + assert.equal(getRegistryUrl('@somescope'), 'https://some.registry/') + done() + }) + }) + + it('should append trailing slash if not present', function (done) { + fs.writeFile(npmRcPath, '@somescope:registry=https://some.registry', function (err) { + var getRegistryUrl = requireUncached('../registry-url') + assert(!err, err) + assert.equal(getRegistryUrl('@somescope'), 'https://some.registry/') + done() + }) + }) + + it('should return configured global registry if given', function (done) { + var content = [ + 'registry=http://registry.foobar.eu/', + '@somescope:registry=https://some.url/', '' + ].join('\n') + + fs.writeFile(npmRcPath, content, function (err) { + var getRegistryUrl = requireUncached('../registry-url') + assert(!err, err) + assert.equal(getRegistryUrl(), 'http://registry.foobar.eu/') + done() + }) + }) +}) diff --git a/node_modules/registry-auth-token/yarn.lock b/node_modules/registry-auth-token/yarn.lock new file mode 100644 index 0000000..46c1357 --- /dev/null +++ b/node_modules/registry-auth-token/yarn.lock @@ -0,0 +1,1516 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.2.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array.prototype.find@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +async@1.x, async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +babel-code-frame@^6.16.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +debug-log@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +deglob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +doctrine@1.5.0, doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +error-ex@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.7.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.38" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-standard-jsx@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz#009e53c4ddb1e9ee70b4650ffe63a7f39f8836e1" + +eslint-config-standard@10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-node@~4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz#c04390ab8dbcbb6887174023d6f3a72769e63b97" + dependencies: + ignore "^3.0.11" + minimatch "^3.0.2" + object-assign "^4.0.1" + resolve "^1.1.7" + semver "5.3.0" + +eslint-plugin-promise@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz#78fbb6ffe047201627569e85a6c5373af2a68fca" + +eslint-plugin-react@~6.10.0: + version "6.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + +eslint-plugin-standard@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" + +eslint@~3.19.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" + dependencies: + acorn "^5.2.1" + acorn-jsx "^3.0.0" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +find-root@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.14.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +handlebars@^4.0.1: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +ignore@^3.0.11, ignore@^3.0.9, ignore@^3.2.0: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-my-json-valid@^2.10.0: + version "2.17.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +istanbul@^0.4.2: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.x, js-yaml@^3.5.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-parse-better-errors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsx-ast-utils@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash@^4.0.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^3.3.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-keys@^1.0.11, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.assign@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-conf@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + +pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.2.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-parallel@^1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +semver@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +shelljs@^0.7.5: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +standard-engine@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-7.0.0.tgz#ebb77b9c8fc2c8165ffa353bd91ba0dff41af690" + dependencies: + deglob "^2.1.0" + get-stdin "^5.0.1" + minimist "^1.1.0" + pkg-conf "^2.0.0" + +standard@^10.0.2: + version "10.0.3" + resolved "https://registry.yarnpkg.com/standard/-/standard-10.0.3.tgz#7869bcbf422bdeeaab689a1ffb1fea9677dd50ea" + dependencies: + eslint "~3.19.0" + eslint-config-standard "10.2.1" + eslint-config-standard-jsx "4.0.2" + eslint-plugin-import "~2.2.0" + eslint-plugin-node "~4.2.2" + eslint-plugin-promise "~3.5.0" + eslint-plugin-react "~6.10.0" + eslint-plugin-standard "~3.0.1" + standard-engine "~7.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +which@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/node_modules/registry-url/index.js b/node_modules/registry-url/index.js new file mode 100644 index 0000000..5502a23 --- /dev/null +++ b/node_modules/registry-url/index.js @@ -0,0 +1,6 @@ +'use strict'; +module.exports = function (scope) { + var rc = require('rc')('npm', {registry: 'https://registry.npmjs.org/'}); + var url = rc[scope + ':registry'] || rc.registry; + return url.slice(-1) === '/' ? url : url + '/'; +}; diff --git a/node_modules/registry-url/license b/node_modules/registry-url/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/registry-url/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/registry-url/package.json b/node_modules/registry-url/package.json new file mode 100644 index 0000000..124af12 --- /dev/null +++ b/node_modules/registry-url/package.json @@ -0,0 +1,76 @@ +{ + "_args": [ + [ + "registry-url@3.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "registry-url@3.1.0", + "_id": "registry-url@3.1.0", + "_inBundle": false, + "_integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "_location": "/registry-url", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "registry-url@3.1.0", + "name": "registry-url", + "escapedName": "registry-url", + "rawSpec": "3.1.0", + "saveSpec": null, + "fetchSpec": "3.1.0" + }, + "_requiredBy": [ + "/package-json" + ], + "_resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "_spec": "3.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/registry-url/issues" + }, + "dependencies": { + "rc": "^1.0.1" + }, + "description": "Get the set npm registry URL", + "devDependencies": { + "ava": "*", + "pify": "^2.3.0", + "require-uncached": "^1.0.2", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/registry-url#readme", + "keywords": [ + "npm", + "conf", + "config", + "npmconf", + "registry", + "url", + "uri", + "scope" + ], + "license": "MIT", + "name": "registry-url", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/registry-url.git" + }, + "scripts": { + "test": "xo && ava --serial" + }, + "version": "3.1.0" +} diff --git a/node_modules/registry-url/readme.md b/node_modules/registry-url/readme.md new file mode 100644 index 0000000..6fc55bc --- /dev/null +++ b/node_modules/registry-url/readme.md @@ -0,0 +1,50 @@ +# registry-url [![Build Status](https://travis-ci.org/sindresorhus/registry-url.svg?branch=master)](https://travis-ci.org/sindresorhus/registry-url) + +> Get the set npm registry URL + +It's usually `https://registry.npmjs.org/`, but [configurable](https://www.npmjs.org/doc/misc/npm-config.html#registry). + +Use this if you do anything with the npm registry as users will expect it to use their configured registry. + + +## Install + +``` +$ npm install --save registry-url +``` + + +## Usage + +```ini +# .npmrc +registry = 'https://custom-registry.com/' +``` + +```js +const registryUrl = require('registry-url'); + +console.log(registryUrl()); +//=> 'https://custom-registry.com/' +``` + +It can also retrieve the registry URL associated with an [npm scope](https://docs.npmjs.com/misc/scope). + +```ini +# .npmrc +@myco:registry = 'https://custom-registry.com/' +``` + +```js +const registryUrl = require('registry-url'); + +console.log(registryUrl('@myco')); +//=> 'https://custom-registry.com/' +``` + +If the provided scope is not in the user's `.npmrc` file, then `registry-url` will check for the existence of `registry`, or if that's not set, fallback to the default npm registry. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/repeat-element/LICENSE b/node_modules/repeat-element/LICENSE new file mode 100644 index 0000000..7cccaf9 --- /dev/null +++ b/node_modules/repeat-element/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present, Jon Schlinkert. + +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/repeat-element/README.md b/node_modules/repeat-element/README.md new file mode 100644 index 0000000..6006418 --- /dev/null +++ b/node_modules/repeat-element/README.md @@ -0,0 +1,99 @@ +# repeat-element [![NPM version](https://img.shields.io/npm/v/repeat-element.svg?style=flat)](https://www.npmjs.com/package/repeat-element) [![NPM monthly downloads](https://img.shields.io/npm/dm/repeat-element.svg?style=flat)](https://npmjs.org/package/repeat-element) [![NPM total downloads](https://img.shields.io/npm/dt/repeat-element.svg?style=flat)](https://npmjs.org/package/repeat-element) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/repeat-element.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/repeat-element) + +> Create an array by repeating the given value n times. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save repeat-element +``` + +## Usage + +```js +const repeat = require('repeat-element'); + +repeat('a', 5); +//=> ['a', 'a', 'a', 'a', 'a'] + +repeat('a', 1); +//=> ['a'] + +repeat('a', 0); +//=> [] + +repeat(null, 5) +//» [ null, null, null, null, null ] + +repeat({some: 'object'}, 5) +//» [ { some: 'object' }, +// { some: 'object' }, +// { some: 'object' }, +// { some: 'object' }, +// { some: 'object' } ] + +repeat(5, 5) +//» [ 5, 5, 5, 5, 5 ] +``` + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 17 | [jonschlinkert](https://github.com/jonschlinkert) | +| 3 | [LinusU](https://github.com/LinusU) | +| 1 | [architectcodes](https://github.com/architectcodes) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on August 19, 2018._ \ No newline at end of file diff --git a/node_modules/repeat-element/index.js b/node_modules/repeat-element/index.js new file mode 100644 index 0000000..06a8d01 --- /dev/null +++ b/node_modules/repeat-element/index.js @@ -0,0 +1,18 @@ +/*! + * repeat-element + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Licensed under the MIT license. + */ + +'use strict'; + +module.exports = function repeat(ele, num) { + var arr = new Array(num); + + for (var i = 0; i < num; i++) { + arr[i] = ele; + } + + return arr; +}; diff --git a/node_modules/repeat-element/package.json b/node_modules/repeat-element/package.json new file mode 100644 index 0000000..fb82b58 --- /dev/null +++ b/node_modules/repeat-element/package.json @@ -0,0 +1,83 @@ +{ + "_args": [ + [ + "repeat-element@1.1.3", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "repeat-element@1.1.3", + "_id": "repeat-element@1.1.3", + "_inBundle": false, + "_integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "_location": "/repeat-element", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "repeat-element@1.1.3", + "name": "repeat-element", + "escapedName": "repeat-element", + "rawSpec": "1.1.3", + "saveSpec": null, + "fetchSpec": "1.1.3" + }, + "_requiredBy": [ + "/braces" + ], + "_resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "_spec": "1.1.3", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/repeat-element/issues" + }, + "description": "Create an array by repeating the given value n times.", + "devDependencies": { + "benchmarked": "^2.0.0", + "chalk": "^2.4.1", + "glob": "^7.1.2", + "gulp-format-md": "^1.0.0", + "minimist": "^1.2.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/repeat-element", + "keywords": [ + "array", + "element", + "repeat", + "string" + ], + "license": "MIT", + "main": "index.js", + "name": "repeat-element", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/repeat-element.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.1.3" +} diff --git a/node_modules/repeat-string/LICENSE b/node_modules/repeat-string/LICENSE new file mode 100644 index 0000000..39245ac --- /dev/null +++ b/node_modules/repeat-string/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +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/repeat-string/README.md b/node_modules/repeat-string/README.md new file mode 100644 index 0000000..aaa5e91 --- /dev/null +++ b/node_modules/repeat-string/README.md @@ -0,0 +1,136 @@ +# repeat-string [![NPM version](https://img.shields.io/npm/v/repeat-string.svg?style=flat)](https://www.npmjs.com/package/repeat-string) [![NPM monthly downloads](https://img.shields.io/npm/dm/repeat-string.svg?style=flat)](https://npmjs.org/package/repeat-string) [![NPM total downloads](https://img.shields.io/npm/dt/repeat-string.svg?style=flat)](https://npmjs.org/package/repeat-string) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/repeat-string.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/repeat-string) + +> Repeat the given string n times. Fastest implementation for repeating a string. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save repeat-string +``` + +## Usage + +### [repeat](index.js#L41) + +Repeat the given `string` the specified `number` of times. + +**Example:** + +**Example** + +```js +var repeat = require('repeat-string'); +repeat('A', 5); +//=> AAAAA +``` + +**Params** + +* `string` **{String}**: The string to repeat +* `number` **{Number}**: The number of times to repeat the string +* `returns` **{String}**: Repeated string + +## Benchmarks + +Repeat string is significantly faster than the native method (which is itself faster than [repeating](https://github.com/sindresorhus/repeating)): + +```sh +# 2x +repeat-string █████████████████████████ (26,953,977 ops/sec) +repeating █████████ (9,855,695 ops/sec) +native ██████████████████ (19,453,895 ops/sec) + +# 3x +repeat-string █████████████████████████ (19,445,252 ops/sec) +repeating ███████████ (8,661,565 ops/sec) +native ████████████████████ (16,020,598 ops/sec) + +# 10x +repeat-string █████████████████████████ (23,792,521 ops/sec) +repeating █████████ (8,571,332 ops/sec) +native ███████████████ (14,582,955 ops/sec) + +# 50x +repeat-string █████████████████████████ (23,640,179 ops/sec) +repeating █████ (5,505,509 ops/sec) +native ██████████ (10,085,557 ops/sec) + +# 250x +repeat-string █████████████████████████ (23,489,618 ops/sec) +repeating ████ (3,962,937 ops/sec) +native ████████ (7,724,892 ops/sec) + +# 2000x +repeat-string █████████████████████████ (20,315,172 ops/sec) +repeating ████ (3,297,079 ops/sec) +native ███████ (6,203,331 ops/sec) + +# 20000x +repeat-string █████████████████████████ (23,382,915 ops/sec) +repeating ███ (2,980,058 ops/sec) +native █████ (5,578,808 ops/sec) +``` + +**Run the benchmarks** + +Install dev dependencies: + +```sh +npm i -d && node benchmark +``` + +## About + +### Related projects + +[repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor**
| +| --- | --- | +| 51 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [LinusU](https://github.com/LinusU) | +| 2 | [tbusser](https://github.com/tbusser) | +| 1 | [doowb](https://github.com/doowb) | +| 1 | [wooorm](https://github.com/wooorm) | + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](http://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/repeat-string/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on October 23, 2016._ \ No newline at end of file diff --git a/node_modules/repeat-string/index.js b/node_modules/repeat-string/index.js new file mode 100644 index 0000000..4459afd --- /dev/null +++ b/node_modules/repeat-string/index.js @@ -0,0 +1,70 @@ +/*! + * repeat-string + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +/** + * Results cache + */ + +var res = ''; +var cache; + +/** + * Expose `repeat` + */ + +module.exports = repeat; + +/** + * Repeat the given `string` the specified `number` + * of times. + * + * **Example:** + * + * ```js + * var repeat = require('repeat-string'); + * repeat('A', 5); + * //=> AAAAA + * ``` + * + * @param {String} `string` The string to repeat + * @param {Number} `number` The number of times to repeat the string + * @return {String} Repeated string + * @api public + */ + +function repeat(str, num) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + // cover common, quick use cases + if (num === 1) return str; + if (num === 2) return str + str; + + var max = str.length * num; + if (cache !== str || typeof cache === 'undefined') { + cache = str; + res = ''; + } else if (res.length >= max) { + return res.substr(0, max); + } + + while (max > res.length && num > 1) { + if (num & 1) { + res += str; + } + + num >>= 1; + str += str; + } + + res += str; + res = res.substr(0, max); + return res; +} diff --git a/node_modules/repeat-string/package.json b/node_modules/repeat-string/package.json new file mode 100644 index 0000000..66bb3a4 --- /dev/null +++ b/node_modules/repeat-string/package.json @@ -0,0 +1,132 @@ +{ + "_args": [ + [ + "repeat-string@1.6.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "repeat-string@1.6.1", + "_id": "repeat-string@1.6.1", + "_inBundle": false, + "_integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "_location": "/repeat-string", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "repeat-string@1.6.1", + "name": "repeat-string", + "escapedName": "repeat-string", + "rawSpec": "1.6.1", + "saveSpec": null, + "fetchSpec": "1.6.1" + }, + "_requiredBy": [ + "/fill-range", + "/to-regex-range" + ], + "_resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "_spec": "1.6.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "http://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/repeat-string/issues" + }, + "contributors": [ + { + "name": "Brian Woodward", + "email": "brian.woodward@gmail.com", + "url": "https://github.com/doowb" + }, + { + "name": "Jon Schlinkert", + "email": "jon.schlinkert@sellside.com", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Linus Unnebäck", + "email": "linus@folkdatorn.se", + "url": "http://linus.unnebäck.se" + }, + { + "name": "Thijs Busser", + "email": "tbusser@gmail.com", + "url": "http://tbusser.net" + }, + { + "name": "Titus", + "email": "tituswormer@gmail.com", + "url": "wooorm.com" + } + ], + "description": "Repeat the given string n times. Fastest implementation for repeating a string.", + "devDependencies": { + "ansi-cyan": "^0.1.1", + "benchmarked": "^0.2.5", + "gulp-format-md": "^0.1.11", + "isobject": "^2.1.0", + "mocha": "^3.1.2", + "repeating": "^3.0.0", + "text-table": "^0.2.0", + "yargs-parser": "^4.0.2" + }, + "engines": { + "node": ">=0.10" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/repeat-string", + "keywords": [ + "fast", + "fastest", + "fill", + "left", + "left-pad", + "multiple", + "pad", + "padding", + "repeat", + "repeating", + "repetition", + "right", + "right-pad", + "string", + "times" + ], + "license": "MIT", + "main": "index.js", + "name": "repeat-string", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/repeat-string.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "repeat-element" + ] + }, + "helpers": [ + "./benchmark/helper.js" + ], + "reflinks": [ + "verb" + ] + }, + "version": "1.6.1" +} diff --git a/node_modules/request/CHANGELOG.md b/node_modules/request/CHANGELOG.md new file mode 100644 index 0000000..751514d --- /dev/null +++ b/node_modules/request/CHANGELOG.md @@ -0,0 +1,709 @@ +## Change Log + +### v2.87.0 (2018/05/21) +- [#2943](https://github.com/request/request/pull/2943) Replace hawk dependency with a local implemenation (#2943) (@hueniverse) + +### v2.86.0 (2018/05/15) +- [#2885](https://github.com/request/request/pull/2885) Remove redundant code (for Node.js 0.9.4 and below) and dependency (@ChALkeR) +- [#2942](https://github.com/request/request/pull/2942) Make Test GREEN Again! (@simov) +- [#2923](https://github.com/request/request/pull/2923) Alterations for failing CI tests (@gareth-robinson) + +### v2.85.0 (2018/03/12) +- [#2880](https://github.com/request/request/pull/2880) Revert "Update hawk to 7.0.7 (#2880)" (@simov) + +### v2.84.0 (2018/03/12) +- [#2793](https://github.com/request/request/pull/2793) Fixed calculation of oauth_body_hash, issue #2792 (@dvishniakov) +- [#2880](https://github.com/request/request/pull/2880) Update hawk to 7.0.7 (#2880) (@kornel-kedzierski) + +### v2.83.0 (2017/09/27) +- [#2776](https://github.com/request/request/pull/2776) Updating tough-cookie due to security fix. (#2776) (@karlnorling) + +### v2.82.0 (2017/09/19) +- [#2703](https://github.com/request/request/pull/2703) Add Node.js v8 to Travis CI (@ryysud) +- [#2751](https://github.com/request/request/pull/2751) Update of hawk and qs to latest version (#2751) (@Olivier-Moreau) +- [#2658](https://github.com/request/request/pull/2658) Fixed some text in README.md (#2658) (@Marketionist) +- [#2635](https://github.com/request/request/pull/2635) chore(package): update aws-sign2 to version 0.7.0 (#2635) (@greenkeeperio-bot) +- [#2641](https://github.com/request/request/pull/2641) Update README to simplify & update convenience methods (#2641) (@FredKSchott) +- [#2541](https://github.com/request/request/pull/2541) Add convenience method for HTTP OPTIONS (#2541) (@jamesseanwright) +- [#2605](https://github.com/request/request/pull/2605) Add promise support section to README (#2605) (@FredKSchott) +- [#2579](https://github.com/request/request/pull/2579) refactor(lint): replace eslint with standard (#2579) (@ahmadnassri) +- [#2598](https://github.com/request/request/pull/2598) Update codecov to version 2.0.2 🚀 (@greenkeeperio-bot) +- [#2590](https://github.com/request/request/pull/2590) Adds test-timing keepAlive test (@nicjansma) +- [#2589](https://github.com/request/request/pull/2589) fix tabulation on request example README.MD (@odykyi) +- [#2594](https://github.com/request/request/pull/2594) chore(dependencies): har-validator to 5.x [removes babel dep] (@ahmadnassri) + +### v2.81.0 (2017/03/09) +- [#2584](https://github.com/request/request/pull/2584) Security issue: Upgrade qs to version 6.4.0 (@sergejmueller) +- [#2578](https://github.com/request/request/pull/2578) safe-buffer doesn't zero-fill by default, its just a polyfill. (#2578) (@mikeal) +- [#2566](https://github.com/request/request/pull/2566) Timings: Tracks 'lookup', adds 'wait' time, fixes connection re-use (#2566) (@nicjansma) +- [#2574](https://github.com/request/request/pull/2574) Migrating to safe-buffer for improved security. (@mikeal) +- [#2573](https://github.com/request/request/pull/2573) fixes #2572 (@ahmadnassri) + +### v2.80.0 (2017/03/04) +- [#2571](https://github.com/request/request/pull/2571) Correctly format the Host header for IPv6 addresses (@JamesMGreene) +- [#2558](https://github.com/request/request/pull/2558) Update README.md example snippet (@FredKSchott) +- [#2221](https://github.com/request/request/pull/2221) Adding a simple Response object reference in argument specification (@calamarico) +- [#2452](https://github.com/request/request/pull/2452) Adds .timings array with DNC, TCP, request and response times (@nicjansma) +- [#2553](https://github.com/request/request/pull/2553) add ISSUE_TEMPLATE, move PR template (@FredKSchott) +- [#2539](https://github.com/request/request/pull/2539) Create PULL_REQUEST_TEMPLATE.md (@FredKSchott) +- [#2524](https://github.com/request/request/pull/2524) Update caseless to version 0.12.0 🚀 (@greenkeeperio-bot) +- [#2460](https://github.com/request/request/pull/2460) Fix wrong MIME type in example (@OwnageIsMagic) +- [#2514](https://github.com/request/request/pull/2514) Change tags to keywords in package.json (@humphd) +- [#2492](https://github.com/request/request/pull/2492) More lenient gzip decompression (@addaleax) + +### v2.79.0 (2016/11/18) +- [#2368](https://github.com/request/request/pull/2368) Fix typeof check in test-pool.js (@forivall) +- [#2394](https://github.com/request/request/pull/2394) Use `files` in package.json (@SimenB) +- [#2463](https://github.com/request/request/pull/2463) AWS support for session tokens for temporary credentials (@simov) +- [#2467](https://github.com/request/request/pull/2467) Migrate to uuid (@simov, @antialias) +- [#2459](https://github.com/request/request/pull/2459) Update taper to version 0.5.0 🚀 (@greenkeeperio-bot) +- [#2448](https://github.com/request/request/pull/2448) Make other connect timeout test more reliable too (@mscdex) + +### v2.78.0 (2016/11/03) +- [#2447](https://github.com/request/request/pull/2447) Always set request timeout on keep-alive connections (@mscdex) + +### v2.77.0 (2016/11/03) +- [#2439](https://github.com/request/request/pull/2439) Fix socket 'connect' listener handling (@mscdex) +- [#2442](https://github.com/request/request/pull/2442) 👻😱 Node.js 0.10 is unmaintained 😱👻 (@greenkeeperio-bot) +- [#2435](https://github.com/request/request/pull/2435) Add followOriginalHttpMethod to redirect to original HTTP method (@kirrg001) +- [#2414](https://github.com/request/request/pull/2414) Improve test-timeout reliability (@mscdex) + +### v2.76.0 (2016/10/25) +- [#2424](https://github.com/request/request/pull/2424) Handle buffers directly instead of using "bl" (@zertosh) +- [#2415](https://github.com/request/request/pull/2415) Re-enable timeout tests on Travis + other fixes (@mscdex) +- [#2431](https://github.com/request/request/pull/2431) Improve timeouts accuracy and node v6.8.0+ compatibility (@mscdex, @greenkeeperio-bot) +- [#2428](https://github.com/request/request/pull/2428) Update qs to version 6.3.0 🚀 (@greenkeeperio-bot) +- [#2420](https://github.com/request/request/pull/2420) change .on to .once, remove possible memory leaks (@duereg) +- [#2426](https://github.com/request/request/pull/2426) Remove "isFunction" helper in favor of "typeof" check (@zertosh) +- [#2425](https://github.com/request/request/pull/2425) Simplify "defer" helper creation (@zertosh) +- [#2402](https://github.com/request/request/pull/2402) form-data@2.1.1 breaks build 🚨 (@greenkeeperio-bot) +- [#2393](https://github.com/request/request/pull/2393) Update form-data to version 2.1.0 🚀 (@greenkeeperio-bot) + +### v2.75.0 (2016/09/17) +- [#2381](https://github.com/request/request/pull/2381) Drop support for Node 0.10 (@simov) +- [#2377](https://github.com/request/request/pull/2377) Update form-data to version 2.0.0 🚀 (@greenkeeperio-bot) +- [#2353](https://github.com/request/request/pull/2353) Add greenkeeper ignored packages (@simov) +- [#2351](https://github.com/request/request/pull/2351) Update karma-tap to version 3.0.1 🚀 (@greenkeeperio-bot) +- [#2348](https://github.com/request/request/pull/2348) form-data@1.0.1 breaks build 🚨 (@greenkeeperio-bot) +- [#2349](https://github.com/request/request/pull/2349) Check error type instead of string (@scotttrinh) + +### v2.74.0 (2016/07/22) +- [#2295](https://github.com/request/request/pull/2295) Update tough-cookie to 2.3.0 (@stash-sfdc) +- [#2280](https://github.com/request/request/pull/2280) Update karma-tap to version 2.0.1 🚀 (@greenkeeperio-bot) + +### v2.73.0 (2016/07/09) +- [#2240](https://github.com/request/request/pull/2240) Remove connectionErrorHandler to fix #1903 (@zarenner) +- [#2251](https://github.com/request/request/pull/2251) tape@4.6.0 breaks build 🚨 (@greenkeeperio-bot) +- [#2225](https://github.com/request/request/pull/2225) Update docs (@ArtskydJ) +- [#2203](https://github.com/request/request/pull/2203) Update browserify to version 13.0.1 🚀 (@greenkeeperio-bot) +- [#2275](https://github.com/request/request/pull/2275) Update karma to version 1.1.1 🚀 (@greenkeeperio-bot) +- [#2204](https://github.com/request/request/pull/2204) Add codecov.yml and disable PR comments (@simov) +- [#2212](https://github.com/request/request/pull/2212) Fix link to http.IncomingMessage documentation (@nazieb) +- [#2208](https://github.com/request/request/pull/2208) Update to form-data RC4 and pass null values to it (@simov) +- [#2207](https://github.com/request/request/pull/2207) Move aws4 require statement to the top (@simov) +- [#2199](https://github.com/request/request/pull/2199) Update karma-coverage to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#2206](https://github.com/request/request/pull/2206) Update qs to version 6.2.0 🚀 (@greenkeeperio-bot) +- [#2205](https://github.com/request/request/pull/2205) Use server-destory to close hanging sockets in tests (@simov) +- [#2200](https://github.com/request/request/pull/2200) Update karma-cli to version 1.0.0 🚀 (@greenkeeperio-bot) + +### v2.72.0 (2016/04/17) +- [#2176](https://github.com/request/request/pull/2176) Do not try to pipe Gzip responses with no body (@simov) +- [#2175](https://github.com/request/request/pull/2175) Add 'delete' alias for the 'del' API method (@simov, @MuhanZou) +- [#2172](https://github.com/request/request/pull/2172) Add support for deflate content encoding (@czardoz) +- [#2169](https://github.com/request/request/pull/2169) Add callback option (@simov) +- [#2165](https://github.com/request/request/pull/2165) Check for self.req existence inside the write method (@simov) +- [#2167](https://github.com/request/request/pull/2167) Fix TravisCI badge reference master branch (@a0viedo) + +### v2.71.0 (2016/04/12) +- [#2164](https://github.com/request/request/pull/2164) Catch errors from the underlying http module (@simov) + +### v2.70.0 (2016/04/05) +- [#2147](https://github.com/request/request/pull/2147) Update eslint to version 2.5.3 🚀 (@simov, @greenkeeperio-bot) +- [#2009](https://github.com/request/request/pull/2009) Support JSON stringify replacer argument. (@elyobo) +- [#2142](https://github.com/request/request/pull/2142) Update eslint to version 2.5.1 🚀 (@greenkeeperio-bot) +- [#2128](https://github.com/request/request/pull/2128) Update browserify-istanbul to version 2.0.0 🚀 (@greenkeeperio-bot) +- [#2115](https://github.com/request/request/pull/2115) Update eslint to version 2.3.0 🚀 (@simov, @greenkeeperio-bot) +- [#2089](https://github.com/request/request/pull/2089) Fix badges (@simov) +- [#2092](https://github.com/request/request/pull/2092) Update browserify-istanbul to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#2079](https://github.com/request/request/pull/2079) Accept read stream as body option (@simov) +- [#2070](https://github.com/request/request/pull/2070) Update bl to version 1.1.2 🚀 (@greenkeeperio-bot) +- [#2063](https://github.com/request/request/pull/2063) Up bluebird and oauth-sign (@simov) +- [#2058](https://github.com/request/request/pull/2058) Karma fixes for latest versions (@eiriksm) +- [#2057](https://github.com/request/request/pull/2057) Update contributing guidelines (@simov) +- [#2054](https://github.com/request/request/pull/2054) Update qs to version 6.1.0 🚀 (@greenkeeperio-bot) + +### v2.69.0 (2016/01/27) +- [#2041](https://github.com/request/request/pull/2041) restore aws4 as regular dependency (@rmg) + +### v2.68.0 (2016/01/27) +- [#2036](https://github.com/request/request/pull/2036) Add AWS Signature Version 4 (@simov, @mirkods) +- [#2022](https://github.com/request/request/pull/2022) Convert numeric multipart bodies to string (@simov, @feross) +- [#2024](https://github.com/request/request/pull/2024) Update har-validator dependency for nsp advisory #76 (@TylerDixon) +- [#2016](https://github.com/request/request/pull/2016) Update qs to version 6.0.2 🚀 (@greenkeeperio-bot) +- [#2007](https://github.com/request/request/pull/2007) Use the `extend` module instead of util._extend (@simov) +- [#2003](https://github.com/request/request/pull/2003) Update browserify to version 13.0.0 🚀 (@greenkeeperio-bot) +- [#1989](https://github.com/request/request/pull/1989) Update buffer-equal to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#1956](https://github.com/request/request/pull/1956) Check form-data content-length value before setting up the header (@jongyoonlee) +- [#1958](https://github.com/request/request/pull/1958) Use IncomingMessage.destroy method (@simov) +- [#1952](https://github.com/request/request/pull/1952) Adds example for Tor proxy (@prometheansacrifice) +- [#1943](https://github.com/request/request/pull/1943) Update eslint to version 1.10.3 🚀 (@simov, @greenkeeperio-bot) +- [#1924](https://github.com/request/request/pull/1924) Update eslint to version 1.10.1 🚀 (@greenkeeperio-bot) +- [#1915](https://github.com/request/request/pull/1915) Remove content-length and transfer-encoding headers from defaultProxyHeaderWhiteList (@yaxia) + +### v2.67.0 (2015/11/19) +- [#1913](https://github.com/request/request/pull/1913) Update http-signature to version 1.1.0 🚀 (@greenkeeperio-bot) + +### v2.66.0 (2015/11/18) +- [#1906](https://github.com/request/request/pull/1906) Update README URLs based on HTTP redirects (@ReadmeCritic) +- [#1905](https://github.com/request/request/pull/1905) Convert typed arrays into regular buffers (@simov) +- [#1902](https://github.com/request/request/pull/1902) node-uuid@1.4.7 breaks build 🚨 (@greenkeeperio-bot) +- [#1894](https://github.com/request/request/pull/1894) Fix tunneling after redirection from https (Original: #1881) (@simov, @falms) +- [#1893](https://github.com/request/request/pull/1893) Update eslint to version 1.9.0 🚀 (@greenkeeperio-bot) +- [#1852](https://github.com/request/request/pull/1852) Update eslint to version 1.7.3 🚀 (@simov, @greenkeeperio-bot, @paulomcnally, @michelsalib, @arbaaz, @nsklkn, @LoicMahieu, @JoshWillik, @jzaefferer, @ryanwholey, @djchie, @thisconnect, @mgenereu, @acroca, @Sebmaster, @KoltesDigital) +- [#1876](https://github.com/request/request/pull/1876) Implement loose matching for har mime types (@simov) +- [#1875](https://github.com/request/request/pull/1875) Update bluebird to version 3.0.2 🚀 (@simov, @greenkeeperio-bot) +- [#1871](https://github.com/request/request/pull/1871) Update browserify to version 12.0.1 🚀 (@greenkeeperio-bot) +- [#1866](https://github.com/request/request/pull/1866) Add missing quotes on x-token property in README (@miguelmota) +- [#1874](https://github.com/request/request/pull/1874) Fix typo in README.md (@gswalden) +- [#1860](https://github.com/request/request/pull/1860) Improve referer header tests and docs (@simov) +- [#1861](https://github.com/request/request/pull/1861) Remove redundant call to Stream constructor (@watson) +- [#1857](https://github.com/request/request/pull/1857) Fix Referer header to point to the original host name (@simov) +- [#1850](https://github.com/request/request/pull/1850) Update karma-coverage to version 0.5.3 🚀 (@greenkeeperio-bot) +- [#1847](https://github.com/request/request/pull/1847) Use node's latest version when building (@simov) +- [#1836](https://github.com/request/request/pull/1836) Tunnel: fix wrong property name (@KoltesDigital) +- [#1820](https://github.com/request/request/pull/1820) Set href as request.js uses it (@mgenereu) +- [#1840](https://github.com/request/request/pull/1840) Update http-signature to version 1.0.2 🚀 (@greenkeeperio-bot) +- [#1845](https://github.com/request/request/pull/1845) Update istanbul to version 0.4.0 🚀 (@greenkeeperio-bot) + +### v2.65.0 (2015/10/11) +- [#1833](https://github.com/request/request/pull/1833) Update aws-sign2 to version 0.6.0 🚀 (@greenkeeperio-bot) +- [#1811](https://github.com/request/request/pull/1811) Enable loose cookie parsing in tough-cookie (@Sebmaster) +- [#1830](https://github.com/request/request/pull/1830) Bring back tilde ranges for all dependencies (@simov) +- [#1821](https://github.com/request/request/pull/1821) Implement support for RFC 2617 MD5-sess algorithm. (@BigDSK) +- [#1828](https://github.com/request/request/pull/1828) Updated qs dependency to 5.2.0 (@acroca) +- [#1818](https://github.com/request/request/pull/1818) Extract `readResponseBody` method out of `onRequestResponse` (@pvoisin) +- [#1819](https://github.com/request/request/pull/1819) Run stringify once (@mgenereu) +- [#1814](https://github.com/request/request/pull/1814) Updated har-validator to version 2.0.2 (@greenkeeperio-bot) +- [#1807](https://github.com/request/request/pull/1807) Updated tough-cookie to version 2.1.0 (@greenkeeperio-bot) +- [#1800](https://github.com/request/request/pull/1800) Add caret ranges for devDependencies, except eslint (@simov) +- [#1799](https://github.com/request/request/pull/1799) Updated karma-browserify to version 4.4.0 (@greenkeeperio-bot) +- [#1797](https://github.com/request/request/pull/1797) Updated tape to version 4.2.0 (@greenkeeperio-bot) +- [#1788](https://github.com/request/request/pull/1788) Pinned all dependencies (@greenkeeperio-bot) + +### v2.64.0 (2015/09/25) +- [#1787](https://github.com/request/request/pull/1787) npm ignore examples, release.sh and disabled.appveyor.yml (@thisconnect) +- [#1775](https://github.com/request/request/pull/1775) Fix typo in README.md (@djchie) +- [#1776](https://github.com/request/request/pull/1776) Changed word 'conjuction' to read 'conjunction' in README.md (@ryanwholey) +- [#1785](https://github.com/request/request/pull/1785) Revert: Set default application/json content-type when using json option #1772 (@simov) + +### v2.63.0 (2015/09/21) +- [#1772](https://github.com/request/request/pull/1772) Set default application/json content-type when using json option (@jzaefferer) + +### v2.62.0 (2015/09/15) +- [#1768](https://github.com/request/request/pull/1768) Add node 4.0 to the list of build targets (@simov) +- [#1767](https://github.com/request/request/pull/1767) Query strings now cooperate with unix sockets (@JoshWillik) +- [#1750](https://github.com/request/request/pull/1750) Revert doc about installation of tough-cookie added in #884 (@LoicMahieu) +- [#1746](https://github.com/request/request/pull/1746) Missed comma in Readme (@nsklkn) +- [#1743](https://github.com/request/request/pull/1743) Fix options not being initialized in defaults method (@simov) + +### v2.61.0 (2015/08/19) +- [#1721](https://github.com/request/request/pull/1721) Minor fix in README.md (@arbaaz) +- [#1733](https://github.com/request/request/pull/1733) Avoid useless Buffer transformation (@michelsalib) +- [#1726](https://github.com/request/request/pull/1726) Update README.md (@paulomcnally) +- [#1715](https://github.com/request/request/pull/1715) Fix forever option in node > 0.10 #1709 (@calibr) +- [#1716](https://github.com/request/request/pull/1716) Do not create Buffer from Object in setContentLength(iojs v3.0 issue) (@calibr) +- [#1711](https://github.com/request/request/pull/1711) Add ability to detect connect timeouts (@kevinburke) +- [#1712](https://github.com/request/request/pull/1712) Set certificate expiration to August 2, 2018 (@kevinburke) +- [#1700](https://github.com/request/request/pull/1700) debug() when JSON.parse() on a response body fails (@phillipj) + +### v2.60.0 (2015/07/21) +- [#1687](https://github.com/request/request/pull/1687) Fix caseless bug - content-type not being set for multipart/form-data (@simov, @garymathews) + +### v2.59.0 (2015/07/20) +- [#1671](https://github.com/request/request/pull/1671) Add tests and docs for using the agent, agentClass, agentOptions and forever options. + Forever option defaults to using http(s).Agent in node 0.12+ (@simov) +- [#1679](https://github.com/request/request/pull/1679) Fix - do not remove OAuth param when using OAuth realm (@simov, @jhalickman) +- [#1668](https://github.com/request/request/pull/1668) updated dependencies (@deamme) +- [#1656](https://github.com/request/request/pull/1656) Fix form method (@simov) +- [#1651](https://github.com/request/request/pull/1651) Preserve HEAD method when using followAllRedirects (@simov) +- [#1652](https://github.com/request/request/pull/1652) Update `encoding` option documentation in README.md (@daniel347x) +- [#1650](https://github.com/request/request/pull/1650) Allow content-type overriding when using the `form` option (@simov) +- [#1646](https://github.com/request/request/pull/1646) Clarify the nature of setting `ca` in `agentOptions` (@jeffcharles) + +### v2.58.0 (2015/06/16) +- [#1638](https://github.com/request/request/pull/1638) Use the `extend` module to deep extend in the defaults method (@simov) +- [#1631](https://github.com/request/request/pull/1631) Move tunnel logic into separate module (@simov) +- [#1634](https://github.com/request/request/pull/1634) Fix OAuth query transport_method (@simov) +- [#1603](https://github.com/request/request/pull/1603) Add codecov (@simov) + +### v2.57.0 (2015/05/31) +- [#1615](https://github.com/request/request/pull/1615) Replace '.client' with '.socket' as the former was deprecated in 2.2.0. (@ChALkeR) + +### v2.56.0 (2015/05/28) +- [#1610](https://github.com/request/request/pull/1610) Bump module dependencies (@simov) +- [#1600](https://github.com/request/request/pull/1600) Extract the querystring logic into separate module (@simov) +- [#1607](https://github.com/request/request/pull/1607) Re-generate certificates (@simov) +- [#1599](https://github.com/request/request/pull/1599) Move getProxyFromURI logic below the check for Invaild URI (#1595) (@simov) +- [#1598](https://github.com/request/request/pull/1598) Fix the way http verbs are defined in order to please intellisense IDEs (@simov, @flannelJesus) +- [#1591](https://github.com/request/request/pull/1591) A few minor fixes: (@simov) +- [#1584](https://github.com/request/request/pull/1584) Refactor test-default tests (according to comments in #1430) (@simov) +- [#1585](https://github.com/request/request/pull/1585) Fixing documentation regarding TLS options (#1583) (@mainakae) +- [#1574](https://github.com/request/request/pull/1574) Refresh the oauth_nonce on redirect (#1573) (@simov) +- [#1570](https://github.com/request/request/pull/1570) Discovered tests that weren't properly running (@seanstrom) +- [#1569](https://github.com/request/request/pull/1569) Fix pause before response arrives (@kevinoid) +- [#1558](https://github.com/request/request/pull/1558) Emit error instead of throw (@simov) +- [#1568](https://github.com/request/request/pull/1568) Fix stall when piping gzipped response (@kevinoid) +- [#1560](https://github.com/request/request/pull/1560) Update combined-stream (@apechimp) +- [#1543](https://github.com/request/request/pull/1543) Initial support for oauth_body_hash on json payloads (@simov, @aesopwolf) +- [#1541](https://github.com/request/request/pull/1541) Fix coveralls (@simov) +- [#1540](https://github.com/request/request/pull/1540) Fix recursive defaults for convenience methods (@simov) +- [#1536](https://github.com/request/request/pull/1536) More eslint style rules (@froatsnook) +- [#1533](https://github.com/request/request/pull/1533) Adding dependency status bar to README.md (@YasharF) +- [#1539](https://github.com/request/request/pull/1539) ensure the latest version of har-validator is included (@ahmadnassri) +- [#1516](https://github.com/request/request/pull/1516) forever+pool test (@devTristan) + +### v2.55.0 (2015/04/05) +- [#1520](https://github.com/request/request/pull/1520) Refactor defaults (@simov) +- [#1525](https://github.com/request/request/pull/1525) Delete request headers with undefined value. (@froatsnook) +- [#1521](https://github.com/request/request/pull/1521) Add promise tests (@simov) +- [#1518](https://github.com/request/request/pull/1518) Fix defaults (@simov) +- [#1515](https://github.com/request/request/pull/1515) Allow static invoking of convenience methods (@simov) +- [#1505](https://github.com/request/request/pull/1505) Fix multipart boundary extraction regexp (@simov) +- [#1510](https://github.com/request/request/pull/1510) Fix basic auth form data (@simov) + +### v2.54.0 (2015/03/24) +- [#1501](https://github.com/request/request/pull/1501) HTTP Archive 1.2 support (@ahmadnassri) +- [#1486](https://github.com/request/request/pull/1486) Add a test for the forever agent (@akshayp) +- [#1500](https://github.com/request/request/pull/1500) Adding handling for no auth method and null bearer (@philberg) +- [#1498](https://github.com/request/request/pull/1498) Add table of contents in readme (@simov) +- [#1477](https://github.com/request/request/pull/1477) Add support for qs options via qsOptions key (@simov) +- [#1496](https://github.com/request/request/pull/1496) Parameters encoded to base 64 should be decoded as UTF-8, not ASCII. (@albanm) +- [#1494](https://github.com/request/request/pull/1494) Update eslint (@froatsnook) +- [#1474](https://github.com/request/request/pull/1474) Require Colon in Basic Auth (@erykwalder) +- [#1481](https://github.com/request/request/pull/1481) Fix baseUrl and redirections. (@burningtree) +- [#1469](https://github.com/request/request/pull/1469) Feature/base url (@froatsnook) +- [#1459](https://github.com/request/request/pull/1459) Add option to time request/response cycle (including rollup of redirects) (@aaron-em) +- [#1468](https://github.com/request/request/pull/1468) Re-enable io.js/node 0.12 build (@simov, @mikeal, @BBB) +- [#1442](https://github.com/request/request/pull/1442) Fixed the issue with strictSSL tests on 0.12 & io.js by explicitly setting a cipher that matches the cert. (@BBB, @nickmccurdy, @demohi, @simov, @0x4139) +- [#1460](https://github.com/request/request/pull/1460) localAddress or proxy config is lost when redirecting (@simov, @0x4139) +- [#1453](https://github.com/request/request/pull/1453) Test on Node.js 0.12 and io.js with allowed failures (@nickmccurdy, @demohi) +- [#1426](https://github.com/request/request/pull/1426) Fixing tests to pass on io.js and node 0.12 (only test-https.js stiff failing) (@mikeal) +- [#1446](https://github.com/request/request/pull/1446) Missing HTTP referer header with redirects Fixes #1038 (@simov, @guimon) +- [#1428](https://github.com/request/request/pull/1428) Deprecate Node v0.8.x (@nylen) +- [#1436](https://github.com/request/request/pull/1436) Add ability to set a requester without setting default options (@tikotzky) +- [#1435](https://github.com/request/request/pull/1435) dry up verb methods (@sethpollack) +- [#1423](https://github.com/request/request/pull/1423) Allow fully qualified multipart content-type header (@simov) +- [#1430](https://github.com/request/request/pull/1430) Fix recursive requester (@tikotzky) +- [#1429](https://github.com/request/request/pull/1429) Throw error when making HEAD request with a body (@tikotzky) +- [#1419](https://github.com/request/request/pull/1419) Add note that the project is broken in 0.12.x (@nylen) +- [#1413](https://github.com/request/request/pull/1413) Fix basic auth (@simov) +- [#1397](https://github.com/request/request/pull/1397) Improve pipe-from-file tests (@nylen) + +### v2.53.0 (2015/02/02) +- [#1396](https://github.com/request/request/pull/1396) Do not rfc3986 escape JSON bodies (@nylen, @simov) +- [#1392](https://github.com/request/request/pull/1392) Improve `timeout` option description (@watson) + +### v2.52.0 (2015/02/02) +- [#1383](https://github.com/request/request/pull/1383) Add missing HTTPS options that were not being passed to tunnel (@brichard19) (@nylen) +- [#1388](https://github.com/request/request/pull/1388) Upgrade mime-types package version (@roderickhsiao) +- [#1389](https://github.com/request/request/pull/1389) Revise Setup Tunnel Function (@seanstrom) +- [#1374](https://github.com/request/request/pull/1374) Allow explicitly disabling tunneling for proxied https destinations (@nylen) +- [#1376](https://github.com/request/request/pull/1376) Use karma-browserify for tests. Add browser test coverage reporter. (@eiriksm) +- [#1366](https://github.com/request/request/pull/1366) Refactor OAuth into separate module (@simov) +- [#1373](https://github.com/request/request/pull/1373) Rewrite tunnel test to be pure Node.js (@nylen) +- [#1371](https://github.com/request/request/pull/1371) Upgrade test reporter (@nylen) +- [#1360](https://github.com/request/request/pull/1360) Refactor basic, bearer, digest auth logic into separate class (@simov) +- [#1354](https://github.com/request/request/pull/1354) Remove circular dependency from debugging code (@nylen) +- [#1351](https://github.com/request/request/pull/1351) Move digest auth into private prototype method (@simov) +- [#1352](https://github.com/request/request/pull/1352) Update hawk dependency to ~2.3.0 (@mridgway) +- [#1353](https://github.com/request/request/pull/1353) Correct travis-ci badge (@dogancelik) +- [#1349](https://github.com/request/request/pull/1349) Make sure we return on errored browser requests. (@eiriksm) +- [#1346](https://github.com/request/request/pull/1346) getProxyFromURI Extraction Refactor (@seanstrom) +- [#1337](https://github.com/request/request/pull/1337) Standardize test ports on 6767 (@nylen) +- [#1341](https://github.com/request/request/pull/1341) Emit FormData error events as Request error events (@nylen, @rwky) +- [#1343](https://github.com/request/request/pull/1343) Clean up readme badges, and add Travis and Coveralls badges (@nylen) +- [#1345](https://github.com/request/request/pull/1345) Update README.md (@Aaron-Hartwig) +- [#1338](https://github.com/request/request/pull/1338) Always wait for server.close() callback in tests (@nylen) +- [#1342](https://github.com/request/request/pull/1342) Add mock https server and redo start of browser tests for this purpose. (@eiriksm) +- [#1339](https://github.com/request/request/pull/1339) Improve auth docs (@nylen) +- [#1335](https://github.com/request/request/pull/1335) Add support for OAuth plaintext signature method (@simov) +- [#1332](https://github.com/request/request/pull/1332) Add clean script to remove test-browser.js after the tests run (@seanstrom) +- [#1327](https://github.com/request/request/pull/1327) Fix errors generating coverage reports. (@nylen) +- [#1330](https://github.com/request/request/pull/1330) Return empty buffer upon empty response body and encoding is set to null (@seanstrom) +- [#1326](https://github.com/request/request/pull/1326) Use faster container-based infrastructure on Travis (@nylen) +- [#1315](https://github.com/request/request/pull/1315) Implement rfc3986 option (@simov, @nylen, @apoco, @DullReferenceException, @mmalecki, @oliamb, @cliffcrosland, @LewisJEllis, @eiriksm, @poislagarde) +- [#1314](https://github.com/request/request/pull/1314) Detect urlencoded form data header via regex (@simov) +- [#1317](https://github.com/request/request/pull/1317) Improve OAuth1.0 server side flow example (@simov) + +### v2.51.0 (2014/12/10) +- [#1310](https://github.com/request/request/pull/1310) Revert changes introduced in https://github.com/request/request/pull/1282 (@simov) + +### v2.50.0 (2014/12/09) +- [#1308](https://github.com/request/request/pull/1308) Add browser test to keep track of browserify compability. (@eiriksm) +- [#1299](https://github.com/request/request/pull/1299) Add optional support for jsonReviver (@poislagarde) +- [#1277](https://github.com/request/request/pull/1277) Add Coveralls configuration (@simov) +- [#1307](https://github.com/request/request/pull/1307) Upgrade form-data, add back browserify compability. Fixes #455. (@eiriksm) +- [#1305](https://github.com/request/request/pull/1305) Fix typo in README.md (@LewisJEllis) +- [#1288](https://github.com/request/request/pull/1288) Update README.md to explain custom file use case (@cliffcrosland) + +### v2.49.0 (2014/11/28) +- [#1295](https://github.com/request/request/pull/1295) fix(proxy): no-proxy false positive (@oliamb) +- [#1292](https://github.com/request/request/pull/1292) Upgrade `caseless` to 0.8.1 (@mmalecki) +- [#1276](https://github.com/request/request/pull/1276) Set transfer encoding for multipart/related to chunked by default (@simov) +- [#1275](https://github.com/request/request/pull/1275) Fix multipart content-type headers detection (@simov) +- [#1269](https://github.com/request/request/pull/1269) adds streams example for review (@tbuchok) +- [#1238](https://github.com/request/request/pull/1238) Add examples README.md (@simov) + +### v2.48.0 (2014/11/12) +- [#1263](https://github.com/request/request/pull/1263) Fixed a syntax error / typo in README.md (@xna2) +- [#1253](https://github.com/request/request/pull/1253) Add multipart chunked flag (@simov, @nylen) +- [#1251](https://github.com/request/request/pull/1251) Clarify that defaults() does not modify global defaults (@nylen) +- [#1250](https://github.com/request/request/pull/1250) Improve documentation for pool and maxSockets options (@nylen) +- [#1237](https://github.com/request/request/pull/1237) Documenting error handling when using streams (@vmattos) +- [#1244](https://github.com/request/request/pull/1244) Finalize changelog command (@nylen) +- [#1241](https://github.com/request/request/pull/1241) Fix typo (@alexanderGugel) +- [#1223](https://github.com/request/request/pull/1223) Show latest version number instead of "upcoming" in changelog (@nylen) +- [#1236](https://github.com/request/request/pull/1236) Document how to use custom CA in README (#1229) (@hypesystem) +- [#1228](https://github.com/request/request/pull/1228) Support for oauth with RSA-SHA1 signing (@nylen) +- [#1216](https://github.com/request/request/pull/1216) Made json and multipart options coexist (@nylen, @simov) +- [#1225](https://github.com/request/request/pull/1225) Allow header white/exclusive lists in any case. (@RReverser) + +### v2.47.0 (2014/10/26) +- [#1222](https://github.com/request/request/pull/1222) Move from mikeal/request to request/request (@nylen) +- [#1220](https://github.com/request/request/pull/1220) update qs dependency to 2.3.1 (@FredKSchott) +- [#1212](https://github.com/request/request/pull/1212) Improve tests/test-timeout.js (@nylen) +- [#1219](https://github.com/request/request/pull/1219) remove old globalAgent workaround for node 0.4 (@request) +- [#1214](https://github.com/request/request/pull/1214) Remove cruft left over from optional dependencies (@nylen) +- [#1215](https://github.com/request/request/pull/1215) Add proxyHeaderExclusiveList option for proxy-only headers. (@RReverser) +- [#1211](https://github.com/request/request/pull/1211) Allow 'Host' header instead of 'host' and remember case across redirects (@nylen) +- [#1208](https://github.com/request/request/pull/1208) Improve release script (@nylen) +- [#1213](https://github.com/request/request/pull/1213) Support for custom cookie store (@nylen, @mitsuru) +- [#1197](https://github.com/request/request/pull/1197) Clean up some code around setting the agent (@FredKSchott) +- [#1209](https://github.com/request/request/pull/1209) Improve multipart form append test (@simov) +- [#1207](https://github.com/request/request/pull/1207) Update changelog (@nylen) +- [#1185](https://github.com/request/request/pull/1185) Stream multipart/related bodies (@simov) + +### v2.46.0 (2014/10/23) +- [#1198](https://github.com/request/request/pull/1198) doc for TLS/SSL protocol options (@shawnzhu) +- [#1200](https://github.com/request/request/pull/1200) Add a Gitter chat badge to README.md (@gitter-badger) +- [#1196](https://github.com/request/request/pull/1196) Upgrade taper test reporter to v0.3.0 (@nylen) +- [#1199](https://github.com/request/request/pull/1199) Fix lint error: undeclared var i (@nylen) +- [#1191](https://github.com/request/request/pull/1191) Move self.proxy decision logic out of init and into a helper (@FredKSchott) +- [#1190](https://github.com/request/request/pull/1190) Move _buildRequest() logic back into init (@FredKSchott) +- [#1186](https://github.com/request/request/pull/1186) Support Smarter Unix URL Scheme (@FredKSchott) +- [#1178](https://github.com/request/request/pull/1178) update form documentation for new usage (@FredKSchott) +- [#1180](https://github.com/request/request/pull/1180) Enable no-mixed-requires linting rule (@nylen) +- [#1184](https://github.com/request/request/pull/1184) Don't forward authorization header across redirects to different hosts (@nylen) +- [#1183](https://github.com/request/request/pull/1183) Correct README about pre and postamble CRLF using multipart and not mult... (@netpoetica) +- [#1179](https://github.com/request/request/pull/1179) Lint tests directory (@nylen) +- [#1169](https://github.com/request/request/pull/1169) add metadata for form-data file field (@dotcypress) +- [#1173](https://github.com/request/request/pull/1173) remove optional dependencies (@seanstrom) +- [#1165](https://github.com/request/request/pull/1165) Cleanup event listeners and remove function creation from init (@FredKSchott) +- [#1174](https://github.com/request/request/pull/1174) update the request.cookie docs to have a valid cookie example (@seanstrom) +- [#1168](https://github.com/request/request/pull/1168) create a detach helper and use detach helper in replace of nextTick (@seanstrom) +- [#1171](https://github.com/request/request/pull/1171) in post can send form data and use callback (@MiroRadenovic) +- [#1159](https://github.com/request/request/pull/1159) accept charset for x-www-form-urlencoded content-type (@seanstrom) +- [#1157](https://github.com/request/request/pull/1157) Update README.md: body with json=true (@Rob--W) +- [#1164](https://github.com/request/request/pull/1164) Disable tests/test-timeout.js on Travis (@nylen) +- [#1153](https://github.com/request/request/pull/1153) Document how to run a single test (@nylen) +- [#1144](https://github.com/request/request/pull/1144) adds documentation for the "response" event within the streaming section (@tbuchok) +- [#1162](https://github.com/request/request/pull/1162) Update eslintrc file to no longer allow past errors (@FredKSchott) +- [#1155](https://github.com/request/request/pull/1155) Support/use self everywhere (@seanstrom) +- [#1161](https://github.com/request/request/pull/1161) fix no-use-before-define lint warnings (@emkay) +- [#1156](https://github.com/request/request/pull/1156) adding curly brackets to get rid of lint errors (@emkay) +- [#1151](https://github.com/request/request/pull/1151) Fix localAddress test on OS X (@nylen) +- [#1145](https://github.com/request/request/pull/1145) documentation: fix outdated reference to setCookieSync old name in README (@FredKSchott) +- [#1131](https://github.com/request/request/pull/1131) Update pool documentation (@FredKSchott) +- [#1143](https://github.com/request/request/pull/1143) Rewrite all tests to use tape (@nylen) +- [#1137](https://github.com/request/request/pull/1137) Add ability to specifiy querystring lib in options. (@jgrund) +- [#1138](https://github.com/request/request/pull/1138) allow hostname and port in place of host on uri (@cappslock) +- [#1134](https://github.com/request/request/pull/1134) Fix multiple redirects and `self.followRedirect` (@blakeembrey) +- [#1130](https://github.com/request/request/pull/1130) documentation fix: add note about npm test for contributing (@FredKSchott) +- [#1120](https://github.com/request/request/pull/1120) Support/refactor request setup tunnel (@seanstrom) +- [#1129](https://github.com/request/request/pull/1129) linting fix: convert double quote strings to use single quotes (@FredKSchott) +- [#1124](https://github.com/request/request/pull/1124) linting fix: remove unneccesary semi-colons (@FredKSchott) + +### v2.45.0 (2014/10/06) +- [#1128](https://github.com/request/request/pull/1128) Add test for setCookie regression (@nylen) +- [#1127](https://github.com/request/request/pull/1127) added tests around using objects as values in a query string (@bcoe) +- [#1103](https://github.com/request/request/pull/1103) Support/refactor request constructor (@nylen, @seanstrom) +- [#1119](https://github.com/request/request/pull/1119) add basic linting to request library (@FredKSchott) +- [#1121](https://github.com/request/request/pull/1121) Revert "Explicitly use sync versions of cookie functions" (@nylen) +- [#1118](https://github.com/request/request/pull/1118) linting fix: Restructure bad empty if statement (@FredKSchott) +- [#1117](https://github.com/request/request/pull/1117) Fix a bad check for valid URIs (@FredKSchott) +- [#1113](https://github.com/request/request/pull/1113) linting fix: space out operators (@FredKSchott) +- [#1116](https://github.com/request/request/pull/1116) Fix typo in `noProxyHost` definition (@FredKSchott) +- [#1114](https://github.com/request/request/pull/1114) linting fix: Added a `new` operator that was missing when creating and throwing a new error (@FredKSchott) +- [#1096](https://github.com/request/request/pull/1096) No_proxy support (@samcday) +- [#1107](https://github.com/request/request/pull/1107) linting-fix: remove unused variables (@FredKSchott) +- [#1112](https://github.com/request/request/pull/1112) linting fix: Make return values consistent and more straitforward (@FredKSchott) +- [#1111](https://github.com/request/request/pull/1111) linting fix: authPieces was getting redeclared (@FredKSchott) +- [#1105](https://github.com/request/request/pull/1105) Use strict mode in request (@FredKSchott) +- [#1110](https://github.com/request/request/pull/1110) linting fix: replace lazy '==' with more strict '===' (@FredKSchott) +- [#1109](https://github.com/request/request/pull/1109) linting fix: remove function call from if-else conditional statement (@FredKSchott) +- [#1102](https://github.com/request/request/pull/1102) Fix to allow setting a `requester` on recursive calls to `request.defaults` (@tikotzky) +- [#1095](https://github.com/request/request/pull/1095) Tweaking engines in package.json (@pdehaan) +- [#1082](https://github.com/request/request/pull/1082) Forward the socket event from the httpModule request (@seanstrom) +- [#972](https://github.com/request/request/pull/972) Clarify gzip handling in the README (@kevinoid) +- [#1089](https://github.com/request/request/pull/1089) Mention that encoding defaults to utf8, not Buffer (@stuartpb) +- [#1088](https://github.com/request/request/pull/1088) Fix cookie example in README.md and make it more clear (@pipi32167) +- [#1027](https://github.com/request/request/pull/1027) Add support for multipart form data in request options. (@crocket) +- [#1076](https://github.com/request/request/pull/1076) use Request.abort() to abort the request when the request has timed-out (@seanstrom) +- [#1068](https://github.com/request/request/pull/1068) add optional postamble required by .NET multipart requests (@netpoetica) + +### v2.43.0 (2014/09/18) +- [#1057](https://github.com/request/request/pull/1057) Defaults should not overwrite defined options (@davidwood) +- [#1046](https://github.com/request/request/pull/1046) Propagate datastream errors, useful in case gzip fails. (@ZJONSSON, @Janpot) +- [#1063](https://github.com/request/request/pull/1063) copy the input headers object #1060 (@finnp) +- [#1031](https://github.com/request/request/pull/1031) Explicitly use sync versions of cookie functions (@ZJONSSON) +- [#1056](https://github.com/request/request/pull/1056) Fix redirects when passing url.parse(x) as URL to convenience method (@nylen) + +### v2.42.0 (2014/09/04) +- [#1053](https://github.com/request/request/pull/1053) Fix #1051 Parse auth properly when using non-tunneling proxy (@isaacs) + +### v2.41.0 (2014/09/04) +- [#1050](https://github.com/request/request/pull/1050) Pass whitelisted headers to tunneling proxy. Organize all tunneling logic. (@isaacs, @Feldhacker) +- [#1035](https://github.com/request/request/pull/1035) souped up nodei.co badge (@rvagg) +- [#1048](https://github.com/request/request/pull/1048) Aws is now possible over a proxy (@steven-aerts) +- [#1039](https://github.com/request/request/pull/1039) extract out helper functions to a helper file (@seanstrom) +- [#1021](https://github.com/request/request/pull/1021) Support/refactor indexjs (@seanstrom) +- [#1033](https://github.com/request/request/pull/1033) Improve and document debug options (@nylen) +- [#1034](https://github.com/request/request/pull/1034) Fix readme headings (@nylen) +- [#1030](https://github.com/request/request/pull/1030) Allow recursive request.defaults (@tikotzky) +- [#1029](https://github.com/request/request/pull/1029) Fix a couple of typos (@nylen) +- [#675](https://github.com/request/request/pull/675) Checking for SSL fault on connection before reading SSL properties (@VRMink) +- [#989](https://github.com/request/request/pull/989) Added allowRedirect function. Should return true if redirect is allowed or false otherwise (@doronin) +- [#1025](https://github.com/request/request/pull/1025) [fixes #1023] Set self._ended to true once response has ended (@mridgway) +- [#1020](https://github.com/request/request/pull/1020) Add back removed debug metadata (@FredKSchott) +- [#1008](https://github.com/request/request/pull/1008) Moving to module instead of cutomer buffer concatenation. (@mikeal) +- [#770](https://github.com/request/request/pull/770) Added dependency badge for README file; (@timgluz, @mafintosh, @lalitkapoor, @stash, @bobyrizov) +- [#1016](https://github.com/request/request/pull/1016) toJSON no longer results in an infinite loop, returns simple objects (@FredKSchott) +- [#1018](https://github.com/request/request/pull/1018) Remove pre-0.4.4 HTTPS fix (@mmalecki) +- [#1006](https://github.com/request/request/pull/1006) Migrate to caseless, fixes #1001 (@mikeal) +- [#995](https://github.com/request/request/pull/995) Fix parsing array of objects (@sjonnet19) +- [#999](https://github.com/request/request/pull/999) Fix fallback for browserify for optional modules. (@eiriksm) +- [#996](https://github.com/request/request/pull/996) Wrong oauth signature when multiple same param keys exist [updated] (@bengl) + +### v2.40.0 (2014/08/06) +- [#992](https://github.com/request/request/pull/992) Fix security vulnerability. Update qs (@poeticninja) +- [#988](https://github.com/request/request/pull/988) “--” -> “—” (@upisfree) +- [#987](https://github.com/request/request/pull/987) Show optional modules as being loaded by the module that reqeusted them (@iarna) + +### v2.39.0 (2014/07/24) +- [#976](https://github.com/request/request/pull/976) Update README.md (@pvoznenko) + +### v2.38.0 (2014/07/22) +- [#952](https://github.com/request/request/pull/952) Adding support to client certificate with proxy use case (@ofirshaked) +- [#884](https://github.com/request/request/pull/884) Documented tough-cookie installation. (@wbyoung) +- [#935](https://github.com/request/request/pull/935) Correct repository url (@fritx) +- [#963](https://github.com/request/request/pull/963) Update changelog (@nylen) +- [#960](https://github.com/request/request/pull/960) Support gzip with encoding on node pre-v0.9.4 (@kevinoid) +- [#953](https://github.com/request/request/pull/953) Add async Content-Length computation when using form-data (@LoicMahieu) +- [#844](https://github.com/request/request/pull/844) Add support for HTTP[S]_PROXY environment variables. Fixes #595. (@jvmccarthy) +- [#946](https://github.com/request/request/pull/946) defaults: merge headers (@aj0strow) + +### v2.37.0 (2014/07/07) +- [#957](https://github.com/request/request/pull/957) Silence EventEmitter memory leak warning #311 (@watson) +- [#955](https://github.com/request/request/pull/955) check for content-length header before setting it in nextTick (@camilleanne) +- [#951](https://github.com/request/request/pull/951) Add support for gzip content decoding (@kevinoid) +- [#949](https://github.com/request/request/pull/949) Manually enter querystring in form option (@charlespwd) +- [#944](https://github.com/request/request/pull/944) Make request work with browserify (@eiriksm) +- [#943](https://github.com/request/request/pull/943) New mime module (@eiriksm) +- [#927](https://github.com/request/request/pull/927) Bump version of hawk dep. (@samccone) +- [#907](https://github.com/request/request/pull/907) append secureOptions to poolKey (@medovob) + +### v2.35.0 (2014/05/17) +- [#901](https://github.com/request/request/pull/901) Fixes #555 (@pigulla) +- [#897](https://github.com/request/request/pull/897) merge with default options (@vohof) +- [#891](https://github.com/request/request/pull/891) fixes 857 - options object is mutated by calling request (@lalitkapoor) +- [#869](https://github.com/request/request/pull/869) Pipefilter test (@tgohn) +- [#866](https://github.com/request/request/pull/866) Fix typo (@dandv) +- [#861](https://github.com/request/request/pull/861) Add support for RFC 6750 Bearer Tokens (@phedny) +- [#809](https://github.com/request/request/pull/809) upgrade tunnel-proxy to 0.4.0 (@ksato9700) +- [#850](https://github.com/request/request/pull/850) Fix word consistency in readme (@0xNobody) +- [#810](https://github.com/request/request/pull/810) add some exposition to mpu example in README.md (@mikermcneil) +- [#840](https://github.com/request/request/pull/840) improve error reporting for invalid protocols (@FND) +- [#821](https://github.com/request/request/pull/821) added secureOptions back (@nw) +- [#815](https://github.com/request/request/pull/815) Create changelog based on pull requests (@lalitkapoor) + +### v2.34.0 (2014/02/18) +- [#516](https://github.com/request/request/pull/516) UNIX Socket URL Support (@lyuzashi) +- [#801](https://github.com/request/request/pull/801) 794 ignore cookie parsing and domain errors (@lalitkapoor) +- [#802](https://github.com/request/request/pull/802) Added the Apache license to the package.json. (@keskival) +- [#793](https://github.com/request/request/pull/793) Adds content-length calculation when submitting forms using form-data li... (@Juul) +- [#785](https://github.com/request/request/pull/785) Provide ability to override content-type when `json` option used (@vvo) +- [#781](https://github.com/request/request/pull/781) simpler isReadStream function (@joaojeronimo) + +### v2.32.0 (2014/01/16) +- [#767](https://github.com/request/request/pull/767) Use tough-cookie CookieJar sync API (@stash) +- [#764](https://github.com/request/request/pull/764) Case-insensitive authentication scheme (@bobyrizov) +- [#763](https://github.com/request/request/pull/763) Upgrade tough-cookie to 0.10.0 (@stash) +- [#744](https://github.com/request/request/pull/744) Use Cookie.parse (@lalitkapoor) +- [#757](https://github.com/request/request/pull/757) require aws-sign2 (@mafintosh) + +### v2.31.0 (2014/01/08) +- [#645](https://github.com/request/request/pull/645) update twitter api url to v1.1 (@mick) +- [#746](https://github.com/request/request/pull/746) README: Markdown code highlight (@weakish) +- [#745](https://github.com/request/request/pull/745) updating setCookie example to make it clear that the callback is required (@emkay) +- [#742](https://github.com/request/request/pull/742) Add note about JSON output body type (@iansltx) +- [#741](https://github.com/request/request/pull/741) README example is using old cookie jar api (@emkay) +- [#736](https://github.com/request/request/pull/736) Fix callback arguments documentation (@mmalecki) +- [#732](https://github.com/request/request/pull/732) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. (@Fritz-Lium) +- [#730](https://github.com/request/request/pull/730) better HTTP DIGEST support (@dai-shi) +- [#728](https://github.com/request/request/pull/728) Fix TypeError when calling request.cookie (@scarletmeow) +- [#727](https://github.com/request/request/pull/727) fix requester bug (@jchris) +- [#724](https://github.com/request/request/pull/724) README.md: add custom HTTP Headers example. (@tcort) +- [#719](https://github.com/request/request/pull/719) Made a comment gender neutral. (@unsetbit) +- [#715](https://github.com/request/request/pull/715) Request.multipart no longer crashes when header 'Content-type' present (@pastaclub) +- [#710](https://github.com/request/request/pull/710) Fixing listing in callback part of docs. (@lukasz-zak) +- [#696](https://github.com/request/request/pull/696) Edited README.md for formatting and clarity of phrasing (@Zearin) +- [#694](https://github.com/request/request/pull/694) Typo in README (@VRMink) +- [#690](https://github.com/request/request/pull/690) Handle blank password in basic auth. (@diversario) +- [#682](https://github.com/request/request/pull/682) Optional dependencies (@Turbo87) +- [#683](https://github.com/request/request/pull/683) Travis CI support (@Turbo87) +- [#674](https://github.com/request/request/pull/674) change cookie module,to tough-cookie.please check it . (@sxyizhiren) +- [#666](https://github.com/request/request/pull/666) make `ciphers` and `secureProtocol` to work in https request (@richarddong) +- [#656](https://github.com/request/request/pull/656) Test case for #304. (@diversario) +- [#662](https://github.com/request/request/pull/662) option.tunnel to explicitly disable tunneling (@seanmonstar) +- [#659](https://github.com/request/request/pull/659) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) +- [#630](https://github.com/request/request/pull/630) Send random cnonce for HTTP Digest requests (@wprl) +- [#619](https://github.com/request/request/pull/619) decouple things a bit (@joaojeronimo) +- [#613](https://github.com/request/request/pull/613) Fixes #583, moved initialization of self.uri.pathname (@lexander) +- [#605](https://github.com/request/request/pull/605) Only include ":" + pass in Basic Auth if it's defined (fixes #602) (@bendrucker) +- [#596](https://github.com/request/request/pull/596) Global agent is being used when pool is specified (@Cauldrath) +- [#594](https://github.com/request/request/pull/594) Emit complete event when there is no callback (@RomainLK) +- [#601](https://github.com/request/request/pull/601) Fixed a small typo (@michalstanko) +- [#589](https://github.com/request/request/pull/589) Prevent setting headers after they are sent (@geek) +- [#587](https://github.com/request/request/pull/587) Global cookie jar disabled by default (@threepointone) +- [#544](https://github.com/request/request/pull/544) Update http-signature version. (@davidlehn) +- [#581](https://github.com/request/request/pull/581) Fix spelling of "ignoring." (@bigeasy) +- [#568](https://github.com/request/request/pull/568) use agentOptions to create agent when specified in request (@SamPlacette) +- [#564](https://github.com/request/request/pull/564) Fix redirections (@criloz) +- [#541](https://github.com/request/request/pull/541) The exported request function doesn't have an auth method (@tschaub) +- [#542](https://github.com/request/request/pull/542) Expose Request class (@regality) +- [#536](https://github.com/request/request/pull/536) Allow explicitly empty user field for basic authentication. (@mikeando) +- [#532](https://github.com/request/request/pull/532) fix typo (@fredericosilva) +- [#497](https://github.com/request/request/pull/497) Added redirect event (@Cauldrath) +- [#503](https://github.com/request/request/pull/503) Fix basic auth for passwords that contain colons (@tonistiigi) +- [#521](https://github.com/request/request/pull/521) Improving test-localAddress.js (@noway) +- [#529](https://github.com/request/request/pull/529) dependencies versions bump (@jodaka) +- [#523](https://github.com/request/request/pull/523) Updating dependencies (@noway) +- [#520](https://github.com/request/request/pull/520) Fixing test-tunnel.js (@noway) +- [#519](https://github.com/request/request/pull/519) Update internal path state on post-creation QS changes (@jblebrun) +- [#510](https://github.com/request/request/pull/510) Add HTTP Signature support. (@davidlehn) +- [#502](https://github.com/request/request/pull/502) Fix POST (and probably other) requests that are retried after 401 Unauthorized (@nylen) +- [#508](https://github.com/request/request/pull/508) Honor the .strictSSL option when using proxies (tunnel-agent) (@jhs) +- [#512](https://github.com/request/request/pull/512) Make password optional to support the format: http://username@hostname/ (@pajato1) +- [#513](https://github.com/request/request/pull/513) add 'localAddress' support (@yyfrankyy) +- [#498](https://github.com/request/request/pull/498) Moving response emit above setHeaders on destination streams (@kenperkins) +- [#490](https://github.com/request/request/pull/490) Empty response body (3-rd argument) must be passed to callback as an empty string (@Olegas) +- [#479](https://github.com/request/request/pull/479) Changing so if Accept header is explicitly set, sending json does not ov... (@RoryH) +- [#475](https://github.com/request/request/pull/475) Use `unescape` from `querystring` (@shimaore) +- [#473](https://github.com/request/request/pull/473) V0.10 compat (@isaacs) +- [#471](https://github.com/request/request/pull/471) Using querystring library from visionmedia (@kbackowski) +- [#461](https://github.com/request/request/pull/461) Strip the UTF8 BOM from a UTF encoded response (@kppullin) +- [#460](https://github.com/request/request/pull/460) hawk 0.10.0 (@hueniverse) +- [#462](https://github.com/request/request/pull/462) if query params are empty, then request path shouldn't end with a '?' (merges cleanly now) (@jaipandya) +- [#456](https://github.com/request/request/pull/456) hawk 0.9.0 (@hueniverse) +- [#429](https://github.com/request/request/pull/429) Copy options before adding callback. (@nrn, @nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki) +- [#454](https://github.com/request/request/pull/454) Destroy the response if present when destroying the request (clean merge) (@mafintosh) +- [#310](https://github.com/request/request/pull/310) Twitter Oauth Stuff Out of Date; Now Updated (@joemccann, @isaacs, @mscdex) +- [#413](https://github.com/request/request/pull/413) rename googledoodle.png to .jpg (@nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki) +- [#448](https://github.com/request/request/pull/448) Convenience method for PATCH (@mloar) +- [#444](https://github.com/request/request/pull/444) protect against double callbacks on error path (@spollack) +- [#433](https://github.com/request/request/pull/433) Added support for HTTPS cert & key (@mmalecki) +- [#430](https://github.com/request/request/pull/430) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) +- [#415](https://github.com/request/request/pull/415) Fixed a typo. (@jerem) +- [#338](https://github.com/request/request/pull/338) Add more auth options, including digest support (@nylen) +- [#403](https://github.com/request/request/pull/403) Optimize environment lookup to happen once only (@mmalecki) +- [#398](https://github.com/request/request/pull/398) Add more reporting to tests (@mmalecki) +- [#388](https://github.com/request/request/pull/388) Ensure "safe" toJSON doesn't break EventEmitters (@othiym23) +- [#381](https://github.com/request/request/pull/381) Resolving "Invalid signature. Expected signature base string: " (@landeiro) +- [#380](https://github.com/request/request/pull/380) Fixes missing host header on retried request when using forever agent (@mac-) +- [#376](https://github.com/request/request/pull/376) Headers lost on redirect (@kapetan) +- [#375](https://github.com/request/request/pull/375) Fix for missing oauth_timestamp parameter (@jplock) +- [#374](https://github.com/request/request/pull/374) Correct Host header for proxy tunnel CONNECT (@youurayy) +- [#370](https://github.com/request/request/pull/370) Twitter reverse auth uses x_auth_mode not x_auth_type (@drudge) +- [#369](https://github.com/request/request/pull/369) Don't remove x_auth_mode for Twitter reverse auth (@drudge) +- [#344](https://github.com/request/request/pull/344) Make AWS auth signing find headers correctly (@nlf) +- [#363](https://github.com/request/request/pull/363) rfc3986 on base_uri, now passes tests (@jeffmarshall) +- [#362](https://github.com/request/request/pull/362) Running `rfc3986` on `base_uri` in `oauth.hmacsign` instead of just `encodeURIComponent` (@jeffmarshall) +- [#361](https://github.com/request/request/pull/361) Don't create a Content-Length header if we already have it set (@danjenkins) +- [#360](https://github.com/request/request/pull/360) Delete self._form along with everything else on redirect (@jgautier) +- [#355](https://github.com/request/request/pull/355) stop sending erroneous headers on redirected requests (@azylman) +- [#332](https://github.com/request/request/pull/332) Fix #296 - Only set Content-Type if body exists (@Marsup) +- [#343](https://github.com/request/request/pull/343) Allow AWS to work in more situations, added a note in the README on its usage (@nlf) +- [#320](https://github.com/request/request/pull/320) request.defaults() doesn't need to wrap jar() (@StuartHarris) +- [#322](https://github.com/request/request/pull/322) Fix + test for piped into request bumped into redirect. #321 (@alexindigo) +- [#326](https://github.com/request/request/pull/326) Do not try to remove listener from an undefined connection (@CartoDB) +- [#318](https://github.com/request/request/pull/318) Pass servername to tunneling secure socket creation (@isaacs) +- [#317](https://github.com/request/request/pull/317) Workaround for #313 (@isaacs) +- [#293](https://github.com/request/request/pull/293) Allow parser errors to bubble up to request (@mscdex) +- [#290](https://github.com/request/request/pull/290) A test for #289 (@isaacs) +- [#280](https://github.com/request/request/pull/280) Like in node.js print options if NODE_DEBUG contains the word request (@Filirom1) +- [#207](https://github.com/request/request/pull/207) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) +- [#214](https://github.com/request/request/pull/214) documenting additional behavior of json option (@jphaas, @vpulim) +- [#272](https://github.com/request/request/pull/272) Boundary begins with CRLF? (@elspoono, @timshadel, @naholyr, @nanodocumet, @TehShrike) +- [#284](https://github.com/request/request/pull/284) Remove stray `console.log()` call in multipart generator. (@bcherry) +- [#241](https://github.com/request/request/pull/241) Composability updates suggested by issue #239 (@polotek) +- [#282](https://github.com/request/request/pull/282) OAuth Authorization header contains non-"oauth_" parameters (@jplock) +- [#279](https://github.com/request/request/pull/279) fix tests with boundary by injecting boundry from header (@benatkin) +- [#273](https://github.com/request/request/pull/273) Pipe back pressure issue (@mafintosh) +- [#268](https://github.com/request/request/pull/268) I'm not OCD seriously (@TehShrike) +- [#263](https://github.com/request/request/pull/263) Bug in OAuth key generation for sha1 (@nanodocumet) +- [#265](https://github.com/request/request/pull/265) uncaughtException when redirected to invalid URI (@naholyr) +- [#262](https://github.com/request/request/pull/262) JSON test should check for equality (@timshadel) +- [#261](https://github.com/request/request/pull/261) Setting 'pool' to 'false' does NOT disable Agent pooling (@timshadel) +- [#249](https://github.com/request/request/pull/249) Fix for the fix of your (closed) issue #89 where self.headers[content-length] is set to 0 for all methods (@sethbridges, @polotek, @zephrax, @jeromegn) +- [#255](https://github.com/request/request/pull/255) multipart allow body === '' ( the empty string ) (@Filirom1) +- [#260](https://github.com/request/request/pull/260) fixed just another leak of 'i' (@sreuter) +- [#246](https://github.com/request/request/pull/246) Fixing the set-cookie header (@jeromegn) +- [#243](https://github.com/request/request/pull/243) Dynamic boundary (@zephrax) +- [#240](https://github.com/request/request/pull/240) don't error when null is passed for options (@polotek) +- [#211](https://github.com/request/request/pull/211) Replace all occurrences of special chars in RFC3986 (@chriso, @vpulim) +- [#224](https://github.com/request/request/pull/224) Multipart content-type change (@janjongboom) +- [#217](https://github.com/request/request/pull/217) need to use Authorization (titlecase) header with Tumblr OAuth (@visnup) +- [#203](https://github.com/request/request/pull/203) Fix cookie and redirect bugs and add auth support for HTTPS tunnel (@vpulim) +- [#199](https://github.com/request/request/pull/199) Tunnel (@isaacs) +- [#198](https://github.com/request/request/pull/198) Bugfix on forever usage of util.inherits (@isaacs) +- [#197](https://github.com/request/request/pull/197) Make ForeverAgent work with HTTPS (@isaacs) +- [#193](https://github.com/request/request/pull/193) Fixes GH-119 (@goatslacker) +- [#188](https://github.com/request/request/pull/188) Add abort support to the returned request (@itay) +- [#176](https://github.com/request/request/pull/176) Querystring option (@csainty) +- [#182](https://github.com/request/request/pull/182) Fix request.defaults to support (uri, options, callback) api (@twilson63) +- [#180](https://github.com/request/request/pull/180) Modified the post, put, head and del shortcuts to support uri optional param (@twilson63) +- [#179](https://github.com/request/request/pull/179) fix to add opts in .pipe(stream, opts) (@substack) +- [#177](https://github.com/request/request/pull/177) Issue #173 Support uri as first and optional config as second argument (@twilson63) +- [#170](https://github.com/request/request/pull/170) can't create a cookie in a wrapped request (defaults) (@fabianonunes) +- [#168](https://github.com/request/request/pull/168) Picking off an EasyFix by adding some missing mimetypes. (@serby) +- [#161](https://github.com/request/request/pull/161) Fix cookie jar/headers.cookie collision (#125) (@papandreou) +- [#162](https://github.com/request/request/pull/162) Fix issue #159 (@dpetukhov) +- [#90](https://github.com/request/request/pull/90) add option followAllRedirects to follow post/put redirects (@jroes) +- [#148](https://github.com/request/request/pull/148) Retry Agent (@thejh) +- [#146](https://github.com/request/request/pull/146) Multipart should respect content-type if previously set (@apeace) +- [#144](https://github.com/request/request/pull/144) added "form" option to readme (@petejkim) +- [#133](https://github.com/request/request/pull/133) Fixed cookies parsing (@afanasy) +- [#135](https://github.com/request/request/pull/135) host vs hostname (@iangreenleaf) +- [#132](https://github.com/request/request/pull/132) return the body as a Buffer when encoding is set to null (@jahewson) +- [#112](https://github.com/request/request/pull/112) Support using a custom http-like module (@jhs) +- [#104](https://github.com/request/request/pull/104) Cookie handling contains bugs (@janjongboom) +- [#121](https://github.com/request/request/pull/121) Another patch for cookie handling regression (@jhurliman) +- [#117](https://github.com/request/request/pull/117) Remove the global `i` (@3rd-Eden) +- [#110](https://github.com/request/request/pull/110) Update to Iris Couch URL (@jhs) +- [#86](https://github.com/request/request/pull/86) Can't post binary to multipart requests (@kkaefer) +- [#105](https://github.com/request/request/pull/105) added test for proxy option. (@dominictarr) +- [#102](https://github.com/request/request/pull/102) Implemented cookies - closes issue 82: https://github.com/mikeal/request/issues/82 (@alessioalex) +- [#97](https://github.com/request/request/pull/97) Typo in previous pull causes TypeError in non-0.5.11 versions (@isaacs) +- [#96](https://github.com/request/request/pull/96) Authless parsed url host support (@isaacs) +- [#81](https://github.com/request/request/pull/81) Enhance redirect handling (@danmactough) +- [#78](https://github.com/request/request/pull/78) Don't try to do strictSSL for non-ssl connections (@isaacs) +- [#76](https://github.com/request/request/pull/76) Bug when a request fails and a timeout is set (@Marsup) +- [#70](https://github.com/request/request/pull/70) add test script to package.json (@isaacs, @aheckmann) +- [#73](https://github.com/request/request/pull/73) Fix #71 Respect the strictSSL flag (@isaacs) +- [#69](https://github.com/request/request/pull/69) Flatten chunked requests properly (@isaacs) +- [#67](https://github.com/request/request/pull/67) fixed global variable leaks (@aheckmann) +- [#66](https://github.com/request/request/pull/66) Do not overwrite established content-type headers for read stream deliver (@voodootikigod) +- [#53](https://github.com/request/request/pull/53) Parse json: Issue #51 (@benatkin) +- [#45](https://github.com/request/request/pull/45) Added timeout option (@mbrevoort) +- [#35](https://github.com/request/request/pull/35) The "end" event isn't emitted for some responses (@voxpelli) +- [#31](https://github.com/request/request/pull/31) Error on piping a request to a destination (@tobowers) \ No newline at end of file diff --git a/node_modules/request/LICENSE b/node_modules/request/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/request/LICENSE @@ -0,0 +1,55 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +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 + +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 \ No newline at end of file diff --git a/node_modules/request/README.md b/node_modules/request/README.md new file mode 100644 index 0000000..b91623d --- /dev/null +++ b/node_modules/request/README.md @@ -0,0 +1,1097 @@ + +# Request - Simplified HTTP client + +[![npm package](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/) + +[![Build status](https://img.shields.io/travis/request/request/master.svg?style=flat-square)](https://travis-ci.org/request/request) +[![Coverage](https://img.shields.io/codecov/c/github/request/request.svg?style=flat-square)](https://codecov.io/github/request/request?branch=master) +[![Coverage](https://img.shields.io/coveralls/request/request.svg?style=flat-square)](https://coveralls.io/r/request/request) +[![Dependency Status](https://img.shields.io/david/request/request.svg?style=flat-square)](https://david-dm.org/request/request) +[![Known Vulnerabilities](https://snyk.io/test/npm/request/badge.svg?style=flat-square)](https://snyk.io/test/npm/request) +[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/request/request?utm_source=badge) + + +## Super simple to use + +Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. + +```js +var request = require('request'); +request('http://www.google.com', function (error, response, body) { + console.log('error:', error); // Print the error if one occurred + console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received + console.log('body:', body); // Print the HTML for the Google homepage. +}); +``` + + +## Table of contents + +- [Streaming](#streaming) +- [Promises & Async/Await](#promises--asyncawait) +- [Forms](#forms) +- [HTTP Authentication](#http-authentication) +- [Custom HTTP Headers](#custom-http-headers) +- [OAuth Signing](#oauth-signing) +- [Proxies](#proxies) +- [Unix Domain Sockets](#unix-domain-sockets) +- [TLS/SSL Protocol](#tlsssl-protocol) +- [Support for HAR 1.2](#support-for-har-12) +- [**All Available Options**](#requestoptions-callback) + +Request also offers [convenience methods](#convenience-methods) like +`request.defaults` and `request.post`, and there are +lots of [usage examples](#examples) and several +[debugging techniques](#debugging). + + +--- + + +## Streaming + +You can stream any response to a file stream. + +```js +request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) +``` + +You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one). + +```js +fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) +``` + +Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers. + +```js +request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) +``` + +Request emits a "response" event when a response is received. The `response` argument will be an instance of [http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage). + +```js +request + .get('http://google.com/img.png') + .on('response', function(response) { + console.log(response.statusCode) // 200 + console.log(response.headers['content-type']) // 'image/png' + }) + .pipe(request.put('http://mysite.com/img.png')) +``` + +To easily handle errors when streaming requests, listen to the `error` event before piping: + +```js +request + .get('http://mysite.com/doodle.png') + .on('error', function(err) { + console.log(err) + }) + .pipe(fs.createWriteStream('doodle.png')) +``` + +Now let’s get fancy. + +```js +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + if (req.method === 'PUT') { + req.pipe(request.put('http://mysite.com/doodle.png')) + } else if (req.method === 'GET' || req.method === 'HEAD') { + request.get('http://mysite.com/doodle.png').pipe(resp) + } + } +}) +``` + +You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do: + +```js +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + var x = request('http://mysite.com/doodle.png') + req.pipe(x) + x.pipe(resp) + } +}) +``` + +And since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :) + +```js +req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) +``` + +Also, none of this new functionality conflicts with requests previous features, it just expands them. + +```js +var r = request.defaults({'proxy':'http://localproxy.com'}) + +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + r.get('http://google.com/doodle.png').pipe(resp) + } +}) +``` + +You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. + +[back to top](#table-of-contents) + + +--- + + +## Promises & Async/Await + +`request` supports both streaming and callback interfaces natively. If you'd like `request` to return a Promise instead, you can use an alternative interface wrapper for `request`. These wrappers can be useful if you prefer to work with Promises, or if you'd like to use `async`/`await` in ES2017. + +Several alternative interfaces are provided by the request team, including: +- [`request-promise`](https://github.com/request/request-promise) (uses [Bluebird](https://github.com/petkaantonov/bluebird) Promises) +- [`request-promise-native`](https://github.com/request/request-promise-native) (uses native Promises) +- [`request-promise-any`](https://github.com/request/request-promise-any) (uses [any-promise](https://www.npmjs.com/package/any-promise) Promises) + + +[back to top](#table-of-contents) + + +--- + + +## Forms + +`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. + + +#### application/x-www-form-urlencoded (URL-Encoded Forms) + +URL-encoded forms are simple. + +```js +request.post('http://service.com/upload', {form:{key:'value'}}) +// or +request.post('http://service.com/upload').form({key:'value'}) +// or +request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ }) +``` + + +#### multipart/form-data (Multipart Form Uploads) + +For `multipart/form-data` we use the [form-data](https://github.com/form-data/form-data) library by [@felixge](https://github.com/felixge). For the most cases, you can pass your upload form data via the `formData` option. + + +```js +var formData = { + // Pass a simple key-value pair + my_field: 'my_value', + // Pass data via Buffers + my_buffer: Buffer.from([1, 2, 3]), + // Pass data via Streams + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), + // Pass multiple values /w an Array + attachments: [ + fs.createReadStream(__dirname + '/attachment1.jpg'), + fs.createReadStream(__dirname + '/attachment2.jpg') + ], + // Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS} + // Use case: for some types of streams, you'll need to provide "file"-related information manually. + // See the `form-data` README for more information about options: https://github.com/form-data/form-data + custom_file: { + value: fs.createReadStream('/dev/urandom'), + options: { + filename: 'topsecret.jpg', + contentType: 'image/jpeg' + } + } +}; +request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For advanced cases, you can access the form-data object itself via `r.form()`. This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling `form()` will clear the currently set form data for that request.) + +```js +// NOTE: Advanced use-case, for normal use see 'formData' usage above +var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...}) +var form = r.form(); +form.append('my_field', 'my_value'); +form.append('my_buffer', Buffer.from([1, 2, 3])); +form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'}); +``` +See the [form-data README](https://github.com/form-data/form-data) for more information & examples. + + +#### multipart/related + +Some variations in different HTTP implementations require a newline/CRLF before, after, or both before and after the boundary of a `multipart/related` request (using the multipart option). This has been observed in the .NET WebAPI version 4.0. You can turn on a boundary preambleCRLF or postamble by passing them as `true` to your request options. + +```js + request({ + method: 'PUT', + preambleCRLF: true, + postambleCRLF: true, + uri: 'http://service.com/upload', + multipart: [ + { + 'content-type': 'application/json', + body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + }, + { body: 'I am an attachment' }, + { body: fs.createReadStream('image.png') } + ], + // alternatively pass an object containing additional options + multipart: { + chunked: false, + data: [ + { + 'content-type': 'application/json', + body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + }, + { body: 'I am an attachment' } + ] + } + }, + function (error, response, body) { + if (error) { + return console.error('upload failed:', error); + } + console.log('Upload successful! Server responded with:', body); + }) +``` + +[back to top](#table-of-contents) + + +--- + + +## HTTP Authentication + +```js +request.get('http://some.server.com/').auth('username', 'password', false); +// or +request.get('http://some.server.com/', { + 'auth': { + 'user': 'username', + 'pass': 'password', + 'sendImmediately': false + } +}); +// or +request.get('http://some.server.com/').auth(null, null, true, 'bearerToken'); +// or +request.get('http://some.server.com/', { + 'auth': { + 'bearer': 'bearerToken' + } +}); +``` + +If passed as an option, `auth` should be a hash containing values: + +- `user` || `username` +- `pass` || `password` +- `sendImmediately` (optional) +- `bearer` (optional) + +The method form takes parameters +`auth(username, password, sendImmediately, bearer)`. + +`sendImmediately` defaults to `true`, which causes a basic or bearer +authentication header to be sent. If `sendImmediately` is `false`, then +`request` will retry with a proper authentication header after receiving a +`401` response from the server (which must contain a `WWW-Authenticate` header +indicating the required authentication method). + +Note that you can also specify basic authentication using the URL itself, as +detailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt). Simply pass the +`user:password` before the host with an `@` sign: + +```js +var username = 'username', + password = 'password', + url = 'http://' + username + ':' + password + '@some.server.com'; + +request({url: url}, function (error, response, body) { + // Do more stuff with 'body' here +}); +``` + +Digest authentication is supported, but it only works with `sendImmediately` +set to `false`; otherwise `request` will send basic authentication on the +initial request, which will probably cause the request to fail. + +Bearer authentication is supported, and is activated when the `bearer` value is +available. The value may be either a `String` or a `Function` returning a +`String`. Using a function to supply the bearer token is particularly useful if +used in conjunction with `defaults` to allow a single function to supply the +last known token at the time of sending a request, or to compute one on the fly. + +[back to top](#table-of-contents) + + +--- + + +## Custom HTTP Headers + +HTTP Headers, such as `User-Agent`, can be set in the `options` object. +In the example below, we call the github API to find out the number +of stars and forks for the request repository. This requires a +custom `User-Agent` header as well as https. + +```js +var request = require('request'); + +var options = { + url: 'https://api.github.com/repos/request/request', + headers: { + 'User-Agent': 'request' + } +}; + +function callback(error, response, body) { + if (!error && response.statusCode == 200) { + var info = JSON.parse(body); + console.log(info.stargazers_count + " Stars"); + console.log(info.forks_count + " Forks"); + } +} + +request(options, callback); +``` + +[back to top](#table-of-contents) + + +--- + + +## OAuth Signing + +[OAuth version 1.0](https://tools.ietf.org/html/rfc5849) is supported. The +default signing algorithm is +[HMAC-SHA1](https://tools.ietf.org/html/rfc5849#section-3.4.2): + +```js +// OAuth1.0 - 3-legged server side flow (Twitter example) +// step 1 +var qs = require('querystring') + , oauth = + { callback: 'http://mysite.com/callback/' + , consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + } + , url = 'https://api.twitter.com/oauth/request_token' + ; +request.post({url:url, oauth:oauth}, function (e, r, body) { + // Ideally, you would take the body in the response + // and construct a URL that a user clicks on (like a sign in button). + // The verifier is only available in the response after a user has + // verified with twitter that they are authorizing your app. + + // step 2 + var req_data = qs.parse(body) + var uri = 'https://api.twitter.com/oauth/authenticate' + + '?' + qs.stringify({oauth_token: req_data.oauth_token}) + // redirect the user to the authorize uri + + // step 3 + // after the user is redirected back to your server + var auth_data = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: auth_data.oauth_token + , token_secret: req_data.oauth_token_secret + , verifier: auth_data.oauth_verifier + } + , url = 'https://api.twitter.com/oauth/access_token' + ; + request.post({url:url, oauth:oauth}, function (e, r, body) { + // ready to make signed requests on behalf of the user + var perm_data = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: perm_data.oauth_token + , token_secret: perm_data.oauth_token_secret + } + , url = 'https://api.twitter.com/1.1/users/show.json' + , qs = + { screen_name: perm_data.screen_name + , user_id: perm_data.user_id + } + ; + request.get({url:url, oauth:oauth, qs:qs, json:true}, function (e, r, user) { + console.log(user) + }) + }) +}) +``` + +For [RSA-SHA1 signing](https://tools.ietf.org/html/rfc5849#section-3.4.3), make +the following changes to the OAuth options object: +* Pass `signature_method : 'RSA-SHA1'` +* Instead of `consumer_secret`, specify a `private_key` string in + [PEM format](http://how2ssl.com/articles/working_with_pem_files/) + +For [PLAINTEXT signing](http://oauth.net/core/1.0/#anchor22), make +the following changes to the OAuth options object: +* Pass `signature_method : 'PLAINTEXT'` + +To send OAuth parameters via query params or in a post body as described in The +[Consumer Request Parameters](http://oauth.net/core/1.0/#consumer_req_param) +section of the oauth1 spec: +* Pass `transport_method : 'query'` or `transport_method : 'body'` in the OAuth + options object. +* `transport_method` defaults to `'header'` + +To use [Request Body Hash](https://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html) you can either +* Manually generate the body hash and pass it as a string `body_hash: '...'` +* Automatically generate the body hash by passing `body_hash: true` + +[back to top](#table-of-contents) + + +--- + + +## Proxies + +If you specify a `proxy` option, then the request (and any subsequent +redirects) will be sent via a connection to the proxy server. + +If your endpoint is an `https` url, and you are using a proxy, then +request will send a `CONNECT` request to the proxy server *first*, and +then use the supplied connection to connect to the endpoint. + +That is, first it will make a request like: + +``` +HTTP/1.1 CONNECT endpoint-server.com:80 +Host: proxy-server.com +User-Agent: whatever user agent you specify +``` + +and then the proxy server make a TCP connection to `endpoint-server` +on port `80`, and return a response that looks like: + +``` +HTTP/1.1 200 OK +``` + +At this point, the connection is left open, and the client is +communicating directly with the `endpoint-server.com` machine. + +See [the wikipedia page on HTTP Tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel) +for more information. + +By default, when proxying `http` traffic, request will simply make a +standard proxied `http` request. This is done by making the `url` +section of the initial line of the request a fully qualified url to +the endpoint. + +For example, it will make a single request that looks like: + +``` +HTTP/1.1 GET http://endpoint-server.com/some-url +Host: proxy-server.com +Other-Headers: all go here + +request body or whatever +``` + +Because a pure "http over http" tunnel offers no additional security +or other features, it is generally simpler to go with a +straightforward HTTP proxy in this case. However, if you would like +to force a tunneling proxy, you may set the `tunnel` option to `true`. + +You can also make a standard proxied `http` request by explicitly setting +`tunnel : false`, but **note that this will allow the proxy to see the traffic +to/from the destination server**. + +If you are using a tunneling proxy, you may set the +`proxyHeaderWhiteList` to share certain headers with the proxy. + +You can also set the `proxyHeaderExclusiveList` to share certain +headers only with the proxy and not with destination host. + +By default, this set is: + +``` +accept +accept-charset +accept-encoding +accept-language +accept-ranges +cache-control +content-encoding +content-language +content-length +content-location +content-md5 +content-range +content-type +connection +date +expect +max-forwards +pragma +proxy-authorization +referer +te +transfer-encoding +user-agent +via +``` + +Note that, when using a tunneling proxy, the `proxy-authorization` +header and any headers from custom `proxyHeaderExclusiveList` are +*never* sent to the endpoint server, but only to the proxy server. + + +### Controlling proxy behaviour using environment variables + +The following environment variables are respected by `request`: + + * `HTTP_PROXY` / `http_proxy` + * `HTTPS_PROXY` / `https_proxy` + * `NO_PROXY` / `no_proxy` + +When `HTTP_PROXY` / `http_proxy` are set, they will be used to proxy non-SSL requests that do not have an explicit `proxy` configuration option present. Similarly, `HTTPS_PROXY` / `https_proxy` will be respected for SSL requests that do not have an explicit `proxy` configuration option. It is valid to define a proxy in one of the environment variables, but then override it for a specific request, using the `proxy` configuration option. Furthermore, the `proxy` configuration option can be explicitly set to false / null to opt out of proxying altogether for that request. + +`request` is also aware of the `NO_PROXY`/`no_proxy` environment variables. These variables provide a granular way to opt out of proxying, on a per-host basis. It should contain a comma separated list of hosts to opt out of proxying. It is also possible to opt of proxying when a particular destination port is used. Finally, the variable may be set to `*` to opt out of the implicit proxy configuration of the other environment variables. + +Here's some examples of valid `no_proxy` values: + + * `google.com` - don't proxy HTTP/HTTPS requests to Google. + * `google.com:443` - don't proxy HTTPS requests to Google, but *do* proxy HTTP requests to Google. + * `google.com:443, yahoo.com:80` - don't proxy HTTPS requests to Google, and don't proxy HTTP requests to Yahoo! + * `*` - ignore `https_proxy`/`http_proxy` environment variables altogether. + +[back to top](#table-of-contents) + + +--- + + +## UNIX Domain Sockets + +`request` supports making requests to [UNIX Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket). To make one, use the following URL scheme: + +```js +/* Pattern */ 'http://unix:SOCKET:PATH' +/* Example */ request.get('http://unix:/absolute/path/to/unix.socket:/request/path') +``` + +Note: The `SOCKET` path is assumed to be absolute to the root of the host file system. + +[back to top](#table-of-contents) + + +--- + + +## TLS/SSL Protocol + +TLS/SSL Protocol options, such as `cert`, `key` and `passphrase`, can be +set directly in `options` object, in the `agentOptions` property of the `options` object, or even in `https.globalAgent.options`. Keep in mind that, although `agentOptions` allows for a slightly wider range of configurations, the recommended way is via `options` object directly, as using `agentOptions` or `https.globalAgent.options` would not be applied in the same way in proxied environments (as data travels through a TLS connection instead of an http/https agent). + +```js +var fs = require('fs') + , path = require('path') + , certFile = path.resolve(__dirname, 'ssl/client.crt') + , keyFile = path.resolve(__dirname, 'ssl/client.key') + , caFile = path.resolve(__dirname, 'ssl/ca.cert.pem') + , request = require('request'); + +var options = { + url: 'https://api.some-server.com/', + cert: fs.readFileSync(certFile), + key: fs.readFileSync(keyFile), + passphrase: 'password', + ca: fs.readFileSync(caFile) +}; + +request.get(options); +``` + +### Using `options.agentOptions` + +In the example below, we call an API that requires client side SSL certificate +(in PEM format) with passphrase protected private key (in PEM format) and disable the SSLv3 protocol: + +```js +var fs = require('fs') + , path = require('path') + , certFile = path.resolve(__dirname, 'ssl/client.crt') + , keyFile = path.resolve(__dirname, 'ssl/client.key') + , request = require('request'); + +var options = { + url: 'https://api.some-server.com/', + agentOptions: { + cert: fs.readFileSync(certFile), + key: fs.readFileSync(keyFile), + // Or use `pfx` property replacing `cert` and `key` when using private key, certificate and CA certs in PFX or PKCS12 format: + // pfx: fs.readFileSync(pfxFilePath), + passphrase: 'password', + securityOptions: 'SSL_OP_NO_SSLv3' + } +}; + +request.get(options); +``` + +It is able to force using SSLv3 only by specifying `secureProtocol`: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + secureProtocol: 'SSLv3_method' + } +}); +``` + +It is possible to accept other certificates than those signed by generally allowed Certificate Authorities (CAs). +This can be useful, for example, when using self-signed certificates. +To require a different root certificate, you can specify the signing CA by adding the contents of the CA's certificate file to the `agentOptions`. +The certificate the domain presents must be signed by the root certificate specified: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + ca: fs.readFileSync('ca.cert.pem') + } +}); +``` + +[back to top](#table-of-contents) + + +--- + +## Support for HAR 1.2 + +The `options.har` property will override the values: `url`, `method`, `qs`, `headers`, `form`, `formData`, `body`, `json`, as well as construct multipart data and read files from disk when `request.postData.params[].fileName` is present without a matching `value`. + +A validation step will check if the HAR Request format matches the latest spec (v1.2) and will skip parsing if not matching. + +```js + var request = require('request') + request({ + // will be ignored + method: 'GET', + uri: 'http://www.google.com', + + // HTTP Archive Request Object + har: { + url: 'http://www.mockbin.com/har', + method: 'POST', + headers: [ + { + name: 'content-type', + value: 'application/x-www-form-urlencoded' + } + ], + postData: { + mimeType: 'application/x-www-form-urlencoded', + params: [ + { + name: 'foo', + value: 'bar' + }, + { + name: 'hello', + value: 'world' + } + ] + } + } + }) + + // a POST request will be sent to http://www.mockbin.com + // with body an application/x-www-form-urlencoded body: + // foo=bar&hello=world +``` + +[back to top](#table-of-contents) + + +--- + +## request(options, callback) + +The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional. + +- `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()` +- `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain. If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string. +- `method` - http method (default: `"GET"`) +- `headers` - http headers (default: `{}`) + +--- + +- `qs` - object containing querystring values to be appended to the `uri` +- `qsParseOptions` - object containing options to pass to the [qs.parse](https://github.com/hapijs/qs#parsing-objects) method. Alternatively pass options to the [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}` +- `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method. Alternatively pass options to the [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`. For example, to change the way arrays are converted to query strings using the `qs` module pass the `arrayFormat` option with one of `indices|brackets|repeat` +- `useQuerystring` - if true, use `querystring` to stringify and parse + querystrings, otherwise use `qs` (default: `false`). Set this option to + `true` if you need arrays to be serialized as `foo=bar&foo=baz` instead of the + default `foo[0]=bar&foo[1]=baz`. + +--- + +- `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer`, `String` or `ReadStream`. If `json` is `true`, then `body` must be a JSON-serializable object. +- `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded` header. When passed no options, a `FormData` instance is returned (and is piped to request). See "Forms" section above. +- `formData` - data to pass for a `multipart/form-data` request. See + [Forms](#forms) section above. +- `multipart` - array of objects which contain their own headers and `body` + attributes. Sends a `multipart/related` request. See [Forms](#forms) section + above. + - Alternatively you can pass in an object `{chunked: false, data: []}` where + `chunked` is used to specify whether the request is sent in + [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) + In non-chunked requests, data items with body streams are not allowed. +- `preambleCRLF` - append a newline/CRLF before the boundary of your `multipart/form-data` request. +- `postambleCRLF` - append a newline/CRLF at the end of the boundary of your `multipart/form-data` request. +- `json` - sets `body` to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as JSON. +- `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body. +- `jsonReplacer` - a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that will be passed to `JSON.stringify()` when stringifying a JSON request body. + +--- + +- `auth` - a hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional). See documentation above. +- `oauth` - options for OAuth HMAC-SHA1 signing. See documentation above. +- `hawk` - options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example). +- `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`, and optionally `session` (note that this only works for services that require session as part of the canonical string). Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services). If you want to use AWS sign version 4 use the parameter `sign_version` with value `4` otherwise the default is version 2. If you are using SigV4, you can also include a `service` property that specifies the service name. **Note:** you need to `npm install aws4` first. +- `httpSignature` - options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options. + +--- + +- `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise. +- `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`) +- `followOriginalHttpMethod` - by default we redirect to HTTP method GET. you can enable this property to redirect to the original HTTP method (default: `false`) +- `maxRedirects` - the maximum number of redirects to follow (default: `10`) +- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`). **Note:** if true, referer header set in the initial request is preserved during redirect chain. + +--- + +- `encoding` - encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. Anything else **(including the default value of `undefined`)** will be passed as the [encoding](http://nodejs.org/api/buffer.html#buffer_buffer) parameter to `toString()` (meaning this is effectively `utf8` by default). (**Note:** if you expect binary data, you should set `encoding: null`.) +- `gzip` - if `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response. **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below. +- `jar` - if `true`, remember cookies for future use (or define your custom cookie jar; see examples section) + +--- + +- `agent` - `http(s).Agent` instance to use +- `agentClass` - alternatively specify your agent's class name +- `agentOptions` - and pass its options. **Note:** for HTTPS see [tls API doc for TLS/SSL options](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback) and the [documentation above](#using-optionsagentoptions). +- `forever` - set to `true` to use the [forever-agent](https://github.com/request/forever-agent) **Note:** Defaults to `http(s).Agent({keepAlive:true})` in node 0.12+ +- `pool` - an object describing which agents to use for the request. If this option is omitted the request will use the global agent (as long as your options allow for it). Otherwise, request will search the pool for your custom agent. If no custom agent is found, a new agent will be created and added to the pool. **Note:** `pool` is used only when the `agent` option is not specified. + - A `maxSockets` property can also be provided on the `pool` object to set the max number of sockets for all agents created (ex: `pool: {maxSockets: Infinity}`). + - Note that if you are sending multiple requests in a loop and creating + multiple new `pool` objects, `maxSockets` will not work as intended. To + work around this, either use [`request.defaults`](#requestdefaultsoptions) + with your pool options or create the pool object with the `maxSockets` + property outside of the loop. +- `timeout` - integer containing the number of milliseconds to wait for a +server to send response headers (and start the response body) before aborting +the request. Note that if the underlying TCP connection cannot be established, +the OS-wide TCP connection timeout will overrule the `timeout` option ([the +default in Linux can be anywhere from 20-120 seconds][linux-timeout]). + +[linux-timeout]: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout + +--- + +- `localAddress` - local interface to bind for network connections. +- `proxy` - an HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`) +- `strictSSL` - if `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option. +- `tunnel` - controls the behavior of + [HTTP `CONNECT` tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_tunneling) + as follows: + - `undefined` (default) - `true` if the destination is `https`, `false` otherwise + - `true` - always tunnel to the destination by making a `CONNECT` request to + the proxy + - `false` - request the destination as a `GET` request. +- `proxyHeaderWhiteList` - a whitelist of headers to send to a + tunneling proxy. +- `proxyHeaderExclusiveList` - a whitelist of headers to send + exclusively to a tunneling proxy and not to destination. + +--- + +- `time` - if `true`, the request-response cycle (including all redirects) is timed at millisecond resolution. When set, the following properties are added to the response object: + - `elapsedTime` Duration of the entire request/response in milliseconds (*deprecated*). + - `responseStartTime` Timestamp when the response began (in Unix Epoch milliseconds) (*deprecated*). + - `timingStart` Timestamp of the start of the request (in Unix Epoch milliseconds). + - `timings` Contains event timestamps in millisecond resolution relative to `timingStart`. If there were redirects, the properties reflect the timings of the final request in the redirect chain: + - `socket` Relative timestamp when the [`http`](https://nodejs.org/api/http.html#http_event_socket) module's `socket` event fires. This happens when the socket is assigned to the request. + - `lookup` Relative timestamp when the [`net`](https://nodejs.org/api/net.html#net_event_lookup) module's `lookup` event fires. This happens when the DNS has been resolved. + - `connect`: Relative timestamp when the [`net`](https://nodejs.org/api/net.html#net_event_connect) module's `connect` event fires. This happens when the server acknowledges the TCP connection. + - `response`: Relative timestamp when the [`http`](https://nodejs.org/api/http.html#http_event_response) module's `response` event fires. This happens when the first bytes are received from the server. + - `end`: Relative timestamp when the last bytes of the response are received. + - `timingPhases` Contains the durations of each request phase. If there were redirects, the properties reflect the timings of the final request in the redirect chain: + - `wait`: Duration of socket initialization (`timings.socket`) + - `dns`: Duration of DNS lookup (`timings.lookup` - `timings.socket`) + - `tcp`: Duration of TCP connection (`timings.connect` - `timings.socket`) + - `firstByte`: Duration of HTTP server response (`timings.response` - `timings.connect`) + - `download`: Duration of HTTP download (`timings.end` - `timings.response`) + - `total`: Duration entire HTTP round-trip (`timings.end`) + +- `har` - a [HAR 1.2 Request Object](http://www.softwareishard.com/blog/har-12-spec/#request), will be processed from HAR format into options overwriting matching values *(see the [HAR 1.2 section](#support-for-har-1.2) for details)* +- `callback` - alternatively pass the request's callback in the options object + +The callback argument gets 3 arguments: + +1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object) +2. An [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage) object (Response object) +3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied) + +[back to top](#table-of-contents) + + +--- + +## Convenience methods + +There are also shorthand methods for different HTTP METHODs and some other conveniences. + + +### request.defaults(options) + +This method **returns a wrapper** around the normal request API that defaults +to whatever options you pass to it. + +**Note:** `request.defaults()` **does not** modify the global request API; +instead, it **returns a wrapper** that has your default settings applied to it. + +**Note:** You can call `.defaults()` on the wrapper that is returned from +`request.defaults` to add/override defaults that were previously defaulted. + +For example: +```js +//requests using baseRequest() will set the 'x-token' header +var baseRequest = request.defaults({ + headers: {'x-token': 'my-token'} +}) + +//requests using specialRequest() will include the 'x-token' header set in +//baseRequest and will also include the 'special' header +var specialRequest = baseRequest.defaults({ + headers: {special: 'special value'} +}) +``` + +### request.METHOD() + +These HTTP method convenience functions act just like `request()` but with a default method already set for you: + +- *request.get()*: Defaults to `method: "GET"`. +- *request.post()*: Defaults to `method: "POST"`. +- *request.put()*: Defaults to `method: "PUT"`. +- *request.patch()*: Defaults to `method: "PATCH"`. +- *request.del() / request.delete()*: Defaults to `method: "DELETE"`. +- *request.head()*: Defaults to `method: "HEAD"`. +- *request.options()*: Defaults to `method: "OPTIONS"`. + +### request.cookie() + +Function that creates a new cookie. + +```js +request.cookie('key1=value1') +``` +### request.jar() + +Function that creates a new cookie jar. + +```js +request.jar() +``` + +[back to top](#table-of-contents) + + +--- + + +## Debugging + +There are at least three ways to debug the operation of `request`: + +1. Launch the node process like `NODE_DEBUG=request node script.js` + (`lib,request,otherlib` works too). + +2. Set `require('request').debug = true` at any time (this does the same thing + as #1). + +3. Use the [request-debug module](https://github.com/request/request-debug) to + view request and response headers and bodies. + +[back to top](#table-of-contents) + + +--- + +## Timeouts + +Most requests to external servers should have a timeout attached, in case the +server is not responding in a timely manner. Without a timeout, your code may +have a socket open/consume resources for minutes or more. + +There are two main types of timeouts: **connection timeouts** and **read +timeouts**. A connect timeout occurs if the timeout is hit while your client is +attempting to establish a connection to a remote machine (corresponding to the +[connect() call][connect] on the socket). A read timeout occurs any time the +server is too slow to send back a part of the response. + +These two situations have widely different implications for what went wrong +with the request, so it's useful to be able to distinguish them. You can detect +timeout errors by checking `err.code` for an 'ETIMEDOUT' value. Further, you +can detect whether the timeout was a connection timeout by checking if the +`err.connect` property is set to `true`. + +```js +request.get('http://10.255.255.1', {timeout: 1500}, function(err) { + console.log(err.code === 'ETIMEDOUT'); + // Set to `true` if the timeout was a connection timeout, `false` or + // `undefined` otherwise. + console.log(err.connect === true); + process.exit(0); +}); +``` + +[connect]: http://linux.die.net/man/2/connect + +## Examples: + +```js + var request = require('request') + , rand = Math.floor(Math.random()*100000000).toString() + ; + request( + { method: 'PUT' + , uri: 'http://mikeal.iriscouch.com/testjs/' + rand + , multipart: + [ { 'content-type': 'application/json' + , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + } + , { body: 'I am an attachment' } + ] + } + , function (error, response, body) { + if(response.statusCode == 201){ + console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) + } else { + console.log('error: '+ response.statusCode) + console.log(body) + } + } + ) +``` + +For backwards-compatibility, response compression is not supported by default. +To accept gzip-compressed responses, set the `gzip` option to `true`. Note +that the body data passed through `request` is automatically decompressed +while the response object is unmodified and will contain compressed data if +the server sent a compressed response. + +```js + var request = require('request') + request( + { method: 'GET' + , uri: 'http://www.google.com' + , gzip: true + } + , function (error, response, body) { + // body is the decompressed response body + console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity')) + console.log('the decoded data is: ' + body) + } + ) + .on('data', function(data) { + // decompressed data as it is received + console.log('decoded chunk: ' + data) + }) + .on('response', function(response) { + // unmodified http.IncomingMessage object + response.on('data', function(data) { + // compressed data as it is received + console.log('received ' + data.length + ' bytes of compressed data') + }) + }) +``` + +Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`). + +```js +var request = request.defaults({jar: true}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`) + +```js +var j = request.jar() +var request = request.defaults({jar:j}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +OR + +```js +var j = request.jar(); +var cookie = request.cookie('key1=value1'); +var url = 'http://www.google.com'; +j.setCookie(cookie, url); +request({url: url, jar: j}, function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie store (such as a +[`FileCookieStore`](https://github.com/mitsuru/tough-cookie-filestore) +which supports saving to and restoring from JSON files), pass it as a parameter +to `request.jar()`: + +```js +var FileCookieStore = require('tough-cookie-filestore'); +// NOTE - currently the 'cookies.json' file must already exist! +var j = request.jar(new FileCookieStore('cookies.json')); +request = request.defaults({ jar : j }) +request('http://www.google.com', function() { + request('http://images.google.com') +}) +``` + +The cookie store must be a +[`tough-cookie`](https://github.com/SalesforceEng/tough-cookie) +store and it must support synchronous operations; see the +[`CookieStore` API docs](https://github.com/SalesforceEng/tough-cookie#cookiestore-api) +for details. + +To inspect your cookie jar after a request: + +```js +var j = request.jar() +request({url: 'http://www.google.com', jar: j}, function () { + var cookie_string = j.getCookieString(url); // "key1=value1; key2=value2; ..." + var cookies = j.getCookies(url); + // [{key: 'key1', value: 'value1', domain: "www.google.com", ...}, ...] +}) +``` + +[back to top](#table-of-contents) diff --git a/node_modules/request/index.js b/node_modules/request/index.js new file mode 100755 index 0000000..f9b480a --- /dev/null +++ b/node_modules/request/index.js @@ -0,0 +1,155 @@ +// Copyright 2010-2012 Mikeal Rogers +// +// 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. + +'use strict' + +var extend = require('extend') +var cookies = require('./lib/cookies') +var helpers = require('./lib/helpers') + +var paramsHaveRequestBody = helpers.paramsHaveRequestBody + +// organize params for patch, post, put, head, del +function initParams (uri, options, callback) { + if (typeof options === 'function') { + callback = options + } + + var params = {} + if (typeof options === 'object') { + extend(params, options, {uri: uri}) + } else if (typeof uri === 'string') { + extend(params, {uri: uri}) + } else { + extend(params, uri) + } + + params.callback = callback || params.callback + return params +} + +function request (uri, options, callback) { + if (typeof uri === 'undefined') { + throw new Error('undefined is not a valid uri or options object.') + } + + var params = initParams(uri, options, callback) + + if (params.method === 'HEAD' && paramsHaveRequestBody(params)) { + throw new Error('HTTP HEAD requests MUST NOT include a request body.') + } + + return new request.Request(params) +} + +function verbFunc (verb) { + var method = verb.toUpperCase() + return function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.method = method + return request(params, params.callback) + } +} + +// define like this to please codeintel/intellisense IDEs +request.get = verbFunc('get') +request.head = verbFunc('head') +request.options = verbFunc('options') +request.post = verbFunc('post') +request.put = verbFunc('put') +request.patch = verbFunc('patch') +request.del = verbFunc('delete') +request['delete'] = verbFunc('delete') + +request.jar = function (store) { + return cookies.jar(store) +} + +request.cookie = function (str) { + return cookies.parse(str) +} + +function wrapRequestMethod (method, options, requester, verb) { + return function (uri, opts, callback) { + var params = initParams(uri, opts, callback) + + var target = {} + extend(true, target, options, params) + + target.pool = params.pool || options.pool + + if (verb) { + target.method = verb.toUpperCase() + } + + if (typeof requester === 'function') { + method = requester + } + + return method(target, target.callback) + } +} + +request.defaults = function (options, requester) { + var self = this + + options = options || {} + + if (typeof options === 'function') { + requester = options + options = {} + } + + var defaults = wrapRequestMethod(self, options, requester) + + var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete'] + verbs.forEach(function (verb) { + defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb) + }) + + defaults.cookie = wrapRequestMethod(self.cookie, options, requester) + defaults.jar = self.jar + defaults.defaults = self.defaults + return defaults +} + +request.forever = function (agentOptions, optionsArg) { + var options = {} + if (optionsArg) { + extend(options, optionsArg) + } + if (agentOptions) { + options.agentOptions = agentOptions + } + + options.forever = true + return request.defaults(options) +} + +// Exports + +module.exports = request +request.Request = require('./request') +request.initParams = initParams + +// Backwards compatibility for request.debug +Object.defineProperty(request, 'debug', { + enumerable: true, + get: function () { + return request.Request.debug + }, + set: function (debug) { + request.Request.debug = debug + } +}) diff --git a/node_modules/request/lib/auth.js b/node_modules/request/lib/auth.js new file mode 100644 index 0000000..f5edf32 --- /dev/null +++ b/node_modules/request/lib/auth.js @@ -0,0 +1,167 @@ +'use strict' + +var caseless = require('caseless') +var uuid = require('uuid/v4') +var helpers = require('./helpers') + +var md5 = helpers.md5 +var toBase64 = helpers.toBase64 + +function Auth (request) { + // define all public properties here + this.request = request + this.hasAuth = false + this.sentAuth = false + this.bearerToken = null + this.user = null + this.pass = null +} + +Auth.prototype.basic = function (user, pass, sendImmediately) { + var self = this + if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { + self.request.emit('error', new Error('auth() received invalid user or password')) + } + self.user = user + self.pass = pass + self.hasAuth = true + var header = user + ':' + (pass || '') + if (sendImmediately || typeof sendImmediately === 'undefined') { + var authHeader = 'Basic ' + toBase64(header) + self.sentAuth = true + return authHeader + } +} + +Auth.prototype.bearer = function (bearer, sendImmediately) { + var self = this + self.bearerToken = bearer + self.hasAuth = true + if (sendImmediately || typeof sendImmediately === 'undefined') { + if (typeof bearer === 'function') { + bearer = bearer() + } + var authHeader = 'Bearer ' + (bearer || '') + self.sentAuth = true + return authHeader + } +} + +Auth.prototype.digest = function (method, path, authHeader) { + // TODO: More complete implementation of RFC 2617. + // - handle challenge.domain + // - support qop="auth-int" only + // - handle Authentication-Info (not necessarily?) + // - check challenge.stale (not necessarily?) + // - increase nc (not necessarily?) + // For reference: + // http://tools.ietf.org/html/rfc2617#section-3 + // https://github.com/bagder/curl/blob/master/lib/http_digest.c + + var self = this + + var challenge = {} + var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi + for (;;) { + var match = re.exec(authHeader) + if (!match) { + break + } + challenge[match[1]] = match[2] || match[3] + } + + /** + * RFC 2617: handle both MD5 and MD5-sess algorithms. + * + * If the algorithm directive's value is "MD5" or unspecified, then HA1 is + * HA1=MD5(username:realm:password) + * If the algorithm directive's value is "MD5-sess", then HA1 is + * HA1=MD5(MD5(username:realm:password):nonce:cnonce) + */ + var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) { + var ha1 = md5(user + ':' + realm + ':' + pass) + if (algorithm && algorithm.toLowerCase() === 'md5-sess') { + return md5(ha1 + ':' + nonce + ':' + cnonce) + } else { + return ha1 + } + } + + var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' + var nc = qop && '00000001' + var cnonce = qop && uuid().replace(/-/g, '') + var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce) + var ha2 = md5(method + ':' + path) + var digestResponse = qop + ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) + : md5(ha1 + ':' + challenge.nonce + ':' + ha2) + var authValues = { + username: self.user, + realm: challenge.realm, + nonce: challenge.nonce, + uri: path, + qop: qop, + response: digestResponse, + nc: nc, + cnonce: cnonce, + algorithm: challenge.algorithm, + opaque: challenge.opaque + } + + authHeader = [] + for (var k in authValues) { + if (authValues[k]) { + if (k === 'qop' || k === 'nc' || k === 'algorithm') { + authHeader.push(k + '=' + authValues[k]) + } else { + authHeader.push(k + '="' + authValues[k] + '"') + } + } + } + authHeader = 'Digest ' + authHeader.join(', ') + self.sentAuth = true + return authHeader +} + +Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) { + var self = this + var request = self.request + + var authHeader + if (bearer === undefined && user === undefined) { + self.request.emit('error', new Error('no auth mechanism defined')) + } else if (bearer !== undefined) { + authHeader = self.bearer(bearer, sendImmediately) + } else { + authHeader = self.basic(user, pass, sendImmediately) + } + if (authHeader) { + request.setHeader('authorization', authHeader) + } +} + +Auth.prototype.onResponse = function (response) { + var self = this + var request = self.request + + if (!self.hasAuth || self.sentAuth) { return null } + + var c = caseless(response.headers) + + var authHeader = c.get('www-authenticate') + var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase() + request.debug('reauth', authVerb) + + switch (authVerb) { + case 'basic': + return self.basic(self.user, self.pass, true) + + case 'bearer': + return self.bearer(self.bearerToken, true) + + case 'digest': + return self.digest(request.method, request.path, authHeader) + } +} + +exports.Auth = Auth diff --git a/node_modules/request/lib/cookies.js b/node_modules/request/lib/cookies.js new file mode 100644 index 0000000..bd5d46b --- /dev/null +++ b/node_modules/request/lib/cookies.js @@ -0,0 +1,38 @@ +'use strict' + +var tough = require('tough-cookie') + +var Cookie = tough.Cookie +var CookieJar = tough.CookieJar + +exports.parse = function (str) { + if (str && str.uri) { + str = str.uri + } + if (typeof str !== 'string') { + throw new Error('The cookie function only accepts STRING as param') + } + return Cookie.parse(str, {loose: true}) +} + +// Adapt the sometimes-Async api of tough.CookieJar to our requirements +function RequestJar (store) { + var self = this + self._jar = new CookieJar(store, {looseMode: true}) +} +RequestJar.prototype.setCookie = function (cookieOrStr, uri, options) { + var self = this + return self._jar.setCookieSync(cookieOrStr, uri, options || {}) +} +RequestJar.prototype.getCookieString = function (uri) { + var self = this + return self._jar.getCookieStringSync(uri) +} +RequestJar.prototype.getCookies = function (uri) { + var self = this + return self._jar.getCookiesSync(uri) +} + +exports.jar = function (store) { + return new RequestJar(store) +} diff --git a/node_modules/request/lib/getProxyFromURI.js b/node_modules/request/lib/getProxyFromURI.js new file mode 100644 index 0000000..4633ba5 --- /dev/null +++ b/node_modules/request/lib/getProxyFromURI.js @@ -0,0 +1,79 @@ +'use strict' + +function formatHostname (hostname) { + // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' + return hostname.replace(/^\.*/, '.').toLowerCase() +} + +function parseNoProxyZone (zone) { + zone = zone.trim().toLowerCase() + + var zoneParts = zone.split(':', 2) + var zoneHost = formatHostname(zoneParts[0]) + var zonePort = zoneParts[1] + var hasPort = zone.indexOf(':') > -1 + + return {hostname: zoneHost, port: zonePort, hasPort: hasPort} +} + +function uriInNoProxy (uri, noProxy) { + var port = uri.port || (uri.protocol === 'https:' ? '443' : '80') + var hostname = formatHostname(uri.hostname) + var noProxyList = noProxy.split(',') + + // iterate through the noProxyList until it finds a match. + return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { + var isMatchedAt = hostname.indexOf(noProxyZone.hostname) + var hostnameMatched = ( + isMatchedAt > -1 && + (isMatchedAt === hostname.length - noProxyZone.hostname.length) + ) + + if (noProxyZone.hasPort) { + return (port === noProxyZone.port) && hostnameMatched + } + + return hostnameMatched + }) +} + +function getProxyFromURI (uri) { + // Decide the proper request proxy to use based on the request URI object and the + // environmental variables (NO_PROXY, HTTP_PROXY, etc.) + // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html) + + var noProxy = process.env.NO_PROXY || process.env.no_proxy || '' + + // if the noProxy is a wildcard then return null + + if (noProxy === '*') { + return null + } + + // if the noProxy is not empty and the uri is found return null + + if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { + return null + } + + // Check for HTTP or HTTPS Proxy in environment Else default to null + + if (uri.protocol === 'http:') { + return process.env.HTTP_PROXY || + process.env.http_proxy || null + } + + if (uri.protocol === 'https:') { + return process.env.HTTPS_PROXY || + process.env.https_proxy || + process.env.HTTP_PROXY || + process.env.http_proxy || null + } + + // if none of that works, return null + // (What uri protocol are you using then?) + + return null +} + +module.exports = getProxyFromURI diff --git a/node_modules/request/lib/har.js b/node_modules/request/lib/har.js new file mode 100644 index 0000000..2f66030 --- /dev/null +++ b/node_modules/request/lib/har.js @@ -0,0 +1,205 @@ +'use strict' + +var fs = require('fs') +var qs = require('querystring') +var validate = require('har-validator') +var extend = require('extend') + +function Har (request) { + this.request = request +} + +Har.prototype.reducer = function (obj, pair) { + // new property ? + if (obj[pair.name] === undefined) { + obj[pair.name] = pair.value + return obj + } + + // existing? convert to array + var arr = [ + obj[pair.name], + pair.value + ] + + obj[pair.name] = arr + + return obj +} + +Har.prototype.prep = function (data) { + // construct utility properties + data.queryObj = {} + data.headersObj = {} + data.postData.jsonObj = false + data.postData.paramsObj = false + + // construct query objects + if (data.queryString && data.queryString.length) { + data.queryObj = data.queryString.reduce(this.reducer, {}) + } + + // construct headers objects + if (data.headers && data.headers.length) { + // loweCase header keys + data.headersObj = data.headers.reduceRight(function (headers, header) { + headers[header.name] = header.value + return headers + }, {}) + } + + // construct Cookie header + if (data.cookies && data.cookies.length) { + var cookies = data.cookies.map(function (cookie) { + return cookie.name + '=' + cookie.value + }) + + if (cookies.length) { + data.headersObj.cookie = cookies.join('; ') + } + } + + // prep body + function some (arr) { + return arr.some(function (type) { + return data.postData.mimeType.indexOf(type) === 0 + }) + } + + if (some([ + 'multipart/mixed', + 'multipart/related', + 'multipart/form-data', + 'multipart/alternative'])) { + // reset values + data.postData.mimeType = 'multipart/form-data' + } else if (some([ + 'application/x-www-form-urlencoded'])) { + if (!data.postData.params) { + data.postData.text = '' + } else { + data.postData.paramsObj = data.postData.params.reduce(this.reducer, {}) + + // always overwrite + data.postData.text = qs.stringify(data.postData.paramsObj) + } + } else if (some([ + 'text/json', + 'text/x-json', + 'application/json', + 'application/x-json'])) { + data.postData.mimeType = 'application/json' + + if (data.postData.text) { + try { + data.postData.jsonObj = JSON.parse(data.postData.text) + } catch (e) { + this.request.debug(e) + + // force back to text/plain + data.postData.mimeType = 'text/plain' + } + } + } + + return data +} + +Har.prototype.options = function (options) { + // skip if no har property defined + if (!options.har) { + return options + } + + var har = {} + extend(har, options.har) + + // only process the first entry + if (har.log && har.log.entries) { + har = har.log.entries[0] + } + + // add optional properties to make validation successful + har.url = har.url || options.url || options.uri || options.baseUrl || '/' + har.httpVersion = har.httpVersion || 'HTTP/1.1' + har.queryString = har.queryString || [] + har.headers = har.headers || [] + har.cookies = har.cookies || [] + har.postData = har.postData || {} + har.postData.mimeType = har.postData.mimeType || 'application/octet-stream' + + har.bodySize = 0 + har.headersSize = 0 + har.postData.size = 0 + + if (!validate.request(har)) { + return options + } + + // clean up and get some utility properties + var req = this.prep(har) + + // construct new options + if (req.url) { + options.url = req.url + } + + if (req.method) { + options.method = req.method + } + + if (Object.keys(req.queryObj).length) { + options.qs = req.queryObj + } + + if (Object.keys(req.headersObj).length) { + options.headers = req.headersObj + } + + function test (type) { + return req.postData.mimeType.indexOf(type) === 0 + } + if (test('application/x-www-form-urlencoded')) { + options.form = req.postData.paramsObj + } else if (test('application/json')) { + if (req.postData.jsonObj) { + options.body = req.postData.jsonObj + options.json = true + } + } else if (test('multipart/form-data')) { + options.formData = {} + + req.postData.params.forEach(function (param) { + var attachment = {} + + if (!param.fileName && !param.fileName && !param.contentType) { + options.formData[param.name] = param.value + return + } + + // attempt to read from disk! + if (param.fileName && !param.value) { + attachment.value = fs.createReadStream(param.fileName) + } else if (param.value) { + attachment.value = param.value + } + + if (param.fileName) { + attachment.options = { + filename: param.fileName, + contentType: param.contentType ? param.contentType : null + } + } + + options.formData[param.name] = attachment + }) + } else { + if (req.postData.text) { + options.body = req.postData.text + } + } + + return options +} + +exports.Har = Har diff --git a/node_modules/request/lib/hawk.js b/node_modules/request/lib/hawk.js new file mode 100644 index 0000000..de48a98 --- /dev/null +++ b/node_modules/request/lib/hawk.js @@ -0,0 +1,89 @@ +'use strict' + +var crypto = require('crypto') + +function randomString (size) { + var bits = (size + 1) * 6 + var buffer = crypto.randomBytes(Math.ceil(bits / 8)) + var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') + return string.slice(0, size) +} + +function calculatePayloadHash (payload, algorithm, contentType) { + var hash = crypto.createHash(algorithm) + hash.update('hawk.1.payload\n') + hash.update((contentType ? contentType.split(';')[0].trim().toLowerCase() : '') + '\n') + hash.update(payload || '') + hash.update('\n') + return hash.digest('base64') +} + +exports.calculateMac = function (credentials, opts) { + var normalized = 'hawk.1.header\n' + + opts.ts + '\n' + + opts.nonce + '\n' + + (opts.method || '').toUpperCase() + '\n' + + opts.resource + '\n' + + opts.host.toLowerCase() + '\n' + + opts.port + '\n' + + (opts.hash || '') + '\n' + + if (opts.ext) { + normalized = normalized + opts.ext.replace('\\', '\\\\').replace('\n', '\\n') + } + + normalized = normalized + '\n' + + if (opts.app) { + normalized = normalized + opts.app + '\n' + (opts.dlg || '') + '\n' + } + + var hmac = crypto.createHmac(credentials.algorithm, credentials.key).update(normalized) + var digest = hmac.digest('base64') + return digest +} + +exports.header = function (uri, method, opts) { + var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1000) + var credentials = opts.credentials + if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) { + return '' + } + + if (['sha1', 'sha256'].indexOf(credentials.algorithm) === -1) { + return '' + } + + var artifacts = { + ts: timestamp, + nonce: opts.nonce || randomString(6), + method: method, + resource: uri.pathname + (uri.search || ''), + host: uri.hostname, + port: uri.port || (uri.protocol === 'http:' ? 80 : 443), + hash: opts.hash, + ext: opts.ext, + app: opts.app, + dlg: opts.dlg + } + + if (!artifacts.hash && (opts.payload || opts.payload === '')) { + artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType) + } + + var mac = exports.calculateMac(credentials, artifacts) + + var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== '' + var header = 'Hawk id="' + credentials.id + + '", ts="' + artifacts.ts + + '", nonce="' + artifacts.nonce + + (artifacts.hash ? '", hash="' + artifacts.hash : '') + + (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, '\\\\').replace(/"/g, '\\"') : '') + + '", mac="' + mac + '"' + + if (artifacts.app) { + header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"' + } + + return header +} diff --git a/node_modules/request/lib/helpers.js b/node_modules/request/lib/helpers.js new file mode 100644 index 0000000..8b2a7e6 --- /dev/null +++ b/node_modules/request/lib/helpers.js @@ -0,0 +1,66 @@ +'use strict' + +var jsonSafeStringify = require('json-stringify-safe') +var crypto = require('crypto') +var Buffer = require('safe-buffer').Buffer + +var defer = typeof setImmediate === 'undefined' + ? process.nextTick + : setImmediate + +function paramsHaveRequestBody (params) { + return ( + params.body || + params.requestBodyStream || + (params.json && typeof params.json !== 'boolean') || + params.multipart + ) +} + +function safeStringify (obj, replacer) { + var ret + try { + ret = JSON.stringify(obj, replacer) + } catch (e) { + ret = jsonSafeStringify(obj, replacer) + } + return ret +} + +function md5 (str) { + return crypto.createHash('md5').update(str).digest('hex') +} + +function isReadStream (rs) { + return rs.readable && rs.path && rs.mode +} + +function toBase64 (str) { + return Buffer.from(str || '', 'utf8').toString('base64') +} + +function copy (obj) { + var o = {} + Object.keys(obj).forEach(function (i) { + o[i] = obj[i] + }) + return o +} + +function version () { + var numbers = process.version.replace('v', '').split('.') + return { + major: parseInt(numbers[0], 10), + minor: parseInt(numbers[1], 10), + patch: parseInt(numbers[2], 10) + } +} + +exports.paramsHaveRequestBody = paramsHaveRequestBody +exports.safeStringify = safeStringify +exports.md5 = md5 +exports.isReadStream = isReadStream +exports.toBase64 = toBase64 +exports.copy = copy +exports.version = version +exports.defer = defer diff --git a/node_modules/request/lib/multipart.js b/node_modules/request/lib/multipart.js new file mode 100644 index 0000000..6a009bc --- /dev/null +++ b/node_modules/request/lib/multipart.js @@ -0,0 +1,112 @@ +'use strict' + +var uuid = require('uuid/v4') +var CombinedStream = require('combined-stream') +var isstream = require('isstream') +var Buffer = require('safe-buffer').Buffer + +function Multipart (request) { + this.request = request + this.boundary = uuid() + this.chunked = false + this.body = null +} + +Multipart.prototype.isChunked = function (options) { + var self = this + var chunked = false + var parts = options.data || options + + if (!parts.forEach) { + self.request.emit('error', new Error('Argument error, options.multipart.')) + } + + if (options.chunked !== undefined) { + chunked = options.chunked + } + + if (self.request.getHeader('transfer-encoding') === 'chunked') { + chunked = true + } + + if (!chunked) { + parts.forEach(function (part) { + if (typeof part.body === 'undefined') { + self.request.emit('error', new Error('Body attribute missing in multipart.')) + } + if (isstream(part.body)) { + chunked = true + } + }) + } + + return chunked +} + +Multipart.prototype.setHeaders = function (chunked) { + var self = this + + if (chunked && !self.request.hasHeader('transfer-encoding')) { + self.request.setHeader('transfer-encoding', 'chunked') + } + + var header = self.request.getHeader('content-type') + + if (!header || header.indexOf('multipart') === -1) { + self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) + } else { + if (header.indexOf('boundary') !== -1) { + self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1') + } else { + self.request.setHeader('content-type', header + '; boundary=' + self.boundary) + } + } +} + +Multipart.prototype.build = function (parts, chunked) { + var self = this + var body = chunked ? new CombinedStream() : [] + + function add (part) { + if (typeof part === 'number') { + part = part.toString() + } + return chunked ? body.append(part) : body.push(Buffer.from(part)) + } + + if (self.request.preambleCRLF) { + add('\r\n') + } + + parts.forEach(function (part) { + var preamble = '--' + self.boundary + '\r\n' + Object.keys(part).forEach(function (key) { + if (key === 'body') { return } + preamble += key + ': ' + part[key] + '\r\n' + }) + preamble += '\r\n' + add(preamble) + add(part.body) + add('\r\n') + }) + add('--' + self.boundary + '--') + + if (self.request.postambleCRLF) { + add('\r\n') + } + + return body +} + +Multipart.prototype.onRequest = function (options) { + var self = this + + var chunked = self.isChunked(options) + var parts = options.data || options + + self.setHeaders(chunked) + self.chunked = chunked + self.body = self.build(parts, chunked) +} + +exports.Multipart = Multipart diff --git a/node_modules/request/lib/oauth.js b/node_modules/request/lib/oauth.js new file mode 100644 index 0000000..96de72b --- /dev/null +++ b/node_modules/request/lib/oauth.js @@ -0,0 +1,148 @@ +'use strict' + +var url = require('url') +var qs = require('qs') +var caseless = require('caseless') +var uuid = require('uuid/v4') +var oauth = require('oauth-sign') +var crypto = require('crypto') +var Buffer = require('safe-buffer').Buffer + +function OAuth (request) { + this.request = request + this.params = null +} + +OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) { + var oa = {} + for (var i in _oauth) { + oa['oauth_' + i] = _oauth[i] + } + if (!oa.oauth_version) { + oa.oauth_version = '1.0' + } + if (!oa.oauth_timestamp) { + oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString() + } + if (!oa.oauth_nonce) { + oa.oauth_nonce = uuid().replace(/-/g, '') + } + if (!oa.oauth_signature_method) { + oa.oauth_signature_method = 'HMAC-SHA1' + } + + var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase + delete oa.oauth_consumer_secret + delete oa.oauth_private_key + + var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase + delete oa.oauth_token_secret + + var realm = oa.oauth_realm + delete oa.oauth_realm + delete oa.oauth_transport_method + + var baseurl = uri.protocol + '//' + uri.host + uri.pathname + var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&')) + + oa.oauth_signature = oauth.sign( + oa.oauth_signature_method, + method, + baseurl, + params, + consumer_secret_or_private_key, // eslint-disable-line camelcase + token_secret // eslint-disable-line camelcase + ) + + if (realm) { + oa.realm = realm + } + + return oa +} + +OAuth.prototype.buildBodyHash = function (_oauth, body) { + if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) { + this.request.emit('error', new Error('oauth: ' + _oauth.signature_method + + ' signature_method not supported with body_hash signing.')) + } + + var shasum = crypto.createHash('sha1') + shasum.update(body || '') + var sha1 = shasum.digest('hex') + + return Buffer.from(sha1, 'hex').toString('base64') +} + +OAuth.prototype.concatParams = function (oa, sep, wrap) { + wrap = wrap || '' + + var params = Object.keys(oa).filter(function (i) { + return i !== 'realm' && i !== 'oauth_signature' + }).sort() + + if (oa.realm) { + params.splice(0, 0, 'realm') + } + params.push('oauth_signature') + + return params.map(function (i) { + return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap + }).join(sep) +} + +OAuth.prototype.onRequest = function (_oauth) { + var self = this + self.params = _oauth + + var uri = self.request.uri || {} + var method = self.request.method || '' + var headers = caseless(self.request.headers) + var body = self.request.body || '' + var qsLib = self.request.qsLib || qs + + var form + var query + var contentType = headers.get('content-type') || '' + var formContentType = 'application/x-www-form-urlencoded' + var transport = _oauth.transport_method || 'header' + + if (contentType.slice(0, formContentType.length) === formContentType) { + contentType = formContentType + form = body + } + if (uri.query) { + query = uri.query + } + if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) { + self.request.emit('error', new Error('oauth: transport_method of body requires POST ' + + 'and content-type ' + formContentType)) + } + + if (!form && typeof _oauth.body_hash === 'boolean') { + _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString()) + } + + var oa = self.buildParams(_oauth, uri, method, query, form, qsLib) + + switch (transport) { + case 'header': + self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"')) + break + + case 'query': + var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&') + self.request.uri = url.parse(href) + self.request.path = self.request.uri.path + break + + case 'body': + self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&') + break + + default: + self.request.emit('error', new Error('oauth: transport_method invalid')) + } +} + +exports.OAuth = OAuth diff --git a/node_modules/request/lib/querystring.js b/node_modules/request/lib/querystring.js new file mode 100644 index 0000000..4a32cd1 --- /dev/null +++ b/node_modules/request/lib/querystring.js @@ -0,0 +1,50 @@ +'use strict' + +var qs = require('qs') +var querystring = require('querystring') + +function Querystring (request) { + this.request = request + this.lib = null + this.useQuerystring = null + this.parseOptions = null + this.stringifyOptions = null +} + +Querystring.prototype.init = function (options) { + if (this.lib) { return } + + this.useQuerystring = options.useQuerystring + this.lib = (this.useQuerystring ? querystring : qs) + + this.parseOptions = options.qsParseOptions || {} + this.stringifyOptions = options.qsStringifyOptions || {} +} + +Querystring.prototype.stringify = function (obj) { + return (this.useQuerystring) + ? this.rfc3986(this.lib.stringify(obj, + this.stringifyOptions.sep || null, + this.stringifyOptions.eq || null, + this.stringifyOptions)) + : this.lib.stringify(obj, this.stringifyOptions) +} + +Querystring.prototype.parse = function (str) { + return (this.useQuerystring) + ? this.lib.parse(str, + this.parseOptions.sep || null, + this.parseOptions.eq || null, + this.parseOptions) + : this.lib.parse(str, this.parseOptions) +} + +Querystring.prototype.rfc3986 = function (str) { + return str.replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +Querystring.prototype.unescape = querystring.unescape + +exports.Querystring = Querystring diff --git a/node_modules/request/lib/redirect.js b/node_modules/request/lib/redirect.js new file mode 100644 index 0000000..b9150e7 --- /dev/null +++ b/node_modules/request/lib/redirect.js @@ -0,0 +1,154 @@ +'use strict' + +var url = require('url') +var isUrl = /^https?:/ + +function Redirect (request) { + this.request = request + this.followRedirect = true + this.followRedirects = true + this.followAllRedirects = false + this.followOriginalHttpMethod = false + this.allowRedirect = function () { return true } + this.maxRedirects = 10 + this.redirects = [] + this.redirectsFollowed = 0 + this.removeRefererHeader = false +} + +Redirect.prototype.onRequest = function (options) { + var self = this + + if (options.maxRedirects !== undefined) { + self.maxRedirects = options.maxRedirects + } + if (typeof options.followRedirect === 'function') { + self.allowRedirect = options.followRedirect + } + if (options.followRedirect !== undefined) { + self.followRedirects = !!options.followRedirect + } + if (options.followAllRedirects !== undefined) { + self.followAllRedirects = options.followAllRedirects + } + if (self.followRedirects || self.followAllRedirects) { + self.redirects = self.redirects || [] + } + if (options.removeRefererHeader !== undefined) { + self.removeRefererHeader = options.removeRefererHeader + } + if (options.followOriginalHttpMethod !== undefined) { + self.followOriginalHttpMethod = options.followOriginalHttpMethod + } +} + +Redirect.prototype.redirectTo = function (response) { + var self = this + var request = self.request + + var redirectTo = null + if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) { + var location = response.caseless.get('location') + request.debug('redirect', location) + + if (self.followAllRedirects) { + redirectTo = location + } else if (self.followRedirects) { + switch (request.method) { + case 'PATCH': + case 'PUT': + case 'POST': + case 'DELETE': + // Do not follow redirects + break + default: + redirectTo = location + break + } + } + } else if (response.statusCode === 401) { + var authHeader = request._auth.onResponse(response) + if (authHeader) { + request.setHeader('authorization', authHeader) + redirectTo = request.uri + } + } + return redirectTo +} + +Redirect.prototype.onResponse = function (response) { + var self = this + var request = self.request + + var redirectTo = self.redirectTo(response) + if (!redirectTo || !self.allowRedirect.call(request, response)) { + return false + } + + request.debug('redirect to', redirectTo) + + // ignore any potential response body. it cannot possibly be useful + // to us at this point. + // response.resume should be defined, but check anyway before calling. Workaround for browserify. + if (response.resume) { + response.resume() + } + + if (self.redirectsFollowed >= self.maxRedirects) { + request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href)) + return false + } + self.redirectsFollowed += 1 + + if (!isUrl.test(redirectTo)) { + redirectTo = url.resolve(request.uri.href, redirectTo) + } + + var uriPrev = request.uri + request.uri = url.parse(redirectTo) + + // handle the case where we change protocol from https to http or vice versa + if (request.uri.protocol !== uriPrev.protocol) { + delete request.agent + } + + self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo }) + + if (self.followAllRedirects && request.method !== 'HEAD' && + response.statusCode !== 401 && response.statusCode !== 307) { + request.method = self.followOriginalHttpMethod ? request.method : 'GET' + } + // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215 + delete request.src + delete request.req + delete request._started + if (response.statusCode !== 401 && response.statusCode !== 307) { + // Remove parameters from the previous response, unless this is the second request + // for a server that requires digest authentication. + delete request.body + delete request._form + if (request.headers) { + request.removeHeader('host') + request.removeHeader('content-type') + request.removeHeader('content-length') + if (request.uri.hostname !== request.originalHost.split(':')[0]) { + // Remove authorization if changing hostnames (but not if just + // changing ports or protocols). This matches the behavior of curl: + // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710 + request.removeHeader('authorization') + } + } + } + + if (!self.removeRefererHeader) { + request.setHeader('referer', uriPrev.href) + } + + request.emit('redirect') + + request.init() + + return true +} + +exports.Redirect = Redirect diff --git a/node_modules/request/lib/tunnel.js b/node_modules/request/lib/tunnel.js new file mode 100644 index 0000000..4479003 --- /dev/null +++ b/node_modules/request/lib/tunnel.js @@ -0,0 +1,175 @@ +'use strict' + +var url = require('url') +var tunnel = require('tunnel-agent') + +var defaultProxyHeaderWhiteList = [ + 'accept', + 'accept-charset', + 'accept-encoding', + 'accept-language', + 'accept-ranges', + 'cache-control', + 'content-encoding', + 'content-language', + 'content-location', + 'content-md5', + 'content-range', + 'content-type', + 'connection', + 'date', + 'expect', + 'max-forwards', + 'pragma', + 'referer', + 'te', + 'user-agent', + 'via' +] + +var defaultProxyHeaderExclusiveList = [ + 'proxy-authorization' +] + +function constructProxyHost (uriObject) { + var port = uriObject.port + var protocol = uriObject.protocol + var proxyHost = uriObject.hostname + ':' + + if (port) { + proxyHost += port + } else if (protocol === 'https:') { + proxyHost += '443' + } else { + proxyHost += '80' + } + + return proxyHost +} + +function constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) { + var whiteList = proxyHeaderWhiteList + .reduce(function (set, header) { + set[header.toLowerCase()] = true + return set + }, {}) + + return Object.keys(headers) + .filter(function (header) { + return whiteList[header.toLowerCase()] + }) + .reduce(function (set, header) { + set[header] = headers[header] + return set + }, {}) +} + +function constructTunnelOptions (request, proxyHeaders) { + var proxy = request.proxy + + var tunnelOptions = { + proxy: { + host: proxy.hostname, + port: +proxy.port, + proxyAuth: proxy.auth, + headers: proxyHeaders + }, + headers: request.headers, + ca: request.ca, + cert: request.cert, + key: request.key, + passphrase: request.passphrase, + pfx: request.pfx, + ciphers: request.ciphers, + rejectUnauthorized: request.rejectUnauthorized, + secureOptions: request.secureOptions, + secureProtocol: request.secureProtocol + } + + return tunnelOptions +} + +function constructTunnelFnName (uri, proxy) { + var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http') + var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http') + return [uriProtocol, proxyProtocol].join('Over') +} + +function getTunnelFn (request) { + var uri = request.uri + var proxy = request.proxy + var tunnelFnName = constructTunnelFnName(uri, proxy) + return tunnel[tunnelFnName] +} + +function Tunnel (request) { + this.request = request + this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList + this.proxyHeaderExclusiveList = [] + if (typeof request.tunnel !== 'undefined') { + this.tunnelOverride = request.tunnel + } +} + +Tunnel.prototype.isEnabled = function () { + var self = this + var request = self.request + // Tunnel HTTPS by default. Allow the user to override this setting. + + // If self.tunnelOverride is set (the user specified a value), use it. + if (typeof self.tunnelOverride !== 'undefined') { + return self.tunnelOverride + } + + // If the destination is HTTPS, tunnel. + if (request.uri.protocol === 'https:') { + return true + } + + // Otherwise, do not use tunnel. + return false +} + +Tunnel.prototype.setup = function (options) { + var self = this + var request = self.request + + options = options || {} + + if (typeof request.proxy === 'string') { + request.proxy = url.parse(request.proxy) + } + + if (!request.proxy || !request.tunnel) { + return false + } + + // Setup Proxy Header Exclusive List and White List + if (options.proxyHeaderWhiteList) { + self.proxyHeaderWhiteList = options.proxyHeaderWhiteList + } + if (options.proxyHeaderExclusiveList) { + self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList + } + + var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList) + var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList) + + // Setup Proxy Headers and Proxy Headers Host + // Only send the Proxy White Listed Header names + var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList) + proxyHeaders.host = constructProxyHost(request.uri) + + proxyHeaderExclusiveList.forEach(request.removeHeader, request) + + // Set Agent from Tunnel Data + var tunnelFn = getTunnelFn(request) + var tunnelOptions = constructTunnelOptions(request, proxyHeaders) + request.agent = tunnelFn(tunnelOptions) + + return true +} + +Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList +Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList +exports.Tunnel = Tunnel diff --git a/node_modules/request/node_modules/qs/.editorconfig b/node_modules/request/node_modules/qs/.editorconfig new file mode 100644 index 0000000..b2654e7 --- /dev/null +++ b/node_modules/request/node_modules/qs/.editorconfig @@ -0,0 +1,30 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 140 + +[test/*] +max_line_length = off + +[*.md] +max_line_length = off + +[*.json] +max_line_length = off + +[Makefile] +max_line_length = off + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[LICENSE] +indent_size = 2 +max_line_length = off diff --git a/node_modules/request/node_modules/qs/.eslintignore b/node_modules/request/node_modules/qs/.eslintignore new file mode 100644 index 0000000..1521c8b --- /dev/null +++ b/node_modules/request/node_modules/qs/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/node_modules/request/node_modules/qs/.eslintrc b/node_modules/request/node_modules/qs/.eslintrc new file mode 100644 index 0000000..b7a87b9 --- /dev/null +++ b/node_modules/request/node_modules/qs/.eslintrc @@ -0,0 +1,19 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-params": [2, 12], + "max-statements": [2, 45], + "no-continue": 1, + "no-magic-numbers": 0, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + "operator-linebreak": [2, "before"], + } +} diff --git a/node_modules/request/node_modules/qs/CHANGELOG.md b/node_modules/request/node_modules/qs/CHANGELOG.md new file mode 100644 index 0000000..fe52320 --- /dev/null +++ b/node_modules/request/node_modules/qs/CHANGELOG.md @@ -0,0 +1,226 @@ +## **6.5.2** +- [Fix] use `safer-buffer` instead of `Buffer` constructor +- [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230) +- [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify` + +## **6.5.1** +- [Fix] Fix parsing & compacting very deep objects (#224) +- [Refactor] name utils functions +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` +- [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node +- [Tests] Use precise dist for Node.js 0.6 runtime (#225) +- [Tests] make 0.6 required, now that it’s passing +- [Tests] on `node` `v8.2`; fix npm on node 0.6 + +## **6.5.0** +- [New] add `utils.assign` +- [New] pass default encoder/decoder to custom encoder/decoder functions (#206) +- [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213) +- [Fix] Handle stringifying empty objects with addQueryPrefix (#217) +- [Fix] do not mutate `options` argument (#207) +- [Refactor] `parse`: cache index to reuse in else statement (#182) +- [Docs] add various badges to readme (#208) +- [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape` +- [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4 +- [Tests] add `editorconfig-tools` + +## **6.4.0** +- [New] `qs.stringify`: add `encodeValuesOnly` option +- [Fix] follow `allowPrototypes` option during merge (#201, #201) +- [Fix] support keys starting with brackets (#202, #200) +- [Fix] chmod a-x +- [Dev Deps] update `eslint` +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds +- [eslint] reduce warnings + +## **6.3.2** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Dev Deps] update `eslint` +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.3.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape` +- [Tests] on all node minors; improve test matrix +- [Docs] document stringify option `allowDots` (#195) +- [Docs] add empty object and array values example (#195) +- [Docs] Fix minor inconsistency/typo (#192) +- [Docs] document stringify option `sort` (#191) +- [Refactor] `stringify`: throw faster with an invalid encoder +- [Refactor] remove unnecessary escapes (#184) +- Remove contributing.md, since `qs` is no longer part of `hapi` (#183) + +## **6.3.0** +- [New] Add support for RFC 1738 (#174, #173) +- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) +- [Fix] ensure `utils.merge` handles merging two arrays +- [Refactor] only constructors should be capitalized +- [Refactor] capitalized var names are for constructors only +- [Refactor] avoid using a sparse array +- [Robustness] `formats`: cache `String#replace` +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` +- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix +- [Tests] flesh out arrayLimit/arrayFormat tests (#107) +- [Tests] skip Object.create tests when null objects are not available +- [Tests] Turn on eslint for test files (#175) + +## **6.2.3** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.2.2** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## **6.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values +- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` +- [Tests] remove `parallelshell` since it does not reliably report failures +- [Tests] up to `node` `v6.3`, `v5.12` +- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` + +## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) +- [New] pass Buffers to the encoder/decoder directly (#161) +- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) +- [Fix] fix compacting of nested sparse arrays (#150) + +## **6.1.2 +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.1.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) +- [New] allowDots option for `stringify` (#151) +- [Fix] "sort" option should work at a depth of 3 or more (#151) +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## **6.0.4** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.0.3** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) +- Revert ES6 requirement and restore support for node down to v0.8. + +## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) +- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json + +## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) +- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 + +## **5.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values + +## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) +- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string + +## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) +- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional +- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify + +## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) +- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false +- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm + +## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) +- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional + +## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) +- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" + +## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) +- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties +- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost +- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing +- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object +- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option +- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. +- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 +- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 +- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign +- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute + +## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) +- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object # is not a function + +## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) +- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option + +## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) +- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 +- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader + +## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) +- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object + +## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) +- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". + +## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) +- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 + +## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) +- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? +- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 +- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 + +## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) +- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number + +## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) +- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array +- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x + +## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) +- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value +- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty +- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? + +## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) +- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 +- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects + +## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) +- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present +- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays +- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge +- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? + +## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) +- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter + +## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) +- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? +- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit +- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 + +## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) +- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values + +## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) +- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters +- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block + +## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) +- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument +- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed + +## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) +- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted +- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null +- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README + +## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) +- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/node_modules/request/node_modules/qs/LICENSE b/node_modules/request/node_modules/qs/LICENSE new file mode 100644 index 0000000..d456948 --- /dev/null +++ b/node_modules/request/node_modules/qs/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014 Nathan LaFreniere and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not 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 HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/node_modules/request/node_modules/qs/README.md b/node_modules/request/node_modules/qs/README.md new file mode 100644 index 0000000..d811966 --- /dev/null +++ b/node_modules/request/node_modules/qs/README.md @@ -0,0 +1,475 @@ +# qs [![Version Badge][2]][1] + +[![Build Status][3]][4] +[![dependency status][5]][6] +[![dev dependency status][7]][8] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][11]][1] + +A querystring parsing and stringifying library with some added security. + +Lead Maintainer: [Jordan Harband](https://github.com/ljharb) + +The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). + +## Usage + +```javascript +var qs = require('qs'); +var assert = require('assert'); + +var obj = qs.parse('a=c'); +assert.deepEqual(obj, { a: 'c' }); + +var str = qs.stringify(obj); +assert.equal(str, 'a=c'); +``` + +### Parsing Objects + +[](#preventEval) +```javascript +qs.parse(string, [options]); +``` + +**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. +For example, the string `'foo[bar]=baz'` converts to: + +```javascript +assert.deepEqual(qs.parse('foo[bar]=baz'), { + foo: { + bar: 'baz' + } +}); +``` + +When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: + +```javascript +var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); +assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); +``` + +By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. + +```javascript +var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); +assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); +``` + +URI encoded strings work too: + +```javascript +assert.deepEqual(qs.parse('a%5Bb%5D=c'), { + a: { b: 'c' } +}); +``` + +You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: + +```javascript +assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { + foo: { + bar: { + baz: 'foobarbaz' + } + } +}); +``` + +By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like +`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: + +```javascript +var expected = { + a: { + b: { + c: { + d: { + e: { + f: { + '[g][h][i]': 'j' + } + } + } + } + } + } +}; +var string = 'a[b][c][d][e][f][g][h][i]=j'; +assert.deepEqual(qs.parse(string), expected); +``` + +This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: + +```javascript +var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); +assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); +``` + +The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. + +For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: + +```javascript +var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); +assert.deepEqual(limited, { a: 'b' }); +``` + +To bypass the leading question mark, use `ignoreQueryPrefix`: + +```javascript +var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true }); +assert.deepEqual(prefixed, { a: 'b', c: 'd' }); +``` + +An optional delimiter can also be passed: + +```javascript +var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); +assert.deepEqual(delimited, { a: 'b', c: 'd' }); +``` + +Delimiters can be a regular expression too: + +```javascript +var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); +assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); +``` + +Option `allowDots` can be used to enable dot notation: + +```javascript +var withDots = qs.parse('a.b=c', { allowDots: true }); +assert.deepEqual(withDots, { a: { b: 'c' } }); +``` + +### Parsing Arrays + +**qs** can also parse arrays using a similar `[]` notation: + +```javascript +var withArray = qs.parse('a[]=b&a[]=c'); +assert.deepEqual(withArray, { a: ['b', 'c'] }); +``` + +You may specify an index as well: + +```javascript +var withIndexes = qs.parse('a[1]=c&a[0]=b'); +assert.deepEqual(withIndexes, { a: ['b', 'c'] }); +``` + +Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number +to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving +their order: + +```javascript +var noSparse = qs.parse('a[1]=b&a[15]=c'); +assert.deepEqual(noSparse, { a: ['b', 'c'] }); +``` + +Note that an empty string is also a value, and will be preserved: + +```javascript +var withEmptyString = qs.parse('a[]=&a[]=b'); +assert.deepEqual(withEmptyString, { a: ['', 'b'] }); + +var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); +assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); +``` + +**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will +instead be converted to an object with the index as the key: + +```javascript +var withMaxIndex = qs.parse('a[100]=b'); +assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); +``` + +This limit can be overridden by passing an `arrayLimit` option: + +```javascript +var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); +assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); +``` + +To disable array parsing entirely, set `parseArrays` to `false`. + +```javascript +var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); +assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); +``` + +If you mix notations, **qs** will merge the two items into an object: + +```javascript +var mixedNotation = qs.parse('a[0]=b&a[b]=c'); +assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); +``` + +You can also create arrays of objects: + +```javascript +var arraysOfObjects = qs.parse('a[][b]=c'); +assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); +``` + +### Stringifying + +[](#preventEval) +```javascript +qs.stringify(object, [options]); +``` + +When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: + +```javascript +assert.equal(qs.stringify({ a: 'b' }), 'a=b'); +assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); +``` + +This encoding can be disabled by setting the `encode` option to `false`: + +```javascript +var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); +assert.equal(unencoded, 'a[b]=c'); +``` + +Encoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`: +```javascript +var encodedValues = qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } +); +assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'); +``` + +This encoding can also be replaced by a custom encoding method set as `encoder` option: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { + // Passed in values `a`, `b`, `c` + return // Return encoded string +}}) +``` + +_(Note: the `encoder` option does not apply if `encode` is `false`)_ + +Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str) { + // Passed in values `x`, `z` + return // Return decoded string +}}) +``` + +Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. + +When arrays are stringified, by default they are given explicit indices: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }); +// 'a[0]=b&a[1]=c&a[2]=d' +``` + +You may override this by setting the `indices` option to `false`: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); +// 'a=b&a=c&a=d' +``` + +You may use the `arrayFormat` option to specify the format of the output array: + +```javascript +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) +// 'a[0]=b&a[1]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) +// 'a[]=b&a[]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) +// 'a=b&a=c' +``` + +When objects are stringified, by default they use bracket notation: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }); +// 'a[b][c]=d&a[b][e]=f' +``` + +You may override this to use dot notation by setting the `allowDots` option to `true`: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true }); +// 'a.b.c=d&a.b.e=f' +``` + +Empty strings and null values will omit the value, but the equals sign (=) remains in place: + +```javascript +assert.equal(qs.stringify({ a: '' }), 'a='); +``` + +Key with no values (such as an empty object or array) will return nothing: + +```javascript +assert.equal(qs.stringify({ a: [] }), ''); +assert.equal(qs.stringify({ a: {} }), ''); +assert.equal(qs.stringify({ a: [{}] }), ''); +assert.equal(qs.stringify({ a: { b: []} }), ''); +assert.equal(qs.stringify({ a: { b: {}} }), ''); +``` + +Properties that are set to `undefined` will be omitted entirely: + +```javascript +assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); +``` + +The query string may optionally be prepended with a question mark: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d'); +``` + +The delimiter may be overridden with stringify as well: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); +``` + +If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: + +```javascript +var date = new Date(7); +assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); +assert.equal( + qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), + 'a=7' +); +``` + +You may use the `sort` option to affect the order of parameter keys: + +```javascript +function alphabeticalSort(a, b) { + return a.localeCompare(b); +} +assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y'); +``` + +Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. +If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you +pass an array, it will be used to select properties and array indices for stringification: + +```javascript +function filterFunc(prefix, value) { + if (prefix == 'b') { + // Return an `undefined` value to omit a property. + return; + } + if (prefix == 'e[f]') { + return value.getTime(); + } + if (prefix == 'e[g][0]') { + return value * 2; + } + return value; +} +qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); +// 'a=b&c=d&e[f]=123&e[g][0]=4' +qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); +// 'a=b&e=f' +qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); +// 'a[0]=b&a[2]=d' +``` + +### Handling of `null` values + +By default, `null` values are treated like empty strings: + +```javascript +var withNull = qs.stringify({ a: null, b: '' }); +assert.equal(withNull, 'a=&b='); +``` + +Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. + +```javascript +var equalsInsensitive = qs.parse('a&b='); +assert.deepEqual(equalsInsensitive, { a: '', b: '' }); +``` + +To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` +values have no `=` sign: + +```javascript +var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); +assert.equal(strictNull, 'a&b='); +``` + +To parse values without `=` back to `null` use the `strictNullHandling` flag: + +```javascript +var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); +assert.deepEqual(parsedStrictNull, { a: null, b: '' }); +``` + +To completely skip rendering keys with `null` values, use the `skipNulls` flag: + +```javascript +var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); +assert.equal(nullsSkipped, 'a=b'); +``` + +### Dealing with special character sets + +By default the encoding and decoding of characters is done in `utf-8`. If you +wish to encode querystrings to a different character set (i.e. +[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the +[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: + +```javascript +var encoder = require('qs-iconv/encoder')('shift_jis'); +var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder }); +assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); +``` + +This also works for decoding of query strings: + +```javascript +var decoder = require('qs-iconv/decoder')('shift_jis'); +var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); +assert.deepEqual(obj, { a: 'こんにちは!' }); +``` + +### RFC 3986 and RFC 1738 space encoding + +RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. +In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. + +``` +assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); +``` + +[1]: https://npmjs.org/package/qs +[2]: http://versionbadg.es/ljharb/qs.svg +[3]: https://api.travis-ci.org/ljharb/qs.svg +[4]: https://travis-ci.org/ljharb/qs +[5]: https://david-dm.org/ljharb/qs.svg +[6]: https://david-dm.org/ljharb/qs +[7]: https://david-dm.org/ljharb/qs/dev-status.svg +[8]: https://david-dm.org/ljharb/qs?type=dev +[9]: https://ci.testling.com/ljharb/qs.png +[10]: https://ci.testling.com/ljharb/qs +[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: http://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/qs.svg +[downloads-url]: http://npm-stat.com/charts.html?package=qs diff --git a/node_modules/request/node_modules/qs/dist/qs.js b/node_modules/request/node_modules/qs/dist/qs.js new file mode 100644 index 0000000..ecf7ba4 --- /dev/null +++ b/node_modules/request/node_modules/qs/dist/qs.js @@ -0,0 +1,638 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]') { + obj = []; + obj = obj.concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys + // that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +module.exports = function (str, opts) { + var options = opts ? utils.assign({}, opts) : {}; + + if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; + options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; + options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; + options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; + options.parseArrays = options.parseArrays !== false; + options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; + options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; + options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; + options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; + options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; + options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; + +},{"./utils":5}],4:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (Array.isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (Array.isArray(obj)) { + values = values.concat(stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + values = values.concat(stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + } + + return values; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = opts ? utils.assign({}, opts) : {}; + + if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; + var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; + var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; + var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; + var sort = typeof options.sort === 'function' ? options.sort : null; + var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; + var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; + var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; + if (typeof options.format === 'undefined') { + options.format = formats['default']; + } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { + throw new TypeError('Unknown format option provided.'); + } + var formatter = formats.formatters[options.format]; + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (Array.isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (options.arrayFormat in arrayPrefixGenerators) { + arrayFormat = options.arrayFormat; + } else if ('indices' in options) { + arrayFormat = options.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (sort) { + objKeys.sort(sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + keys = keys.concat(stringify( + obj[key], + key, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encode ? encoder : null, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + + var joined = keys.join(delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + return joined.length > 0 ? prefix + joined : ''; +}; + +},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ +'use strict'; + +var has = Object.prototype.hasOwnProperty; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + var obj; + + while (queue.length) { + var item = queue.pop(); + obj = item.obj[item.prop]; + + if (Array.isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } + + return obj; +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (Array.isArray(target)) { + target.push(source); + } else if (typeof target === 'object') { + if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (Array.isArray(target) && !Array.isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (Array.isArray(target) && Array.isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + if (target[i] && typeof target[i] === 'object') { + target[i] = merge(target[i], item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str) { + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + +var encode = function encode(str) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + return compactQueue(queue); +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; + +},{}]},{},[2])(2) +}); diff --git a/node_modules/request/node_modules/qs/lib/formats.js b/node_modules/request/node_modules/qs/lib/formats.js new file mode 100644 index 0000000..df45997 --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/formats.js @@ -0,0 +1,18 @@ +'use strict'; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +module.exports = { + 'default': 'RFC3986', + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return value; + } + }, + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; diff --git a/node_modules/request/node_modules/qs/lib/index.js b/node_modules/request/node_modules/qs/lib/index.js new file mode 100644 index 0000000..0d6a97d --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var stringify = require('./stringify'); +var parse = require('./parse'); +var formats = require('./formats'); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; diff --git a/node_modules/request/node_modules/qs/lib/parse.js b/node_modules/request/node_modules/qs/lib/parse.js new file mode 100644 index 0000000..8c9872e --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/parse.js @@ -0,0 +1,174 @@ +'use strict'; + +var utils = require('./utils'); + +var has = Object.prototype.hasOwnProperty; + +var defaults = { + allowDots: false, + allowPrototypes: false, + arrayLimit: 20, + decoder: utils.decode, + delimiter: '&', + depth: 5, + parameterLimit: 1000, + plainObjects: false, + strictNullHandling: false +}; + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + + for (var i = 0; i < parts.length; ++i) { + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder); + val = options.decoder(part.slice(pos + 1), defaults.decoder); + } + if (has.call(obj, key)) { + obj[key] = [].concat(obj[key]).concat(val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]') { + obj = []; + obj = obj.concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys + // that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +module.exports = function (str, opts) { + var options = opts ? utils.assign({}, opts) : {}; + + if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; + options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; + options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; + options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; + options.parseArrays = options.parseArrays !== false; + options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; + options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; + options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; + options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; + options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; + options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; diff --git a/node_modules/request/node_modules/qs/lib/stringify.js b/node_modules/request/node_modules/qs/lib/stringify.js new file mode 100644 index 0000000..ab915ac --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/stringify.js @@ -0,0 +1,210 @@ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (Array.isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (Array.isArray(obj)) { + values = values.concat(stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + values = values.concat(stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + } + + return values; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = opts ? utils.assign({}, opts) : {}; + + if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; + var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; + var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; + var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; + var sort = typeof options.sort === 'function' ? options.sort : null; + var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; + var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; + var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; + if (typeof options.format === 'undefined') { + options.format = formats['default']; + } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { + throw new TypeError('Unknown format option provided.'); + } + var formatter = formats.formatters[options.format]; + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (Array.isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (options.arrayFormat in arrayPrefixGenerators) { + arrayFormat = options.arrayFormat; + } else if ('indices' in options) { + arrayFormat = options.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (sort) { + objKeys.sort(sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + keys = keys.concat(stringify( + obj[key], + key, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encode ? encoder : null, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + + var joined = keys.join(delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + return joined.length > 0 ? prefix + joined : ''; +}; diff --git a/node_modules/request/node_modules/qs/lib/utils.js b/node_modules/request/node_modules/qs/lib/utils.js new file mode 100644 index 0000000..8775a32 --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/utils.js @@ -0,0 +1,213 @@ +'use strict'; + +var has = Object.prototype.hasOwnProperty; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + var obj; + + while (queue.length) { + var item = queue.pop(); + obj = item.obj[item.prop]; + + if (Array.isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } + + return obj; +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (Array.isArray(target)) { + target.push(source); + } else if (typeof target === 'object') { + if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (Array.isArray(target) && !Array.isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (Array.isArray(target) && Array.isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + if (target[i] && typeof target[i] === 'object') { + target[i] = merge(target[i], item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str) { + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + +var encode = function encode(str) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + return compactQueue(queue); +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; diff --git a/node_modules/request/node_modules/qs/package.json b/node_modules/request/node_modules/qs/package.json new file mode 100644 index 0000000..4a4cada --- /dev/null +++ b/node_modules/request/node_modules/qs/package.json @@ -0,0 +1,83 @@ +{ + "_args": [ + [ + "qs@6.5.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "qs@6.5.2", + "_id": "qs@6.5.2", + "_inBundle": false, + "_integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "_location": "/request/qs", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "qs@6.5.2", + "name": "qs", + "escapedName": "qs", + "rawSpec": "6.5.2", + "saveSpec": null, + "fetchSpec": "6.5.2" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "_spec": "6.5.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/ljharb/qs/issues" + }, + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + } + ], + "dependencies": {}, + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "devDependencies": { + "@ljharb/eslint-config": "^12.2.1", + "browserify": "^16.2.0", + "covert": "^1.1.0", + "editorconfig-tools": "^0.1.1", + "eslint": "^4.19.1", + "evalmd": "^0.0.17", + "iconv-lite": "^0.4.21", + "mkdirp": "^0.5.1", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^1.1.1", + "safer-buffer": "^2.1.2", + "tape": "^4.9.0" + }, + "engines": { + "node": ">=0.6" + }, + "homepage": "https://github.com/ljharb/qs", + "keywords": [ + "querystring", + "qs" + ], + "license": "BSD-3-Clause", + "main": "lib/index.js", + "name": "qs", + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/qs.git" + }, + "scripts": { + "coverage": "covert test", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js", + "lint": "eslint lib/*.js test/*.js", + "prelint": "editorconfig-tools check * lib/* test/*", + "prepublish": "safe-publish-latest && npm run dist", + "pretest": "npm run --silent readme && npm run --silent lint", + "readme": "evalmd README.md", + "test": "npm run --silent coverage", + "tests-only": "node test" + }, + "version": "6.5.2" +} diff --git a/node_modules/request/node_modules/qs/test/.eslintrc b/node_modules/request/node_modules/qs/test/.eslintrc new file mode 100644 index 0000000..20175d6 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/.eslintrc @@ -0,0 +1,15 @@ +{ + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "consistent-return": 2, + "max-lines": 0, + "max-nested-callbacks": [2, 3], + "max-statements": 0, + "no-buffer-constructor": 0, + "no-extend-native": 0, + "no-magic-numbers": 0, + "object-curly-newline": 0, + "sort-keys": 0 + } +} diff --git a/node_modules/request/node_modules/qs/test/index.js b/node_modules/request/node_modules/qs/test/index.js new file mode 100644 index 0000000..5e6bc8f --- /dev/null +++ b/node_modules/request/node_modules/qs/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('./parse'); + +require('./stringify'); + +require('./utils'); diff --git a/node_modules/request/node_modules/qs/test/parse.js b/node_modules/request/node_modules/qs/test/parse.js new file mode 100644 index 0000000..0f8fe45 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/parse.js @@ -0,0 +1,574 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('parse()', function (t) { + t.test('parses a simple string', function (st) { + st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); + st.deepEqual(qs.parse('foo=c++'), { foo: 'c ' }); + st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); + st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); + st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); + st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); + st.deepEqual(qs.parse('foo'), { foo: '' }); + st.deepEqual(qs.parse('foo='), { foo: '' }); + st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); + st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); + st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); + st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); + st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); + st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); + st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); + st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { + cht: 'p3', + chd: 't:60,40', + chs: '250x100', + chl: 'Hello|World' + }); + st.end(); + }); + + t.test('allows enabling dot notation', function (st) { + st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); + st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); + t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); + t.deepEqual( + qs.parse('a[b][c][d][e][f][g][h]=i'), + { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, + 'defaults to a depth of 5' + ); + + t.test('only parses one level when depth = 1', function (st) { + st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); + st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); + st.end(); + }); + + t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); + + t.test('parses an explicit array', function (st) { + st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); + st.end(); + }); + + t.test('parses a mix of simple and explicit arrays', function (st) { + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + + st.end(); + }); + + t.test('parses a nested array', function (st) { + st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); + st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); + st.end(); + }); + + t.test('allows to specify array indices', function (st) { + st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); + st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); + st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); + st.end(); + }); + + t.test('limits specific array indices to arrayLimit', function (st) { + st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); + st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); + + t.test('supports encoded = signs', function (st) { + st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); + st.end(); + }); + + t.test('is ok with url encoded strings', function (st) { + st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); + st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); + st.end(); + }); + + t.test('allows brackets in the value', function (st) { + st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); + st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); + st.end(); + }); + + t.test('allows empty values', function (st) { + st.deepEqual(qs.parse(''), {}); + st.deepEqual(qs.parse(null), {}); + st.deepEqual(qs.parse(undefined), {}); + st.end(); + }); + + t.test('transforms arrays to objects', function (st) { + st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } }); + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); + st.end(); + }); + + t.test('transforms arrays to objects (dot notation)', function (st) { + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); + st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); + st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + st.end(); + }); + + t.test('correctly prunes undefined values when converting an array to an object', function (st) { + st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); + st.end(); + }); + + t.test('supports malformed uri characters', function (st) { + st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); + st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); + st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); + st.end(); + }); + + t.test('doesn\'t produce empty keys', function (st) { + st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); + st.end(); + }); + + t.test('cannot access Object prototype', function (st) { + qs.parse('constructor[prototype][bad]=bad'); + qs.parse('bad[constructor][prototype][bad]=bad'); + st.equal(typeof Object.prototype.bad, 'undefined'); + st.end(); + }); + + t.test('parses arrays of objects', function (st) { + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); + st.end(); + }); + + t.test('allows for empty strings in arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); + + st.deepEqual( + qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 20 + array indices: null then empty string works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 0 + array brackets: null then empty string works' + ); + + st.deepEqual( + qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 20 + array indices: empty string then null works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 0 + array brackets: empty string then null works' + ); + + st.deepEqual( + qs.parse('a[]=&a[]=b&a[]=c'), + { a: ['', 'b', 'c'] }, + 'array brackets: empty strings work' + ); + st.end(); + }); + + t.test('compacts sparse arrays', function (st) { + st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); + st.end(); + }); + + t.test('parses semi-parsed strings', function (st) { + st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); + st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); + st.end(); + }); + + t.test('parses buffers correctly', function (st) { + var b = SaferBuffer.from('test'); + st.deepEqual(qs.parse({ a: b }), { a: b }); + st.end(); + }); + + t.test('continues parsing when no parent is found', function (st) { + st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); + st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); + st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); + st.end(); + }); + + t.test('does not error when parsing a very long array', function (st) { + var str = 'a[]=a'; + while (Buffer.byteLength(str) < 128 * 1024) { + str = str + '&' + str; + } + + st.doesNotThrow(function () { + qs.parse(str); + }); + + st.end(); + }); + + t.test('should not throw when a native prototype has an enumerable property', { parallel: false }, function (st) { + Object.prototype.crash = ''; + Array.prototype.crash = ''; + st.doesNotThrow(qs.parse.bind(null, 'a=b')); + st.deepEqual(qs.parse('a=b'), { a: 'b' }); + st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + delete Object.prototype.crash; + delete Array.prototype.crash; + st.end(); + }); + + t.test('parses a string with an alternative string delimiter', function (st) { + st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('parses a string with an alternative RegExp delimiter', function (st) { + st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not use non-splittable objects as delimiters', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding parameter limit', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); + st.end(); + }); + + t.test('allows setting the parameter limit to Infinity', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding array limit', function (st) { + st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); + st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows disabling array parsing', function (st) { + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { parseArrays: false }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows for query string prefix', function (st) { + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' }); + st.end(); + }); + + t.test('parses an object', function (st) { + var input = { + 'user[name]': { 'pop[bob]': 3 }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object in dot notation', function (st) { + var input = { + 'user.name': { 'pop[bob]': 3 }, + 'user.email.': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input, { allowDots: true }); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object and not child values', function (st) { + var input = { + 'user[name]': { 'pop[bob]': { test: 3 } }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': { test: 3 } }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('does not blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.parse('a=b&c=d'); + global.Buffer = tempBuffer; + st.deepEqual(result, { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + var parsed; + + st.doesNotThrow(function () { + parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + st.equal('bar' in parsed.foo, true); + st.equal('baz' in parsed.foo, true); + st.equal(parsed.foo.bar, 'baz'); + st.deepEqual(parsed.foo.baz, a); + st.end(); + }); + + t.test('does not crash when parsing deep objects', function (st) { + var parsed; + var str = 'foo'; + + for (var i = 0; i < 5000; i++) { + str += '[p]'; + } + + str += '=bar'; + + st.doesNotThrow(function () { + parsed = qs.parse(str, { depth: 5000 }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + + var depth = 0; + var ref = parsed.foo; + while ((ref = ref.p)) { + depth += 1; + } + + st.equal(depth, 5000, 'parsed is 5000 properties deep'); + + st.end(); + }); + + t.test('parses null objects correctly', { skip: !Object.create }, function (st) { + var a = Object.create(null); + a.b = 'c'; + + st.deepEqual(qs.parse(a), { b: 'c' }); + var result = qs.parse({ a: a }); + st.equal('a' in result, true, 'result has "a" property'); + st.deepEqual(result.a, a); + st.end(); + }); + + t.test('parses dates correctly', function (st) { + var now = new Date(); + st.deepEqual(qs.parse({ a: now }), { a: now }); + st.end(); + }); + + t.test('parses regular expressions correctly', function (st) { + var re = /^test$/; + st.deepEqual(qs.parse({ a: re }), { a: re }); + st.end(); + }); + + t.test('does not allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {}); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {}); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: false }), + {}, + 'bare "toString" results in {}' + ); + + st.end(); + }); + + t.test('can allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: true }), + { toString: '' }, + 'bare "toString" results in { toString: "" }' + ); + + st.end(); + }); + + t.test('params starting with a closing bracket', function (st) { + st.deepEqual(qs.parse(']=toString'), { ']': 'toString' }); + st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' }); + st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' }); + st.end(); + }); + + t.test('params starting with a starting bracket', function (st) { + st.deepEqual(qs.parse('[=toString'), { '[': 'toString' }); + st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' }); + st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' }); + st.end(); + }); + + t.test('add keys to objects', function (st) { + st.deepEqual( + qs.parse('a[b]=c&a=d'), + { a: { b: 'c', d: true } }, + 'can add keys to objects' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString'), + { a: { b: 'c' } }, + 'can not overwrite prototype' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { allowPrototypes: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with allowPrototypes true' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { plainObjects: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('can return null objects', { skip: !Object.create }, function (st) { + var expected = Object.create(null); + expected.a = Object.create(null); + expected.a.b = 'c'; + expected.a.hasOwnProperty = 'd'; + st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); + st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); + var expectedArray = Object.create(null); + expectedArray.a = Object.create(null); + expectedArray.a[0] = 'b'; + expectedArray.a.c = 'd'; + st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); + st.end(); + }); + + t.test('can parse with custom encoding', function (st) { + st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { + decoder: function (str) { + var reg = /%([0-9A-F]{2})/ig; + var result = []; + var parts = reg.exec(str); + while (parts) { + result.push(parseInt(parts[1], 16)); + parts = reg.exec(str); + } + return iconv.decode(SaferBuffer.from(result), 'shift_jis').toString(); + } + }), { 県: '大阪府' }); + st.end(); + }); + + t.test('receives the default decoder as a second argument', function (st) { + st.plan(1); + qs.parse('a', { + decoder: function (str, defaultDecoder) { + st.equal(defaultDecoder, utils.decode); + } + }); + st.end(); + }); + + t.test('throws error with wrong decoder', function (st) { + st['throws'](function () { + qs.parse({}, { decoder: 'string' }); + }, new TypeError('Decoder has to be a function.')); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.parse('a[b]=true', options); + st.deepEqual(options, {}); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/request/node_modules/qs/test/stringify.js b/node_modules/request/node_modules/qs/test/stringify.js new file mode 100644 index 0000000..165ac62 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/stringify.js @@ -0,0 +1,597 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('stringify()', function (t) { + t.test('stringifies a querystring object', function (st) { + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: 1 }), 'a=1'); + st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); + st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); + st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); + st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); + st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90'); + st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7'); + st.end(); + }); + + t.test('adds query prefix', function (st) { + st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b'); + st.end(); + }); + + t.test('with query prefix, outputs blank string given an empty object', function (st) { + st.equal(qs.stringify({}, { addQueryPrefix: true }), ''); + st.end(); + }); + + t.test('stringifies a nested object', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies a nested object with dots notation', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); + st.end(); + }); + + t.test('stringifies an array value', function (st) { + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), + 'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'default => indices' + ); + st.end(); + }); + + t.test('omits nulls when asked', function (st) { + st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); + st.end(); + }); + + t.test('omits nested nulls when asked', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('omits array indices when asked', function (st) { + st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); + st.end(); + }); + + t.test('stringifies a nested array value', function (st) { + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.end(); + }); + + t.test('stringifies a nested array value with dots notation', function (st) { + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a.b[0]=c&a.b[1]=d', + 'indices: stringifies with dots + indices' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a.b[]=c&a.b[]=d', + 'brackets: stringifies with dots + brackets' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false } + ), + 'a.b[0]=c&a.b[1]=d', + 'default: stringifies with dots + indices' + ); + st.end(); + }); + + t.test('stringifies an object inside an array', function (st) { + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D=c', + 'indices => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }), + 'a%5B0%5D%5Bb%5D=c', + 'default => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'indices => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', + 'brackets => brackets' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an array with mixed objects and primitives', function (st) { + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), + 'a[][b]=1&a[]=2&a[]=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an object inside an array with dots notation', function (st) { + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b=c', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false } + ), + 'a[0].b=c', + 'default => indices' + ); + + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b.c[0]=1', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b.c[]=1', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false } + ), + 'a[0].b.c[0]=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('does not omit object keys when indices = false', function (st) { + st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when indices=true', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); + st.end(); + }); + + t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); + st.end(); + }); + + t.test('stringifies a complicated object', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies an empty value', function (st) { + st.equal(qs.stringify({ a: '' }), 'a='); + st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); + + st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); + st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); + + st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); + + st.end(); + }); + + t.test('stringifies a null object', { skip: !Object.create }, function (st) { + var obj = Object.create(null); + obj.a = 'b'; + st.equal(qs.stringify(obj), 'a=b'); + st.end(); + }); + + t.test('returns an empty string for invalid input', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(''), ''); + st.end(); + }); + + t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { + var obj = { a: Object.create(null) }; + + obj.a.b = 'c'; + st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('drops keys with a value of undefined', function (st) { + st.equal(qs.stringify({ a: undefined }), ''); + + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); + st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); + st.end(); + }); + + t.test('url encodes values', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('stringifies a date', function (st) { + var now = new Date(); + var str = 'a=' + encodeURIComponent(now.toISOString()); + st.equal(qs.stringify({ a: now }), str); + st.end(); + }); + + t.test('stringifies the weird object from qs', function (st) { + st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); + st.end(); + }); + + t.test('skips properties that are part of the object prototype', function (st) { + Object.prototype.crash = 'test'; + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + delete Object.prototype.crash; + st.end(); + }); + + t.test('stringifies boolean values', function (st) { + st.equal(qs.stringify({ a: true }), 'a=true'); + st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); + st.equal(qs.stringify({ b: false }), 'b=false'); + st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies buffer values', function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test'); + st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test'); + st.end(); + }); + + t.test('stringifies an object using an alternative delimiter', function (st) { + st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); + st.end(); + }); + + t.test('doesn\'t blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.stringify({ a: 'b', c: 'd' }); + global.Buffer = tempBuffer; + st.equal(result, 'a=b&c=d'); + st.end(); + }); + + t.test('selects properties when filter=array', function (st) { + st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); + st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); + + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } + ), + 'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2] } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('supports custom representations when filter=function', function (st) { + var calls = 0; + var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; + var filterFunc = function (prefix, value) { + calls += 1; + if (calls === 1) { + st.equal(prefix, '', 'prefix is empty'); + st.equal(value, obj); + } else if (prefix === 'c') { + return void 0; + } else if (value instanceof Date) { + st.equal(prefix, 'e[f]'); + return value.getTime(); + } + return value; + }; + + st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); + st.equal(calls, 5); + st.end(); + }); + + t.test('can disable uri encoding', function (st) { + st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); + st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); + st.end(); + }); + + t.test('can sort the keys', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); + st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); + st.end(); + }); + + t.test('can sort the keys at depth 3 or more too', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: sort, encode: false } + ), + 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' + ); + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: null, encode: false } + ), + 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' + ); + st.end(); + }); + + t.test('can stringify with custom encoding', function (st) { + st.equal(qs.stringify({ 県: '大阪府', '': '' }, { + encoder: function (str) { + if (str.length === 0) { + return ''; + } + var buf = iconv.encode(str, 'shiftjis'); + var result = []; + for (var i = 0; i < buf.length; ++i) { + result.push(buf.readUInt8(i).toString(16)); + } + return '%' + result.join('%'); + } + }), '%8c%a7=%91%e5%8d%e3%95%7b&='); + st.end(); + }); + + t.test('receives the default encoder as a second argument', function (st) { + st.plan(2); + qs.stringify({ a: 1 }, { + encoder: function (str, defaultEncoder) { + st.equal(defaultEncoder, utils.encode); + } + }); + st.end(); + }); + + t.test('throws error with wrong encoder', function (st) { + st['throws'](function () { + qs.stringify({}, { encoder: 'string' }); + }, new TypeError('Encoder has to be a function.')); + st.end(); + }); + + t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, { + encoder: function (buffer) { + if (typeof buffer === 'string') { + return buffer; + } + return String.fromCharCode(buffer.readUInt8(0) + 97); + } + }), 'a=b'); + st.end(); + }); + + t.test('serializeDate option', function (st) { + var date = new Date(); + st.equal( + qs.stringify({ a: date }), + 'a=' + date.toISOString().replace(/:/g, '%3A'), + 'default is toISOString' + ); + + var mutatedDate = new Date(); + mutatedDate.toISOString = function () { + throw new SyntaxError(); + }; + st['throws'](function () { + mutatedDate.toISOString(); + }, SyntaxError); + st.equal( + qs.stringify({ a: mutatedDate }), + 'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), + 'toISOString works even when method is not locally present' + ); + + var specificDate = new Date(6); + st.equal( + qs.stringify( + { a: specificDate }, + { serializeDate: function (d) { return d.getTime() * 7; } } + ), + 'a=42', + 'custom serializeDate function called' + ); + + st.end(); + }); + + t.test('RFC 1738 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); + st.end(); + }); + + t.test('RFC 3986 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('Edge cases and unknown formats', function (st) { + ['UFO1234', false, 1234, null, {}, []].forEach( + function (format) { + st['throws']( + function () { + qs.stringify({ a: 'b c' }, { format: format }); + }, + new TypeError('Unknown format option provided.') + ); + } + ); + st.end(); + }); + + t.test('encodeValuesOnly', function (st) { + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } + ), + 'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h' + ); + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] } + ), + 'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h' + ); + st.end(); + }); + + t.test('encodeValuesOnly - strictNullHandling', function (st) { + st.equal( + qs.stringify( + { a: { b: null } }, + { encodeValuesOnly: true, strictNullHandling: true } + ), + 'a[b]' + ); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.stringify({}, options); + st.deepEqual(options, {}); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/request/node_modules/qs/test/utils.js b/node_modules/request/node_modules/qs/test/utils.js new file mode 100644 index 0000000..eff4011 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/utils.js @@ -0,0 +1,34 @@ +'use strict'; + +var test = require('tape'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); + + var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); + t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); + + var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); + t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); + + var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); + t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); + + var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); + t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); + + t.end(); +}); + +test('assign()', function (t) { + var target = { a: 1, b: 2 }; + var source = { b: 3, c: 4 }; + var result = utils.assign(target, source); + + t.equal(result, target, 'returns the target'); + t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged'); + t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched'); + + t.end(); +}); diff --git a/node_modules/request/package.json b/node_modules/request/package.json new file mode 100644 index 0000000..124ec1f --- /dev/null +++ b/node_modules/request/package.json @@ -0,0 +1,118 @@ +{ + "_args": [ + [ + "request@2.88.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "request@2.88.0", + "_id": "request@2.88.0", + "_inBundle": false, + "_integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "_location": "/request", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "request@2.88.0", + "name": "request", + "escapedName": "request", + "rawSpec": "2.88.0", + "saveSpec": null, + "fetchSpec": "2.88.0" + }, + "_requiredBy": [ + "/sqlite3" + ], + "_resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "_spec": "2.88.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com" + }, + "bugs": { + "url": "http://github.com/request/request/issues" + }, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "description": "Simplified HTTP request client.", + "devDependencies": { + "bluebird": "^3.2.1", + "browserify": "^13.0.1", + "browserify-istanbul": "^2.0.0", + "buffer-equal": "^1.0.0", + "codecov": "^3.0.4", + "coveralls": "^3.0.2", + "function-bind": "^1.0.2", + "istanbul": "^0.4.0", + "karma": "^3.0.0", + "karma-browserify": "^5.0.1", + "karma-cli": "^1.0.0", + "karma-coverage": "^1.0.0", + "karma-phantomjs-launcher": "^1.0.0", + "karma-tap": "^3.0.1", + "phantomjs-prebuilt": "^2.1.3", + "rimraf": "^2.2.8", + "server-destroy": "^1.0.1", + "standard": "^9.0.0", + "tape": "^4.6.0", + "taper": "^0.5.0" + }, + "engines": { + "node": ">= 4" + }, + "files": [ + "lib/", + "index.js", + "request.js" + ], + "greenkeeper": { + "ignore": [ + "hawk", + "har-validator" + ] + }, + "homepage": "https://github.com/request/request#readme", + "keywords": [ + "http", + "simple", + "util", + "utility" + ], + "license": "Apache-2.0", + "main": "index.js", + "name": "request", + "repository": { + "type": "git", + "url": "git+https://github.com/request/request.git" + }, + "scripts": { + "lint": "standard", + "test": "npm run lint && npm run test-ci && npm run test-browser", + "test-browser": "node tests/browser/start.js", + "test-ci": "taper tests/test-*.js", + "test-cov": "istanbul cover tape tests/test-*.js" + }, + "version": "2.88.0" +} diff --git a/node_modules/request/request.js b/node_modules/request/request.js new file mode 100644 index 0000000..90bed4f --- /dev/null +++ b/node_modules/request/request.js @@ -0,0 +1,1551 @@ +'use strict' + +var http = require('http') +var https = require('https') +var url = require('url') +var util = require('util') +var stream = require('stream') +var zlib = require('zlib') +var aws2 = require('aws-sign2') +var aws4 = require('aws4') +var httpSignature = require('http-signature') +var mime = require('mime-types') +var caseless = require('caseless') +var ForeverAgent = require('forever-agent') +var FormData = require('form-data') +var extend = require('extend') +var isstream = require('isstream') +var isTypedArray = require('is-typedarray').strict +var helpers = require('./lib/helpers') +var cookies = require('./lib/cookies') +var getProxyFromURI = require('./lib/getProxyFromURI') +var Querystring = require('./lib/querystring').Querystring +var Har = require('./lib/har').Har +var Auth = require('./lib/auth').Auth +var OAuth = require('./lib/oauth').OAuth +var hawk = require('./lib/hawk') +var Multipart = require('./lib/multipart').Multipart +var Redirect = require('./lib/redirect').Redirect +var Tunnel = require('./lib/tunnel').Tunnel +var now = require('performance-now') +var Buffer = require('safe-buffer').Buffer + +var safeStringify = helpers.safeStringify +var isReadStream = helpers.isReadStream +var toBase64 = helpers.toBase64 +var defer = helpers.defer +var copy = helpers.copy +var version = helpers.version +var globalCookieJar = cookies.jar() + +var globalPool = {} + +function filterForNonReserved (reserved, options) { + // Filter out properties that are not reserved. + // Reserved values are passed in at call site. + + var object = {} + for (var i in options) { + var notReserved = (reserved.indexOf(i) === -1) + if (notReserved) { + object[i] = options[i] + } + } + return object +} + +function filterOutReservedFunctions (reserved, options) { + // Filter out properties that are functions and are reserved. + // Reserved values are passed in at call site. + + var object = {} + for (var i in options) { + var isReserved = !(reserved.indexOf(i) === -1) + var isFunction = (typeof options[i] === 'function') + if (!(isReserved && isFunction)) { + object[i] = options[i] + } + } + return object +} + +// Return a simpler request object to allow serialization +function requestToJSON () { + var self = this + return { + uri: self.uri, + method: self.method, + headers: self.headers + } +} + +// Return a simpler response object to allow serialization +function responseToJSON () { + var self = this + return { + statusCode: self.statusCode, + body: self.body, + headers: self.headers, + request: requestToJSON.call(self.request) + } +} + +function Request (options) { + // if given the method property in options, set property explicitMethod to true + + // extend the Request instance with any non-reserved properties + // remove any reserved functions from the options object + // set Request instance to be readable and writable + // call init + + var self = this + + // start with HAR, then override with additional options + if (options.har) { + self._har = new Har(self) + options = self._har.options(options) + } + + stream.Stream.call(self) + var reserved = Object.keys(Request.prototype) + var nonReserved = filterForNonReserved(reserved, options) + + extend(self, nonReserved) + options = filterOutReservedFunctions(reserved, options) + + self.readable = true + self.writable = true + if (options.method) { + self.explicitMethod = true + } + self._qs = new Querystring(self) + self._auth = new Auth(self) + self._oauth = new OAuth(self) + self._multipart = new Multipart(self) + self._redirect = new Redirect(self) + self._tunnel = new Tunnel(self) + self.init(options) +} + +util.inherits(Request, stream.Stream) + +// Debugging +Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) +function debug () { + if (Request.debug) { + console.error('REQUEST %s', util.format.apply(util, arguments)) + } +} +Request.prototype.debug = debug + +Request.prototype.init = function (options) { + // init() contains all the code to setup the request object. + // the actual outgoing request is not started until start() is called + // this function is called from both the constructor and on redirect. + var self = this + if (!options) { + options = {} + } + self.headers = self.headers ? copy(self.headers) : {} + + // Delete headers with value undefined since they break + // ClientRequest.OutgoingMessage.setHeader in node 0.12 + for (var headerName in self.headers) { + if (typeof self.headers[headerName] === 'undefined') { + delete self.headers[headerName] + } + } + + caseless.httpify(self, self.headers) + + if (!self.method) { + self.method = options.method || 'GET' + } + if (!self.localAddress) { + self.localAddress = options.localAddress + } + + self._qs.init(options) + + debug(options) + if (!self.pool && self.pool !== false) { + self.pool = globalPool + } + self.dests = self.dests || [] + self.__isRequestRequest = true + + // Protect against double callback + if (!self._callback && self.callback) { + self._callback = self.callback + self.callback = function () { + if (self._callbackCalled) { + return // Print a warning maybe? + } + self._callbackCalled = true + self._callback.apply(self, arguments) + } + self.on('error', self.callback.bind()) + self.on('complete', self.callback.bind(self, null)) + } + + // People use this property instead all the time, so support it + if (!self.uri && self.url) { + self.uri = self.url + delete self.url + } + + // If there's a baseUrl, then use it as the base URL (i.e. uri must be + // specified as a relative path and is appended to baseUrl). + if (self.baseUrl) { + if (typeof self.baseUrl !== 'string') { + return self.emit('error', new Error('options.baseUrl must be a string')) + } + + if (typeof self.uri !== 'string') { + return self.emit('error', new Error('options.uri must be a string when using options.baseUrl')) + } + + if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) { + return self.emit('error', new Error('options.uri must be a path when using options.baseUrl')) + } + + // Handle all cases to make sure that there's only one slash between + // baseUrl and uri. + var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1 + var uriStartsWithSlash = self.uri.indexOf('/') === 0 + + if (baseUrlEndsWithSlash && uriStartsWithSlash) { + self.uri = self.baseUrl + self.uri.slice(1) + } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { + self.uri = self.baseUrl + self.uri + } else if (self.uri === '') { + self.uri = self.baseUrl + } else { + self.uri = self.baseUrl + '/' + self.uri + } + delete self.baseUrl + } + + // A URI is needed by this point, emit error if we haven't been able to get one + if (!self.uri) { + return self.emit('error', new Error('options.uri is a required argument')) + } + + // If a string URI/URL was given, parse it into a URL object + if (typeof self.uri === 'string') { + self.uri = url.parse(self.uri) + } + + // Some URL objects are not from a URL parsed string and need href added + if (!self.uri.href) { + self.uri.href = url.format(self.uri) + } + + // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme + if (self.uri.protocol === 'unix:') { + return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`')) + } + + // Support Unix Sockets + if (self.uri.host === 'unix') { + self.enableUnixSocket() + } + + if (self.strictSSL === false) { + self.rejectUnauthorized = false + } + + if (!self.uri.pathname) { self.uri.pathname = '/' } + + if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) { + // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar + // Detect and reject it as soon as possible + var faultyUri = url.format(self.uri) + var message = 'Invalid URI "' + faultyUri + '"' + if (Object.keys(options).length === 0) { + // No option ? This can be the sign of a redirect + // As this is a case where the user cannot do anything (they didn't call request directly with this URL) + // they should be warned that it can be caused by a redirection (can save some hair) + message += '. This can be caused by a crappy redirection.' + } + // This error was fatal + self.abort() + return self.emit('error', new Error(message)) + } + + if (!self.hasOwnProperty('proxy')) { + self.proxy = getProxyFromURI(self.uri) + } + + self.tunnel = self._tunnel.isEnabled() + if (self.proxy) { + self._tunnel.setup(options) + } + + self._redirect.onRequest(options) + + self.setHost = false + if (!self.hasHeader('host')) { + var hostHeaderName = self.originalHostHeaderName || 'host' + self.setHeader(hostHeaderName, self.uri.host) + // Drop :port suffix from Host header if known protocol. + if (self.uri.port) { + if ((self.uri.port === '80' && self.uri.protocol === 'http:') || + (self.uri.port === '443' && self.uri.protocol === 'https:')) { + self.setHeader(hostHeaderName, self.uri.hostname) + } + } + self.setHost = true + } + + self.jar(self._jar || options.jar) + + if (!self.uri.port) { + if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 } + } + + if (self.proxy && !self.tunnel) { + self.port = self.proxy.port + self.host = self.proxy.hostname + } else { + self.port = self.uri.port + self.host = self.uri.hostname + } + + if (options.form) { + self.form(options.form) + } + + if (options.formData) { + var formData = options.formData + var requestForm = self.form() + var appendFormValue = function (key, value) { + if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) { + requestForm.append(key, value.value, value.options) + } else { + requestForm.append(key, value) + } + } + for (var formKey in formData) { + if (formData.hasOwnProperty(formKey)) { + var formValue = formData[formKey] + if (formValue instanceof Array) { + for (var j = 0; j < formValue.length; j++) { + appendFormValue(formKey, formValue[j]) + } + } else { + appendFormValue(formKey, formValue) + } + } + } + } + + if (options.qs) { + self.qs(options.qs) + } + + if (self.uri.path) { + self.path = self.uri.path + } else { + self.path = self.uri.pathname + (self.uri.search || '') + } + + if (self.path.length === 0) { + self.path = '/' + } + + // Auth must happen last in case signing is dependent on other headers + if (options.aws) { + self.aws(options.aws) + } + + if (options.hawk) { + self.hawk(options.hawk) + } + + if (options.httpSignature) { + self.httpSignature(options.httpSignature) + } + + if (options.auth) { + if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) { + options.auth.user = options.auth.username + } + if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) { + options.auth.pass = options.auth.password + } + + self.auth( + options.auth.user, + options.auth.pass, + options.auth.sendImmediately, + options.auth.bearer + ) + } + + if (self.gzip && !self.hasHeader('accept-encoding')) { + self.setHeader('accept-encoding', 'gzip, deflate') + } + + if (self.uri.auth && !self.hasHeader('authorization')) { + var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) }) + self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) + } + + if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { + var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) }) + var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) + self.setHeader('proxy-authorization', authHeader) + } + + if (self.proxy && !self.tunnel) { + self.path = (self.uri.protocol + '//' + self.uri.host + self.path) + } + + if (options.json) { + self.json(options.json) + } + if (options.multipart) { + self.multipart(options.multipart) + } + + if (options.time) { + self.timing = true + + // NOTE: elapsedTime is deprecated in favor of .timings + self.elapsedTime = self.elapsedTime || 0 + } + + function setContentLength () { + if (isTypedArray(self.body)) { + self.body = Buffer.from(self.body) + } + + if (!self.hasHeader('content-length')) { + var length + if (typeof self.body === 'string') { + length = Buffer.byteLength(self.body) + } else if (Array.isArray(self.body)) { + length = self.body.reduce(function (a, b) { return a + b.length }, 0) + } else { + length = self.body.length + } + + if (length) { + self.setHeader('content-length', length) + } else { + self.emit('error', new Error('Argument error, options.body.')) + } + } + } + if (self.body && !isstream(self.body)) { + setContentLength() + } + + if (options.oauth) { + self.oauth(options.oauth) + } else if (self._oauth.params && self.hasHeader('authorization')) { + self.oauth(self._oauth.params) + } + + var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol + var defaultModules = {'http:': http, 'https:': https} + var httpModules = self.httpModules || {} + + self.httpModule = httpModules[protocol] || defaultModules[protocol] + + if (!self.httpModule) { + return self.emit('error', new Error('Invalid protocol: ' + protocol)) + } + + if (options.ca) { + self.ca = options.ca + } + + if (!self.agent) { + if (options.agentOptions) { + self.agentOptions = options.agentOptions + } + + if (options.agentClass) { + self.agentClass = options.agentClass + } else if (options.forever) { + var v = version() + // use ForeverAgent in node 0.10- only + if (v.major === 0 && v.minor <= 10) { + self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL + } else { + self.agentClass = self.httpModule.Agent + self.agentOptions = self.agentOptions || {} + self.agentOptions.keepAlive = true + } + } else { + self.agentClass = self.httpModule.Agent + } + } + + if (self.pool === false) { + self.agent = false + } else { + self.agent = self.agent || self.getNewAgent() + } + + self.on('pipe', function (src) { + if (self.ntick && self._started) { + self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.')) + } + self.src = src + if (isReadStream(src)) { + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', mime.lookup(src.path)) + } + } else { + if (src.headers) { + for (var i in src.headers) { + if (!self.hasHeader(i)) { + self.setHeader(i, src.headers[i]) + } + } + } + if (self._json && !self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + if (src.method && !self.explicitMethod) { + self.method = src.method + } + } + + // self.on('pipe', function () { + // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.') + // }) + }) + + defer(function () { + if (self._aborted) { + return + } + + var end = function () { + if (self._form) { + if (!self._auth.hasAuth) { + self._form.pipe(self) + } else if (self._auth.hasAuth && self._auth.sentAuth) { + self._form.pipe(self) + } + } + if (self._multipart && self._multipart.chunked) { + self._multipart.body.pipe(self) + } + if (self.body) { + if (isstream(self.body)) { + self.body.pipe(self) + } else { + setContentLength() + if (Array.isArray(self.body)) { + self.body.forEach(function (part) { + self.write(part) + }) + } else { + self.write(self.body) + } + self.end() + } + } else if (self.requestBodyStream) { + console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') + self.requestBodyStream.pipe(self) + } else if (!self.src) { + if (self._auth.hasAuth && !self._auth.sentAuth) { + self.end() + return + } + if (self.method !== 'GET' && typeof self.method !== 'undefined') { + self.setHeader('content-length', 0) + } + self.end() + } + } + + if (self._form && !self.hasHeader('content-length')) { + // Before ending the request, we had to compute the length of the whole form, asyncly + self.setHeader(self._form.getHeaders(), true) + self._form.getLength(function (err, length) { + if (!err && !isNaN(length)) { + self.setHeader('content-length', length) + } + end() + }) + } else { + end() + } + + self.ntick = true + }) +} + +Request.prototype.getNewAgent = function () { + var self = this + var Agent = self.agentClass + var options = {} + if (self.agentOptions) { + for (var i in self.agentOptions) { + options[i] = self.agentOptions[i] + } + } + if (self.ca) { + options.ca = self.ca + } + if (self.ciphers) { + options.ciphers = self.ciphers + } + if (self.secureProtocol) { + options.secureProtocol = self.secureProtocol + } + if (self.secureOptions) { + options.secureOptions = self.secureOptions + } + if (typeof self.rejectUnauthorized !== 'undefined') { + options.rejectUnauthorized = self.rejectUnauthorized + } + + if (self.cert && self.key) { + options.key = self.key + options.cert = self.cert + } + + if (self.pfx) { + options.pfx = self.pfx + } + + if (self.passphrase) { + options.passphrase = self.passphrase + } + + var poolKey = '' + + // different types of agents are in different pools + if (Agent !== self.httpModule.Agent) { + poolKey += Agent.name + } + + // ca option is only relevant if proxy or destination are https + var proxy = self.proxy + if (typeof proxy === 'string') { + proxy = url.parse(proxy) + } + var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' + + if (isHttps) { + if (options.ca) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.ca + } + + if (typeof options.rejectUnauthorized !== 'undefined') { + if (poolKey) { + poolKey += ':' + } + poolKey += options.rejectUnauthorized + } + + if (options.cert) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.cert.toString('ascii') + options.key.toString('ascii') + } + + if (options.pfx) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.pfx.toString('ascii') + } + + if (options.ciphers) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.ciphers + } + + if (options.secureProtocol) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.secureProtocol + } + + if (options.secureOptions) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.secureOptions + } + } + + if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) { + // not doing anything special. Use the globalAgent + return self.httpModule.globalAgent + } + + // we're using a stored agent. Make sure it's protocol-specific + poolKey = self.uri.protocol + poolKey + + // generate a new agent for this setting if none yet exists + if (!self.pool[poolKey]) { + self.pool[poolKey] = new Agent(options) + // properly set maxSockets on new agents + if (self.pool.maxSockets) { + self.pool[poolKey].maxSockets = self.pool.maxSockets + } + } + + return self.pool[poolKey] +} + +Request.prototype.start = function () { + // start() is called once we are ready to send the outgoing HTTP request. + // this is usually called on the first write(), end() or on nextTick() + var self = this + + if (self.timing) { + // All timings will be relative to this request's startTime. In order to do this, + // we need to capture the wall-clock start time (via Date), immediately followed + // by the high-resolution timer (via now()). While these two won't be set + // at the _exact_ same time, they should be close enough to be able to calculate + // high-resolution, monotonically non-decreasing timestamps relative to startTime. + var startTime = new Date().getTime() + var startTimeNow = now() + } + + if (self._aborted) { + return + } + + self._started = true + self.method = self.method || 'GET' + self.href = self.uri.href + + if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { + self.setHeader('content-length', self.src.stat.size) + } + if (self._aws) { + self.aws(self._aws, true) + } + + // We have a method named auth, which is completely different from the http.request + // auth option. If we don't remove it, we're gonna have a bad time. + var reqOptions = copy(self) + delete reqOptions.auth + + debug('make request', self.uri.href) + + // node v6.8.0 now supports a `timeout` value in `http.request()`, but we + // should delete it for now since we handle timeouts manually for better + // consistency with node versions before v6.8.0 + delete reqOptions.timeout + + try { + self.req = self.httpModule.request(reqOptions) + } catch (err) { + self.emit('error', err) + return + } + + if (self.timing) { + self.startTime = startTime + self.startTimeNow = startTimeNow + + // Timing values will all be relative to startTime (by comparing to startTimeNow + // so we have an accurate clock) + self.timings = {} + } + + var timeout + if (self.timeout && !self.timeoutTimer) { + if (self.timeout < 0) { + timeout = 0 + } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) { + timeout = self.timeout + } + } + + self.req.on('response', self.onRequestResponse.bind(self)) + self.req.on('error', self.onRequestError.bind(self)) + self.req.on('drain', function () { + self.emit('drain') + }) + + self.req.on('socket', function (socket) { + // `._connecting` was the old property which was made public in node v6.1.0 + var isConnecting = socket._connecting || socket.connecting + if (self.timing) { + self.timings.socket = now() - self.startTimeNow + + if (isConnecting) { + var onLookupTiming = function () { + self.timings.lookup = now() - self.startTimeNow + } + + var onConnectTiming = function () { + self.timings.connect = now() - self.startTimeNow + } + + socket.once('lookup', onLookupTiming) + socket.once('connect', onConnectTiming) + + // clean up timing event listeners if needed on error + self.req.once('error', function () { + socket.removeListener('lookup', onLookupTiming) + socket.removeListener('connect', onConnectTiming) + }) + } + } + + var setReqTimeout = function () { + // This timeout sets the amount of time to wait *between* bytes sent + // from the server once connected. + // + // In particular, it's useful for erroring if the server fails to send + // data halfway through streaming a response. + self.req.setTimeout(timeout, function () { + if (self.req) { + self.abort() + var e = new Error('ESOCKETTIMEDOUT') + e.code = 'ESOCKETTIMEDOUT' + e.connect = false + self.emit('error', e) + } + }) + } + if (timeout !== undefined) { + // Only start the connection timer if we're actually connecting a new + // socket, otherwise if we're already connected (because this is a + // keep-alive connection) do not bother. This is important since we won't + // get a 'connect' event for an already connected socket. + if (isConnecting) { + var onReqSockConnect = function () { + socket.removeListener('connect', onReqSockConnect) + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + setReqTimeout() + } + + socket.on('connect', onReqSockConnect) + + self.req.on('error', function (err) { // eslint-disable-line handle-callback-err + socket.removeListener('connect', onReqSockConnect) + }) + + // Set a timeout in memory - this block will throw if the server takes more + // than `timeout` to write the HTTP status and headers (corresponding to + // the on('response') event on the client). NB: this measures wall-clock + // time, not the time between bytes sent by the server. + self.timeoutTimer = setTimeout(function () { + socket.removeListener('connect', onReqSockConnect) + self.abort() + var e = new Error('ETIMEDOUT') + e.code = 'ETIMEDOUT' + e.connect = true + self.emit('error', e) + }, timeout) + } else { + // We're already connected + setReqTimeout() + } + } + self.emit('socket', socket) + }) + + self.emit('request', self.req) +} + +Request.prototype.onRequestError = function (error) { + var self = this + if (self._aborted) { + return + } + if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' && + self.agent.addRequestNoreuse) { + self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } + self.start() + self.req.end() + return + } + if (self.timeout && self.timeoutTimer) { + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + } + self.emit('error', error) +} + +Request.prototype.onRequestResponse = function (response) { + var self = this + + if (self.timing) { + self.timings.response = now() - self.startTimeNow + } + + debug('onRequestResponse', self.uri.href, response.statusCode, response.headers) + response.on('end', function () { + if (self.timing) { + self.timings.end = now() - self.startTimeNow + response.timingStart = self.startTime + + // fill in the blanks for any periods that didn't trigger, such as + // no lookup or connect due to keep alive + if (!self.timings.socket) { + self.timings.socket = 0 + } + if (!self.timings.lookup) { + self.timings.lookup = self.timings.socket + } + if (!self.timings.connect) { + self.timings.connect = self.timings.lookup + } + if (!self.timings.response) { + self.timings.response = self.timings.connect + } + + debug('elapsed time', self.timings.end) + + // elapsedTime includes all redirects + self.elapsedTime += Math.round(self.timings.end) + + // NOTE: elapsedTime is deprecated in favor of .timings + response.elapsedTime = self.elapsedTime + + // timings is just for the final fetch + response.timings = self.timings + + // pre-calculate phase timings as well + response.timingPhases = { + wait: self.timings.socket, + dns: self.timings.lookup - self.timings.socket, + tcp: self.timings.connect - self.timings.lookup, + firstByte: self.timings.response - self.timings.connect, + download: self.timings.end - self.timings.response, + total: self.timings.end + } + } + debug('response end', self.uri.href, response.statusCode, response.headers) + }) + + if (self._aborted) { + debug('aborted', self.uri.href) + response.resume() + return + } + + self.response = response + response.request = self + response.toJSON = responseToJSON + + // XXX This is different on 0.10, because SSL is strict by default + if (self.httpModule === https && + self.strictSSL && (!response.hasOwnProperty('socket') || + !response.socket.authorized)) { + debug('strict ssl error', self.uri.href) + var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL' + self.emit('error', new Error('SSL Error: ' + sslErr)) + return + } + + // Save the original host before any redirect (if it changes, we need to + // remove any authorization headers). Also remember the case of the header + // name because lots of broken servers expect Host instead of host and we + // want the caller to be able to specify this. + self.originalHost = self.getHeader('host') + if (!self.originalHostHeaderName) { + self.originalHostHeaderName = self.hasHeader('host') + } + if (self.setHost) { + self.removeHeader('host') + } + if (self.timeout && self.timeoutTimer) { + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + } + + var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar + var addCookie = function (cookie) { + // set the cookie if it's domain in the href's domain. + try { + targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}) + } catch (e) { + self.emit('error', e) + } + } + + response.caseless = caseless(response.headers) + + if (response.caseless.has('set-cookie') && (!self._disableCookies)) { + var headerName = response.caseless.has('set-cookie') + if (Array.isArray(response.headers[headerName])) { + response.headers[headerName].forEach(addCookie) + } else { + addCookie(response.headers[headerName]) + } + } + + if (self._redirect.onResponse(response)) { + return // Ignore the rest of the response + } else { + // Be a good stream and emit end when the response is finished. + // Hack to emit end on close because of a core bug that never fires end + response.on('close', function () { + if (!self._ended) { + self.response.emit('end') + } + }) + + response.once('end', function () { + self._ended = true + }) + + var noBody = function (code) { + return ( + self.method === 'HEAD' || + // Informational + (code >= 100 && code < 200) || + // No Content + code === 204 || + // Not Modified + code === 304 + ) + } + + var responseContent + if (self.gzip && !noBody(response.statusCode)) { + var contentEncoding = response.headers['content-encoding'] || 'identity' + contentEncoding = contentEncoding.trim().toLowerCase() + + // Be more lenient with decoding compressed responses, since (very rarely) + // servers send slightly invalid gzip responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + var zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + } + + if (contentEncoding === 'gzip') { + responseContent = zlib.createGunzip(zlibOptions) + response.pipe(responseContent) + } else if (contentEncoding === 'deflate') { + responseContent = zlib.createInflate(zlibOptions) + response.pipe(responseContent) + } else { + // Since previous versions didn't check for Content-Encoding header, + // ignore any invalid values to preserve backwards-compatibility + if (contentEncoding !== 'identity') { + debug('ignoring unrecognized Content-Encoding ' + contentEncoding) + } + responseContent = response + } + } else { + responseContent = response + } + + if (self.encoding) { + if (self.dests.length !== 0) { + console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.') + } else { + responseContent.setEncoding(self.encoding) + } + } + + if (self._paused) { + responseContent.pause() + } + + self.responseContent = responseContent + + self.emit('response', response) + + self.dests.forEach(function (dest) { + self.pipeDest(dest) + }) + + responseContent.on('data', function (chunk) { + if (self.timing && !self.responseStarted) { + self.responseStartTime = (new Date()).getTime() + + // NOTE: responseStartTime is deprecated in favor of .timings + response.responseStartTime = self.responseStartTime + } + self._destdata = true + self.emit('data', chunk) + }) + responseContent.once('end', function (chunk) { + self.emit('end', chunk) + }) + responseContent.on('error', function (error) { + self.emit('error', error) + }) + responseContent.on('close', function () { self.emit('close') }) + + if (self.callback) { + self.readResponseBody(response) + } else { // if no callback + self.on('end', function () { + if (self._aborted) { + debug('aborted', self.uri.href) + return + } + self.emit('complete', response) + }) + } + } + debug('finish init function', self.uri.href) +} + +Request.prototype.readResponseBody = function (response) { + var self = this + debug("reading response's body") + var buffers = [] + var bufferLength = 0 + var strings = [] + + self.on('data', function (chunk) { + if (!Buffer.isBuffer(chunk)) { + strings.push(chunk) + } else if (chunk.length) { + bufferLength += chunk.length + buffers.push(chunk) + } + }) + self.on('end', function () { + debug('end event', self.uri.href) + if (self._aborted) { + debug('aborted', self.uri.href) + // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request. + // This can lead to leaky behavior if the user retains a reference to the request object. + buffers = [] + bufferLength = 0 + return + } + + if (bufferLength) { + debug('has body', self.uri.href, bufferLength) + response.body = Buffer.concat(buffers, bufferLength) + if (self.encoding !== null) { + response.body = response.body.toString(self.encoding) + } + // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request. + // This can lead to leaky behavior if the user retains a reference to the request object. + buffers = [] + bufferLength = 0 + } else if (strings.length) { + // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. + // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). + if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') { + strings[0] = strings[0].substring(1) + } + response.body = strings.join('') + } + + if (self._json) { + try { + response.body = JSON.parse(response.body, self._jsonReviver) + } catch (e) { + debug('invalid JSON received', self.uri.href) + } + } + debug('emitting complete', self.uri.href) + if (typeof response.body === 'undefined' && !self._json) { + response.body = self.encoding === null ? Buffer.alloc(0) : '' + } + self.emit('complete', response, response.body) + }) +} + +Request.prototype.abort = function () { + var self = this + self._aborted = true + + if (self.req) { + self.req.abort() + } else if (self.response) { + self.response.destroy() + } + + self.emit('abort') +} + +Request.prototype.pipeDest = function (dest) { + var self = this + var response = self.response + // Called after the response is received + if (dest.headers && !dest.headersSent) { + if (response.caseless.has('content-type')) { + var ctname = response.caseless.has('content-type') + if (dest.setHeader) { + dest.setHeader(ctname, response.headers[ctname]) + } else { + dest.headers[ctname] = response.headers[ctname] + } + } + + if (response.caseless.has('content-length')) { + var clname = response.caseless.has('content-length') + if (dest.setHeader) { + dest.setHeader(clname, response.headers[clname]) + } else { + dest.headers[clname] = response.headers[clname] + } + } + } + if (dest.setHeader && !dest.headersSent) { + for (var i in response.headers) { + // If the response content is being decoded, the Content-Encoding header + // of the response doesn't represent the piped content, so don't pass it. + if (!self.gzip || i !== 'content-encoding') { + dest.setHeader(i, response.headers[i]) + } + } + dest.statusCode = response.statusCode + } + if (self.pipefilter) { + self.pipefilter(response, dest) + } +} + +Request.prototype.qs = function (q, clobber) { + var self = this + var base + if (!clobber && self.uri.query) { + base = self._qs.parse(self.uri.query) + } else { + base = {} + } + + for (var i in q) { + base[i] = q[i] + } + + var qs = self._qs.stringify(base) + + if (qs === '') { + return self + } + + self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs) + self.url = self.uri + self.path = self.uri.path + + if (self.uri.host === 'unix') { + self.enableUnixSocket() + } + + return self +} +Request.prototype.form = function (form) { + var self = this + if (form) { + if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { + self.setHeader('content-type', 'application/x-www-form-urlencoded') + } + self.body = (typeof form === 'string') + ? self._qs.rfc3986(form.toString('utf8')) + : self._qs.stringify(form).toString('utf8') + return self + } + // create form-data object + self._form = new FormData() + self._form.on('error', function (err) { + err.message = 'form-data: ' + err.message + self.emit('error', err) + self.abort() + }) + return self._form +} +Request.prototype.multipart = function (multipart) { + var self = this + + self._multipart.onRequest(multipart) + + if (!self._multipart.chunked) { + self.body = self._multipart.body + } + + return self +} +Request.prototype.json = function (val) { + var self = this + + if (!self.hasHeader('accept')) { + self.setHeader('accept', 'application/json') + } + + if (typeof self.jsonReplacer === 'function') { + self._jsonReplacer = self.jsonReplacer + } + + self._json = true + if (typeof val === 'boolean') { + if (self.body !== undefined) { + if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { + self.body = safeStringify(self.body, self._jsonReplacer) + } else { + self.body = self._qs.rfc3986(self.body) + } + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + } + } else { + self.body = safeStringify(val, self._jsonReplacer) + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + } + + if (typeof self.jsonReviver === 'function') { + self._jsonReviver = self.jsonReviver + } + + return self +} +Request.prototype.getHeader = function (name, headers) { + var self = this + var result, re, match + if (!headers) { + headers = self.headers + } + Object.keys(headers).forEach(function (key) { + if (key.length !== name.length) { + return + } + re = new RegExp(name, 'i') + match = key.match(re) + if (match) { + result = headers[key] + } + }) + return result +} +Request.prototype.enableUnixSocket = function () { + // Get the socket & request paths from the URL + var unixParts = this.uri.path.split(':') + var host = unixParts[0] + var path = unixParts[1] + // Apply unix properties to request + this.socketPath = host + this.uri.pathname = path + this.uri.path = path + this.uri.host = host + this.uri.hostname = host + this.uri.isUnix = true +} + +Request.prototype.auth = function (user, pass, sendImmediately, bearer) { + var self = this + + self._auth.onRequest(user, pass, sendImmediately, bearer) + + return self +} +Request.prototype.aws = function (opts, now) { + var self = this + + if (!now) { + self._aws = opts + return self + } + + if (opts.sign_version === 4 || opts.sign_version === '4') { + // use aws4 + var options = { + host: self.uri.host, + path: self.uri.path, + method: self.method, + headers: self.headers, + body: self.body + } + if (opts.service) { + options.service = opts.service + } + var signRes = aws4.sign(options, { + accessKeyId: opts.key, + secretAccessKey: opts.secret, + sessionToken: opts.session + }) + self.setHeader('authorization', signRes.headers.Authorization) + self.setHeader('x-amz-date', signRes.headers['X-Amz-Date']) + if (signRes.headers['X-Amz-Security-Token']) { + self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token']) + } + } else { + // default: use aws-sign2 + var date = new Date() + self.setHeader('date', date.toUTCString()) + var auth = { + key: opts.key, + secret: opts.secret, + verb: self.method.toUpperCase(), + date: date, + contentType: self.getHeader('content-type') || '', + md5: self.getHeader('content-md5') || '', + amazonHeaders: aws2.canonicalizeHeaders(self.headers) + } + var path = self.uri.path + if (opts.bucket && path) { + auth.resource = '/' + opts.bucket + path + } else if (opts.bucket && !path) { + auth.resource = '/' + opts.bucket + } else if (!opts.bucket && path) { + auth.resource = path + } else if (!opts.bucket && !path) { + auth.resource = '/' + } + auth.resource = aws2.canonicalizeResource(auth.resource) + self.setHeader('authorization', aws2.authorization(auth)) + } + + return self +} +Request.prototype.httpSignature = function (opts) { + var self = this + httpSignature.signRequest({ + getHeader: function (header) { + return self.getHeader(header, self.headers) + }, + setHeader: function (header, value) { + self.setHeader(header, value) + }, + method: self.method, + path: self.path + }, opts) + debug('httpSignature authorization', self.getHeader('authorization')) + + return self +} +Request.prototype.hawk = function (opts) { + var self = this + self.setHeader('Authorization', hawk.header(self.uri, self.method, opts)) +} +Request.prototype.oauth = function (_oauth) { + var self = this + + self._oauth.onRequest(_oauth) + + return self +} + +Request.prototype.jar = function (jar) { + var self = this + var cookies + + if (self._redirect.redirectsFollowed === 0) { + self.originalCookieHeader = self.getHeader('cookie') + } + + if (!jar) { + // disable cookies + cookies = false + self._disableCookies = true + } else { + var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar + var urihref = self.uri.href + // fetch cookie in the Specified host + if (targetCookieJar) { + cookies = targetCookieJar.getCookieString(urihref) + } + } + + // if need cookie and cookie is not empty + if (cookies && cookies.length) { + if (self.originalCookieHeader) { + // Don't overwrite existing Cookie header + self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies) + } else { + self.setHeader('cookie', cookies) + } + } + self._jar = jar + return self +} + +// Stream API +Request.prototype.pipe = function (dest, opts) { + var self = this + + if (self.response) { + if (self._destdata) { + self.emit('error', new Error('You cannot pipe after data has been emitted from the response.')) + } else if (self._ended) { + self.emit('error', new Error('You cannot pipe after the response has been ended.')) + } else { + stream.Stream.prototype.pipe.call(self, dest, opts) + self.pipeDest(dest) + return dest + } + } else { + self.dests.push(dest) + stream.Stream.prototype.pipe.call(self, dest, opts) + return dest + } +} +Request.prototype.write = function () { + var self = this + if (self._aborted) { return } + + if (!self._started) { + self.start() + } + if (self.req) { + return self.req.write.apply(self.req, arguments) + } +} +Request.prototype.end = function (chunk) { + var self = this + if (self._aborted) { return } + + if (chunk) { + self.write(chunk) + } + if (!self._started) { + self.start() + } + if (self.req) { + self.req.end() + } +} +Request.prototype.pause = function () { + var self = this + if (!self.responseContent) { + self._paused = true + } else { + self.responseContent.pause.apply(self.responseContent, arguments) + } +} +Request.prototype.resume = function () { + var self = this + if (!self.responseContent) { + self._paused = false + } else { + self.responseContent.resume.apply(self.responseContent, arguments) + } +} +Request.prototype.destroy = function () { + var self = this + if (!self._ended) { + self.end() + } else if (self.response) { + self.response.destroy() + } +} + +Request.defaultProxyHeaderWhiteList = + Tunnel.defaultProxyHeaderWhiteList.slice() + +Request.defaultProxyHeaderExclusiveList = + Tunnel.defaultProxyHeaderExclusiveList.slice() + +// Exports + +Request.prototype.toJSON = requestToJSON +module.exports = Request diff --git a/node_modules/resolve-dir/LICENSE b/node_modules/resolve-dir/LICENSE new file mode 100644 index 0000000..6525171 --- /dev/null +++ b/node_modules/resolve-dir/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert + +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/resolve-dir/README.md b/node_modules/resolve-dir/README.md new file mode 100644 index 0000000..3660757 --- /dev/null +++ b/node_modules/resolve-dir/README.md @@ -0,0 +1,88 @@ +# resolve-dir [![NPM version](https://img.shields.io/npm/v/resolve-dir.svg?style=flat)](https://www.npmjs.com/package/resolve-dir) [![NPM downloads](https://img.shields.io/npm/dm/resolve-dir.svg?style=flat)](https://npmjs.org/package/resolve-dir) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/resolve-dir.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/resolve-dir) + +> Resolve a directory that is either local, global or in the user's home directory. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save resolve-dir +``` + +## Usage + +```js +var resolve = require('resolve-dir'); +``` + +Returns a local directory path unchanged + +```js +resolve('a') +//=> 'a' +``` + +Resolves the path to user home + +```js +resolve('~') +//=> '/Users/jonschlinkert' +resolve('~/foo') +//=> '/Users/jonschlinkert/foo' +``` + +Resolves the path to global npm modules + +```js +resolve('@') +//=> '/usr/local/lib/node_modules' +resolve('@/foo') +//=> '/usr/local/lib/node_modules/foo' +``` + +## About + +### Related projects + +* [expand-tilde](https://www.npmjs.com/package/expand-tilde): Bash-like tilde expansion for node.js. Expands a leading tilde in a file path to the… [more](https://github.com/jonschlinkert/expand-tilde) | [homepage](https://github.com/jonschlinkert/expand-tilde "Bash-like tilde expansion for node.js. Expands a leading tilde in a file path to the user home directory, or `~+` to the cwd.") +* [findup-sync](https://www.npmjs.com/package/findup-sync): Find the first file matching a given pattern in the current directory or the nearest… [more](https://github.com/cowboy/node-findup-sync) | [homepage](https://github.com/cowboy/node-findup-sync "Find the first file matching a given pattern in the current directory or the nearest ancestor directory.") +* [resolve-modules](https://www.npmjs.com/package/resolve-modules): Resolves local and global npm modules that match specified patterns, and returns a configuration object… [more](https://github.com/jonschlinkert/resolve-modules) | [homepage](https://github.com/jonschlinkert/resolve-modules "Resolves local and global npm modules that match specified patterns, and returns a configuration object for each resolved module.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/resolve-dir/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on October 18, 2016._ \ No newline at end of file diff --git a/node_modules/resolve-dir/index.js b/node_modules/resolve-dir/index.js new file mode 100644 index 0000000..3fe5366 --- /dev/null +++ b/node_modules/resolve-dir/index.js @@ -0,0 +1,22 @@ +/*! + * resolve-dir + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var path = require('path'); +var expand = require('expand-tilde'); +var gm = require('global-modules'); + +module.exports = function resolveDir(dir) { + if (dir.charAt(0) === '~') { + dir = expand(dir); + } + if (dir.charAt(0) === '@') { + dir = path.join(gm, dir.slice(1)); + } + return dir; +}; diff --git a/node_modules/resolve-dir/package.json b/node_modules/resolve-dir/package.json new file mode 100644 index 0000000..25e6956 --- /dev/null +++ b/node_modules/resolve-dir/package.json @@ -0,0 +1,108 @@ +{ + "_args": [ + [ + "resolve-dir@1.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "resolve-dir@1.0.1", + "_id": "resolve-dir@1.0.1", + "_inBundle": false, + "_integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "_location": "/resolve-dir", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "resolve-dir@1.0.1", + "name": "resolve-dir", + "escapedName": "resolve-dir", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/findup-sync", + "/global-modules" + ], + "_resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "_spec": "1.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/resolve-dir/issues" + }, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "description": "Resolve a directory that is either local, global or in the user's home directory.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "homedir-polyfill": "^1.0.1", + "mocha": "^3.5.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/resolve-dir", + "keywords": [ + "dir", + "directory", + "expansion", + "file", + "filepath", + "fp", + "global", + "home", + "modules", + "npm", + "path", + "resolve", + "tilde", + "user", + "user-home", + "userhome" + ], + "license": "MIT", + "main": "index.js", + "name": "resolve-dir", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/resolve-dir.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "expand-tilde", + "findup-sync", + "resolve-modules" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.0.1" +} diff --git a/node_modules/resolve-url/.jshintrc b/node_modules/resolve-url/.jshintrc new file mode 100644 index 0000000..aaf3358 --- /dev/null +++ b/node_modules/resolve-url/.jshintrc @@ -0,0 +1,44 @@ +{ + "bitwise": true, + "camelcase": true, + "curly": false, + "eqeqeq": true, + "es3": true, + "forin": true, + "immed": false, + "indent": false, + "latedef": "nofunc", + "newcap": false, + "noarg": true, + "noempty": true, + "nonew": false, + "plusplus": false, + "quotmark": false, + "undef": true, + "unused": "vars", + "strict": false, + "trailing": true, + "maxparams": 5, + "maxdepth": false, + "maxstatements": false, + "maxcomplexity": false, + "maxlen": 100, + + "asi": true, + "expr": true, + "globalstrict": true, + "smarttabs": true, + "sub": true, + + "node": true, + "browser": true, + "globals": { + "describe": false, + "it": false, + "before": false, + "beforeEach": false, + "after": false, + "afterEach": false, + "define": false + } +} diff --git a/node_modules/resolve-url/LICENSE b/node_modules/resolve-url/LICENSE new file mode 100644 index 0000000..0595be3 --- /dev/null +++ b/node_modules/resolve-url/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Simon Lydell + +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/resolve-url/bower.json b/node_modules/resolve-url/bower.json new file mode 100644 index 0000000..31aa6f4 --- /dev/null +++ b/node_modules/resolve-url/bower.json @@ -0,0 +1,15 @@ +{ + "name": "resolve-url", + "version": "0.2.1", + "description": "Like Node.js’ `path.resolve`/`url.resolve` for the browser.", + "authors": ["Simon Lydell"], + "license": "MIT", + "main": "resolve-url.js", + "keywords": [ + "resolve", + "url" + ], + "ignore": [ + ".*" + ] +} diff --git a/node_modules/resolve-url/changelog.md b/node_modules/resolve-url/changelog.md new file mode 100644 index 0000000..2a4a630 --- /dev/null +++ b/node_modules/resolve-url/changelog.md @@ -0,0 +1,15 @@ +### Version 0.2.1 (2014-02-25) ### + +- Fix edge case when (accidentally) supplying only one argument, and that + argument happens to be a falsy value such as `undefined` or `null`. + + +### Version 0.2.0 (2014-02-24) ### + +- Disallow passing 0 arguments. It’s weird and inconsistent between browsers. + (Backwards incompatible change.) + + +### Version 0.1.0 (2014-02-23) ### + +- Initial release. diff --git a/node_modules/resolve-url/component.json b/node_modules/resolve-url/component.json new file mode 100644 index 0000000..f37cf00 --- /dev/null +++ b/node_modules/resolve-url/component.json @@ -0,0 +1,15 @@ +{ + "name": "resolve-url", + "version": "0.2.1", + "license": "MIT", + "description": "Like Node.js’ `path.resolve`/`url.resolve` for the browser.", + "main": "resolve-url.js", + "repo": "lydell/resolve-url", + "keywords": [ + "resolve", + "url" + ], + "scripts": [ + "resolve-url.js" + ] +} diff --git a/node_modules/resolve-url/package.json b/node_modules/resolve-url/package.json new file mode 100644 index 0000000..fecfd0f --- /dev/null +++ b/node_modules/resolve-url/package.json @@ -0,0 +1,71 @@ +{ + "_args": [ + [ + "resolve-url@0.2.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "resolve-url@0.2.1", + "_id": "resolve-url@0.2.1", + "_inBundle": false, + "_integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "_location": "/resolve-url", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "resolve-url@0.2.1", + "name": "resolve-url", + "escapedName": "resolve-url", + "rawSpec": "0.2.1", + "saveSpec": null, + "fetchSpec": "0.2.1" + }, + "_requiredBy": [ + "/source-map-resolve" + ], + "_resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "_spec": "0.2.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Simon Lydell" + }, + "bugs": { + "url": "https://github.com/lydell/resolve-url/issues" + }, + "description": "Like Node.js’ `path.resolve`/`url.resolve` for the browser.", + "devDependencies": { + "jshint": "~2.4.3", + "tape": "~2.5.0", + "testling": "~1.6.0" + }, + "homepage": "https://github.com/lydell/resolve-url#readme", + "keywords": [ + "resolve", + "url" + ], + "license": "MIT", + "main": "resolve-url.js", + "name": "resolve-url", + "repository": { + "type": "git", + "url": "git+https://github.com/lydell/resolve-url.git" + }, + "scripts": { + "test": "jshint resolve-url.js test/ && testling -u" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "chrome/latest", + "firefox/latest", + "opera/12", + "opera/latest", + "safari/5", + "iphone/6", + "android-browser/4" + ] + }, + "version": "0.2.1" +} diff --git a/node_modules/resolve-url/readme.md b/node_modules/resolve-url/readme.md new file mode 100644 index 0000000..edfff73 --- /dev/null +++ b/node_modules/resolve-url/readme.md @@ -0,0 +1,83 @@ +Overview +======== + +[![browser support](https://ci.testling.com/lydell/resolve-url.png)](https://ci.testling.com/lydell/resolve-url) + +Like Node.js’ [`path.resolve`]/[`url.resolve`] for the browser. + +```js +var resolveUrl = require("resolve-url") + +window.location +// https://example.com/articles/resolving-urls/edit + +resolveUrl("remove") +// https://example.com/articles/resolving-urls/remove + +resolveUrl("/static/scripts/app.js") +// https://example.com/static/scripts/app.js + +// Imagine /static/scripts/app.js contains `//# sourceMappingURL=../source-maps/app.js.map` +resolveUrl("/static/scripts/app.js", "../source-maps/app.js.map") +// https://example.com/static/source-maps/app.js.map + +resolveUrl("/static/scripts/app.js", "../source-maps/app.js.map", "../coffee/app.coffee") +// https://example.com/static/coffee/app.coffee + +resolveUrl("//cdn.example.com/jquery.js") +// https://cdn.example.com/jquery.js + +resolveUrl("http://foo.org/") +// http://foo.org/ +``` + + +Installation +============ + +- `npm install resolve-url` +- `bower install resolve-url` +- `component install lydell/resolve-url` + +Works with CommonJS, AMD and browser globals, through UMD. + + +Usage +===== + +### `resolveUrl(...urls)` ### + +Pass one or more urls. Resolves the last one to an absolute url, using the +previous ones and `window.location`. + +It’s like starting out on `window.location`, and then clicking links with the +urls as `href` attributes in order, from left to right. + +Unlike Node.js’ [`path.resolve`], this function always goes through all of the +arguments, from left to right. `path.resolve` goes from right to left and only +in the worst case goes through them all. Should that matter. + +Actually, the function is _really_ like clicking a lot of links in series: An +actual `` gets its `href` attribute set for each url! This means that the +url resolution of the browser is used, which makes this module really +light-weight. + +Also note that this functions deals with urls, not paths, so in that respect it +has more in common with Node.js’ [`url.resolve`]. But the arguments are more +like [`path.resolve`]. + +[`path.resolve`]: http://nodejs.org/api/path.html#path_path_resolve_from_to +[`url.resolve`]: http://nodejs.org/api/url.html#url_url_resolve_from_to + + +Tests +===== + +Run `npm test`, which lints the code and then gives you a link to open in a +browser of choice (using `testling`). + + +License +======= + +[The X11 (“MIT”) License](LICENSE). diff --git a/node_modules/resolve-url/resolve-url.js b/node_modules/resolve-url/resolve-url.js new file mode 100644 index 0000000..19e8d04 --- /dev/null +++ b/node_modules/resolve-url/resolve-url.js @@ -0,0 +1,47 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +void (function(root, factory) { + if (typeof define === "function" && define.amd) { + define(factory) + } else if (typeof exports === "object") { + module.exports = factory() + } else { + root.resolveUrl = factory() + } +}(this, function() { + + function resolveUrl(/* ...urls */) { + var numUrls = arguments.length + + if (numUrls === 0) { + throw new Error("resolveUrl requires at least one argument; got none.") + } + + var base = document.createElement("base") + base.href = arguments[0] + + if (numUrls === 1) { + return base.href + } + + var head = document.getElementsByTagName("head")[0] + head.insertBefore(base, head.firstChild) + + var a = document.createElement("a") + var resolved + + for (var index = 1; index < numUrls; index++) { + a.href = arguments[index] + resolved = a.href + base.href = resolved + } + + head.removeChild(base) + + return resolved + } + + return resolveUrl + +})); diff --git a/node_modules/resolve-url/test/resolve-url.js b/node_modules/resolve-url/test/resolve-url.js new file mode 100644 index 0000000..18532ed --- /dev/null +++ b/node_modules/resolve-url/test/resolve-url.js @@ -0,0 +1,70 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var test = require("tape") + +var resolveUrl = require("../") + +"use strict" + +test("resolveUrl", function(t) { + + t.plan(7) + + t.equal(typeof resolveUrl, "function", "is a function") + + t.equal( + resolveUrl("https://example.com/"), + "https://example.com/" + ) + + var loc = "https://example.com/articles/resolving-urls/edit" + + t.equal( + resolveUrl(loc, "remove"), + "https://example.com/articles/resolving-urls/remove" + ) + + t.equal( + resolveUrl(loc, "/static/scripts/app.js"), + "https://example.com/static/scripts/app.js" + ) + + t.equal( + resolveUrl(loc, "/static/scripts/app.js", "../source-maps/app.js.map"), + "https://example.com/static/source-maps/app.js.map" + ) + + t.equal( + resolveUrl(loc, "/static/scripts/app.js", "../source-maps/app.js.map", "../coffee/app.coffee"), + "https://example.com/static/coffee/app.coffee" + ) + + t.equal( + resolveUrl(loc, "//cdn.example.com/jquery.js"), + "https://cdn.example.com/jquery.js" + ) + +}) + +test("edge cases", function(t) { + + t.plan(4) + + t["throws"](resolveUrl, /at least one argument/, "throws with no arguments") + + var accidentallyUndefined + var result + t.doesNotThrow( + function() { result = resolveUrl(accidentallyUndefined) }, + "undefined is still an argument" + ) + t.ok(result.match(/\/undefined$/), "undefined is stringified") + + t.equal( + resolveUrl("http://foo.org/test", undefined, {}, ["a/b"], null), + "http://foo.org/a/null", + "arguments are stringified" + ) + +}) diff --git a/node_modules/resolve/.eslintignore b/node_modules/resolve/.eslintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/resolve/.eslintignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/resolve/.eslintrc b/node_modules/resolve/.eslintrc new file mode 100644 index 0000000..a22863c --- /dev/null +++ b/node_modules/resolve/.eslintrc @@ -0,0 +1,39 @@ +{ + "extends": "@ljharb", + "root": true, + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "indent": [2, 4], + "strict": 0, + "complexity": 0, + "consistent-return": 0, + "curly": 0, + "dot-notation": [2, { "allowKeywords": true }], + "func-name-matching": 0, + "func-style": 0, + "global-require": 0, + "id-length": [2, { "min": 1, "max": 30 }], + "max-lines-per-function": 0, + "max-nested-callbacks": 0, + "max-params": 0, + "max-statements-per-line": [2, { "max": 2 }], + "max-statements": 0, + "no-magic-numbers": 0, + "no-console": 0, + "no-shadow": 0, + "no-unused-vars": [2, { "vars": "all", "args": "none" }], + "no-use-before-define": 0, + "object-curly-newline": 0, + "operator-linebreak": [2, "before"], + "sort-keys": 0, + }, + "overrides": [ + { + "files": "test/resolver/nested_symlinks/mylib/*.js", + "rules": { + "no-throw-literal": 0, + }, + }, + ], +} diff --git a/node_modules/resolve/.travis.yml b/node_modules/resolve/.travis.yml new file mode 100644 index 0000000..5ed0fa5 --- /dev/null +++ b/node_modules/resolve/.travis.yml @@ -0,0 +1,8 @@ +version: ~> 1.0 +language: node_js +os: + - linux +import: + - ljharb/travis-ci:node/all.yml + - ljharb/travis-ci:node/pretest.yml + - ljharb/travis-ci:node/posttest.yml diff --git a/node_modules/resolve/LICENSE b/node_modules/resolve/LICENSE new file mode 100644 index 0000000..ff4fce2 --- /dev/null +++ b/node_modules/resolve/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012 James Halliday + +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/resolve/appveyor.yml b/node_modules/resolve/appveyor.yml new file mode 100644 index 0000000..9458fb8 --- /dev/null +++ b/node_modules/resolve/appveyor.yml @@ -0,0 +1,54 @@ +version: 1.0.{build} +skip_branch_with_pr: true +build: off + +environment: + matrix: + - nodejs_version: "12" + - nodejs_version: "11" + - nodejs_version: "10" + - nodejs_version: "9" + - nodejs_version: "8" + - nodejs_version: "7" + - nodejs_version: "6" + - nodejs_version: "5" + - nodejs_version: "4" + - nodejs_version: "3" + - nodejs_version: "2" + - nodejs_version: "1" + - nodejs_version: "0.12" + - nodejs_version: "0.10" + - nodejs_version: "0.8" + - nodejs_version: "0.6" +matrix: + # fast_finish: true + allow_failures: + - nodejs_version: "5" # due to windows npm bug, registry-side + - nodejs_version: "0.8" + - nodejs_version: "0.6" + +platform: + - x86 + - x64 + +# Install scripts. (runs after repo cloning) +install: + # Fix symlinks in working copy (see https://github.com/appveyor/ci/issues/650#issuecomment-186592582) / https://github.com/charleskorn/batect/commit/d08986802ec43086902958c4ee7e57ff3e71dbef + - git config core.symlinks true + - git reset --hard + # Get the latest stable version of Node.js or io.js + - ps: Install-Product node $env:nodejs_version $env:platform + - IF %nodejs_version% EQU 0.6 npm config set strict-ssl false && npm -g install npm@1.3 + - IF %nodejs_version% EQU 0.8 npm config set strict-ssl false && npm -g install npm@1.4.28 && npm install -g npm@4.5 + - set PATH=%APPDATA%\npm;%PATH% + #- IF %nodejs_version% NEQ 0.6 AND %nodejs_version% NEQ 0.8 npm -g install npm + # install modules + - npm install + +# Post-install test scripts. +test_script: + # Output useful info for debugging. + - node --version + - npm --version + # run tests + - npm run tests-only diff --git a/node_modules/resolve/example/async.js b/node_modules/resolve/example/async.js new file mode 100644 index 0000000..20e65dc --- /dev/null +++ b/node_modules/resolve/example/async.js @@ -0,0 +1,5 @@ +var resolve = require('../'); +resolve('tap', { basedir: __dirname }, function (err, res) { + if (err) console.error(err); + else console.log(res); +}); diff --git a/node_modules/resolve/example/sync.js b/node_modules/resolve/example/sync.js new file mode 100644 index 0000000..54b2cc1 --- /dev/null +++ b/node_modules/resolve/example/sync.js @@ -0,0 +1,3 @@ +var resolve = require('../'); +var res = resolve.sync('tap', { basedir: __dirname }); +console.log(res); diff --git a/node_modules/resolve/index.js b/node_modules/resolve/index.js new file mode 100644 index 0000000..125d814 --- /dev/null +++ b/node_modules/resolve/index.js @@ -0,0 +1,6 @@ +var async = require('./lib/async'); +async.core = require('./lib/core'); +async.isCore = require('./lib/is-core'); +async.sync = require('./lib/sync'); + +module.exports = async; diff --git a/node_modules/resolve/lib/async.js b/node_modules/resolve/lib/async.js new file mode 100644 index 0000000..66500c8 --- /dev/null +++ b/node_modules/resolve/lib/async.js @@ -0,0 +1,290 @@ +var fs = require('fs'); +var path = require('path'); +var caller = require('./caller.js'); +var nodeModulesPaths = require('./node-modules-paths.js'); +var normalizeOptions = require('./normalize-options.js'); +var isCore = require('./is-core'); + +var defaultIsFile = function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; + +var defaultIsDir = function isDirectory(dir, cb) { + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; + +var maybeUnwrapSymlink = function maybeUnwrapSymlink(x, opts, cb) { + if (opts && opts.preserveSymlinks === false) { + fs.realpath(x, function (realPathErr, realPath) { + if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr); + else cb(null, realPathErr ? x : realPath); + }); + } else { + cb(null, x); + } +}; + +var getPackageCandidates = function getPackageCandidates(x, start, opts) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + dirs[i] = path.join(dirs[i], x); + } + return dirs; +}; + +module.exports = function resolve(x, options, callback) { + var cb = callback; + var opts = options; + if (typeof options === 'function') { + cb = opts; + opts = {}; + } + if (typeof x !== 'string') { + var err = new TypeError('Path must be a string.'); + return process.nextTick(function () { + cb(err); + }); + } + + opts = normalizeOptions(x, opts); + + var isFile = opts.isFile || defaultIsFile; + var isDirectory = opts.isDirectory || defaultIsDir; + var readFile = opts.readFile || fs.readFile; + var packageIterator = opts.packageIterator; + + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); + + maybeUnwrapSymlink( + absoluteStart, + opts, + function (err, realStart) { + if (err) cb(err); + else init(realStart); + } + ); + + var res; + function init(basedir) { + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + res = path.resolve(basedir, x); + if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; + if ((/\/$/).test(x) && res === basedir) { + loadAsDirectory(res, opts.package, onfile); + } else loadAsFile(res, opts.package, onfile); + } else if (isCore(x)) { + return cb(null, x); + } else loadNodeModules(x, basedir, function (err, n, pkg) { + if (err) cb(err); + else if (n) { + return maybeUnwrapSymlink(n, opts, function (err, realN) { + if (err) { + cb(err); + } else { + cb(null, realN, pkg); + } + }); + } else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } + + function onfile(err, m, pkg) { + if (err) cb(err); + else if (m) cb(null, m, pkg); + else loadAsDirectory(res, function (err, d, pkg) { + if (err) cb(err); + else if (d) { + maybeUnwrapSymlink(d, opts, function (err, realD) { + if (err) { + cb(err); + } else { + cb(null, realD, pkg); + } + }); + } else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } + + function loadAsFile(x, thePackage, callback) { + var loadAsFilePackage = thePackage; + var cb = callback; + if (typeof loadAsFilePackage === 'function') { + cb = loadAsFilePackage; + loadAsFilePackage = undefined; + } + + var exts = [''].concat(extensions); + load(exts, x, loadAsFilePackage); + + function load(exts, x, loadPackage) { + if (exts.length === 0) return cb(null, undefined, loadPackage); + var file = x + exts[0]; + + var pkg = loadPackage; + if (pkg) onpkg(null, pkg); + else loadpkg(path.dirname(file), onpkg); + + function onpkg(err, pkg_, dir) { + pkg = pkg_; + if (err) return cb(err); + if (dir && pkg && opts.pathFilter) { + var rfile = path.relative(dir, file); + var rel = rfile.slice(0, rfile.length - exts[0].length); + var r = opts.pathFilter(pkg, x, rel); + if (r) return load( + [''].concat(extensions.slice()), + path.resolve(dir, r), + pkg + ); + } + isFile(file, onex); + } + function onex(err, ex) { + if (err) return cb(err); + if (ex) return cb(null, file, pkg); + load(exts.slice(1), x, pkg); + } + } + } + + function loadpkg(dir, cb) { + if (dir === '' || dir === '/') return cb(null); + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return cb(null); + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); + + maybeUnwrapSymlink(dir, opts, function (unwrapErr, pkgdir) { + if (unwrapErr) return loadpkg(path.dirname(dir), cb); + var pkgfile = path.join(pkgdir, 'package.json'); + isFile(pkgfile, function (err, ex) { + // on err, ex is false + if (!ex) return loadpkg(path.dirname(dir), cb); + + readFile(pkgfile, function (err, body) { + if (err) cb(err); + try { var pkg = JSON.parse(body); } catch (jsonErr) {} + + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + cb(null, pkg, dir); + }); + }); + }); + } + + function loadAsDirectory(x, loadAsDirectoryPackage, callback) { + var cb = callback; + var fpkg = loadAsDirectoryPackage; + if (typeof fpkg === 'function') { + cb = fpkg; + fpkg = opts.package; + } + + maybeUnwrapSymlink(x, opts, function (unwrapErr, pkgdir) { + if (unwrapErr) return cb(unwrapErr); + var pkgfile = path.join(pkgdir, 'package.json'); + isFile(pkgfile, function (err, ex) { + if (err) return cb(err); + if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); + + readFile(pkgfile, function (err, body) { + if (err) return cb(err); + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} + + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + + if (pkg && pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + return cb(mainError); + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); + + var dir = path.resolve(x, pkg.main); + loadAsDirectory(dir, pkg, function (err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + loadAsFile(path.join(x, 'index'), pkg, cb); + }); + }); + return; + } + + loadAsFile(path.join(x, '/index'), pkg, cb); + }); + }); + }); + } + + function processDirs(cb, dirs) { + if (dirs.length === 0) return cb(null, undefined); + var dir = dirs[0]; + + isDirectory(path.dirname(dir), isdir); + + function isdir(err, isdir) { + if (err) return cb(err); + if (!isdir) return processDirs(cb, dirs.slice(1)); + loadAsFile(dir, opts.package, onfile); + } + + function onfile(err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + loadAsDirectory(dir, opts.package, ondir); + } + + function ondir(err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + processDirs(cb, dirs.slice(1)); + } + } + function loadNodeModules(x, start, cb) { + var thunk = function () { return getPackageCandidates(x, start, opts); }; + processDirs( + cb, + packageIterator ? packageIterator(x, start, thunk, opts) : thunk() + ); + } +}; diff --git a/node_modules/resolve/lib/caller.js b/node_modules/resolve/lib/caller.js new file mode 100644 index 0000000..b14a280 --- /dev/null +++ b/node_modules/resolve/lib/caller.js @@ -0,0 +1,8 @@ +module.exports = function () { + // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + var origPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = function (_, stack) { return stack; }; + var stack = (new Error()).stack; + Error.prepareStackTrace = origPrepareStackTrace; + return stack[2].getFileName(); +}; diff --git a/node_modules/resolve/lib/core.js b/node_modules/resolve/lib/core.js new file mode 100644 index 0000000..0877650 --- /dev/null +++ b/node_modules/resolve/lib/core.js @@ -0,0 +1,53 @@ +var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; + +function specifierIncluded(specifier) { + var parts = specifier.split(' '); + var op = parts.length > 1 ? parts[0] : '='; + var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); + + for (var i = 0; i < 3; ++i) { + var cur = Number(current[i] || 0); + var ver = Number(versionParts[i] || 0); + if (cur === ver) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } + if (op === '<') { + return cur < ver; + } else if (op === '>=') { + return cur >= ver; + } else { + return false; + } + } + return op === '>='; +} + +function matchesRange(range) { + var specifiers = range.split(/ ?&& ?/); + if (specifiers.length === 0) { return false; } + for (var i = 0; i < specifiers.length; ++i) { + if (!specifierIncluded(specifiers[i])) { return false; } + } + return true; +} + +function versionIncluded(specifierValue) { + if (typeof specifierValue === 'boolean') { return specifierValue; } + if (specifierValue && typeof specifierValue === 'object') { + for (var i = 0; i < specifierValue.length; ++i) { + if (matchesRange(specifierValue[i])) { return true; } + } + return false; + } + return matchesRange(specifierValue); +} + +var data = require('./core.json'); + +var core = {}; +for (var mod in data) { // eslint-disable-line no-restricted-syntax + if (Object.prototype.hasOwnProperty.call(data, mod)) { + core[mod] = versionIncluded(data[mod]); + } +} +module.exports = core; diff --git a/node_modules/resolve/lib/core.json b/node_modules/resolve/lib/core.json new file mode 100644 index 0000000..d5c85d2 --- /dev/null +++ b/node_modules/resolve/lib/core.json @@ -0,0 +1,75 @@ +{ + "assert": true, + "async_hooks": ">= 8", + "buffer_ieee754": "< 0.9.7", + "buffer": true, + "child_process": true, + "cluster": true, + "console": true, + "constants": true, + "crypto": true, + "_debug_agent": ">= 1 && < 8", + "_debugger": "< 8", + "dgram": true, + "dns": true, + "domain": true, + "events": true, + "freelist": "< 6", + "fs": true, + "fs/promises": ">= 10 && < 10.1", + "_http_agent": ">= 0.11.1", + "_http_client": ">= 0.11.1", + "_http_common": ">= 0.11.1", + "_http_incoming": ">= 0.11.1", + "_http_outgoing": ">= 0.11.1", + "_http_server": ">= 0.11.1", + "http": true, + "http2": ">= 8.8", + "https": true, + "inspector": ">= 8.0.0", + "_linklist": "< 8", + "module": true, + "net": true, + "node-inspect/lib/_inspect": ">= 7.6.0 && < 12", + "node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12", + "node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12", + "os": true, + "path": true, + "perf_hooks": ">= 8.5", + "process": ">= 1", + "punycode": true, + "querystring": true, + "readline": true, + "repl": true, + "smalloc": ">= 0.11.5 && < 3", + "_stream_duplex": ">= 0.9.4", + "_stream_transform": ">= 0.9.4", + "_stream_wrap": ">= 1.4.1", + "_stream_passthrough": ">= 0.9.4", + "_stream_readable": ">= 0.9.4", + "_stream_writable": ">= 0.9.4", + "stream": true, + "string_decoder": true, + "sys": true, + "timers": true, + "_tls_common": ">= 0.11.13", + "_tls_legacy": ">= 0.11.3 && < 10", + "_tls_wrap": ">= 0.11.3", + "tls": true, + "trace_events": ">= 10", + "tty": true, + "url": true, + "util": true, + "v8/tools/arguments": ">= 10 && < 12", + "v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8": ">= 1", + "vm": true, + "wasi": ">= 13.4 && < 13.5", + "worker_threads": ">= 11.7", + "zlib": true +} diff --git a/node_modules/resolve/lib/is-core.js b/node_modules/resolve/lib/is-core.js new file mode 100644 index 0000000..48bc96c --- /dev/null +++ b/node_modules/resolve/lib/is-core.js @@ -0,0 +1,5 @@ +var core = require('./core'); + +module.exports = function isCore(x) { + return Object.prototype.hasOwnProperty.call(core, x); +}; diff --git a/node_modules/resolve/lib/node-modules-paths.js b/node_modules/resolve/lib/node-modules-paths.js new file mode 100644 index 0000000..2b43813 --- /dev/null +++ b/node_modules/resolve/lib/node-modules-paths.js @@ -0,0 +1,42 @@ +var path = require('path'); +var parse = path.parse || require('path-parse'); + +var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { + var prefix = '/'; + if ((/^([A-Za-z]:)/).test(absoluteStart)) { + prefix = ''; + } else if ((/^\\\\/).test(absoluteStart)) { + prefix = '\\\\'; + } + + var paths = [absoluteStart]; + var parsed = parse(absoluteStart); + while (parsed.dir !== paths[paths.length - 1]) { + paths.push(parsed.dir); + parsed = parse(parsed.dir); + } + + return paths.reduce(function (dirs, aPath) { + return dirs.concat(modules.map(function (moduleDir) { + return path.resolve(prefix, aPath, moduleDir); + })); + }, []); +}; + +module.exports = function nodeModulesPaths(start, opts, request) { + var modules = opts && opts.moduleDirectory + ? [].concat(opts.moduleDirectory) + : ['node_modules']; + + if (opts && typeof opts.paths === 'function') { + return opts.paths( + request, + start, + function () { return getNodeModulesDirs(start, modules); }, + opts + ); + } + + var dirs = getNodeModulesDirs(start, modules); + return opts && opts.paths ? dirs.concat(opts.paths) : dirs; +}; diff --git a/node_modules/resolve/lib/normalize-options.js b/node_modules/resolve/lib/normalize-options.js new file mode 100644 index 0000000..4b56904 --- /dev/null +++ b/node_modules/resolve/lib/normalize-options.js @@ -0,0 +1,10 @@ +module.exports = function (x, opts) { + /** + * This file is purposefully a passthrough. It's expected that third-party + * environments will override it at runtime in order to inject special logic + * into `resolve` (by manipulating the options). One such example is the PnP + * code path in Yarn. + */ + + return opts || {}; +}; diff --git a/node_modules/resolve/lib/sync.js b/node_modules/resolve/lib/sync.js new file mode 100644 index 0000000..b278837 --- /dev/null +++ b/node_modules/resolve/lib/sync.js @@ -0,0 +1,183 @@ +var isCore = require('./is-core'); +var fs = require('fs'); +var path = require('path'); +var caller = require('./caller.js'); +var nodeModulesPaths = require('./node-modules-paths.js'); +var normalizeOptions = require('./normalize-options.js'); + +var defaultIsFile = function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isFile() || stat.isFIFO(); +}; + +var defaultIsDir = function isDirectory(dir) { + try { + var stat = fs.statSync(dir); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isDirectory(); +}; + +var maybeUnwrapSymlink = function maybeUnwrapSymlink(x, opts) { + if (opts && opts.preserveSymlinks === false) { + try { + return fs.realpathSync(x); + } catch (realPathErr) { + if (realPathErr.code !== 'ENOENT') { + throw realPathErr; + } + } + } + return x; +}; + +var getPackageCandidates = function getPackageCandidates(x, start, opts) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + dirs[i] = path.join(dirs[i], x); + } + return dirs; +}; + +module.exports = function resolveSync(x, options) { + if (typeof x !== 'string') { + throw new TypeError('Path must be a string.'); + } + var opts = normalizeOptions(x, options); + + var isFile = opts.isFile || defaultIsFile; + var readFileSync = opts.readFileSync || fs.readFileSync; + var isDirectory = opts.isDirectory || defaultIsDir; + var packageIterator = opts.packageIterator; + + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = maybeUnwrapSymlink(path.resolve(basedir), opts); + + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + var res = path.resolve(absoluteStart, x); + if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; + var m = loadAsFileSync(res) || loadAsDirectorySync(res); + if (m) return maybeUnwrapSymlink(m, opts); + } else if (isCore(x)) { + return x; + } else { + var n = loadNodeModulesSync(x, absoluteStart); + if (n) return maybeUnwrapSymlink(n, opts); + } + + var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + + function loadAsFileSync(x) { + var pkg = loadpkg(path.dirname(x)); + + if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { + var rfile = path.relative(pkg.dir, x); + var r = opts.pathFilter(pkg.pkg, x, rfile); + if (r) { + x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign + } + } + + if (isFile(x)) { + return x; + } + + for (var i = 0; i < extensions.length; i++) { + var file = x + extensions[i]; + if (isFile(file)) { + return file; + } + } + } + + function loadpkg(dir) { + if (dir === '' || dir === '/') return; + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return; + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; + + var pkgfile = path.join(maybeUnwrapSymlink(dir, opts), 'package.json'); + + if (!isFile(pkgfile)) { + return loadpkg(path.dirname(dir)); + } + + var body = readFileSync(pkgfile); + + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} + + if (pkg && opts.packageFilter) { + // v2 will pass pkgfile + pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment + } + + return { pkg: pkg, dir: dir }; + } + + function loadAsDirectorySync(x) { + var pkgfile = path.join(maybeUnwrapSymlink(x, opts), '/package.json'); + if (isFile(pkgfile)) { + try { + var body = readFileSync(pkgfile, 'UTF8'); + var pkg = JSON.parse(body); + } catch (e) {} + + if (pkg && opts.packageFilter) { + // v2 will pass pkgfile + pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment + } + + if (pkg && pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + throw mainError; + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + try { + var m = loadAsFileSync(path.resolve(x, pkg.main)); + if (m) return m; + var n = loadAsDirectorySync(path.resolve(x, pkg.main)); + if (n) return n; + } catch (e) {} + } + } + + return loadAsFileSync(path.join(x, '/index')); + } + + function loadNodeModulesSync(x, start) { + var thunk = function () { return getPackageCandidates(x, start, opts); }; + var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk(); + + for (var i = 0; i < dirs.length; i++) { + var dir = dirs[i]; + if (isDirectory(path.dirname(dir))) { + var m = loadAsFileSync(dir); + if (m) return m; + var n = loadAsDirectorySync(dir); + if (n) return n; + } + } + } +}; diff --git a/node_modules/resolve/package.json b/node_modules/resolve/package.json new file mode 100644 index 0000000..2140727 --- /dev/null +++ b/node_modules/resolve/package.json @@ -0,0 +1,80 @@ +{ + "_args": [ + [ + "resolve@1.15.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "resolve@1.15.1", + "_id": "resolve@1.15.1", + "_inBundle": false, + "_integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "_location": "/resolve", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "resolve@1.15.1", + "name": "resolve", + "escapedName": "resolve", + "rawSpec": "1.15.1", + "saveSpec": null, + "fetchSpec": "1.15.1" + }, + "_requiredBy": [ + "/liftoff", + "/rechoir" + ], + "_resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "_spec": "1.15.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/browserify/resolve/issues" + }, + "dependencies": { + "path-parse": "^1.0.6" + }, + "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously", + "devDependencies": { + "@ljharb/eslint-config": "^16.0.0", + "array.prototype.map": "^1.0.2", + "eslint": "^6.8.0", + "object-keys": "^1.1.1", + "safe-publish-latest": "^1.1.4", + "tap": "0.4.13", + "tape": "^5.0.0-next.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "homepage": "https://github.com/browserify/resolve#readme", + "keywords": [ + "resolve", + "require", + "node", + "module" + ], + "license": "MIT", + "main": "index.js", + "name": "resolve", + "repository": { + "type": "git", + "url": "git://github.com/browserify/resolve.git" + }, + "scripts": { + "lint": "eslint .", + "posttest": "npm run test:multirepo", + "prepublish": "safe-publish-latest", + "pretest": "npm run lint", + "pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async", + "test": "npm run --silent tests-only", + "test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test", + "tests-only": "tape test/*.js" + }, + "version": "1.15.1" +} diff --git a/node_modules/resolve/readme.markdown b/node_modules/resolve/readme.markdown new file mode 100644 index 0000000..60c20d9 --- /dev/null +++ b/node_modules/resolve/readme.markdown @@ -0,0 +1,220 @@ +# resolve + +implements the [node `require.resolve()` +algorithm](https://nodejs.org/api/modules.html#modules_all_together) +such that you can `require.resolve()` on behalf of a file asynchronously and +synchronously + +[![build status](https://secure.travis-ci.org/browserify/resolve.png)](http://travis-ci.org/browserify/resolve) + +# example + +asynchronously resolve: + +```js +var resolve = require('resolve'); +resolve('tap', { basedir: __dirname }, function (err, res) { + if (err) console.error(err); + else console.log(res); +}); +``` + +``` +$ node example/async.js +/home/substack/projects/node-resolve/node_modules/tap/lib/main.js +``` + +synchronously resolve: + +```js +var resolve = require('resolve'); +var res = resolve.sync('tap', { basedir: __dirname }); +console.log(res); +``` + +``` +$ node example/sync.js +/home/substack/projects/node-resolve/node_modules/tap/lib/main.js +``` + +# methods + +```js +var resolve = require('resolve'); +``` + +## resolve(id, opts={}, cb) + +Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`. + +options are: + +* opts.basedir - directory to begin resolving from + +* opts.package - `package.json` data applicable to the module being loaded + +* opts.extensions - array of file extensions to search in order + +* opts.readFile - how to read files asynchronously + +* opts.isFile - function to asynchronously test whether a file exists + +* opts.isDirectory - function to asynchronously test whether a directory exists + +* `opts.packageFilter(pkg, pkgfile, dir)` - transform the parsed package.json contents before looking at the "main" field + * pkg - package data + * pkgfile - path to package.json + * dir - directory for package.json + +* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package + * pkg - package data + * path - the path being resolved + * relativePath - the path relative from the package.json location + * returns - a relative path that will be joined from the package.json location + +* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this) + + For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function + * request - the import specifier being resolved + * start - lookup path + * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this) + * request - the import specifier being resolved + * start - lookup path + * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` + +* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving. +This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag. +**Note:** this property is currently `true` by default but it will be changed to +`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*. + +default `opts` values: + +```js +{ + paths: [], + basedir: __dirname, + extensions: ['.js'], + readFile: fs.readFile, + isFile: function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }, + isDirectory: function isDirectory(dir, cb) { + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }, + moduleDirectory: 'node_modules', + preserveSymlinks: true +} +``` + +## resolve.sync(id, opts) + +Synchronously resolve the module path string `id`, returning the result and +throwing an error when `id` can't be resolved. + +options are: + +* opts.basedir - directory to begin resolving from + +* opts.extensions - array of file extensions to search in order + +* opts.readFile - how to read files synchronously + +* opts.isFile - function to synchronously test whether a file exists + +* opts.isDirectory - function to synchronously test whether a directory exists + +* `opts.packageFilter(pkg, dir)` - transform the parsed package.json contents before looking at the "main" field + * pkg - package data + * dir - directory for package.json (Note: the second argument will change to "pkgfile" in v2) + +* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package + * pkg - package data + * path - the path being resolved + * relativePath - the path relative from the package.json location + * returns - a relative path that will be joined from the package.json location + +* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this) + + For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function + * request - the import specifier being resolved + * start - lookup path + * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this) + * request - the import specifier being resolved + * start - lookup path + * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` + +* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving. +This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag. +**Note:** this property is currently `true` by default but it will be changed to +`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*. + +default `opts` values: + +```js +{ + paths: [], + basedir: __dirname, + extensions: ['.js'], + readFileSync: fs.readFileSync, + isFile: function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isFile() || stat.isFIFO(); + }, + isDirectory: function isDirectory(dir) { + try { + var stat = fs.statSync(dir); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isDirectory(); + }, + moduleDirectory: 'node_modules', + preserveSymlinks: true +} +``` + +## resolve.isCore(pkg) + +Return whether a package is in core. + +# install + +With [npm](https://npmjs.org) do: + +```sh +npm install resolve +``` + +# license + +MIT diff --git a/node_modules/resolve/test/.eslintrc b/node_modules/resolve/test/.eslintrc new file mode 100644 index 0000000..ddd262d --- /dev/null +++ b/node_modules/resolve/test/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "max-lines": 0 + } +} diff --git a/node_modules/resolve/test/core.js b/node_modules/resolve/test/core.js new file mode 100644 index 0000000..4c111e1 --- /dev/null +++ b/node_modules/resolve/test/core.js @@ -0,0 +1,85 @@ +var test = require('tape'); +var keys = require('object-keys'); +var resolve = require('../'); + +test('core modules', function (t) { + t.test('isCore()', function (st) { + st.ok(resolve.isCore('fs')); + st.ok(resolve.isCore('net')); + st.ok(resolve.isCore('http')); + + st.ok(!resolve.isCore('seq')); + st.ok(!resolve.isCore('../')); + + st.ok(!resolve.isCore('toString')); + + st.end(); + }); + + t.test('core list', function (st) { + var cores = keys(resolve.core); + st.plan(cores.length); + + for (var i = 0; i < cores.length; ++i) { + var mod = cores[i]; + if (resolve.core[mod]) { + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + mod + ' supported; requiring does not throw' + ); + } else { + st.throws( + function () { require(mod); }, // eslint-disable-line no-loop-func + mod + ' not supported; requiring throws' + ); + } + } + + st.end(); + }); + + t.test('core via repl module', { skip: !resolve.core.repl }, function (st) { + var libs = require('repl')._builtinLibs; // eslint-disable-line no-underscore-dangle + if (!libs) { + st.skip('module.builtinModules does not exist'); + return st.end(); + } + for (var i = 0; i < libs.length; ++i) { + var mod = libs[i]; + st.ok(resolve.core[mod], mod + ' is a core module'); + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + 'requiring ' + mod + ' does not throw' + ); + } + st.end(); + }); + + t.test('core via builtinModules list', { skip: !resolve.core.module }, function (st) { + var libs = require('module').builtinModules; + if (!libs) { + st.skip('module.builtinModules does not exist'); + return st.end(); + } + var blacklist = [ + '_debug_agent', + 'v8/tools/tickprocessor-driver', + 'v8/tools/SourceMap', + 'v8/tools/tickprocessor', + 'v8/tools/profile' + ]; + for (var i = 0; i < libs.length; ++i) { + var mod = libs[i]; + if (blacklist.indexOf(mod) === -1) { + st.ok(resolve.core[mod], mod + ' is a core module'); + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + 'requiring ' + mod + ' does not throw' + ); + } + } + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/resolve/test/dotdot.js b/node_modules/resolve/test/dotdot.js new file mode 100644 index 0000000..3080665 --- /dev/null +++ b/node_modules/resolve/test/dotdot.js @@ -0,0 +1,29 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('dotdot', function (t) { + t.plan(4); + var dir = path.join(__dirname, '/dotdot/abc'); + + resolve('..', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'dotdot/index.js')); + }); + + resolve('.', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, 'index.js')); + }); +}); + +test('dotdot sync', function (t) { + t.plan(2); + var dir = path.join(__dirname, '/dotdot/abc'); + + var a = resolve.sync('..', { basedir: dir }); + t.equal(a, path.join(__dirname, 'dotdot/index.js')); + + var b = resolve.sync('.', { basedir: dir }); + t.equal(b, path.join(dir, 'index.js')); +}); diff --git a/node_modules/resolve/test/dotdot/abc/index.js b/node_modules/resolve/test/dotdot/abc/index.js new file mode 100644 index 0000000..67f2534 --- /dev/null +++ b/node_modules/resolve/test/dotdot/abc/index.js @@ -0,0 +1,2 @@ +var x = require('..'); +console.log(x); diff --git a/node_modules/resolve/test/dotdot/index.js b/node_modules/resolve/test/dotdot/index.js new file mode 100644 index 0000000..643f9fc --- /dev/null +++ b/node_modules/resolve/test/dotdot/index.js @@ -0,0 +1 @@ +module.exports = 'whatever'; diff --git a/node_modules/resolve/test/faulty_basedir.js b/node_modules/resolve/test/faulty_basedir.js new file mode 100644 index 0000000..5f2141a --- /dev/null +++ b/node_modules/resolve/test/faulty_basedir.js @@ -0,0 +1,29 @@ +var test = require('tape'); +var path = require('path'); +var resolve = require('../'); + +test('faulty basedir must produce error in windows', { skip: process.platform !== 'win32' }, function (t) { + t.plan(1); + + var resolverDir = 'C:\\a\\b\\c\\d'; + + resolve('tape/lib/test.js', { basedir: resolverDir }, function (err, res, pkg) { + t.equal(!!err, true); + }); +}); + +test('non-existent basedir should not throw when preserveSymlinks is false', function (t) { + t.plan(2); + + var opts = { + basedir: path.join(path.sep, 'unreal', 'path', 'that', 'does', 'not', 'exist'), + preserveSymlinks: false + }; + + var module = './dotdot/abc'; + + resolve(module, opts, function (err, res) { + t.equal(err.code, 'MODULE_NOT_FOUND'); + t.equal(res, undefined); + }); +}); diff --git a/node_modules/resolve/test/filter.js b/node_modules/resolve/test/filter.js new file mode 100644 index 0000000..8f8cccd --- /dev/null +++ b/node_modules/resolve/test/filter.js @@ -0,0 +1,34 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('filter', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'resolver'); + var packageFilterArgs; + resolve('./baz', { + basedir: dir, + packageFilter: function (pkg, pkgfile) { + pkg.main = 'doom'; // eslint-disable-line no-param-reassign + packageFilterArgs = [pkg, pkgfile]; + return pkg; + } + }, function (err, res, pkg) { + if (err) t.fail(err); + + t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works'); + + var packageData = packageFilterArgs[0]; + t.equal(pkg, packageData, 'first packageFilter argument is "pkg"'); + t.equal(packageData.main, 'doom', 'package "main" was altered'); + + var packageFile = packageFilterArgs[1]; + t.equal( + packageFile, + path.join(dir, 'baz/package.json'), + 'second packageFilter argument is "pkgfile"' + ); + + t.end(); + }); +}); diff --git a/node_modules/resolve/test/filter_sync.js b/node_modules/resolve/test/filter_sync.js new file mode 100644 index 0000000..8a43b98 --- /dev/null +++ b/node_modules/resolve/test/filter_sync.js @@ -0,0 +1,33 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('filter', function (t) { + var dir = path.join(__dirname, 'resolver'); + var packageFilterArgs; + var res = resolve.sync('./baz', { + basedir: dir, + // NOTE: in v2.x, this will be `pkg, pkgfile, dir`, but must remain "broken" here in v1.x for compatibility + packageFilter: function (pkg, /*pkgfile,*/ dir) { // eslint-disable-line spaced-comment + pkg.main = 'doom'; // eslint-disable-line no-param-reassign + packageFilterArgs = 'is 1.x' ? [pkg, dir] : [pkg, pkgfile, dir]; // eslint-disable-line no-constant-condition, no-undef + return pkg; + } + }); + + t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works'); + + var packageData = packageFilterArgs[0]; + t.equal(packageData.main, 'doom', 'package "main" was altered'); + + if (!'is 1.x') { // eslint-disable-line no-constant-condition + var packageFile = packageFilterArgs[1]; + t.equal(packageFile, path.join(dir, 'baz', 'package.json'), 'package.json path is correct'); + } + + var packageDir = packageFilterArgs['is 1.x' ? 1 : 2]; // eslint-disable-line no-constant-condition + // eslint-disable-next-line no-constant-condition + t.equal(packageDir, path.join(dir, 'baz'), ('is 1.x' ? 'second' : 'third') + ' packageFilter argument is "dir"'); + + t.end(); +}); diff --git a/node_modules/resolve/test/mock.js b/node_modules/resolve/test/mock.js new file mode 100644 index 0000000..d4f57a3 --- /dev/null +++ b/node_modules/resolve/test/mock.js @@ -0,0 +1,169 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('mock', function (t) { + t.plan(8); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('../baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('mock from package', function (t) { + t.plan(8); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, file)); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[file]); + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg && pkg.main, 'bar'); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg && pkg.main, 'bar'); + }); + + resolve('baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('../baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('mock package', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + } + }; + } + + resolve('bar', opts('/foo'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + t.equal(pkg && pkg.main, './baz.js'); + }); +}); + +test('mock package from package', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + } + }; + } + + resolve('bar', opts('/foo'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + t.equal(pkg && pkg.main, './baz.js'); + }); +}); diff --git a/node_modules/resolve/test/mock_sync.js b/node_modules/resolve/test/mock_sync.js new file mode 100644 index 0000000..af06ae1 --- /dev/null +++ b/node_modules/resolve/test/mock_sync.js @@ -0,0 +1,80 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('mock', function (t) { + t.plan(4); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + } + }; + } + + t.equal( + resolve.sync('./baz', opts('/foo/bar')), + path.resolve('/foo/bar/baz.js') + ); + + t.equal( + resolve.sync('./baz.js', opts('/foo/bar')), + path.resolve('/foo/bar/baz.js') + ); + + t.throws(function () { + resolve.sync('baz', opts('/foo/bar')); + }); + + t.throws(function () { + resolve.sync('../baz', opts('/foo/bar')); + }); +}); + +test('mock package', function (t) { + t.plan(1); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + } + }; + } + + t.equal( + resolve.sync('bar', opts('/foo')), + path.resolve('/foo/node_modules/bar/baz.js') + ); +}); diff --git a/node_modules/resolve/test/module_dir.js b/node_modules/resolve/test/module_dir.js new file mode 100644 index 0000000..b50e5bb --- /dev/null +++ b/node_modules/resolve/test/module_dir.js @@ -0,0 +1,56 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('moduleDirectory strings', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'module_dir'); + var xopts = { + basedir: dir, + moduleDirectory: 'xmodules' + }; + resolve('aaa', xopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/xmodules/aaa/index.js')); + }); + + var yopts = { + basedir: dir, + moduleDirectory: 'ymodules' + }; + resolve('aaa', yopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/ymodules/aaa/index.js')); + }); +}); + +test('moduleDirectory array', function (t) { + t.plan(6); + var dir = path.join(__dirname, 'module_dir'); + var aopts = { + basedir: dir, + moduleDirectory: ['xmodules', 'ymodules', 'zmodules'] + }; + resolve('aaa', aopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/xmodules/aaa/index.js')); + }); + + var bopts = { + basedir: dir, + moduleDirectory: ['zmodules', 'ymodules', 'xmodules'] + }; + resolve('aaa', bopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/ymodules/aaa/index.js')); + }); + + var copts = { + basedir: dir, + moduleDirectory: ['xmodules', 'ymodules', 'zmodules'] + }; + resolve('bbb', copts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/zmodules/bbb/main.js')); + }); +}); diff --git a/node_modules/resolve/test/module_dir/xmodules/aaa/index.js b/node_modules/resolve/test/module_dir/xmodules/aaa/index.js new file mode 100644 index 0000000..dd7cf7b --- /dev/null +++ b/node_modules/resolve/test/module_dir/xmodules/aaa/index.js @@ -0,0 +1 @@ +module.exports = function (x) { return x * 100; }; diff --git a/node_modules/resolve/test/module_dir/ymodules/aaa/index.js b/node_modules/resolve/test/module_dir/ymodules/aaa/index.js new file mode 100644 index 0000000..ef2d4d4 --- /dev/null +++ b/node_modules/resolve/test/module_dir/ymodules/aaa/index.js @@ -0,0 +1 @@ +module.exports = function (x) { return x + 100; }; diff --git a/node_modules/resolve/test/module_dir/zmodules/bbb/main.js b/node_modules/resolve/test/module_dir/zmodules/bbb/main.js new file mode 100644 index 0000000..e8ba629 --- /dev/null +++ b/node_modules/resolve/test/module_dir/zmodules/bbb/main.js @@ -0,0 +1 @@ +module.exports = function (n) { return n * 111; }; diff --git a/node_modules/resolve/test/module_dir/zmodules/bbb/package.json b/node_modules/resolve/test/module_dir/zmodules/bbb/package.json new file mode 100644 index 0000000..c13b8cf --- /dev/null +++ b/node_modules/resolve/test/module_dir/zmodules/bbb/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.js" +} diff --git a/node_modules/resolve/test/node-modules-paths.js b/node_modules/resolve/test/node-modules-paths.js new file mode 100644 index 0000000..675441d --- /dev/null +++ b/node_modules/resolve/test/node-modules-paths.js @@ -0,0 +1,143 @@ +var test = require('tape'); +var path = require('path'); +var parse = path.parse || require('path-parse'); +var keys = require('object-keys'); + +var nodeModulesPaths = require('../lib/node-modules-paths'); + +var verifyDirs = function verifyDirs(t, start, dirs, moduleDirectories, paths) { + var moduleDirs = [].concat(moduleDirectories || 'node_modules'); + if (paths) { + for (var k = 0; k < paths.length; ++k) { + moduleDirs.push(path.basename(paths[k])); + } + } + + var foundModuleDirs = {}; + var uniqueDirs = {}; + var parsedDirs = {}; + for (var i = 0; i < dirs.length; ++i) { + var parsed = parse(dirs[i]); + if (!foundModuleDirs[parsed.base]) { foundModuleDirs[parsed.base] = 0; } + foundModuleDirs[parsed.base] += 1; + parsedDirs[parsed.dir] = true; + uniqueDirs[dirs[i]] = true; + } + t.equal(keys(parsedDirs).length >= start.split(path.sep).length, true, 'there are >= dirs than "start" has'); + var foundModuleDirNames = keys(foundModuleDirs); + t.deepEqual(foundModuleDirNames, moduleDirs, 'all desired module dirs were found'); + t.equal(keys(uniqueDirs).length, dirs.length, 'all dirs provided were unique'); + + var counts = {}; + for (var j = 0; j < foundModuleDirNames.length; ++j) { + counts[foundModuleDirs[j]] = true; + } + t.equal(keys(counts).length, 1, 'all found module directories had the same count'); +}; + +test('node-modules-paths', function (t) { + t.test('no options', function (t) { + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start); + + verifyDirs(t, start, dirs); + + t.end(); + }); + + t.test('empty options', function (t) { + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, {}); + + verifyDirs(t, start, dirs); + + t.end(); + }); + + t.test('with paths=array option', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var dirs = nodeModulesPaths(start, { paths: paths }); + + verifyDirs(t, start, dirs, null, paths); + + t.end(); + }); + + t.test('with paths=function option', function (t) { + var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { + return getNodeModulesDirs().concat(path.join(absoluteStart, 'not node modules', request)); + }; + + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, { paths: paths }, 'pkg'); + + verifyDirs(t, start, dirs, null, [path.join(start, 'not node modules', 'pkg')]); + + t.end(); + }); + + t.test('with paths=function skipping node modules resolution', function (t) { + var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { + return []; + }; + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, { paths: paths }); + t.deepEqual(dirs, [], 'no node_modules was computed'); + t.end(); + }); + + t.test('with moduleDirectory option', function (t) { + var start = path.join(__dirname, 'resolver'); + var moduleDirectory = 'not node modules'; + var dirs = nodeModulesPaths(start, { moduleDirectory: moduleDirectory }); + + verifyDirs(t, start, dirs, moduleDirectory); + + t.end(); + }); + + t.test('with 1 moduleDirectory and paths options', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var moduleDirectory = 'not node modules'; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectory }); + + verifyDirs(t, start, dirs, moduleDirectory, paths); + + t.end(); + }); + + t.test('with 1+ moduleDirectory and paths options', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var moduleDirectories = ['not node modules', 'other modules']; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + verifyDirs(t, start, dirs, moduleDirectories, paths); + + t.end(); + }); + + t.test('combine paths correctly on Windows', function (t) { + var start = 'C:\\Users\\username\\myProject\\src'; + var paths = []; + var moduleDirectories = ['node_modules', start]; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); + + t.end(); + }); + + t.test('combine paths correctly on non-Windows', { skip: process.platform === 'win32' }, function (t) { + var start = '/Users/username/git/myProject/src'; + var paths = []; + var moduleDirectories = ['node_modules', '/Users/username/git/myProject/src']; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); + + t.end(); + }); +}); diff --git a/node_modules/resolve/test/node_path.js b/node_modules/resolve/test/node_path.js new file mode 100644 index 0000000..d06aa4e --- /dev/null +++ b/node_modules/resolve/test/node_path.js @@ -0,0 +1,70 @@ +var fs = require('fs'); +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('$NODE_PATH', function (t) { + t.plan(8); + + var isDir = function (dir, cb) { + if (dir === '/node_path' || dir === 'node_path/x') { + return cb(null, true); + } + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }; + + resolve('aaa', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/x/aaa/index.js'), 'aaa resolves'); + }); + + resolve('bbb', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/y/bbb/index.js'), 'bbb resolves'); + }); + + resolve('ccc', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/x/ccc/index.js'), 'ccc resolves'); + }); + + // ensure that relative paths still resolve against the regular `node_modules` correctly + resolve('tap', { + paths: [ + 'node_path' + ], + basedir: path.join(__dirname, 'node_path/x'), + isDirectory: isDir + }, function (err, res) { + var root = require('tap/package.json').main; + t.error(err); + t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap', root), 'tap resolves'); + }); +}); diff --git a/node_modules/resolve/test/node_path/x/aaa/index.js b/node_modules/resolve/test/node_path/x/aaa/index.js new file mode 100644 index 0000000..ad70d0b --- /dev/null +++ b/node_modules/resolve/test/node_path/x/aaa/index.js @@ -0,0 +1 @@ +module.exports = 'A'; diff --git a/node_modules/resolve/test/node_path/x/ccc/index.js b/node_modules/resolve/test/node_path/x/ccc/index.js new file mode 100644 index 0000000..a64132e --- /dev/null +++ b/node_modules/resolve/test/node_path/x/ccc/index.js @@ -0,0 +1 @@ +module.exports = 'C'; diff --git a/node_modules/resolve/test/node_path/y/bbb/index.js b/node_modules/resolve/test/node_path/y/bbb/index.js new file mode 100644 index 0000000..4d0f32e --- /dev/null +++ b/node_modules/resolve/test/node_path/y/bbb/index.js @@ -0,0 +1 @@ +module.exports = 'B'; diff --git a/node_modules/resolve/test/node_path/y/ccc/index.js b/node_modules/resolve/test/node_path/y/ccc/index.js new file mode 100644 index 0000000..793315e --- /dev/null +++ b/node_modules/resolve/test/node_path/y/ccc/index.js @@ -0,0 +1 @@ +module.exports = 'CY'; diff --git a/node_modules/resolve/test/nonstring.js b/node_modules/resolve/test/nonstring.js new file mode 100644 index 0000000..ef63c40 --- /dev/null +++ b/node_modules/resolve/test/nonstring.js @@ -0,0 +1,9 @@ +var test = require('tape'); +var resolve = require('../'); + +test('nonstring', function (t) { + t.plan(1); + resolve(555, function (err, res, pkg) { + t.ok(err); + }); +}); diff --git a/node_modules/resolve/test/pathfilter.js b/node_modules/resolve/test/pathfilter.js new file mode 100644 index 0000000..16519ae --- /dev/null +++ b/node_modules/resolve/test/pathfilter.js @@ -0,0 +1,75 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +var resolverDir = path.join(__dirname, '/pathfilter/deep_ref'); + +var pathFilterFactory = function (t) { + return function (pkg, x, remainder) { + t.equal(pkg.version, '1.2.3'); + t.equal(x, path.join(resolverDir, 'node_modules/deep/ref')); + t.equal(remainder, 'ref'); + return 'alt'; + }; +}; + +test('#62: deep module references and the pathFilter', function (t) { + t.test('deep/ref.js', function (st) { + st.plan(3); + + resolve('deep/ref', { basedir: resolverDir }, function (err, res, pkg) { + if (err) st.fail(err); + + st.equal(pkg.version, '1.2.3'); + st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js')); + }); + + var res = resolve.sync('deep/ref', { basedir: resolverDir }); + st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js')); + }); + + t.test('deep/deeper/ref', function (st) { + st.plan(4); + + resolve( + 'deep/deeper/ref', + { basedir: resolverDir }, + function (err, res, pkg) { + if (err) t.fail(err); + st.notEqual(pkg, undefined); + st.equal(pkg.version, '1.2.3'); + st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js')); + } + ); + + var res = resolve.sync( + 'deep/deeper/ref', + { basedir: resolverDir } + ); + st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js')); + }); + + t.test('deep/ref alt', function (st) { + st.plan(8); + + var pathFilter = pathFilterFactory(st); + + var res = resolve.sync( + 'deep/ref', + { basedir: resolverDir, pathFilter: pathFilter } + ); + st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js')); + + resolve( + 'deep/ref', + { basedir: resolverDir, pathFilter: pathFilter }, + function (err, res, pkg) { + if (err) st.fail(err); + st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js')); + st.end(); + } + ); + }); + + t.end(); +}); diff --git a/node_modules/resolve/test/pathfilter/deep_ref/main.js b/node_modules/resolve/test/pathfilter/deep_ref/main.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/precedence.js b/node_modules/resolve/test/precedence.js new file mode 100644 index 0000000..2febb59 --- /dev/null +++ b/node_modules/resolve/test/precedence.js @@ -0,0 +1,23 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('precedence', function (t) { + t.plan(3); + var dir = path.join(__dirname, 'precedence/aaa'); + + resolve('./', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, 'index.js')); + t.equal(pkg.name, 'resolve'); + }); +}); + +test('./ should not load ${dir}.js', function (t) { // eslint-disable-line no-template-curly-in-string + t.plan(1); + var dir = path.join(__dirname, 'precedence/bbb'); + + resolve('./', { basedir: dir }, function (err, res, pkg) { + t.ok(err); + }); +}); diff --git a/node_modules/resolve/test/precedence/aaa.js b/node_modules/resolve/test/precedence/aaa.js new file mode 100644 index 0000000..b83a3e7 --- /dev/null +++ b/node_modules/resolve/test/precedence/aaa.js @@ -0,0 +1 @@ +module.exports = 'wtf'; diff --git a/node_modules/resolve/test/precedence/aaa/index.js b/node_modules/resolve/test/precedence/aaa/index.js new file mode 100644 index 0000000..e0f8f6a --- /dev/null +++ b/node_modules/resolve/test/precedence/aaa/index.js @@ -0,0 +1 @@ +module.exports = 'okok'; diff --git a/node_modules/resolve/test/precedence/aaa/main.js b/node_modules/resolve/test/precedence/aaa/main.js new file mode 100644 index 0000000..93542a9 --- /dev/null +++ b/node_modules/resolve/test/precedence/aaa/main.js @@ -0,0 +1 @@ +console.log(require('./')); diff --git a/node_modules/resolve/test/precedence/bbb.js b/node_modules/resolve/test/precedence/bbb.js new file mode 100644 index 0000000..2298f47 --- /dev/null +++ b/node_modules/resolve/test/precedence/bbb.js @@ -0,0 +1 @@ +module.exports = '>_<'; diff --git a/node_modules/resolve/test/precedence/bbb/main.js b/node_modules/resolve/test/precedence/bbb/main.js new file mode 100644 index 0000000..716b81d --- /dev/null +++ b/node_modules/resolve/test/precedence/bbb/main.js @@ -0,0 +1 @@ +console.log(require('./')); // should throw diff --git a/node_modules/resolve/test/resolver.js b/node_modules/resolve/test/resolver.js new file mode 100644 index 0000000..aa36ee1 --- /dev/null +++ b/node_modules/resolve/test/resolver.js @@ -0,0 +1,450 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('async foo', function (t) { + t.plan(12); + var dir = path.join(__dirname, 'resolver'); + + resolve('./foo', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.name, 'resolve'); + }); + + resolve('./foo.js', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.name, 'resolve'); + }); + + resolve('./foo', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.main, 'resolver'); + }); + + resolve('./foo.js', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg.main, 'resolver'); + }); + + resolve('./foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + }); + + resolve('foo', { basedir: dir }, function (err) { + t.equal(err.message, "Cannot find module 'foo' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + // Test that filename is reported as the "from" value when passed. + resolve('foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err) { + t.equal(err.message, "Cannot find module 'foo' from '" + path.join(dir, 'baz.js') + "'"); + }); +}); + +test('bar', function (t) { + t.plan(6); + var dir = path.join(__dirname, 'resolver'); + + resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg, undefined); + }); + + resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg, undefined); + }); + + resolve('foo', { basedir: dir + '/bar', 'package': { main: 'bar' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg.main, 'bar'); + }); +}); + +test('baz', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'resolver'); + + resolve('./baz', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'baz/quux.js')); + t.equal(pkg.main, 'quux.js'); + }); + + resolve('./baz', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'baz/quux.js')); + t.equal(pkg.main, 'quux.js'); + }); +}); + +test('biz', function (t) { + t.plan(24); + var dir = path.join(__dirname, 'resolver/biz/node_modules'); + + resolve('./grux', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg, undefined); + }); + + resolve('./grux', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg.main, 'biz'); + }); + + resolve('./garply', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('./garply', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('tiv', { basedir: dir + '/grux' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg, undefined); + }); + + resolve('tiv', { basedir: dir + '/grux', 'package': { main: 'grux' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg.main, 'grux'); + }); + + resolve('tiv', { basedir: dir + '/garply' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg, undefined); + }); + + resolve('tiv', { basedir: dir + '/garply', 'package': { main: './lib' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('grux', { basedir: dir + '/tiv' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg, undefined); + }); + + resolve('grux', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg.main, 'tiv'); + }); + + resolve('garply', { basedir: dir + '/tiv' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('garply', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); +}); + +test('quux', function (t) { + t.plan(2); + var dir = path.join(__dirname, 'resolver/quux'); + + resolve('./foo', { basedir: dir, 'package': { main: 'quux' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo/index.js')); + t.equal(pkg.main, 'quux'); + }); +}); + +test('normalize', function (t) { + t.plan(2); + var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); + + resolve('../grux', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'index.js')); + t.equal(pkg, undefined); + }); +}); + +test('cup', function (t) { + t.plan(5); + var dir = path.join(__dirname, 'resolver'); + + resolve('./cup', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'cup.coffee')); + }); + + resolve('./cup.coffee', { basedir: dir }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'cup.coffee')); + }); + + resolve('./cup', { basedir: dir, extensions: ['.js'] }, function (err, res) { + t.equal(err.message, "Cannot find module './cup' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + // Test that filename is reported as the "from" value when passed. + resolve('./cup', { basedir: dir, extensions: ['.js'], filename: path.join(dir, 'cupboard.js') }, function (err, res) { + t.equal(err.message, "Cannot find module './cup' from '" + path.join(dir, 'cupboard.js') + "'"); + }); +}); + +test('mug', function (t) { + t.plan(3); + var dir = path.join(__dirname, 'resolver'); + + resolve('./mug', { basedir: dir }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'mug.js')); + }); + + resolve('./mug', { basedir: dir, extensions: ['.coffee', '.js'] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, '/mug.coffee')); + }); + + resolve('./mug', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) { + t.equal(res, path.join(dir, '/mug.js')); + }); +}); + +test('other path', function (t) { + t.plan(6); + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'bar'); + var otherDir = path.join(resolverDir, 'other_path'); + + resolve('root', { basedir: dir, paths: [otherDir] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'other_path/root.js')); + }); + + resolve('lib/other-lib', { basedir: dir, paths: [otherDir] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'other_path/lib/other-lib.js')); + }); + + resolve('root', { basedir: dir }, function (err, res) { + t.equal(err.message, "Cannot find module 'root' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('zzz', { basedir: dir, paths: [otherDir] }, function (err, res) { + t.equal(err.message, "Cannot find module 'zzz' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('path iterator', function (t) { + t.plan(2); + + var resolverDir = path.join(__dirname, 'resolver'); + + var exactIterator = function (x, start, getPackageCandidates, opts) { + return [path.join(resolverDir, x)]; + }; + + resolve('baz', { packageIterator: exactIterator }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'baz/quux.js')); + t.equal(pkg && pkg.name, 'baz'); + }); +}); + +test('incorrect main', function (t) { + t.plan(1); + + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'incorrect_main'); + + resolve('./incorrect_main', { basedir: resolverDir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'index.js')); + }); +}); + +test('without basedir', function (t) { + t.plan(1); + + var dir = path.join(__dirname, 'resolver/without_basedir'); + var tester = require(path.join(dir, 'main.js')); + + tester(t, function (err, res, pkg) { + if (err) { + t.fail(err); + } else { + t.equal(res, path.join(dir, 'node_modules/mymodule.js')); + } + }); +}); + +test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { + t.plan(2); + + var dir = path.join(__dirname, 'resolver'); + + resolve('./foo', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo.js')); + }); + + resolve('./foo/', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); +}); + +test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { + t.plan(2); + + var dir = path.join(__dirname, 'resolver'); + + resolve('./', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); + + resolve('.', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); +}); + +test('async: #121 - treating an existing file as a dir when no basedir', function (t) { + var testFile = path.basename(__filename); + + t.test('sanity check', function (st) { + st.plan(1); + resolve('./' + testFile, function (err, res, pkg) { + if (err) t.fail(err); + st.equal(res, __filename, 'sanity check'); + }); + }); + + t.test('with a fake directory', function (st) { + st.plan(4); + + resolve('./' + testFile + '/blah', function (err, res, pkg) { + st.ok(err, 'there is an error'); + st.notOk(res, 'no result'); + + st.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + st.equal( + err && err.message, + 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', + 'can not find nonexistent module' + ); + st.end(); + }); + }); + + t.end(); +}); + +test('async dot main', function (t) { + var start = new Date(); + t.plan(3); + resolve('./resolver/dot_main', function (err, ret) { + t.notOk(err); + t.equal(ret, path.join(__dirname, 'resolver/dot_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); + }); +}); + +test('async dot slash main', function (t) { + var start = new Date(); + t.plan(3); + resolve('./resolver/dot_slash_main', function (err, ret) { + t.notOk(err); + t.equal(ret, path.join(__dirname, 'resolver/dot_slash_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); + }); +}); + +test('not a directory', function (t) { + t.plan(6); + var path = './foo'; + resolve(path, { basedir: __filename }, function (err, res, pkg) { + t.ok(err, 'a non-directory errors'); + t.equal(arguments.length, 1); + t.equal(res, undefined); + t.equal(pkg, undefined); + + t.equal(err && err.message, 'Cannot find module \'' + path + '\' from \'' + __filename + '\''); + t.equal(err && err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('non-string "main" field in package.json', function (t) { + t.plan(5); + + var dir = path.join(__dirname, 'resolver'); + resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + t.equal(res, undefined, 'res is undefined'); + t.equal(pkg, undefined, 'pkg is undefined'); + }); +}); + +test('non-string "main" field in package.json', function (t) { + t.plan(5); + + var dir = path.join(__dirname, 'resolver'); + resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + t.equal(res, undefined, 'res is undefined'); + t.equal(pkg, undefined, 'pkg is undefined'); + }); +}); + +test('browser field in package.json', function (t) { + t.plan(3); + + var dir = path.join(__dirname, 'resolver'); + resolve( + './browser_field', + { + basedir: dir, + packageFilter: function packageFilter(pkg) { + if (pkg.browser) { + pkg.main = pkg.browser; // eslint-disable-line no-param-reassign + delete pkg.browser; // eslint-disable-line no-param-reassign + } + return pkg; + } + }, + function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'browser_field', 'b.js')); + t.equal(pkg && pkg.main, 'b'); + t.equal(pkg && pkg.browser, undefined); + } + ); +}); diff --git a/node_modules/resolve/test/resolver/baz/doom.js b/node_modules/resolve/test/resolver/baz/doom.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/baz/package.json b/node_modules/resolve/test/resolver/baz/package.json new file mode 100644 index 0000000..2f77720 --- /dev/null +++ b/node_modules/resolve/test/resolver/baz/package.json @@ -0,0 +1,4 @@ +{ + "name": "baz", + "main": "quux.js" +} diff --git a/node_modules/resolve/test/resolver/baz/quux.js b/node_modules/resolve/test/resolver/baz/quux.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/node_modules/resolve/test/resolver/baz/quux.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/browser_field/a.js b/node_modules/resolve/test/resolver/browser_field/a.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/browser_field/b.js b/node_modules/resolve/test/resolver/browser_field/b.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/browser_field/package.json b/node_modules/resolve/test/resolver/browser_field/package.json new file mode 100644 index 0000000..bf406f0 --- /dev/null +++ b/node_modules/resolve/test/resolver/browser_field/package.json @@ -0,0 +1,5 @@ +{ + "name": "browser_field", + "main": "a", + "browser": "b" +} diff --git a/node_modules/resolve/test/resolver/cup.coffee b/node_modules/resolve/test/resolver/cup.coffee new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/node_modules/resolve/test/resolver/cup.coffee @@ -0,0 +1 @@ + diff --git a/node_modules/resolve/test/resolver/dot_main/index.js b/node_modules/resolve/test/resolver/dot_main/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_main/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/dot_main/package.json b/node_modules/resolve/test/resolver/dot_main/package.json new file mode 100644 index 0000000..d7f4fc8 --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "." +} diff --git a/node_modules/resolve/test/resolver/dot_slash_main/index.js b/node_modules/resolve/test/resolver/dot_slash_main/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_slash_main/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/dot_slash_main/package.json b/node_modules/resolve/test/resolver/dot_slash_main/package.json new file mode 100644 index 0000000..f51287b --- /dev/null +++ b/node_modules/resolve/test/resolver/dot_slash_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "./" +} diff --git a/node_modules/resolve/test/resolver/foo.js b/node_modules/resolve/test/resolver/foo.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/node_modules/resolve/test/resolver/foo.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/incorrect_main/index.js b/node_modules/resolve/test/resolver/incorrect_main/index.js new file mode 100644 index 0000000..bc1fb0a --- /dev/null +++ b/node_modules/resolve/test/resolver/incorrect_main/index.js @@ -0,0 +1,2 @@ +// this is the actual main file 'index.js', not 'wrong.js' like the package.json would indicate +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/incorrect_main/package.json b/node_modules/resolve/test/resolver/incorrect_main/package.json new file mode 100644 index 0000000..b718804 --- /dev/null +++ b/node_modules/resolve/test/resolver/incorrect_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "wrong.js" +} diff --git a/node_modules/resolve/test/resolver/invalid_main/package.json b/node_modules/resolve/test/resolver/invalid_main/package.json new file mode 100644 index 0000000..0cf8279 --- /dev/null +++ b/node_modules/resolve/test/resolver/invalid_main/package.json @@ -0,0 +1,7 @@ +{ + "name": "invalid main", + "main": [ + "why is this a thing", + "srsly omg wtf" + ] +} diff --git a/node_modules/resolve/test/resolver/mug.coffee b/node_modules/resolve/test/resolver/mug.coffee new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/mug.js b/node_modules/resolve/test/resolver/mug.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/multirepo/lerna.json b/node_modules/resolve/test/resolver/multirepo/lerna.json new file mode 100644 index 0000000..d6707ca --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/lerna.json @@ -0,0 +1,6 @@ +{ + "packages": [ + "packages/*" + ], + "version": "0.0.0" +} diff --git a/node_modules/resolve/test/resolver/multirepo/package.json b/node_modules/resolve/test/resolver/multirepo/package.json new file mode 100644 index 0000000..8508f9d --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/package.json @@ -0,0 +1,20 @@ +{ + "name": "monorepo-symlink-test", + "private": true, + "version": "0.0.0", + "description": "", + "main": "index.js", + "scripts": { + "postinstall": "lerna bootstrap", + "test": "node packages/package-a" + }, + "author": "", + "license": "MIT", + "dependencies": { + "jquery": "^3.3.1", + "resolve": "../../../" + }, + "devDependencies": { + "lerna": "^3.4.3" + } +} diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js b/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js new file mode 100644 index 0000000..8875a32 --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js @@ -0,0 +1,35 @@ +'use strict'; + +var assert = require('assert'); +var path = require('path'); +var resolve = require('resolve'); + +var basedir = __dirname + '/node_modules/@my-scope/package-b'; + +var expected = path.join(__dirname, '../../node_modules/jquery/dist/jquery.js'); + +/* + * preserveSymlinks === false + * will search NPM package from + * - packages/package-b/node_modules + * - packages/node_modules + * - node_modules + */ +assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: false }), expected); +assert.equal(resolve.sync('../../node_modules/jquery', { basedir: basedir, preserveSymlinks: false }), expected); + +/* + * preserveSymlinks === true + * will search NPM package from + * - packages/package-a/node_modules/@my-scope/packages/package-b/node_modules + * - packages/package-a/node_modules/@my-scope/packages/node_modules + * - packages/package-a/node_modules/@my-scope/node_modules + * - packages/package-a/node_modules/node_modules + * - packages/package-a/node_modules + * - packages/node_modules + * - node_modules + */ +assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: true }), expected); +assert.equal(resolve.sync('../../../../../node_modules/jquery', { basedir: basedir, preserveSymlinks: true }), expected); + +console.log(' * all monorepo paths successfully resolved through symlinks'); diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json b/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json new file mode 100644 index 0000000..204de51 --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json @@ -0,0 +1,14 @@ +{ + "name": "@my-scope/package-a", + "version": "0.0.0", + "private": true, + "description": "", + "license": "MIT", + "main": "index.js", + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "dependencies": { + "@my-scope/package-b": "^0.0.0" + } +} diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js b/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json b/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json new file mode 100644 index 0000000..f57c3b5 --- /dev/null +++ b/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json @@ -0,0 +1,14 @@ +{ + "name": "@my-scope/package-b", + "private": true, + "version": "0.0.0", + "description": "", + "license": "MIT", + "main": "index.js", + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "dependencies": { + "@my-scope/package-a": "^0.0.0" + } +} diff --git a/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js b/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js new file mode 100644 index 0000000..9b4846a --- /dev/null +++ b/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js @@ -0,0 +1,26 @@ +var a = require.resolve('buffer/').replace(process.cwd(), '$CWD'); +var b; +var c; + +var test = function test() { + console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false')); + console.log(b, ': preserveSymlinks true'); + console.log(c, ': preserveSymlinks false'); + + if (a !== b && a !== c) { + throw 'async: no match'; + } + console.log('async: success! a matched either b or c\n'); +}; + +require('resolve')('buffer/', { preserveSymlinks: true }, function (err, result) { + if (err) { throw err; } + b = result.replace(process.cwd(), '$CWD'); + if (b && c) { test(); } +}); +require('resolve')('buffer/', { preserveSymlinks: false }, function (err, result) { + if (err) { throw err; } + c = result.replace(process.cwd(), '$CWD'); + if (b && c) { test(); } +}); + diff --git a/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json b/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json new file mode 100644 index 0000000..acfe9e9 --- /dev/null +++ b/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json @@ -0,0 +1,15 @@ +{ + "name": "mylib", + "version": "0.0.0", + "description": "", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "buffer": "*" + } +} diff --git a/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js b/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js new file mode 100644 index 0000000..3283efc --- /dev/null +++ b/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js @@ -0,0 +1,12 @@ +var a = require.resolve('buffer/').replace(process.cwd(), '$CWD'); +var b = require('resolve').sync('buffer/', { preserveSymlinks: true }).replace(process.cwd(), '$CWD'); +var c = require('resolve').sync('buffer/', { preserveSymlinks: false }).replace(process.cwd(), '$CWD'); + +console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false')); +console.log(b, ': preserveSymlinks true'); +console.log(c, ': preserveSymlinks false'); + +if (a !== b && a !== c) { + throw 'sync: no match'; +} +console.log('sync: success! a matched either b or c\n'); diff --git a/node_modules/resolve/test/resolver/other_path/lib/other-lib.js b/node_modules/resolve/test/resolver/other_path/lib/other-lib.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/other_path/root.js b/node_modules/resolve/test/resolver/other_path/root.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/quux/foo/index.js b/node_modules/resolve/test/resolver/quux/foo/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/node_modules/resolve/test/resolver/quux/foo/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/same_names/foo.js b/node_modules/resolve/test/resolver/same_names/foo.js new file mode 100644 index 0000000..888cae3 --- /dev/null +++ b/node_modules/resolve/test/resolver/same_names/foo.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/node_modules/resolve/test/resolver/same_names/foo/index.js b/node_modules/resolve/test/resolver/same_names/foo/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/node_modules/resolve/test/resolver/same_names/foo/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js b/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep b/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/resolver/symlinked/package/bar.js b/node_modules/resolve/test/resolver/symlinked/package/bar.js new file mode 100644 index 0000000..cb1c2c0 --- /dev/null +++ b/node_modules/resolve/test/resolver/symlinked/package/bar.js @@ -0,0 +1 @@ +module.exports = 'bar'; diff --git a/node_modules/resolve/test/resolver/symlinked/package/package.json b/node_modules/resolve/test/resolver/symlinked/package/package.json new file mode 100644 index 0000000..8e1b585 --- /dev/null +++ b/node_modules/resolve/test/resolver/symlinked/package/package.json @@ -0,0 +1,3 @@ +{ + "main": "bar.js" +} \ No newline at end of file diff --git a/node_modules/resolve/test/resolver/without_basedir/main.js b/node_modules/resolve/test/resolver/without_basedir/main.js new file mode 100644 index 0000000..5b31975 --- /dev/null +++ b/node_modules/resolve/test/resolver/without_basedir/main.js @@ -0,0 +1,5 @@ +var resolve = require('../../../'); + +module.exports = function (t, cb) { + resolve('mymodule', null, cb); +}; diff --git a/node_modules/resolve/test/resolver_sync.js b/node_modules/resolve/test/resolver_sync.js new file mode 100644 index 0000000..3082c96 --- /dev/null +++ b/node_modules/resolve/test/resolver_sync.js @@ -0,0 +1,358 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('foo', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./foo', { basedir: dir }), + path.join(dir, 'foo.js') + ); + + t.equal( + resolve.sync('./foo.js', { basedir: dir }), + path.join(dir, 'foo.js') + ); + + t.equal( + resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }), + path.join(dir, 'foo.js') + ); + + t.throws(function () { + resolve.sync('foo', { basedir: dir }); + }); + + // Test that filename is reported as the "from" value when passed. + t.throws( + function () { + resolve.sync('foo', { basedir: dir, filename: path.join(dir, 'bar.js') }); + }, + { + name: 'Error', + message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'" + } + ); + + t.end(); +}); + +test('bar', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('foo', { basedir: path.join(dir, 'bar') }), + path.join(dir, 'bar/node_modules/foo/index.js') + ); + t.end(); +}); + +test('baz', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./baz', { basedir: dir }), + path.join(dir, 'baz/quux.js') + ); + t.end(); +}); + +test('biz', function (t) { + var dir = path.join(__dirname, 'resolver/biz/node_modules'); + t.equal( + resolve.sync('./grux', { basedir: dir }), + path.join(dir, 'grux/index.js') + ); + + t.equal( + resolve.sync('tiv', { basedir: path.join(dir, 'grux') }), + path.join(dir, 'tiv/index.js') + ); + + t.equal( + resolve.sync('grux', { basedir: path.join(dir, 'tiv') }), + path.join(dir, 'grux/index.js') + ); + t.end(); +}); + +test('normalize', function (t) { + var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); + t.equal( + resolve.sync('../grux', { basedir: dir }), + path.join(dir, 'index.js') + ); + t.end(); +}); + +test('cup', function (t) { + var dir = path.join(__dirname, 'resolver'); + t.equal( + resolve.sync('./cup', { + basedir: dir, + extensions: ['.js', '.coffee'] + }), + path.join(dir, 'cup.coffee') + ); + + t.equal( + resolve.sync('./cup.coffee', { basedir: dir }), + path.join(dir, 'cup.coffee') + ); + + t.throws(function () { + resolve.sync('./cup', { + basedir: dir, + extensions: ['.js'] + }); + }); + + t.end(); +}); + +test('mug', function (t) { + var dir = path.join(__dirname, 'resolver'); + t.equal( + resolve.sync('./mug', { basedir: dir }), + path.join(dir, 'mug.js') + ); + + t.equal( + resolve.sync('./mug', { + basedir: dir, + extensions: ['.coffee', '.js'] + }), + path.join(dir, 'mug.coffee') + ); + + t.equal( + resolve.sync('./mug', { + basedir: dir, + extensions: ['.js', '.coffee'] + }), + path.join(dir, 'mug.js') + ); + + t.end(); +}); + +test('other path', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'bar'); + var otherDir = path.join(resolverDir, 'other_path'); + + t.equal( + resolve.sync('root', { + basedir: dir, + paths: [otherDir] + }), + path.join(resolverDir, 'other_path/root.js') + ); + + t.equal( + resolve.sync('lib/other-lib', { + basedir: dir, + paths: [otherDir] + }), + path.join(resolverDir, 'other_path/lib/other-lib.js') + ); + + t.throws(function () { + resolve.sync('root', { basedir: dir }); + }); + + t.throws(function () { + resolve.sync('zzz', { + basedir: dir, + paths: [otherDir] + }); + }); + + t.end(); +}); + +test('path iterator', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + + var exactIterator = function (x, start, getPackageCandidates, opts) { + return [path.join(resolverDir, x)]; + }; + + t.equal( + resolve.sync('baz', { packageIterator: exactIterator }), + path.join(resolverDir, 'baz/quux.js') + ); + + t.end(); +}); + +test('incorrect main', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'incorrect_main'); + + t.equal( + resolve.sync('./incorrect_main', { basedir: resolverDir }), + path.join(dir, 'index.js') + ); + + t.end(); +}); + +var stubStatSync = function stubStatSync(fn) { + var fs = require('fs'); + var statSync = fs.statSync; + try { + fs.statSync = function () { + throw new EvalError('Unknown Error'); + }; + return fn(); + } finally { + fs.statSync = statSync; + } +}; + +test('#79 - re-throw non ENOENT errors from stat', function (t) { + var dir = path.join(__dirname, 'resolver'); + + stubStatSync(function () { + t.throws(function () { + resolve.sync('foo', { basedir: dir }); + }, /Unknown Error/); + }); + + t.end(); +}); + +test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./foo', { basedir: path.join(dir, 'same_names') }), + path.join(dir, 'same_names/foo.js') + ); + t.equal( + resolve.sync('./foo/', { basedir: path.join(dir, 'same_names') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.end(); +}); + +test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./', { basedir: path.join(dir, 'same_names/foo') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.equal( + resolve.sync('.', { basedir: path.join(dir, 'same_names/foo') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.end(); +}); + +test('sync: #121 - treating an existing file as a dir when no basedir', function (t) { + var testFile = path.basename(__filename); + + t.test('sanity check', function (st) { + st.equal( + resolve.sync('./' + testFile), + __filename, + 'sanity check' + ); + st.end(); + }); + + t.test('with a fake directory', function (st) { + function run() { return resolve.sync('./' + testFile + '/blah'); } + + st.throws(run, 'throws an error'); + + try { + run(); + } catch (e) { + st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + st.equal( + e.message, + 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', + 'can not find nonexistent module' + ); + } + + st.end(); + }); + + t.end(); +}); + +test('sync dot main', function (t) { + var start = new Date(); + t.equal(resolve.sync('./resolver/dot_main'), path.join(__dirname, 'resolver/dot_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('sync dot slash main', function (t) { + var start = new Date(); + t.equal(resolve.sync('./resolver/dot_slash_main'), path.join(__dirname, 'resolver/dot_slash_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('not a directory', function (t) { + var path = './foo'; + try { + resolve.sync(path, { basedir: __filename }); + t.fail(); + } catch (err) { + t.ok(err, 'a non-directory errors'); + t.equal(err && err.message, 'Cannot find module \'' + path + "' from '" + __filename + "'"); + t.equal(err && err.code, 'MODULE_NOT_FOUND'); + } + t.end(); +}); + +test('non-string "main" field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + try { + var result = resolve.sync('./invalid_main', { basedir: dir }); + t.equal(result, undefined, 'result should not exist'); + t.fail('should not get here'); + } catch (err) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + } + t.end(); +}); + +test('non-string "main" field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + try { + var result = resolve.sync('./invalid_main', { basedir: dir }); + t.equal(result, undefined, 'result should not exist'); + t.fail('should not get here'); + } catch (err) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + } + t.end(); +}); + +test('browser field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + var res = resolve.sync('./browser_field', { + basedir: dir, + packageFilter: function packageFilter(pkg) { + if (pkg.browser) { + pkg.main = pkg.browser; // eslint-disable-line no-param-reassign + delete pkg.browser; // eslint-disable-line no-param-reassign + } + return pkg; + } + }); + t.equal(res, path.join(dir, 'browser_field', 'b.js')); + t.end(); +}); diff --git a/node_modules/resolve/test/shadowed_core.js b/node_modules/resolve/test/shadowed_core.js new file mode 100644 index 0000000..98c52a7 --- /dev/null +++ b/node_modules/resolve/test/shadowed_core.js @@ -0,0 +1,38 @@ +var test = require('tape'); +var resolve = require('../'); +var path = require('path'); + +test('shadowed core modules still return core module', function (t) { + t.plan(2); + + resolve('util', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) { + t.ifError(err); + t.equal(res, 'util'); + }); +}); + +test('shadowed core modules still return core module [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core') }); + + t.equal(res, 'util'); +}); + +test('shadowed core modules return shadow when appending `/`', function (t) { + t.plan(2); + + resolve('util/', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); + }); +}); + +test('shadowed core modules return shadow when appending `/` [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util/', { basedir: path.join(__dirname, 'shadowed_core') }); + + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); +}); + diff --git a/node_modules/resolve/test/shadowed_core/node_modules/util/index.js b/node_modules/resolve/test/shadowed_core/node_modules/util/index.js new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/resolve/test/subdirs.js b/node_modules/resolve/test/subdirs.js new file mode 100644 index 0000000..b7b8450 --- /dev/null +++ b/node_modules/resolve/test/subdirs.js @@ -0,0 +1,13 @@ +var test = require('tape'); +var resolve = require('../'); +var path = require('path'); + +test('subdirs', function (t) { + t.plan(2); + + var dir = path.join(__dirname, '/subdirs'); + resolve('a/b/c/x.json', { basedir: dir }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(dir, 'node_modules/a/b/c/x.json')); + }); +}); diff --git a/node_modules/resolve/test/symlinks.js b/node_modules/resolve/test/symlinks.js new file mode 100644 index 0000000..152d14e --- /dev/null +++ b/node_modules/resolve/test/symlinks.js @@ -0,0 +1,173 @@ +var path = require('path'); +var fs = require('fs'); +var test = require('tape'); +var map = require('array.prototype.map'); +var resolve = require('../'); + +var symlinkDir = path.join(__dirname, 'resolver', 'symlinked', 'symlink'); +var packageDir = path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'package'); +var modADir = path.join(__dirname, 'symlinks', 'source', 'node_modules', 'mod-a'); +var symlinkModADir = path.join(__dirname, 'symlinks', 'dest', 'node_modules', 'mod-a'); +try { + fs.unlinkSync(symlinkDir); +} catch (err) {} +try { + fs.unlinkSync(packageDir); +} catch (err) {} +try { + fs.unlinkSync(modADir); +} catch (err) {} +try { + fs.unlinkSync(symlinkModADir); +} catch (err) {} + +try { + fs.symlinkSync('./_/symlink_target', symlinkDir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, 'resolver', 'symlinked', '_', 'symlink_target') + '\\', symlinkDir, 'junction'); +} +try { + fs.symlinkSync('../../package', packageDir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, '..', '..', 'package') + '\\', packageDir, 'junction'); +} +try { + fs.symlinkSync('../../source/node_modules/mod-a', symlinkModADir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, '..', '..', 'source', 'node_modules', 'mod-a') + '\\', symlinkModADir, 'junction'); +} + +test('symlink', function (t) { + t.plan(2); + + resolve('foo', { basedir: symlinkDir, preserveSymlinks: false }, function (err, res, pkg) { + t.error(err); + t.equal(res, path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js')); + }); +}); + +test('sync symlink when preserveSymlinks = true', function (t) { + t.plan(4); + + resolve('foo', { basedir: symlinkDir }, function (err, res, pkg) { + t.ok(err, 'there is an error'); + t.notOk(res, 'no result'); + + t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + t.equal( + err && err.message, + 'Cannot find module \'foo\' from \'' + symlinkDir + '\'', + 'can not find nonexistent module' + ); + }); +}); + +test('sync symlink', function (t) { + var start = new Date(); + t.doesNotThrow(function () { + t.equal(resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }), path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js')); + }); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('sync symlink when preserveSymlinks = true', function (t) { + t.throws(function () { + resolve.sync('foo', { basedir: symlinkDir }); + }, /Cannot find module 'foo'/); + t.end(); +}); + +test('sync symlink from node_modules to other dir when preserveSymlinks = false', function (t) { + var basedir = path.join(__dirname, 'resolver', 'symlinked', '_'); + var fn = resolve.sync('package', { basedir: basedir, preserveSymlinks: false }); + + t.equal(fn, path.resolve(__dirname, 'resolver/symlinked/package/bar.js')); + t.end(); +}); + +test('async symlink from node_modules to other dir when preserveSymlinks = false', function (t) { + t.plan(2); + var basedir = path.join(__dirname, 'resolver', 'symlinked', '_'); + resolve('package', { basedir: basedir, preserveSymlinks: false }, function (err, result) { + t.notOk(err, 'no error'); + t.equal(result, path.resolve(__dirname, 'resolver/symlinked/package/bar.js')); + }); +}); + +test('packageFilter', function (t) { + function relative(x) { + return path.relative(__dirname, x); + } + + function testPackageFilter(preserveSymlinks) { + return function (st) { + st.plan('is 1.x' ? 3 : 5); // eslint-disable-line no-constant-condition + + var destMain = 'symlinks/dest/node_modules/mod-a/index.js'; + var destPkg = 'symlinks/dest/node_modules/mod-a/package.json'; + var sourceMain = 'symlinks/source/node_modules/mod-a/index.js'; + var sourcePkg = 'symlinks/source/node_modules/mod-a/package.json'; + var destDir = path.join(__dirname, 'symlinks', 'dest'); + + /* eslint multiline-comment-style: 0 */ + /* v2.x will restore these tests + var packageFilterPath = []; + var actualPath = resolve.sync('mod-a', { + basedir: destDir, + preserveSymlinks: preserveSymlinks, + packageFilter: function (pkg, pkgfile, dir) { + packageFilterPath.push(pkgfile); + } + }); + st.equal( + relative(actualPath), + path.normalize(preserveSymlinks ? destMain : sourceMain), + 'sync: actual path is correct' + ); + st.deepEqual( + map(packageFilterPath, relative), + map(preserveSymlinks ? [destPkg, destPkg] : [sourcePkg, sourcePkg], path.normalize), + 'sync: packageFilter pkgfile arg is correct' + ); + */ + + var asyncPackageFilterPath = []; + resolve( + 'mod-a', + { + basedir: destDir, + preserveSymlinks: preserveSymlinks, + packageFilter: function (pkg, pkgfile) { + asyncPackageFilterPath.push(pkgfile); + } + }, + function (err, actualPath) { + st.error(err, 'no error'); + st.equal( + relative(actualPath), + path.normalize(preserveSymlinks ? destMain : sourceMain), + 'async: actual path is correct' + ); + st.deepEqual( + map(asyncPackageFilterPath, relative), + map( + preserveSymlinks ? [destPkg, destPkg, destPkg] : [sourcePkg, sourcePkg, sourcePkg], + path.normalize + ), + 'async: packageFilter pkgfile arg is correct' + ); + } + ); + }; + } + + t.test('preserveSymlinks: false', testPackageFilter(false)); + + t.test('preserveSymlinks: true', testPackageFilter(true)); + + t.end(); +}); diff --git a/node_modules/ret/LICENSE b/node_modules/ret/LICENSE new file mode 100644 index 0000000..b351ee8 --- /dev/null +++ b/node_modules/ret/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011 by Roly Fentanes + +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/ret/README.md b/node_modules/ret/README.md new file mode 100644 index 0000000..28563e1 --- /dev/null +++ b/node_modules/ret/README.md @@ -0,0 +1,183 @@ +# Regular Expression Tokenizer + +Tokenizes strings that represent a regular expressions. + +[![Build Status](https://secure.travis-ci.org/fent/ret.js.svg)](http://travis-ci.org/fent/ret.js) +[![Dependency Status](https://david-dm.org/fent/ret.js.svg)](https://david-dm.org/fent/ret.js) +[![codecov](https://codecov.io/gh/fent/ret.js/branch/master/graph/badge.svg)](https://codecov.io/gh/fent/ret.js) + +# Usage + +```js +var ret = require('ret'); + +var tokens = ret(/foo|bar/.source); +``` + +`tokens` will contain the following object + +```js +{ + "type": ret.types.ROOT + "options": [ + [ { "type": ret.types.CHAR, "value", 102 }, + { "type": ret.types.CHAR, "value", 111 }, + { "type": ret.types.CHAR, "value", 111 } ], + [ { "type": ret.types.CHAR, "value", 98 }, + { "type": ret.types.CHAR, "value", 97 }, + { "type": ret.types.CHAR, "value", 114 } ] + ] +} +``` + +# Token Types + +`ret.types` is a collection of the various token types exported by ret. + +### ROOT + +Only used in the root of the regexp. This is needed due to the posibility of the root containing a pipe `|` character. In that case, the token will have an `options` key that will be an array of arrays of tokens. If not, it will contain a `stack` key that is an array of tokens. + +```js +{ + "type": ret.types.ROOT, + "stack": [token1, token2...], +} +``` + +```js +{ + "type": ret.types.ROOT, + "options" [ + [token1, token2...], + [othertoken1, othertoken2...] + ... + ], +} +``` + +### GROUP + +Groups contain tokens that are inside of a parenthesis. If the group begins with `?` followed by another character, it's a special type of group. A ':' tells the group not to be remembered when `exec` is used. '=' means the previous token matches only if followed by this group, and '!' means the previous token matches only if NOT followed. + +Like root, it can contain an `options` key instead of `stack` if there is a pipe. + +```js +{ + "type": ret.types.GROUP, + "remember" true, + "followedBy": false, + "notFollowedBy": false, + "stack": [token1, token2...], +} +``` + +```js +{ + "type": ret.types.GROUP, + "remember" true, + "followedBy": false, + "notFollowedBy": false, + "options" [ + [token1, token2...], + [othertoken1, othertoken2...] + ... + ], +} +``` + +### POSITION + +`\b`, `\B`, `^`, and `$` specify positions in the regexp. + +```js +{ + "type": ret.types.POSITION, + "value": "^", +} +``` + +### SET + +Contains a key `set` specifying what tokens are allowed and a key `not` specifying if the set should be negated. A set can contain other sets, ranges, and characters. + +```js +{ + "type": ret.types.SET, + "set": [token1, token2...], + "not": false, +} +``` + +### RANGE + +Used in set tokens to specify a character range. `from` and `to` are character codes. + +```js +{ + "type": ret.types.RANGE, + "from": 97, + "to": 122, +} +``` + +### REPETITION + +```js +{ + "type": ret.types.REPETITION, + "min": 0, + "max": Infinity, + "value": token, +} +``` + +### REFERENCE + +References a group token. `value` is 1-9. + +```js +{ + "type": ret.types.REFERENCE, + "value": 1, +} +``` + +### CHAR + +Represents a single character token. `value` is the character code. This might seem a bit cluttering instead of concatenating characters together. But since repetition tokens only repeat the last token and not the last clause like the pipe, it's simpler to do it this way. + +```js +{ + "type": ret.types.CHAR, + "value": 123, +} +``` + +## Errors + +ret.js will throw errors if given a string with an invalid regular expression. All possible errors are + +* Invalid group. When a group with an immediate `?` character is followed by an invalid character. It can only be followed by `!`, `=`, or `:`. Example: `/(?_abc)/` +* Nothing to repeat. Thrown when a repetitional token is used as the first token in the current clause, as in right in the beginning of the regexp or group, or right after a pipe. Example: `/foo|?bar/`, `/{1,3}foo|bar/`, `/foo(+bar)/` +* Unmatched ). A group was not opened, but was closed. Example: `/hello)2u/` +* Unterminated group. A group was not closed. Example: `/(1(23)4/` +* Unterminated character class. A custom character set was not closed. Example: `/[abc/` + + +# Install + + npm install ret + + +# Tests + +Tests are written with [vows](http://vowsjs.org/) + +```bash +npm test +``` + +# License + +MIT diff --git a/node_modules/ret/lib/index.js b/node_modules/ret/lib/index.js new file mode 100644 index 0000000..0e151c3 --- /dev/null +++ b/node_modules/ret/lib/index.js @@ -0,0 +1,282 @@ +var util = require('./util'); +var types = require('./types'); +var sets = require('./sets'); +var positions = require('./positions'); + + +module.exports = function(regexpStr) { + var i = 0, l, c, + start = { type: types.ROOT, stack: []}, + + // Keep track of last clause/group and stack. + lastGroup = start, + last = start.stack, + groupStack = []; + + + var repeatErr = function(i) { + util.error(regexpStr, 'Nothing to repeat at column ' + (i - 1)); + }; + + // Decode a few escaped characters. + var str = util.strToChars(regexpStr); + l = str.length; + + // Iterate through each character in string. + while (i < l) { + c = str[i++]; + + switch (c) { + // Handle escaped characters, inclues a few sets. + case '\\': + c = str[i++]; + + switch (c) { + case 'b': + last.push(positions.wordBoundary()); + break; + + case 'B': + last.push(positions.nonWordBoundary()); + break; + + case 'w': + last.push(sets.words()); + break; + + case 'W': + last.push(sets.notWords()); + break; + + case 'd': + last.push(sets.ints()); + break; + + case 'D': + last.push(sets.notInts()); + break; + + case 's': + last.push(sets.whitespace()); + break; + + case 'S': + last.push(sets.notWhitespace()); + break; + + default: + // Check if c is integer. + // In which case it's a reference. + if (/\d/.test(c)) { + last.push({ type: types.REFERENCE, value: parseInt(c, 10) }); + + // Escaped character. + } else { + last.push({ type: types.CHAR, value: c.charCodeAt(0) }); + } + } + + break; + + + // Positionals. + case '^': + last.push(positions.begin()); + break; + + case '$': + last.push(positions.end()); + break; + + + // Handle custom sets. + case '[': + // Check if this class is 'anti' i.e. [^abc]. + var not; + if (str[i] === '^') { + not = true; + i++; + } else { + not = false; + } + + // Get all the characters in class. + var classTokens = util.tokenizeClass(str.slice(i), regexpStr); + + // Increase index by length of class. + i += classTokens[1]; + last.push({ + type: types.SET, + set: classTokens[0], + not: not, + }); + + break; + + + // Class of any character except \n. + case '.': + last.push(sets.anyChar()); + break; + + + // Push group onto stack. + case '(': + // Create group. + var group = { + type: types.GROUP, + stack: [], + remember: true, + }; + + c = str[i]; + + // If if this is a special kind of group. + if (c === '?') { + c = str[i + 1]; + i += 2; + + // Match if followed by. + if (c === '=') { + group.followedBy = true; + + // Match if not followed by. + } else if (c === '!') { + group.notFollowedBy = true; + + } else if (c !== ':') { + util.error(regexpStr, + 'Invalid group, character \'' + c + + '\' after \'?\' at column ' + (i - 1)); + } + + group.remember = false; + } + + // Insert subgroup into current group stack. + last.push(group); + + // Remember the current group for when the group closes. + groupStack.push(lastGroup); + + // Make this new group the current group. + lastGroup = group; + last = group.stack; + break; + + + // Pop group out of stack. + case ')': + if (groupStack.length === 0) { + util.error(regexpStr, 'Unmatched ) at column ' + (i - 1)); + } + lastGroup = groupStack.pop(); + + // Check if this group has a PIPE. + // To get back the correct last stack. + last = lastGroup.options ? + lastGroup.options[lastGroup.options.length - 1] : lastGroup.stack; + break; + + + // Use pipe character to give more choices. + case '|': + // Create array where options are if this is the first PIPE + // in this clause. + if (!lastGroup.options) { + lastGroup.options = [lastGroup.stack]; + delete lastGroup.stack; + } + + // Create a new stack and add to options for rest of clause. + var stack = []; + lastGroup.options.push(stack); + last = stack; + break; + + + // Repetition. + // For every repetition, remove last element from last stack + // then insert back a RANGE object. + // This design is chosen because there could be more than + // one repetition symbols in a regex i.e. `a?+{2,3}`. + case '{': + var rs = /^(\d+)(,(\d+)?)?\}/.exec(str.slice(i)), min, max; + if (rs !== null) { + if (last.length === 0) { + repeatErr(i); + } + min = parseInt(rs[1], 10); + max = rs[2] ? rs[3] ? parseInt(rs[3], 10) : Infinity : min; + i += rs[0].length; + + last.push({ + type: types.REPETITION, + min: min, + max: max, + value: last.pop(), + }); + } else { + last.push({ + type: types.CHAR, + value: 123, + }); + } + break; + + case '?': + if (last.length === 0) { + repeatErr(i); + } + last.push({ + type: types.REPETITION, + min: 0, + max: 1, + value: last.pop(), + }); + break; + + case '+': + if (last.length === 0) { + repeatErr(i); + } + last.push({ + type: types.REPETITION, + min: 1, + max: Infinity, + value: last.pop(), + }); + break; + + case '*': + if (last.length === 0) { + repeatErr(i); + } + last.push({ + type: types.REPETITION, + min: 0, + max: Infinity, + value: last.pop(), + }); + break; + + + // Default is a character that is not `\[](){}?+*^$`. + default: + last.push({ + type: types.CHAR, + value: c.charCodeAt(0), + }); + } + + } + + // Check if any groups have not been closed. + if (groupStack.length !== 0) { + util.error(regexpStr, 'Unterminated group'); + } + + return start; +}; + +module.exports.types = types; diff --git a/node_modules/ret/lib/positions.js b/node_modules/ret/lib/positions.js new file mode 100644 index 0000000..80677ee --- /dev/null +++ b/node_modules/ret/lib/positions.js @@ -0,0 +1,17 @@ +var types = require('./types'); + +exports.wordBoundary = function() { + return { type: types.POSITION, value: 'b' }; +}; + +exports.nonWordBoundary = function() { + return { type: types.POSITION, value: 'B' }; +}; + +exports.begin = function() { + return { type: types.POSITION, value: '^' }; +}; + +exports.end = function() { + return { type: types.POSITION, value: '$' }; +}; diff --git a/node_modules/ret/lib/sets.js b/node_modules/ret/lib/sets.js new file mode 100644 index 0000000..5fb6be5 --- /dev/null +++ b/node_modules/ret/lib/sets.js @@ -0,0 +1,82 @@ +var types = require('./types'); + +var INTS = function() { + return [{ type: types.RANGE , from: 48, to: 57 }]; +}; + +var WORDS = function() { + return [ + { type: types.CHAR, value: 95 }, + { type: types.RANGE, from: 97, to: 122 }, + { type: types.RANGE, from: 65, to: 90 } + ].concat(INTS()); +}; + +var WHITESPACE = function() { + return [ + { type: types.CHAR, value: 9 }, + { type: types.CHAR, value: 10 }, + { type: types.CHAR, value: 11 }, + { type: types.CHAR, value: 12 }, + { type: types.CHAR, value: 13 }, + { type: types.CHAR, value: 32 }, + { type: types.CHAR, value: 160 }, + { type: types.CHAR, value: 5760 }, + { type: types.CHAR, value: 6158 }, + { type: types.CHAR, value: 8192 }, + { type: types.CHAR, value: 8193 }, + { type: types.CHAR, value: 8194 }, + { type: types.CHAR, value: 8195 }, + { type: types.CHAR, value: 8196 }, + { type: types.CHAR, value: 8197 }, + { type: types.CHAR, value: 8198 }, + { type: types.CHAR, value: 8199 }, + { type: types.CHAR, value: 8200 }, + { type: types.CHAR, value: 8201 }, + { type: types.CHAR, value: 8202 }, + { type: types.CHAR, value: 8232 }, + { type: types.CHAR, value: 8233 }, + { type: types.CHAR, value: 8239 }, + { type: types.CHAR, value: 8287 }, + { type: types.CHAR, value: 12288 }, + { type: types.CHAR, value: 65279 } + ]; +}; + +var NOTANYCHAR = function() { + return [ + { type: types.CHAR, value: 10 }, + { type: types.CHAR, value: 13 }, + { type: types.CHAR, value: 8232 }, + { type: types.CHAR, value: 8233 }, + ]; +}; + +// Predefined class objects. +exports.words = function() { + return { type: types.SET, set: WORDS(), not: false }; +}; + +exports.notWords = function() { + return { type: types.SET, set: WORDS(), not: true }; +}; + +exports.ints = function() { + return { type: types.SET, set: INTS(), not: false }; +}; + +exports.notInts = function() { + return { type: types.SET, set: INTS(), not: true }; +}; + +exports.whitespace = function() { + return { type: types.SET, set: WHITESPACE(), not: false }; +}; + +exports.notWhitespace = function() { + return { type: types.SET, set: WHITESPACE(), not: true }; +}; + +exports.anyChar = function() { + return { type: types.SET, set: NOTANYCHAR(), not: true }; +}; diff --git a/node_modules/ret/lib/types.js b/node_modules/ret/lib/types.js new file mode 100644 index 0000000..9484145 --- /dev/null +++ b/node_modules/ret/lib/types.js @@ -0,0 +1,10 @@ +module.exports = { + ROOT : 0, + GROUP : 1, + POSITION : 2, + SET : 3, + RANGE : 4, + REPETITION : 5, + REFERENCE : 6, + CHAR : 7, +}; diff --git a/node_modules/ret/lib/util.js b/node_modules/ret/lib/util.js new file mode 100644 index 0000000..97d8cf5 --- /dev/null +++ b/node_modules/ret/lib/util.js @@ -0,0 +1,111 @@ +var types = require('./types'); +var sets = require('./sets'); + + +// All of these are private and only used by randexp. +// It's assumed that they will always be called with the correct input. + +var CTRL = '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?'; +var SLSH = { '0': 0, 't': 9, 'n': 10, 'v': 11, 'f': 12, 'r': 13 }; + +/** + * Finds character representations in str and convert all to + * their respective characters + * + * @param {String} str + * @return {String} + */ +exports.strToChars = function(str) { + /* jshint maxlen: false */ + var chars_regex = /(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z\[\\\]\^?])|([0tnvfr]))/g; + str = str.replace(chars_regex, function(s, b, lbs, a16, b16, c8, dctrl, eslsh) { + if (lbs) { + return s; + } + + var code = b ? 8 : + a16 ? parseInt(a16, 16) : + b16 ? parseInt(b16, 16) : + c8 ? parseInt(c8, 8) : + dctrl ? CTRL.indexOf(dctrl) : + SLSH[eslsh]; + + var c = String.fromCharCode(code); + + // Escape special regex characters. + if (/[\[\]{}\^$.|?*+()]/.test(c)) { + c = '\\' + c; + } + + return c; + }); + + return str; +}; + + +/** + * turns class into tokens + * reads str until it encounters a ] not preceeded by a \ + * + * @param {String} str + * @param {String} regexpStr + * @return {Array., Number>} + */ +exports.tokenizeClass = function(str, regexpStr) { + /* jshint maxlen: false */ + var tokens = []; + var regexp = /\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?(.)/g; + var rs, c; + + + while ((rs = regexp.exec(str)) != null) { + if (rs[1]) { + tokens.push(sets.words()); + + } else if (rs[2]) { + tokens.push(sets.ints()); + + } else if (rs[3]) { + tokens.push(sets.whitespace()); + + } else if (rs[4]) { + tokens.push(sets.notWords()); + + } else if (rs[5]) { + tokens.push(sets.notInts()); + + } else if (rs[6]) { + tokens.push(sets.notWhitespace()); + + } else if (rs[7]) { + tokens.push({ + type: types.RANGE, + from: (rs[8] || rs[9]).charCodeAt(0), + to: rs[10].charCodeAt(0), + }); + + } else if (c = rs[12]) { + tokens.push({ + type: types.CHAR, + value: c.charCodeAt(0), + }); + + } else { + return [tokens, regexp.lastIndex]; + } + } + + exports.error(regexpStr, 'Unterminated character class'); +}; + + +/** + * Shortcut to throw errors. + * + * @param {String} regexp + * @param {String} msg + */ +exports.error = function(regexp, msg) { + throw new SyntaxError('Invalid regular expression: /' + regexp + '/: ' + msg); +}; diff --git a/node_modules/ret/package.json b/node_modules/ret/package.json new file mode 100644 index 0000000..0e661f7 --- /dev/null +++ b/node_modules/ret/package.json @@ -0,0 +1,70 @@ +{ + "_args": [ + [ + "ret@0.1.15", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "ret@0.1.15", + "_id": "ret@0.1.15", + "_inBundle": false, + "_integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "_location": "/ret", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ret@0.1.15", + "name": "ret", + "escapedName": "ret", + "rawSpec": "0.1.15", + "saveSpec": null, + "fetchSpec": "0.1.15" + }, + "_requiredBy": [ + "/safe-regex" + ], + "_resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "_spec": "0.1.15", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Roly Fentanes", + "url": "https://github.com/fent" + }, + "bugs": { + "url": "https://github.com/fent/ret.js/issues" + }, + "description": "Tokenizes a string that represents a regular expression.", + "devDependencies": { + "istanbul": "*", + "vows": "*" + }, + "directories": { + "lib": "./lib" + }, + "engines": { + "node": ">=0.12" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/fent/ret.js#readme", + "keywords": [ + "regex", + "regexp", + "regular expression", + "parser", + "tokenizer" + ], + "license": "MIT", + "main": "./lib/index.js", + "name": "ret", + "repository": { + "type": "git", + "url": "git://github.com/fent/ret.js.git" + }, + "scripts": { + "test": "istanbul cover vows -- --spec test/*-test.js" + }, + "version": "0.1.15" +} diff --git a/node_modules/rimraf/LICENSE b/node_modules/rimraf/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/rimraf/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/rimraf/README.md b/node_modules/rimraf/README.md new file mode 100644 index 0000000..423b8cf --- /dev/null +++ b/node_modules/rimraf/README.md @@ -0,0 +1,101 @@ +[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies) + +The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node. + +Install with `npm install rimraf`, or just drop rimraf.js somewhere. + +## API + +`rimraf(f, [opts], callback)` + +The first parameter will be interpreted as a globbing pattern for files. If you +want to disable globbing you can do so with `opts.disableGlob` (defaults to +`false`). This might be handy, for instance, if you have filenames that contain +globbing wildcard characters. + +The callback will be called with an error if there is one. Certain +errors are handled for you: + +* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of + `opts.maxBusyTries` times before giving up, adding 100ms of wait + between each attempt. The default `maxBusyTries` is 3. +* `ENOENT` - If the file doesn't exist, rimraf will return + successfully, since your desired outcome is already the case. +* `EMFILE` - Since `readdir` requires opening a file descriptor, it's + possible to hit `EMFILE` if too many file descriptors are in use. + In the sync case, there's nothing to be done for this. But in the + async case, rimraf will gradually back off with timeouts up to + `opts.emfileWait` ms, which defaults to 1000. + +## options + +* unlink, chmod, stat, lstat, rmdir, readdir, + unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync + + In order to use a custom file system library, you can override + specific fs functions on the options object. + + If any of these functions are present on the options object, then + the supplied function will be used instead of the default fs + method. + + Sync methods are only relevant for `rimraf.sync()`, of course. + + For example: + + ```javascript + var myCustomFS = require('some-custom-fs') + + rimraf('some-thing', myCustomFS, callback) + ``` + +* maxBusyTries + + If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered + on Windows systems, then rimraf will retry with a linear backoff + wait of 100ms longer on each try. The default maxBusyTries is 3. + + Only relevant for async usage. + +* emfileWait + + If an `EMFILE` error is encountered, then rimraf will retry + repeatedly with a linear backoff of 1ms longer on each try, until + the timeout counter hits this max. The default limit is 1000. + + If you repeatedly encounter `EMFILE` errors, then consider using + [graceful-fs](http://npm.im/graceful-fs) in your program. + + Only relevant for async usage. + +* glob + + Set to `false` to disable [glob](http://npm.im/glob) pattern + matching. + + Set to an object to pass options to the glob module. The default + glob options are `{ nosort: true, silent: true }`. + + Glob version 6 is used in this module. + + Relevant for both sync and async usage. + +* disableGlob + + Set to any non-falsey value to disable globbing entirely. + (Equivalent to setting `glob: false`.) + +## rimraf.sync + +It can remove stuff synchronously, too. But that's not so good. Use +the async API. It's better. + +## CLI + +If installed with `npm install rimraf -g` it can be used as a global +command `rimraf [ ...]` which is useful for cross platform support. + +## mkdirp + +If you need to create a directory recursively, check out +[mkdirp](https://github.com/substack/node-mkdirp). diff --git a/node_modules/rimraf/bin.js b/node_modules/rimraf/bin.js new file mode 100755 index 0000000..0d1e17b --- /dev/null +++ b/node_modules/rimraf/bin.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +var rimraf = require('./') + +var help = false +var dashdash = false +var noglob = false +var args = process.argv.slice(2).filter(function(arg) { + if (dashdash) + return !!arg + else if (arg === '--') + dashdash = true + else if (arg === '--no-glob' || arg === '-G') + noglob = true + else if (arg === '--glob' || arg === '-g') + noglob = false + else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/)) + help = true + else + return !!arg +}) + +if (help || args.length === 0) { + // If they didn't ask for help, then this is not a "success" + var log = help ? console.log : console.error + log('Usage: rimraf [ ...]') + log('') + log(' Deletes all files and folders at "path" recursively.') + log('') + log('Options:') + log('') + log(' -h, --help Display this usage info') + log(' -G, --no-glob Do not expand glob patterns in arguments') + log(' -g, --glob Expand glob patterns in arguments (default)') + process.exit(help ? 0 : 1) +} else + go(0) + +function go (n) { + if (n >= args.length) + return + var options = {} + if (noglob) + options = { glob: false } + rimraf(args[n], options, function (er) { + if (er) + throw er + go(n+1) + }) +} diff --git a/node_modules/rimraf/package.json b/node_modules/rimraf/package.json new file mode 100644 index 0000000..bd06b21 --- /dev/null +++ b/node_modules/rimraf/package.json @@ -0,0 +1,70 @@ +{ + "_args": [ + [ + "rimraf@2.7.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "rimraf@2.7.1", + "_id": "rimraf@2.7.1", + "_inBundle": false, + "_integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "_location": "/rimraf", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "rimraf@2.7.1", + "name": "rimraf", + "escapedName": "rimraf", + "rawSpec": "2.7.1", + "saveSpec": null, + "fetchSpec": "2.7.1" + }, + "_requiredBy": [ + "/node-pre-gyp" + ], + "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "_spec": "2.7.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bin": { + "rimraf": "bin.js" + }, + "bugs": { + "url": "https://github.com/isaacs/rimraf/issues" + }, + "dependencies": { + "glob": "^7.1.3" + }, + "description": "A deep deletion module for node (like `rm -rf`)", + "devDependencies": { + "mkdirp": "^0.5.1", + "tap": "^12.1.1" + }, + "files": [ + "LICENSE", + "README.md", + "bin.js", + "rimraf.js" + ], + "homepage": "https://github.com/isaacs/rimraf#readme", + "license": "ISC", + "main": "rimraf.js", + "name": "rimraf", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/rimraf.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js" + }, + "version": "2.7.1" +} diff --git a/node_modules/rimraf/rimraf.js b/node_modules/rimraf/rimraf.js new file mode 100644 index 0000000..a90ad02 --- /dev/null +++ b/node_modules/rimraf/rimraf.js @@ -0,0 +1,372 @@ +module.exports = rimraf +rimraf.sync = rimrafSync + +var assert = require("assert") +var path = require("path") +var fs = require("fs") +var glob = undefined +try { + glob = require("glob") +} catch (_err) { + // treat glob as optional. +} +var _0666 = parseInt('666', 8) + +var defaultGlobOpts = { + nosort: true, + silent: true +} + +// for EMFILE handling +var timeout = 0 + +var isWindows = (process.platform === "win32") + +function defaults (options) { + var methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(function(m) { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) + + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + if (options.disableGlob !== true && glob === undefined) { + throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts +} + +function rimraf (p, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + defaults(options) + + var busyTries = 0 + var errState = null + var n = 0 + + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) + + options.lstat(p, function (er, stat) { + if (!er) + return afterGlob(null, [p]) + + glob(p, options.glob, afterGlob) + }) + + function next (er) { + errState = errState || er + if (--n === 0) + cb(errState) + } + + function afterGlob (er, results) { + if (er) + return cb(er) + + n = results.length + if (n === 0) + return cb() + + results.forEach(function (p) { + rimraf_(p, options, function CB (er) { + if (er) { + if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + var time = busyTries * 100 + // try again, with the same exact callback as this one. + return setTimeout(function () { + rimraf_(p, options, CB) + }, time) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(function () { + rimraf_(p, options, CB) + }, timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + + timeout = 0 + next(er) + }) + }) + } +} + +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +function rimraf_ (p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, function (er, st) { + if (er && er.code === "ENOENT") + return cb(null) + + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) + + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) + + options.unlink(p, function (er) { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} + +function fixWinEPERM (p, options, er, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) + + options.chmod(p, _0666, function (er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} + +function fixWinEPERMSync (p, options, er) { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) + + try { + options.chmodSync(p, _0666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } + + try { + var stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } + + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} + +function rmdir (p, options, originalEr, cb) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') + + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, function (er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} + +function rmkids(p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + options.readdir(p, function (er, files) { + if (er) + return cb(er) + var n = files.length + if (n === 0) + return options.rmdir(p, cb) + var errState + files.forEach(function (f) { + rimraf(path.join(p, f), options, function (er) { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} + +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +function rimrafSync (p, options) { + options = options || {} + defaults(options) + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + var results + + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } + + if (!results.length) + return + + for (var i = 0; i < results.length; i++) { + var p = results[i] + + try { + var st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } + + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er + + rmdirSync(p, options, er) + } + } +} + +function rmdirSync (p, options, originalEr) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } +} + +function rmkidsSync (p, options) { + assert(p) + assert(options) + options.readdirSync(p).forEach(function (f) { + rimrafSync(path.join(p, f), options) + }) + + // We only end up here once we got ENOTEMPTY at least once, and + // at this point, we are guaranteed to have removed all the kids. + // So, we know that it won't be ENOENT or ENOTDIR or anything else. + // try really hard to delete stuff on windows, because it has a + // PROFOUNDLY annoying habit of not closing handles promptly when + // files are deleted, resulting in spurious ENOTEMPTY errors. + var retries = isWindows ? 100 : 1 + var i = 0 + do { + var threw = true + try { + var ret = options.rmdirSync(p, options) + threw = false + return ret + } finally { + if (++i < retries && threw) + continue + } + } while (true) +} diff --git a/node_modules/safe-buffer/LICENSE b/node_modules/safe-buffer/LICENSE new file mode 100644 index 0000000..0c068ce --- /dev/null +++ b/node_modules/safe-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +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/safe-buffer/README.md b/node_modules/safe-buffer/README.md new file mode 100644 index 0000000..e9a81af --- /dev/null +++ b/node_modules/safe-buffer/README.md @@ -0,0 +1,584 @@ +# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] + +[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/safe-buffer +[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg +[npm-url]: https://npmjs.org/package/safe-buffer +[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg +[downloads-url]: https://npmjs.org/package/safe-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com + +#### Safer Node.js Buffer API + +**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`, +`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.** + +**Uses the built-in implementation when available.** + +## install + +``` +npm install safe-buffer +``` + +## usage + +The goal of this package is to provide a safe replacement for the node.js `Buffer`. + +It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to +the top of your node.js modules: + +```js +var Buffer = require('safe-buffer').Buffer + +// Existing buffer code will continue to work without issues: + +new Buffer('hey', 'utf8') +new Buffer([1, 2, 3], 'utf8') +new Buffer(obj) +new Buffer(16) // create an uninitialized buffer (potentially unsafe) + +// But you can use these new explicit APIs to make clear what you want: + +Buffer.from('hey', 'utf8') // convert from many types to a Buffer +Buffer.alloc(16) // create a zero-filled buffer (safe) +Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe) +``` + +## api + +### Class Method: Buffer.from(array) + + +* `array` {Array} + +Allocates a new `Buffer` using an `array` of octets. + +```js +const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]); + // creates a new Buffer containing ASCII bytes + // ['b','u','f','f','e','r'] +``` + +A `TypeError` will be thrown if `array` is not an `Array`. + +### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]]) + + +* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or + a `new ArrayBuffer()` +* `byteOffset` {Number} Default: `0` +* `length` {Number} Default: `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a `TypedArray` instance, +the newly created `Buffer` will share the same allocated memory as the +TypedArray. + +```js +const arr = new Uint16Array(2); +arr[0] = 5000; +arr[1] = 4000; + +const buf = Buffer.from(arr.buffer); // shares the memory with arr; + +console.log(buf); + // Prints: + +// changing the TypedArray changes the Buffer also +arr[1] = 6000; + +console.log(buf); + // Prints: +``` + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +```js +const ab = new ArrayBuffer(10); +const buf = Buffer.from(ab, 0, 2); +console.log(buf.length); + // Prints: 2 +``` + +A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`. + +### Class Method: Buffer.from(buffer) + + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + +```js +const buf1 = Buffer.from('buffer'); +const buf2 = Buffer.from(buf1); + +buf1[0] = 0x61; +console.log(buf1.toString()); + // 'auffer' +console.log(buf2.toString()); + // 'buffer' (copy is not changed) +``` + +A `TypeError` will be thrown if `buffer` is not a `Buffer`. + +### Class Method: Buffer.from(str[, encoding]) + + +* `str` {String} String to encode. +* `encoding` {String} Encoding to use, Default: `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `str`. If +provided, the `encoding` parameter identifies the character encoding. +If not provided, `encoding` defaults to `'utf8'`. + +```js +const buf1 = Buffer.from('this is a tést'); +console.log(buf1.toString()); + // prints: this is a tést +console.log(buf1.toString('ascii')); + // prints: this is a tC)st + +const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); +console.log(buf2.toString()); + // prints: this is a tést +``` + +A `TypeError` will be thrown if `str` is not a string. + +### Class Method: Buffer.alloc(size[, fill[, encoding]]) + + +* `size` {Number} +* `fill` {Value} Default: `undefined` +* `encoding` {String} Default: `utf8` + +Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the +`Buffer` will be *zero-filled*. + +```js +const buf = Buffer.alloc(5); +console.log(buf); + // +``` + +The `size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +If `fill` is specified, the allocated `Buffer` will be initialized by calling +`buf.fill(fill)`. See [`buf.fill()`][] for more information. + +```js +const buf = Buffer.alloc(5, 'a'); +console.log(buf); + // +``` + +If both `fill` and `encoding` are specified, the allocated `Buffer` will be +initialized by calling `buf.fill(fill, encoding)`. For example: + +```js +const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); +console.log(buf); + // +``` + +Calling `Buffer.alloc(size)` can be significantly slower than the alternative +`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance +contents will *never contain sensitive data*. + +A `TypeError` will be thrown if `size` is not a number. + +### Class Method: Buffer.allocUnsafe(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must +be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit +architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is +thrown. A zero-length Buffer will be created if a `size` less than or equal to +0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +```js +const buf = Buffer.allocUnsafe(5); +console.log(buf); + // + // (octets will be different, every time) +buf.fill(0); +console.log(buf); + // +``` + +A `TypeError` will be thrown if `size` is not a number. + +Note that the `Buffer` module pre-allocates an internal `Buffer` instance of +size `Buffer.poolSize` that is used as a pool for the fast allocation of new +`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated +`new Buffer(size)` constructor) only when `size` is less than or equal to +`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default +value of `Buffer.poolSize` is `8192` but can be modified. + +Use of this pre-allocated internal memory pool is a key difference between +calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. +Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer +pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal +Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The +difference is subtle but can be important when an application requires the +additional performance that `Buffer.allocUnsafe(size)` provides. + +### Class Method: Buffer.allocUnsafeSlow(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes. The +`size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, +allocations under 4KB are, by default, sliced from a single pre-allocated +`Buffer`. This allows applications to avoid the garbage collection overhead of +creating many individually allocated Buffers. This approach improves both +performance and memory usage by eliminating the need to track and cleanup as +many `Persistent` objects. + +However, in the case where a developer may need to retain a small chunk of +memory from a pool for an indeterminate amount of time, it may be appropriate +to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then +copy out the relevant bits. + +```js +// need to keep around a few small chunks of memory +const store = []; + +socket.on('readable', () => { + const data = socket.read(); + // allocate for retained data + const sb = Buffer.allocUnsafeSlow(10); + // copy the data into the new allocation + data.copy(sb, 0, 0, 10); + store.push(sb); +}); +``` + +Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after* +a developer has observed undue memory retention in their applications. + +A `TypeError` will be thrown if `size` is not a number. + +### All the Rest + +The rest of the `Buffer` API is exactly the same as in node.js. +[See the docs](https://nodejs.org/api/buffer.html). + + +## Related links + +- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660) +- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4) + +## Why is `Buffer` unsafe? + +Today, the node.js `Buffer` constructor is overloaded to handle many different argument +types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.), +`ArrayBuffer`, and also `Number`. + +The API is optimized for convenience: you can throw any type at it, and it will try to do +what you want. + +Because the Buffer constructor is so powerful, you often see code like this: + +```js +// Convert UTF-8 strings to hex +function toHex (str) { + return new Buffer(str).toString('hex') +} +``` + +***But what happens if `toHex` is called with a `Number` argument?*** + +### Remote Memory Disclosure + +If an attacker can make your program call the `Buffer` constructor with a `Number` +argument, then they can make it allocate uninitialized memory from the node.js process. +This could potentially disclose TLS private keys, user data, or database passwords. + +When the `Buffer` constructor is passed a `Number` argument, it returns an +**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like +this, you **MUST** overwrite the contents before returning it to the user. + +From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size): + +> `new Buffer(size)` +> +> - `size` Number +> +> The underlying memory for `Buffer` instances created in this way is not initialized. +> **The contents of a newly created `Buffer` are unknown and could contain sensitive +> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes. + +(Emphasis our own.) + +Whenever the programmer intended to create an uninitialized `Buffer` you often see code +like this: + +```js +var buf = new Buffer(16) + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### Would this ever be a problem in real code? + +Yes. It's surprisingly common to forget to check the type of your variables in a +dynamically-typed language like JavaScript. + +Usually the consequences of assuming the wrong type is that your program crashes with an +uncaught exception. But the failure mode for forgetting to check the type of arguments to +the `Buffer` constructor is more catastrophic. + +Here's an example of a vulnerable service that takes a JSON payload and converts it to +hex: + +```js +// Take a JSON payload {str: "some string"} and convert it to hex +var server = http.createServer(function (req, res) { + var data = '' + req.setEncoding('utf8') + req.on('data', function (chunk) { + data += chunk + }) + req.on('end', function () { + var body = JSON.parse(data) + res.end(new Buffer(body.str).toString('hex')) + }) +}) + +server.listen(8080) +``` + +In this example, an http client just has to send: + +```json +{ + "str": 1000 +} +``` + +and it will get back 1,000 bytes of uninitialized memory from the server. + +This is a very serious bug. It's similar in severity to the +[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process +memory by remote attackers. + + +### Which real-world packages were vulnerable? + +#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht) + +[Mathias Buus](https://github.com/mafintosh) and I +([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages, +[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow +anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get +them to reveal 20 bytes at a time of uninitialized memory from the node.js process. + +Here's +[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8) +that fixed it. We released a new fixed version, created a +[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all +vulnerable versions on npm so users will get a warning to upgrade to a newer version. + +#### [`ws`](https://www.npmjs.com/package/ws) + +That got us wondering if there were other vulnerable packages. Sure enough, within a short +period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the +most popular WebSocket implementation in node.js. + +If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as +expected, then uninitialized server memory would be disclosed to the remote peer. + +These were the vulnerable methods: + +```js +socket.send(number) +socket.ping(number) +socket.pong(number) +``` + +Here's a vulnerable socket server with some echo functionality: + +```js +server.on('connection', function (socket) { + socket.on('message', function (message) { + message = JSON.parse(message) + if (message.type === 'echo') { + socket.send(message.data) // send back the user's message + } + }) +}) +``` + +`socket.send(number)` called on the server, will disclose server memory. + +Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue +was fixed, with a more detailed explanation. Props to +[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the +[Node Security Project disclosure](https://nodesecurity.io/advisories/67). + + +### What's the solution? + +It's important that node.js offers a fast way to get memory otherwise performance-critical +applications would needlessly get a lot slower. + +But we need a better way to *signal our intent* as programmers. **When we want +uninitialized memory, we should request it explicitly.** + +Sensitive functionality should not be packed into a developer-friendly API that loosely +accepts many different types. This type of API encourages the lazy practice of passing +variables in without checking the type very carefully. + +#### A new API: `Buffer.allocUnsafe(number)` + +The functionality of creating buffers with uninitialized memory should be part of another +API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that +frequently gets user input of all sorts of different types passed into it. + +```js +var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory! + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### How do we fix node.js core? + +We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as +`semver-major`) which defends against one case: + +```js +var str = 16 +new Buffer(str, 'utf8') +``` + +In this situation, it's implied that the programmer intended the first argument to be a +string, since they passed an encoding as a second argument. Today, node.js will allocate +uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not +what the programmer intended. + +But this is only a partial solution, since if the programmer does `new Buffer(variable)` +(without an `encoding` parameter) there's no way to know what they intended. If `variable` +is sometimes a number, then uninitialized memory will sometimes be returned. + +### What's the real long-term fix? + +We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when +we need uninitialized memory. But that would break 1000s of packages. + +~~We believe the best solution is to:~~ + +~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~ + +~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~ + +#### Update + +We now support adding three new APIs: + +- `Buffer.from(value)` - convert from any type to a buffer +- `Buffer.alloc(size)` - create a zero-filled buffer +- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size + +This solves the core problem that affected `ws` and `bittorrent-dht` which is +`Buffer(variable)` getting tricked into taking a number argument. + +This way, existing code continues working and the impact on the npm ecosystem will be +minimal. Over time, npm maintainers can migrate performance-critical code to use +`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`. + + +### Conclusion + +We think there's a serious design issue with the `Buffer` API as it exists today. It +promotes insecure software by putting high-risk functionality into a convenient API +with friendly "developer ergonomics". + +This wasn't merely a theoretical exercise because we found the issue in some of the +most popular npm packages. + +Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of +`buffer`. + +```js +var Buffer = require('safe-buffer').Buffer +``` + +Eventually, we hope that node.js core can switch to this new, safer behavior. We believe +the impact on the ecosystem would be minimal since it's not a breaking change. +Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while +older, insecure packages would magically become safe from this attack vector. + + +## links + +- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514) +- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67) +- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68) + + +## credit + +The original issues in `bittorrent-dht` +([disclosure](https://nodesecurity.io/advisories/68)) and +`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by +[Mathias Buus](https://github.com/mafintosh) and +[Feross Aboukhadijeh](http://feross.org/). + +Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues +and for his work running the [Node Security Project](https://nodesecurity.io/). + +Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and +auditing the code. + + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) diff --git a/node_modules/safe-buffer/index.d.ts b/node_modules/safe-buffer/index.d.ts new file mode 100644 index 0000000..e9fed80 --- /dev/null +++ b/node_modules/safe-buffer/index.d.ts @@ -0,0 +1,187 @@ +declare module "safe-buffer" { + export class Buffer { + length: number + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + */ + constructor (str: string, encoding?: string); + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + */ + constructor (size: number); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: Uint8Array); + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}. + * + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + */ + constructor (arrayBuffer: ArrayBuffer); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: any[]); + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + */ + constructor (buffer: Buffer); + prototype: Buffer; + /** + * Allocates a new Buffer using an {array} of octets. + * + * @param array + */ + static from(array: any[]): Buffer; + /** + * When passed a reference to the .buffer property of a TypedArray instance, + * the newly created Buffer will share the same allocated memory as the TypedArray. + * The optional {byteOffset} and {length} arguments specify a memory range + * within the {arrayBuffer} that will be shared by the Buffer. + * + * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length + */ + static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + /** + * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer + */ + static from(buffer: Buffer): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + * + * @param str + */ + static from(str: string, encoding?: string): Buffer; + /** + * Returns true if {obj} is a Buffer + * + * @param obj object to test. + */ + static isBuffer(obj: any): obj is Buffer; + /** + * Returns true if {encoding} is a valid encoding argument. + * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' + * + * @param encoding string to test. + */ + static isEncoding(encoding: string): boolean; + /** + * Gives the actual byte length of a string. encoding defaults to 'utf8'. + * This is not the same as String.prototype.length since that returns the number of characters in a string. + * + * @param string string to test. + * @param encoding encoding used to evaluate (defaults to 'utf8') + */ + static byteLength(string: string, encoding?: string): number; + /** + * Returns a buffer which is the result of concatenating all the buffers in the list together. + * + * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. + * If the list has exactly one item, then the first item of the list is returned. + * If the list has more than one item, then a new Buffer is created. + * + * @param list An array of Buffer objects to concatenate + * @param totalLength Total length of the buffers when concatenated. + * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. + */ + static concat(list: Buffer[], totalLength?: number): Buffer; + /** + * The same as buf1.compare(buf2). + */ + static compare(buf1: Buffer, buf2: Buffer): number; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @param fill if specified, buffer will be initialized by calling buf.fill(fill). + * If parameter is omitted, buffer will be filled with zeros. + * @param encoding encoding used for call to buf.fill while initalizing + */ + static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + /** + * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafe(size: number): Buffer; + /** + * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafeSlow(size: number): Buffer; + } +} \ No newline at end of file diff --git a/node_modules/safe-buffer/index.js b/node_modules/safe-buffer/index.js new file mode 100644 index 0000000..22438da --- /dev/null +++ b/node_modules/safe-buffer/index.js @@ -0,0 +1,62 @@ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} diff --git a/node_modules/safe-buffer/package.json b/node_modules/safe-buffer/package.json new file mode 100644 index 0000000..caa9d1e --- /dev/null +++ b/node_modules/safe-buffer/package.json @@ -0,0 +1,74 @@ +{ + "_args": [ + [ + "safe-buffer@5.1.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "safe-buffer@5.1.2", + "_id": "safe-buffer@5.1.2", + "_inBundle": false, + "_integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "_location": "/safe-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "safe-buffer@5.1.2", + "name": "safe-buffer", + "escapedName": "safe-buffer", + "rawSpec": "5.1.2", + "saveSpec": null, + "fetchSpec": "5.1.2" + }, + "_requiredBy": [ + "/content-disposition", + "/express", + "/got", + "/minipass", + "/readable-stream", + "/registry-auth-token", + "/request", + "/string_decoder", + "/tar", + "/tunnel-agent" + ], + "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "_spec": "5.1.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "http://feross.org" + }, + "bugs": { + "url": "https://github.com/feross/safe-buffer/issues" + }, + "description": "Safer Node.js Buffer API", + "devDependencies": { + "standard": "*", + "tape": "^4.0.0" + }, + "homepage": "https://github.com/feross/safe-buffer", + "keywords": [ + "buffer", + "buffer allocate", + "node security", + "safe", + "safe-buffer", + "security", + "uninitialized" + ], + "license": "MIT", + "main": "index.js", + "name": "safe-buffer", + "repository": { + "type": "git", + "url": "git://github.com/feross/safe-buffer.git" + }, + "scripts": { + "test": "standard && tape test/*.js" + }, + "types": "index.d.ts", + "version": "5.1.2" +} diff --git a/node_modules/safe-regex/.travis.yml b/node_modules/safe-regex/.travis.yml new file mode 100644 index 0000000..cc4dba2 --- /dev/null +++ b/node_modules/safe-regex/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/safe-regex/LICENSE b/node_modules/safe-regex/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/safe-regex/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/safe-regex/example/safe.js b/node_modules/safe-regex/example/safe.js new file mode 100644 index 0000000..f486f59 --- /dev/null +++ b/node_modules/safe-regex/example/safe.js @@ -0,0 +1,3 @@ +var safe = require('../'); +var regex = process.argv.slice(2).join(' '); +console.log(safe(regex)); diff --git a/node_modules/safe-regex/index.js b/node_modules/safe-regex/index.js new file mode 100644 index 0000000..488f501 --- /dev/null +++ b/node_modules/safe-regex/index.js @@ -0,0 +1,43 @@ +var parse = require('ret'); +var types = parse.types; + +module.exports = function (re, opts) { + if (!opts) opts = {}; + var replimit = opts.limit === undefined ? 25 : opts.limit; + + if (isRegExp(re)) re = re.source; + else if (typeof re !== 'string') re = String(re); + + try { re = parse(re) } + catch (err) { return false } + + var reps = 0; + return (function walk (node, starHeight) { + if (node.type === types.REPETITION) { + starHeight ++; + reps ++; + if (starHeight > 1) return false; + if (reps > replimit) return false; + } + + if (node.options) { + for (var i = 0, len = node.options.length; i < len; i++) { + var ok = walk({ stack: node.options[i] }, starHeight); + if (!ok) return false; + } + } + var stack = node.stack || (node.value && node.value.stack); + if (!stack) return true; + + for (var i = 0; i < stack.length; i++) { + var ok = walk(stack[i], starHeight); + if (!ok) return false; + } + + return true; + })(re, 0); +}; + +function isRegExp (x) { + return {}.toString.call(x) === '[object RegExp]'; +} diff --git a/node_modules/safe-regex/package.json b/node_modules/safe-regex/package.json new file mode 100644 index 0000000..0e9020a --- /dev/null +++ b/node_modules/safe-regex/package.json @@ -0,0 +1,77 @@ +{ + "_args": [ + [ + "safe-regex@1.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "safe-regex@1.1.0", + "_id": "safe-regex@1.1.0", + "_inBundle": false, + "_integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "_location": "/safe-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "safe-regex@1.1.0", + "name": "safe-regex", + "escapedName": "safe-regex", + "rawSpec": "1.1.0", + "saveSpec": null, + "fetchSpec": "1.1.0" + }, + "_requiredBy": [ + "/regex-not", + "/to-regex" + ], + "_resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "_spec": "1.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/substack/safe-regex/issues" + }, + "dependencies": { + "ret": "~0.1.10" + }, + "description": "detect possibly catastrophic, exponential-time regular expressions", + "devDependencies": { + "tape": "^3.5.0" + }, + "homepage": "https://github.com/substack/safe-regex", + "keywords": [ + "catastrophic", + "exponential", + "regex", + "safe", + "sandbox" + ], + "license": "MIT", + "main": "index.js", + "name": "safe-regex", + "repository": { + "type": "git", + "url": "git://github.com/substack/safe-regex.git" + }, + "scripts": { + "test": "tape test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8", + "ie/9", + "ie/10", + "firefox/latest", + "chrome/latest", + "opera/latest", + "safari/latest" + ] + }, + "version": "1.1.0" +} diff --git a/node_modules/safe-regex/readme.markdown b/node_modules/safe-regex/readme.markdown new file mode 100644 index 0000000..83673ac --- /dev/null +++ b/node_modules/safe-regex/readme.markdown @@ -0,0 +1,65 @@ +# safe-regex + +detect potentially +[catastrophic](http://regular-expressions.mobi/catastrophic.html) +[exponential-time](http://perlgeek.de/blog-en/perl-tips/in-search-of-an-exponetial-regexp.html) +regular expressions by limiting the +[star height](https://en.wikipedia.org/wiki/Star_height) to 1 + +WARNING: This module merely *seems* to work given all the catastrophic regular +expressions I could find scouring the internet, but I don't have enough of a +background in automata to be absolutely sure that this module will catch all +exponential-time cases. + +[![browser support](https://ci.testling.com/substack/safe-regex.png)](https://ci.testling.com/substack/safe-regex) + +[![build status](https://secure.travis-ci.org/substack/safe-regex.png)](http://travis-ci.org/substack/safe-regex) + +# example + +``` js +var safe = require('safe-regex'); +var regex = process.argv.slice(2).join(' '); +console.log(safe(regex)); +``` + +``` +$ node safe.js '(x+x+)+y' +false +$ node safe.js '(beep|boop)*' +true +$ node safe.js '(a+){10}' +false +$ node safe.js '\blocation\s*:[^:\n]+\b(Oakland|San Francisco)\b' +true +``` + +# methods + +``` js +var safe = require('safe-regex') +``` + +## var ok = safe(re, opts={}) + +Return a boolean `ok` whether or not the regex `re` is safe and not possibly +catastrophic. + +`re` can be a `RegExp` object or just a string. + +If the `re` is a string and is an invalid regex, returns `false`. + +* `opts.limit` - maximum number of allowed repetitions in the entire regex. +Default: `25`. + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install safe-regex +``` + +# license + +MIT diff --git a/node_modules/safe-regex/test/regex.js b/node_modules/safe-regex/test/regex.js new file mode 100644 index 0000000..0bda850 --- /dev/null +++ b/node_modules/safe-regex/test/regex.js @@ -0,0 +1,50 @@ +var safe = require('../'); +var test = require('tape'); + +var good = [ + /\bOakland\b/, + /\b(Oakland|San Francisco)\b/i, + /^\d+1337\d+$/i, + /^\d+(1337|404)\d+$/i, + /^\d+(1337|404)*\d+$/i, + RegExp(Array(26).join('a?') + Array(26).join('a')), +]; + +test('safe regex', function (t) { + t.plan(good.length); + good.forEach(function (re) { + t.equal(safe(re), true); + }); +}); + + +var bad = [ + /^(a?){25}(a){25}$/, + RegExp(Array(27).join('a?') + Array(27).join('a')), + /(x+x+)+y/, + /foo|(x+x+)+y/, + /(a+){10}y/, + /(a+){2}y/, + /(.*){1,32000}[bc]/ +]; + +test('unsafe regex', function (t) { + t.plan(bad.length); + bad.forEach(function (re) { + t.equal(safe(re), false); + }); +}); + +var invalid = [ + '*Oakland*', + 'hey(yoo))', + 'abcde(?>hellow)', + '[abc' +]; + +test('invalid regex', function (t) { + t.plan(invalid.length); + invalid.forEach(function (re) { + t.equal(safe(re), false); + }); +}); diff --git a/node_modules/safer-buffer/LICENSE b/node_modules/safer-buffer/LICENSE new file mode 100644 index 0000000..4fe9e6f --- /dev/null +++ b/node_modules/safer-buffer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +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/safer-buffer/Porting-Buffer.md b/node_modules/safer-buffer/Porting-Buffer.md new file mode 100644 index 0000000..68d86ba --- /dev/null +++ b/node_modules/safer-buffer/Porting-Buffer.md @@ -0,0 +1,268 @@ +# Porting to the Buffer.from/Buffer.alloc API + + +## Overview + +- [Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.](#variant-1) (*recommended*) +- [Variant 2: Use a polyfill](#variant-2) +- [Variant 3: manual detection, with safeguards](#variant-3) + +### Finding problematic bits of code using grep + +Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`. + +It will find all the potentially unsafe places in your own code (with some considerably unlikely +exceptions). + +### Finding problematic bits of code using Node.js 8 + +If you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code: + +- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js. +- `--trace-deprecation` does the same thing, but only for deprecation warnings. +- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8. + +You can set these flags using an environment variable: + +```console +$ export NODE_OPTIONS='--trace-warnings --pending-deprecation' +$ cat example.js +'use strict'; +const foo = new Buffer('foo'); +$ node example.js +(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead. + at showFlaggedDeprecation (buffer.js:127:13) + at new Buffer (buffer.js:148:3) + at Object. (/path/to/example.js:2:13) + [... more stack trace lines ...] +``` + +### Finding problematic bits of code using linters + +Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets. + +There is a drawback, though, that it doesn't always +[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is +overriden e.g. with a polyfill, so recommended is a combination of this and some other method +described above. + + +## Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x. + +This is the recommended solution nowadays that would imply only minimal overhead. + +The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible. + +What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way: + +- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`. +- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`). +- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`. + +Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than +`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended to avoid accidential unsafe Buffer API usage. + +There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005) +for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`. +Note that it currently only works with cases where the arguments are literals or where the +constructor is invoked with two arguments. + +_If you currently support those older Node.js versions and dropping them would be a semver-major change +for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2) +or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive +the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and +your users will not observe a runtime deprecation warning when running your code on Node.js 10._ + + +## Variant 2: Use a polyfill + +Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older +Node.js versions. + +You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill +`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api. + +Make sure that you do not use old `new Buffer` API — in any files where the line above is added, +using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though. + +Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or +[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) — +those are great, the only downsides being 4 deps in the tree and slightly more code changes to +migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only +`Buffer.from` polyfilled — `buffer-from` alone which comes with no extra dependencies. + +_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) — it also +provides a polyfill, but takes a different approach which has +[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you +to also use the older `new Buffer()` API in your code, though — but that's arguably a benefit, as +it is problematic, can cause issues in your code, and will start emitting runtime deprecation +warnings starting with Node.js 10._ + +Note that in either case, it is important that you also remove all calls to the old Buffer +API manually — just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides +a polyfill for the new API. I have seen people doing that mistake. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended. + +_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._ + + +## Variant 3 — manual detection, with safeguards + +This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own +wrapper around them. + +### Buffer(0) + +This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which +returns the same result all the way down to Node.js 0.8.x. + +### Buffer(notNumber) + +Before: + +```js +var buf = new Buffer(notNumber, encoding); +``` + +After: + +```js +var buf; +if (Buffer.from && Buffer.from !== Uint8Array.from) { + buf = Buffer.from(notNumber, encoding); +} else { + if (typeof notNumber === 'number') + throw new Error('The "size" argument must be of type number.'); + buf = new Buffer(notNumber, encoding); +} +``` + +`encoding` is optional. + +Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not +hard-coded) and _is not caused by the deprecation of Buffer constructor_ — it's exactly _why_ the +Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous +security issues — situations when unsanitized user input could end up in the `Buffer(arg)` create +problems ranging from DoS to leaking sensitive information to the attacker from the process memory. + +When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can +be omitted. + +Also note that using TypeScript does not fix this problem for you — when libs written in +`TypeScript` are used from JS, or when user input ends up there — it behaves exactly as pure JS, as +all type checks are translation-time only and are not present in the actual JS code which TS +compiles to. + +### Buffer(number) + +For Node.js 0.10.x (and below) support: + +```js +var buf; +if (Buffer.alloc) { + buf = Buffer.alloc(number); +} else { + buf = new Buffer(number); + buf.fill(0); +} +``` + +Otherwise (Node.js ≥ 0.12.x): + +```js +const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0); +``` + +## Regarding Buffer.allocUnsafe + +Be extra cautious when using `Buffer.allocUnsafe`: + * Don't use it if you don't have a good reason to + * e.g. you probably won't ever see a performance difference for small buffers, in fact, those + might be even faster with `Buffer.alloc()`, + * if your code is not in the hot code path — you also probably won't notice a difference, + * keep in mind that zero-filling minimizes the potential risks. + * If you use it, make sure that you never return the buffer in a partially-filled state, + * if you are writing to it sequentially — always truncate it to the actuall written length + +Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues, +ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs) +leaking to the remote attacker. + +_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js +version (and lacking type checks also adds DoS to the list of potential problems)._ + + +## FAQ + + +### What is wrong with the `Buffer` constructor? + +The `Buffer` constructor could be used to create a buffer in many different ways: + +- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained + *arbitrary memory* for performance reasons, which could include anything ranging from + program source code to passwords and encryption keys. +- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of + the string `'abc'`. A second argument could specify another encoding: For example, + `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original + sequence of bytes that it represents. +- There are several other combinations of arguments. + +This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell +what exactly the contents of the generated buffer are* without knowing the type of `foo`. + +Sometimes, the value of `foo` comes from an external source. For example, this function +could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form: + +``` +function stringToBase64(req, res) { + // The request body should have the format of `{ string: 'foobar' }` + const rawBytes = new Buffer(req.body.string) + const encoded = rawBytes.toString('base64') + res.end({ encoded: encoded }) +} +``` + +Note that this code does *not* validate the type of `req.body.string`: + +- `req.body.string` is expected to be a string. If this is the case, all goes well. +- `req.body.string` is controlled by the client that sends the request. +- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes: + - Before Node.js 8, the content would be uninitialized + - After Node.js 8, the content would be `50` bytes with the value `0` + +Because of the missing type check, an attacker could intentionally send a number +as part of the request. Using this, they can either: + +- Read uninitialized memory. This **will** leak passwords, encryption keys and other + kinds of sensitive information. (Information leak) +- Force the program to allocate a large amount of memory. For example, when specifying + `500000000` as the input value, each request will allocate 500MB of memory. + This can be used to either exhaust the memory available of a program completely + and make it crash, or slow it down significantly. (Denial of Service) + +Both of these scenarios are considered serious security issues in a real-world +web server context. + +when using `Buffer.from(req.body.string)` instead, passing a number will always +throw an exception instead, giving a controlled behaviour that can always be +handled by the program. + + +### The `Buffer()` constructor has been deprecated for a while. Is this really an issue? + +Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still +widely used. This includes new code, and overall usage of such code has actually been +*increasing*. diff --git a/node_modules/safer-buffer/Readme.md b/node_modules/safer-buffer/Readme.md new file mode 100644 index 0000000..14b0822 --- /dev/null +++ b/node_modules/safer-buffer/Readme.md @@ -0,0 +1,156 @@ +# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url] + +[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master +[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer +[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg +[npm-url]: https://npmjs.org/package/safer-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com +[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg +[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md + +Modern Buffer API polyfill without footguns, working on Node.js from 0.8 to current. + +## How to use? + +First, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API. + +Then, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use +`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new +Buffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._ + +Also, see the +[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide. + +## Do I need it? + +Hopefully, not — dropping support for outdated Node.js versions should be fine nowdays, and that +is the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()` +though. + +See the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) +for a better description. + +## Why not [safe-buffer](https://npmjs.com/safe-buffer)? + +_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and +itself contains footguns._ + +`safe-buffer` could be used safely to get the new API while still keeping support for older +Node.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API +I found out that `safe-buffer` is itself causing problems in some cases. + +For example, consider the following snippet: + +```console +$ cat example.unsafe.js +console.log(Buffer(20)) +$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js + +$ standard example.unsafe.js +standard: Use JavaScript Standard Style (https://standardjs.com) + /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead. +``` + +This is allocates and writes to console an uninitialized chunk of memory. +[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people +to avoid using unsafe API. + +Let's now throw in `safe-buffer`! + +```console +$ cat example.safe-buffer.js +const Buffer = require('safe-buffer').Buffer +console.log(Buffer(20)) +$ standard example.safe-buffer.js +$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js + +``` + +See the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior +remains identiсal to what we had before, and when launched on Node.js 6.x LTS — this dumps out +chunks of uninitialized memory. +_And this code will still emit runtime warnings on Node.js 10.x and above._ + +That was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or +emitting warnings on it, but that significantly diverges from `safe-buffer` design. After some +discussion, it was decided to move my approach into a separate package, and _this is that separate +package_. + +This footgun is not imaginary — I observed top-downloaded packages doing that kind of thing, +«fixing» the lint warning by blindly including `safe-buffer` without any actual changes. + +Also in some cases, even if the API _was_ migrated to use of safe Buffer API — a random pull request +can bring unsafe Buffer API usage back to the codebase by adding new calls — and that could go +unnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even +pass CI. _I also observed that being done in popular packages._ + +Some examples: + * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31) + (a module with 548 759 downloads/month), + * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61) + (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)), + * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c) + (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)), + * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec) + (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)), + * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1) + (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)). + * And there are a lot more over the ecosystem. + +I filed a PR at +[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to +partially fix that (for cases when that lint rule is used), but it is a semver-major change for +linter rules and presets, so it would take significant time for that to reach actual setups. +_It also hasn't been released yet (2018-03-20)._ + +Also, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake. +It still supports it with an explicit concern barier, by placing it under +`require('safer-buffer/dangereous')`. + +## But isn't throwing bad? + +Not really. It's an error that could be noticed and fixed early, instead of causing havoc later like +unguarded `new Buffer()` calls that end up receiving user input can do. + +This package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so +it is really simple to keep track of things and make sure that you don't mix old API usage with that. +Also, CI should hint anything that you might have missed. + +New commits, if tested, won't land new usage of unsafe Buffer API this way. +_Node.js 10.x also deals with that by printing a runtime depecation warning._ + +### Would it affect third-party modules? + +No, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`. +Don't do that. + +### But I don't want throwing… + +That is also fine! + +Also, it could be better in some cases when you don't comprehensive enough test coverage. + +In that case — just don't override `Buffer` and use +`var SaferBuffer = require('safer-buffer').Buffer` instead. + +That way, everything using `Buffer` natively would still work, but there would be two drawbacks: + +* `Buffer.from`/`Buffer.alloc` won't be polyfilled — use `SaferBuffer.from` and + `SaferBuffer.alloc` instead. +* You are still open to accidentally using the insecure deprecated API — use a linter to catch that. + +Note that using a linter to catch accidential `Buffer` constructor usage in this case is strongly +recommended. `Buffer` is not overriden in this usecase, so linters won't get confused. + +## «Without footguns»? + +Well, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property +on older versions and duping things from there. You shouldn't do that in your code, probabably. + +The intention is to remove the most significant footguns that affect lots of packages in the +ecosystem, and to do it in the proper way. + +Also, this package doesn't protect against security issues affecting some Node.js versions, so for +usage in your own production code, it is still recommended to update to a Node.js version +[supported by upstream](https://github.com/nodejs/release#release-schedule). diff --git a/node_modules/safer-buffer/dangerous.js b/node_modules/safer-buffer/dangerous.js new file mode 100644 index 0000000..ca41fdc --- /dev/null +++ b/node_modules/safer-buffer/dangerous.js @@ -0,0 +1,58 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer +var safer = require('./safer.js') +var Safer = safer.Buffer + +var dangerous = {} + +var key + +for (key in safer) { + if (!safer.hasOwnProperty(key)) continue + dangerous[key] = safer[key] +} + +var Dangereous = dangerous.Buffer = {} + +// Copy Safer API +for (key in Safer) { + if (!Safer.hasOwnProperty(key)) continue + Dangereous[key] = Safer[key] +} + +// Copy those missing unsafe methods, if they are present +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (Dangereous.hasOwnProperty(key)) continue + Dangereous[key] = Buffer[key] +} + +if (!Dangereous.allocUnsafe) { + Dangereous.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return Buffer(size) + } +} + +if (!Dangereous.allocUnsafeSlow) { + Dangereous.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return buffer.SlowBuffer(size) + } +} + +module.exports = dangerous diff --git a/node_modules/safer-buffer/package.json b/node_modules/safer-buffer/package.json new file mode 100644 index 0000000..c7e4f15 --- /dev/null +++ b/node_modules/safer-buffer/package.json @@ -0,0 +1,66 @@ +{ + "_args": [ + [ + "safer-buffer@2.1.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "safer-buffer@2.1.2", + "_id": "safer-buffer@2.1.2", + "_inBundle": false, + "_integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "_location": "/safer-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "safer-buffer@2.1.2", + "name": "safer-buffer", + "escapedName": "safer-buffer", + "rawSpec": "2.1.2", + "saveSpec": null, + "fetchSpec": "2.1.2" + }, + "_requiredBy": [ + "/asn1", + "/ecc-jsbn", + "/iconv-lite", + "/sshpk" + ], + "_resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "_spec": "2.1.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Nikita Skovoroda", + "email": "chalkerx@gmail.com", + "url": "https://github.com/ChALkeR" + }, + "bugs": { + "url": "https://github.com/ChALkeR/safer-buffer/issues" + }, + "description": "Modern Buffer API polyfill without footguns", + "devDependencies": { + "standard": "^11.0.1", + "tape": "^4.9.0" + }, + "files": [ + "Porting-Buffer.md", + "Readme.md", + "tests.js", + "dangerous.js", + "safer.js" + ], + "homepage": "https://github.com/ChALkeR/safer-buffer#readme", + "license": "MIT", + "main": "safer.js", + "name": "safer-buffer", + "repository": { + "type": "git", + "url": "git+https://github.com/ChALkeR/safer-buffer.git" + }, + "scripts": { + "browserify-test": "browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js", + "test": "standard && tape tests.js" + }, + "version": "2.1.2" +} diff --git a/node_modules/safer-buffer/safer.js b/node_modules/safer-buffer/safer.js new file mode 100644 index 0000000..37c7e1a --- /dev/null +++ b/node_modules/safer-buffer/safer.js @@ -0,0 +1,77 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer + +var safer = {} + +var key + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue + if (key === 'SlowBuffer' || key === 'Buffer') continue + safer[key] = buffer[key] +} + +var Safer = safer.Buffer = {} +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue + Safer[key] = Buffer[key] +} + +safer.Buffer.prototype = Buffer.prototype + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value) + } + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value) + } + return Buffer(value, encodingOrOffset, length) + } +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + var buf = Buffer(size) + if (!fill || fill.length === 0) { + buf.fill(0) + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + return buf + } +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength + } catch (e) { + // we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + } + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength + } +} + +module.exports = safer diff --git a/node_modules/safer-buffer/tests.js b/node_modules/safer-buffer/tests.js new file mode 100644 index 0000000..7ed2777 --- /dev/null +++ b/node_modules/safer-buffer/tests.js @@ -0,0 +1,406 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var test = require('tape') + +var buffer = require('buffer') + +var index = require('./') +var safer = require('./safer') +var dangerous = require('./dangerous') + +/* Inheritance tests */ + +test('Default is Safer', function (t) { + t.equal(index, safer) + t.notEqual(safer, dangerous) + t.notEqual(index, dangerous) + t.end() +}) + +test('Is not a function', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'object') + }); + [buffer].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'function') + }) + t.end() +}) + +test('Constructor throws', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer() }) + t.throws(function () { impl.Buffer(0) }) + t.throws(function () { impl.Buffer('a') }) + t.throws(function () { impl.Buffer('a', 'utf-8') }) + t.throws(function () { return new impl.Buffer() }) + t.throws(function () { return new impl.Buffer(0) }) + t.throws(function () { return new impl.Buffer('a') }) + t.throws(function () { return new impl.Buffer('a', 'utf-8') }) + }) + t.end() +}) + +test('Safe methods exist', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.alloc, 'function', 'alloc') + t.equal(typeof impl.Buffer.from, 'function', 'from') + }) + t.end() +}) + +test('Unsafe methods exist only in Dangerous', function (t) { + [index, safer].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'undefined') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined') + }); + [dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'function') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function') + }) + t.end() +}) + +test('Generic methods/properties are defined and equal', function (t) { + ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in buffer static methods/properties are inherited', function (t) { + Object.keys(buffer).forEach(function (method) { + if (method === 'SlowBuffer' || method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], buffer[method], method) + t.notEqual(typeof impl[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in Buffer static methods/properties are inherited', function (t) { + Object.keys(buffer.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('.prototype property of Buffer is inherited', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype') + t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype') + }) + t.end() +}) + +test('All Safer methods are present in Dangerous', function (t) { + Object.keys(safer).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], safer[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(safer.Buffer).forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], safer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Safe methods from Dangerous methods are present in Safer', function (t) { + Object.keys(dangerous).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], dangerous[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(dangerous.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], dangerous.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +/* Behaviour tests */ + +test('Methods return Buffers', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(''))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3]))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3])))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([]))) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0))) + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10))) + }) + t.end() +}) + +test('Constructor is buffer.Buffer', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer) + t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer) + t.equal(impl.Buffer.from([]).constructor, buffer.Buffer) + }); + [0, 10, 100].forEach(function (arg) { + t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer) + t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor) + }) + t.end() +}) + +test('Invalid calls throw', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer.from(0) }) + t.throws(function () { impl.Buffer.from(10) }) + t.throws(function () { impl.Buffer.from(10, 'utf-8') }) + t.throws(function () { impl.Buffer.from('string', 'invalid encoding') }) + t.throws(function () { impl.Buffer.from(-10) }) + t.throws(function () { impl.Buffer.from(1e90) }) + t.throws(function () { impl.Buffer.from(Infinity) }) + t.throws(function () { impl.Buffer.from(-Infinity) }) + t.throws(function () { impl.Buffer.from(NaN) }) + t.throws(function () { impl.Buffer.from(null) }) + t.throws(function () { impl.Buffer.from(undefined) }) + t.throws(function () { impl.Buffer.from() }) + t.throws(function () { impl.Buffer.from({}) }) + t.throws(function () { impl.Buffer.alloc('') }) + t.throws(function () { impl.Buffer.alloc('string') }) + t.throws(function () { impl.Buffer.alloc('string', 'utf-8') }) + t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') }) + t.throws(function () { impl.Buffer.alloc(-10) }) + t.throws(function () { impl.Buffer.alloc(1e90) }) + t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) }) + t.throws(function () { impl.Buffer.alloc(Infinity) }) + t.throws(function () { impl.Buffer.alloc(-Infinity) }) + t.throws(function () { impl.Buffer.alloc(null) }) + t.throws(function () { impl.Buffer.alloc(undefined) }) + t.throws(function () { impl.Buffer.alloc() }) + t.throws(function () { impl.Buffer.alloc([]) }) + t.throws(function () { impl.Buffer.alloc([0, 42, 3]) }) + t.throws(function () { impl.Buffer.alloc({}) }) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.throws(function () { dangerous.Buffer[method]('') }) + t.throws(function () { dangerous.Buffer[method]('string') }) + t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') }) + t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) }) + t.throws(function () { dangerous.Buffer[method](Infinity) }) + if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) { + t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0') + } else { + t.throws(function () { dangerous.Buffer[method](-10) }) + t.throws(function () { dangerous.Buffer[method](-1e90) }) + t.throws(function () { dangerous.Buffer[method](-Infinity) }) + } + t.throws(function () { dangerous.Buffer[method](null) }) + t.throws(function () { dangerous.Buffer[method](undefined) }) + t.throws(function () { dangerous.Buffer[method]() }) + t.throws(function () { dangerous.Buffer[method]([]) }) + t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) }) + t.throws(function () { dangerous.Buffer[method]({}) }) + }) + t.end() +}) + +test('Buffers have appropriate lengths', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).length, 0) + t.equal(impl.Buffer.alloc(10).length, 10) + t.equal(impl.Buffer.from('').length, 0) + t.equal(impl.Buffer.from('string').length, 6) + t.equal(impl.Buffer.from('string', 'utf-8').length, 6) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11) + t.equal(impl.Buffer.from([0, 42, 3]).length, 3) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3) + t.equal(impl.Buffer.from([]).length, 0) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.equal(dangerous.Buffer[method](0).length, 0) + t.equal(dangerous.Buffer[method](10).length, 10) + }) + t.end() +}) + +test('Buffers have appropriate lengths (2)', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true; + [ safer.Buffer.alloc, + dangerous.Buffer.allocUnsafe, + dangerous.Buffer.allocUnsafeSlow + ].forEach(function (method) { + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 1e5) + var buf = method(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + } + }) + t.ok(ok) + t.end() +}) + +test('.alloc(size) is zero-filled and has correct length', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = index.Buffer.alloc(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) { + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = dangerous.Buffer[method](length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + buf.fill(0, 0, length) + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1, 0, length) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok, method) + }) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97)) + t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98)) + + var tmp = new buffer.Buffer(2) + tmp.fill('ok') + if (tmp[1] === tmp[0]) { + // Outdated Node.js + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo')) + } else { + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko')) + } + t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok')) + + t.end() +}) + +test('safer.Buffer.from returns results same as Buffer constructor', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), new buffer.Buffer('')) + t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string')) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8')) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64')) + t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3])) + t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3]))) + t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([])) + }) + t.end() +}) + +test('safer.Buffer.from returns consistent results', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string')) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103])) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string'))) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree')) + t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree')) + }) + t.end() +}) diff --git a/node_modules/sax/LICENSE b/node_modules/sax/LICENSE new file mode 100644 index 0000000..ccffa08 --- /dev/null +++ b/node_modules/sax/LICENSE @@ -0,0 +1,41 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + 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/sax/README.md b/node_modules/sax/README.md new file mode 100644 index 0000000..afcd3f3 --- /dev/null +++ b/node_modules/sax/README.md @@ -0,0 +1,225 @@ +# sax js + +A sax-style parser for XML and HTML. + +Designed with [node](http://nodejs.org/) in mind, but should work fine in +the browser or other CommonJS implementations. + +## What This Is + +* A very simple tool to parse through an XML string. +* A stepping stone to a streaming HTML parser. +* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML + docs. + +## What This Is (probably) Not + +* An HTML Parser - That's a fine goal, but this isn't it. It's just + XML. +* A DOM Builder - You can use it to build an object model out of XML, + but it doesn't do that out of the box. +* XSLT - No DOM = no querying. +* 100% Compliant with (some other SAX implementation) - Most SAX + implementations are in Java and do a lot more than this does. +* An XML Validator - It does a little validation when in strict mode, but + not much. +* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic + masochism. +* A DTD-aware Thing - Fetching DTDs is a much bigger job. + +## Regarding `Hello, world!').close(); + +// stream usage +// takes the same options as the parser +var saxStream = require("sax").createStream(strict, options) +saxStream.on("error", function (e) { + // unhandled errors will throw, since this is a proper node + // event emitter. + console.error("error!", e) + // clear the error + this._parser.error = null + this._parser.resume() +}) +saxStream.on("opentag", function (node) { + // same object as above +}) +// pipe is supported, and it's readable/writable +// same chunks coming in also go out. +fs.createReadStream("file.xml") + .pipe(saxStream) + .pipe(fs.createWriteStream("file-copy.xml")) +``` + + +## Arguments + +Pass the following arguments to the parser function. All are optional. + +`strict` - Boolean. Whether or not to be a jerk. Default: `false`. + +`opt` - Object bag of settings regarding string formatting. All default to `false`. + +Settings supported: + +* `trim` - Boolean. Whether or not to trim text and comment nodes. +* `normalize` - Boolean. If true, then turn any whitespace into a single + space. +* `lowercase` - Boolean. If true, then lowercase tag names and attribute names + in loose mode, rather than uppercasing them. +* `xmlns` - Boolean. If true, then namespaces are supported. +* `position` - Boolean. If false, then don't track line/col/position. +* `strictEntities` - Boolean. If true, only parse [predefined XML + entities](http://www.w3.org/TR/REC-xml/#sec-predefined-ent) + (`&`, `'`, `>`, `<`, and `"`) + +## Methods + +`write` - Write bytes onto the stream. You don't have to do this all at +once. You can keep writing as much as you want. + +`close` - Close the stream. Once closed, no more data may be written until +it is done processing the buffer, which is signaled by the `end` event. + +`resume` - To gracefully handle errors, assign a listener to the `error` +event. Then, when the error is taken care of, you can call `resume` to +continue parsing. Otherwise, the parser will not continue while in an error +state. + +## Members + +At all times, the parser object will have the following members: + +`line`, `column`, `position` - Indications of the position in the XML +document where the parser currently is looking. + +`startTagPosition` - Indicates the position where the current tag starts. + +`closed` - Boolean indicating whether or not the parser can be written to. +If it's `true`, then wait for the `ready` event to write again. + +`strict` - Boolean indicating whether or not the parser is a jerk. + +`opt` - Any options passed into the constructor. + +`tag` - The current tag being dealt with. + +And a bunch of other stuff that you probably shouldn't touch. + +## Events + +All events emit with a single argument. To listen to an event, assign a +function to `on`. Functions get executed in the this-context of +the parser object. The list of supported events are also in the exported +`EVENTS` array. + +When using the stream interface, assign handlers using the EventEmitter +`on` function in the normal fashion. + +`error` - Indication that something bad happened. The error will be hanging +out on `parser.error`, and must be deleted before parsing can continue. By +listening to this event, you can keep an eye on that kind of stuff. Note: +this happens *much* more in strict mode. Argument: instance of `Error`. + +`text` - Text node. Argument: string of text. + +`doctype` - The ``. Argument: +object with `name` and `body` members. Attributes are not parsed, as +processing instructions have implementation dependent semantics. + +`sgmldeclaration` - Random SGML declarations. Stuff like `` +would trigger this kind of event. This is a weird thing to support, so it +might go away at some point. SAX isn't intended to be used to parse SGML, +after all. + +`opentagstart` - Emitted immediately when the tag name is available, +but before any attributes are encountered. Argument: object with a +`name` field and an empty `attributes` set. Note that this is the +same object that will later be emitted in the `opentag` event. + +`opentag` - An opening tag. Argument: object with `name` and `attributes`. +In non-strict mode, tag names are uppercased, unless the `lowercase` +option is set. If the `xmlns` option is set, then it will contain +namespace binding information on the `ns` member, and will have a +`local`, `prefix`, and `uri` member. + +`closetag` - A closing tag. In loose mode, tags are auto-closed if their +parent closes. In strict mode, well-formedness is enforced. Note that +self-closing tags will have `closeTag` emitted immediately after `openTag`. +Argument: tag name. + +`attribute` - An attribute node. Argument: object with `name` and `value`. +In non-strict mode, attribute names are uppercased, unless the `lowercase` +option is set. If the `xmlns` option is set, it will also contains namespace +information. + +`comment` - A comment node. Argument: the string of the comment. + +`opencdata` - The opening tag of a ``) of a `` tags trigger a `"script"` +event, and their contents are not checked for special xml characters. +If you pass `noscript: true`, then this behavior is suppressed. + +## Reporting Problems + +It's best to write a failing test if you find an issue. I will always +accept pull requests with failing tests if they demonstrate intended +behavior, but it is very hard to figure out what issue you're describing +without a test. Writing a test is also the best way for you yourself +to figure out if you really understand the issue you think you have with +sax-js. diff --git a/node_modules/sax/lib/sax.js b/node_modules/sax/lib/sax.js new file mode 100644 index 0000000..795d607 --- /dev/null +++ b/node_modules/sax/lib/sax.js @@ -0,0 +1,1565 @@ +;(function (sax) { // wrapper for non-node envs + sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } + sax.SAXParser = SAXParser + sax.SAXStream = SAXStream + sax.createStream = createStream + + // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. + // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), + // since that's the earliest that a buffer overrun could occur. This way, checks are + // as rare as required, but as often as necessary to ensure never crossing this bound. + // Furthermore, buffers are only tested at most once per write(), so passing a very + // large string into write() might have undesirable effects, but this is manageable by + // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme + // edge case, result in creating at most one complete copy of the string passed in. + // Set to Infinity to have unlimited buffers. + sax.MAX_BUFFER_LENGTH = 64 * 1024 + + var buffers = [ + 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', + 'procInstName', 'procInstBody', 'entity', 'attribName', + 'attribValue', 'cdata', 'script' + ] + + sax.EVENTS = [ + 'text', + 'processinginstruction', + 'sgmldeclaration', + 'doctype', + 'comment', + 'opentagstart', + 'attribute', + 'opentag', + 'closetag', + 'opencdata', + 'cdata', + 'closecdata', + 'error', + 'end', + 'ready', + 'script', + 'opennamespace', + 'closenamespace' + ] + + function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) { + return new SAXParser(strict, opt) + } + + var parser = this + clearBuffers(parser) + parser.q = parser.c = '' + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase' + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.strictEntities = parser.opt.strictEntities + parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) { + parser.ns = Object.create(rootNS) + } + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, 'onready') + } + + if (!Object.create) { + Object.create = function (o) { + function F () {} + F.prototype = o + var newf = new F() + return newf + } + } + + if (!Object.keys) { + Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a + } + } + + function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + var maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case 'textNode': + closeText(parser) + break + + case 'cdata': + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + break + + case 'script': + emitNode(parser, 'onscript', parser.script) + parser.script = '' + break + + default: + error(parser, 'Max buffer length exceeded: ' + buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + var m = sax.MAX_BUFFER_LENGTH - maxActual + parser.bufferCheckPosition = m + parser.position + } + + function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i++) { + parser[buffers[i]] = '' + } + } + + function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== '') { + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + } + if (parser.script !== '') { + emitNode(parser, 'onscript', parser.script) + parser.script = '' + } + } + + SAXParser.prototype = { + end: function () { end(this) }, + write: write, + resume: function () { this.error = null; return this }, + close: function () { return this.write(null) }, + flush: function () { flushBuffers(this) } + } + + var Stream + try { + Stream = require('stream').Stream + } catch (ex) { + Stream = function () {} + } + + var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== 'error' && ev !== 'end' + }) + + function createStream (strict, opt) { + return new SAXStream(strict, opt) + } + + function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) { + return new SAXStream(strict, opt) + } + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + var me = this + + this._parser.onend = function () { + me.emit('end') + } + + this._parser.onerror = function (er) { + me.emit('error', er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, 'on' + ev, { + get: function () { + return me._parser['on' + ev] + }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + me._parser['on' + ev] = h + return h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) + } + + SAXStream.prototype = Object.create(Stream.prototype, { + constructor: { + value: SAXStream + } + }) + + SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = require('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data) + } + + this._parser.write(data.toString()) + this.emit('data', data) + return true + } + + SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) { + this.write(chunk) + } + this._parser.end() + return true + } + + SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { + me._parser['on' + ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) + } + + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + var CDATA = '[CDATA[' + var DOCTYPE = 'DOCTYPE' + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' + var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' + var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + + // http://www.w3.org/TR/REC-xml/#NT-NameStartChar + // This implementation works on strings, a single character at a time + // as such, it cannot ever support astral-plane characters (10000-EFFFF) + // without a significant breaking change to either this parser, or the + // JavaScript language. Implementation of an emoji-capable xml parser + // is left as an exercise for the reader. + var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + + var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + + var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + + function isWhitespace (c) { + return c === ' ' || c === '\n' || c === '\r' || c === '\t' + } + + function isQuote (c) { + return c === '"' || c === '\'' + } + + function isAttribEnd (c) { + return c === '>' || isWhitespace(c) + } + + function isMatch (regex, c) { + return regex.test(c) + } + + function notMatch (regex, c) { + return !isMatch(regex, c) + } + + var S = 0 + sax.STATE = { + BEGIN: S++, // leading byte order mark or whitespace + BEGIN_WHITESPACE: S++, // leading whitespace + TEXT: S++, // general stuff + TEXT_ENTITY: S++, // & and such. + OPEN_WAKA: S++, // < + SGML_DECL: S++, // + SCRIPT: S++, // + +-------------------------------------------------------------------------------- + + + + + +## Table of Contents + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +```js +var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +``` + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] + +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }) +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: Optional. The column number in the original source. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj") +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { console.log(m); }) +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/" +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +* `sourceMapConsumer` The SourceMap. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 } +}) +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +```js +generator.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString() +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8")); +var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), + consumer); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +```js +node.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.walk(function (code, loc) { console.log("WALK:", code, loc); }) +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toString() +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }) +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/node_modules/source-map/dist/source-map.debug.js b/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 0000000..b5ab638 --- /dev/null +++ b/node_modules/source-map/dist/source-map.debug.js @@ -0,0 +1,3091 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlNDczOGZjNzJhN2IyMzAzOTg4OSIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTBDLFNBQVM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDL1pBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUEyRDtBQUMzRCxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7Ozs7Ozs7QUMzSUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWdCO0FBQ2hCLGlCQUFnQjs7QUFFaEIsb0JBQW1CO0FBQ25CLHFCQUFvQjs7QUFFcEIsaUJBQWdCO0FBQ2hCLGlCQUFnQjs7QUFFaEIsaUJBQWdCO0FBQ2hCLGtCQUFpQjs7QUFFakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNsRUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNoYUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXNDLFNBQVM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQzlFQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxvQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLG1CQUFtQixFQUFFO0FBQ3BFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE2QixNQUFNO0FBQ25DO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLElBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUMsc0JBQXFCLCtDQUErQztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBLHNCQUFxQiw0QkFBNEI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FDempDQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7OztBQzlHQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVcsTUFBTTtBQUNqQjtBQUNBLFlBQVcsT0FBTztBQUNsQjtBQUNBLFlBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLFNBQVM7QUFDcEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ2pIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsU0FBUztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBb0I7QUFDcEI7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNEMsY0FBYztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBLFlBQVc7QUFDWDtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUc7O0FBRUgsV0FBVTtBQUNWOztBQUVBIiwiZmlsZSI6InNvdXJjZS1tYXAuZGVidWcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzb3VyY2VNYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGU0NzM4ZmM3MmE3YjIzMDM5ODg5IiwiLypcbiAqIENvcHlyaWdodCAyMDA5LTIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2Utbm9kZScpLlNvdXJjZU5vZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NvdXJjZS1tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAqL1xuZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gIGlmICghYUFyZ3MpIHtcbiAgICBhQXJncyA9IHt9O1xuICB9XG4gIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbn1cblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gU3RyaW5nKHNvdXJjZSk7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgfVxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgfVxuICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAqXG4gKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAqICAgICAgdG9rZW4uXG4gKlxuICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAvLyBXaGVuIGFPcmlnaW5hbCBpcyB0cnV0aHkgYnV0IGhhcyBlbXB0eSB2YWx1ZXMgZm9yIC5saW5lIGFuZCAuY29sdW1uLFxuICAgIC8vIGl0IGlzIG1vc3QgbGlrZWx5IGEgcHJvZ3JhbW1lciBlcnJvci4gSW4gdGhpcyBjYXNlIHdlIHRocm93IGEgdmVyeVxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgdG8gdHJ5IHRvIGd1aWRlIHRoZW0gdGhlIHJpZ2h0IHdheS5cbiAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci1idW5kbGVyL3B1bGwvNTE5XG4gICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICdudW1iZXInICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnb3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCAnICtcbiAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgJyArXG4gICAgICAgICAgICAnbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgIC8vIENhc2UgMS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBuZXh0O1xuICAgIHZhciBtYXBwaW5nO1xuICAgIHZhciBuYW1lSWR4O1xuICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG4gICAgICBuZXh0ID0gJydcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbmV4dCArPSAnOyc7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQgKz0gJywnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VJZHggPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHNvdXJjZUlkeDtcblxuICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLCBrZXkpXG4gICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgOiBudWxsO1xuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgdmFyIG1hcCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9O1xuXG4vKipcbiAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmFzZTY0LXZscS5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBpbnRUb0NoYXJNYXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuXG4vKipcbiAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG51bWJlcikge1xuICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBpbnRUb0NoYXJNYXBbbnVtYmVyXTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAqIGZhaWx1cmUuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gIHZhciBiaWdBID0gNjU7ICAgICAvLyAnQSdcbiAgdmFyIGJpZ1ogPSA5MDsgICAgIC8vICdaJ1xuXG4gIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgdmFyIGxpdHRsZVogPSAxMjI7IC8vICd6J1xuXG4gIHZhciB6ZXJvID0gNDg7ICAgICAvLyAnMCdcbiAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gIHZhciBwbHVzID0gNDM7ICAgICAvLyAnKydcbiAgdmFyIHNsYXNoID0gNDc7ICAgIC8vICcvJ1xuXG4gIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgdmFyIG51bWJlck9mZnNldCA9IDUyO1xuXG4gIC8vIDAgLSAyNTogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBiaWdBKTtcbiAgfVxuXG4gIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gIGlmIChsaXR0bGVBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGxpdHRsZVopIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gbGl0dGxlQSArIGxpdHRsZU9mZnNldCk7XG4gIH1cblxuICAvLyA1MiAtIDYxOiAwMTIzNDU2Nzg5XG4gIGlmICh6ZXJvIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IG5pbmUpIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gIH1cblxuICAvLyA2MjogK1xuICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgIHJldHVybiA2MjtcbiAgfVxuXG4gIC8vIDYzOiAvXG4gIGlmIChjaGFyQ29kZSA9PSBzbGFzaCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuXG4gIC8vIEludmFsaWQgYmFzZTY0IGRpZ2l0LlxuICByZXR1cm4gLTE7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmFzZTY0LmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3ZSBhcmUgZ2V0dGluZy5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gKiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICBpZiAoYU5hbWUgaW4gYUFyZ3MpIHtcbiAgICByZXR1cm4gYUFyZ3NbYU5hbWVdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYURlZmF1bHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gIH1cbn1cbmV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG52YXIgdXJsUmVnZXhwID0gL14oPzooW1xcdytcXC0uXSspOik/XFwvXFwvKD86KFxcdys6XFx3KylAKT8oW1xcdy5dKikoPzo6KFxcZCspKT8oXFxTKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgISFhUGF0aC5tYXRjaCh1cmxSZWdleHApO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkO1xuXG5mdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gIGlmIChhU3RyMSA9PT0gYVN0cjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXApIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKGFTb3VyY2VNYXAucmVwbGFjZSgvXlxcKVxcXVxcfScvLCAnJykpO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MpIHtcbiAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19vcmlnaW5hbE1hcHBpbmdzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4oc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHtcbiAgICB2YXIgbGluZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpO1xuXG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWFwcGluZyBsZXNzIHRoYW4gdGhlIG5lZWRsZS4gQnlcbiAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byAwLCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3QgbWFwcGluZyBmb3JcbiAgICAvLyB0aGUgZ2l2ZW4gbGluZSwgcHJvdmlkZWQgc3VjaCBhIG1hcHBpbmcgZXhpc3RzLlxuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICBvcmlnaW5hbExpbmU6IGxpbmUsXG4gICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nLCAwKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc291cmNlcy5oYXMobmVlZGxlLnNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihuZWVkbGUuc291cmNlKTtcblxuICAgIHZhciBtYXBwaW5ncyA9IFtdO1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAoYUFyZ3MuY29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2UgZm91bmQuIFNpbmNlXG4gICAgICAgIC8vIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgZm91bmQuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBvcmlnaW5hbExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICAvLyBTaW5jZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IGxpbmUgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdzO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaCB3ZSBjYW5cbiAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICogcG9zaXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKlxuICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgc291cmNlcyA9IHNvdXJjZXNcbiAgICAubWFwKFN0cmluZylcbiAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAvLyBcImZvby5qc1wiLiAgTm9ybWFsaXplIHRoZXNlIGZpcnN0IHNvIHRoYXQgZnV0dXJlIGNvbXBhcmlzb25zIHdpbGwgc3VjY2VlZC5cbiAgICAvLyBTZWUgYnVnemlsLmxhLzEwOTA3NjguXG4gICAgLm1hcCh1dGlsLm5vcm1hbGl6ZSlcbiAgICAvLyBBbHdheXMgZW5zdXJlIHRoYXQgYWJzb2x1dGUgc291cmNlcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgcmVsYXRpdmUgdG9cbiAgICAvLyB0aGUgc291cmNlIHJvb3QsIGlmIHRoZSBzb3VyY2Ugcm9vdCBpcyBhYnNvbHV0ZS4gTm90IGRvaW5nIHRoaXMgd291bGRcbiAgICAvLyBiZSBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgd2hlbiB0aGUgc291cmNlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlXG4gICAgLy8gc291cmNlICh2YWxpZCwgYnV0IHdoeT8/KS4gU2VlIGdpdGh1YiBpc3N1ZSAjMTk5IGFuZCBidWd6aWwubGEvMTE4ODk4Mi5cbiAgICAubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2VSb290ICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2VSb290KSAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlKVxuICAgICAgICA/IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlKVxuICAgICAgICA6IHNvdXJjZTtcbiAgICB9KTtcblxuICAvLyBQYXNzIGB0cnVlYCBiZWxvdyB0byBhbGxvdyBkdXBsaWNhdGUgbmFtZXMgYW5kIHNvdXJjZXMuIFdoaWxlIHNvdXJjZSBtYXBzXG4gIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgLy8gIzcyIGFuZCBidWd6aWwubGEvODg5NDkyLlxuICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcy5tYXAoU3RyaW5nKSwgdHJ1ZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICB0aGlzLmZpbGUgPSBmaWxlO1xufVxuXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4odGhpcy5zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbCk7XG4gICAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmF0KG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbmFtZTogbnVsbFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMgPVxuICBmdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudC5sZW5ndGggPj0gdGhpcy5fc291cmNlcy5zaXplKCkgJiZcbiAgICAgICF0aGlzLnNvdXJjZXNDb250ZW50LnNvbWUoZnVuY3Rpb24gKHNjKSB7IHJldHVybiBzYyA9PSBudWxsOyB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBhU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIGFTb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGFTb3VyY2UpXTtcbiAgICB9XG5cbiAgICB2YXIgdXJsO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbFxuICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgLy8gWFhYOiBmaWxlOi8vIFVSSXMgYW5kIGFic29sdXRlIHBhdGhzIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBmb3JcbiAgICAgIC8vIG1hbnkgdXNlcnMuIFdlIGNhbiBoZWxwIHRoZW0gb3V0IHdoZW4gdGhleSBleHBlY3QgZmlsZTovLyBVUklzIHRvXG4gICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4NTU5Ny5cbiAgICAgIHZhciBmaWxlVXJpQWJzUGF0aCA9IGFTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgIC8vIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvci4gSW4gdGhhdCBjYXNlLCB3ZVxuICAgIC8vIGRvbid0IHdhbnQgdG8gdGhyb3cgaWYgd2UgY2FuJ3QgZmluZCB0aGUgc291cmNlIC0gd2UganVzdCB3YW50IHRvXG4gICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBvbmx5IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQjaGVhZGluZz1oLjUzNWVzM3hlcHJndFxuICovXG5mdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSlcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgLy8gT25seSBjb25zaWRlciB0aGlzIHNlY3Rpb24gaWYgdGhlIHJlcXVlc3RlZCBzb3VyY2UgaXMgaW4gdGhlIGxpc3Qgb2ZcbiAgICAgIC8vIHNvdXJjZXMgb2YgdGhlIGNvbnN1bWVyLlxuICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlcy5pbmRleE9mKHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKHNvdXJjZSk7XG5cbiAgICAgICAgdmFyIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF07XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/node_modules/source-map/dist/source-map.js b/node_modules/source-map/dist/source-map.js new file mode 100644 index 0000000..4e630e2 --- /dev/null +++ b/node_modules/source-map/dist/source-map.js @@ -0,0 +1,3090 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }()); + + function identity (s) { + return s; + } + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + + function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== "undefined"; + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/node_modules/source-map/dist/source-map.min.js b/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 0000000..f2a46bd --- /dev/null +++ b/node_modules/source-map/dist/source-map.min.js @@ -0,0 +1,2 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&r.setSourceContent(n,t)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(_))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=e.source-n.source;return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:e.name-n.name))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=e.source-n.source,0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:e.name-n.name))))}function f(e,n){return e===n?0:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}n.getArg=r;var m=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/,_=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(m)},n.relative=a;var v=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=v?u:l,n.fromSetString=v?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&er||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e){var n=e;return"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,""))),null!=n.sections?new s(n):new o(n)}function o(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),t=a.getArg(n,"sources"),o=a.getArg(n,"names",[]),i=a.getArg(n,"sourceRoot",null),s=a.getArg(n,"sourcesContent",null),u=a.getArg(n,"mappings"),c=a.getArg(n,"file",null);if(r!=this._version)throw new Error("Unsupported version: "+r);t=t.map(String).map(a.normalize).map(function(e){return i&&a.isAbsolute(i)&&a.isAbsolute(e)?a.relative(i,e):e}),this._names=l.fromArray(o.map(String),!0),this._sources=l.fromArray(t,!0),this.sourceRoot=i,this.sourcesContent=s,this._mappings=u,this.file=c}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),o=a.getArg(n,"sections");if(r!=this._version)throw new Error("Unsupported version: "+r);this._sources=new l,this._names=new l;var i={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var n=a.getArg(e,"offset"),r=a.getArg(n,"line"),o=a.getArg(n,"column");if(r=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.fromSourceMap=function(e){var n=Object.create(o.prototype),r=n._names=l.fromArray(e._names.toArray(),!0),t=n._sources=l.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var s=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=s.length;p1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),S.push(r),"number"==typeof r.originalLine&&A.push(r)}g(S,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=S,g(A,a.compareByOriginalPositions),this.__originalMappings=A},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=a.join(this.sourceRoot,i)));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=a.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=a.urlParse(this.sourceRoot))){var t=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(t))return this.sourcesContent[this._sources.indexOf(t)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};n=this._sources.indexOf(n);var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r0){for(n=[],r=0;r 0 && aGenerated.column >= 0\n\t && !aOriginal && !aSource && !aName) {\n\t // Case 1.\n\t return;\n\t }\n\t else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && aOriginal.line > 0 && aOriginal.column >= 0\n\t && aSource) {\n\t // Cases 2 and 3.\n\t return;\n\t }\n\t else {\n\t throw new Error('Invalid mapping: ' + JSON.stringify({\n\t generated: aGenerated,\n\t source: aSource,\n\t original: aOriginal,\n\t name: aName\n\t }));\n\t }\n\t };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t function SourceMapGenerator_serializeMappings() {\n\t var previousGeneratedColumn = 0;\n\t var previousGeneratedLine = 1;\n\t var previousOriginalColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousName = 0;\n\t var previousSource = 0;\n\t var result = '';\n\t var next;\n\t var mapping;\n\t var nameIdx;\n\t var sourceIdx;\n\t\n\t var mappings = this._mappings.toArray();\n\t for (var i = 0, len = mappings.length; i < len; i++) {\n\t mapping = mappings[i];\n\t next = ''\n\t\n\t if (mapping.generatedLine !== previousGeneratedLine) {\n\t previousGeneratedColumn = 0;\n\t while (mapping.generatedLine !== previousGeneratedLine) {\n\t next += ';';\n\t previousGeneratedLine++;\n\t }\n\t }\n\t else {\n\t if (i > 0) {\n\t if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t continue;\n\t }\n\t next += ',';\n\t }\n\t }\n\t\n\t next += base64VLQ.encode(mapping.generatedColumn\n\t - previousGeneratedColumn);\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (mapping.source != null) {\n\t sourceIdx = this._sources.indexOf(mapping.source);\n\t next += base64VLQ.encode(sourceIdx - previousSource);\n\t previousSource = sourceIdx;\n\t\n\t // lines are stored 0-based in SourceMap spec version 3\n\t next += base64VLQ.encode(mapping.originalLine - 1\n\t - previousOriginalLine);\n\t previousOriginalLine = mapping.originalLine - 1;\n\t\n\t next += base64VLQ.encode(mapping.originalColumn\n\t - previousOriginalColumn);\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (mapping.name != null) {\n\t nameIdx = this._names.indexOf(mapping.name);\n\t next += base64VLQ.encode(nameIdx - previousName);\n\t previousName = nameIdx;\n\t }\n\t }\n\t\n\t result += next;\n\t }\n\t\n\t return result;\n\t };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t return aSources.map(function (source) {\n\t if (!this._sourcesContents) {\n\t return null;\n\t }\n\t if (aSourceRoot != null) {\n\t source = util.relative(aSourceRoot, source);\n\t }\n\t var key = util.toSetString(source);\n\t return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t ? this._sourcesContents[key]\n\t : null;\n\t }, this);\n\t };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t function SourceMapGenerator_toJSON() {\n\t var map = {\n\t version: this._version,\n\t sources: this._sources.toArray(),\n\t names: this._names.toArray(),\n\t mappings: this._serializeMappings()\n\t };\n\t if (this._file != null) {\n\t map.file = this._file;\n\t }\n\t if (this._sourceRoot != null) {\n\t map.sourceRoot = this._sourceRoot;\n\t }\n\t if (this._sourcesContents) {\n\t map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t }\n\t\n\t return map;\n\t };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t function SourceMapGenerator_toString() {\n\t return JSON.stringify(this.toJSON());\n\t };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above\n\t * copyright notice, this list of conditions and the following\n\t * disclaimer in the documentation and/or other materials provided\n\t * with the distribution.\n\t * * Neither the name of Google Inc. nor the names of its\n\t * contributors may be used to endorse or promote products derived\n\t * from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t// Continuation\n\t// | Sign\n\t// | |\n\t// V V\n\t// 101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t return aValue < 0\n\t ? ((-aValue) << 1) + 1\n\t : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t var isNegative = (aValue & 1) === 1;\n\t var shifted = aValue >> 1;\n\t return isNegative\n\t ? -shifted\n\t : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t var encoded = \"\";\n\t var digit;\n\t\n\t var vlq = toVLQSigned(aValue);\n\t\n\t do {\n\t digit = vlq & VLQ_BASE_MASK;\n\t vlq >>>= VLQ_BASE_SHIFT;\n\t if (vlq > 0) {\n\t // There are still more digits in this value, so we must make sure the\n\t // continuation bit is marked.\n\t digit |= VLQ_CONTINUATION_BIT;\n\t }\n\t encoded += base64.encode(digit);\n\t } while (vlq > 0);\n\t\n\t return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t var strLen = aStr.length;\n\t var result = 0;\n\t var shift = 0;\n\t var continuation, digit;\n\t\n\t do {\n\t if (aIndex >= strLen) {\n\t throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t }\n\t\n\t digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t if (digit === -1) {\n\t throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t }\n\t\n\t continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t digit &= VLQ_BASE_MASK;\n\t result = result + (digit << shift);\n\t shift += VLQ_BASE_SHIFT;\n\t } while (continuation);\n\t\n\t aOutParam.value = fromVLQSigned(result);\n\t aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t if (0 <= number && number < intToCharMap.length) {\n\t return intToCharMap[number];\n\t }\n\t throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t var bigA = 65; // 'A'\n\t var bigZ = 90; // 'Z'\n\t\n\t var littleA = 97; // 'a'\n\t var littleZ = 122; // 'z'\n\t\n\t var zero = 48; // '0'\n\t var nine = 57; // '9'\n\t\n\t var plus = 43; // '+'\n\t var slash = 47; // '/'\n\t\n\t var littleOffset = 26;\n\t var numberOffset = 52;\n\t\n\t // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t if (bigA <= charCode && charCode <= bigZ) {\n\t return (charCode - bigA);\n\t }\n\t\n\t // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t if (littleA <= charCode && charCode <= littleZ) {\n\t return (charCode - littleA + littleOffset);\n\t }\n\t\n\t // 52 - 61: 0123456789\n\t if (zero <= charCode && charCode <= nine) {\n\t return (charCode - zero + numberOffset);\n\t }\n\t\n\t // 62: +\n\t if (charCode == plus) {\n\t return 62;\n\t }\n\t\n\t // 63: /\n\t if (charCode == slash) {\n\t return 63;\n\t }\n\t\n\t // Invalid base64 digit.\n\t return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t if (aName in aArgs) {\n\t return aArgs[aName];\n\t } else if (arguments.length === 3) {\n\t return aDefaultValue;\n\t } else {\n\t throw new Error('\"' + aName + '\" is a required argument.');\n\t }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t var match = aUrl.match(urlRegexp);\n\t if (!match) {\n\t return null;\n\t }\n\t return {\n\t scheme: match[1],\n\t auth: match[2],\n\t host: match[3],\n\t port: match[4],\n\t path: match[5]\n\t };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t var url = '';\n\t if (aParsedUrl.scheme) {\n\t url += aParsedUrl.scheme + ':';\n\t }\n\t url += '//';\n\t if (aParsedUrl.auth) {\n\t url += aParsedUrl.auth + '@';\n\t }\n\t if (aParsedUrl.host) {\n\t url += aParsedUrl.host;\n\t }\n\t if (aParsedUrl.port) {\n\t url += \":\" + aParsedUrl.port\n\t }\n\t if (aParsedUrl.path) {\n\t url += aParsedUrl.path;\n\t }\n\t return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t var path = aPath;\n\t var url = urlParse(aPath);\n\t if (url) {\n\t if (!url.path) {\n\t return aPath;\n\t }\n\t path = url.path;\n\t }\n\t var isAbsolute = exports.isAbsolute(path);\n\t\n\t var parts = path.split(/\\/+/);\n\t for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t part = parts[i];\n\t if (part === '.') {\n\t parts.splice(i, 1);\n\t } else if (part === '..') {\n\t up++;\n\t } else if (up > 0) {\n\t if (part === '') {\n\t // The first part is blank if the path is absolute. Trying to go\n\t // above the root is a no-op. Therefore we can remove all '..' parts\n\t // directly after the root.\n\t parts.splice(i + 1, up);\n\t up = 0;\n\t } else {\n\t parts.splice(i, 2);\n\t up--;\n\t }\n\t }\n\t }\n\t path = parts.join('/');\n\t\n\t if (path === '') {\n\t path = isAbsolute ? '/' : '.';\n\t }\n\t\n\t if (url) {\n\t url.path = path;\n\t return urlGenerate(url);\n\t }\n\t return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t * first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t * is updated with the result and aRoot is returned. Otherwise the result\n\t * is returned.\n\t * - If aPath is absolute, the result is aPath.\n\t * - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t if (aPath === \"\") {\n\t aPath = \".\";\n\t }\n\t var aPathUrl = urlParse(aPath);\n\t var aRootUrl = urlParse(aRoot);\n\t if (aRootUrl) {\n\t aRoot = aRootUrl.path || '/';\n\t }\n\t\n\t // `join(foo, '//www.example.org')`\n\t if (aPathUrl && !aPathUrl.scheme) {\n\t if (aRootUrl) {\n\t aPathUrl.scheme = aRootUrl.scheme;\n\t }\n\t return urlGenerate(aPathUrl);\n\t }\n\t\n\t if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t return aPath;\n\t }\n\t\n\t // `join('http://', 'www.example.com')`\n\t if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t aRootUrl.host = aPath;\n\t return urlGenerate(aRootUrl);\n\t }\n\t\n\t var joined = aPath.charAt(0) === '/'\n\t ? aPath\n\t : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t if (aRootUrl) {\n\t aRootUrl.path = joined;\n\t return urlGenerate(aRootUrl);\n\t }\n\t return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t\n\t aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t // It is possible for the path to be above the root. In this case, simply\n\t // checking whether the root is a prefix of the path won't work. Instead, we\n\t // need to remove components from the root one by one, until either we find\n\t // a prefix that fits, or we run out of components to remove.\n\t var level = 0;\n\t while (aPath.indexOf(aRoot + '/') !== 0) {\n\t var index = aRoot.lastIndexOf(\"/\");\n\t if (index < 0) {\n\t return aPath;\n\t }\n\t\n\t // If the only part of the root that is left is the scheme (i.e. http://,\n\t // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t // have exhausted all components, so the path is not relative to the root.\n\t aRoot = aRoot.slice(0, index);\n\t if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t return aPath;\n\t }\n\t\n\t ++level;\n\t }\n\t\n\t // Make sure we add a \"../\" for each component we removed from the root.\n\t return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t var obj = Object.create(null);\n\t return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return '$' + aStr;\n\t }\n\t\n\t return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return aStr.slice(1);\n\t }\n\t\n\t return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t if (!s) {\n\t return false;\n\t }\n\t\n\t var length = s.length;\n\t\n\t if (length < 9 /* \"__proto__\".length */) {\n\t return false;\n\t }\n\t\n\t if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 9) !== 95 /* '_' */) {\n\t return false;\n\t }\n\t\n\t for (var i = length - 10; i >= 0; i--) {\n\t if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t var cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0 || onlyCompareOriginal) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0 || onlyCompareGenerated) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t if (aStr1 === aStr2) {\n\t return 0;\n\t }\n\t\n\t if (aStr1 > aStr2) {\n\t return 1;\n\t }\n\t\n\t return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t this._array = [];\n\t this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t var set = new ArraySet();\n\t for (var i = 0, len = aArray.length; i < len; i++) {\n\t set.add(aArray[i], aAllowDuplicates);\n\t }\n\t return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t var idx = this._array.length;\n\t if (!isDuplicate || aAllowDuplicates) {\n\t this._array.push(aStr);\n\t }\n\t if (!isDuplicate) {\n\t if (hasNativeMap) {\n\t this._set.set(aStr, idx);\n\t } else {\n\t this._set[sStr] = idx;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t if (hasNativeMap) {\n\t return this._set.has(aStr);\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t return has.call(this._set, sStr);\n\t }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t if (hasNativeMap) {\n\t var idx = this._set.get(aStr);\n\t if (idx >= 0) {\n\t return idx;\n\t }\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t if (has.call(this._set, sStr)) {\n\t return this._set[sStr];\n\t }\n\t }\n\t\n\t throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t if (aIdx >= 0 && aIdx < this._array.length) {\n\t return this._array[aIdx];\n\t }\n\t throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t // Optimized for most common case\n\t var lineA = mappingA.generatedLine;\n\t var lineB = mappingB.generatedLine;\n\t var columnA = mappingA.generatedColumn;\n\t var columnB = mappingB.generatedColumn;\n\t return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t this._array = [];\n\t this._sorted = true;\n\t // Serves as infimum\n\t this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t function MappingList_forEach(aCallback, aThisArg) {\n\t this._array.forEach(aCallback, aThisArg);\n\t };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t if (generatedPositionAfter(this._last, aMapping)) {\n\t this._last = aMapping;\n\t this._array.push(aMapping);\n\t } else {\n\t this._sorted = false;\n\t this._array.push(aMapping);\n\t }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t if (!this._sorted) {\n\t this._array.sort(util.compareByGeneratedPositionsInflated);\n\t this._sorted = true;\n\t }\n\t return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap)\n\t : new BasicSourceMapConsumer(sourceMap);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t// {\n\t// generatedLine: The line number in the generated code,\n\t// generatedColumn: The column number in the generated code,\n\t// source: The path to the original source file that generated this\n\t// chunk of code,\n\t// originalLine: The line number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// originalColumn: The column number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// name: The name of the original symbol which generated this chunk of\n\t// code.\n\t// }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t get: function () {\n\t if (!this.__generatedMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__generatedMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t get: function () {\n\t if (!this.__originalMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__originalMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t var c = aStr.charAt(index);\n\t return c === \";\" || c === \",\";\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t throw new Error(\"Subclasses must implement _parseMappings\");\n\t };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t * The function that is called with each mapping.\n\t * @param Object aContext\n\t * Optional. If specified, this object will be the value of `this` every\n\t * time that `aCallback` is called.\n\t * @param aOrder\n\t * Either `SourceMapConsumer.GENERATED_ORDER` or\n\t * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t * iterate over the mappings sorted by the generated file's line/column\n\t * order or the original's source/line/column order, respectively. Defaults to\n\t * `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t var context = aContext || null;\n\t var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t var mappings;\n\t switch (order) {\n\t case SourceMapConsumer.GENERATED_ORDER:\n\t mappings = this._generatedMappings;\n\t break;\n\t case SourceMapConsumer.ORIGINAL_ORDER:\n\t mappings = this._originalMappings;\n\t break;\n\t default:\n\t throw new Error(\"Unknown order of iteration.\");\n\t }\n\t\n\t var sourceRoot = this.sourceRoot;\n\t mappings.map(function (mapping) {\n\t var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t if (source != null && sourceRoot != null) {\n\t source = util.join(sourceRoot, source);\n\t }\n\t return {\n\t source: source,\n\t generatedLine: mapping.generatedLine,\n\t generatedColumn: mapping.generatedColumn,\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: mapping.name === null ? null : this._names.at(mapping.name)\n\t };\n\t }, this).forEach(aCallback, context);\n\t };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: Optional. the column number in the original source.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t var line = util.getArg(aArgs, 'line');\n\t\n\t // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t // returns the index of the closest mapping less than the needle. By\n\t // setting needle.originalColumn to 0, we thus find the last mapping for\n\t // the given line, provided such a mapping exists.\n\t var needle = {\n\t source: util.getArg(aArgs, 'source'),\n\t originalLine: line,\n\t originalColumn: util.getArg(aArgs, 'column', 0)\n\t };\n\t\n\t if (this.sourceRoot != null) {\n\t needle.source = util.relative(this.sourceRoot, needle.source);\n\t }\n\t if (!this._sources.has(needle.source)) {\n\t return [];\n\t }\n\t needle.source = this._sources.indexOf(needle.source);\n\t\n\t var mappings = [];\n\t\n\t var index = this._findMapping(needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t binarySearch.LEAST_UPPER_BOUND);\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (aArgs.column === undefined) {\n\t var originalLine = mapping.originalLine;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we found. Since\n\t // mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we found.\n\t while (mapping && mapping.originalLine === originalLine) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t } else {\n\t var originalColumn = mapping.originalColumn;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we were searching for.\n\t // Since mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we are searching for.\n\t while (mapping &&\n\t mapping.originalLine === line &&\n\t mapping.originalColumn == originalColumn) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t }\n\t }\n\t\n\t return mappings;\n\t };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The only parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - sources: An array of URLs to the original source files.\n\t * - names: An array of identifiers which can be referrenced by individual mappings.\n\t * - sourceRoot: Optional. The URL root from which all sources are relative.\n\t * - sourcesContent: Optional. An array of contents of the original source files.\n\t * - mappings: A string of base64 VLQs which contain the actual mappings.\n\t * - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"out.js\",\n\t * sourceRoot : \"\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AA,AB;;ABCDE;\"\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sources = util.getArg(sourceMap, 'sources');\n\t // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t // requires the array) to play nice here.\n\t var names = util.getArg(sourceMap, 'names', []);\n\t var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t var mappings = util.getArg(sourceMap, 'mappings');\n\t var file = util.getArg(sourceMap, 'file', null);\n\t\n\t // Once again, Sass deviates from the spec and supplies the version as a\n\t // string rather than a number, so we use loose equality checking here.\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t sources = sources\n\t .map(String)\n\t // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t // \"foo.js\". Normalize these first so that future comparisons will succeed.\n\t // See bugzil.la/1090768.\n\t .map(util.normalize)\n\t // Always ensure that absolute sources are internally stored relative to\n\t // the source root, if the source root is absolute. Not doing this would\n\t // be particularly problematic when the source root is a prefix of the\n\t // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t .map(function (source) {\n\t return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t ? util.relative(sourceRoot, source)\n\t : source;\n\t });\n\t\n\t // Pass `true` below to allow duplicate names and sources. While source maps\n\t // are intended to be compressed and deduplicated, the TypeScript compiler\n\t // sometimes generates source maps with duplicates in them. See Github issue\n\t // #72 and bugzil.la/889492.\n\t this._names = ArraySet.fromArray(names.map(String), true);\n\t this._sources = ArraySet.fromArray(sources, true);\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t * The source map that will be consumed.\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap) {\n\t var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t smc.sourceRoot = aSourceMap._sourceRoot;\n\t smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t smc.sourceRoot);\n\t smc.file = aSourceMap._file;\n\t\n\t // Because we are modifying the entries (by converting string sources and\n\t // names to indices into the sources and names ArraySets), we have to make\n\t // a copy of the entry or else bad things happen. Shared mutable state\n\t // strikes again! See github issue #191.\n\t\n\t var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t var destGeneratedMappings = smc.__generatedMappings = [];\n\t var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t var srcMapping = generatedMappings[i];\n\t var destMapping = new Mapping;\n\t destMapping.generatedLine = srcMapping.generatedLine;\n\t destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t if (srcMapping.source) {\n\t destMapping.source = sources.indexOf(srcMapping.source);\n\t destMapping.originalLine = srcMapping.originalLine;\n\t destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t if (srcMapping.name) {\n\t destMapping.name = names.indexOf(srcMapping.name);\n\t }\n\t\n\t destOriginalMappings.push(destMapping);\n\t }\n\t\n\t destGeneratedMappings.push(destMapping);\n\t }\n\t\n\t quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t return smc;\n\t };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t return this._sources.toArray().map(function (s) {\n\t return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n\t }, this);\n\t }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t this.generatedLine = 0;\n\t this.generatedColumn = 0;\n\t this.source = null;\n\t this.originalLine = null;\n\t this.originalColumn = null;\n\t this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t var generatedLine = 1;\n\t var previousGeneratedColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousOriginalColumn = 0;\n\t var previousSource = 0;\n\t var previousName = 0;\n\t var length = aStr.length;\n\t var index = 0;\n\t var cachedSegments = {};\n\t var temp = {};\n\t var originalMappings = [];\n\t var generatedMappings = [];\n\t var mapping, str, segment, end, value;\n\t\n\t while (index < length) {\n\t if (aStr.charAt(index) === ';') {\n\t generatedLine++;\n\t index++;\n\t previousGeneratedColumn = 0;\n\t }\n\t else if (aStr.charAt(index) === ',') {\n\t index++;\n\t }\n\t else {\n\t mapping = new Mapping();\n\t mapping.generatedLine = generatedLine;\n\t\n\t // Because each offset is encoded relative to the previous one,\n\t // many segments often have the same encoding. We can exploit this\n\t // fact by caching the parsed variable length fields of each segment,\n\t // allowing us to avoid a second parse if we encounter the same\n\t // segment again.\n\t for (end = index; end < length; end++) {\n\t if (this._charIsMappingSeparator(aStr, end)) {\n\t break;\n\t }\n\t }\n\t str = aStr.slice(index, end);\n\t\n\t segment = cachedSegments[str];\n\t if (segment) {\n\t index += str.length;\n\t } else {\n\t segment = [];\n\t while (index < end) {\n\t base64VLQ.decode(aStr, index, temp);\n\t value = temp.value;\n\t index = temp.rest;\n\t segment.push(value);\n\t }\n\t\n\t if (segment.length === 2) {\n\t throw new Error('Found a source, but no line and column');\n\t }\n\t\n\t if (segment.length === 3) {\n\t throw new Error('Found a source and line, but no column');\n\t }\n\t\n\t cachedSegments[str] = segment;\n\t }\n\t\n\t // Generated column.\n\t mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (segment.length > 1) {\n\t // Original source.\n\t mapping.source = previousSource + segment[1];\n\t previousSource += segment[1];\n\t\n\t // Original line.\n\t mapping.originalLine = previousOriginalLine + segment[2];\n\t previousOriginalLine = mapping.originalLine;\n\t // Lines are stored 0-based\n\t mapping.originalLine += 1;\n\t\n\t // Original column.\n\t mapping.originalColumn = previousOriginalColumn + segment[3];\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (segment.length > 4) {\n\t // Original name.\n\t mapping.name = previousName + segment[4];\n\t previousName += segment[4];\n\t }\n\t }\n\t\n\t generatedMappings.push(mapping);\n\t if (typeof mapping.originalLine === 'number') {\n\t originalMappings.push(mapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t this.__generatedMappings = generatedMappings;\n\t\n\t quickSort(originalMappings, util.compareByOriginalPositions);\n\t this.__originalMappings = originalMappings;\n\t };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t aColumnName, aComparator, aBias) {\n\t // To return the position we are searching for, we must first find the\n\t // mapping for the given position and then return the opposite position it\n\t // points to. Because the mappings are sorted, we can use binary search to\n\t // find the best mapping.\n\t\n\t if (aNeedle[aLineName] <= 0) {\n\t throw new TypeError('Line must be greater than or equal to 1, got '\n\t + aNeedle[aLineName]);\n\t }\n\t if (aNeedle[aColumnName] < 0) {\n\t throw new TypeError('Column must be greater than or equal to 0, got '\n\t + aNeedle[aColumnName]);\n\t }\n\t\n\t return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t function SourceMapConsumer_computeColumnSpans() {\n\t for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t // Mappings do not contain a field for the last generated columnt. We\n\t // can come up with an optimistic estimate, however, by assuming that\n\t // mappings are contiguous (i.e. given two consecutive mappings, the\n\t // first mapping ends where the second one starts).\n\t if (index + 1 < this._generatedMappings.length) {\n\t var nextMapping = this._generatedMappings[index + 1];\n\t\n\t if (mapping.generatedLine === nextMapping.generatedLine) {\n\t mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t continue;\n\t }\n\t }\n\t\n\t // The last mapping for each line spans the entire line.\n\t mapping.lastGeneratedColumn = Infinity;\n\t }\n\t };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t function SourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._generatedMappings,\n\t \"generatedLine\",\n\t \"generatedColumn\",\n\t util.compareByGeneratedPositionsDeflated,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t if (mapping.generatedLine === needle.generatedLine) {\n\t var source = util.getArg(mapping, 'source', null);\n\t if (source !== null) {\n\t source = this._sources.at(source);\n\t if (this.sourceRoot != null) {\n\t source = util.join(this.sourceRoot, source);\n\t }\n\t }\n\t var name = util.getArg(mapping, 'name', null);\n\t if (name !== null) {\n\t name = this._names.at(name);\n\t }\n\t return {\n\t source: source,\n\t line: util.getArg(mapping, 'originalLine', null),\n\t column: util.getArg(mapping, 'originalColumn', null),\n\t name: name\n\t };\n\t }\n\t }\n\t\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t if (!this.sourcesContent) {\n\t return false;\n\t }\n\t return this.sourcesContent.length >= this._sources.size() &&\n\t !this.sourcesContent.some(function (sc) { return sc == null; });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t if (!this.sourcesContent) {\n\t return null;\n\t }\n\t\n\t if (this.sourceRoot != null) {\n\t aSource = util.relative(this.sourceRoot, aSource);\n\t }\n\t\n\t if (this._sources.has(aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(aSource)];\n\t }\n\t\n\t var url;\n\t if (this.sourceRoot != null\n\t && (url = util.urlParse(this.sourceRoot))) {\n\t // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t // many users. We can help them out when they expect file:// URIs to\n\t // behave like it would if they were running a local HTTP server. See\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n\t if (url.scheme == \"file\"\n\t && this._sources.has(fileUriAbsPath)) {\n\t return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t }\n\t\n\t if ((!url.path || url.path == \"/\")\n\t && this._sources.has(\"/\" + aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n\t }\n\t }\n\t\n\t // This function is used recursively from\n\t // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t // don't want to throw if we can't find the source - we just want to\n\t // return null, so we provide a flag to exit gracefully.\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t if (this.sourceRoot != null) {\n\t source = util.relative(this.sourceRoot, source);\n\t }\n\t if (!this._sources.has(source)) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\n\t source = this._sources.indexOf(source);\n\t\n\t var needle = {\n\t source: source,\n\t originalLine: util.getArg(aArgs, 'line'),\n\t originalColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (mapping.source === needle.source) {\n\t return {\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t };\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The only parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - file: Optional. The generated file this source map is associated with.\n\t * - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t * - offset: The offset into the original specified at which this section\n\t * begins to apply, defined as an object with a \"line\" and \"column\"\n\t * field.\n\t * - map: A source map definition. This source map could also be indexed,\n\t * but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"app.js\",\n\t * sections: [{\n\t * offset: {line:100, column:10},\n\t * map: {\n\t * version : 3,\n\t * file: \"section.js\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AAAA,E;;ABCDE;\"\n\t * }\n\t * }],\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sections = util.getArg(sourceMap, 'sections');\n\t\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t\n\t var lastOffset = {\n\t line: -1,\n\t column: 0\n\t };\n\t this._sections = sections.map(function (s) {\n\t if (s.url) {\n\t // The url field will require support for asynchronicity.\n\t // See https://github.com/mozilla/source-map/issues/16\n\t throw new Error('Support for url field in sections not implemented.');\n\t }\n\t var offset = util.getArg(s, 'offset');\n\t var offsetLine = util.getArg(offset, 'line');\n\t var offsetColumn = util.getArg(offset, 'column');\n\t\n\t if (offsetLine < lastOffset.line ||\n\t (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t throw new Error('Section offsets must be ordered and non-overlapping.');\n\t }\n\t lastOffset = offset;\n\t\n\t return {\n\t generatedOffset: {\n\t // The offset fields are 0-based, but we use 1-based indices when\n\t // encoding/decoding from VLQ.\n\t generatedLine: offsetLine + 1,\n\t generatedColumn: offsetColumn + 1\n\t },\n\t consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n\t }\n\t });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t var sources = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t sources.push(this._sections[i].consumer.sources[j]);\n\t }\n\t }\n\t return sources;\n\t }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t // Find the section containing the generated position we're trying to map\n\t // to an original position.\n\t var sectionIndex = binarySearch.search(needle, this._sections,\n\t function(needle, section) {\n\t var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t if (cmp) {\n\t return cmp;\n\t }\n\t\n\t return (needle.generatedColumn -\n\t section.generatedOffset.generatedColumn);\n\t });\n\t var section = this._sections[sectionIndex];\n\t\n\t if (!section) {\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t }\n\t\n\t return section.consumer.originalPositionFor({\n\t line: needle.generatedLine -\n\t (section.generatedOffset.generatedLine - 1),\n\t column: needle.generatedColumn -\n\t (section.generatedOffset.generatedLine === needle.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t bias: aArgs.bias\n\t });\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t return this._sections.every(function (s) {\n\t return s.consumer.hasContentsOfAllSources();\n\t });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t var content = section.consumer.sourceContentFor(aSource, true);\n\t if (content) {\n\t return content;\n\t }\n\t }\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t // Only consider this section if the requested source is in the list of\n\t // sources of the consumer.\n\t if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n\t continue;\n\t }\n\t var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t if (generatedPosition) {\n\t var ret = {\n\t line: generatedPosition.line +\n\t (section.generatedOffset.generatedLine - 1),\n\t column: generatedPosition.column +\n\t (section.generatedOffset.generatedLine === generatedPosition.line\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0)\n\t };\n\t return ret;\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null\n\t };\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t this.__generatedMappings = [];\n\t this.__originalMappings = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t var sectionMappings = section.consumer._generatedMappings;\n\t for (var j = 0; j < sectionMappings.length; j++) {\n\t var mapping = sectionMappings[j];\n\t\n\t var source = section.consumer._sources.at(mapping.source);\n\t if (section.consumer.sourceRoot !== null) {\n\t source = util.join(section.consumer.sourceRoot, source);\n\t }\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t\n\t // The mappings coming from the consumer for the section have\n\t // generated positions relative to the start of the section, so we\n\t // need to offset them to be relative to the start of the concatenated\n\t // generated file.\n\t var adjustedMapping = {\n\t source: source,\n\t generatedLine: mapping.generatedLine +\n\t (section.generatedOffset.generatedLine - 1),\n\t generatedColumn: mapping.generatedColumn +\n\t (section.generatedOffset.generatedLine === mapping.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: name\n\t };\n\t\n\t this.__generatedMappings.push(adjustedMapping);\n\t if (typeof adjustedMapping.originalLine === 'number') {\n\t this.__originalMappings.push(adjustedMapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t // This function terminates when one of the following is true:\n\t //\n\t // 1. We find the exact element we are looking for.\n\t //\n\t // 2. We did not find the exact element, but we can return the index of\n\t // the next-closest element.\n\t //\n\t // 3. We did not find the exact element, and there is no next-closest\n\t // element than the one we are searching for, so we return -1.\n\t var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t if (cmp === 0) {\n\t // Found the element we are looking for.\n\t return mid;\n\t }\n\t else if (cmp > 0) {\n\t // Our needle is greater than aHaystack[mid].\n\t if (aHigh - mid > 1) {\n\t // The element is in the upper half.\n\t return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // The exact needle element was not found in this haystack. Determine if\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return aHigh < aHaystack.length ? aHigh : -1;\n\t } else {\n\t return mid;\n\t }\n\t }\n\t else {\n\t // Our needle is less than aHaystack[mid].\n\t if (mid - aLow > 1) {\n\t // The element is in the lower half.\n\t return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return mid;\n\t } else {\n\t return aLow < 0 ? -1 : aLow;\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t * array and returns -1, 0, or 1 depending on whether the needle is less\n\t * than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t if (aHaystack.length === 0) {\n\t return -1;\n\t }\n\t\n\t var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t if (index < 0) {\n\t return -1;\n\t }\n\t\n\t // We have found either the exact element, or the next-closest element than\n\t // the one we are searching for. However, there may be more than one such\n\t // element. Make sure we always return the smallest of these.\n\t while (index - 1 >= 0) {\n\t if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t break;\n\t }\n\t --index;\n\t }\n\t\n\t return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t * The array.\n\t * @param {Number} x\n\t * The index of the first item.\n\t * @param {Number} y\n\t * The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t var temp = ary[x];\n\t ary[x] = ary[y];\n\t ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t * The lower bound on the range.\n\t * @param {Number} high\n\t * The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t * @param {Number} p\n\t * Start index of the array\n\t * @param {Number} r\n\t * End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t // If our lower bound is less than our upper bound, we (1) partition the\n\t // array into two pieces and (2) recurse on each half. If it is not, this is\n\t // the empty array and our base case.\n\t\n\t if (p < r) {\n\t // (1) Partitioning.\n\t //\n\t // The partitioning chooses a pivot between `p` and `r` and moves all\n\t // elements that are less than or equal to the pivot to the before it, and\n\t // all the elements that are greater than it after it. The effect is that\n\t // once partition is done, the pivot is in the exact place it will be when\n\t // the array is put in sorted order, and it will not need to be moved\n\t // again. This runs in O(n) time.\n\t\n\t // Always choose a random pivot so that an input array which is reverse\n\t // sorted does not cause O(n^2) running time.\n\t var pivotIndex = randomIntInRange(p, r);\n\t var i = p - 1;\n\t\n\t swap(ary, pivotIndex, r);\n\t var pivot = ary[r];\n\t\n\t // Immediately after `j` is incremented in this loop, the following hold\n\t // true:\n\t //\n\t // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t //\n\t // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t for (var j = p; j < r; j++) {\n\t if (comparator(ary[j], pivot) <= 0) {\n\t i += 1;\n\t swap(ary, i, j);\n\t }\n\t }\n\t\n\t swap(ary, i + 1, j);\n\t var q = i + 1;\n\t\n\t // (2) Recurse on each half.\n\t\n\t doQuickSort(ary, comparator, p, q - 1);\n\t doQuickSort(ary, comparator, q + 1, r);\n\t }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t * generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t this.children = [];\n\t this.sourceContents = {};\n\t this.line = aLine == null ? null : aLine;\n\t this.column = aColumn == null ? null : aColumn;\n\t this.source = aSource == null ? null : aSource;\n\t this.name = aName == null ? null : aName;\n\t this[isSourceNode] = true;\n\t if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t * SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t // The SourceNode we want to fill with the generated code\n\t // and the SourceMap\n\t var node = new SourceNode();\n\t\n\t // All even indices of this array are one line of the generated code,\n\t // while all odd indices are the newlines between two adjacent lines\n\t // (since `REGEX_NEWLINE` captures its match).\n\t // Processed fragments are accessed by calling `shiftNextLine`.\n\t var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t var remainingLinesIndex = 0;\n\t var shiftNextLine = function() {\n\t var lineContents = getNextLine();\n\t // The last line of a file might not have a newline.\n\t var newLine = getNextLine() || \"\";\n\t return lineContents + newLine;\n\t\n\t function getNextLine() {\n\t return remainingLinesIndex < remainingLines.length ?\n\t remainingLines[remainingLinesIndex++] : undefined;\n\t }\n\t };\n\t\n\t // We need to remember the position of \"remainingLines\"\n\t var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t // The generate SourceNodes we need a code range.\n\t // To extract it current and last mapping is used.\n\t // Here we store the last mapping.\n\t var lastMapping = null;\n\t\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t if (lastMapping !== null) {\n\t // We add the code from \"lastMapping\" to \"mapping\":\n\t // First check if there is a new line in between.\n\t if (lastGeneratedLine < mapping.generatedLine) {\n\t // Associate first line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t lastGeneratedLine++;\n\t lastGeneratedColumn = 0;\n\t // The remaining code is added without mapping\n\t } else {\n\t // There is no new line in between.\n\t // Associate the code between \"lastGeneratedColumn\" and\n\t // \"mapping.generatedColumn\" with \"lastMapping\"\n\t var nextLine = remainingLines[remainingLinesIndex];\n\t var code = nextLine.substr(0, mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t addMappingWithCode(lastMapping, code);\n\t // No more remaining code, continue\n\t lastMapping = mapping;\n\t return;\n\t }\n\t }\n\t // We add the generated code until the first mapping\n\t // to the SourceNode without any mapping.\n\t // Each line is added as separate string.\n\t while (lastGeneratedLine < mapping.generatedLine) {\n\t node.add(shiftNextLine());\n\t lastGeneratedLine++;\n\t }\n\t if (lastGeneratedColumn < mapping.generatedColumn) {\n\t var nextLine = remainingLines[remainingLinesIndex];\n\t node.add(nextLine.substr(0, mapping.generatedColumn));\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t }\n\t lastMapping = mapping;\n\t }, this);\n\t // We have processed all mappings.\n\t if (remainingLinesIndex < remainingLines.length) {\n\t if (lastMapping) {\n\t // Associate the remaining code in the current line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t }\n\t // and add the remaining lines without any mapping\n\t node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t }\n\t\n\t // Copy sourcesContent into SourceNode\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aRelativePath != null) {\n\t sourceFile = util.join(aRelativePath, sourceFile);\n\t }\n\t node.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t\n\t return node;\n\t\n\t function addMappingWithCode(mapping, code) {\n\t if (mapping === null || mapping.source === undefined) {\n\t node.add(code);\n\t } else {\n\t var source = aRelativePath\n\t ? util.join(aRelativePath, mapping.source)\n\t : mapping.source;\n\t node.add(new SourceNode(mapping.originalLine,\n\t mapping.originalColumn,\n\t source,\n\t code,\n\t mapping.name));\n\t }\n\t }\n\t };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t aChunk.forEach(function (chunk) {\n\t this.add(chunk);\n\t }, this);\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t if (aChunk) {\n\t this.children.push(aChunk);\n\t }\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t for (var i = aChunk.length-1; i >= 0; i--) {\n\t this.prepend(aChunk[i]);\n\t }\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t this.children.unshift(aChunk);\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t var chunk;\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t chunk = this.children[i];\n\t if (chunk[isSourceNode]) {\n\t chunk.walk(aFn);\n\t }\n\t else {\n\t if (chunk !== '') {\n\t aFn(chunk, { source: this.source,\n\t line: this.line,\n\t column: this.column,\n\t name: this.name });\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t var newChildren;\n\t var i;\n\t var len = this.children.length;\n\t if (len > 0) {\n\t newChildren = [];\n\t for (i = 0; i < len-1; i++) {\n\t newChildren.push(this.children[i]);\n\t newChildren.push(aSep);\n\t }\n\t newChildren.push(this.children[i]);\n\t this.children = newChildren;\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t var lastChild = this.children[this.children.length - 1];\n\t if (lastChild[isSourceNode]) {\n\t lastChild.replaceRight(aPattern, aReplacement);\n\t }\n\t else if (typeof lastChild === 'string') {\n\t this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t }\n\t else {\n\t this.children.push(''.replace(aPattern, aReplacement));\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t function SourceNode_walkSourceContents(aFn) {\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t if (this.children[i][isSourceNode]) {\n\t this.children[i].walkSourceContents(aFn);\n\t }\n\t }\n\t\n\t var sources = Object.keys(this.sourceContents);\n\t for (var i = 0, len = sources.length; i < len; i++) {\n\t aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t }\n\t };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t var str = \"\";\n\t this.walk(function (chunk) {\n\t str += chunk;\n\t });\n\t return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t var generated = {\n\t code: \"\",\n\t line: 1,\n\t column: 0\n\t };\n\t var map = new SourceMapGenerator(aArgs);\n\t var sourceMappingActive = false;\n\t var lastOriginalSource = null;\n\t var lastOriginalLine = null;\n\t var lastOriginalColumn = null;\n\t var lastOriginalName = null;\n\t this.walk(function (chunk, original) {\n\t generated.code += chunk;\n\t if (original.source !== null\n\t && original.line !== null\n\t && original.column !== null) {\n\t if(lastOriginalSource !== original.source\n\t || lastOriginalLine !== original.line\n\t || lastOriginalColumn !== original.column\n\t || lastOriginalName !== original.name) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t lastOriginalSource = original.source;\n\t lastOriginalLine = original.line;\n\t lastOriginalColumn = original.column;\n\t lastOriginalName = original.name;\n\t sourceMappingActive = true;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t }\n\t });\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t }\n\t for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t generated.line++;\n\t generated.column = 0;\n\t // Mappings end at eol\n\t if (idx + 1 === length) {\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t } else {\n\t generated.column++;\n\t }\n\t }\n\t });\n\t this.walkSourceContents(function (sourceFile, sourceContent) {\n\t map.setSourceContent(sourceFile, sourceContent);\n\t });\n\t\n\t return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 42c329f865e32e011afb","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/node_modules/source-map/lib/array-set.js b/node_modules/source-map/lib/array-set.js new file mode 100644 index 0000000..fbd5c81 --- /dev/null +++ b/node_modules/source-map/lib/array-set.js @@ -0,0 +1,121 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = require('./util'); +var has = Object.prototype.hasOwnProperty; +var hasNativeMap = typeof Map !== "undefined"; + +/** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ +function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); +} + +/** + * Static method for creating ArraySet instances from an existing array. + */ +ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; +}; + +/** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ +ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; +}; + +/** + * Add the given string to this set. + * + * @param String aStr + */ +ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } +}; + +/** + * Is the given string a member of this set? + * + * @param String aStr + */ +ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } +}; + +/** + * What is the index of the given string in the array? + * + * @param String aStr + */ +ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); +}; + +/** + * What is the element at the given index? + * + * @param Number aIdx + */ +ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); +}; + +/** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ +ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); +}; + +exports.ArraySet = ArraySet; diff --git a/node_modules/source-map/lib/base64-vlq.js b/node_modules/source-map/lib/base64-vlq.js new file mode 100644 index 0000000..612b404 --- /dev/null +++ b/node_modules/source-map/lib/base64-vlq.js @@ -0,0 +1,140 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var base64 = require('./base64'); + +// A single base 64 digit can contain 6 bits of data. For the base 64 variable +// length quantities we use in the source map spec, the first bit is the sign, +// the next four bits are the actual value, and the 6th bit is the +// continuation bit. The continuation bit tells us whether there are more +// digits in this value following this digit. +// +// Continuation +// | Sign +// | | +// V V +// 101011 + +var VLQ_BASE_SHIFT = 5; + +// binary: 100000 +var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + +// binary: 011111 +var VLQ_BASE_MASK = VLQ_BASE - 1; + +// binary: 100000 +var VLQ_CONTINUATION_BIT = VLQ_BASE; + +/** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ +function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; +} + +/** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ +function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; +} + +/** + * Returns the base 64 VLQ encoded value. + */ +exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; +}; + +/** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ +exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; +}; diff --git a/node_modules/source-map/lib/base64.js b/node_modules/source-map/lib/base64.js new file mode 100644 index 0000000..8aa86b3 --- /dev/null +++ b/node_modules/source-map/lib/base64.js @@ -0,0 +1,67 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + +/** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ +exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); +}; + +/** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ +exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; +}; diff --git a/node_modules/source-map/lib/binary-search.js b/node_modules/source-map/lib/binary-search.js new file mode 100644 index 0000000..010ac94 --- /dev/null +++ b/node_modules/source-map/lib/binary-search.js @@ -0,0 +1,111 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +exports.GREATEST_LOWER_BOUND = 1; +exports.LEAST_UPPER_BOUND = 2; + +/** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ +function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } +} + +/** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ +exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; +}; diff --git a/node_modules/source-map/lib/mapping-list.js b/node_modules/source-map/lib/mapping-list.js new file mode 100644 index 0000000..06d1274 --- /dev/null +++ b/node_modules/source-map/lib/mapping-list.js @@ -0,0 +1,79 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = require('./util'); + +/** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ +function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; +} + +/** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ +function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; +} + +/** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ +MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + +/** + * Add the given source mapping. + * + * @param Object aMapping + */ +MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } +}; + +/** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ +MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; +}; + +exports.MappingList = MappingList; diff --git a/node_modules/source-map/lib/quick-sort.js b/node_modules/source-map/lib/quick-sort.js new file mode 100644 index 0000000..6a7caad --- /dev/null +++ b/node_modules/source-map/lib/quick-sort.js @@ -0,0 +1,114 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +// It turns out that some (most?) JavaScript engines don't self-host +// `Array.prototype.sort`. This makes sense because C++ will likely remain +// faster than JS when doing raw CPU-intensive sorting. However, when using a +// custom comparator function, calling back and forth between the VM's C++ and +// JIT'd JS is rather slow *and* loses JIT type information, resulting in +// worse generated code for the comparator function than would be optimal. In +// fact, when sorting with a comparator, these costs outweigh the benefits of +// sorting in C++. By using our own JS-implemented Quick Sort (below), we get +// a ~3500ms mean speed-up in `bench/bench.html`. + +/** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ +function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; +} + +/** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ +function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); +} + +/** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ +function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } +} + +/** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ +exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); +}; diff --git a/node_modules/source-map/lib/source-map-consumer.js b/node_modules/source-map/lib/source-map-consumer.js new file mode 100644 index 0000000..6abcc28 --- /dev/null +++ b/node_modules/source-map/lib/source-map-consumer.js @@ -0,0 +1,1082 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = require('./util'); +var binarySearch = require('./binary-search'); +var ArraySet = require('./array-set').ArraySet; +var base64VLQ = require('./base64-vlq'); +var quickSort = require('./quick-sort').quickSort; + +function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); +} + +SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); +} + +/** + * The version of the source mapping spec that we are consuming. + */ +SourceMapConsumer.prototype._version = 3; + +// `__generatedMappings` and `__originalMappings` are arrays that hold the +// parsed mapping coordinates from the source map's "mappings" attribute. They +// are lazily instantiated, accessed via the `_generatedMappings` and +// `_originalMappings` getters respectively, and we only parse the mappings +// and create these arrays once queried for a source location. We jump through +// these hoops because there can be many thousands of mappings, and parsing +// them is expensive, so we only want to do it if we must. +// +// Each object in the arrays is of the form: +// +// { +// generatedLine: The line number in the generated code, +// generatedColumn: The column number in the generated code, +// source: The path to the original source file that generated this +// chunk of code, +// originalLine: The line number in the original source that +// corresponds to this chunk of generated code, +// originalColumn: The column number in the original source that +// corresponds to this chunk of generated code, +// name: The name of the original symbol which generated this chunk of +// code. +// } +// +// All properties except for `generatedLine` and `generatedColumn` can be +// `null`. +// +// `_generatedMappings` is ordered by the generated positions. +// +// `_originalMappings` is ordered by the original positions. + +SourceMapConsumer.prototype.__generatedMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } +}); + +SourceMapConsumer.prototype.__originalMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } +}); + +SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + +SourceMapConsumer.GENERATED_ORDER = 1; +SourceMapConsumer.ORIGINAL_ORDER = 2; + +SourceMapConsumer.GREATEST_LOWER_BOUND = 1; +SourceMapConsumer.LEAST_UPPER_BOUND = 2; + +/** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ +SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + +/** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + +exports.SourceMapConsumer = SourceMapConsumer; + +/** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ +function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; +} + +BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + +/** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ +BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + +/** + * The version of the source mapping spec that we are consuming. + */ +BasicSourceMapConsumer.prototype._version = 3; + +/** + * The list of original sources. + */ +Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } +}); + +/** + * Provide the JIT with a nice shape / hidden class. + */ +function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; +} + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + +/** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ +BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + +/** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ +BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ +BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ +BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ +BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + +exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + +/** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ +function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); +} + +IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + +/** + * The version of the source mapping spec that we are consuming. + */ +IndexedSourceMapConsumer.prototype._version = 3; + +/** + * The list of original sources. + */ +Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } +}); + +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ +IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ +IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ +IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + +exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; diff --git a/node_modules/source-map/lib/source-map-generator.js b/node_modules/source-map/lib/source-map-generator.js new file mode 100644 index 0000000..aff1e7f --- /dev/null +++ b/node_modules/source-map/lib/source-map-generator.js @@ -0,0 +1,416 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var base64VLQ = require('./base64-vlq'); +var util = require('./util'); +var ArraySet = require('./array-set').ArraySet; +var MappingList = require('./mapping-list').MappingList; + +/** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ +function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; +} + +SourceMapGenerator.prototype._version = 3; + +/** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ +SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + +/** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ +SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + +/** + * Set the source content for a source file. + */ +SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + +/** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ +SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + +/** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ +SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + +/** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ +SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + +SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + +/** + * Externalize the source map. + */ +SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + +/** + * Render the source map being generated to a string. + */ +SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + +exports.SourceMapGenerator = SourceMapGenerator; diff --git a/node_modules/source-map/lib/source-node.js b/node_modules/source-map/lib/source-node.js new file mode 100644 index 0000000..d196a53 --- /dev/null +++ b/node_modules/source-map/lib/source-node.js @@ -0,0 +1,413 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; +var util = require('./util'); + +// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other +// operating systems these days (capturing the result). +var REGEX_NEWLINE = /(\r?\n)/; + +// Newline character code for charCodeAt() comparisons +var NEWLINE_CODE = 10; + +// Private symbol for identifying `SourceNode`s when multiple versions of +// the source-map library are loaded. This MUST NOT CHANGE across +// versions! +var isSourceNode = "$$$isSourceNode$$$"; + +/** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ +function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); +} + +/** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ +SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + +/** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ +SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; +}; + +/** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ +SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; +}; + +/** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ +SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } +}; + +/** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ +SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; +}; + +/** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ +SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; +}; + +/** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ +SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + +/** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ +SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + +/** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ +SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; +}; + +/** + * Returns the string representation of this source node along with a source + * map. + */ +SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; +}; + +exports.SourceNode = SourceNode; diff --git a/node_modules/source-map/lib/util.js b/node_modules/source-map/lib/util.js new file mode 100644 index 0000000..44e0e45 --- /dev/null +++ b/node_modules/source-map/lib/util.js @@ -0,0 +1,417 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ +function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } +} +exports.getArg = getArg; + +var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; +var dataUrlRegexp = /^data:.+\,.+$/; + +function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; +} +exports.urlParse = urlParse; + +function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; +} +exports.urlGenerate = urlGenerate; + +/** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ +function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; +} +exports.normalize = normalize; + +/** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ +function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; +} +exports.join = join; + +exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); +}; + +/** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ +function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); +} +exports.relative = relative; + +var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); +}()); + +function identity (s) { + return s; +} + +/** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ +function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; +} +exports.toSetString = supportsNullProto ? identity : toSetString; + +function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; +} +exports.fromSetString = supportsNullProto ? identity : fromSetString; + +function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; +} + +/** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ +function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; +} +exports.compareByOriginalPositions = compareByOriginalPositions; + +/** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ +function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; +} +exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + +function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; +} + +/** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ +function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); +} +exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; diff --git a/node_modules/source-map/package.json b/node_modules/source-map/package.json new file mode 100644 index 0000000..6d24978 --- /dev/null +++ b/node_modules/source-map/package.json @@ -0,0 +1,214 @@ +{ + "_args": [ + [ + "source-map@0.5.7", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "source-map@0.5.7", + "_id": "source-map@0.5.7", + "_inBundle": false, + "_integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "_location": "/source-map", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "source-map@0.5.7", + "name": "source-map", + "escapedName": "source-map", + "rawSpec": "0.5.7", + "saveSpec": null, + "fetchSpec": "0.5.7" + }, + "_requiredBy": [ + "/snapdragon" + ], + "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "_spec": "0.5.7", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Nick Fitzgerald", + "email": "nfitzgerald@mozilla.com" + }, + "bugs": { + "url": "https://github.com/mozilla/source-map/issues" + }, + "contributors": [ + { + "name": "Tobias Koppers", + "email": "tobias.koppers@googlemail.com" + }, + { + "name": "Duncan Beevers", + "email": "duncan@dweebd.com" + }, + { + "name": "Stephen Crane", + "email": "scrane@mozilla.com" + }, + { + "name": "Ryan Seddon", + "email": "seddon.ryan@gmail.com" + }, + { + "name": "Miles Elam", + "email": "miles.elam@deem.com" + }, + { + "name": "Mihai Bazon", + "email": "mihai.bazon@gmail.com" + }, + { + "name": "Michael Ficarra", + "email": "github.public.email@michael.ficarra.me" + }, + { + "name": "Todd Wolfson", + "email": "todd@twolfson.com" + }, + { + "name": "Alexander Solovyov", + "email": "alexander@solovyov.net" + }, + { + "name": "Felix Gnass", + "email": "fgnass@gmail.com" + }, + { + "name": "Conrad Irwin", + "email": "conrad.irwin@gmail.com" + }, + { + "name": "usrbincc", + "email": "usrbincc@yahoo.com" + }, + { + "name": "David Glasser", + "email": "glasser@davidglasser.net" + }, + { + "name": "Chase Douglas", + "email": "chase@newrelic.com" + }, + { + "name": "Evan Wallace", + "email": "evan.exe@gmail.com" + }, + { + "name": "Heather Arthur", + "email": "fayearthur@gmail.com" + }, + { + "name": "Hugh Kennedy", + "email": "hughskennedy@gmail.com" + }, + { + "name": "David Glasser", + "email": "glasser@davidglasser.net" + }, + { + "name": "Simon Lydell", + "email": "simon.lydell@gmail.com" + }, + { + "name": "Jmeas Smith", + "email": "jellyes2@gmail.com" + }, + { + "name": "Michael Z Goddard", + "email": "mzgoddard@gmail.com" + }, + { + "name": "azu", + "email": "azu@users.noreply.github.com" + }, + { + "name": "John Gozde", + "email": "john@gozde.ca" + }, + { + "name": "Adam Kirkton", + "email": "akirkton@truefitinnovation.com" + }, + { + "name": "Chris Montgomery", + "email": "christopher.montgomery@dowjones.com" + }, + { + "name": "J. Ryan Stinnett", + "email": "jryans@gmail.com" + }, + { + "name": "Jack Herrington", + "email": "jherrington@walmartlabs.com" + }, + { + "name": "Chris Truter", + "email": "jeffpalentine@gmail.com" + }, + { + "name": "Daniel Espeset", + "email": "daniel@danielespeset.com" + }, + { + "name": "Jamie Wong", + "email": "jamie.lf.wong@gmail.com" + }, + { + "name": "Eddy Bruël", + "email": "ejpbruel@mozilla.com" + }, + { + "name": "Hawken Rives", + "email": "hawkrives@gmail.com" + }, + { + "name": "Gilad Peleg", + "email": "giladp007@gmail.com" + }, + { + "name": "djchie", + "email": "djchie.dev@gmail.com" + }, + { + "name": "Gary Ye", + "email": "garysye@gmail.com" + }, + { + "name": "Nicolas Lalevée", + "email": "nicolas.lalevee@hibnet.org" + } + ], + "description": "Generates and consumes source maps", + "devDependencies": { + "doctoc": "^0.15.0", + "webpack": "^1.12.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "source-map.js", + "lib/", + "dist/source-map.debug.js", + "dist/source-map.js", + "dist/source-map.min.js", + "dist/source-map.min.js.map" + ], + "homepage": "https://github.com/mozilla/source-map", + "license": "BSD-3-Clause", + "main": "./source-map.js", + "name": "source-map", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/mozilla/source-map.git" + }, + "scripts": { + "build": "webpack --color", + "test": "npm run build && node test/run-tests.js", + "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" + }, + "typings": "source-map", + "version": "0.5.7" +} diff --git a/node_modules/source-map/source-map.js b/node_modules/source-map/source-map.js new file mode 100644 index 0000000..bc88fe8 --- /dev/null +++ b/node_modules/source-map/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; diff --git a/node_modules/split-string/LICENSE b/node_modules/split-string/LICENSE new file mode 100644 index 0000000..e33d14b --- /dev/null +++ b/node_modules/split-string/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +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/split-string/README.md b/node_modules/split-string/README.md new file mode 100644 index 0000000..d622e44 --- /dev/null +++ b/node_modules/split-string/README.md @@ -0,0 +1,321 @@ +# split-string [![NPM version](https://img.shields.io/npm/v/split-string.svg?style=flat)](https://www.npmjs.com/package/split-string) [![NPM monthly downloads](https://img.shields.io/npm/dm/split-string.svg?style=flat)](https://npmjs.org/package/split-string) [![NPM total downloads](https://img.shields.io/npm/dt/split-string.svg?style=flat)](https://npmjs.org/package/split-string) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/split-string.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/split-string) + +> Split a string on a character except when the character is escaped. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save split-string +``` + + + +
+Why use this? + +
+ +Although it's easy to split on a string: + +```js +console.log('a.b.c'.split('.')); +//=> ['a', 'b', 'c'] +``` + +It's more challenging to split a string whilst respecting escaped or quoted characters. + +**Bad** + +```js +console.log('a\\.b.c'.split('.')); +//=> ['a\\', 'b', 'c'] + +console.log('"a.b.c".d'.split('.')); +//=> ['"a', 'b', 'c"', 'd'] +``` + +**Good** + +```js +var split = require('split-string'); +console.log(split('a\\.b.c')); +//=> ['a.b', 'c'] + +console.log(split('"a.b.c".d')); +//=> ['a.b.c', 'd'] +``` + +See the [options](#options) to learn how to choose the separator or retain quotes or escaping. + +
+ +
+ +## Usage + +```js +var split = require('split-string'); + +split('a.b.c'); +//=> ['a', 'b', 'c'] + +// respects escaped characters +split('a.b.c\\.d'); +//=> ['a', 'b', 'c.d'] + +// respects double-quoted strings +split('a."b.c.d".e'); +//=> ['a', 'b.c.d', 'e'] +``` + +**Brackets** + +Also respects brackets [unless disabled](#optionsbrackets): + +```js +split('a (b c d) e', ' '); +//=> ['a', '(b c d)', 'e'] +``` + +## Options + +### options.brackets + +**Type**: `object|boolean` + +**Default**: `undefined` + +**Description** + +If enabled, split-string will not split inside brackets. The following brackets types are supported when `options.brackets` is `true`, + +```js +{ + '<': '>', + '(': ')', + '[': ']', + '{': '}' +} +``` + +Or, if object of brackets must be passed, each property on the object must be a bracket type, where the property key is the opening delimiter and property value is the closing delimiter. + +**Examples** + +```js +// no bracket support by default +split('a.{b.c}'); +//=> [ 'a', '{b', 'c}' ] + +// support all basic bracket types: "<>{}[]()" +split('a.{b.c}', {brackets: true}); +//=> [ 'a', '{b.c}' ] + +// also supports nested brackets +split('a.{b.{c.d}.e}.f', {brackets: true}); +//=> [ 'a', '{b.{c.d}.e}', 'f' ] + +// support only the specified brackets +split('[a.b].(c.d)', {brackets: {'[': ']'}}); +//=> [ '[a.b]', '(c', 'd)' ] +``` + +### options.sep + +**Type**: `string` + +**Default**: `.` + +The separator/character to split on. + +**Example** + +```js +split('a.b,c', {sep: ','}); +//=> ['a.b', 'c'] + +// you can also pass the separator as string as the last argument +split('a.b,c', ','); +//=> ['a.b', 'c'] +``` + +### options.keepEscaping + +**Type**: `boolean` + +**Default**: `undefined` + +Keep backslashes in the result. + +**Example** + +```js +split('a.b\\.c'); +//=> ['a', 'b.c'] + +split('a.b.\\c', {keepEscaping: true}); +//=> ['a', 'b\.c'] +``` + +### options.keepQuotes + +**Type**: `boolean` + +**Default**: `undefined` + +Keep single- or double-quotes in the result. + +**Example** + +```js +split('a."b.c.d".e'); +//=> ['a', 'b.c.d', 'e'] + +split('a."b.c.d".e', {keepQuotes: true}); +//=> ['a', '"b.c.d"', 'e'] + +split('a.\'b.c.d\'.e', {keepQuotes: true}); +//=> ['a', '\'b.c.d\'', 'e'] +``` + +### options.keepDoubleQuotes + +**Type**: `boolean` + +**Default**: `undefined` + +Keep double-quotes in the result. + +**Example** + +```js +split('a."b.c.d".e'); +//=> ['a', 'b.c.d', 'e'] + +split('a."b.c.d".e', {keepDoubleQuotes: true}); +//=> ['a', '"b.c.d"', 'e'] +``` + +### options.keepSingleQuotes + +**Type**: `boolean` + +**Default**: `undefined` + +Keep single-quotes in the result. + +**Example** + +```js +split('a.\'b.c.d\'.e'); +//=> ['a', 'b.c.d', 'e'] + +split('a.\'b.c.d\'.e', {keepSingleQuotes: true}); +//=> ['a', '\'b.c.d\'', 'e'] +``` + +## Customizer + +**Type**: `function` + +**Default**: `undefined` + +Pass a function as the last argument to customize how tokens are added to the array. + +**Example** + +```js +var arr = split('a.b', function(tok) { + if (tok.arr[tok.arr.length - 1] === 'a') { + tok.split = false; + } +}); +console.log(arr); +//=> ['a.b'] +``` + +**Properties** + +The `tok` object has the following properties: + +* `tok.val` (string) The current value about to be pushed onto the result array +* `tok.idx` (number) the current index in the string +* `tok.str` (string) the entire string +* `tok.arr` (array) the result array + +## Release history + +### v3.0.0 - 2017-06-17 + +**Added** + +* adds support for brackets + +## About + +
+Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
+ +
+Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
+ +
+Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
+ +### Related projects + +You might also be interested in these projects: + +* [deromanize](https://www.npmjs.com/package/deromanize): Convert roman numerals to arabic numbers (useful for books, outlines, documentation, slide decks, etc) | [homepage](https://github.com/jonschlinkert/deromanize "Convert roman numerals to arabic numbers (useful for books, outlines, documentation, slide decks, etc)") +* [randomatic](https://www.npmjs.com/package/randomatic): Generate randomized strings of a specified length using simple character sequences. The original generate-password. | [homepage](https://github.com/jonschlinkert/randomatic "Generate randomized strings of a specified length using simple character sequences. The original generate-password.") +* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.") +* [romanize](https://www.npmjs.com/package/romanize): Convert numbers to roman numerals (useful for books, outlines, documentation, slide decks, etc) | [homepage](https://github.com/jonschlinkert/romanize "Convert numbers to roman numerals (useful for books, outlines, documentation, slide decks, etc)") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 28 | [jonschlinkert](https://github.com/jonschlinkert) | +| 9 | [doowb](https://github.com/doowb) | + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 19, 2017._ \ No newline at end of file diff --git a/node_modules/split-string/index.js b/node_modules/split-string/index.js new file mode 100644 index 0000000..7bc0ea9 --- /dev/null +++ b/node_modules/split-string/index.js @@ -0,0 +1,171 @@ +/*! + * split-string + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var extend = require('extend-shallow'); + +module.exports = function(str, options, fn) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + if (typeof options === 'function') { + fn = options; + options = null; + } + + // allow separator to be defined as a string + if (typeof options === 'string') { + options = { sep: options }; + } + + var opts = extend({sep: '.'}, options); + var quotes = opts.quotes || ['"', "'", '`']; + var brackets; + + if (opts.brackets === true) { + brackets = { + '<': '>', + '(': ')', + '[': ']', + '{': '}' + }; + } else if (opts.brackets) { + brackets = opts.brackets; + } + + var tokens = []; + var stack = []; + var arr = ['']; + var sep = opts.sep; + var len = str.length; + var idx = -1; + var closeIdx; + + function expected() { + if (brackets && stack.length) { + return brackets[stack[stack.length - 1]]; + } + } + + while (++idx < len) { + var ch = str[idx]; + var next = str[idx + 1]; + var tok = { val: ch, idx: idx, arr: arr, str: str }; + tokens.push(tok); + + if (ch === '\\') { + tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next; + tok.escaped = true; + if (typeof fn === 'function') { + fn(tok); + } + arr[arr.length - 1] += tok.val; + idx++; + continue; + } + + if (brackets && brackets[ch]) { + stack.push(ch); + var e = expected(); + var i = idx + 1; + + if (str.indexOf(e, i + 1) !== -1) { + while (stack.length && i < len) { + var s = str[++i]; + if (s === '\\') { + s++; + continue; + } + + if (quotes.indexOf(s) !== -1) { + i = getClosingQuote(str, s, i + 1); + continue; + } + + e = expected(); + if (stack.length && str.indexOf(e, i + 1) === -1) { + break; + } + + if (brackets[s]) { + stack.push(s); + continue; + } + + if (e === s) { + stack.pop(); + } + } + } + + closeIdx = i; + if (closeIdx === -1) { + arr[arr.length - 1] += ch; + continue; + } + + ch = str.slice(idx, closeIdx + 1); + tok.val = ch; + tok.idx = idx = closeIdx; + } + + if (quotes.indexOf(ch) !== -1) { + closeIdx = getClosingQuote(str, ch, idx + 1); + if (closeIdx === -1) { + arr[arr.length - 1] += ch; + continue; + } + + if (keepQuotes(ch, opts) === true) { + ch = str.slice(idx, closeIdx + 1); + } else { + ch = str.slice(idx + 1, closeIdx); + } + + tok.val = ch; + tok.idx = idx = closeIdx; + } + + if (typeof fn === 'function') { + fn(tok, tokens); + ch = tok.val; + idx = tok.idx; + } + + if (tok.val === sep && tok.split !== false) { + arr.push(''); + continue; + } + + arr[arr.length - 1] += tok.val; + } + + return arr; +}; + +function getClosingQuote(str, ch, i, brackets) { + var idx = str.indexOf(ch, i); + if (str.charAt(idx - 1) === '\\') { + return getClosingQuote(str, ch, idx + 1); + } + return idx; +} + +function keepQuotes(ch, opts) { + if (opts.keepDoubleQuotes === true && ch === '"') return true; + if (opts.keepSingleQuotes === true && ch === "'") return true; + return opts.keepQuotes; +} + +function keepEscaping(opts, str, idx) { + if (typeof opts.keepEscaping === 'function') { + return opts.keepEscaping(str, idx); + } + return opts.keepEscaping === true || str[idx + 1] === '\\'; +} diff --git a/node_modules/split-string/package.json b/node_modules/split-string/package.json new file mode 100644 index 0000000..13605b8 --- /dev/null +++ b/node_modules/split-string/package.json @@ -0,0 +1,106 @@ +{ + "_args": [ + [ + "split-string@3.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "split-string@3.1.0", + "_id": "split-string@3.1.0", + "_inBundle": false, + "_integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "_location": "/split-string", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "split-string@3.1.0", + "name": "split-string", + "escapedName": "split-string", + "rawSpec": "3.1.0", + "saveSpec": null, + "fetchSpec": "3.1.0" + }, + "_requiredBy": [ + "/braces", + "/set-value" + ], + "_resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "_spec": "3.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/split-string/issues" + }, + "contributors": [ + { + "name": "Brian Woodward", + "url": "https://twitter.com/doowb" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + } + ], + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "description": "Split a string on a character except when the character is escaped.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/split-string", + "keywords": [ + "character", + "escape", + "split", + "string" + ], + "license": "MIT", + "main": "index.js", + "name": "split-string", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/split-string.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "titles": [ + ".", + "install", + "Why use this?" + ], + "related": { + "list": [ + "deromanize", + "randomatic", + "repeat-string", + "romanize" + ] + }, + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + }, + "version": "3.1.0" +} diff --git a/node_modules/sqlite3/.dockerignore b/node_modules/sqlite3/.dockerignore new file mode 100644 index 0000000..add1e2d --- /dev/null +++ b/node_modules/sqlite3/.dockerignore @@ -0,0 +1,33 @@ +#.dockerignore +*~ +Dockerfile +.git/ + +#.gitignore +*.dylib +*.so +*.o +*.lo +*.Makefile +*.target.gyp.mk +lib/binding +build +out +Release +Debug +node_modules +.deps +Makefile.gyp +gyp-mac-tool +.dirstamp +npm-debug.log +test/support/big.db +test/tmp +test/nw/app.nw +.DS_Store +.idea +.dtps +local.env +.mason +.eslintrc.js +setup.sh \ No newline at end of file diff --git a/node_modules/sqlite3/CHANGELOG.md b/node_modules/sqlite3/CHANGELOG.md new file mode 100644 index 0000000..e8e425d --- /dev/null +++ b/node_modules/sqlite3/CHANGELOG.md @@ -0,0 +1,282 @@ +# Changelog + +## 4.1.1 +- Electron v6.1 and v7 support [#1237](https://github.com/mapbox/node-sqlite3/pull/1237) +- Electron v7.1 support [#1254](https://github.com/mapbox/node-sqlite3/pull/1254) +- SQLite3 update to 3.30.1 [#1238](https://github.com/mapbox/node-sqlite3/pull/1238) +- Overwrite 'msbuild_toolset' only if 'toolset' is defined [#1242](https://github.com/mapbox/node-sqlite3/pull/1242) +- Upgrade CI to node-gyp 6.x for Windows Electron v5 & v6 builds [#1245](https://github.com/mapbox/node-sqlite3/pull/1245) +- Node v13 support [#1247](https://github.com/mapbox/node-sqlite3/pull/1247) +- Use minimum supported node version for Electron 7 [#1255](https://github.com/mapbox/node-sqlite3/pull/1255) + +## 4.1.0 + +- Electron v6 support [#1195](https://github.com/mapbox/node-sqlite3/pull/1195) +- Electron v4.1 and v4.2 support [#1180](https://github.com/mapbox/node-sqlite3/pull/1180) +- Custom file header with `--sqlite_magic` [#1144](https://github.com/mapbox/node-sqlite3/pull/1144) +- https everywhere [#1177](https://github.com/mapbox/node-sqlite3/pull/1177) + +## 4.0.9 +- Use trusty as the base for prebuilts [#1167](https://github.com/mapbox/node-sqlite3/pull/1167) + +## 4.0.8 +- Rerelease of 4.0.7 but removed excess .vscode files [0df90c7](https://github.com/mapbox/node-sqlite3/commit/0df90c7811331169ad5f8fbad396422e72757af3) + +## 4.0.7 + +- Node v12 support +- Electron v5 support +- Fix backup API tests +- HAVE_USLEEP=1 for all platforms +- docker suport + +## 4.0.6 +- Release of 4.0.5 (again due CI) + +## 4.0.5 +- **SECURITY:** Upgrade SQLite to 3.26.0 [#1088](https://github.com/mapbox/node-sqlite3/pull/1088) +- add constants for file open (shared databases) [#1078](https://github.com/mapbox/node-sqlite3/pull/1078) +- Allow specifying the python to use [#1089](https://github.com/mapbox/node-sqlite3/pull/1089) + +## 4.0.4 +- Add NodeJS 11 support [#1072](https://github.com/mapbox/node-sqlite3/pull/1072) +- Add electron osx 3.0.0 support [#1071](https://github.com/mapbox/node-sqlite3/pull/1071) + +## 4.0.3 + +- Increase electron/osx binary coverage [#1041](https://github.com/mapbox/node-sqlite3/pull/1041) (@kewde) + +## 4.0.2 + +- Fixed HTTP proxy support by using `request` over `needle` in node-pre-gyp + +## 4.0.1 + +- Node v10 support +- Upgrade to node-pre-gyp@0.10.1 +- Upgrade to nan@2.10.0 +- Upgrade to sqlite v3.24.0 +- Stopped bundling node-pre-gyp +- Upgrade to mocha@5 +- Now building electron binaries (@kewde) +- Add OPEN_FULLMUTEX constant + +## 4.0.0 + + - Drop support for Node v0.10 and v.12 + - Upgrade to node-pre-gyp@0.9.0 + - Upgrade to nan@2.9.2 + +## 3.1.13 + +- Attempt to fix regression of #866 + +## 3.1.12 + +- Fixed to ensure the binaries do not rely on `GLIBC_2.14` and only `GLIBC_2.2.5`. This regressed in v3.1.11. + +## 3.1.11 + +- Fixed building from source on alpine linux + +## 3.1.10 + +- Removed `npm ls` from `prepublish` hook per mapbox/node-pre-gyp#291 +- Upgraded node-pre-gyp to v0.6.37 +- Removed accidentally committed large file + +## 3.1.9 + +- Added support for node v8 and upgraded `nan`, `node-pre-gyp` deps. + +## 3.1.8 + +- Added support for node v7 (pre-compiled binaries available) + +## 3.1.7 + +- Upgrade sqlite to 3.15, enable FTS4, FTS5 (@wmertens) +- Upgrade to node-pre-gyp@0.6.31 and nan@2.4.0 + +## 3.1.6 + +- Starts bundling node-pre-gyp again to avoid #720 + +## 3.1.5 + +- [Added support for sqlite3_interrupt](https://github.com/mapbox/node-sqlite3/pull/518): this makes + it possible to interrupt a long-running query. +- [Fixes uv_ref race](https://github.com/mapbox/node-sqlite3/pull/705). + +## 3.1.4 + + - Added support for node v6 + +## 3.1.3 + + - Upgrade to node-pre-gyp@0.6.26 with better support for Electron + +## 3.1.2 + + - Only providing binaries for node v0.10x, v0.12.x, v4, and v5 + - Upgrade to nan@2.2.x + - Upgrade to node-pre-gyp@0.6.24 + + +## 3.1.1 + + - Support for node 5.x + - Upgraded SQLite to 3.9.1: https://www.sqlite.org/releaselog/3_9_1.html + - Enabled json1 extension by default + +## 3.1.0 + + - Support for node 3.x and 4.x + - Stopped producing binaries for node-webkit and 32 bit linux + +## 3.0.11 + + - Support for io.js 3.x (upgrade to Nan 2.x) @kkoopa + +## 3.0.10 + + - Upgraded SQLite to 3.8.11.1: https://www.sqlite.org/releaselog/3_8_11_1.html + - Fixed binary compatibility regression with old centos/rhel glibc GLIBC_2.14 (re-introduced alpine linux (musl) build regression) + - Now providing binaries against Visual Studio 2015 (pass --toolset=v140) and use binaries from https://github.com/mapbox/node-cpp11 + +## 3.0.9 + + - Fixed build regression against alpine linux (musl) + - Upgraded node-pre-gyp@0.6.8 + +## 3.0.8 + + - Fixed build regression against FreeBSD + - Upgraded node-pre-gyp@0.6.7 + +## 3.0.7 + + - Fixed build regression against ARM and i386 linux + - Upgraded node-pre-gyp@0.6.6 + - Added support for io.js 2.0.0 + +## 3.0.6 + + - Upgraded node-pre-gyp@0.6.5 + - Upgraded nan@1.8.4 + - Fixed binaries to work on older linux systems (circa GLIBC_2.2.5 like centos 6) @bnoordhuis + - Updated internal libsqlite3 from 3.8.7.1 -> 3.8.9 (https://www.sqlite.org/news.html) + +## 3.0.5 + + - IO.js and Node v0.12.x support. + - Node-webkit v0.11.x support regressed in this release, sorry (https://github.com/mapbox/node-sqlite3/issues/404). + +## 3.0.4 + + - Upgraded node-pre-gyp@0.6.1 + +## 3.0.3 + + - Upgraded to node-pre-gyp@0.6.0 which should fix crashes against node v0.11.14 + - Now providing binaries against Visual Studio 2014 (pass --toolset=v140) and use binaries from https://github.com/mapbox/node-cpp11 + +## 3.0.2 + + - Republish for possibly busted npm package. + +## 3.0.1 + + - Use ~ in node-pre-gyp semver for more flexible dep management. + +## 3.0.0 + +Released September 20nd, 2014 + + - Backwards-incompatible change: node versions 0.8.x are no longer supported. + - Updated to node-pre-gyp@0.5.27 + - Updated NAN to 1.3.0 + - Updated internal libsqlite3 to v3.8.6 + +## 2.2.7 + +Released August 6th, 2014 + + - Removed usage of `npm ls` with `prepublish` target (which breaks node v0.8.x) + +## 2.2.6 + +Released August 6th, 2014 + + - Fix bundled version of node-pre-gyp + +## 2.2.5 + +Released August 5th, 2014 + + - Fix leak in complete() callback of Database.each() (#307) + - Started using `engineStrict` and improved `engines` declaration to make clear only >= 0.11.13 is supported for the 0.11.x series. + +## 2.2.4 + +Released July 14th, 2014 + + - Now supporting node v0.11.x (specifically >=0.11.13) + - Fix db opening error with absolute path on windows + - Updated to node-pre-gyp@0.5.18 + - updated internal libsqlite3 from 3.8.4.3 -> 3.8.5 (https://www.sqlite.org/news.html) + +## 2.2.3 + + - Fixed regression in v2.2.2 for installing from binaries on windows. + +## 2.2.2 + + - Fixed packaging problem whereby a `config.gypi` was unintentially packaged and could cause breakages for OS X builds. + +## 2.2.1 + + - Now shipping with 64bit FreeBSD binaries against both node v0.10.x and node v0.8.x. + - Fixed solaris/smartos source compile by passing `-std=c99` when building internally bundled libsqlite3 (#201) + - Reduced size of npm package by ignoring tests and examples. + - Various fixes and improvements for building against node-webkit + - Upgraded to node-pre-gyp@0.5.x from node-pre-gyp@0.2.5 + - Improved ability to build from source against `sqlcipher` by passing custom library name: `--sqlite_libname=sqlcipher` + - No changes to C++ Core / Existing binaries are exactly the same + +## 2.2.0 + +Released Jan 13th, 2014 + + - updated internal libsqlite3 from 3.7.17 -> 3.8.2 (https://www.sqlite.org/news.html) which includes the next-generation query planner http://www.sqlite.org/queryplanner-ng.html + - improved binary deploy system using https://github.com/springmeyer/node-pre-gyp + - binary install now supports http proxies + - source compile now supports freebsd + - fixed support for node-webkit + +## 2.1.19 + +Released October 31st, 2013 + + - Started respecting `process.env.npm_config_tmp` as location to download binaries + - Removed uneeded `progress` dependency + +## 2.1.18 + +Released October 22nd, 2013 + + - `node-sqlite3` moved to mapbox github group + - Fixed reporting of node-gyp errors + - Fixed support for node v0.6.x + +## 2.1.17 + - Minor fixes to binary deployment + +## 2.1.16 + - Support for binary deployment + +## 2.1.15 + +Released August 7th, 2013 + + - Minor readme additions and code optimizations diff --git a/node_modules/sqlite3/CONTRIBUTING.md b/node_modules/sqlite3/CONTRIBUTING.md new file mode 100644 index 0000000..0a75e35 --- /dev/null +++ b/node_modules/sqlite3/CONTRIBUTING.md @@ -0,0 +1,57 @@ +# Contributing + +General guidelines for contributing to node-sqlite3 + +## Install Help + +If you've landed here due to a failed install of `node-sqlite3` then feel free to create a [new issue](https://github.com/mapbox/node-sqlite3/issues/new) to ask for help. The most likely problem is that we do not yet provide pre-built binaries for your particular platform and so the `node-sqlite3` install attempted a source compile but failed because you are missing the [dependencies for node-gyp](https://github.com/TooTallNate/node-gyp#installation). But please provide as much detail on your problem as possible and we'll try to help. Please include: + - terminal logs of failed install (preferably from running `npm install sqlite3 --loglevel=info`) + - `node-sqlite3` version you tried to install + - node version you are running + - operating system and architecture you are running, e.g. `Windows 7 64 bit`. + +## Developing / Pre-release + +Create a milestone for the next release on github. If all anticipated changes are back compatible then a `patch` release is in order. If minor API changes are needed then a `minor` release is in order. And a `major` bump is warranted if major API changes are needed. + +Assign tickets and pull requests you are working to the milestone you created. + +## Releasing + +To release a new version: + +**1)** Ensure tests are passing + +Before considering a release all the tests need to be passing on appveyor and travis. + +**2)** Bump commit + +Bump the version in `package.json` like https://github.com/mapbox/node-sqlite3/commit/77d51d5785b047ff40f6a8225051488a0d96f7fd + +What if you already committed the `package.json` bump and you have no changes to commit but want to publish binaries? In this case you can do: + +```sh +git commit --allow-empty -m "[publish binary]" +``` + +**3)** Ensure binaries built + +Check the travis and appveyor pages to ensure they are all green as an indication that the `[publish binary]` command worked. + +If you need to republish binaries you can do this with the command below, however this should not be a common thing for you to do! + +```sh +git commit --allow-empty -m "[republish binary]" +``` + +Note: NEVER republish binaries for an existing released version. + +**7)** Officially release + +An official release requires: + + - Updating the CHANGELOG.md + - Create and push github tag like `git tag v3.1.1 -m "v3.1.1" && git push --tags` + - Ensure you have a clean checkout (no extra files in your check that are not known by git). You need to be careful, for instance, to avoid a large accidental file being packaged by npm. You can get a view of what npm will publish by running `make testpack` + - Fully rebuild and ensure install from binary works: `make clean && npm install --fallback-to-build=false` + - Then publish the module to npm repositories by running `npm publish` diff --git a/node_modules/sqlite3/Dockerfile b/node_modules/sqlite3/Dockerfile new file mode 100755 index 0000000..c14d989 --- /dev/null +++ b/node_modules/sqlite3/Dockerfile @@ -0,0 +1,76 @@ +#!/bin/echo docker build . -f +# -*- coding: utf-8 -*- +#{ +# ISC License +# Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +# Copyright (c) 1995-2003 by Internet Software Consortium +# 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 ISC DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. +# IN NO EVENT SHALL ISC 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. +#} + +FROM ubuntu:latest +MAINTAINER Philippe Coval (p.coval@samsung.com) + +ENV DEBIAN_FRONTEND noninteractive +ENV LC_ALL en_US.UTF-8 +ENV LANG ${LC_ALL} + +RUN echo "#log: Configuring locales" \ + && set -x \ + && apt-get update -y \ + && apt-get install -y locales \ + && echo "${LC_ALL} UTF-8" | tee /etc/locale.gen \ + && locale-gen ${LC_ALL} \ + && dpkg-reconfigure locales \ + && sync + +ENV project node-sqlite3 + +RUN echo "#log: ${project}: Setup system" \ + && set -x \ + && apt-get update -y \ + && apt-get install -y \ + curl \ + sudo \ + build-essential \ + python \ + && apt-get clean \ + && NVM_VERSION="v0.33.8" \ + && NODE_VERSION="--lts=carbon" \ + && curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash \ + && which nvm || . ~/.bashrc \ + && nvm install ${NODE_VERSION} \ + && nvm use ${NODE_VERSION} \ + && sync + +ADD . /usr/local/${project}/${project} +WORKDIR /usr/local/${project}/${project} +RUN echo "#log: ${project}: Preparing sources" \ + && set -x \ + && which npm || . ~/.bashrc \ + && npm install || cat npm-debug.log \ + && npm install \ + && npm install --unsafe-perm --build-from-source \ + && sync + +WORKDIR /usr/local/${project}/${project} +RUN echo "#log: ${project}: Building sources" \ + && set -x \ + && which npm || . ~/.bashrc \ + && npm run pack \ + && npm pack \ + && find build/stage/ -type f \ + && sync + diff --git a/node_modules/sqlite3/LICENSE b/node_modules/sqlite3/LICENSE new file mode 100644 index 0000000..6c4ce40 --- /dev/null +++ b/node_modules/sqlite3/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) MapBox +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name "MapBox" 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 HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/node_modules/sqlite3/README.md b/node_modules/sqlite3/README.md new file mode 100644 index 0000000..6ccc1f5 --- /dev/null +++ b/node_modules/sqlite3/README.md @@ -0,0 +1,227 @@ +Asynchronous, non-blocking [SQLite3](https://sqlite.org/) bindings for [Node.js](http://nodejs.org/). + +[![NPM](https://nodei.co/npm/sqlite3.png?downloads=true&downloadRank=true)](https://nodei.co/npm/sqlite3/) + +[![Build Status](https://travis-ci.org/mapbox/node-sqlite3.svg?branch=master)](https://travis-ci.org/mapbox/node-sqlite3) +[![Build status](https://ci.appveyor.com/api/projects/status/gvm7ul0hpmdawqom)](https://ci.appveyor.com/project/Mapbox/node-sqlite3) +[![Coverage Status](https://coveralls.io/repos/mapbox/node-sqlite3/badge.svg?branch=master&service=github)](https://coveralls.io/github/mapbox/node-sqlite3?branch=master) +[![Dependencies](https://david-dm.org/mapbox/node-sqlite3.svg)](https://david-dm.org/mapbox/node-sqlite3) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmapbox%2Fnode-sqlite3.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmapbox%2Fnode-sqlite3?ref=badge_shield) + +## Supported platforms + +The `sqlite3` module works with Node.js v4.x, v6.x, v8.x, v10.x, v11.x and v12.x. + +Binaries for most Node versions and platforms are provided by default via [node-pre-gyp](https://github.com/mapbox/node-pre-gyp). + +The `sqlite3` module also works with [node-webkit](https://github.com/rogerwang/node-webkit) if node-webkit contains a supported version of Node.js engine. [(See below.)](#building-for-node-webkit) + +SQLite's [SQLCipher extension](https://github.com/sqlcipher/sqlcipher) is also supported. [(See below.)](#building-for-sqlcipher) + +# Usage + +**Note:** the module must be [installed](#installing) before use. + +``` js +var sqlite3 = require('sqlite3').verbose(); +var db = new sqlite3.Database(':memory:'); + +db.serialize(function() { + db.run("CREATE TABLE lorem (info TEXT)"); + + var stmt = db.prepare("INSERT INTO lorem VALUES (?)"); + for (var i = 0; i < 10; i++) { + stmt.run("Ipsum " + i); + } + stmt.finalize(); + + db.each("SELECT rowid AS id, info FROM lorem", function(err, row) { + console.log(row.id + ": " + row.info); + }); +}); + +db.close(); +``` + +# Features + + - Straightforward query and parameter binding interface + - Full Buffer/Blob support + - Extensive [debugging support](https://github.com/mapbox/node-sqlite3/wiki/Debugging) + - [Query serialization](https://github.com/mapbox/node-sqlite3/wiki/Control-Flow) API + - [Extension support](https://github.com/mapbox/node-sqlite3/wiki/Extensions) + - Big test suite + - Written in modern C++ and tested for memory leaks + - Bundles Sqlite3 3.26.0 as a fallback if the installing system doesn't include SQLite + +# API + +See the [API documentation](https://github.com/mapbox/node-sqlite3/wiki) in the wiki. + +# Installing + +You can use [`npm`](https://github.com/isaacs/npm) to download and install: + +* The latest `sqlite3` package: `npm install sqlite3` + +* GitHub's `master` branch: `npm install https://github.com/mapbox/node-sqlite3/tarball/master` + +The module uses [node-pre-gyp](https://github.com/mapbox/node-pre-gyp) to download a pre-compiled binary for your platform, if it exists. Otherwise, it uses `node-gyp` to build the extension. + +It is also possible to make your own build of `sqlite3` from its source instead of its npm package ([see below](#building-from-the-source)). + +It is possible to use the installed package in [node-webkit](https://github.com/rogerwang/node-webkit) instead of the vanilla Node.js. See [Building for node-webkit](#building-for-node-webkit) for details. + +## Source install + +To skip searching for pre-compiled binaries, and force a build from source, use + + npm install --build-from-source + +The sqlite3 module depends only on libsqlite3. However, by default, an internal/bundled copy of sqlite will be built and statically linked, so an externally installed sqlite3 is not required. + +If you wish to install against an external sqlite then you need to pass the `--sqlite` argument to `npm` wrapper: + + npm install --build-from-source --sqlite=/usr/local + +If building against an external sqlite3 make sure to have the development headers available. Mac OS X ships with these by default. If you don't have them installed, install the `-dev` package with your package manager, e.g. `apt-get install libsqlite3-dev` for Debian/Ubuntu. Make sure that you have at least `libsqlite3` >= 3.6. + +Note, if building against homebrew-installed sqlite on OS X you can do: + + npm install --build-from-source --sqlite=/usr/local/opt/sqlite/ + +By default the node-gyp install will use `python` as part of the installation. A +different python executable can be specified on the command line. + + npm install --build-from-source --python=/usr/bin/python2 + +This uses the npm_config_python config, so values in .npmrc will be honoured: + + python=/usr/bin/python2 + +## Custom file header (magic) + +The default sqlite file header is "SQLite format 3". +You can specify a different magic, though this will make standard tools and libraries unable to work with your files. + + + npm install --build-from-source --sqlite_magic="MyCustomMagic15" + + +Note that the magic *must* be exactly 15 characters long (16 bytes including null terminator). + +## Building for node-webkit + +Because of ABI differences, `sqlite3` must be built in a custom to be used with [node-webkit](https://github.com/rogerwang/node-webkit). + +To build node-sqlite3 for node-webkit: + +1. Install [`nw-gyp`](https://github.com/rogerwang/nw-gyp) globally: `npm install nw-gyp -g` *(unless already installed)* + +2. Build the module with the custom flags of `--runtime`, `--target_arch`, and `--target`: + +```sh +NODE_WEBKIT_VERSION="0.8.6" # see latest version at https://github.com/rogerwang/node-webkit#downloads +npm install sqlite3 --build-from-source --runtime=node-webkit --target_arch=ia32 --target=$(NODE_WEBKIT_VERSION) +``` + +This command internally calls out to [`node-pre-gyp`](https://github.com/mapbox/node-pre-gyp) which itself calls out to [`nw-gyp`](https://github.com/rogerwang/nw-gyp) when the `--runtime=node-webkit` option is passed. + +You can also run this command from within a `node-sqlite3` checkout: + +```sh +npm install --build-from-source --runtime=node-webkit --target_arch=ia32 --target=$(NODE_WEBKIT_VERSION) +``` + +Remember the following: + +* You must provide the right `--target_arch` flag. `ia32` is needed to target 32bit node-webkit builds, while `x64` will target 64bit node-webkit builds (if available for your platform). + +* After the `sqlite3` package is built for node-webkit it cannot run in the vanilla Node.js (and vice versa). + * For example, `npm test` of the node-webkit's package would fail. + +Visit the “[Using Node modules](https://github.com/rogerwang/node-webkit/wiki/Using-Node-modules)” article in the node-webkit's wiki for more details. + +## Building for sqlcipher + +For instructions for building sqlcipher see +[Building SQLCipher for node.js](https://coolaj86.com/articles/building-sqlcipher-for-node-js-on-raspberry-pi-2/) + +To run node-sqlite3 against sqlcipher you need to compile from source by passing build options like: + + npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/ + + node -e 'require("sqlite3")' + +If your sqlcipher is installed in a custom location (if you compiled and installed it yourself), +you'll also need to to set some environment variables: + +### On OS X with Homebrew + +Set the location where `brew` installed it: + + export LDFLAGS="-L`brew --prefix`/opt/sqlcipher/lib" + export CPPFLAGS="-I`brew --prefix`/opt/sqlcipher/include" + npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=`brew --prefix` + + node -e 'require("sqlite3")' + +### On most Linuxes (including Raspberry Pi) + +Set the location where `make` installed it: + + export LDFLAGS="-L/usr/local/lib" + export CPPFLAGS="-I/usr/local/include -I/usr/local/include/sqlcipher" + export CXXFLAGS="$CPPFLAGS" + npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/local --verbose + + node -e 'require("sqlite3")' + +### Custom builds and Electron + +Running sqlite3 through [electron-rebuild](https://github.com/electron/electron-rebuild) does not preserve the sqlcipher extension, so some additional flags are needed to make this build Electron compatible. Your `npm install sqlite3 --build-from-source` command needs these additional flags (be sure to replace the target version with the current Electron version you are working with): + + --runtime=electron --target=1.7.6 --dist-url=https://atom.io/download/electron + +In the case of MacOS with Homebrew, the command should look like the following: + + npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=`brew --prefix` --runtime=electron --target=1.7.6 --dist-url=https://atom.io/download/electron + +# Testing + +[mocha](https://github.com/visionmedia/mocha) is required to run unit tests. + +In sqlite3's directory (where its `package.json` resides) run the following: + + npm install mocha + npm test + +# Contributors + +* [Konstantin Käfer](https://github.com/kkaefer) +* [Dane Springmeyer](https://github.com/springmeyer) +* [Will White](https://github.com/willwhite) +* [Orlando Vazquez](https://github.com/orlandov) +* [Artem Kustikov](https://github.com/artiz) +* [Eric Fredricksen](https://github.com/grumdrig) +* [John Wright](https://github.com/mrjjwright) +* [Ryan Dahl](https://github.com/ry) +* [Tom MacWright](https://github.com/tmcw) +* [Carter Thaxton](https://github.com/carter-thaxton) +* [Audrius Kažukauskas](https://github.com/audriusk) +* [Johannes Schauer](https://github.com/pyneo) +* [Mithgol](https://github.com/Mithgol) + +# Acknowledgments + +Thanks to [Orlando Vazquez](https://github.com/orlandov), +[Eric Fredricksen](https://github.com/grumdrig) and +[Ryan Dahl](https://github.com/ry) for their SQLite bindings for node, and to mraleph on Freenode's #v8 for answering questions. + +Development of this module is sponsored by [MapBox](https://mapbox.org/). + +# License + +`node-sqlite3` is [BSD licensed](https://github.com/mapbox/node-sqlite3/raw/master/LICENSE). + +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmapbox%2Fnode-sqlite3.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fmapbox%2Fnode-sqlite3?ref=badge_large) diff --git a/node_modules/sqlite3/binding.gyp b/node_modules/sqlite3/binding.gyp new file mode 100644 index 0000000..019df41 --- /dev/null +++ b/node_modules/sqlite3/binding.gyp @@ -0,0 +1,53 @@ +{ + "includes": [ "deps/common-sqlite.gypi" ], + "variables": { + "sqlite%":"internal", + "sqlite_libname%":"sqlite3" + }, + "targets": [ + { + "target_name": "<(module_name)", + "include_dirs": ["9=w&=R*Z~>*nq+2uZ)A{d?Fi%`u;bWX zr4bEiEhJVFe&q4px2hjPyzHAycF);!mz)f!AJx@W)m6W$meYTPLB^_dmc@P?4XgY6 zwOYMa+x_AX{M6v{{_qgL>+cV1#c%cbqP~B4SgRfF?;jq0QLFFQ-tT`w4*y6dHhpGk zMiWB57|`g&aj*6Nhknux`WNl{dg6cn8mQo-gM&@_-+x~(>L1$chiDR{_W4V{{`r5d z|J@yJXNT<7>U+dx(~M2}EFpW)hRxkEBVZZhI3a@|^+Os=QsT$c=Oh@7Gm^z58wV*# z<5}V}=om1a5Gx|nkiv63L>iQYY(zs6#aZC93K_G65tu|tKV)edM57OKHTbmXGkK0@ zWDt{491jSM1~`$hhal9K#tZ}K9LC8gcwiAw!r$1Dq%0irnX;3_87!JE&rin`I2k64 zh0hfdu?N_AM(=?kGKrxl8`FpnL>ju_@sIrEG6rD`gAnBxWi*IVE=azCgbC56$V^6% z-*n3SU>Nu){40<^{D>Rd)wDOkko;-DKq_od_O7h<{+@T$Ft?#2^1~TWEIkGhP)vM% zT+-gKFlCE2Tot}Dar;UpdBAUs(l@va;C*|?&b?X#J$#oQe z${!(r%Z*}38kjQKA!alRgLF*FJ>Au}=OWZ{#uqoWt=UHVtY@5=1b=vD`^>i7^9pf$ zC&dP@=W1`J2^~!+SCBWQBUY~O9Rh{$*njNQYUjrE_I;&}U z?svA;HA%fz*R;a3)o|LRr0ci0G|6snr2yX7^uUkTYOX-Pz|19_hd}WILWd!)<+MGk zed-YTfWI|DPA%J%EkrQkbxhakbsDCc2BR)IPP5nOzCIAio!Z8k+cMlw!bmJ{p>a`1 zP4lF8wq2YkEsJ+ZGhXdQ6I!PhK@PVq<~T6HaXnO5)46i@_hftb`obiar(LgU+p-Dl zLACCAz4oWJbJf;P%rgtObz(b>Po(5#3HXmwIL%fx1cg9{9FPyG9n`+59rSA@(U^A= za%tE-law0qWJ;swHl46i1xS8pgNjKL{8JcDCoIZHm(fXSaS|@sWT~G7(+m__n8;mi z8V|EabRS{RPiXQi{7EpGh72k4A>cKu(gm?W1)dY|i0Gm#a5O zE&i1jaY>W)79&Y^QPLrmdaXTy0r9VXO;W=De{cNXg#S9G(QKJ|_LO}-#&`w)9lbv| zTEc$^NB_lt|DF$rA5-ezLo~|~$OjFB1fV7&orrQ9bV9=s{DZbwgnb;qd>|@F`)Ya~ zwK<%TPwWYfBH%ze0K|n8CA^W*59c+iA&o{e;0X^xfc{{JkdhOkz`j|sg8M;d{pgyI~+!!V&~ z25w=7AQF%#UjV@)^jyVS4WjD3s z^&e0+=|#cQ2jR%{UFGT7M}j+tZb=$PL|hoV!-Y*~8ehR`pAm@uV*6{>!F*x_U_Al+ zx+KmtOJ+Qnh)u7GpM&*y77er@;(D~&Zr8AFu4Y}(9>!r9KccLp-R5YyAIBjBJReWR z8XQW`rqejd*Z|F)RI4nakdjmrFidU}^A8vi$(vz$VJ#WZgw7kVTRID~<7bxM6$xcy zoRiYwoRqLaN<>$c_bC(JOla^N(MjM};oz_+<@`(DNf^@sjvvV}a*a3<`P zA2R`&9%vG9B4s6>DNW_M;lnhvV-Rz)O(gbCfnt9)8lkMy=Se>fQzG@k_gF#T4GUsF zw1+equ|(?!5iBLnd&G4RF@WYNY+ol1z>OpTUlL?!%}6RYM0Hp-u7NPPXFT)dirbRg zI4)J4v{W=-O@j?gdGuz8aKL%N9u_Tc7{}QZKwAbTPEb&XT=xVFUc{2*Of-E-2i8Xd=V zPP^pNa(jl2XMNK-UOZ~C+=0-xJiwCO+=&!Ch~#&}@$PM$NA_y9L$I6#l$>!3NkR9h zFF@aHpcCR^Y7K*xe**880Z$WQcZfbGkdpU>kHKEX*eH#)=$!awz@38+iI@ye40oF!IgRg-6n98yN*=-Oa6OgUZu66Eom?2* z^W(QtuB{d)lmu*m@6CB9&PCT13~QU&Bjh}O zLscYNN6gbZBSfQVcx3w(4L z9ES-bAa%WdsDr8RREZ%C1s^o+4ao~|q}4m8s)B=jPfim!hps9+o?_xA3x`(Z z>o{|M@qynsTvaJQ^0Tms0!+mlnH0}WFbRZ$FhS&$(+YZ@Fh=N^3a2D)t&l@-X1pXim@_ZS1=u@ZXQ1++aXe+R z&YFos-{<9s;VeW(U@V9DPOnRh_BFXOIvu0ky{;&b%QL!6>@CZLa}Md_N5wkO0QVx+ z!b&dsQV>-Fi29kt0N~9|;~Xd&Cl+{!Yuxmy)oq)ui=mDfF#p2nbgf3uHag^@*MYR% zgw0J3ykH2>eOSIR8eYR`pIT>L%YZz@Yg!%mu0n2L2=vdQ@{MP-)(^Sco)6kYX6@wi z*0+sD!jUZ19_|-V75Jo{Tbd12&3bDqCyD9`8<{W;T`ginO-z}r*n;gMFB>`vIv9? zQU%|j(s$XMqqA|Gs*;$Fosnsi(Zthn(27ATDAeE~Gk4}WUIE#}3 z$h}3gpMudn18=~o^5uT7D-wf+ ze+Ic7ye>B`j#Wt@vf>3)QTIh%;{FiRfbIm?Ou?AD>WaVZpu?3e>7%^JXAz(Ins-|7 zo8FMKc8}Q7npRoFqkt6}z~V(|D;01FKLZtLf?YFVjDX@NDIQ3CK>BC=_=MzQ)(-<8 zmh)MZ@`P!ME$Nt_3n257ZG0qPW5pA{hfBy+B*_YF8_1L)M&OGJvO2j9>^_U^LQU4W znHv0_4uLZ;$DVvPRe<JzV|L8% z$}))J8zF0wQ}jz9R|?v~Op-l;mV%++O2rCwZm>z@N1#nfR@dg}B46`PglQ4hlJyOt3VD`&C54i`#}85FJ<$PW;6s!ON?&S(G14mY_Z5Z zuL`KC^Uu*fLY( z!6|Cb#WILlD)U@8i&$zBruR68K$%YQIuDrVWbd}g$B!CIsjo>fNTVv>K$Z(Ca_=@6 z60F=bPkU{ySDb(;xT!oF zLt#hnK-M(#$Dm{OG^JR6M?tEh6M!IT&>wJxDb4UT3lIEFKNys6{^tEJ48Ad{KX`Xv zZRL!pVHE2ZFsh6Una=4iHohElW;-W_Eq>d^57(a4@!HN6Hnc!kme+EcJ=@%t^pIzj zR4SIIGq8*>lUGlG94qjY&PFuhzcCJFDhy5zI0;!Xd7M{?Am%GmfKBrae^}6`-IbO! zKlM@*g&}V5%;>x{K)omR!Vu@gb$Ib*Va&2d(fr`MWms~6hOO?oY1`89`S0VcpQRP@ z$LelBh<4NQuXsvO5EnE_d7%z>CPpI?h7On3|BbRV&NDQc3M zZJl%-#|EihxW`*zHUa;Ebd2zkKBxRNanSM@<*;APIexcQ<{WR6tumgz;LPLLsFq8Pchc9lS&=95E2UBt% zpc4e=`F5vN z`UodqMm`=`w&p`rK+H>{5M*v{Zf|$*?&dANPyO*imuTQIL=iwp==+61dBb#;Kn_so zkqryeZ>u{C&+ybw7`@M%c&y?J#Ss&mT@r&QF2Ij}+%g;I4k@W^mSE{E*KCqf`c~iB zeft&?tG9pK!i*SvY(UfM+qb13wO_eaZ&H4a6y|N^Mq_=9M66%|2v#=^e#ih2B|JUF za{b(WVLBC0HZ7`(Rvd?k3p#wa5bwhCXcI(0bzTrrUPZi@Si#Wmj}eF>lpZnhss|Sa znw1b#mS3%7yb6XxNG2m#kWmN@%TT3g(;WOQIoVayU-8&DuxU1I@H)-)z5HMzZ$PE- z$+ZplTnt>X{H?lHcs$Obg^B3pXiK?~n6) z8F5Bwn$9M?`&lFmeFmN##LBUIgcmf=gbp#se77vORi5s)-!032%^*<02Lci6;<)5b zNp)EIRm11j<#B29Fn{i}j!VfzJS!t#BL*cQ5e*7LSz?6uOW3yn-;B1?wi<@*ojY!K zRkaI4IJVlPeqlvmAKrI82P3=Daet$!Xv)mWH|Tvi1a*`^5;Jj{Bc|gBT`LEORV#GN~c$2 z#>+sD;;xq$t9YIWzyYsN@6+{6pnGdIy_WI4XPfP13B~=tvnQ@L>U;ACE_(+a{Y?0T zbT)(_P0CT6OnB9{6qmNwiJLvKA`SD2`Lm3_6t;nmBC`(Nu5%!p^BRGAWh%B|B-a-} zVFkbeG&N*mxRx+Tu4CGc(R^v)mT_i5=4y7&ofpTs=Wza;0L{G9j?)5+*2cFTHm~g1 zP0#2w&aF#x^B|EqdG2-V#IZMQ14~pe!tFTDrpyp1bvqyoqiYsCjZ7L8f)^PD_)siB z1w*t&ELJA7D3Wii{*;cz%cmH4(ch>y0mUC4VeW@uA4ud;CL1U5Y&6a*W(k|b50KZz zLvjoF$fr{X@VK(BVTFR9poo-iw|@S?Jy+S$SFql%C0=Fc=no!YWzu%Id_;nv4Fimr zMIyh8hBnuzbMjZLtgMK$Yk)U#S{GoyD$N!cRr*21s5E%m=XDRrgsktyt2qH=8*rl2 z{8mO)*%&!%G(cuy2uE_SP;tYz4{$1{1JE+X`nyn#QbEJ9ZL`t!5VyF5MGrv|NBj>! z)C-#xb#KGhLtb%CC-FVgp<9U%SNPL0ig96$WkD`-aLk(k>fw8* z3q8;Q;w5GU1gtv|-U>BG2~W_Vf6N1_>*MM<2r+{*^P>P584oo)(qVdZz*x&~k1=Z>kyU#jp% z(aZ}6nB98*!#~;k@`g5!r0>7cr|2D&m4tN|d~AY45-hOIhQklw*jb6lgEWF!OEZc_ zGO)Ju+21<4d%EY)fpL=EH|)leX1c5I>gwvMUv+SJY3l&0-LAQ(oXQvYg$lIZQGx2cT?-@K4yV}Jg1X0# z_3l7#^{=f^t_I`$&?>6a9;*xJ@C|1^GSwt&+)JfL)1Ew8mu-<(iyrJewWsqn!!#ne$nX;dyd!=rMR4u zF^To|L2onW>MJO}sRb=%DQ&qsscQxMKvO{J^VQ3jN5`ii8v^erw@?(Jo+Z~or9+IL z$oS`Ywc-GH|7ON?+**a_8$w9|2u7 zGGyIav(%DqHPi_yc2pjtR`Fl4p+0Y2F(?WuL{(5l^0Q=Tl-i{d{v(T~pZTS_??WHX zo!zeAgFOnE{{`#;=h6Yd1IfU{iypkYCO3sb5Oy$y(aJS!+ZqI+Xb*-cY59F`C~(ijjMw%Rkx+P3(|^0e21XMHy@SqZ8q#vPW zg+HM(Ty?1TWLa)-bLHNo*Kn+MR<~u!!bYAv=)MC5cxgbBd|Ym^Cb%A5o*5^JOo=mY z>{h85|0u!mGLbFgX+zUBRA2Gn6DK?g^$77be-}ij2{AajMX=bjyo|Oz3Gmk5y@;yR z?cMHl$Qn@I$fj@_!_`8w2)Y^il(gjOnSeF~fx1}1>4e)24~wf-7-`pBmgSI8Y*|~< zO7K-NaL>I#J=W-D^&|dUQ$^=oh2`!6$KHh>p`OR0BK2&sqff?cCliEv+QcMPLp_(? zRjO4tkuQFT#@fMb;mXDx6i6ZP8u;W9Sb2|9Gi7WznqU^eJr8i}$42 ze|Oz=pVMo)33uFcM%N^I?_~R@UH#hVL*NqF-JM%aPrI)Z%H51|vCFbXl&-jPmk(aA zTRPXH?dGIsm1tp(^N~BD zt(J@>jbEJP7qNyPtHLx)P?M=u03Y;Zy=JorM$#kZH|0{0okg_{K5tMFF z>H2sB|E&r+EhvrOopfMNMcM70cN6Es7jYihbsZ#yMlh*)DgR~b7bLzoZE7(6d?520 z#2->=ixca`$QktT;nEd?;y|pp@Os}%`)E~_NBH}OdolI7)Do-O5;b)_L2v0ks&Z&hcru35#=W}sg5{Q>N_Wpfm` z*U6lmyE~EgHO}F zFUTr8+7ytQ*)-oVERY`lTUU8_amtykIxaPb7l6a*{j)skWd*^N^bQ%elQgLBGfE~gF-(Su5gEyL0C_hidvaWtov z7y}-JvSu}f6@F&-zwUc@Z&F5;;{<(%;7{|0tWHi=5uX1$^aIG6=0|#J)1ho-WhHyJ zqh?e^q80{!GLJE*+o!KiXoKCx>s>ht3y%OK`#%y3-B_nc3$?1C4$%?~)j=S{Cbdve zsBGcUSp{3-O1<`kd^JdJBr6d*!Js57wMc~OVd&24LdhoRu!7oR_HMGYil~5;?l30a zh)-uE^l{2N7~7qMqf}hqDrpO+QI&Lecmc7BdZw$f&nl)N`ve(dLwYFgdA57P^8$S3euO!TUVg)Kk9_&9GVt1O zoe1qmQD&Y8rmp|W&s#CMX z7$PGQntf0ZdOY=TlCr5UUM8rXPT!0x{RPhL*LG$}CtBwBQuKFmD&6>Pd*x*+q)7_RLHdKqjMI>6$q96r>h$o&;B; z9!lOiWprXLo3|(WtmAzU<{eGbn?aJz&EE#7mSyBkvv^=0%TNTC*v+g1#-a_7-W`c% zKD)uf*aTxSj}khXv+ewDxZDD0YKb z!;brI#BP}J{3UxJmXB}?;d^#dlS-8X;;zPbf*O%h-zu7PSt=w$2yDS13`eHOt>~e_m@koh&^g#ZMq{w>xF3;{Zk=jd z#X{JD(er29%tW;?9 zXcWsAbtJF*6DGh0V?Z74&{&Wl-9AcK2zb!rL(`_dBx$AZ|H^9jP28olie&6+R^a1D zv3=6neY1C3Ua#PK(yz8kak7%WmRX>q(Iwi8CWzxKz4WbaQdE?*b!p8X+l{~v{0S3< z&fq35*xcE-mNQ?=`&;(x%Hk=vyVKNH)$9!Ci5D+xuil7v5u?)*YN-Z-h503g@9~8< zF}!KfEMU@O#0I}Fnmc5$kCVfj)C=WlfX0>lv?9K1^t|_t0BsXCzWe(+TECeI3TZQ^ zV&X|D(@?3HVMml>JygtkTq?{yg%!vWu|$@MrGhp)ENOGZl7<9@hw7`cZX*++ZSshU z?acg$ucfXeQyk0tP1)CkEdc8}9P@*|bS&$`x<@~|j@P{mm1`MV69J0^s^5MK4Izh% z-J@rPcCmG~UND}N3ZDvEb0Te!w27It)+Bt=Oto1{vy(0|{q^i^lhPfhd=JAw~2Q5Q}&6rJR)pSM)H?~-I+r<=UNtT(^t|(IM2bDM`L2s z1T4ByX9yBdaihS10qq200B8GDkbWCXgbU)5x#)I&+0YR7&^pMf#{|b7cMOxxkeWkVo|c@V%!>?VnWiKin-*89XkLmNiXY21zM+SglD7sC$K?av z0UMfyS)xx+>^iGue+3F&A51;9Q& zX@HwE3PNyMg}F;E8T6;lAuv?-@z0^xg~P^iaCIN!3l&; zfuS@o#Ej&dh6d?F+yXC15UBMq13~@E42al5o_^TqA@CFxeIqIqjy>WrkeJTT-@=!g z?1LX9lGJx~M~#uJC=L@bb~qNX>#am*Qb-kvN8+raSB9bGP3AUGAVtRGNENf4nvnh(_5d1rpKTws>0ebeL2L_Y`jwgW3XxhyO9J!NO!=Su)nV^ zX_+%K{@WHbcJ-`4GBNvJwbsv+s2k6xkN6#7o@ze{Ed$~ijCgrGe$Eqy@4ByKJ~@9e z|0U(W%+8OgGBWdI!`wZ}-P5`0&DLg|lqWJK{gsl|n9=Z8dh)BzY;hu@!9><73cYIg z`1t6!+?oc6X?YR&|3RH3-Oy}O7Zpxnrk7~dauZ82RGS~5w4|7#raqgvvd_8=d5u6q zmIqSA2C1oNwo^O7Wo*(~F@c`3l3QoD7yO^R#6QLLN z&d~|scE(9qYly1Icisq9M&XFzNOc7fL7i+c_?WZLD`LG6AEnwUPzP= zuOMIwM_at0t!HX+I(gfDJpH6b)S53D1X(aO>bS5pQMB^e`c?%UB?U+O4kPFG2X&8q zytP&a;H0{$;nkcA1EB<|KpoDKVkMtF$qpyW(^Ly1)4;m;M;!>B>L?n(l^;=n2U5-Q z6^5s3Pf@IO$THiHx!{FA1`6ckA<-V^V=1F!=ovlQS#oiZ&9RUmTE3h)IY7LeAee?hME#Sg?I zKk?hi*c}1!;{(xliZV%CZKvywSQi^&{ShU_L^_Qli7MSGYDs}zn+dWHn<;R37Oh3O zD5a!|D5{8vtI(X&-A&QFWSFO++w*j^Uv(FhEoiAc~LKH3OInH^Y+gtNb-35_-ArH2PUaGeg}^X$k-$;Y!H!gNLjtQy2>#i zleh4B_6S)Q&yvpW;ZBlDK@Pe(4@&Y`DKQhQ+GxlX!FVVfpo*!!I^Jc%%1Qj-)gf?W zM&Q{yIknzdKxT107osmKo&x0%Lc?;XMzwQh_nn}2+!13bB2qwe*bOvY~LG>jL-s1q9W)L9y-hTo&G4b>_Y ze=X4&23eJ3PcG4BrVcVjnGnv5cZxMvXyFkanwisK3D|+WL__D7k5OSZ%FF<7l4apC zFhpZcSYRmM6yKL`36Sy?9yBJ?0Qw!(vax9@4s&sxg11-E&H~0rZo0}#QP~m{_!>X9 z;1gxvliF-otXAroEDj0rQb$LXOqQm0`APFRAwf0^WR+@#xl|Vx3WEo!Ln3MU|2@+$^q_Y*nW9 z`Yc8;ZR$;0VaTJfjGJi?UZpIk7&k>mI+9eeygUjXUmbIS}Cq zTSPf>c{MjD9yKwI@q@@eNk4C~9Hw{h#C?XIHfxeO)5R;As+lo9sPmJ0SpT>2P5K%+Q1xn zy~^yu);jRWQ`v}fqsgJ1#32ln1{o`B;s5``Jw29{{VBC)_xBXMcxMmlYXC zo+G>hD7Y#vy4{P=fVD%QEO-&ibJi)+?RLmcnNgR`BcvvcEoaiL;s-nZCo1eL|4oH) zvEcvt^~orRGV2dg$y6AwZ&eM7{La(WTDVCttVI#6GxFwGC~APvH*fS}PHuB$S0aw0l286@{zN4XZT9U^{zRp%Ezx&JX0b>4<*AAuClw2$Fv1aU|Jt;r#76SJ0k_bMEbAf1$XM7%z=h?k$E znUNtkH4m^(j^br*+GC4yQd+EhRThe+r6^uY@TQo(C(`n;4E8|?sqQ9;4KsB4$63f1cK|E%?0Um?4^iMFV$lUXCg*lksu?lev-hn;T06Bf@|wIY2+Kg zcRC7hqaGVaBbcjV6V{Z8ubTKl=jjoCyxiYDoe|rE5R5bot8U|&deMG6!q{DDSf+>u2Ge{36!wHF_n3m^U65I*g*gw(3To zZM{Xcn3?o#0WVF|lQlzQlQCMc_t@c&3l5|;jEr=={2*e!`~ghY=I)0NYq03pVcO3b zIPRrIhOIWv7`cqWk;5h#@lI!F`}pAB-8KZt{=8Arv|&dJXQc$rE#Rng6GI`Ieiee*0c`QgFt4w|ZpRxtE>{$xhd z{k@k*>?k}6XCymP0f|EP@R^i=Fty5Ic5x!~Qj~JO#0)F?z z&g<>tXKVx{pdZdLoGjX%3A*3wilYaXAmuBd zQ410k!Q5yj?+r(j8{x)AAZ$=dVeih_&l9NDhEPpk)rZ|+kpk@iB;C{tD|iVs#vwb` zEU|Y3zt##X%(&6Wvmb_K#A&X47<-fHI1uYkJ^|m3xoB6VCf_fi9lqcj>$5~HOqU_r zg<9_hL?OS6ziO`s)kG)81vr_8yDQ6j|i${Q$Vv;C4phH=GxzP2P6P_z@m{H7F7m$8WH zgLfn=-at1bV){;*QWaMnjDS3Ka+#;t-9Ci z$UUM%I4~9`v$@rv*U8MYXu6oSq4T=ZD{rXT+1W4#(Hy?E~CYTI5T!GOtAh%{V_90%jIgbc4<2Q-WdbKXH zJ6%9Hmu)h!CCH!zo<~O3Y5N$Mz|>kXu0d>OMdsvPp!DPI!~MOdHiel*W@VUF&b&dy z6=aUx{RPL)+^`gNvlv=z@vN%W8;iH`Zi~v^4(-iw!EMP{WLbOCLTp-gs=0OOM&<4p zi7NE$IwT$MReiEn_lXw0zMg`>qIiU!Sy9UQA?Gzf1<&{jAN(pFQ`keD%W zIFUEfRYq4A*Iz$oVGfThNpf*^n=F#U^mVaAo=`V%C>Y>Pwmk_Gm81G z$Qlpi+KbT@_&l@in{0Qg)HRM~$U$iLNz70)IzplKzpjg%Nj6pv>ec3GN}NSpC@-h!8jN3{M7u}EfqLP5Nra0G9Z?T}}QboMslm|{~bt3J_^caTN{^(6yg zNp)EDr#n0|W=o5%DVL#w6GpF^g?qPDkju%)L27)&RFOgWa;8RtlM`u9TFhbg1tY|} z4w9|Hy!&Wsy!J70FW?JE0g48OhKz$k>b)R4MG+14&CMY>E7N(*Nh!G_hz93jB=0j| z#cf$rA=$y^(&Y9#?IKjeR7bUoS-pkwdb`N);a?chNVHYxL-?jgoNp{^XaR@gLjBe* zj&V6Q+Qlf84^X5bm>f||?`=hsk2=Xl@P3zS!@PRe&f(3#Td4lCE1-IjcObJOWMvukR8IAq-aGb!aN^cy%$Oa&m_o$t+!L^}_!N2NZ+~Ql#DwEP3 zOs$NL{G-;_|4eVrovLWsiaO4C>ovF09t%y8A%bz}YALFsQy^deuxH%%-kb6g*sM}m z-N%^m!WBb5@Q3a|8={cN%7QH2LTSt?i7iT&12@oVLw)h3ggxz7DX@d;h$lb9^C@oL zQI)I?5Sl6yjcGJSUD780quiz>$mzk$JuNavGNdKJk&@3z*tMW`(8hWi`0^oE9kbIY zx&(MYNM-1#9@g2U=gO1lBj`tlAgE+T%4R%f++MRKh-(>+d+aSQH36=FEd~hD6-?a$ z(mt8Qpe+&mc`6s|p5Lc{u@j?V*p&pPF9)u!jf0>7bvekeuH=M`CbKvfmG`jZV*YhU z%GXK5jf`0`-*UtB6eLH%R51x>LF0{zer-G|$l0wG>pyMpn}ERORw_$JV*x9>+*x-8 zY#4#g{RV{y)dMZb${Kq^a?^Q+?!qSw2H2>gorw5=`h~_X_vJVIi{K~7i0yLg7jd@M zu86f_qrKixuSfXhlcfCVtYk0T8I9R`+nWwYqV_^7=h(8vLubT|v>^)|N?=2#y(-Z% z=WPKMO0n6GD;__r;e9#__R^8G=l4>R+zj1Lx7v%g{yq(` z7?e8dQ2Ew`UyPdcWXR*)S_Q%IXau&keVpgEmvmx_Gb!*nAN^Q6=;m5(9XvdFQRA07 zmS?iCIJhF&j}qqT)9vPuC;QtcFJ_|DKf~E|iRi|RcHO7AwEm%K$W*q20CC8^^SmnA>$`ydZhwPUwG(LfEle{mtp zh@`QDy7T63S&~3$u!d}*VzP_34s1(r;OXE0&Q8)Qo0*BxQj@uyH}pJa20R!>#!?}^ zJW?e4;;ZNu1TkAXD5?E#RlJI%o0>*5rfAy=mRLcCT)8(9nL!W&NH%h@5Fc38nS)-O z1~2A4i>sHWSwjAV!kwkJa>p0-Ixo%lAuMa|0}XhJU^-Pn%KTd7ja&&zXVZ`{%R;C~ zKWh#GDYGtz9+47Yf{PBZpX!zDbKTKag{ z3|PX)jKgq(UN!6~in+=y^%%3Abf9ZqO3cA>t5(CcTazh%_;&M$t)0E&A2z@Hfd%ao zf}tUa63)R0?-i&+kS~Li0n>&oqAU-A>MT==RCNlhZoz$CJ4jUO42z2$OCB9EEgR*K zrwl{b;6rIY$!su=jXn+7FA!aaRWJ_NQ_#Xr!9);GA-JmuWCWSdHSqTFq)zx`s(i_Y z%sL^VRamh%UQ{V$+}u5HHZ2{ILG3MRA8Is(RVQ0JMnT^{J$XWfH26Z?q#+GL%qk(u zw^YwLN$_rxj1{>c{8%bgj0a3U!3!YcNM)3GsOrHA;rC#3QQ zrjLqaPi8oW+fVn=4x{;F1~!{5%^7Lsio_+yPj$?S+92${lZV#S+Uxlds!(dFw2<0G zLt4~q5T7a!2^aKy?78nyCdQf%NNDOs%mK}NQ+EH?(Wj6IZ95sy=^~~eqnxo`3onGE zBNF1^xECZZOLK zM<^a1Hrb2=6?^Bz&}sG98dsx^9NyLcmG-K!3J6?ymv&u9{=kE2k9;*8TBAl`2td znvXLkWdWKS!Q8H`!9=->)&7T1O>a0IY{5|8mM6r+MU5C!`@ z>aEp)d3;n)c|v|1g;(Bq)YUWeBb+^=2jAR}AIM*mQ6Ij;p40pGU1qtnqn&p)=yqStU-P$O{`=T`e38O z1wffATp;DjNltY%lhTSbYAct|zybkq$W)HmKgl3e~M5GTzeaRi6V6K{-M_YuYMq*GGu9Q{~<0iqc<#u2JXYtEi_ zU`1}l0FBbmsHr@Rn#y5H`PCpXr;v6y0)|O$pacOMpTIbjB<14xWFRVcyV9NypTyS_Gz+cv#DX`n;<+h3L&CLFRfd;gwc(a-IVZS(*VR+g|q7o zf`N&R`q%aQRpDK9Be7nmOQ67mS^5Mw6&e?E(EwIJslPf`(wgddV;Iyt;PX=y4q&XJ z-%m>Y-8Qb6H!-hb29-Ki#rqr#jZSR3hQukLg5Sed0}Dm=nwG3;W) zBtD9Zu{V-*vi*asR;av`LBBFwe&X!~IG$D5XtiRj(1Y#*$#bJ)2BN- z!rn}l$+|u^ArHInqOC0Dlh%iu>NV?nc{>4flyz~st-y_9ScsGI_Hk9TDCV`q2gE>E z+s9k(_>=tF;nm+APd_E}jU0MSv@ULwpAvjzMOYIAJM&QAJz) zKmqWieoQJo(Li9_aVH&$QbM}I#Er*!Xe zER^X8&JyS0#Z1C|HB%Q$%HKH`s zJ2-(Kefu^LfK8YD#mU=wu@G={F2J$uc?Chu?dyZ zYO25>1nmGFEH5mO*@S~$Et=d6Jd^FLiXCr)p}PXlh$^CaRGbGVwBOY*G4%qx>X^pN zNghyy1kft{K%3eUWf+Ax^lSjjnHUrP@xzBIL!59LSV`k4PS@tLfAqA@a7YCiX6#>} zGb#og!h;mElFXVo#jMA_wUsk>Z6ex5+MKwaEICL!f!mYKqbWDhR4+3<^HDA>G{wm1 z6${x3H`}FaG=ckgJ-M|U+)&X65 z<*kCmg<^g)e=-$9pIQ z)zG}RDrkjO3#%(DErxclp@6`V2{B{sM$hb)dP1RI!j zP7@~JA6}ipihkgTtXSAEs}P7-#=!3QLC1|E{~}P{;Al^Uk(rHnQ40I1yk3c;HH(1@ zOmmIdavbx8)UH6JyirkMLR}m$vT~fbJ~_ENx(N;eK$RaNk=!K5J92}Y{NxR8jIDk`}z{ZL)>2t;9%?S8>g`&z)={NxLVjd?MkRPLc z1|OKkDxpKmPNDcJWHpbcw)egZ^fU?!e7yRgh{8oFVy^DJES;HrlNELQ_#f_ zJrcBP%yHc`KxQbpqZ>$jqAA8^BR?jo6HwNSc{res4M%CAP+pHDjZC;odkl?7Fg?ft#&6C2w(xi5*#?dncoq|-$i_yN*s ze?cKYr2f8~6fk4wx9;UK_kF8bzx%GA3sjcIAcGA#bB|A9%Vuuy#F>zFDu~%6*EHEw z+M^}St7Ol9Nls<6gaovby~bC?HpQ1gS0DxDdOmcK#SGKfx@lG@ z(!B7t+>jc7ORi`0y;y%^80pO9j21YsF(GYmxn;QK!8qdz<=~aki|M#$ z_N)v`DEG3S_Gwc1u95&5xeWb@Vyp8eOS$td*Rd*c}m zudP2ZTGzd~K#dXb-ysam6@KY@7u~Kojb8h~H`fi6OXBw8EJDRQI$>a!W4LP%eg4r& zd*Z(HRExP&A0hcE&JdUV#p8J`F2+a-eMACivX23ORkL5i4x}SMQXSYRC`3mKkI-^C zN;x4GPuvJ?qpLDAqNU+x29=a&PX~_Q|M3Ecc+-?{-MshYPp%^^qvblm??@u5u9R>x zrD(*ev7#*LLih5x#lyMr=<&OXYQ`Ri7OTShNhuQlMuYj$G?;8^cXINsM{6a^D|%B&1O6(kU&@p*IZ2H_Mdg4*d%^jLagp@zK$V9EjdK44fTL zIhs`hhH4Dc3^o;v(i~3}kbC+di3D& z$|{T>sc{t6f&w^zUSjSdr7;j&QD*ItkFMMIU|0JO@RAv0`xdy(SeZQ}UW#@@JbZiW z%xmJoTVvJ`ulBF?_`mkVy8!RaU=hPX0=C_a#~bSpAJTkP02%BFORU9ck0=v9KD53v zYhU~3@#Fhn8#M@{4P*9s=2|k>Gq8=Llg8W?VG-_Y!aL)-cmeyl*nRiT!)Az=sNaOm zlG#`!B99DaT$&Ev0QhX+cQxRqHp$kKLL9-JDokE_2r|-Da+a|w_*1;9^Sui zWV(qU2l}9O!$HkZu)Z<9QnT+Jvw*F)WEX>;Q6R93hBxUpu!W6ozus%$6_J;6 zh_ho;NAnVs~ud;yI^WCGb( zbWsT)@eaON~kE+Xh&Ka z3}WL(DZa9}O5LSNC61kRMdM3nfJ=AKSCXRJMX5EBoWyiZiZLrnuq!}iRF7R<;ziE~ zuJ4<-UhrNi%`&^ju@)@{%#eTNo1LBMiTISXPJ`L5@>0?3|KLgPJ9toQY>0!W#)x|X zO741G^icY0a{A()SbzIDLyVFsI#|$=lMzH{+9^qLI*B9%6YU-K1(uA}ACA}*PJNAo zRjHa9_0-kaW&y{)2rwj`i?A9j9Q0lEUDij==Dm9cfD{YwP;~?8dWe^e?_q8XLHvZ> z52lLYAfgYSYB8dlw2U@0RN-J0Dc0qIsJb`NK}qO{M<*&AFN$pnMmr)?n055QHpW#@nUy-XZN_Xv;VAlI6s1=nc6b)X#fjo&SSGdxy>aS3A4DB9W%H_CyWk;UJ zol2$hM0bUiS;yFUxB-Hvj=rPtr$_~`MutsWqBlUzohaY0nv3saa+E4hSjQunqoI9^ z$%4fw71vQOCxi`RQ2=ub*P&J|Ua?BG1HCxq(cjE?qCH>#7atTz7KZ}@pGaqM(BK9R~BFFNw#or7p8eU+rKyE$Wie&=pc?T!m%$FTDX4h$AQ3a%PNt}#E z%qQrZghuGumgb(mq_C)9Oot8}n>zAfl|eA|IFgQ%h89&{yN#|MY$UJWtOEC;zicAua`lFKju@gY{@A)5~S!2a0k&)N!ssq!p{4`y>Rg*2oRJ_i|uemK#`qpx2ZUc z$EO1FSryBuRBeDcTNzEc8T4+~_tNo*Tgo2D+)NI%G#TGulkk2EufBEYYsORz_76L#(08s4nLssPzEp1T@*BOgj-zOp{l0UFL88YU zI<<8!Nh_{1J36Oh>$F zTV?G%#e(2pdPYC(KBgfQl*GvnE2``;U5zk_x;)jJWP#6fE4A{a4bh6o+W*TuOEP(5 zHRo|&mLSZ^L9DK#_^fr!VdHoine6L|yJajCnOseU?ukzdi}^)2No^TB~xzUf&ier5s*~J<-%WjAGLt%e&2} zLyDY!noTq8s~I0HL|?WsyBOnTZfUtIE>*tNb|;T2^EKYqF-2q@UhYEUohZf7c55eq zX6I<(pexz}pHNLnFQ-65YF!c-Ya!XcMLycQxq%l>BeF*uX;U$M^Mjb&WNb8aVe!Z6 zJTlH;Kz!3zhD=MKY2-uQY+}8WVD)C3=7$Kmtpfn`l`bjU2>`J#biHNUBN>DmU4kqR zzk(g)&Hy^mI|U@B5IRdGmcn(y#yhD{7{2TI@mo@;^{k(qAmq!~TRI*VM3(0vbOw;s zdXNpHS7=ZC%fm3=!|*TXz_fFqIhkfU2qqK$K~92slOOZ`As&OAY?CqS zsMj;Ll5``JNC{?d#=t?Tj#eNdE3F-5rt!|1DMT2OhLk;&)j?7ONXt67#S@g%$t~i{ zB_$sjNT(OF#4?~Tbf{)TBnG;RNF^C524{ zBEkem4yu;WwJf+gtnk;QJC9+t;`1`1v=T=`Uz@A3Kk*FX;*fiX^Prgh-tV!TsDdCA zw0TSH))aR?^)~IR@hH&o(P$>G;pBoG1hJ&z#$V5^s9w-MtG`eg8zKm;1%)(&)ZZT= zvr5vqZQ02H1@U_etx%3){MJ-nNE)xVkKwFPDmI&?Scp+;tVF_UiNul85G^8W|1Qz> z{W%OufM#9tjBenl;XcCpHK~6y-a+kC&`t4c4PbPD-Vs-xL^Gk~Lw3~+^J`o&Wv=;n zA;n9dw3$aw|GBewoUzc8OVUWKjCzu|XdD7GW@qYmp~Z+F3%Stj90) z7@35(=v5ql>ENWcb954q7=;FifTLu+sZF*jdD<^THRX_*~gBb}82&998B0{P; z`^*`ZaH4;)eZ12=+S$ePI7Ss(cGt0X9_f2QMz+etAW9yAa|+Ikzas;nX`c==QYc=b zO?2d-DBjs|OHesFj4i~1l5O0Wl^Sp7{Ba@zJ4X44Wtc?P@id?SgzqtyUNW(cXr5KE z=_DMo$`iB6l~s`bEx2#!RtI5F12G+T!C<0iszkvx`03yBisCGKJ5;jv9#4Ie)rWAB za05RY#&|ErV4_CpQiWQimR@;^iZYfOd&tJCjOlUZM`VA_0aobhg_n9Dl5_P&5h5-M zd1Aw4%%?5aUFgk8Z4%bby;@8|n;5UI&hLjr8?5e_n;CsCqt3oHT3qpcSxp&BN##&J zng#=*PraJ?hH~Dd<$g79jPwN2{fg#h@o?#T(c~neIfONZDnyHw?hl7v55#!S+BH=T zlrD@4h~xWWxZMFy0DTzL$y6m+>ar*EyxPFFuGDn6GbBZgIoVBw0PfZN#Tn>{u1gTtfM!>FO%5B}0s%ldseO_aSXZrbTHab|h5A#uHdYEsi>p0jX*V zOT3blBWRe{Tc}=v*Y%=^mt|(XKq5k~G$kupm~)B#v+T29Bv?86ZD6hJ=+DH`-M|Qi zZR}$?JBI~>NobSsVgX6YNS&*S-F<$%i!j@SRtYuTBJ{=hS8B&ncVaQTWgI69A-AQ4 zL(ebz6N=Dg1m7SYc^LL$x0HDp zjTs$jDN@pHxK=ls*?n_jTzIA%hA#}m!9*I3)1KktmX|c=f=i(|stW2ONYel!rI+y> zOQAK|nQe$gy;fq>=-rpw$Ge?_SBKAK(B%ESldM3Bw)961X#^}xK}m zS^7%RJB$i>=I9W=qcO+nBjYjEE~K-m2`xm&9c7b&R4<9l%d^eR7JP1Rp5eclL|+os zm-DK}xc;gW_z$yhQ}*q}YL#r8Ca&^A$pcpg6);*{$ec$ycrKf&{&4c~hYe+=dL1L> zOViS|&G-?i`7!Nz%ODT+1OE=MuB&r-`m@ zE*FDnV7ffi12u~ z{WF|=_nK1Bpri2oV=%mbd31aVyWBGdmO;>zu^9B~Q7GV4h48i@A%f7`jS?&`UFL$o zOS5E^&$&1zI;bdkb&x}8_60R-8aUqlv)%2}SFqP*r_AH_N^fFIRnkyQL%rF(3S*>@ zyI4t&n_bEw%ZezQAydRs1p)V8y+dGtty1F`y}52Ss*U|)n8A^F_z#MCCFK~ zDvsV&MZlKXtSFKLT{WaC*r7?%imFOu5KX)hBps9gGnv7!lGK3kG=x$GQxLn2FRtW) zwO*Gx%W-3SsPk$rx`RGS;k1v!@I^PCTq{ ze6OQ75qcG^MH*7G@lUdsr^5@>X*>}QGAE}|kH4vhYbk1Z&l~VUPdBUYQ?muHE(R2> zx+8S~nKjgK6UOBP&sUi-S%nmeN8SV>DmgF3%o60GFzGy>UyIC&OO%q8yQrcQA3`M# z!@T95L)DS{L8o2=L(k z6FI_oTkFGv!)N5$?2GRNyFL50T19&Hpwq9bT*D)Kh1XVjo|Ea`WY5Vn$+7{bA4>97xcpNH&1$jV=LM~aI|I#x^j2`LA)u{?<>3K{k^Bh+s8k5 z)LrGP$Q##`QVY7YMhI|9na%w|LIB>xrsK@G{`CXe7_Hu?Xq@D!N=h;cf*DL3{8%Et zqTCQ5q{F#?fpHrMxCWVRdJ2|`at;>99>O7dMb^2a$!ie{p7vo(gi2L+G18blgS3vF zn91H7@qoPCK`xdRC-f-3%phBgE2Xy~OwWG<|1idHBCp+%kC@9~W<`k#)(oBSpx;`p zhqZ6c&hEDNlJk^oS**!HPco)0o9?Ks-*+EBWXl#D>+Wc3-xXpHK8g*l_qHE1w%xLW z$345;@EUJ9qFiF6cdR*{xN$^@6{XAR2)lKo{>`KMbrpJgFo2%kkTAk=#&hqzv^251@r2IjBkqA5C*Qph7I%pg1`m} zN@+}pZ~jp!k>eASA%%$ffN>s5h$9C3BI*S2!bV*@VQK?$PlXcPl=Y)IvI2*;4ufg) z98+$yMzFqQ5c*Z|iU6_pc;KIrC6ycLz)(YPc0j^Q>P1+}9sz*UCA)FSFpbI3hDz;7 zRGSs?st|qzS^3ttr;s~e1<(&5fWV5v5|T8~;11R!h`ag?$qMux77?LichDnPDiNkXAb1)pC_@-C__i4j%2?ka>A5YZCNc|!C z62S3No$_JYU3r56SuWIS*t<1Yj5Xe&wxajrheTR+$!Vx;+8}-Y^wYbd;o#34QrG4j zEv=wA^`B_!>xidBwQ5{ODF_RYtRa=LW~v;zX>0_Hj5|uzO>q9K93Afe%+muT$tv45 z(UmmWM8#$L6B)cZLbxA!=_hgg)K*V?f`Nfy2Aq3nDX789Nf}7H9aLRML2?5Qi3Ghs z)>M)d>Xk@4LKq5?pxkUFk`TMM>j@=l-&xbEVC+WN z2#Nj@qt-(&&K3Z>Q;@!b2|9qJjfA9VrZ^l`fQ>%lbzB!O6?Ui82cq6DU0S@aD=~!1 zH&7Va;GF_C5I5;h>3*g^#c1+8PSEx$Y;hIj|6|w4NhX$Z?@FA9O4uROK-P$^jUhes zvkKHpwsjmUO-}*Ut7YDLP)&!+2Hhpb6`B@6<6G>H@9-R`2>A?qkLw|R?~)O}hb%W7 z4Kx}yyM;xb!uQuiKsrWWQ7YHkRixe3Z6weP`EtITnv_7bSb)QTp2YSjV11GC&KL&l zc(+wP;{mAu)T*4tqwt!ppy8kf%nUlsjf@Qw*Hf}Dw9XkQ!}w@Agz|<1rHvF-1O>MG zP7d-ieG2um&tLer{MpFpOWd!jYuJ~4w9(hwS9UKtsu!vE%4dqYitfpq09BtgDLRPaXg7&h@pDZafb~(HnbkgL<>Wqer!2K z+`;JiZ)8(Jmw&|09Y;8*CNlH>R#fC=%~2-_3GjxXXy@;6w3<4$mGH?Rm4{%Gb5s5n z8?h1a??_fU%eD<3>tBnPP%`=}p_3~iLkalO!W>(Q+uV_l@a_VgSWzWEquT=66eqhn z4k;J{Y6K;a3YYPa{ZSk!bBV_M0Sk{=y|wOO2bi<$5-X|trMT7|a^!i7k|qD3mnFf` zkzuLTiZi@7&}%hw$?=NgR3e`C{NUCLD2Gr!`_SAYa}~HY?wW}hvuHDpnn*64sQIhkN>_R(k}CD`@bTC0Ds$^l_pi+f zVe*kx(d1KG@q>KxsiRW^-+^-zTZ#t)qn6+mitI)6lBdLH!E;RZ7S75=c3Wz!86}(M z2{aL9d0TI3LZRjloz`fboyXQ9?NTZF>X-T&-M#(NI6GTwSK2Yz;#ckUuP_nNL}yi9 z$wqdAAXS7uTn?;Yoi<*;MdBTqIh`kB={&f43C>`h7o9P3a&_SJ*I1M@=aD`B^De|P zR-LIxr(&a?-)cR4^hGW%tUHQ7V0|pVJDN9`CG4gxr%gshn-sIhfu5Byd*tlSxSC2` zSj@P>rL2id+&Am%@ekCsjs0_eFvz&)jmc+TduA12j$lBFsG zdq3q?RX%=9kIU*eLu0aPC^S-4IF2By38oP%EDKWWNZzB;8Kwe1sg@Vhf}%{R#XFgUK}Otr*LevHgD9+iQ3{p#J;s?a-@z#0k3;}rG6A;|B?}~q ziv72X-z&?TzF*SAmX!X0z+jL!C^!nU2Y`l@dWq^X7^qjYGpd0|-n3>PkMi#dEev83 zAm{;3V!GuKB}h>cyml;IGFqHuo?c`?FS#~kKrgn85Nwp*%2bkv+XnruR{iX( zQA4ZJc=xcj1j8O1OVd6+!n5Aft(=S%VK5XxZwxJ!^bWCVz63ACxsKWWW z{y;>Nn*rZ0YC9ZVS>B_%(kPV;QWIb=z&J&t(G(6=`zs0tS0;l@IAHuh30)7>68%bLn$RzNz*3t97A;V(??r zI8Z+_X`wexd^Hq6kzl-|->tQXU=uUjHHX z-~Sc5)p=@C?7{xn^Uk9luBzVHy$FN;fR`1!pRf{$wUUA8&vZDuVKW(Ue)Y|h%qm_@P`8_Fnuk-eXalo=mLqkdd#@)67f z{d94nxy~o)@;1mrCRLz*+>Voz&q3`Gxgf-;GoC)Iuh-WTiQvin`paoCulj7VHV%j4 zVg0c{_%)OrG&j1lZZhryFJ1rL^bgrca-|n(gi8UxJn}65Z`^Z|lE|FNF;gBm55r00 zG8}phz7b@JfS&T1%yISVZl#BJdjp&k(}>`q3d;3BhxTJDZ<&$yLu>v;(;$o%pG#Rr9O#FpS&JbDYAfX# zt0Z5t*4N$h8R^`$O1>osB`EF%p%=UdG6auB7HGb5K>0&<$=mFaN}z$m5?bfIc=_s0 z2i^NR2S+=*2|&91Yif1Zfin>(*|Ko2@8`E0V-8E6OT>qJaO^@QvLrrr5BhNBX{F|M@@`wH!>eO zg*me#_snR@1T$vDErxxG@eD#3&U=KbB9W^|S;y{i$%*k_Gp4rk=Ecj}t2ZceL}HB{ zoz_G&2(RGmH|2?(a*;sKhasAbJbLt~D)=rSt(RoW07yc$FHvFWEa&$AK6tg?`y)jWZ2rsU;A1s9oy?QGk;EQp{ld6?S;>x- zNg+aD8gvF440&bcj;75DdqUgfuz`h@zHcqN1*g~YWBt2K$aIRl$(k{YdgSc^r>bLB zws>aI*VHD!^!9h~)>)ge)rSum^AoLz!$7&ZLdxjMpL8!7pLKtSXGZP8#>X`W{uR#0 zwb~F*#T)0*&>!Jb~cT)`N5r@GLIm zkgf`3Iq*Xl^7tW=f-P4S@%Z7n(E$FHCJq^5;_yS$e*DmELuGb@0}tj*ZRkSBCM`l1 zQL+?2XriB%J{#ssAw@}3*gq^;RXv_-$2p6pGmo=jBtB!y)SjwnF0oHMB*b{rRnn!B zyLmV4_v;1XFKhG;R|o&ZH1RJ?n04<#eS~GpOhIoP`n~jqh`>I0!^H1NwTp<`s)n)C z_`o#Z|1w+QGFw^FSokw{Cuwab<9ed{+9w^iFj4MJAcer~cD)fhCKotF9YL5AM1(>c zW-N4yoe={A7z7I(&c4rK@OUMCB&U4QAe_9b!B#sNN-h~Nou+#m z(4M+|UxxaN*(E+Pk+b58;+!E!Y z#AZeV3Kf!#L)dySQ!19Z9xSG@2aMTqsTL9#W?ttp(GPbfi*1Ir=`g1NBM z7w^p&IO7V1F|Hbg6~K1kWvzlrs>4K!@MKMQDvSrQDq%~y-k3rG6XR&;TA?e+dpM)B zV_uizOi;E`%v%mc?Tx6tR}<`)MhW4RK=AY@;+fYA$8LOaEZeB0s>ctjL=9nF1Y#)> zzAsf@HPfAFG(CjjBKR&eFGU7_jz_wSDe5K8Z-@|kO;VVZ*r7%TUno=b*`Pa^_R!N` zAwnD2ddC`V*-+b@&98xVU! z(R{zM0@pcJ(QXybHY$}TB6ZiE#J9;>+7>^n z2(|yD@k?t(oUL76b=?tuYxJH(jn-y$Ux>`+kL5-VGmEpwD%F0ERQ!cR>N^mZ^X)j65Oas7n48;+Ww#DT=}J7Q_1)KhjoN;Z`9T+IpL;f* zqu>aiw@lhBYEQ{2x1i{(kIl(1YGHb|BOgNNYuq zGROW!J_lUj7CLWOv?TZ+;k;dtKfX1u_S564IZcLX8m-qa$VqR@NAG5FgwcjVSup3B zvf#gCk8z4Ma?;p{1CFBolyJ%4LdK6p2L~PS?dv#*P((Owaq5Bg;_ObL)N@fQmdjtmlq-H%egCOa z;mmc>ky&N7p!oi6VrkD7u{!ALC_$jIt_Z0gV}pNtI#3XZ7*yuAp!v793%G>~%xxWD zxPLR8MHcjbS=jq!S;zZ1ZufWMbbniydv>_LrFYJZ9?x;kNqXim=jlJdodP}|%FjpX z{Q{mYzCHg*?_!q}YGz-g82~2IkSBJ%?+! zj+K>B6!_YAd;T5N3=bHYQk8%F>M%AIjFEbM^qq<-^N1;=lMsdgxZm9L+1@$}H7IwJ zC}jwAa-Xn3LJaQ;nty8tFKGfA(b_0)fRWtv9KW;axiG9-eKwD%-%g8@BCuGb6^+e^ zT}B2{Q8#>0-_YM5y(c?4L@Ky~67c&GoQYo@?!8%4D}8NxwUNO=ySYcE-)VpQuh`iZ z^^a42HgyNcqY9k4k)B)cAHf$&$1Fzn2I| zpF88&K~rDGr9R$0d9{C9ZWZmcXO#l6kbojaCSH=(C@V}-K_NFqglg35^uuvyOhGud z9CA%5T6GsiL$q*aN4cIwx|shGV_9`}-|RLqO82w9H==oT@N#c|_n2K}%$~#WhXq{; zGy=j(e314WIb7u)r27=tG9M&oHkn0=PIIT6!n01Q^GHzzR`Dv9(8kg3WO{+l@D#@; zBbTyFP_`U|!x?qQ{%C?xYz7g!Q}9V+I`%r`2WkE*0kSr8b(E2h(h0mY#_;y`cq5Y(ii7VKIJg!)z+{2(XlpAZR zMp2@*$k9|6`*03`$r+B>u0@CM0Zw68E3p~jqx-5ZJ7F9^3OFztusI4V5QmTvJ)-Zk ziApXnDO%KA?YU~17NrT9JB22+pAJh#?~|DgZl&^y)`@AAaifEZ(Hc=hl%iy@K}jn~ zX;BIp_J>B7??v%`5nCo{TQDyM&W%eptcub-I4~|j2Qrl3lB=%6mfQ$n-kqzy~HFlf| zq~_~z=CuI^E;vi~d6;autnle2bDEyMlVQTt%qj}xJ--j~An{AIVAFNS^yz{!J;tme zUwY%AAJL2_4>s+3)+Yr3Wp^hOO|PFa97>g!)NJ9i4OLW=P3H)y4+ApwF?dk22saUM zEwcz)jXu8+oqq9R3=LQo{YaZ@aY90yX0E3uu2m#(MK^|f$}0^o80-nL9SO&%ic=Nd zHJWi^1Ax7tF&J-^{jp2itlU|U5-!gv2fU&%CYRw=ke(uG!Pr{%uP;5?4r3H6mBHdK z5#wa%&x|~QCE2-XM8-QVn-7{i#OBFX5&4@i7BEYEuqv?QO<;t~;KfVTBBQK~P1!1O z_j)w&yMFfGj{=-LXw(~;u-Y!qDy!t1fZ29_22QibCe*vf1r#yx6~O_X9v$sVskMyX zEAXC^?4sqsS)~^Y)KQ}OVz>F@-r@6d3wye_4o$TT=cV5w4)DSDb7*w)U;G=jOWd17pB$hYUpTo%qkYmzS6d1nzd zUMuk1Cyd={V>T9`Cj{EB_ol<)4Nf)$U5sFsOePdD6~l%gYY8S)yBbGGse*)sQVmL8rmg7ga&6hJ^q>D`W@@Lyc+uF+u*S zY)=&AZzjrZ9IJ-2(t(n{Zt<>d7&5CwjpDiuJ&`>dWMT(W%XG#avO|}%9dZEd;6u72 z*Z#9S6?-0D5l0;ml)CRaL*Sz!1x;RY;>^N9&s-r4a%1npyWV;W12LuuKWQS4*c2v> zcDcURt~hUzkkNvyc3~1Ubi|u%vkeGh+|F#2*f1g;i;ol|Srlp2+TB3)cCz9kV~$Py zV0U2F&`rd*-y##(J$feAzx(?}p|G~LCSJQ^3hk<*+|XXGc2)@;1IH!g(kW@AN)!^U z!dO~x7{E0oXF72*MN-D%)J&~TG)`Ft#3LCAdPW9}?Ta4!?5vQ<3ZW`Q1tC+X-Af%f zn>=zsdh0T4p;)C-9I<5wj=Jbhh)NuvJJnt~)~e7HEPl#(uM|^R9TSmCOqi-cP9HE} zu$9wgB?+1sQF2)x_6TaT89747Q#_7Hd}xLW|{W_!Lr()usu9=U!kK zv!K_Y7~n+Xe0ounRr}#0nAXGb1)oS^Ch$@~e!8NaXbt4rbLg^n1^q~ZU}vxfdllF` zIo4glUNCRDSZiKCj`@eJ{fbjm3Q~h@CkVm{DoAXJL1$8e*NSMplG3Gj?G7=#yD@%< zc%4|e=iUY0Jk!tNAZSS~)GH}TWpU}mP0A;*|Ma~6G%(~7 zDgz~xOj)V;0rmi#rcwj(i33n8$i>9IO+PCI(_S)jO2u=>np<{J<_48nw?(RA+@i$O ze3S1g;Q!X-;NHdoP*3)Etj<>*ufU<{d@7xX&|?H+zlA{!zw$ZQkOyOu*w^sx0I8&5of4?3=c^7fSEu#az zrdzA6)y#+z6w62qJeSE Rp>$)J3!{!1Deli^g%F%H;f+JJJF)1j&YU0~687rr2 zj{c#4f23_tOYQsXk4kSXjEx0pytVH7xnVM^5jMQbr}y(H984#klG*vNj|UV&qJ+bW z{Go0t;W&xf1DFV<1_z;&q39azdb{3;V{0~DScV80ggnq%tSDymWIEj>g)c83I4b5{ z^c4nn_^R<$j93pn3>-I^LEC;~@LO3&O9&*ZMiS#!5~V5{vP>uXDkcFXYv6h#))ZuYF0do~j1B_4}#6{4=@dgWBx@Rsg<{D>7(Zf!pnKUMZ zT_Epdy^lv~Yctz7wywoavZ+%YzW*X8x_CBz%zqm@h3B6C_Tz(JVp=I4NN)X}V60~? zfB1@LgXFwd>Zy1|sDZ52Flolt6Px^lPFm?#e#!k=+Oh^#Zh0SiP--Vp67iGxH= zqT8MttYRe{`%q!Mw$2i=%T{a2(?rIZfYVArm02Tk&~nRHw=vX_H0JTb$I#nJJT;)P zn#&FZJn^cTynrc2DF(nx7w2})YRz7!B3-lC_9f@NY2pFBX>MF;+&KFvAv;?Q0314C zE$km{@8lllU@Jw(B*X=g%5^$GtisZ-)x^uAER|2JxDDEc%>(%kexufqul$^@UcvR-VJYU2`gp82Slm5>Lv zXgtBebWpZ(P(jG!BuqMvmE6(RIPxJIZbO?aqP0*ISqY{dV^HZ*A;Vm5p$Mn8h2Y;( z=LQyB;|ld%bsjZwZe=KwG{L#_pn<0#k>kINI#Uav4L!66EM5(2Dv+Sg=7y^J0Y5g&Ef6nAeU2v$)?*V&%m;6jTGE=-caM zal)P4#bV~fih!u3_Dq=HoR3jI#QpV+2M-@T{>RtfxaVCcA^BT;r!af!egU<@@lW%s zPPGBaHU*h9?d)uB6?b+%6_iE^cYu@5v)%2}SI4@(vO=PTRV9&@4==j1jyR7HXRr%f z?qmyis!^0tJB*C6k>U8?9gajT%B(hK!Jq;x!dgAFm8yjGvqSs;)+UQ3;~~nk86|8a zN;576)ySJ{`1JVIVRQR*H{p+)cltGi58KrvNf!AMnR;3HvDyZ3Fjot4uVKQoyt_fD;;r(wOtE!OY;li`U z5K7afIk}aPxH=Dib*#H@NNW#P_7E!L2GdX@d!`wa*_yn1M&mq^dewv7(-%i+0mGQx za=OtqnsI}FBkxzdpo`ZwtER-!$D0yA(C9b@Yz$}B-qLUkz@}AiY(R3XT#2fO;_?9v_>% zu18nKIz(%TAU^{!8n_dT9VBnvBw7%VAZ+WbF{{JN5(0UaaOli8Z1tj0k0_n06DEyN zDdu9TK+560usamQ^t#xJ(1A`rCX1bHBc9^)z<9?Ej&8I|B~|MtAm3e#!7`(uPf@GlN6#Bc zD*|@{%$kfIqnn@`Z=h&<1P_yh>dVxg`awqOEss2Zt>!=Y`f<6wMlC|a5MVW%0v}es z|2Xn$?s!Dop@v(CjHt7bl)45770+*NE9d zS^xSPns5!gR5Rga<@@}FlW5C~$f1j~z}zT_%K)gQjD)mmIuWx8$gaWEj3a{|%H2fo zB~qY>JVYoA`{VBh|PILl8}1pkfvJzBegFO0{+#!t`WQ>!Coa`+)`!?G8NR z%hQp{yWkj>pFuA{Ek4THeAFS^Dh*!-=zwOGN#_Zt{>t|~kC@TOy+|T7-juAe6Ju=c z0(lAJU4Sv1G>C=V4eD!&Xx&ox9)rRyG(GfMiDSquKCd|BSbZZIb!?$l&k6Un=%_{Z zE-gPk!lbR)k1E32v3bqb1O~Ut;Vs5SY)76lcI3>+Pp!o(k5!BR!D_ce&3IBNqu5dT zzARe%2OxJ;zPFpfyG-T#Ru!_XiI>~8$ zeiwfrhnll3P*{nM+EB5IeD8m++=eNGBr8S5*%u2TL$N{%cHECjX7~;}c!!Zjh2Ag& zZy2wQ=oxFq<7Au+*}ID~h`YqnU%XU_E{eUGf_(k#9q;x-ujl){_?wzoJS7(4-Sg&` zMNo71z`F{g$9H=GiUD#KJN+a#fCU$LFo@#APYSDY@mY}#zWCW-iFZ67(qniBlVbkN z(-S2Zb!_pD*3egrXEDLBmdJG%C?m@im&7B=LEy0=Zhi-qgE&a!6hFy3Yx!XAo|-LX zN+FZDf6yJzZI97qGFRmNI`x7{CA)mqiYTT~x|{9-L1}h(iHZ?LP-7*1ZsnY1DreNj znJeztN+4Bl6Lo2+AsKaVk;#y(6b{P5OGksKE}DS~Lz57rKQ0F0`Bni{i=80Ebw>|^ zP#gR>MY51_=oT86WXz^BuFKPkD5@V!9f4*2%W;igUNm zpLUzQ9dEb)?Be<53xDt5|9to3V1IZJ9EL}um%sks_&7S5oK9c8|LN-W^_!cY|MM>+ zR)P~X+U0t^U1>z^Myu6c2f12*UOZ`BNSjRa`ks0hK_3!xy_mHE3Yo)I%pXeQjw;&| z>hFISnKYGoWy04YE3M^md%$j5`l?8288WU`NL^>Kg|s)Q-F&O0gr_q3b!57XZJEwq z&a5JECRk-iV*}DXjzWal@ZEvDC%AQiiP>ot_$;d=wy!m2{}M&(E5P(^pXse|c(9PS zf-9b$?9}k);^3sF?9B!e0U6OeGW`|~4;JuSNEu1YElHGvVI{U3!&}|M1JmjjZ4M6) zOgsG97LBovQ4-sN?1q74Fzif1?(eOXb4xHR%yvo9IJq-eW2zXsS~ebtVCX0bk#1op zoyl+nDabz9POB}27qvFdv^S1{#&GY2)0_2xe@wgQ0)OcebF7mWu}_9H)S%dqShrEW zw=9_XO~P=QAExb!L5!pnj8?!dPcXh;BWZqP~ry$>TJ6SVm7)qYj*r4EpvpaE5c5AhP$8;&M7%JG)r zqIGHFsyo#XX9nh)4fAku-K%AEwXQD z(Gs^Z+H29>@T4pWqUgj$BG^*!PSo(H1H0Fz5s3J$Dqqy1o8fslh(ztub9-pAJ9{P~ ziM8g@vuE1lNmAN!@@Xo^{5Zz7opsZGZz46u*7Gv)nW?|oL%EtxeNEz=5 zFygo$;QSaG2KpdBBxNWRDWpN@_Iybpb~m)74C4K!JOLG`u%%4j?Rv2Z7Hq1<(}Ku) zzUAP=fgs%oM7qu5{@&s4;n61f zdP&QdwgV*ozI_5>+{wxI^WDxq2vW~>Dw>F6Bz9o7=+a=?vYN!O=YwZi)E21G;elwk z+m6*1WW(1Je7ry{kw9j4Cs}K=%P{KFoi&0DlV{Y`DhAC9vx|X=&q~SC?lmg?+(CWK z8v0U#$_#C`J*f^(6tB{9pKYMHmT)}*);Q1ggcpw?ooBh8WF-1b*Au3g>w2PJTlR@3 zFSd_&clP(5cAgy{9S}Yb{FsTrleAexxQj8N0O$oTfx!|U?iB4V?D_-}DDAlr0?F^o zSa&LA{RqYzPzph@uuVuuu3 z^O6{5j%mZRg`6l>#pEh9yjW~=qbSqf>IvoR!N~SJDW#Jr#F_+ch|+aOE=_5Q5eZ9N zc3dIeuK5AX1t@hyJM&w0Jy`Qm-Qo9dY8dULJF#wUXY>eJ_dwIJ%@|gP@FXcf?Rl&< zx&vYzIJgXO31_Jll|`FOvZ>-gO4?%YMCeir3)F)=mTh(7tkm=988SnDB9bNM)+q(& zn3q0J`4le}1&NnlD@i>}4p&P6cpUCM+dVlYL2{O9HZtT1GdHM{-^Z>Y;F?Ut4uhz2 zPtoFP*?L_S!wJc!ac5iasei2}Tf<3;rQp_RC1R^ctERD}MbbU4Qhe9pcd@*cek&uQ z(f*#2Q0!t$weL%r`#ccHNIF{tSzH2%MS}y?EY z+|0t*vF42wy$`HGOhe|_Q&`PzV4Ar1cV3oT&-V6r&vNnf3ZxG~HBDb&N}f5dIj|c= zVJp>Pf|p1OfO|5TP+C@##Q%`*LAnmTlYpQGOmYHwPgf6@2R2D+t>77I?B24nKM?#% zP>keusT4JSX<=C8v$Y1r{=)a-1mj#G{08ZduF&u>8i8DAW^DY@El#1(b9brxZ-H}SujQq~jGsD-|pJa&8kb@K!qRN(`LC!+A zfwTu(1sfFwF;U1=9W_Vron;60L(3TWi|y{@4<&2hcf-jN&1f*zvNY6Z-v+YlM^l|D z9z^*WIoSFWxuMpA?zm>&R%^}+buJIDs-iQzBBd7f$)GBzEw#b$DxDhRs7Eq|Q^XGe z2??}AZQl7AAZ5kaiVa72cpIN4c(n47t~7OZP~dU;99%1#q~V3G!Qu~(I>)D{d*#;Y z_H)7po(;yy(<~uwCun7f*g##Ulgb16_^0h-g!v%vZ3Q~i2||M4pZEcLG{ah`Y!zmM z0`VN}b~`%2Ajyrvd+i*&bcrQVd!vDnYW*Or$uuQPXuJ*GG%=bx1z``*(aY1lqeI^G zbxpK#k*JI(6Q92^5-$qrQmQf><8_5Fc_&UO#jhEZVBW|?OSjW0E}JF4NzR!@s?#pW z2?|o`nOTYwI#(37@0i{E(FtifM(o4Bkm=(yk11{@CcEX&`h5TBDR9q|pAViM?Vsd} zm}!?)JLiJDc?sY$dbj=h$Mj26A(8j)%fOgr@C0?8g!`A_`Fk;T&ly?Vy%MZ+Wwk>; z91OxMM(}E?H-tkT4C`t5UW4Sw9V5FqJWwc{lq+6ieE*R|`c=p8n~1Kq-9d-T?2vyb zj9Ni$W^@(r2A&F~pj`M6=Mr5DCn&@qsJrNUS0Wtr$h#4(8ce35gw})7=QWjjlz6(tB%^L#Pa1_>rF>gNlQQLsf4QUD%|yN+>#Y zwrl@#YyUyJA^DZfhuRe?XoqwQvMXv@Ripz#)H9v!hz;AdKV_RRV5|%2JdDiSko)=G z$?0oN;ZoTvtL+Ev`1M^gn)lnmrz}#s8)GX(w1!R_L+A9qv@q&trujcJk!fXUCfqqT z(wG6Kj6_C%u|&0@3<&cREn<(D>f2;N$s(Q|o}9kYNq9>nU(YKKJvSvV+Tkl$-xB8x z6-+)XF9Lmb5nbAv)KaembH4UdtWL_qrAf_$W1a|cWny!zv~rmY5DfjYVJGn%Q2+-r z`a{p1xbYearOR7vERkj}ld!{ywj5kya9F}q3LH`PM14)dEf*W@bvTPSRNi*)-)NPN zJoDTG7MWP_ld&5_(ybY_Lq3}4cXv=Uw zWO5Z!)r$7|6InH+N8vGM5ftJ>+i9=2ovJ9m5B(mR?ce`YO_4xF5|crY0-F-Nn@232 z$;biub828*lty$5g;j`f3zEEkv5`!5Zn}4}8!ICkovJZJ;{_N3V)uIb<0+CuAh_si zicxQx6utT@k4uQer? z=t)!Zz+RER-Cl1DTi?v4@({|D$u`F$ZZu?5)*9+Rb3rWH_AC^ zwTyLy5tUXG9W#3pSUqFL`pfJjwFtgQN6lmzabGRf<7qZxclrzHF<>Fhy=Yb5G8!s$37Qyg2fq z6{dm8QhPYke&)XO2)#8nc;QyKH{z6S{el}pGzDp7f}YdLNnaA!(TU`KtSuRk%$|Om z+KcOw!1f@Lrbf+s_b5}R(}#0J7g0YHgC@cI;N&Mrq6(Ila}#$gVJ3e-wc7WlqkHzD z2F~zsY!oe?_W1V!gHClKj~ccmKc5Kopj{LXK0VQ?8^53tjo^c=INg4_zuWi#%`E#k zTP|T_DzGh)Ru+G>{4+E22@{30Qg8v4uCJ{k;#fDTua!qWoD-q1Dvb}6(X7?k*1A;% zv36qcthG(i_&_m8%23(+)hMX8oz1pWfkyaS(eyl;jLT7gA#pY;2|A}YBO-t^x$%L( zpG4a^g#{k@Rh8ARa(&A@7+HtNgd$8p7lp78@Xh5hpJtX)|vS5o;t`28|P;%lPvLH%2 zfx-NN22)X(5C!g7`fhivriUh|{p+n?4Ayey6jCl~dF#X$%PtY!>_K0?cU&-4I zqqrio#v(KHVxuToo)moP06Ax|&U&qE+#0|%2q<$BHhLw=H!V9}9YT(>q0%B!QD+A? z$TaYIhn`b-)YPq+yv|EoX2n5P3afq}k{>TOMuwJ5B>tFH^ko1u+L0G3H}YnsU}}oHEXwB0h(pXPRD4}yHp`27G$Ch`&w0md zrzE~LS0zv5+IwPn;=A;mEEO_lZpPH*jz$BS(Fl2hny|*bQXgA$y9B&_Vpqg*+(1=j9UQhNw)M}lbiLCT4+RzIC20e0oyQGo5#5cT527t`2<#B}&L2 z1rW~c0q5eglQoLaDB<|=qxjuSWYLKp;=~YfKi{lFx~k(UQR>|9=x2O z7~#8$)T$p7Drw}gBb>CfsNe3|2NIF*FivO+{kv8Ap~Mk&=t4@_I2+L{*)PA;YW;9_ zh8B9Iv|yP>7waF}7-n5hi#gZVhB@vjir02D)_^foW%NplFCB3J*uJ5+i=@hp1OUs+ zD0{eO)yhm0*GwxEQ`MuG)>)Swv+Kda?wpFmi59B~sWa7upK;eWbb~2D_(}=Xo6|>@ zdR&#fus(gMo@>gR4bCb?u0LL;a)$1H>3UjuKd;K{%WqssfQZC^s#arc543E*G_xWJ z&$c*K(vdE;I4wFSWYTa$+=b|&Unxk36bv~aI}}1Fpa>v`Y&a3@k3 ziUiimn{>0b%I9z1Bx798Yg?)IdQdIRO>Wk|BrgU^1t}w>fLnx61}&`T*oIwUd+&{g z^@GtdG#RtaQP9yIvOWSy;wm;8L`X>Fl4!0IjteV`*Zrxgyd{UtZv80E-iNxYya=>I zjUD~1POQ*7Gx`0M){_j%xSe5=fm$q9O{0gg}`5|xrRQheTQ#z+Z7 zlQncVlS_FFN5AX@#ex4$(Rz5lRKHDsa6Ld|^&+}Wd$1vDLk3C5XOnR3)!c^}J!bf~ zt3g+`IP513)%~IjpWu)R8oe$K(k=z8{~TEMoDv$6pTnL9Q1$%-DqIm zRZ*_hdThs1bElKArtEg~6jd|dWW3Lt|CENoD>JQvjR~}a-V5wcQ98?5?lA)tf)TYA z=S&z}N%5wPaD93ThY3$=uCzpju{e0q+4&ic*}Ru8 z$s~gieeQvJ$*%ia@81`rkx}2Be?EWtGFEU(UYFu9$d44%*@CsO3yz_aXRf;!n5=HB z9ZxuNP#or7-Zh9sGDy4zsI4zhF-rol>Xw0m%f%a*w;Uq453Os^!jMJ~QLJB;P`Svd z>jni7^xR&Rqi#r-z^u-dithxsVHn1Pm%2{+gxh0?pTO&?ZF-?Wsr`rw0+@vOD7gcx zp;E@AGe?TyaK+1Q1*?MtLh2ZJ$#Al6^emuraaw0 z5ku&1Y39-IBUTxV=71#OdYU^}!axj1ZAbH5YHOdxCkTHP%|j87HSW*YQF5^Ft& zOIu-1R&qqumHARCZE5r6)Mcb>EvafP=HhwJ1K8?o=X;w3ObP24ZEK=B?93(7X2uhz zdl`Xj; zK3|~KrlLdMsQe9NMEwIKW7rsKaH4D;9qo5^_Kp?i=F#}P?uz2UPY1jDakGgZ&D3-9 zBk->Ys`I)Y)m_JeFp9fnaY1Y4E@Z5gyArQf@2?;%NWrbii=R>Ge$ip3I~jix`r}Yr;!mit#5RQ1v}V6 zZhtkKi}Y6Fq&_!&N~nZ2@ZoCkNyes;6fBPRw;YzXcqiZcm!!*=Hma-LKeCDGop;6D zct6TW7AtByyZ0}1dsol7A@QtPx<_IX3NdYgi6~`4gT0_}#n;~`_(1q|a3X&4qp3Tf zl~E2tL$Hf@FAHuEz~qV|pyTFFcJ#nIzBfyn8Qk8U>KUtaBKwA8m-s#{r&L$c#Y831r(IrF@!+6Q@H zPOaakGbkDbsmS0oxzLPx2-5AB?Tr2%b;jrdCL>BH7hO7J%LcxLQ5~TC@O&IjM>Gez zx0s;IH!I$FZzJ@^?do0|A_1-~_gCJ2`H5*o=h2algMCZ-^q>i1Cv^zvns+V^xY^`3iy_eDqk*V~Nzuly6uMl!`U z=>&-ZKYlXNE+75+R`2a=C)1!Un&z$!PiV?Ns(-WG25$1G+t1)d`}qIlQ5#tG9JwL6 zlidW@boXGKUB3SMo&Dhbj02vvz8377*P>hHV+ckYU2xCMkNIP0K(dq;cdE9SrMUPk z)rE0gkfZcpM2NV(u)zI)Y|10YbgGsT;zs>pef_fzP8J{D@h^NB{YH`>FUwN?Kj7ap z*2E}EtliiFewOHstZy2aL#^1{!}>-Qc%AGFkK;ST(pYGGK371qS>J6LpHu|gxgH=X zCC?ZZ=-e=RxY+r}?EC9muCLFNj|QxVl1pLQ^?P4RKcXQMOrV79&`t(?!tZ>DyxUov z(F+LD;0joY6$z|Tf|HGyy|JAl9e`*_$ z|4*$R(ibjwZwK)wwy$BH8uh{`X%qEN4#mtKsaF(UhW0I`p&oj`GSOFf+JmiRa07Kr zTTE$cw8|JAiTE$0&?-YK=>Op&GdEX8l)WAx1C;OL$EumBkicBEKfNi+A7cb{rxq}V zsGLHTRk*UqkEcCXpQ^>q*nbZn8}*F^DiKTcZ={cADcMmNLurwA*#7$qw%sw{Z5Jyg zqt6Z2p)H11RV0rX&Qpnz7z$N+q*7oksP|Zl6w+;56w%mHes&)&*rqZNPIUk|f#dWc3|LdDOTu zx{I=cK;#TZ438YeVV};Y2#(hi&F1$@9uYE4o9qFdZN2kZLt3U5koK{Xva(s0WtcZ3 zb_*9?sDs2v;oWZ z|I>8kC(7>mnR`C=VMl%n8!@6*dni?vB5~>m2xZ?~zA?YUL^3X4WyF`!MgJfFkYB#J zuf9BzUwC9JnJr;ar3#Ehc?~wRHNMA2w9e^}6bmXr6+4aj(175Uc?E+!;<*G$fH&1& zXx;HG-(3iKT|-*C#qOf7W$*$&>tg2f_7$U|*8^oQ#h-m`FvZhXnn^X$P^zI;;QIag zdR45i*VnVnroO<~{JQMe*rrmJurtp}N?J&PG!wNI*CEvmJYQ44+oIK4ul)l9M5SMS zU2nDS*B&T)Grs56B`2T?_$b)hygKgpA83`nne<3a6|m;>tJ8;b|)Kw?9+e)os3>zc7PIY@_+tdYOcX0$8_Y4z)yC7&rarwQc(2SFzl=7sECndaS8p!APjbG8XB~B0~ z7hYKPV2}2!1*xskmYG7<&al)l+~q>1%MtRE z&2ML?_g^#^(5~)+Ol#>n&$;W=RhTTeCX=R?chm(7l|8>L2G2nQze+kd85wCI3YEN6 z(HF@UWCxkd)OMsY81Jb4-~z!NHwy{ekHt){b@i6Xwb(Ty!uJ~L{1*J5YYtz`=Y-4^ zzdEa&$-BcRD%MCctTiE?>Dx#xfoQxzh9yh6VyEI;s+um9cx$1?ORTrKU0GbP)Iwpk zU;ytAvyJ)P?t~EoCCuk);WI9WG4<@=qPpCLD08K<1B7O^o6$()0fJ0ldfu54OnHGW z)G#IbIEduz2xqOLPh0SHu_d+OrMf1JD`Syhs|lo@+iZYCvU0$iw^6>Fi6FYOg6}3lH|gcU_Tk>M-4p2Q zqoe)obO;sv>U3}a1Y>`1zuG@Nxm`%!*#Uhs0u?V9*f$l4SD7AQx5v|74nVoMzf*~a zA=&#dsyQg2#?)oA1O-Ij=?;65x*0w^fED1M16PW$>;UGQ?*&~9k5kMHnnQ5`O6^i9 zYSh<6qk&)XAb_%)4s=qqODrX;(;ZBEUI!9E0$G(-Np;`CDfM%P*jfC^s(RIBh1JNw-y{GYjaYt!t7YXuirsH5IuEQAh54CvtH4fdPl8yF9aSjSV0 zfBnl-3U*y=ylk%%A9*WkFPo!_!SB_>_Jg025B`-k2J4w)uryg?EY@d?)A};wB-J-0 zK$C4;>cpEnW*`Oi1_OE!)5wSxZra%8YDl|-ES*9o*DrMrU+wRA_72dV4R+j<=JDRk z)1%{$=|{-=ZFNI-DR;cp$tm0Tg~E(KKR&@&b>i%-f%_kQqp2)tDmU8e6f>&vL`J=X z#~lPx?-+^bsr(gZX#BFrbbC**tnEFFwH=qV#7?_Nzqd-Q&e^@p4cB&TWiIZS*F~LqBQUkkTFLHNoA>?ax^=C27yOb zj@m6nvhg$+xsywZsAr2rWJKJ-*s`>F$3byY>Cn}$W0z+1h?$fv{fx$Ezvp?8n@pcp zaCeV7e03$s@{~hur(gkD)%i1wtWh0kY7cMI2!wJNp9hmo z)aiQuIJf^2i8}6i6b_~nZ%%4xGh~?EZOO!uH^Oir;do|ZVEfakvp=W&=n{ykdCh63 zfwqjaGx-4sqyD5b#`M{Av)B7Hco&3Mft_?1_NIgU87^PXnc(4|*HLQ$L;S%+zgj%8 zpdI7p%!k%g=5AiA`WkxC#}j~u!0_H=8w7H4L|vzRO1 zy8~ZGr03u-RWXDkv2g1l*~PCKcP(Z2yn-Hpd@@7DHU}V=9-F>WI7H+Ih!=`v8|?Rq zjxj+HPv;s|X4jukciXgxh7SR6T;ufnKva!XNi16lov4;}U&f--7A5&B0Q zceWP{#9=sr8H|y|-QK@(z9lC)9ylr9_<8uAES_Pmk6mEbCM(z~WGg8$MCz=73mVM; z`<;WAQ@6tDIO2$-UO?9#ynJ0W0}Vq&E09q~=^zhjIBXg&5g<;7^zL*FgvmIBch-FKGBLVZzS+$=JVGOJ^{J$UButmCK}=smB|o zOpSG=`FaHNFU0n`V_10b78NuDQnwiP_+CKVKr4#^c>Z2nKk^EtVMJ}0bS??|eL40< z4jrqBZzsaZC64J}(t*`3yCshL#BEBVv=}{Tj`~a-l@)e?M@0?IW8l)VotMa6X=g#Cls?ASw=| zsk;qAJL5u%+?fJ(k!DFLQ6cNpSkh@y#m~@+&J*MHMyPIdIxgBjN`?gUMC~IM&oFdR zQKQ`YrE=E3S7}G>dvIut8H!w_!~!nhq_S4YF9la)ysnW=++SCA`pjJJBio1{tlzH_ z4}n4MlJu>4=(qTGJtl>}>fb!5->+}9#r!%TzT}I4)E|g?y`Chp0YugprE&mb!Wb{P zzpig&5L311%MyH~o1od-Lj4uvA?OQJIo)$_>1Mm`rx8U!D1fc9@$zM}8t-C!9|&>* zRO?3Kh{zlZpz!C5B8bpt$2edA?(Z9g!rI!Jc+I=%W}+6=7+z~S;(HqW#T#iA>p1r0 z@gJ!$dz+GaNT&8l(wF;dij9WU{yJqoMQ(|^bQKd!LOy~pR#Mh|bj-YQ7r6~?*T=Zz+^nCWI68~cZKSe2M+`5Q@l@yx=3h)XYO6w8s26mAa31=U&E_A9<(5`D zmdJ-lc6Y3wlcIBc-`!!G8FE3Vn?c&3E@fYbh(#d+x;jt+?BKaU`5o={tb-7F1)by@OiB#)4OqeBl1z>-hXQ3X!c zbfVG1nJx=hCxK`5K-wL@_heolWTR*Tynrku1gj|QD(9^JAY`s~N6SAA7?ax2a(Lr{ z>X$?es@ao`lyS;}&ahXmYErJkeZc6;z(PIjCqY6uZbdu$`x+$ibEf$11bC=+E&uXx zu}PSbZT2-)vbqai9NlDr>il)%o9>Z6>c)2ghG>9W<{#tkR;EDqVeebTn8(0E2u##X z_rj~8L4(jRWVIS(#wz1(rk^rHS|L>hN^5dCY3LuccX9`K`E$eS`Z}y3dQ358P@U~Y znBR|{#D0ZURBn&(9)lr%PVgL)#bVQv4s<$ME$;85-DBrvxs{kHXO%=B13w%kr&CT( zVdZ1@TI1+TKf9Nqs&87>$)tc{=_FNlTENK6-1mRe->sRDoA-~MB%ix$*?^PN0R|AokE zwSRTT6Z(?BHs??AdG&@ht7iPH#96{oE-(ITf+Ul}w$}Hrd7U{pH=N(%aJY)fmT=zE zyjlM>xi`Eu!b#e+j9)0at@oTK7@9U!W+GkN0fDVuu9E?3r@h{|fPVXpHDSqp31+jI z`+sN(oAxZv(#9_(gLs1O2TAx73V;|Ncd2rhm-y$PFfU|lm6tHXf@x;@d3P(-&pMgy z#*hs!-0r(gg58cGrui11tSXeR7nyS?q-QwUy9#9*j?(s}5Hbe97kJ732cbwvc*GApl#-Y^`;#2|Gv9dZPP zp6HL=3sgViZ>9AV;xrWQ`_N|$ed>de-+c#E$B-u+#;5I#M~}si{!=*E`WNU2VYKDk zn_Qvg#Qp0>s!3Sj{p-iio;CUBgtWDq7=djIaS*=8+Du0RjlP7@C2T3eS9u75C!+K5 zyYfbbEwM6=_48yl<#@QD^agXy6jNi-wE7mN8c3iYj<*kYjt*+Y;wSNyczFMt$D$!N zM0-taJlkl4otpDR58(-glJ45!%-|f&&$caAw^0D*LNz3#(QaO|P?GD>M z_Ru6toxo~z)S6lNm+3OasL*r-b`EV2TUMp{huOEu$KM8f%1R^Trk^VEuX zy6Ckp>)Wg=g^eqzKqSjO&mAy>z8>^Jq5;XHlG&zThwq}xF>HLP`9{^?kPRy{LN@&W zu@Dz?b&*zau}$29_?U9q=V2!<-Kojmc_J3;=GuRZUjF#;&)v(ZsrwFPU-Vis+v_JC+~caPT`xgR7z0RZwC2n z)jZGcng@b@gS94&_WF~?Ohr+OFjorCii1tD_C$PovRwWzJ4X0a_IoYrj{VVu-sV>> zZI*%-uQ}rPLPkTkoBgg=Qu z7+;D#%`%>x&jxO1sJb%uER9Ey{QD2Smr++fYT%QLbY=PFnGD4GWme`FT$`W2I)(VG z&QC7AMb_O4Eje>zmQ67)C~tG+mLFqYb8qUdPG@)jS*L?1T@(d&MNQvyt5@I6H1f%r z!B43d$zF19N9xXC%lEwN#yeI#&Di4>yRW|6!iim^6+o0Ev0M^dI}Li7K%G^JjrR#l zhNsVV#74XR^*lqa+nC#;vy8UY+NghBUsKK{hC!+1=E|CuD9o^^J>hn#Fn(m@l{Bp- z8jG6OzV^g)eBqJh>?9P^(Z$&9Q4NWVGMu&TgTKMuXp90Vx$kTTY>zE*U3^N-Hnl_~ zwyPyMSDsRA(^xaMljR-+_?A1HTPHff)4 zMSs#f`h(YdT=hTQs$Zc)rIeZxnKtse)3HB6uVxo!cT|}hdX{w|8W z4gXwG%yX`MD<$OH!NTWBrx=)JJQ1Vm*sD#v>xm_=YD0wCa;w?|ETMJYEqj zj?=*J`wVwe+n?nCl4J3jR8b)chrT?o{fAxcvk-@kxXy>3Pl6cNOtlW>gCHCyO#uAJ z;EQwx9lgi!q7jx>%fQG?m)MD4hm`F@~%}K0wAix-rn} z(uPSPj}nS255|0}+x20aSkJRexPU89 z5@@jQBt;*y_Q;ouTEd(MUi6fzCxJP`TAZG!ad1~){tnqiV}CMVs%Ces1Fhf0Ob)!S z2B9Mm&FZ}Fmhs;xtp8LID&7V3)n*V@MY5qfI|vgFX9w1&|IF++*!qm@#vhe#{FZWr z6ac9#M4sZhs!Eol%W*xdB+JSoy==p%FlyPH!WL>+Zs}B3^nU!Xx~9h9bIY31iAfP3 zMW%-c3iaUZ?4$9$zV?xXsYgFlfw)&$kaJZ`gid)9-5k%x3AQh^1zo|48@$)U>47!jfl7QEuu&k^sF>x zIgtlStw`C$s6ZXuR23ydNMwG(17u#J0~^Cy2t1SZWI6&2irJIa7r3`aJOddmrOju?d z^iYGX$xv?~?&H8i_)r`Yg;&QAlE5kvY7^=aF`kR+DOd4LO$#H7!C`0Y4pG%hC|}T> zjyE2|o71Bv!E5#5r0WQ`2W)l-$0{GTmf9rj!iZ=(%{OnT9~({XPFyS(_wF^&mjbH5 ze7s9Kd){tH%Sx{O6HP?o_2EGK*OWuHvdV?i5S{xMT(%m-dLjSRoPlZbdD^l}km1=` z2ASZ&rOjJ-0Ixt$zls`3QH9h&*x95exUa+PF|S*Y16bIDRR#Mr8M`V@6Qaloc0nhH zY~>0{oEtBBaIdIHeZHAaq8OUT2R_i?RB#D3NcGhMr(oPLmO+0`C~;?K0c=Nr^cHb{ zeIwo@=trF~8i7F}&(j!4Xg-Mii1C=j!}s_l?&~fbLG17ZH+kd@7czaYX6$7?3cjUt$UCvR^tJ4(Td-jL$O&|o1f8ASqPkQtg8$rA}uX&{GeSp2ERLJLg@wW^1_C82)8 zXccl+v%kz&$Qt!KAsa7wkfA_-z@ zR+zVQsRXQzHf+~YV~|Ld9tdOhB}KF4Tuo8v6H*}GCDi=9;Z&PjtnIBELzy5fG&P;te}Hqq^T^4u-cF62)5f7QTj`XR8p#q+fd00|(n$|y-k7NTGsnTv z+s0?DwUx|OwlZgZt=##_VmWpZmM79Yugcl)fZJIU1ja9u*$Ljd#;_qF&s%gR>U=WO z0=V|E-iD4vcphZ^3`VwyF~sF|nFDiOPnqc~>-J?`K;%1F#X`rbyaY4u;$&==(Ui^- zaK;Lgsv4T7O82#FosAkAqD_t-gIvElgKpkwVFph>J`lBWiW4BZFQbk8Ry_D|XYY7M zijtbFsJV3eeQNs<7OX!S#9?pwj0DBXNv$OyJpbZ}IL2xxG!t3Z zoFpT1jH@Xp`iiR7#>=THf(^DSUvVYc?e(uNoVV8GMS+kJpA!;JVhW$ia2k<6^an19 zV3%-SM;Y5ViohJFIKSi%l!0Qsuw|TOpOcr$DG~gGwVz=NGMRlmfU~!7t+o`UV$Ogt zM@$)wWbOq?tC4K4l%lkE&A`D)*V|YhhNL=w5Wj4{<3yU@@ti>s9(u!bv?>8UP!E5n z;W#-x-g}7)<+k{!a5QHwt5tRD@xOJ&Qo9$0o|`?_I`K!%FNs95()tR@)rvHUnuZ@p}_xMDDY9wZ?zsi%EqCat$)+b-3gjYK$L%8 zgtyr--uQMlr+afD&rPUvO=b?{d2SeK8AuxS>+Ifxao@79%yPzGlx~Blzqq>5OqzL% z`9q0qp720CK`g)bzlUTx4nIiItsw=(Ad6WPzO^k0O+8QA{9hi-ZN^ zFO3>0T561-y2*&~-=;zM^02WXomrfTtSzy%VW@Lkv%qjWKg{S1Z0&6)gi%jxZtxYo zJjRnMicak+Jac@;MLQ_r57%V3;Z`Lf{qOP#}4 zh@^ag5iT81>zWZjkV&aq0J6nRK(v5;`!bm5bJXzUd`dLOs zs~#vBnT=9sF+1qNdU^kz|cE zB~jz2X!kK4cfHN5$|d!ya`(}CRo*Q{ZO|_z-k)_I??am_j(_1v*M%ZxAGQ55!WtaH-N z_VMez!_NNR;g7p;Slrz{eRaHhQU=mVIv3OHW&D$$i`r!p)oD?GjBLv<>9 zK5I(z#he@HukhQk0Ky&wkd;rGCV>!^g(onMLYjzY@ z*@4K_dSmwjf$nc^6Pzc8{LSxCd!PI7n5&ng>Gd}$r`;^`h&lfn4q69g7KdYQvD1;^3j_dJUU`s!zndVyk0*%!75zE=B z$nl#$WwWh;HERQ8NE;Fuy zi90f<%a)(yvvQ~A_gtrvq%vu~yHAFuXwFnyxy7PcS#G^#HX&!Jq~qn`NvqR{Sy?Mp`th5gh`ZN zy!>Y4;iCt&`|D!6j#=018~2sZS5+9VpW^E`^#_mE|M94X|30oie@Q8I2T4`H5rwoX zw-7x8Iwmd}!G6xFY1lIu<@X7wo6b3PEwnYx(z^X1eC9-5v<7#%k)2hz)IYG*m5c@Y z=iFFlvW$z>MOV>=sAC)^?(FW5{}e8dCAW7{REw%k_x9g22 zQK}~-8|7UF=T|2?LFB@$QFsgrj)C}o21tY9OPTEW;)kojr+ygb4Y2lDCbta%O~ie( zv-fOw|75q!8;xk;9mzj65j1{%zQP%wNLZ-4< z!XP}eu2}Wxnq!UIT#~os)4XLsm;V_S6wi3cDrN%RqFwD=SP89zTsr8%-0n+;saUk* z>|QgwEZtuV@$2O$$)CP$_AFR1O2a}fMWx_27dzSL({stpS3>#$Y&rgJaf;-e%BLEy}U~ep|SpJnZ#q+9dLGW7gkBV~~Z-`sI83HjUGa@%GVY!YI>B z;?Yh)Ef_-MsIW(M$<@V+Y^Xu&oNAdc~ zPnS8k_8Z5eN{5fMa{muaVbdb^S%&GYK|DeCgCzW^gAONY zum0KPE@MEO+*;TA%y|5^`~EtOR9yb zeSh91y5#L|?u7X-S>!Ytf0m`bn7SFS<9xgdew!gzyhS*94kFPP&R3E6Dr&a_Cw_U`p{Y^tLH$apERPGxYj)Jjsz$X-KVg6YrU*2yr;2BlnJ zxY~cv=s@fHW-)AzJBW;9nbmFEvq5omS4%Mv@%OE*#THs_S&`$_I>-_1HK&zsb;L9AB)`PjMXIl{H6QW<=sq{l3GNHFC7`)O9H(b2bCH zjplh#{oo%yxI)ZqdOQrb=!V2FT1HRSLR?6J_*tWKTm9{yVSHvae(CXllVvI{3oFbF?PG{dDYwV>F7D zCP8cf6>0l*(-gG?T+f)~rMeKX!64Lo7utppiW&fwX169n0ba&le>zZcLeNl(g3D3i zWCC@fA^0O70U1uXfnuZnSd@qE%{d0wepFxoKEwFL+~<}A9+iw7LkggmW_Oap9+fGi zai2_;eFHGNIG~hM3~%E$`MfB`x41q}1U%M|e%`NB#5>c#$xxqOI5r@`U*T+oAy#pI zIGBaZR~6@8*OhU^CYNLM-t_|tOC~*D>l7i1Jm=YDj=k&sz-L&|I;>|OgOIcQhn91T z`Nuz3JM8l8FYk!7MC4}%QMs*q&0Sxh{9(?e(M|OJVFuhD&mxjdqQGCo7vT2S+>6-| zi&bPn)eCUEu ztRBe9KxYRC*cQ1r5qUN-y7mpRvIrj|*SY~dX1;zKNrh@mO(u` z&h+nO(lM)=i{EU=;d?V0xOVU|Z9~yx8;Zc|E@4%4%h|GoxrI5>#y}TVbVf5p(wHN| z3M|3F?T(pV5mq7ocyu)Kf>(!oZ}fv#fq(rPM4x|9+$oUKTCMf_XJ>1S@N|8JuPAXh zd{Ezb59c>bxbZL>U@=b(KvGH-x2GA`nrW>?)*M-APUSD9yLCLkJ-+(Iv!W`1zM?YvvMpWKMAT{n7i!2CgSZoqz3#=Jw&?(J6UoNX-^rSzLKy z=wDo7H1EjAAk|9l)RCSvB^`wUp^q4^g~33{vx0NE!Ho_QK)A~k2LPI7MMY#JOmxPG zHRBk)+wWe=2;(FIFjjC7>ZrCbtaTTydvhlc@H5oiq zU0kZ-$<+jo;P91%ZN!$+0gC9jg#d9b!cV#HZ)%s&3tn6$crN=k!%P2m947yIf%9=V zl;4LpEqRA>TwOrK&eq?4ZWzb~49yZd@?U)SFTT4N-iL#?5TL!nQKcMt0uhV+Mr044XK0&dBrPQisC1x$%dzW^Fz z_~)!r*luyOtMtG9qVxy0K9Nyl&JhYoUoK zfgs`tI7?-g2np#3G`ZbSoYm#=O%7gbnp0P-fA{xCd=rycHfM8WE4#wQWtx{EwaCpM z9owZALp&fE- z#H|d69c0F2@mU4tqCH!(Rg-{65px&P*P_YIz|-w$+OeEcJ;W~V5*|#tkSxNv=jMz8LXA_TY!*4VsVmO?0B3q{ zI#ww3@X1mp;mZtBVaf0`aN5PWpa>Y@&f#FQNDZ|vEN@)t~qasu}s-{j=_;n8tNFi{1WD
0y3JG&J$8 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

CyPQ1&mL z9Pz1Bj9?lu))|P4IO4PUgzz`+v~eW`z71L-9o9kLa#gL;zaMc|MNTfQjpV`8{x&9e zxn&{K=e7i#)KHWPEhPoLP~9+PJyQG^+l*;@Hy8L-KglngxPLR9$=iHQLHbu8RRDxiLKPE|D7YVdh zh4@%z3Wv#+xHBV|HVuIW+-5Lx0#s0HyW4sjBpPMck6Ugv9d{af1h55@FrM0>VAgH2 z2EA!}eYgcN?Jee25q4ZOnw!Q*D?zI&2$#95aEQ0*PAVZX_eAZ!irM2i{@VBD?AcOb zqbuT46Wsz8O))fpB_zGObs_IYXyV zYjyJCP&o9m+7eu0kaNqbui<9~qP9aJ$*PabRVF#2U!lI}c0&3HqZjfG4Z*3*3mE}| z!if3X%5ih*I8U-J#+I2?!6cP&mpUWQQy?+csk0R(?O|`Z4VLp`j!dC}dZW?ocHttn zx+mRpIZ%{$PI2;d3nV+HuDxZ&ybA=26&0;00?}nqbqZgVVNKI2{G$kLMPS0SRIwX%0{K4paqGsOB|gYHiW<@k<#;9#&VV>LrXR|1+0ZJ z)*7MA_)$jt zfr6-@#!vc)7^UT3w*|jiS!036oM0wkE{5hPLS%=5Yel<+r9gH1$Py5bWRPv>O4&qK zO>VeWF&vyX*Bpt)=!$1*yfo@ZCsfnW4Q{7}uLWK4?WIg&2uo$`put=Mr!kaspoz$4 zfO=Pdp;0tzMB#@-<(*dr!07`QIyI=R5$1d?s1fSNoL`CO!9l$i&vx4(=5$PGX*0O( z4x?y7zcn~O_asIw6ccOvSqnpx*HsA{rK_b0yN`%PxC7m}qbz)AqN|HhKUx0xy*lMZ)@x}NN zE`=OBy9%&uDJhBxd*uSK;TH>*Qt+7(%Npxi)h5^v$qV}nvt*M5DYj+%HBoH7Mua%@ zS4S~wHpM%baEIcV-AyFrQMTUd-{->^P}3d|q$7r?NRCyFMC^)aQe#6doZ?}^Mnz5# zqz_j9!*WtGpQf~-CT^B3ay%G>VvR>KX-Q1@vnP+X@F!T$E`sGE4M&Jax$~$BR|vfv z?=~1$xrj=M(Wf;T&eQ4xfyKdkI$`s`ZK z`FNL*bJ~!U(wMJ~bYdWL3pQ}~7>DAU3}sSxYAKt&>P9mTzQU|^boXCnpU~|;0{U-1 zwk|%iv3&Q9t;#V?^HoYCqsY$S4RLf;MPO9aI;#kv8AhlQvn$oDEcHJJ-@Uw332*Q< zf)SaT1E5$1qAPNfg`5O%@kQN4lM=Exl5QNi1OgJn3B(Umc48JK6^$RW<=z(xdpO-x6 z>ZLMqDn>UP=?+4AF-{Ln!MXa{azoO{G0BPBh0Z0#Dar0+l2jf1GT)6IbV$jZXgmWV zxvK7Lyuh_J1V=9g_>|D=8!8P551*wRG8Qn@8tL&UzX9RD^wqSEQ*0MCe^}-df<)W; z{e^BP1sc^m*i_um-eflA)IJ-zI;aRLR{+&^sd@kcxTc3{M+E_{n?#BaH%x6tCCcXD z2m@tVpKXcC05B}Y3kSfVn3}1zHZY6fnR?sPx=*Ih7rHkYLXEkP)|@(Vsa3Qb1^3DD z_riSgNSpj%dpzDK3_%qQolN$C&2k5QYz3E?!&8;&Q++ODY}d6!k#slws ziIvID!pW5MaT7t`Eh>vqIG>sVln^mjqjw9+A_!sSYMH@1jMYaV5}R7QuyCpMTz2;( zz!N0*Uoyn5V>KV9F z?=cV$Gehd?4yg|`@-s>Do(x0@$4|ZyAHkgVanl1pxZueUqamaI`&283v{uN{(tAK_ zwPX==4_H>>nJN{i>p;zoS9OUn)^(8MO)?#%RKJX?PbhUCVx3L&*5Ld}2taZwiQAIe z8vWG`EwvX+NN+wFtTYog=YpGHxDU(sVc7ciBluxd0O2*EaulapCRAkBPLy8&+ezu=* z5$z=#YonyM{prz1f%i3cKVX@%DUmyuoul}AEiv;4kW+Cjrdk}vTs5SpVkH@R2D2(( z$3|OGymhc!1SQly6S162g}hZ0F?CkdAMc)-EN*+X)P-M zv*uW@=d(d_ zGd3{T*F#x`QkC92nNRyVqiU2jwEG5CGbmL@&7m6INr;X5Uj)fn+) zpc^O2CaRWl5WGpI?^9KT+15GDRWUzV0!|o@HN@=dlsad#I09=ulp3_s#nyF36YmzV z1+fxcUSgR2hp58M*;gXAlK5caM-F}|0Hbn1s~msVxOv5u{%J(VqiNFKoZmg5Xjr6EWJq@DFh%|fbQ&!V%clpJ) zPVR!GH>*P2P%#{n@@GhXCcZSY*2nT4RK>7`&_2%Qbg1F3Y43bBI| zx5cI_bfsn!U;Zn`xT+N2o+Z~HiMBE)Es3N>uN|^fLJsTvQMK<>p~RQh;#^Z|b}eI< zLOEl!L~@l4LQ)+J$}*|p_?!z8@EmG&wnhnZa>8h1=;3DYy>}r+dd16QgG^FtMyI12 zkK$oC9o|_m+@-aE*bpKNgsCl!>C62dbl5@0$9=O9CCta6wt1*G3e^bh2-bnNf{d=p zewi-DkARSBG|(GF5q@-6QWfC4VP}>{iQ4#MoEH?2SbkY3TPmGFw7WG)m#oV$c(usz(_LKpFgQ()GY*XQZZ_uUIdQgOQ^T)R#=g)w+_L29I}Thcn_0ZN;Y1KRgn^SSSM#B zk(hLlY)(YnZAwneigt9u?Cc*iG)G!jeiOA;&Fc-ivOpoT9u5fq8ri%FuKJQg>^7yEg0yDG4AntZAy@d& zNpiq1IlqD4vcgD2m(R|vpxCCfTVdnU0`Q#AGe?%4t4}`TKEBp_%2sTzDGO`5wTKG@ zA1$|JXJX)3J)ObSC&1Rj^%obvth?D|;#oImYW4vp7j^W>WOpg$R%7|^t1FFgPsj1? zX7Gl~wbPMkcOUH3w8G^~O1~h)K^pulps}lDu2VT02<5Mv#EKeMbbIZS*UirEwp%TL zHlB#Wh99Am+UAZN=2)AY4G@t`&&w?hF7wzmFpF9!zvSMl?mMN}mBuQbXa(-5Twi0P ziex#g&wRpnUi_L#tD|(D$1OH2=TDm$MGG40!&Tl)O>JQ-oU1g-X)qdsDRA2hRT%bd zQ`p13X)0uZ3gHQ2bC3|L$93{RO%qL8k=cB#Kd;gvC?5ij2{mH0bq)j>_%UCG##0@c zge6Ls)T;_A*ugNRijia<63+q?pO(@MDCa8Tek7&#luWTUbfUee#V5B$oQh5qdhzw* zwPinHCI8j3_*5U_Xq@Vh_Hk0ce5i!7x^kFiujLaG!=4`!tjwH>rq#ZBaPjq0CxeED zCA~z@RG-zXl46cC#8K;j&U~1fs?u@nfmSlXM9%WK`CLm>zUe6HK#&T)ga?B&!#cyU zKEWKZitcsOrXRMtr`@Jbz_A%zE2f+_>HFNM#H6N1mfCK3 zq;0Z;D0~ZK{77l??$u)4f6g;8mBv?;5fw>dG@ad9jBTuZ)f6NOL+hI4$7(tqjk5lZ(=NA2v^3xA&eapq>jpxL5}Jm!bX8t3gr) z&D=~ytda>b_2f14s#5Xm;3f5$kk}4()h9g`_4j=?SQi3g+~eKTv*8FenTQeV(wK$W z+x&JDcOVcACVg9WZSQ5HeYD?t)jMdnzo~aydrjcS+ye=?;o_W&AsU0`fWrhO$1jJH zq*aOv`c)c2~975?o*;$p-0HZrC65-(RV0dJwEz^l3J^t)`@f%zYer^e0g!C>%zn@2THO|as=P)<#`TFqN;>R& z1@4rUJFzRq2x8@Wuwf=`5vDkq&fN?V;{xP^x;>53T;^v$j}~_ z%}URpY*kL~I9zvP=ILOVmadtq5BslP9q$DtWBHfw2SfgmlLcPfQ@SeINxDWWOR4qh zLP!c4+4*LA7-X9vxi*+XoSIJJ-0`*4+#l`mV6#V;( znJmCZ43`g!K_PQekB}rJ=56XB<%>{=#&N||URJCM!DAIORM0lN%w!IdO$o?Z<&8ud z0+~9xli`5#jbkY>_bygIu!0;=e3j0P zaEOdRI&nZz!)CrF0YtLG1Q_rukk6}0k!%w=0WE^Q$7$&R^K?gUc``-~5ZWZo1Ry!c zaXv0dD#5MovbSt%)E|`a&sl6EM}*QD=JD#5$X-0|d1=b#2nIn!?SW#lR5=cI8=^ln z7&MIGXz`rLr^G%80Ur@Z+|*nCCyZ8$rgx1pQQTY*_0W1IxhoRC`|(V4Vjrd|diN%X zk7SqKVvxb4N{i+YI+)%=8^x4xkd5S(;bQO*Bu~Vq+}Yq=yiVfSU0O|Ke=>szsm0^e z$(4WjdN_D{0R;mN_81@Nobia&V2V@MKn}ZSJ@M298;QO`_O4m0i$wdS))yyaz39nR zb-k7Ipw@=OvIJeRshtTX*Ej>d4|+z>T(u&DLs^a-f*+^C)Kb#h;1J$=eRkfdBQtAv zA2zkR9hsyr@5TPMWs4DO9D5zPJ>A7pvtWSS!TKt@#|5=7%LWV6+M4KMzY6Zla7E$Z zjUh=brwg>K5#9}Iu{)KKG#{}>^T+}yU7On)ctwzMAgNW*`v`}TODu^RS34HY1}(h| z&ulCN%!{@L^Fzfuh29}jGFwvWn|5NV&uZ6dc@t#}kmwv2{YKW#H6 z^1`+{8)(a@dKGsa9ZI6iD9n-(SACQqFn|P&mX7HglR$mPxF8?8oG#Gj*^ksEzHBjn zfTd2PY&8CaH;SK>7~ItAAJ|hsV^FZ|WlItmu5-GY681;5-30Rhwz`=5V#TQ?U=f=I z5OsTuD7yV!#O%)wj=q0282*6pIOp!M`FGt9eDlctOs$Q;i&7VyD{stMf`Uhbp)gwg zNPv)X9ny7y!XHi-oK$E&+}1F-I0^%9bGncukAQAlGHZ;o*<#)pdku)iSn82V%axRZ zF20dPqq0=q3cy2)b4OH%?7FNatqv5#@saudyKf(-i@wjf*ezY?SP0By)EoT6)w7BCaW+aZQnDh=` zzZxDap*-{ZA5VCPpiQk!cS>_rIzW@;`FDycpe6Gp6VAiFSi2bdPC+9gD!?cP7LJg> z$v4gx#B^L}N57an^8yN?kzh-j&I1m9D9~#%(%?QTd_gt{2y|?2!_23NSu8q2#q>j2 zS5qlrFM_Yzp!r>;eom7xAb2H^kJ9Ze5Tghp0hI`z^xu3e#jRxNrA<&A*s|i(tvqoo z2&d1)rysbp!RbN&)xm!bIyk-l{7>NXUK>e7+WB^fGDBXkL17X%S(!xS}vdC6gq&aSv|{|B62Pk#Tzv+K{-XWW(KVo6?;_)~CX zv!6GIt^1mu({;iE%D&8|2=q$oWF1}Rl*fJ z*~zyLL@fBSGq0x<#bkpe(=3~xaKaBP1rxQ~}rveGgQvITGe8}7+4wv&!Wx1P4Sv2 z9lB`7=uRo2<`(N>Y_BwKJ3^D^uC4(9K?B9Smssu}H(DH;aTt|SZXVaeR~E+g!~2Uf zF{|rquI0Prj!?U8@|uueS5k^Txr$6YjUc;NK_)E9Ve~$$Qp{T2spo>r*KOZ1N|Ugr z&Ahy7b{ucRxUyvr2@q#sx;6=%?Epd2 zsR9|P@u~Ec{lUw=Q#}lgeft>B25l`CRcU!c6JwAaF@so1)@OUC{o&pZX%0xgg(RKe zee{@dtTA}>N!vtt>b2Vq#y%vak0U7JZc3trRBnL8d^y})fzKygL0eq)%@ zX7kGyax+Pq^SG@3sV3Vz@_0JUFGjw-wGjsv-5EK5GY@wTn%Fdsd$5&AY}=Q+PjC>= zzWnm(vn?m>E~u0wlz^;r133-zfQE1?w_uT}1-!ry-oC_{r;NQ~UNc62jV{)Dt*NcM z_+kI_>^~(y7jG;{y6!oGfk0}Fg}KWyeu6dxmsp6|Eno<1EpZ;?-m_T%=<0S`Nro$4 zbn!lR7AT9QSfUZ)R7571gj1mf62PnFt0+7?qLu4;L{yYreKe;}*&{gCYsE>XC}?c;x|5X$}FZc=7QzU%;-aYA^G|9RTV*qFIx3gI&mY@DjELys`-aK;kc4f8+Oo zeC>v1X5jCf&|~AL?V-c*-J{?by9wd|orqSV8cG75oACDT<0oIpzUy<-;s({#UbaKE z>a^ad9zZ)TdW8;KaSvf#7?lJaN)ihnLY{7TdGc~euvkSJaB7ZVk#X_`M8Fw_;74aB zyD>NIPRB zph#KJC*PVdF%)V0)A*W7Uv@DOl z+Y&Ak9s;NrP|w9Ey5Jb)rbC^txM_|ZmID(>Ds+?!0*Eh01cu6~G+OGO z^YOsqBnq#+VK*UA9@uOKYT`V5^6=sAlb!4oQ8(~}dDtou5V{%ys(0^ysR4}c!&fU@ zj>Ey*4rinLWep=LJhrwC6)_D2HZsnA^oX`pKE(3r4l6Cko#ZY*u4gx1o9I8;Y}`fk8vEJt=;zpu17iPNdohJ} zu4OKkhR_PkZ=wyDq*%hdfMr20QCDsX7*bG6)57Bu}Yc^LH9 z)u+Md5eCNr6n7(e1^KzMo15R?ov#^Q?zV`QxM!_h!#B?2b~CQ# zDxz_c2|Kh^yu()9bH3gc(r=f(Mz_Oe#{ywv90dTC4te@m?a+^o(kX_9aN8-Hl!Y*p zoB*XJllFKXA6^qZrJa#=GoY&}W_LP$VL{*t;#r5OEwu--Q$i9kR*s=dj3yhI4cXY7770S$-Zi2Xch<6{^*^t5Z+*%F zcidcStgj{#&dS09W=Pek&c!523z-Eswu0(j9e>}!zrJ5(0e6qs)Ok52nxXEaQqaRi zXd)boI<9Vr{cI+*Wz%qi6+Vv^6s39zcIWGoP{^DblFzwHCHTTNADX!Jo(J%MxJAiC z2zY4QhKF~&g1MvwRnG&B8c+`1X*XRC^%b;L=BPI}a1CO`x=`;+b*8#&t6`hQOxdSW zNm>mO=p5C#vCYUZZX15x-VVk|p|EXHje_v)z}z|ygAf(Z0wzqRKEGqW3IUYCkgrX& zv7qMCI8(&}sM+AsspRt&+vAw zK}&_SXjI8Tp%bDl>js0`e4*a!-qQWly$|rRC{mx3UPw^Ib4v;tG-G23Wi4Ny4QMGF zEb}C4tw%MEPt@M=kAu^Lqwg;cj`krzaj$=rJYk9F^u)CfT;l1D188uJ+Olj{ut)$e zK*zxZjL03bAQVgl03e1rDzDfb3P=DMf!{SwDNt+m-xrV$4MUwcoul@bt?FeA>itAp=zT!cVEKKMT-`K$D;ae+s_6zw99&>CrG0z7+8g}{KowSl*Wi;EfF)ZeY(VNY z`H;&gUZ;p%0axA#OJ`i&hahSc7B$Jo_NLL(%S)-=er1-~3A$j!>F=jtjzqf!P&w~7 zS$RAHhr;FJ=H@=c4S{HEw-k_QB|aAjz+!C=i?8F^nHJzt*ZNH@#MHDt=Z;6GLPF)x zyR9TWwADYeT7O!dam@V%*UF}l72F}fszo&fs2bgVca!D;cc_v zjbOr8b)~#6WdNaNBR62AZFp%!WPnh!Py{2RUSPPR3GN_4*2i^7OPo1MLjutgUGFCG zpSi|ZQ5_j+p(xZ}n_ZRl)nY=nQAjcxfz9pOh;ejP1R0p*7+KWwTQ82NfD-=z1A1&S zw>!MxxB7FP>kx7jge!gsCVlU`sNHF5#rd?gn!Xo2y- z5UqbljN7q-QL3zmPD4pTf$%y4V`W<~te-?xNz`7#UdlGH2Byll;0BnMFC5`Jk$vZC zBV+J+Dw*Zympcg=A(~lF;K$~UdYAjx4*Mq;X9xe;$u9K)6)`$~H`at_Uu<6@tOO-3 zYi&QQl(=R5g&J}jSnMbHjBKMATuJWG_|E6Z-gjJK3*Nbach0xGTbp6cb1q#Kwc9OE zw2B_X;qJ1jdK^v;B|yoeH7t?SQM$Oi_aSzcvA*0p8on}HLc7d0qOm^5aM`@*g5?ZA z5Vb*AnAeV_qG8yb7LCl(Y$FESz)K9k0?`1$^1YFFq))$wAcC6$b3B8?{#!f#gv=xc zNyjxL{3}RJ53VR5zQa5u4-DxzOcuwXyu-W+do%&7DcXN?aP;&E23agS0O3z~TYb^Xa|U_EgzW zNyMouz>$>CmJ4hgf4EdMqi2>Zw0*2YmGK;UxtEjXE9D$9QbsJi@?+p|p|DKSG2ro8 z!O?AuNHo%TF8aEht_WvBm0?mX$m~HupUn&`N!lW?BbJvFpp!^DHJLRaDsZl7MnaO4QAD?*!vogJSJ2dBIuNe-4FGKOYN))4*bnCz{Fecl%18Ke6F*tM^uNV-@s z1AK&U5U-O3AoEg1k~-9@#NTwDfH<~;#{u^M!A=lsZ`dYw!;#J~sU`^6@hHmDD|u1q z4wDN~YtkX3=%T5!;o>Q$$T5Vg`l&uKwkyRYmBJgShKr!1+!fs8AbCd|Q4~EKv7%w2} z8jWr|a>~}i@?cm=DA5#o5IExoLyvn(3Mf6#*v;?9h3W+9LV)fFa`v+?{!+d`W`-rJ z$AFVIT5w#GQZU+kA02z{XF%iq(407g>YK9A&{9XNf=;+th**jmtEv{9`H)nTr@o8I zkzJe)UM`iQ!>7DL-XikgIU#aLET7F&WX={{QgA^J&bH~oatuoGMR1RhNp54p9EN)k z15j#*hF%kre=kUsNAN!=2ltUd^^m1Ov<({l0Mru<8E%N~zs$$zc0E4bADm_{esVe# z*s;V$j+M4`ds%J9RP36v@7$13yi@Bg^DypeCreaq^4RJb$mb)uA4i4j9LdP75HD8F zwzjKkyqHWy3}$A={JeZ$5I*)LUY+-xqPWeG_beNQ=)cU%m#i{v4)|>J31<6P92oft z$_~MdmCbvJfJV*(rlcLzza_Ru^_0BvJ5(F!Q7lx1ec(0*=5A;yI!6ZIu3~mTi4XkS zM9UwZ5x^`}U4)iIgzsq5tqe>(1Zv=*)kV$cdxhDmBfzT5Y(@9GJ7a^>!O`B}?30fB z;oxxp1*kbob!Pie_hAnnTkovD3smXz_`Zt~F9Km5!}LMu-S%P3UZG_XJ}QGWDiq!V z+@Bnq5;c!!6nfBN=YPW_699_?R{*5wUt@f>M(#+z%`!z8mgVBr!6B62(h-45e8J58 zSNO2aAI=HOG;Loo7lD$m1xSn+Y?VuawoY>_nH)N##RKvnw3KR_+&HJ|3d;tx`}j{! z|MbP~S5LkWt1x7_wrcVwz@9RwOa926MJJ+kzF>iBu=Mz<7YsUv`+K@Z50uI-C71Dq z1kAw0?iM^G0{ngX87)X+Dg8ae7LJ0{((ZSCE-3u{3Ew5VGy(4aLjOJLZUHk@^zW;< zh3SiXD1ZY0bcDBLAvNC{{{D>3h&yh{{z90h)XaVyuAL3lU9tY!%ka*Hhh@d{6p|N}Af_cj`y!#{=IbM&w@MCvNk$H>;ioe+0D}%xg`wRkZG`SegF`h^vXn z_E_R?KhjFN_1X)2$SCd8=lXW#A>hj4fLfUcntm7~k&BhIJ0;=ggiC%i;fC#w+)w4n zMY+PJ)Jr_}&OuNVrV0B>)PjPtO7K3P3Us=LpeAP~$x%`HS-oiGSTKZNr1WT>_D&ER z`&k(rVPtC5L?V$x%C;Ksii|Z?d`qJ?(Wb_b0BGl^GbnH~7CtnqtI@(&!ICMFA=ivd z2H;@>mL;BQ)~OG#?x=^-y``-F zsjQw!oDX1(U%Wp1>3nDF=VZ8o5)NB&UjAk9Q#Ug<4=rKGCaK)662pv7QdOeIHk9z?U+kcI#Dy6O!%ri8 z3gdjm3J3K>VT+vbg&v5*T*ZMP2yg|3uQFf&KI83i|y$ zi0b9=?CHhu_%DMar-iR(WZ~n#;ew?bb>2L^m^(de3Q_)8sLW@tF^xnOp5MU;&M|I& zdye8?k=F=Vc>`(_rie+j%Rhx|<2i8VPJ)ILPcA3t@MivJQFJ&=bcg&?DSP_+5caF% z{{F?_?Qn2(c5r;OlCZAx*!SJt(P!zT8>2aQKV@U!+ zb&Luh?eLrw3uhEIcv9q3T~96d0(oOuXqCdc z9$Zn;E*K{6G!+`!7}^LE`=Kw2MnpTJ#I6bo7|cKd{|vHB5T(O6Js$&XhH@!5WXQ+& zSoFJO);?wN)=EvGG`1axSaJdTDKy*FbQ{+kZEom2*knek#W;=n>S&sxrvE?b+|-nyp<5UlW=1Ki-FEFzoaj9h#oVM|@7mwiI3X+<{q^MR`wpgPo(RrFko=!| z+DAOiv3v)KD209$-_bit1a>^jQCki7BBx6#tp9no2@P&JKBh7S_5izZg$X3kn1)or zwMmWokWzLSV8CopWG5frKn3^PNjs6A1Mnan9}VGt{~Iu5B4yw>RPe%F-XO8rJKgXw zgLPF3@%ZNB)_Z#UP1)fl?J`mj)k5G3V!9l+?5oU2AKbb@7&rhZR}^&VD30PH1u_y= z)8Le03%r_}K)}mg~6@))U3XJsq44h8O$&VgE({tV=Qv9||eTr*x!5o`tUqJxqtxmxfSvR#2v!qCo^|5S<#;04JwhCQM#xkQHKdm53vAPL8wGS z@Ccmgn!8>`2>wvliy3G&K^iu~M1NCJ00R~wVa2lp8pR3n<9kjG@0p;DlCsCKNFobL z_@~YAG%f*j8M5M87R2qp$}t7N-g5a3=-%^WTS)y^41_OACEh_76yXk$XE{8*x#h&v zn`u=u;IlS`ksyu4B{%b8rXk`!*OjwoEH1^UXv&(PcHbApOxp`q%B9uUX%@HRt&uXp7#_StcHvl;SuxsuZJ8i{ho(gYRwvkXwYGHU8{fM#4#Kqv{doU5!4w)TcN0wq81Ja)EE9_tgyZJ(szzYC0P1oFxG}FThH*eB?$S9a^dml7O`YVk z^>urBUqJ!LgK1OL^X$|Ky`v=yImj_)Y+e%_O4Vp-JJRT~O@M8g(M;aGIdF}<9%iS< zZw~g)`H?Mh!hv+Zn3jKccNk;eQRt)CAe{RGV`1t}}g7jueRAaxPqA*kL1<00yUs`+wGg(Q6 zc!F-Iu#*T3^imfDzN6 zy28YfQN{!7GXL&#;L*|*wHX?cIRgLgI|a1>ub&`fqAh$euRwDlYXI1ft2;p?hh`+zx?*hnx#E+&gHK`~BECK6*jIR(?ghuR{3 zQkp4R6;6)S<3b#wsjf=wL@-dALbIr3cHY${p5!rNnXx_4v9jrWL52}x!tUt*xOC|# zbFm`pSSHKn_nCaVVBN^?NuR}%8Ti$#uG}LN*mi=05oOl>>!yTZn zo(1=H$d!GHKuIUAUQA)UJK6E{D$F5Z*P*+&M(M+YHjevna9o8Gk+|7VeuoEG3;Rj) z@bxu-40)LPpZjJ(sE&xclALO`kQzjq2j$LJHCEp!UM;K>wm2-PgleoefpTe9Km>r3 zp&+?MBeZ;cn!W5Fyy}_H2j3qZpAPIdr^l~ez3A`#MJt8-pZYJ3-9OL+W+E|}ICwJy z_0)_-bN0%bcNdchVR^Q2`$vh1G=84)<;@MI||UOL~PYX z)D6~t5fM4TRDzh>bLj%uhDQk}q(&Q62XT|0sZ7kz!UkxRF^p(jx#Z58qSn1deo|MTP zv7RD-mof^>b5Q<(ONGN|O^|1_lz8bbpN%S7A!>JGP4^J95!UC3^4O2BVNILtuo@vK z{!%5jEy+YV@x-_$+*Z$DpJX{l{^resMxr0z3pXrAYV>78FBmP+9E{tc(SJ*%WnX@W zd&1}fkK|9PB;wLbIcid9P!%FA+Vte3t6^fMXn>a;5)!ZqD96yboN7!J7?oTWgooEP zVKWAb{nUqCIVv0?Xa&O^X0JASEx%&%GdONMT>9dh|LJdg1XXc1Hz z4AvocdUi>Ea=K;nX=1^lq1K{1-i%%wnvPfSQMt<6`-*`^Ec+U5(X15TZPOc09KrBx zApBAR-{*#T`DvId17#5|s=&8S-jX%_&BBf;P?R{pqSUNBc^VNz@#^wD2A3w`A6!$I z5SG0sa1wF#G> z`@jX5gf~B+ORsxqnK}GPjkGSV$L_c;z20R2)E0pTe!@CwgbI&osa#G)aE0WIG~QKh zhxp>V7U`W^nY%-bW-Dh~N=6yLk(GPbsWdWR2r&S2Y&$M0PzL7JJRb)Gv6*-NdAuzy z^mNtv%_KjM9!WFl@F7^33yF@f&CpTlwB<|V%S7`b%;k3#A#rtLN)z$1=V`7bNJ5&F zsA;|I9nl>LGDLajR#Q|V6J^O#EHz1eE^jp0mRKN>j8lgF^&1)&+hOnPOPM$=5j1lO z+FH)$BZ5*v?B_izlh^{3Ns*5PG-UCk%p-Us8TK$Bkmek>Cbou7DG{9(0H^iy`l4Y% z0HjL9ZJ|>Xy^aI6A0X4A0zk>7mZzcB{o0ya81RS|*XNkK#Hp12Jql9Enfvk?R>MR{#n0r1apSl;6=- zSP|h#vEe?n+v^ni@%UwHY-<)CRZcXx-A_+npA64c#3#R#f33AJEdxd`w2}F~5f>2k z2=c&MkEcPd2X!3C+y6)wOVY`Vc|PE6{AeH2Saq(X9iKFHyVc|o>wL-ML1Zp z!5Cyu`0TLkw`i3RTB)YL(~f$E(`{MzFD<(e_Z8^Z9aKK_zTDJ7lkG8CdI1#@uZW|P zz~?Ry@P~08HOpb!W4yqokaaq*44$yJ)%o*+Mlo=+5sp?dLCG47FzA@10YtJZ=}myV zY@^qqJIpLBK=>Dy%~v$?S?B^>6ufs3DFE?4PULIQwupz{PLcVWfEI8k9`FQAknUw> zwq4`JQ*DM{LPgmT7md8sVwd~7lOvZDUwoN|!rQXykH8(8psnb=y6LlIfnUAMh510NU!V=L?Jv^wII*;E*h_q!Dxt zfENNNm>7J-l3=y;`olD6QpuY8=^QRc3YgO3?(ljLi^8XbSQ*zqcGAn7O7gVI_4uDa z(V&}wg%LESTMwfw&hE3#tt^NKv#l7Iblkuo(94>MO>4g7jUTIBYT~>sE(9?ID3&G% zDDs1Vz>`cbcpN~*nxkIhQh9a(TT*&!jSov0-Wo3XF76gqP_eJ^uG<#UrnPuIe7P;? zOFL^d2{T!v(cNcq@=FNq#4s#G+ooDw%gk*ucAv74J#;_1+h@faZfNul-edeu>&7}Q zZpsF3$bPmb71W1S_5;Ed$>9MU=WKw9+3@yX20y(yKHWcip8eP5qPgEDY$NaT`3HT^ zm`C+LmMVh&UWRur_?^xD-rL@Zk9tP8M(&HetM2$#FMX|qAl2WA+e?z+2?`z%HAQSo z@v=+roueocYfWKWK^TIE=8z7#lhC3#0G9MHRuv^fTGB76X~(nPTfB$VTG(J%gN&g8 zdpMrpP0)Yb$_dt=*m&%3=T^Uh@!*!}0=s?ypN*Ml0O-wnoj0u*7b?1uG!jb01em13 zlMi|_x~Az+ydF4~^v)s>p+z55f=Z>Aa<4+FWfQ@mQ8JI@b6Qjv+^Z1l--x;4Mk(A| z5;4Cu3cK2&Cq?SGvOXKUb(=H7Nio$GF;$r)-WqLcu=21A5MDL+TY&Ee`z^-y#~#Aa zqCC=B3E&Lz7}0?V%n3+vmR>Be@YNN?(geC~Ye;fI@W?c}oW{hv6dmE#h_L1Rt1(

z=5QEg=;8^eylkuOJR>t`_9AQe*ZF1hu) z?rs(w3Xr7p0DQqd`0dd-?SK!tj?b=%9z_@}qKaUM@lhAn7_KtI0HZW6j$!g25q`0HXm+nQc+3wVXKG#>0?;Y*o%fpJVi3~(<~_DR%a8VuA{0rO>W34A&Or0oOC zQF-N-tM1lrz^vs?*-Z(t`jd)HU+A8p6KmVW9nBl%ui0i~*$5@)^DS@oX1++9U{ean zjNIyqyi7$NGJUBmU-$Q>m=jD%SRT=F>ddyU)yy@pgzdKEH|1nCj%b)- z(k6z*GBm2atE3406aq#lXOxmzqqrfmS#tg>xIFo|H==?0JX&i|4Mt6M=18RC1YGlK zbve(G>LvOC0$a0J1(XuLEFxVG#w4cH!}iZIQl4nEdgSlR>pDkOmKE4WxP`Gr1=cOC zjlo`+&7=RdyY=ueE5_n^AsrkW4#eX_-v|DK#p}2;?uMurm7tuPWa~C7dwz1*2O;~T z#_DeN5_}?#!x4D3>m{HGH!OsZXHZ?A#O^w>*z)jT-?c)FgP$gs9E_o?d1Vr|J2u+6 zOCB{uN{z&9*i=dlLmYxrgsUecHcb7+P1zu6S)y*4vT0=w6mwJD@c>{-s*i73(*~@e z^4iHrQpzD3iLdG4v`Mb3*s?#v`+AK1<Ga&VcAYl!h_9YtsT?D zF}>zFH~kH2Lg*9u?i;u29QKWWM_|$5zhATdO<{i9PXC!F`cCC7^zAR6nx9@&mzi() z$yes5J*U^)`=54kjE`VojxqY7dM?BV3anF{L%(_W?YB?F)dGb=kqK=cef#axEj(Ha zWq!d50`K}t&H-p2ypnBR1UQ-CRAJ&*hQOErzYq)s9pkBfMirV6bHz%r&MwI7|Mo9` z-u?RVdG>9#0UNXNb=Nby_>9}G?nj=`Bd|l=4?V?)zIfXG#25I4+s*DrzQjkKeAWHL zGkgN~z5Ag*Q8T+6Uw06M&y=)gU2`XT6E^F27!9Ya0J)Di&bH+m8MPeb#8Z>3-Y_sQ z?zpF)1PFGvYGcGo$WDZsEL%iL=qsn#&Qn`eR{5Md+O2uXCP!%gx^xyehs@ga*i3}F z7_zz+%^T#s6sxl6zI3q20s-wXlf|0}BvdL6i&}y}p)x~*%=TEU(NeOUE~BaBsd=bD zlf_vNe;`^WK$S>%Rm`+aQVeDj1>*=9GxAd2xWrUvH3SGjh7$nixhup6=X6nLAUCR~ zfnrzk?5>8nI}*b3t--h;_8AN9b~Y_aj{$Zib&X;8(L#6c5e`C;)7Hn%;ATWkOlt_u z7MG6ph!M&RLNvkAxNHoXs!SXfj4_@*hYDFN z5X_jMc*7JBgm0m)0Urk%p{NY|%cQxXd$?11@hkm6lbo`L01d2vkDy>I2CsY5hHEg( ztdH@Rv%imf@;D>QUKYx%M*Ido`|#mRxMPpsIAyt=7mDtFd1v?XOR@=ZH-mbl64X|{XXoJT+`(=P@>f1msX9i!zFNGf0AUMdJMQ)e|kkS=j zqFjWmoOttz`+qdGltd{R=)v1`+mMux(@ z0i~Ts*yLlhIKc(0IWG zGmLKu+&lUjHSeUOcmMi#$k+JSzvBPjofEd>yMO)VoFdK`xHEfqxhTi;ZK#06J)MWR zoTx2BX&yjuNZrX39U^i^{`Q0aT33dVP(Wqy!Wv`BFsD_;4;MYUG@gB7imIuG6lMs+ zR)FlNovM^>uCY+<5D`DietrSYf;g52gJi5i1hF-#p;3^$+#_0Qy_i;u8?=kd%~_%7 zXf9=nDYRh|R4Yd9W7BvwQD~*CI%sdhKe3S}C{ME)Yl>vs^`~1><;nU@_1YI8iqNfP zJq#)X-C^zu)@FAtk&r`aqQ;S-l1}Dr_wX|b7`})lJr29)>$;Hh6N2}JDEv&(AE1^W zv>6(7H32ynU%`~Zg~8^`$aD}q0{V(Ux1Gu#f&`wcLGNjX=yU}W|1%}FbFqORtoEOVr!H@H&7 z5u_yD6|!Ikhb9C#LVIs=6`SpMH!-o5a@@)cnN~5fT z3&McL_I7r5LU|y3(OgL6RY}N^}ZiMOE5Vk=HB;VlxI#% zy>};mVsr(mU&jZqkt>T08+`MiPXSDBq<2<#3XYD_ayw!ZLX4Xoz~HWn4bf^fYZy## zAgMzmsx@fMA5bFxLA-=#a2_0$C+Zyv19Y?EYzWyv zLDtfeguLrPx)S^}Cucvr4Yj&>Da0>zgmHnW*pG|p&HT2<0TxGcq$8Y?gX?zx!97kQ ziMtA~-I|n?DpVByI>!(aKT<0wn3yfkU5*6#CebT$jsRWXMxpxkq2AEw9d_8gtWH8X z@+(W#bp8ffG)TjV@wkT>>l4}35nIX^Q^N5SR8PV3^A<%#MtVJ0EO{)b>Wu@r9HkBm{J-JC8H=84UMY{2n*Esvv6FVpVE?3Mg;`M zOB$36J=*<~oU-1+A6Q9`I>E{k^<+$uCS(mFJV|%}lC%{cQNjo~Tm^@pLs&sAH-~Fs z0J0c-Pbo1zzOCkP99|Gw0vjCF6gNiv$6ygCDu8`8Ad3~G@e@Q8wZb)0F!3qXLNDC} zjw2Yrbz)t@H3o$z5XVIVy5pGeP>EQJR+0xtetp|JvIZRu=A*(_ARC~HK>pV@Z+1L#}j)J54%7x#yXBNi@I{RPk4%?pqrr$OB2Be+xL*%K6)E< zT|<2TgiqPX?YGok`_vkaxtyQ$+6N1)0lhYp=_ObXJvxt4Z6`o%?o0$29-aXGZDzM( zYS{|xK{vLAwy*c!7?9do)$*DouOpozC{5fUN<)RmUgGI&V8z)Y91z;8%vP zQ%PUsKNSE7s-i@sCOTGdSXzrAcv?`%S=-CeItF%pR(8u#Vi~b7$}YO27;(OSTP%(j zr!}jxG2wD>pxjvkXw7@P-wjX#ZW50mxl2knZBptYI%|V7BqnzUBdCw*Jiwv|uXOwV z73I`mY26$ITM8$_%k7KsH%Tv(7_BcZUi<_a)vJT=j|Te}hy7Qtj`z-kIwZJUL3vVz zB$|p^aB-OUY6&8BnaU35W3@;7`hsUQ-o578tKZGh9Tm~Mc zCh|~`Do+Y7E>6q1F%QkUbca`fZq2pcP1AHvX+=strmK7?5xks`>{Oc$Ne=ub zYyz-Law4%@t%dp1&MxH`s0wy`W`q-Rvyi}~HbBzrQmUE8Jm8VOf;g;NO8Wxv1$n?P zi}_u_)K9S<>TgLKBVb3b2nPiIS*T>ls!&& zAV^XIAso?54Mn=Ap9qphv+I3~_Fn&JcziNAQXi4v1so4fPtP-_rQQlRl%FsIQbRc4 z=n8++ESgm02-)3R2N;8sCGU;pcx0LouQ+ZBA0-stJ~`dNv`8OhIjWXHn%rNhj)lX0 z&@A=)g7YZFJZ>jxozd!bMRkL<4Gxm0KrhmdP(inh8I>6>q#E=@;WB}jPS!0w`ec&% z!)Wdh<=gf)J#6ty`C=h}uAQ&Q04Rz$ThW1My!`yij)KWcd~yQtcM&4~(w);8&m5Yh z+=4;#fFCpN zEuT)@){U6hf;-g@1z)%Th65xO+m%9-xfR;ECl3k$j%#qGzzS?i!~@#ORsP-D=^VhV z6SMBXmfbaqN&c~%EGFIxADrlL79Lj(n%%~BT?6%d(SZ>_TB_`NNw6d8E^0lG;t^6a z5Yr)It~oY;%OZD<+4_1LNVrS;ZcWe%d7WrErA^-;hQ+wv(78Is%qPCp*sEm;h&Wt= zAx`ppt@RiSV9{DK=xCwok4y@>J*h>KH3S?80RMt}zl`mFWc^#dzL0yhD1zOKRl)8C zcDaQ#fdt?vL?mm0i`yvz!%6d}JUyk#e6vsMgip8kfK6T6IE;|lL_`aBe z-575@!?ZXk7Ss)#Cq(%}<;fYfQBxayzHg+BZ1d#w==&|n0!BHyfY6eRU(hl{_}}K7 zL?e$Y4yj8LbInC@IOvPbQ27|H$9s?ZJLW1_D!oz{65|8oA>mwV4jEq(@V*i7J{lcM zZ}h=kvzL)4Mhkx%a}~yi;=ue>-bA^csDk4_uGLN_r3t*ZPC;sdQdVL9 zCq~=j-61+b92bi4HFFFlGSp8?d{-l&F)5G)JGPRZ__+ipW6Fu3d@_7#E^sk%ted!Tf!-H&BY}<4(9LYgt_%}i ziU#CIfGpvt#{$$zIy;1vNJz=b`U}^1E$A5nxzLdrVv!bde$nDA_-mlFm0<|cff57S zZ>g7Jb;eK62T-s}E=;ZW=ONXP#~A_5B??>x10s0`SjTSN3!GZVqBPvYAM(0HWWD&A ziw{ra3U2@OG?e7{dj#%CeQnwbWIgl1Q;xRj&v8h6M%hrqz)c)7?S@pZvn zgrE=ty!B=gGhB?b04SbtZjO~TO@33zW%Q;6tr6#b$LJ*w@9}FrD^* zp_RUs4$;!X*5XT)L?}($y{YIlvE+oAGxx?K5H0|@Fv3NUC-dM|m-UDdcFg9$F3Q%O z4*L7&a^EaHN6KT3ODmaz9-yWX0`~%0AGjqJm(9GKFWA~?a_C?M+v@b1Qzxdtp5q&N+m=H-%y^j1da(1EZ>XKKf) z&k1dYtk zO$b=wPTfmV#hFO4Dqmm`&+l0jW87<;Avpyu%eh#lV3M40O+YCONdm&$y}?Uk1nGHX zcZZlgG1db%Ha;NT0Vijd7(v!Z$5G`*Tw32xxZi}3ghUAJ9t){4FVn(%&;WG0EdZ$u zBS=zsCy^8*4`(fsZG+``@5#H%?tSGYeq)q21H%Pu7Q{O$z)eHi5t3a@bEJ`?mmBRX zQsFBD;^E|EdeU*731~@C0xy2c7HT+9_&I=BN54G1g$H<&f4rDEQo2C4buRD;g!|?% zXc#`d73i5h0RY{Gia8N5wkhFe$!#;Wkb5D>3Sdqk3J64m(vq)>QyvkQe51da4xlx@^Bg}I%5ds9;gaA5fYgq?C zC(#QI*Jmqqh}?mKD;OpSIOSn{DAy%fpF$v_xP$`Sz8mx+hwzqI4kW*+^VzM^#hVmM z<^dUWLpg>9h*mWSFW#8=$88maSOss*Ov~G18&|i*BxfGui0cPR1&mo2hbl%~pJWaK zcui}K6SV9qi5sgxJS<(9Fu7!fs*kpLYBi-(C9EdEGXpWz2c-BKT|7>|z=qS8)7IE~ zj$e)0Y?kwtq_!eGc}fE&{{i2ZdT_WO34)*q#RMftslI3zm!w5Ts+Z4=eAwfZ!p(;t zVSNnJQV=@7#=p0qDKZ4kUb~BC-yNCe770AwTr1|yK(*u85>Czw2y@v) zf`mPSp7UxTT|1N*Xlg3>(-KIcp(6s5mEXDPUAqGv6d;;_hU{0$8o#}9*zvrJYI-5> zhd?$!Z2v+*Jejd`WLdV$Iks4>q;28~O%?4{cp^`zmHle^?_w?^S(2(QjqrOheh2L> zqqjb7*qZbf%-C9%+q9>Od|;3CyPRDWH7fYwV&ul{!=MLIir#Yj2kI_uLkHGG_ryse zp0#jr)@#mH9Hcp;5j86Hb+Ka*oor*(yUrsTNE-2igmdbdb z2)F>3^%tS_A+k=Xk**DsEQwgwbiqa%f|KXS2#Q<~=0MjREQMUm9eI?PVh98M(hkrF z?j5%o1~7oO$_57&Gd4Hi0^R6k8xX6$f#&#PezmiOzG=FjLCZ&Z4my68=y-`T9d}$h zsixk>d}pcB=GMp8A|r1)6bULB+(rq5F{2qx+JtDM{1g3*A|r>aX_{*_+a5c80{JYi zH}aN857+-g0tvnVN->{XOonP1TpS$j58nDLeCAvS(^2u!!0ilCT=t(kn;Z6Dyc+oC zn1#i!;{ut#?&b!ECuWFGf9vR=IX}cNevi>fF^DYtlAB}lkp@3)bUz*p-q3T;sJS13 z1P$=f`lHi<;oqNrbMZ1+!} zJ31<`m4$!1Uw!UYFhFJ09G{94toY~K+a(XYUN!CJz?7WDe@`B#M@Kj+{)={VY{ib6 z<5Lk&ZuMk`r~RX|{vHOl`{wvm9IHUIZgX5pI2v8YsaQSP{&3je`yp=#`uAX>Yp9j9V-b1z>XMKlb}b({*p_K^k?hphkO;Naw;DfL?l!oUoHj`Ad$S;oG8&N$8AOhpjF|W-lz~>P8 zl202p+hP>YVh(OGlkmsO_E{uH1f8fR#w#6eGXp?25_!gN``#oJT4v^y_8Y1l7m*59 z*vN{;EfM;Tud_SX#`YDJ{*Wxa>+H6=BV-;j4VhrD>OESO7t^l6;22;BaAp~lf5pIp zX+EtOD;~;V++lv$+(g!gX##9$Ks!CA*%3~zft96%Yfa&xYo0ZM$JK15EGQD`DFgi5UTxE#in1SJ`$FbrB@*rXg$QJC*! zxiHnHz^cjKCl@YxY`9n1>BL<`P6XJG@{_1fYrw|`HXnY3d!`T*eqfr<5?M*B`VlHm z^+dN=s;^#@E#MdRAg%-)7WH zPiw`q0~ZSr<5A?QLSk6}M>&f-VM1@N;!hUI7Ql}{*5MGux#aKQIHEAaFpN-A>9|Nn>k=YC zU;I^<_lC`xbz=AjrUn#QH@3Gos1C5X>I|qat=5J6ViUL3ep$75E$Qt%3>aC18q@Kn94QEG zn02<$6%pJP`I(p;MVzxqMn0|8%UwP=B0;5AveUUNU(}d+#99aot?4a3J${qgUibC# zt#uD{jsQhU&%z!Ap)TU;ZG22s?W9~qJ9fwH57@)3yIAuA0O|g9}?Q5hn}P# z0@Cm;eUW~M7EK=dYMD&=gF6!4mX)?nZzZ@6w|`sc@|AeA{04Nmc~@=R9&=+tqo3b9 zfvb6+9m*EO;>(H2%z1061SL3zn&4c?Lu!k`y(IgQB|Hnh zqxe6?VOtzJvgU|Dr{oKfZEeaERD99?zm59an}19O{QVWvLQc34>#DTh7I&5kuBJNr zQOu>eB%!63h&@xRy;h7a91{UT8*3mbS72q3NLqMyX zS_vUUB8WBdCONxC0mK2#LcM} zuuIO0?u7EMq0p!)q1$SguQ?G!p~`@380IClcm1j(MNkS`g(78e44rntTPe|_vDH>s0)E6b%?^(O1!N1lL3q)7Zkfe zY^%}ta&y;iW4PWEIlGvR%j&==qM9l270ChUr=b^jpNZFk5!L}^1(C--FDM=r^Z%eJH4nL-9?oX_mpznQ3CD=zqES%gIAh}Xl(!|Zw^E#5d?p>m zP!c6jgkD9bBu0wt2T`1CN#x+BzUda`5oiU3 zCb1>=#`VH2l1FH@sQ_hT^K*~IrUh&Ejuwsb$nA45ieVJmuXU*c9}s7fw)NJL2nLosQgogS(!<=OYDA}iA))4;e0rKj$hkaC zbyemHmeFlS;q&NqXj7sHTADF}d>Q&0(1e5DK|d0YJqjQbWgX%;wwa8V4hf1GvaX{& zA=|x2UoPhukd5Hyca_B&FoE%5`U&b#b%kjtmAHICc1bLUhQVKt^P8rHnbw{H9EUk1 zy^?k)7p$jms;fa61U-%kK#83U6Lx=s(|s~H0>IDL!@*mNNdjNLbbKlK!`To0)4~2; zfA5C@W9ismPfibh><~zc;xlz!8uL+xkfyQ|L5mTun-21LzLq2(W{@%11sS$ z&E84^8rVk84aqx%w;V7-DGh=Y%phjP$FiCC`~k4M%=J4mg*wwCd~@nPt~Er0nWTCJ z2tHL)qHTGt$Z446&Ceh~8H7E&zDubx=7bMIg_TQO%bYN9AiCw*q(q8J6DEHP21c+B zm1Xk3X+^SM!_B8)z2CA>1g=?nMqA>6DCfTBOE8-qt(}E-I|1%j-~&ScupwD1WEYe@ z{1S-WmoT1blY+{p*7j!D5*Kk$dk-0S)Q*Vesk_tl40N(hS!`fWRT=KGPEl!g31@t1d73J1J`nr%{%%pY%`|Y5%!fYmqp4Y zKaDm;NS6u#@&LdR!C`DOOmTErj zaw_xNW<7BM*fn zhWL!%B`Nnq4vtrp43}9Ppc9ZHN6RALDC~{=74ONw2#SJ){@Y1Y1C_}iHLWZZ=SX=Xg|BJ7D57!k6f1@!_86r#`!IN z=C~6y4DCGHKy?)j8M(VpZWh+Pk=W-5A85&Dlfbe)Dx3GwjzRrD+Hc)le!cY|&UZ1d zAW(sA&kX7VmW!&AV5JpX{y?13PUbXwXUcHX9S@%A+o#{bQ)c21hRszNhXvW?7C+z%L<*zC{5eSWk&Tdp+)`Kqy z=@z|jIo61E`l-|8ah0p=^yOam^v_>C+tH&7?|I*i6owPiilPS#2 zum_~bVpM~%b#Q9PORT(%H%|oz;D=#bvR-*2(HxijAJ zz`jx}$Q=u^CDGVO{X2%Uj73d)%)}syGTg6dS{dK}?hdS>Il+FV)3aIZ+(4Dj=Nnr- zDdOEbtR@OOMeupv7IS_s<{$c{O)3;8zdLJZ_3G z@0`T;&7;fjp3`~Ra342}_{T0dF{RQ%-&;zj)-pFKn1+>AZM}?D!m7aphCkD#!Cw!Z z5CHk+4%m)IKlg=`s3d_7E#fFvay5e%dDWeInkK`JEvE0MTwE6ZaJL!*?Q4t11(H31 zS@3o47S<0?+EUh|X9rqu`BwNnFyevGQ(P4z0Fpvep)`ekpdXRF&&-h4(nEybd9naC zhv@>1ji@!Z=z>c>FuiZo6@Y2fcLb#Yf9}K82GacoiQ$g(_X(zgZyyvPuoVml!iE?q zw6PlqYrXX|F%9^GRfi67yJf*rhJ?0Bi0pgXIOE-5omYr`Nyt5FMI_-zkw=aEQcn~b8P zhgPPY#Z5-fs=S=;8xBdkTcekT3nh*5dI@Q%RskZ|ySC=X5fBu92Fs=mNtGss<;08I zvx9@VJ@A$fitCXuU9; zo~#+GPBfW5HZniI4OY59gp+UyI=}jGCnfMT71M#SKV=lZZRYL+y*a2x*?Q_+o%xp{F)$D%*N3#)FR)qa$<<#GzR%Y)pwjRR4Yp5phNwvFr zsB|Azl3L?n_)z4kWBp;#m3V}9W=(ZxNC!UJiD-UC8@o-0@@@u5qD_8H6T!oF?t^qu zFa>9&+Tdri@x94S!Tp|BHF#_%#i-0Zj#OJRfO^9t?}XK9Oe@IXG!vmO!ad0yzp9+} zHjQN{83tz+T;oyEpdjoRTEp`&&FYGSUjF9pUo1xtnN}QuBTW&JTrb9?&QS;!I-GSv z7hugN_+9wh&j5fXsu? zr-P$R*?aGXs2bfZ-vBC4wAA13wl<}lOcof$XZA(ETe>ycQ^aUZx)AFzA$h<>iz$j( zrRUDL{eZf(;(#BCcq&9FZ<@u#^dSv}U0vlYm2cklT0^!3T`oXc1$zXf{;1k^n@^(goHCl?2Yhp!QL<6Ix5 zWR-6oE!4x77VQIOhSTrV1l35PHi*@hVJgUmmGP`qSc%xHX=?6?^*16Cu_LRZE~QV& zAcS@r-+sa%6q+(6B(^aI%+_z#kogTAg-eVA`F3M>gNo#Sdqrs8SH*Zdg8@u$zWtK? zv-A49Z|1k(MV2W1>Xf$KKQ{UfA9)V6wKKZR@EgCC?hk_8yc>IiAKZ{llN@;hzpE%l zH){ORZ8a$#UAxo&h+qHavi>gUg`RuVelmkcv(&R{pXz#P$y~ytw9#&1BQ*{8WBndH zd#N5FAWWLzi8gitC<$`8Hj_m zL=Nho>nk`2iH+si{RfB(-`3T?q1gDXI66AWXwBmgDZnIe>;%o7uJ+Y#dq1dk7hHx@ zRjW97!_?73GWlA^@;^RYH{UL%<;U$&HOC3U(_M2%8LOgg|4fMR4jM@@2i_ zfW~eeJ&)Y9CvM(I>!8}XTV)D)Fq{AS!w*|%xMazZ<3UPezvU9A(M8zkO}LZwmvurl z1R8z;Z@Hqr!b~`KW4Pn9@vj^1|H)!W+KX!pPaFiz*_IiW1pQ6H?OnNZ$F)YC>i43! zt{7++C*W2rIrx^3Co^$(CfJ5u-o^ z$gc#E3-j8^#H=ZDqRGt#A&TfDtTf(ZJG_^v>Y^Q&WOcn>xVE^9aKt?-)4>(cX$eLJ6od#8_ayfNWGs~)%<^$1M(+eO>{$BadhKLQ zrsdM|t`a!vCWjX3Rs>~N#BKLVo-U^7QH)pAhckG7EJJjP1v#R4SXW#gV!ha3jj8V0 zN`ai@!5Rt&yW%c#e1abku{tmSL7cP9&B)oB+2&rk(BYpi$$`TWKgcqVSd%^UR*euy zP^oGYcV`Q*-PF31J)}T({R5!7*Td(Um~bi4!S1aPcqbmu?lV6kN~K$GM7z)aupx1l z;P16cy|so!l?c$f=3kJvUZT+rpR%L+<;UyBJaxogPPkDg1Y*b$U^L}+dJ4wiXFn23 z`AbL1z=BU~p*MEIFH#>Elk ziRpV}iFQo5HUlA#jEV&9Ffvj{j7J=Geb_%Zy4Zhljv=5FFiG;kNebvZS_YpOqM%iE zd7(dVzJw%GTj<>^YLT4;`@r!d7@ON9Digb(PXaSy0VN01c!6ytqD2By{n zZs+i($9PdJ^;lk&EOfAMX7!|K-z;cOyIvZTf6yA6yP&P!3(YPGZBHkGWh`7Ptb#4; zTDv9P+{Ihu+VOSw;qg`&2%<~R*ZK)3GOaPBRxhOnGwNo>YkOic);I2p27&n9`|K~Q zrW>YOB1WEjECy;cjFgZ(NKT67!N+8mohn!&mk_O|anAv_^*Y;Gr4D>*2I`EstTTmMpsX1Fq?Qc*4;NM{)WRJs++?Qvv%# zsd}#UbbV&E%!u_JF@}L;7QQxoNnjkJP2w zHJI&@x?i9%yv6a7G2UkNFjY})c^m03xU-i||3u1!Uz)O(;+P^w;w2MCKnCS_;&iCc zbQwsQRw_xaejvBJRBTR5yht}gX; zBTha&9CYWP_?7xy%e%(V2g6$}*<)en;)UB{r-D9HSe6Jq-1P@`NSV%DKXFVNdIVc5 z(EcU4weicCE8Ot|q+qoiL&K16@%_M(;olX^AI>G-mRw>~JQQ9~FuxnWNEm>_p%r9_ zsA@^J1^Z8dVIfp*Hv4(=u$=}TRvzbgHUu)7x-Ujz5aE)wR30*_k%||Glm@-4YS#nR zzP_%DLfn6h_6BYIKq$mL(?9pCbrHp-56S1?#V;h2UChEz4jK((a}Ov*_pt;>>d92h zb051I?~UtzGsF(_M>XCP+z_&gwe}=nIXwj-_&ru1B`ilg3VCr^;QDGvpV^hIpG`vb z>Wr|G5ThH64)J>+mPE?X#EPa2Xc#1AqxZG}G>jZwB2-v=DnKw|Kct{|N#uZlTx!Ku zYi5<9u}oygOe2Rd{~6@E^>|WdIFiy)7i@oS$|*rNHAT!SgdxwQ)SbP%6qj(w87VY{ z(sfF3>@-Di&XC>?{C>Ous2jC}-F79O??Yo)vXuZky(w(6aD;V%e$Vqw{dROoKb*TO zZ_7;&Ez&6APniX>nPfk}0gan=a>s|Fvso-li3En2*LvE>VJFav0Sohf{qcQ*$|;qYp`x2Y%dGm_gANQI zF0e*c6qUxu2Oa~;vRl4u-65TCrNm9X9t5c+^+E{otyjmgS6Y1ln{$Is znbS@LTJubiJC7A=(!+ZHR~v%!AE_^!e>~9o=2)G0dR3_0&(YCXBDEnHH}Pgfbrx7E z16v8kh;oJvs~nJ;Og_ko|cCY2YF%ISN7HjWEAHkOMq%x|43;;{fQD#X7c z5TiMY0j)^A;Xio@K5sgnA&bT8@!gAXrDPlsj%q`C@XjNxV$d5ukNo1 z&Oe1WE#qK-n(U@37@Pt&O+~B9h*oPiE*_H1#eVSMzQ86=7gLG31nwa&kQPpp1$IXiZPP@-sn@CbMH2&B##*bWwA?rn zWGp*!1y>pLmpyS?ykF5d2rxOLp7$ZBx8h*^;KH>F@7k<1W8?=inmU$g`UiCr-aAIBoI7q_&qs;%m+5%MK91M=sMV*rI9-!afF zo=GfX057zri|fI2=E=kX*M2gPTTQ)*TIw4#@++&{{%JHPO^X}Kh9Y|<2}%096N4#a zki}8(nII<&W_K@_HCA`I_@?~ssDC*4=8>aGQuInOebcHm*{_a2yV)$9U{+^X(dC@h zw2gs)j_W-RG~;h+1dQJy5PUSIQ*8ut zVDXu_uCZ5A$k7`p(f9^!wG@f303Cc3g!1SsvIHQnf$oMwp-}uDO?(0Y)Fhe_|1wBM zl5rjrHV6N2Ym}~X7~W+Gl|VZOko*Fre=Fy)9f4FL6rU^Vt#qq+H&q=eiXujYL`A_; zQv~B8F|h&GzWcmD(H3MlY=|MHLX=Od^{S49NB^$4%r0xk{=_^A@(PyUaijA?K+L## zg({v~KJ?d%6;}ig1KXwJghBp4`G@=rQN_ZQ8M!XTRX$>FdQDq@fGbkWncK7$NF&Q` z$`7O;!rKT%+S5EX+MpdD@9nix46O;*3R=Vkl}0C!-rr0xbyhYTEV(zFSPM`iD0sPV zrw~g8Q6FH~AvGYM#dK9m@SKw&A5g&TX9Q*Ol~E~M5f1Rh%H;0QqW8kXS31vdNd z_>K6d_zJV`Rb=uE4*`5^YThKkH(6Eh0anQc&+;VycmV+^7gvry%+IrTR6q0F)_19c z^I@)>HR`-{YBIz;0vyP!9MON>74l;~PN@WNREH`IWP3W4NF@lb52p@1jK?m@z%Z%+ z#P_EN3T~6pNDsQgSOpMU3kV{+YQm(^g^I)?VU%jEYVN1itSJ?DR`H=L@$OLXOrxa$ z9bG!IyTexcNjCysgdd!aixJF#4XPK{D{e}_E_H`nWo798dNnxue)z-rIYU<^erw@V zIa(?wi-}SyxZ-?z`-@k{FECvm$L3g54=pnHb4MrNSgfpQAnwD`!T8@h2jr`}#Wnlv z7#=Md#NP3%*M~>x0nl%qod9D%oWFbU;w!9}ihGdrG9a~;gqI{?`Q$r5n;puAa1Xwt z!m;OqH?X{MxPL~)N74=X8+R}Ur`e02;G6GHk6)j_zny>x$T&-o0Yd3<2*4P%uhbO!#7(@w@ z71!xiI$1ujANOBC1W9^8{Now}u{hQ=o*3zxRexwEfoB}iHn~_k(1E$ICYXCoVjwbg zi_uEq-`A=TQYt4IgYUCyb|qETaJUL_-LB}AYr&GEO2E8mg{4C5MgR2s^fKEg z)>vx~*H5`;Y>!_)3Myzk*iVl@eqE#YcU&6zSCT1i0exL0nscX8;V9B$cy;iX!NrMt ze{g!Fe36u=HlJ=ky9SS>Lpldps#PiO9W*J_^X_}c($5+60FsxMACms*0VFP69KAk# zF*xlUbo5;3fRV-79d!ihO*H4s_QDg_hwX^9x^f%pp8^riVYLUkJ`bux}kZ9a67-VYk!#PrKcED0KY#P9m`v8j;-I9CGO9;m}6q^>snXE3IO7 zLS#qBr-%Jl2mcwBv}^smidgkQL#xwjyP7d*F@6hs_<$VGNQne`PLzmMzS>0&5n~bp zfJVk>6YS;`)M|`Rz-pEDs5{x(MvScc8bvhT86BO3?FUH*TC)OGb`BX_G;l&&u&@@1 z{kZsX*niQr8~Eeuy}-v>NV8{D(G-m8HE#n)4=J9^rg4FDtAo?i<5P`5woWXD&UZT} z8W5_>&C(iz3GNpBrAi96iLCWbOQeVwBmTpJgRR?a50?jvmylGdPVLBa75ac>RsWIp zdnJpVpeIc(%!(`S7Ae~Y!y8IT-^iDpqh$m`+?aoZ^2x?6?}{=7RUl8RMw<%7Jvotc zL~$|ZA>7)!@IIuf_T^@hLMWH*@G<~`xjKS^I7ANE)blS2T{e#HY`~otK zZM`LNH#2p?(n$xd+0x8Q!?K<{F`tZU)WVQEu`C( zd(|$56-sy%24;*FG-kRWum%j3ege>Qe}T|qu>#W_8D%v!3^irEZmCty2_YPDg7O5W< zEXPr_0%bmFbo;9D2(hO0?alVWbX*l%A|wVz1&Cg|bNWydmK-Kfatgj+8E{lKSJeW5 z^fEFuQ_M`ho-X3mG&#OaNIfF+E~ zALk~@{<6PFr90L`G)M6+_r(?4-J_y{7(AkSlQ;ocXI9}px2aol^5;S`AnP$54OkjaCQw@MJ^IV<=zt;+7yv&R_<$ zk@Cw4q8!d8)hM~Sd_oiyfzy@I2^_@yLP%j{qdm_pCi0sf2B!mdr*lkDIlUeeNDy93 zw^ey%6U4_k=YtxBoCTz5BrQ#izul>^5FjT35{u<#WO`HDCTz=i9Y>Hz@2 z6;}Y}=x}H(g{;xG!2KHi@{p?l$LH5P3q$d*RMK%bASZU)TCQIJB_pu*LLsyS@==SioPu%!SYhXU#!vRK_S z2sz43y2dOz40nrfop>yd#T2i7NKWG#vN(*T*gs}R|IdQ{t_%9~f4>D?Og#XGKbAdc z;6H87NyISNkNQ7;PY8DF^R|T2=vHsZ?z8_vL{5YLBNy~H@s0nprX6eg8(7DG+nWA2 z^N!!XE$ujV)LB6=Gd;6v9C`VyH!r{l0O#^a3Lzi_;j#t^;_PA^L(yHdc}gQl8yQas zj))7gnuLS2tF0?=qnGlXu?_0H7gW5DLON2=C$k)Lo7Y_hojF@0LwHiZ9sq&cjutr4 z3X|_hH?+B+GM4rzqfmg~VVu6jl|#0vgp+*g^hR&H(PmtaQPMGDsrpJSs5&h)?HVWr z6+%cvf(V(38=E`9JpqH3gjoZ9Kmf6X?Y<}#Zy&$EMI)iQJvjrA(wlmOY?zo^>8qmp zL|i^TxFj1KxA%YLmsh>#AMbzJ5M)EI)xmGjk}CTG&GqEz7hj4>=O2ewC}j~}h@i1B z(!<(-MB!5VpA-d63=PbeNy0`ms5LCf%P_Q0@E{ddMMKX9w3hul1x7diVe#X!_)qr z)2t8vlOIm2*PQt>_o-88N)1mhom~uj604gU~uqlbHs8q+Px%M2xQ}{ zy?-pOQ1(%)ueZI1*Ycedj!cc7%hS}=;^r2IzD+~-j-gAy@&Eh6E#i0IxNVXO1ALp{ zF#mnueHae1m#4>v*?jlkxA%%Ffym$8Q#o+scBal<~jt}7iasN6!e)Z}_ zfA23WrJnVF9Gn~<9KmlGY<%iw)jxx~0B71YMj!bIL*p!Uv0j^@xQ~;j7=OSz41{ti zWz8qmNUD$OA~^{GU0wN{;600bogX~s?j^R+B6BCsYkD(H;!uAVE>>$9QZT?`}5%K z-mBMV2S1Vs;;#7-lFPhW#3kXVfY!3z388<epC#*ET=QC zrx&0tTWCOiN}f3Lz+2$6oKfOEWYci^2I+%s7x|eJFX0Fx#yQ7ELc9Sew1gUmRkcOH zrAvU;c>nmw9l%g#l{U9Pm8KYt0;|9k9Ux3+Tk6+OtxVwTj?OAmNK6Ho-h1Xjl2J^G zP?Y_zfsui#s-zYewHws-Qz*%usK_ZuJA&A<;tcHTMQy4L5YDNU3QUm!u5pTjA|}9Y}p}dE__K$_XJ?K9mdV zFyyu4$?&ueGvFKs?geydDu6jR@(KhHuRPgEE%uv-$>V%K%_pq$4FP$JN>X&8=T%TK zvG95(T5$f6{nujJ^&9UnE1Md~6g;F=(kqXuhucU7q6ZH{7!58~Sq60%QE=Z0`WeyO zvibdt-P#fX!iFb+T8Fk!q32Q@zVXx$Nf@DFunoxF*Vp5UO1V>{DYf1coxO*677gAM zRYJqd;9P(e3qY)_V3-KIbHD(Dt;;YY0}+RVDN`g4f|~*hy)DKg!f{d=G5C$+g0x*L z)dfUFwaim52XpFrpKlPxCT@JBv0%hOX81Pci&HC`$Ya$GM`^tMmxFH~lkPx2OJAI6 zo?ml5qy!i~-s0Gs()NzQe;PXHj_U%f#xyr9E1cOodGGk><-zwCX9q{$JFOK564Z0y z-w$8E8XoY^4@`7b&8c{x3%Enh(0+stY{&)Xw8lbecIbU{%embpuI3xM5(xoP-$AZGe&WyLgi zmOyyYgTbeSL<0NwQp{p|prC&=V7@Y?EB>LBs^^@ts0KAoZ)i+)YlQi*v@DG%kNdeF z6(vePDP9jU*~ieHu#c+=GX+PVe6&^Cs>Ce4296Htg1)v1nf36{C=PZ^Qy`)E&8IJ0 z9@qTl2J(sLh0Hu8La60;0isvyMSdI*y2(2pzIcQ9b|3AlQsr7j)!>n3^dy@SeNNES z3ko@va%;mXp|{4kaA64VKjJT%);9>>`H!d-*h$++@EO|huX9{%Dt$N5m^TkRFtEw+ zqtk$CH&utXozy(XivR=zKrwIw*c+<|6k(lC8)nNumh-FILIGyg3XLqRaI^{)Ig_O< zvi~suJUTk^pPv8t-(gXFLHzt7IKkTPKkAZZDL$c(gh>=)HU@?oZIDjj+wW zKM^Q5;0SI6!d6t7%>C}i3P+265wEL=jk`XeU4|tnmcbdxmVSjZtvO~-E8)1L@1*TidZ2QS3X$IGjOt<|6hp^irN~#-EBV8- zFE+Q#0CRhz2@}9^L;81hea+VXJJgxs2X`RMT1nm+rrja%l3sPR3jmG_?~o)R$?0Tz zfb=40&eXH!hUT_^NQ*|vIH#nhfS;u|NeF`uA6A*B;m~^^ZnJrqisd-^K!`3k8Ugp` za|@+86rYsJz>Gim2HDC6#mHF!u3N0N&(A})e_^?SF zijEI+);YZ!g*h-y2Q%;?xf~QnV>AhTEq@*Jj5H$(CImMi-(<4C@I4$iI_TGO#~x({ z3FNxO(~3+4njoi3Ka=LjW#dGa5|SnJ31G}aTRzTo6M^@PPA9RZSb@9zrP$&C60(Sr z!;TAe@LBm!?kp&q)EMPtbly-s7P$vl`UKU}-D+ItuMP1BJt5dn_G^Z< zI?#wSre!*KbbRi?uyCpSz5)t69hhI~8qr0=h|lotHZL_a*}Y}V{x;8g2fdTtFsMoF zu>}scL!OAtp~JHdOOGNZS>3$K;218)uT&HYL|`Ma?-d11X38gc9`0vFHUyH`$81+| zKm{^2k!j?hHW!1M%wXY8cCw$DwV}yOOMg%ZnSX0v+`)`Vtw$M4Cf|8DAH4~6tEC|L z(AEs`IAF}xHJ+PbxX=ln^Owc|vy*jh+?Fji?7Es87V=J3L*raU5IAQrQCJOLiKjbH z9`8K1I6A%v_7Xz@VzA}@0Ehb`8s)qzvJ=Z2;%kY}8h8^;xWUz4)2oYG$@7&9m!Td>H4wjw#6HCB#bg&u~t&opiwd;tAaB}VB zdNJ0mVUs1TJ&HS^eVG{ec-Asj;w7)Aaq@|>yxNU_PX32>n0Y_~%MfTFI*yTS$Ty7J z7l6>iwOvwVX_ha zbiSEP7}%27UxOH8atZt(oy_$8AOO{A<^7XTHzMCEK+}R>l5=0Q9fY%QwIdGi7De($y5K@9gSb8S;jmxu4d-!Sd;npU8yVad= zs4Y7wX=U5$fGD8?c<({h@%KrckE+GxxJY(RKdpG*eUW^bYE`ayvt!osUCEWsm$ia6 zp>`uH-a?~5_!jhR>#f7*Pg+SfC#*vvpGY7qMt8RyRfu0jAW`o|vgG{-M(7z%;L+M-FG3W4cyd&pMOq@1G!omuz8~?G%N5b{MCN*DL3Xiu9lUTW_)9>49PqK zyZgYk#9Wbx4Aj`&wp%) zuLhw>H8@H0MPQKPxH##W_J-D^%uULc*f4Oq(+Zms-!y?4GHCT20sA-LcQ9?!$nt45 zy`NywIqynNxPl`$bjvqNKAAut^ftqzSe7*wsiVkNfMg_NWb+cG4I3m%HXN()8#rG$ zn8s0=fs~2O#gUs-U{8uDp;HhSZMrxR!azZqoUcjY=N%zrN1NoA0xm_SlYY_XsN zq!8pmO4o$E*U!Gk`j|&duge(HDQ9@ui-!$HehaDGCg^W?nmpJSy+Wku^`%B}0kqsI z8@kC&A9|c^BuwYVcsnE?cdMO2%q#@Fpe@n*3$C$9E|YYi2O{edvo%josoD^;N%uEN zO@Q2}EEY|>OvMbrk*Y>6G#dkr|BsyX~u+9l@l!$n~C?)n3@J4$HD~vj8YRP^ItTlm<=YbGAB~&uzaN!PH!GQ9IKst-! z(hM|m=VGHR=|cKnLnKk*eUEEL9>9{Gl2Pkyb(WW51<5*;-T{kIP!>C2-ksvL!#9>$ z8BLb!k%SH9Qi(rwTC?SqDHUAKHccK6A}hZ>*@v{tEv`l_#a#YIM_kgG6NAVV7G7p8 z)B!EQ&}fk86JlT@D8vklgF`X(lJpAgw<=B|+raD%x^YAbFA0y|HY7$vo|0{sWwKR!%?FBtDt zuy7!zb&U2{uSsZyFCS`F1|3H{vxMH2BuMbs62;8VCRW782F8t(>kYS-j*>?{<}g71 z6^k3-S$iA^#Ie*V6E7Q1adb3Rj>Yk`Y&vCQ3VT^&vjvI=*#sLT)x{vD1UM_Csc1)R z+o$zyfhUVkgmZp8{nd*piNU7NDPr$a6Yyh_&}`UGOe2+vn55sVnjmk5*6VDvs3oX} zJ+JIhmo!>BTjM>jmQ-q(dGA;zO`;3bLU{RL9HJCuW$88t2Huq50LME-) zppE|7hVZ@X$``YvS9%^dnew{(XHpb7%WS0t$N%)Fz!POvY(I<`K?_VB40j+Qw$)VY z0Qxe3B9*{KucHmvjc;oK*-;9ShT!bd6w=W~JD;Ok)K_TG0LU3)$&~L;jQJCpG6%Uq zk{n&_l?RB@C>6*E?a@7@vZ>r!xbA}3@8xhJ5__mZdLjQ-n`^Zw&5pqrF|Xv75F4iQ zBT`}2;T;v>i8$|tw0sd?QzB_<*DxNka$MjLT5p)UoSv11(ltrHB5XLHm{8`nQXjC@ zPRo&HrqI}u+8h7vER{pMgU~HVi*n=VQc6&bfb)_iLPrf5Ew*G7&71=!RV7?Zx81yR zuyfO+-Wr{v@0daROFD`kY=Tr_DuUIicF@VwlqI17y8`)T#aJar^V{giMA>w~uJt%d z^hm9HbnR;dhm1Rn_ur0gdj8jA2|uv)Iwt#r$pcq8O1YJlD z@W$@54YNWKDy-n%iS9vdw`h{;)P+|D^o%D9vo1YEA)8;uXNHYtVrQakiw@EK4h*Fe>LmH66*hiMJR1y%YiVu ziT4T8dvNvWy|d-XekALIYa^k`f|KiSMpcF|eX)H9RskR@3>5Fa?lH&>w^Z%wlm*!` z6;uo80P-b^c_7MCVH(LP-8&uhhl6YgTsfQXZeHzXm`ipv-1?dykzMlswysi`(kR>1 zTwDJO++yy(3~ne*1_nOLWHGm_I45}^8=l{hTvIFM%AS|se!IIx!dtYa@+y&Vcmu<0 zkGBkrVG8fY$*u%%OTafEAe>d9xiU9A7DaHOs!9`G0&y6rO-~Y4Ubz z{4r0IV^AcfgwcyZP@%Uzz_RaGh`y>+;J13=$GGQl+AoaLGQV`E&%cY8*IcKOmd7Wom)@a(DM0Ankh z!68BmLm{gis0$YIhibPet!pY@6k5&Y<-Bp14De*+Q7E8LDG5A+K0ka~+yOjPSfwz% zH|ag-+A~@ErS5S_rJ}-(Ywt@ChH5v41L=LmH)sq%nZgOiP&b%6?Vhq|H_AH_qmqy% zD4NPy!&D!)s^{iLI+&UU{M$XgGm-84^gx5wB|5{4*JnQoJgh+m^w~+L$8XFhs?SB!lWdN3b#rm>U2|Nn2*rKunri((AF%lv{=Ux-f8T5YJeJ0bv> zZ;zG7V#|HCK*JjpfK->Fb;hK6B{g4qCJ<}t7w!;6lSy^!d*yVH+DRf%lawws^Po?m zW2&^Kq7YUxT7Ey)AWf5iZ`cXsOO_+3RK$jOY+R?786X+4a0+0=BV24`lsSY!6dKOt zO=<}YOLx}QNsWf~c005jwD%H-g>#BcHzCjo<#lQGVqcu|9%+m>+@3R*50uD@93XK) zKqB0?y1G-3Yf0s~?-`y^T^QaGO*OVDS%+geIXW@FqEs`(q~D2(PKgo`{7-xTaA%_ZXr1_T*c@UiAD^4KOXL6 zhgBV#OL>_vat0Q(MLKSXljcT?xG2|a^WmH>Xe|-x^G*W4Qow-^j)rc5UY`sN93r+3$?ChwW*1EQq;E?eml2Mc1Esbk`aaa*q9C#3Y9J6e)g+Rm|}?!#V~GR z#1=3|p^HWXnq6lR*_+D~`6b|7Vy*5g0mNs#f-A%ey|uQb1cJEFAzg4*5t+)6g;{Hv zZD&$R#djN;EpgQB*=&pxkMJeXu8cvZ(BIRYXFE@x?(71Y8xL-q$Y37?YL655qr>Vi zcFx4Y`;&#tJY)36zB%?Ca(l?ug$gGD!+7+@1ib3hMzE5Ch(U1R9K^?EIBNq z9Mdk#UE&mN4FjqR&?3AO7qYD6dA9k^ZE;auKi98%2@ZVe7|m3eeEMLAWl~DMCa=o+ zYB6zB1zc%@-lvnCi@U*=%l4Uv1bobR22elMNz<5Q7*s7s+I7VC-s|sB?Alb6Kx&4t zB+QM(;?)#s>AUlO10d`gk{p1j(Q=AWZ7hNZMQ!@8hsURbvq8FWj^T=;KD%|ASM1G- zic-sI_~!Dv@2l$iK08pUyzg$*`SWicU4EA>6}`jlLOs^0(?RK+#uT&mY_lzD2bGIa zjH8;}?Xy9$FKRBW{rkyDc&I=EIixAus-o7N*(!e>A_FMz4=aJ=Mqd_lAanP{Rb5_k z`nE4k{>IVAXaWK$@wk#beK)x3fC+UYo6TjlZRYAn@@3woRSpuBL9pcmEt&}dY3Owml@3~PfRF6$qtHGz~qehVp(}}~2Iouoy+>b72JiM*@IaYUL zMLtq=m!o~V7S|2o48tySV*p-dRv()4X9D<=h3e)@;yjUQAQYMkvymkl(zupnnH+SK z-Ba@<#y^UGhy)LU=h8j(G!wvo+J>)4 z;>>R*xmiUa<4F5T#J7flw#y=1%`&bT-}=%iPdNjLh>t9SE|uK+!P}v_SO}V(VcVt_ z-$`&h5mn4IK9a_hSf0NKI!9C@uQ^n;|D=+LgY_% zd607-mDhaA4q)WJRDS_>6*m+t_&EM{T`)E($RcTDC{W`Wl+qKtP9je}dBCphTq=P; z4Idxt1L_rdT+XWN`5lGzK+%zM`rdo?FDt4K8aIx&QS{|g(YN8MpfNwiLH8t#+)M;- ziGLwqcxJTT?+2$@wj2NQ^3`#F2&vFd;$IM;2L8T?e?dM3e_uZMm+~4gc`dR13wh$h z?}~9#xL?9{aM|JSse54R7BK4QseK}q;sJLBqxrssI8k;HhX>)mI;=0NAau0p$FqC{x*LB2>@NI7@6K!Y&geVWY{VfT5d?aGU;nMn z>-uZ>7cRf|7Pw4P6;jG!tvoG2$2^;u?mLSWi-4OYW zktEh_WcOLRncZjWw}b4m-OSL7E0jR&79hmbbo z0iG#nity9QhnAYzXHqaxApp;8!yST61LF(D8ab0^e>=YoG98#hYLw zAk1z)!qb_oKj=EzCqJE>YZ0XqX&>z{M@5JVV<=ddg{F8}S**<|h>neY1>V4HduoMe zmL?ek^$iwGJ1uK!of6;VDBBD~S=0o4{sq~J40iJp;AR#HEPgW;kmaz7b?}>cjTGI< zt|#iZ3X|oNo016~ZT&!?4XHmPT(3$kV_StODBK2Zi)1$&Dc5pE_+phr0!|hnA;(nC za=U^;e=nrVo6Pg8!h28T_QMtT`b749F1 z>_T_D`!8Iow<2QrL-FyVO zBaCMN&A}Hv31TR!>yEXEY|A4@Jfp&c1q#kao0`q-lG-~PxvxWtkOqv&E*umt5Y*l! zUGI7^CY%5~k6l#2Nx9-x4GYl$StCJ{5gyIj9G(?56I>5)&9R#zIZ`2B;Q$zg5A|UH zY7lTbz;&~5(?t?V_@+!IS{&2V*`YD3$AgcqQh&+iiV&TXkSKVW%F$8+X$#OilveFA zZrYS&GsXa8Q0d8WlMt^ujz&n0+veV`GwQ@4Ps8vhN0S^%kS^8>t&-sYcuVFU%$mnt z@jO_}n=Tt(=QyN-3YTSAG7N}W4P_FiGr2vx=HL+?Car>2dC0@XrmTSw$*5x?mo6Xy z*Df2bH6gA`6S^VGi9#wC{6S>#)oQB1^Rk>S++6+{gn=XZEu`Vs{GUV{K}LN*9VSG` z-Yc=L!4yU!cS;%2ZqB8kIU`cxK%21=0Fl_`{N5Dv2!_}>h?dW+ zJwnN4)TMra4lq+$M5u9TJrG&LGfn_ob}^IGmH<4E@)lG~0P+fo$!vb_E3=XV6I}!m z_(3Qh;SK2vfhNp&kOGf4SPaXZcHpo%;!Tc`0p$9|{@SGom)0R<+}+jYrVKpmIr%uG zPNyT04`p3VF(Z={{O$s$wmfZ6#}KM^x{u&64(KMRR2WiCRNl~5QCU5eRfHOpX=FP- zYEY=@xxMb0SQ~T$vcW~Q&~f>`RWz}jMm6xbY$Dgjdk}f7xzZw^nO-PBv0megp5g-h zP)y@Ehj2zMy<`g759md>A8xK7jB;!$>H@8bnYdnSRLz8`aL6WQ7d7WTdxCP|=he)S z`G;a01fqa4VpYv~+hmc?p>Eqe)uc5Lgk3o84YiyQ@lLtSk|A;=G>aF;A z$xE5~mg1LomcEvW*C%?djW^%fg7~i1Z$W368u}hnD6)N1cmlne%bE$N(m&ffIB=Bb zbg|mh7_olSu6BY6opDVterWqUcJi9_knyK>@7-SiY={yR|FGoM^=8mshq#qs{C)uH z>DBjw?mlhc!K={@`d7g%w(Pxds7Dnmzu_yvGoLof;MGqUW%ypSEu#_39JbOH7$k~< zD{+fQg#K-Kin`RjXPoTEvF!rQ7CkvUp)BV3CRt=Ppe89C_0mFHkITQJO*SpNN!WNf zMT2@S6_#8v`k`i2piE(>P<`aiLyj3VTpGrqe zlgJPMREJ!DtO9x2HQ1Fy{VfCi%8b+0o&9;w(3{l1q`_WNtuFe2Rb*7N7=c065gkH- zb44#`jTAYdYOIa|(jn8Zn(NS=wW!%|C{vI`!v%N@REnT5FVjkfK*Cg`6hpMUb7oSF z5OoUThn;rxC`Q1b z^^S!IEKKcd8BUNz-)foSC6AG^b0m&@WGc_mi|e{L12sGdayJYZ2g`6qRNOGgxi>{J zVb!SY8sut2rNfqz#XAW_nTYAdi-69EAj~1yM61aM+YV8u^Q#>s({NgD93~*3-(=$o zjEoYC0F~FHN)lKa;fhGxYQe~eL1)K7I<=5$B|#*>c6GhYYs3i&v{MR@$R5wot&$y2 z$M+GNL#I356UGk$qjEo>8O1Gp&>`B$pwF}@lw8KHUwy^du3v@RlWluXN$1b{zU6T% zRx$9A8waFRP$axYTONHbiCu1+%OJ4jHXkX1#7JPxQOERd#UJqu>JMTgmN1mEfwS-vUJLIPblUA-yst~`VR5s6lk zrEwDN&{Bl;hFUOA?cz*JTT5d>byZ_pGC87-xTUT-N9(OH9p~Tl_PWzZyq^GMu`eeO zs1S}ai5Q<9BkP10_6KLf)7N{$SR+ z*;e3aG%3kpp}`pB!u*yDxCuH4D@#f2*&ICv6wF6g?*sNAj>~KJ*!|VG=*&|(dyYJt zII5j76gGurHY<#r8u!KE&ZzX)E^X;!++cu`b(n%Qt&5wy9$`6jH&B6=0lbtdfgeFO zZAxiS42jA>KFjr!poS_13zln`iR*B?npri@It)-1*GzB}vCd1clk!?@yYK?&jd%5Jm50A7r42JcoTSOek=r|PMs zsZM;Da3FlyS{}i7P&?NxAEvD5WNj>K4=468gMuDj{RoS3#K6ESdu&R#H-Z)Jr4s%Ha6-RvMY)c~%kte6CN2ddhWBdm3sg`l5 z?HLF3%AJLL*2WtP zkK!XLWGf%sA&DA5L1CJ1GFrxDXgF(fm_2uF-6W4|$7_5V7^FIqKN_AkSzXFJuHZfR zhp24-h@M>K>HgH`lbK@=f;18jO}yy@(6N-D%id3`yD64(>mL5bmY7V%GLny?0pR_A za|4$mf>!HtQMwBXD%kaCOA}Hk0N@HGsQi-uc^wvq zheM1^PfI(5;s6FrON5TnUKUOF&K-^FPG_xAwoN%H$9YX=Z~*JRBL?g?61NC2=Ga7o zk;rB^mdeR%he1EOJsI^Gfk!C^=qkpN(#l~Zl#Mf|WEM0)nY-Bdm{^`CMx?8RK%)$Q zlaqm6IwBEL;d7Apt~^lciorfvmc^uk6eLdrTu32_ykMWM8559^?Nu;fiHul(kVB-V zN{-<&wH~2etSC;0^U0TA`oK00wWOA8KniBDkDUbZLB|p~`=G-xIa#Vf@({33Dn!X{ zJnXh7yq#m_Fe8UuXB3M`!Q?3T*r*#~x4B;rf^J8HrdvJfom2WnJdN>q=sYH?uFP-C zIyltRetjcHB@FqKBr=0a6>Jr4jz0|Z{5?!e3x5ThzP)Qqd`p`Fr!q8!S72&1;@x|! zOa^xWWqT)?tt>MC^7YZ)@Zk99qJR4R`Ibi*#HE2&f`Ox+gePiy7ns-$ZV~4t?LPUF zpOpzB6BQxI?;)Pxlpm7}aO;`~t@8~KQuMA|Kzyv7AXuwll}Y%vcq zQLvjA+6_)2-9fVP%T(j7X`BaQt9{>un8m~T>RgSlP|QIwH-Pm7JHR0kj+Wi!jy4{Q z>x4>5GuzYi=o?$OxYGQ$$owVM5#T;?}<$cMsMnR6uuNg zk4?PL7}auEl~T>-J~icj0+q8!h+fk)SlTU8UFv4CKtunAS$0!A0y{E|@&_erXK_5@Hm z-E5q@3z>{Og!PK-jN>B#2Z0tDS9?L)5*;kxZf8uK+vn|Pu=XhAz&OLXMW-AH_7q>y#I z=|3I}-k=0NJU#gS`@tzDVu59+xLQC|K3FjtT$dGNN}(Y~$Z$!iOROD)yk3rq?ZO@Y ztGTx^a1Dj)sLC@+gY{)eWl>dFrZApXurV`NukX0G5hs-KIMDilF(hO)jIhE$bVh(2 z@Va`$d*q1a$N8-z8(jZeyrBySn7XwdSnv(|P$|@2pn)X{jG@Snpa8i4oB==(wEyuX zn9X`}3f152n%~=YC*o$2-&pN0EPA+7AlZS!o{duq@;ZEu@f|69HMPVvR205Nr2tLt z>%b!G>~Qn^(Yu1ob@#$Z<6k6Vc%u3Lc3Z>SUsUC%!MzfA$@J)9D7O`9}$lx(@7uTy;N)& zLR_v)QaZOMEHsjM+R_oHXbW(RrJbGRw$frd;R0415W1)q6_47E7}+EPn#&8614WVl z#0U||0#}8s3J&AN=#wik; zqMxu_K#^`qGSN5SUjROnPkVJ_hw6BvIUnB&}hhQ*35|DMD&#!J- z9dLrT=Nv3-#8NNt462&lrA@N!1DMei4!o1tkvaA2o49@y&b_uR_M}!!_z;hhWlE?|4-w0Ja|l-e!9qf>GBC^zbe7*+k4{^MQud zXAei0J@?VpKKeyWdSzSwVwik35OLx`3Kv%JMkQsF5MoiDQ1=Y`!)t&i zMgb&{QhZq`xIu`srvO&*YVv=(@PCgUW(S8S&$H9*r+@l#_lxbPUw--QS(bbkEZ*|& zlknZgPoMs2*R}BM>7TmZeWC9@4d4B8_s{U|7rS46(e9T3~UDwqa<`=YX5enoB{1+)n|J(-6r7WUk z1&oTi1gf*KQIm8yGePZai`I-B{IXii-M8Y#xopB{t(FD4ms#vJR2j$y&B-#Pj;1D} z_RQog0_9)uCRimy#RX&b6@$Pv%9YUbDVHV^?1z-OmFsShfUb7eYqteZ$V4@|mT}cB zChpoA5DIK#{ZND!R_+_8jMg?WB7<-Y^|{|e2~dOs9Fc{hE^lryqr}bbLs{H4gmptj zQAxu`a;(d%_mm@YTi)Dm&+76+Id;r1(D8Avp@s++wgH6b#r;Hn;|sBQWX&n(>Yo;md0_24E3VcBC?C zWC?4KZAS{|Qgt1k!es$IcSc$AYIJD2Znq`;ZB)7$)Trc86r6uN6=Jzr?i4}cv1qMR z9<9e)sY@^9LhkSJ$H(~h)#JylXZ=B^KYI2n_`mpBAtC+4XLqsbRH(jQI6j?SbH{o>W@U}Mt3)9`1`@Cyt*Fp}%8g&I->+8E#)ud|mZA3d=e&L<7QT;OSzv*88@5${D)=em2=8S(;^N zm9`1V6$%N1yq)?>JnzQ92>q?&cZ>;S5?lDA2A0OL;K*ej{Ij6-8F{H2Szm_J{qj;= z{nf9pgQ~w)D{EltuWpBJ&h3^?*ciRKiIt%I>ou_ol3&13h3Oep1nFUo4lWbBruYn> zG}P4oE4V|trB6ojHy~l31LD5|OW(Bq&jIh}<@;3Z{?$9e(2>~mr%mJqz(ol1_P{eX{SEI0XSvU6?!zAlG)54h>WUxWhhgXpHFRR0~2o z6aeyfl=q^34-7T=^pXn0FyCFVm)+v`5Sf8>H9>qar4}Ss=G_VuKoEXTmLe4@Lb?Rg zV|;*d>6l(oEowzEtgGrFwqXR9x07CqyQ-%63=TY7IZJ3Gir-x{EnGbcM_huP$S#>S z?4X1`v4O7Iecu-eO{(+CP$+)T?F~q3G zg+7Fce^X=g!$Fd-GMNb)#$}q!8K&44urm3Do89d zUWlTzFk6The)Ft%&^zh9?d`WALICGe9@~?L9&n6|<3w-qA3qT?1Ckn?^l}2*b1dPuz4k5zt@!$)6gguF zDOimyTrbHirhsP!Y`|LEhnW#`Xeh0vk-8?mT(C^EiykYu~n;KX%k$w06!< zDjZ;L$+m6A)5(s(^8Y6l5WqM<#;Y>8CWP>2(%f_w6cd@eAdt7FphflNQjfv-J}#)n zIlAqWi`!w-TIJL-7%5|p;Iiiei3AKw^6h=?Nm2fB;JntsLUA3sX3N?N(5)ei`jru`b}geAkf?1M;RY zAcLj2{2B`u-%Bq9x58#sV?-u5OXqZ>J0VuaD$fTMxM zvjzI31uwce!#O9dhh1oOd+Y9OU+?5ixu7ZIY3( z%$j43WQf?-axr|vhr)^5&9|YzeMyOTBynezTPqFAQhx&vUq+8{9dr#+q?wfu`R0@>U_PrkKyk$j=!Dn^3~pEiTm==JMd> zoXzwGbNhqa0>9FX$bC&|?y?BfE7EAL3+TGr!jL&mS(vu=x`$S6KLf4MvSgciU-4>& zRwax^gp~$PevwNtG{_LN@Jg6ZwX}IzY&SHDG}7~jfk=0qv!PAndxL3418jWq_WU+N zk%A+vvGK?(sX`2vTIrTPMUhJrzb&Q9XNP)w+tS_)*kLH8xmJI*UvT-UAW8|u!M7lD zK^;}p1qsm#-m2aC#ZC!*gaNIIR(f&>ijUw`Z@iIZfPe-f&^ z4y;4RRCH5QTTI=%Tv#mEk{Ip85X@Bu-Vu-z#cG_}^neHJK;fY*)B%Kdl~4b-#lf?r z)$wBo3SPL2OMf00D;~J)exM6QFQPuO@cbVTz5h)?^b8q>Cv_=wp7nDqeb2g>d?Acw zZv@_>_PYipFZFh6a-vs<@AXW?+`~^m*fU3S*+9D2I)c^voR?QD`l{D2KXuPS1invr zXT?0*Zv|+3>%9`FfuH!QhIy@F+|SimYk4x+ID0+mdCz9yAHRDD2Gc1r#8*$ypf~jR~u)>r@X*i|K&O=418N znw$(2?`7A}k5Vj+QM)k5oUdVk#NiM$%E4Nu5EYS06TZO!xwIh?{RDOK0pfU}7?NDc zDOCU_v31T0&yVTKFiG`=$CLy%e6$9Vs_&k-`^rl&F@V*yOd%OrU!&PHT6T{Pbc(32 z^e2@6+6iOn4B&u`bKbmULr^h(SXtm~wn1Vt#5Yhw1Dd3{)qwABPd+rF0_ z2;5&@2})ITOeBme_ZHhDV@9ZC9?b&1&QR+PrsN1{kIj^!g{;Dfw)`p9os!x-Q{irn z^XKCzoyY@GGw@Pt-9U8N`Z>#ty*xS*l4X3gXrRym;nF%O2^u;2_A$((O5mR^Mwb_kU5~=(mNh7XPHGy~5~*R=9`664)R58?Y_)}W ziPqUD74iFvkL9?8y94%a_4W*-j0Fp`;#m78_@0!HY(=s^iLiOoR97YYO>@M!AUp*z zN8nZ5>#N0tZfa)Q zGT@OPG0z*bLhBEV>n=edOh*D%P&Qt=-<9{*|&bIf2ktoYyV;+iThz9V<49Xv5 z>YSHSRRpJF8ex+SXi$YXZglKsKAPS*1GiZ{^(DV~vk`vSdTPQ4UEh%S;_daSTj*fB zM^_g}HkHQ%B+FBJD`Wl`Fp8UEevvOeBBLVdFu^4vwjk>f(4>ly8ZH>N4AE%D2B+(H z6eW6UkjN@dj6kkH4=6>83O6pU=i2~cVyQqo@MSaVg4D6D$>{i6ZG=UmyVuVT z2OE)GF25N~4!DdbKuk)GGUuahMn4fg&<4dxuHKo->Y|PY5^rm2Y%e_Vx2VBwx3Xz+ zE~pN$1x%*^V9s+8>e1QDu3<581y5>02TjA{Is@o9Lftu5IFiF4-tsm;Zi0p^Mvkv? z7yvm5CA=l-@bb}#Xs~3wg~H-0ircA%LlGvB&f00+jtv| zND6si4x$9@=-oxRoz%p5wD?BYQ85+yg!n0-#QQA_B?B5U{6Dwe!rG(q- zDy@DWEiwEztKaT%#-_lo2x&q$2nPm4w1W*wN0IE*517loc&mo6wnWAF8qd>4AaB|EYANGd_duT|D zup}hU$dsp&b0Z2MneoUljF%DBlF|w)rULhf5Nfng0AHLKd41YHIy)E~NiJi@IIuIA z_E@8-P1YkYxNABhxddnO#mt8a4+=mZKuHn6c>o10(wn6(X3oTL8M#{yG&o2h!y9el zU{htgBj*3)HKl^p)um&YsN-A}wWP)G{jdKej0g?Ej~+;4Op3Cfe%sK&FBJN9EAt|puWKn` zTO_&&JQOkDH@J^Xkrp@L$oSc^XRJ16sH4o|bes5qkYgHfNT3L;%{GA;cufoQcZ$@h zI?t~2NjVl$44j2@f}ldP=joU&Wv;n$nyA7?LF=ag(W8bSSSz2W=uYa@!e8sFXBcQY z0n@Q6j?~fOU~7qn$XB2Q5~F|@G2{G>97n#sJuxCFcOqJ9T*UqhIrA%7Ui={O;3 z%QQQLi1tNQz@xHkDjdM}`)yesrG79USEv_g3E~J{A5Y+PiW0wMj3}^gCKnoiqKfI( zs7f*X7?vTNp#|U$hoG+R2pt>pEhPe0oH$sh2g!Dyh^46Zph zwEGMwZK}Yp9{J1&A8|n&qtb`NLv_1*wdks4(H4E?k}^esLLJM3Rs>kx#SHg-adT@t zT6li63{X%mcI|OT=+en?8#z8Pb_$l@*jGBin_+#TEiY<^glDI%MDttD6B@cy+^3}D zNKR_^NGnY85=&9{EH{asN`^ML!2?4E*g!{x`p9|js!@4;?+=EC6HB9-(*yBD%cpxm z@yVt~GMJc2z!ToSXF&^Ld2_?A^>~&Rju(ji#XYE4fYYF+U*EWqvC6Wj>MPMaV%kvJ!`BrAbnWtx1asd%6e!HtEb(JH!p z5oVhqBv%h;T1|?{Zy!%Oj4mqs6b%3(wL7jxA7yF$WNV5vjAY{@FClBv+sU!yjU>s( zmt@yCov85#jFho*K5L|1gPktMPl~1JrM`x<(@St}pFYw{aY_R}5F!kC z=`IY!{S+Aw*&QDs1Et7EhH5zA72cBzxCJ_jQ{o@Th-HuwmI0=qNsYVmM!$_A4m#Iy z9ZDlEiIZ7JWVG|8ltPQ%?qLF1&L_D4O@wL4oB5V4(?-iB1}cuHGpY1gB&-*e8tb)6 zo3-nmy&9Yc;-TExd^s6mx#h+d3A%l6i%YM)%0YIa6-b`O;>a2epn&J)rd~q$;PGq7 zdV8=mgHI5he#=OWq$IG94a!Dcf)THzMCi7J^;lr4Y2spGOVMdyN2c-mDum(W(nF?V zheC_+7M;)Q>jvElvLtfQ1gFHqs*Rjr;6_d*XVLIH{8tY;30+zL_ zbFw*z5>v%Dp_&>&Ll$WvAj2=>(jaS+VO!S1O63^9E`@i*AR3-1_PVlh$~&8z*xt*o zFjD(iP~ug%G7Q6wB>7wCN+pmJH=s-x+hE(ZqJu{!V>5lyXPd>O zFoxUI6e;XOTjZcuM-O5%MpYh^4Qq~N^7FHta^ab+{$vdg*p50?l{c-)tohP<(St!q9GLG1?H zk_?;H)gN&21U6LX(AUf(lF;A8&t@>pJ;Sny?1v!T6}=oj&X-izjzLO5Nn4xkug*cD zf{chaERkn)BaryD#u}q&iIwO^SVxjd6^VZkWvBFuHWQ9RYw$?(k}o4Ii)S_L?JuJ- zOp{{|k;!cC8F;nW^@SS79-snPBsIE?vG|q71W`|5LHAYS6x#|JBjnZ%WqPg^Xv2?! z0Bu@u3L4VouB+k$FAoZ~xF@TV5hJLuFpGEVJYZ7$u^f^pT^59U<&h^)9FZsC$x?$O zmGa%EMZjn!^qc`ufDQ7xGaRclES6s5xQU?|taotd=%^^M2BU~1=s5#_1wgZSdjfmr zL-4SOs;u?ucSH|65cuf8Q)PYNcRoA8R|6)0I5A2Vq#zg6nDAFKP`aP43MX4C-c20A ze;x=Ue0{;yytTv+ZyGkq>)Nz!xdT=i|1=7lV3g3W=y7G%Y{_JXcdzoAZHd(`5$(Lz>ttj5+_%xTnhda5-9nkb zGhhGJ6gh?X39FmI+v3xw-jNa#6T_z;6SlD|Z#p^)%Z^Rhe=kCH5JSs)<64VmKX1wb zro)oPKd=Ee{hh z5D=deClU`%KnnJHL+jkhz4Mm)^Qua0sar!FLlGtn9FaSB&sfVzBn0G0MNt}8cTU#$ zD!T-c$=I}ISVJmVtWk}i5HD(!8#u3_@vxAHf)1r=5MyzKAtQXlhf&C|P=t7hE@|$I zEN3QyQvF*LoLWvH+@)c6utZQXIHeiJIzmJY9-$Ot0Vk44QxuzYRNQ5IRLTmX?9f4W zl|+;4rVwlHjIAH@P zT~A9u7KT77asmVIDo2#wr6)xz1(gP6$ zJyZ7c$36b1cix0!r^vSCm~BX^43$aq%79Aa_EF_KJSr{n>gYP^C+LRyXu?izC`6Jl z*)iN5`*26Pj-eoH`>9v&cbhEUO zhmz3OexUI-2F;!nTV_;%S~;6nNp?X`gb?AB7?HOckWSsR~+ym?CT z32tK+jnt3OJzcW*L1}j?hHcG^K#^JG3k}JU;-}&AxvTUfupvP?LmWakPw^Etvm^$K z9F%>uWQP*CW;qPrdj%pNUYfJ2DJ86n-A)W4!FP;t5%m-U17E$t+okqK4~ow0v8TuT znzO9mIo`06n(n8gt~(-1ia^jGs2(GG>Fz4J_v`cl%4>Ui44cK4u7WEt+oZ#lI6}la zx7bNZrTB2{Ff`;}?zFgv2=y4o&7KHLFyD|2bOCF_6t?F*X7i*LW}@3ek`m)$RW^o;vzFMQ_T#`CXVWWyf@N7;*i zyP1F8PyLLIz(1uK{5M~lRe++InmmGEp>I=yDlVOfN76tIW#`1Fn6v*V!AmmBHsNWo zVH*dgq`!EXm;KU#hp}bcPKsw3`OP^R-C|xKeoEZ6H!Mq0-z3X{EGJ+wcLrBEJ#FEi zR>*6e34Tbk9q;j5D9KirqY>W4**NEb08KCr1znsV?v^%P)!HIzQb`dT@=C^-MHN}V z@mmAfi|d|Tm2Vc`O{=*Rz`iqhJuo`!CQ9#ANMpd5Y*j&Glep%qo8oIg{lq#{z4h4o zjf;3&xUtWD3=Kx^p(nI#AgL@7KNMUbyz7&u7(+&Jor4F5IB)S0IW3i#<8V3fOwkC- zxmf=v%y6)(tKoB~CKs5vkcMOB8^>#If5=`|H2W$(|50^K;zGpmow@mi{$Vv{_R+DYe`&D@&%dPJqog`Bfd z1?^CY(V1n;RhxvSP<|%Mnq)ng!Urj~fSjvQEkXK4Lmdq!NPOTzRbAR}U&Fe|v2OLK z**F(imEt4eaQhi;(}>y{CV~Coh1-?}dMWi)@<}BC!WtqOWYK84OZF$saY!wmfagZd za_CDy*h+}}PGtRQmqAL!Zi=xc5w6(_qre&2VpKF`jrA8mL2cRS0xFMH-Vu+KjShj| zT?oYlxX4=xDh>0(+ozeO17#U=3LJ}C!!s4yrCXAvt&Nbf__d2SBqf^VcV$c|F#~5G z%Y(=p)zgOpW^Q50mt7of@=N#oN!^-@;9tsXQ@;6!{@KOe@%~_sF9@!aj$8A-xR-h- zZg=bZ83@oq>{41uA`&$2K?G>P1wspa7$)SDxhYv>y)H-@9X{U`LvCn5aH{o!Ea>HgnhNd!S|;4 zeYE3JgCLcrdbHs}Noc6!AKi6HZOx8~yKldJj8)6%pIS7^Ha#l1&Ho+(!=3qOkr*Hg zuOu^U_kR;Y3n!FdNPwO4fi4Noz^2B<0x$TQra)|9%vkFG zla?-;qS%br;>5`zC$}|B)~`k14|PVr(X6CsddP(bNBtMC1{ZsS)8qYh=Zz14+RW*d z&z<{KQCFkiXZ9^$I#g0|lGQ*E`w&vHpPk)0O*c6K>p({ z6ckXrlu%TU%>Bl@JaJ1?lDOA|A+q3`ZspT6v-45?&Ak(FCLSjQYA3-|aLgz|IZcv+ zW6`wgyCV?jx@f8~V;8CckFc|0(=IVwZwi7mr2bYa(-%&j2SYYCwG+9_gGqr)4hQ4* zci~YhabOnxrZp#vA}+$am`^Mcu8o=n>zbs;qUG<5_73N+bpc5n#6(jQC3@XRY_7jm zZIq;EHAbr6cul=-<~#3q@||o{!lG97{g$LPVPd)r z<(h{=2Gk%%1C6JoMCaM%q8!h+%W1Ir*{`sd=VVGI(nkf8 z+IvE<@<9Z~fg0xb@q zH)BXXzp5tg9E=La7BXg8+`K7k`p8frJ>{-O%d1^$Q3?`d2C3#_3Wmn!(KJ9V9d8{C zETceb67PvJg6sS*Vm0gW_w};@e0D{1@19p!P?pTQqK%`7y9dk1tLn%Pie(S;s zU1ItHqCFye^P%HzrLa)D*7WxHc)n&?%QlV|g~$+&ITjY}&SO)BgCG!DUwoB$ikrrD zj7#$li2MR^Z7=kQ0dn5WBtIuaxYWKu$0z~dTF(QP#%b~$C15C%2tmbOf(fLkfdJG{ zwtPJ7%nfqGVAXsmRAM!7VCZ3j16Yiac9Vk)Y#2OHQ(YFuK-n@})7Ujh7@fXG2{aKo zp5PIR>0$he@;W{R4XrXrJv3>!GnoaH^HAN#D?}>%wC*6 z6OJHqF41gUo`OmrLt$+e{N7m;P>9wF-#8`p+*YaXAu&3U z2?cd0I4o*8UwkhHgc3>{cqYK%i4ZLWq0C4cgx?MC+*Wt!IIM{F>5Kq^o%*b!WzYzN zOGmQr|GsdG_1!m4vcqtLS0{UK&W5L%(}>*L-^#nspP#waaTovd=SDmLMf>^lJ~Rm#v#M+TZi`xcomTFkN2|e z-CpKfi<|026QPtX_So1Zyv!?I~w$h9~Z(5DmsRp ze3~4shLHbuF8`jurdxZKr}5ZlfCbl1>>8KM{h=tf0}$OgO1 zf`CRz`L=pDDJ4J?GP$o=t}bt;h|JHI&SF}Agf@iP+TuhOgTOA6qnxqzoEo0a^n_Md zaHeYJG&;lTdNK1h*Z(63|8FV?!xH^Z5`>qI=l=-8f4CsLbp2C;@RHjR+gf%zI{D@4 z6E;JaSJ{D~dbY%d$lkzfy&naIQ*WFg7jv+OchEkfS?egyjm5C^(69nNMO?BgyCr?? zhjL~(>2uxX9@|iV`H`~lM+Ml58J;C#(1ed1WR=5VrB_2>A-^RQ3SJouPc;Z?84=L{ zvJYh*Q7FnkCh(5lk?Z)Xnvrq(Q)o=ZbI)&iChP7HBRt@yGMOF!1;cMRLZOhFd_KAX z;rh-cco7#8BkI^b&fzI0?BVG6aBzq(@XW3hnE%og6Xc=WZ3>93YvaQ!qXJ{N;3A@x z5xs?szMm8xwD7~?a$8MnFakP00)K=-`BT(M>Eeb7F!Gt>CObDf8Cva-qrHA}vc^_? zh3s$Dk%AN%b4byeU1%9gyy7+v%Fxt=GB;>`sAWVT7^A!(%mi?p)eYnnyFOQos&+z+3j2sO}J*pM zhT|@*7lZE)j?O(ed*^#~v0Y5%C~=C=fJRc`_xvHVFFhwNnDfy%0Jz z%2nySJ)+|!fpN(yiLjQi#%l5T0ZS}mDt~q&B?rzd8O8bh&3uw9ZK?Gd6USTS`IZVy zudr=}Y)3gDX2r!10QU@-e#3xa-KJlQ{hSz^uk6>|L{NA&jKk%T2CSS%OEH!dD!d6q zHfP1k>3mzh&4sV_NJcA`E96MC3!Urqj^#2~Rx-0)Diby-Ndc!sWM~9*WQleoiatq{ zI$e{$yY8>KtqwWB91EUL92|=NMF{ z){8kIN=)W$vxFY@!9?zu&1^9@3c|;ii}CnG%!Oen$~&-mBG~_wedl*oJ!&Kt-S3y0 zMIB?k#JC-Ag6vVIx2Bo$NEbc_9!+>b$egbvi^n6+UY{P2|*Iu*OJQl7R@Aq>er=)9LbhL_5@eESFk6Oc%^ zceSoP2c3onc)#S+@LVmqT7Cpy-hF<)$Gsh2; zWkl1r(ro{d>t4{CoZik$I?d*54vm?3a@MKQq@-Lw7RSHRO*QVIG}om>144<(xxmg? zxua)LLj%0^&I?s1w9m$N%7Y2?a9Dr5a2%PRxeJi9)VWMi94sBNSCAru;*9jVSUlqT ztf_kt`}Qor4@c?MEnzQu8uvAwDTb0=-;L|E;*^e~3iNIEXRnnx7Nkf)gBQ0|^*&O4 zC@-YpWra3T-VGsF+nHT~Z0k0cHHz%ljJk3Z#psg#smZGaJsvd>wZ+A?DuR((O%|o4 zE)7hRiW7+Qynuh?FT6=Pf`q-ruqWn9XhTpfm@L(bw5M7XZFU7J-boBL5Z= zBn-(WGlhC{&#LY|Z zxp8dBB5YWtzTs312zjeQV-%Ko666y}>&U4{Gq&g#sUj<2Vs&jAF_}YYl~IieXM~-1 z8qY2Z@3rf=?+D%_hH?nG$6_{uEE>87WsX5MGg~5^e6j$_`2=j_jd$2Yx6}D2^=i~ z@+0NhO-C_sU(;F{sTadrB@aMTN&pzuf_}Csfp&$M>ets)_`q$9-4I(uxShmLRC}(4 zHssv{!CYv#ycJUf=j29jtE9wFahW9*Xs}5Hz2x8Jin9!ufx=u%Fl5duo0AN{@R}NN zvsvyGJ4`4Sle`gJIsQg~2ex($Eaj@M-@Q3-TDwCA5fCa=mDAv3JKu+1~Nd%U1_`pu*Zur-PGM{k?$`LC5e8 z$SX&c?r}U4JA_uZ9=YV*+zFplp>j4aCmj5CuCl!rl5H{pC}~N0?90-sL9>E&B0e6XUt#r;%0<*8B@I1T}hVUIdG$WHm`C<4$TBJe% z0t50e3Gy^RKYMmuXZxgOWoNf&EIr8qBXbWtKZb1^e=K?EF`OV!&>HtX(@Jqpi}@V{$fkA{ZFNeT=MTJ7F%XV+Z~_d{DNzLMG6-OK>V=L*;}jCl zT|4qHur)v9is&RwA3;M3iZU;2A2UuIjV{exSYd7;#fex5zu`Euv+dA12FQB>E@ z>GReOM!6nLIXJJ4l};r+d34|#lHvJn8hKL>d+H@#dVC*V(O1D-F*<`~*T|S(pu~Zy zvnlM0%uaw3gG`?ARB>((ei^-%^cBFooUmc%iZ?oOUJAWeIhWjYzz)`)NQoPbbWL(~Y!-KQeXM>&W7%m6E zjU1A>nbjgT_HR@J2$;tNHDV_s?wt?fu(<-T(N(Co_ql>d2`lo~az5d=0gL5yz z1SbUrF*tOX3IVPv;tddJM4_PIn?x%Zyv-$(1+p0U#=M%8SN8tuGbSXn5TcN6;!_Zi zcD}?_N%Oy;CAz>R>cSN0bJ+Z_%3ea){0~Jw%MK-MzU{{#0=pm=f1t>70Dhwp_(xQu z;Q{$^Z=qq13_z-u+SP2uf<&b$Bw@5`TVoTLBybtYXyft{;tm{<^O!Yuoan;3+GaV1 zEg>9G4IsOm{hu=eAX=_8M=&)c(wsV%!b&|Je1qy#2-pVadZJx}YWqqo7^d7fh7lGi zWhin@WleaNTEp;>RS-G8UCoTW5Nw60BV3!}W>|gJiLX#VJfwfdr#T!PLe%78|ET}{ z;Bas>JdY)<=O*O(vNfhH9zL8eHXyv46!i(lOT)VsTmp}9K?CT-Fbx?1 z_wI;l1HRi(YeYc^^yryw&$F55sCfG+VLKR2LGW!KuL{;`sRxVReB&fAN#JuIqf`%+ zmmp3p5p@-hn+-1c=tJ31GKLXy(HmgPx8uoNNLBp!r2s+eMV6+I7W>l|NiXes7`32s4rT>%pm zgn$Z8W7Pb9TXv^oAefX^;mmwJ0KS=^j1ZWHNQG2sSaPi$3%-Ps=H5mG4d9s~C9?Hgac7+LmaEm5zx#-QO+C0PBI@Xq~IRJvz%Z(Uts zE`(hqlzq56_V4R$9p09ZO;M1Mp;_GAAOas=^nB^b1TC#MVyGNB@dzRR^_~TdP4EhO z2*ZpQn$@yNslB>|ddcpVf>JW`_N;g|n!dtogeKu8@N=z{!_lr&)>n%OR1t%WKS-FU zS;?@Kkhs(2GEeAsmlTgrDVrBqCzsqL;d4jn$YZzcw3TNtK$HkcKD5cm+5X_<)Scwv zU_VgG8!QQ}O~{#S8RgrT+&OtqY$=E^Qw8+KQmQJu-{w^faRVWI8QHVR4CK}ukjVnt zU^4|9v;ut~H74sSH?kCJ2kwrG_d&V7tW5~&8TA0_7HvY?g#2+{LsslzG0)MU+edp* z9|{O8CR56j849#Rhsw2Sg?IF~0nW91-RTC@?B?6ves9>@175td6`SK|L$vl5+pMUG zY!CMot=q%Q=0WVUOCjw^cuR1Bt4FpKkb|oCY9J)XZwZ!A7DzNtTfMxc*03Q*?X{Ji z8kVX&*r1fIV~ceFcEYnJ{Jfp@W{}R>wmI2knv1%Vz7z)wI}IZ<@riA8RC}khaqf4H zs399z0+lgH3~NB#xTk6|-erXYK{R_WK+P5XqP<0uaE^~K^dQ%U^GkqP1kjSq*8`3k zcf6nFuoVHmHi>UZ0KJ!r1;GWk#@B)n{Lw(I;e7!%*9v>#ie&Ae1XC7I5MynopPW*P zx(EUYI4cK9JAv^GZIPp%l8k!U2AEAYdYrh^N-^4sV;TYir?qA;pWp|TnsQ*Uky;Hi z>Ly}%Qe&EWjEzRc1oQEYH_oL@q$T zN6XhgTzt|%beM?Xf?Eu&1xxO$CAeQ(`SjGgvTEyYaFY|;GwYHp$f$MI)B%B?za(g4 z^yjJ5XW1lnC=iN9+F15Rh7>vN5NpH&2`b6NMrxQ!MKL)A!?Xitv6)L`p!#|9n*a*T z3FowYmsqIe+l}1~{r{Mep^mkG_Ki$?zYh zk^_B#!Eun>9z6f7^LYVE7qH@XC5@n=KS@JyOUoaAF?32Rur1~Xx0o$A1qWIspZsZRNIAqUY0(JiWLY=Mv(DI0VyF36l)5f5xT6b|BBAV%-|YXRx3^ z)QWSZmlg8dIXor| zIPUXYJ7vk)TfY&C{uh8Q2mpuiYhRiY8V?Zcv}cTaWfucHg*G+NM;U(CSAf{&Slvc2 z;dFT5f)VKDvx*{+$cK*XW~0G>yD4n6hQw@}s?mXW6x#4F>@*eKYyO+jJvJ15IUaA2 z6P^505LyYc?6|3dJ%PkEmLkwGaZ*=Tq|k2Szs2eIIF?ea?QBkv%~us<^3No_2K_vy zdEzlsF<28+CPgaF(I>f~aT>CY7XU!HL2#DLrB(NaLM`ZEqw~1Hh%Cl-kcQq;0}4Ba zi}{u_lNvm`EX+X?RK1NeGi92=U*+c4KifMvaQ~X!=9k5sK>Jn9YAoSl_j(S-P)23r z(MFi;tu7bb*&UKhP?nd3H-_EJHeh3IDEAsCr~`!#SRln>1+Y9Gf3B$@UI|8U11o$7 zg&Ned;WLpSxrmyW{W7TQ!{$cBsK;L52#j~}Sgqx*xn;GLAu3Tq0g8I4tyAS}?A)CQ zaOP%nNash`M+1+Ewyk9-e-K!wxtX>gG8!t#_{a#E7`!DBIj!tLc*qth9(YE`SG~kV zOT1OPf*(gBwbv%9(l@$Pca6LE)pzxReKu_Wes$d6zZkq74vx+aj*rfJyFG-MMj=ZDa%z-ik zX(uv5%;rQ&N(J_`1wy!uMYOY3(KuK!y35hzp?$SmgL_F@8~6)m2dotklELR6dj;0^ z*vO0zJ!jDgo-F1OhaoNNn)q6mEY%Js_nhDrZQ&B>%83Q6ZwTg1BggBu8k3ia;L!6{ zoGNDpEv5?g5!CyB*CHhjHAZs?WH;coM|3Nksr?S?F9q1%DIO7geA@+UH;%9v`bR?u z+|saKtsWtu6G`}AawSX(aITfjBxA&n>iT*Kg9YQ)^>quBZ;uj5ia6l2bxeF|MYmkl z)V1~Px2S^3aNCEG$AvbJavr?-SYE@)&nZh5#+TnXYBu6l7)74QD8O75n84mPujP_8 z6NAPI7RA!s>!$dv*UHY$7O#=8W*xe4X&$)`;r`TXqqXoXzD7YKK_tgoHw)UVV@IJ0 zE9_#a=fV1tgkiQZXDeZ12Ka(IYL{ciS|i09_||uvCC|hX29H2XVXqvhVD%3w z6WREwjcICa<&tzp>X}9zX2Y}cNSFrf%TA?fc+332gbyOmltpoja$ccb!wDpJ%-_SQ zU`{DIJ}TowuqG)GV0s>o9~QWY8sThlC%Pip1ilaND=Bz;- z{NqCI)5cd23dSX_ST6Mt6sojDWg0`~N0b-bTC6Le3G2#Jzf;0EXN=W_kAmoq0``$yj8Zs zMrIrsNk`+dA%lak8f#9%=p9Gz6AXUC?1df3b+)aOp^72!spf{QS8`SOOt|jk;6@U{ zB7Gx>dT$s{wxtRM`D|AZa5YXn*m;#j&r%|&*$T=D-AbaeVQ>C2OA6y^NLew+w}F*n zG4)^^%=)6jD8d4Ge<2}GUNLd5q>HBj^4i@ii0#UOqDT^D>mkfz=NMslHZd2BbvS*Hp+E$^0d%Z3(GI=bL zlQtd$6qHkm)`LPz`F-Q9t`a@y7^M4gf^6izTJ!*i0O&z-P^}rCUc-_|ybX$6)ioa{ znSr?bOVRYQJHArb3+j)Z^l)8%1Y5b(k;be+3=t|Ju~$5H6Ub-7k&v1(#|@H-;yx4G zhP&|a#7XUKMvoqVoCa0OBdOwpdo=j)b=Q+H#*Y^extI8=^DSud0_?7C-4ow+zBj2x zi*XTsOdO;idB)_^JI2C@@Px^bJrkds6Bg1kD-V7-Om2ITn-=HvX zit{4rJ&LSHh}w6-yA3ePcCX&N4`ImTdybrOYM?=Rz+Ux2?`Nq&8QlZu18mc1e}Fi* z8AQ-R)ZLs&lOl{2E6fiD?SgqDw}1sDLOc$7k^;@A$+ zR&5Z6U;}gEXhdfkmDd=yg_GgQyB>YiM_NHcq%W>|f%ZFYp}h)HNRgeOmrVq0L|OXLq0M;c{(7NMGn^{RoH=!5_Ti6r`&V!5IJj(0%`* z^+Lc0oI*1D(Ve6o1vo)=pC1NIdNPiozS^rFqR9#S_mq`&Z{OmDk=>g;}cweleXWnTH105-3D5KzfqvXQ3!@H}Uu+O%Ka zL`dft_R=B~{=?(G>B#pZH0~SLt%5}i*3g~Y<*mV4aH9xjiGJvgVTXe)?(oG&Bzwvo znO{~Ps9LDI=_FHRSG_h2KgO2?$_rowg^Xp_)+si?YmYY$A)^`MV1hUtggjmJC^jIcL%2x-7;c$^Lry@L&o7k!T4u z$_0D}GMMj#+-7y*%PY9{%+G`p3FxwnZcXsC>>mXNNKw@d1~$MD!i?U0PlL(cK`>^W z-=j~Yc4K|>!{Btl$aW^^OhZ;+O{K&Wm>Hc?B106Ua)0m^vQN*3r~QMY z;l<#u*{@mGkDLN@F5xhnq|U-7R5tYn^KWH9C`bllD(ULvd4<0%8i`9Dp1vNi*{?Sw(z3_u7@ z;J^VFRLe#kx8s-e%25m2>40=}?F zmT~$VG~$@#;52*jlP*JJsrwl6C|=yZV_j>2pki)d$ba}pJ-)dRByUgDbO<#+M(`Ho z5Sdg9Z6w?do6&8KxSXbv02WSZ3Tz7sK;tNDNAC%GOPWLgdqmb?_X0FTrS&*+946%> z|KyPFZ`lmUckM{NMZ^^ z)}W_R=7Z`jb;S{KFlhG!7V)8hqC=pel)1vmQZd$tur|lMBp_3V&+~(GUo;ZZyD2UI zTehh}&jLm8t=;UKZ?a8j>$`8=F#ZF^@*LaV+S*b^hHQbnjs&G1RDvi0=k+Yoz*9u_$M?pqiO~S`sm=VuLpX0wTF%PUzD2anvp;eWPHer%swk!!Bjt#O^L9f6Qq$T!K7!r zMEw!L1;J8aR)gu7dn`If%Oep!E(Kd5ur(MH7N_v_0^ID#`n0)a;59K@BX3CF@cEgT z((DUtV2C7OeWO{Mpr!MO&q5IZ4y(h15c(gYGn82M`3Inc7J`J;p;!Z(*rL z1TlfoEt@pAWT8@PKpS|e(B;w$?=XV0c2^^@7vB~uXx?yxt6{0qP`$ut82#hf3j93g{$Rx(dYtsQpLqbY1% zFVLXEN+Zq$paRVC0`_O%$lz8xE%-#_?Y-8`rF17g%NfxbGBZi-cQoa*TFYx*^A&My zP%Jdj2NfY?^6V+&T$UNs=;X)~K7ac3>!(kj?`7vCg@6||*)g(yJ#;utbBuqCpr`+6 zpr;A+uyr9wCGATwZ6B8}1IBSH`Qy{4Pg4OdjB>)$ps*ufr@7ojWK*Ldn%n6A0|47VE#tLanj-(mvkgvF4&(AD%s zIE;Q({Y>c>$(8a#UX+?hj`v%gn>{-+4F0z74EK}K$nmZh!7?sb9maMX?zDFU!A7}! zZW2HZINm?9ojkq!zE0NdeycanpCNk?nmg;yP&_S3J+}QMQ4MyS@*|Fs6{z&i4~u&6 z!oPw$5667aJKuMQ{tEqC@QW_|tlN}cp!nUB%Ym9#@}RCos8~es{7tPJsT#mUFx@Oz0L2A-lmkAiK4}`yo;K$Z zx|_tuCEJ0L>l>YpIMpNr%j@fItknUpb1-so#jO2>e$G&VC+~-8c!-##Qm5DywwHU6 zQ3tP7*n!Fdma?h?vA%LnIgh_1{it*V^9;+M;u&i-}ErNB>$eTeE9pmKK#YXhmU&t@Yky!){&om zwR##l^5?7P{HELAe~k}+wZ@zef8epd`f~L&j!s_k!>i|f*89Hq_7orf!^($`b%9^4 z-nzqc0O7!g|G3`6SjX^(r|UcnPr849c(%sFGUq?6K9pA%$NT-mljH2!mrqkU%#`?+ zb>m2W1G~8$y}vFrX7AO|~IP@D{p&Kjp8NSB*&Gd_eTocN(K z>TwAI6d`l;v&w*NlX3F)vJ>PTr%7@jHOW@I)P$IH01_w2Sp^d&h$x2|lnD;QN-`~U zgf6slAabg=XStdz5(0M{l_Lu!NO4LI!vwju0DeoxgZs2l*K{AZ3ebn5VkX)d>=B9{ zHuJ8O?roIn4IAY>*`PzNe>9e-2iCxm0Z!tH-3CTPkgC7K!arBCb> zlq=QEz9>;z@kWqU4}md{ezJUg_He_xH!yEo<{ksJ#n)jAcOh)e8m0159@RE`$~-P8 zI#%x+x!D?$Rdzy8)Y>E$uPfYYyxQ3JaaK*IOY5BA37$~Bylg4l)8$}YPt@COYp)Em z=EdR6o7e{df>#Wuz^|IOqJ7<&cGwz7Cd1R4oRVzF)P8T@Fc)~6nZ^@g7mSv$&Q1Xx z{a?3PosZot>38UJrK#z(jKNYl#erIYDbA?whh&lwH zq>?IT{wU^*h^Uuz0^**k8TB(G_%H+(bEk5ojaQEh6VU(%LGdDs!1`{>@+Xp3G*T=~ zc5v6|2&p|V6hB!~P8A~Cb72JND{c`MmpMRuJ_;pq1j(BcmJ)@BEnCKb;tG&u-G%Jg ztVRoD3JDHITve?oE<5=zKL9L_8K;NGriEZya0NaCfa$`6#4TT_t4)`K0ytuxIrR!| ze$L0*120Og3Lv;CDApI%sKZ66!8xkBJzcO?L@upe$DT1%7tWcw614VVBq*F8P@*oZ z$H{rBq~&iwTpPN_(RCHgC{9-)gM-1a%w$oa;E{s4{H3eSy@SQFaycx<&K|&`(5W^* zB6e@$WF3jBQ%@91J_v%DFq}?5a-IspixkdFY5@%cNmfS^+BPuAVty`Mckr)GbNkCDdKU&B|eU!`Hd<07PIOTA0 zJ{-dT=WGSJ9BcU(smN$0Ka#qns4$X#`;TAGtxWc`M_cmYY0J4}+X>Qua2;)KS7c{P zemnRKST>HUYAOa|)8KPAW1l|(?}#D$*r7FG6XGE4Z~;5S%3$VYkwYxD z0N)@}wVqMRD;d4yS;N-ZP78*rZGT!62iZ1#_QFDE%HPoqTL!HVq*(h>)4()xucq{| z6UUD)*3rZ!t77-M@)u6 zgG)_@)}}UxBg{_4R6rSz{%Eqf1lkiFBbd$AVf{wmF;H6C?Wfr$P;w~ko7{?8z}6>h zvUy-HkQj*Sd#)bN_|sq`+*Fk`jDIA&S?IPnuZ!^r5rHZ55w$f|dOZkNh6U@l1dHf# z#i(`nBs?tU{OM3p%f*qmuVn1D+XKW%&IKs~{X`583CK~M%ob*}Ev6fi%FCz~Sj0bj zpF_kx$hM_kSKI%F0{N9tAO;LCdrk29{R(i>QE_>Bbn-IP{r(2O;;j9D1V7cH?R6(j zNC-AGeVCMEr1S~!c&PhYRi10dQV_4osXGeq?x-2xIDB$)DWuPByQLR4sjRhrn|gd0 zjm@@%)Q=b(Cso9nPa^0;067u<9kMnAp)&jn<|YPMyvV?K2|jRTGZ|}0N1>iOgSltn z1#Usx6tKN`)F#gKA-DZtaVN2sV$P67EqE$0aPUJ)fWk?2X-p8DhvvxKX{7~cM)AUn z{r<_>H^CP|dE++?sRje#hV~qV(0^PC+rd9_|3|tsm{m|Z^;V0DxLZSq1t|4;$ZX%Z zUkHrpoQxoU%Hb)`YVj1$e?cKk9XJA82mGd)?QSv*6gz- zZOLmDefni8m#Z1|4*u3Xho&d6iIVm3uG{Z-_g`Q7^cSRSsf_~!7k?Zh1XB+3z9kk) z{l;jL{ob2X^}*I{FJNObqu8)hlQMz=$EMVQnZhQzIRY7n!T_$Wa1gq_1aZ2zY-k-e zF(RIh6kp3=dio~{Yu^dr?ro>4S((q$?|+GaW)^)0YJ_3s!})b74PufSZJof#*EZ6&RJq%-Pk{Fki* z!(yVYirar7JScs(Z`o7$tkiy5jKXf-w=YeI>U9otF@2IGV^ z`z4dQC3owZ>6(K45kGih89_XycVN1dHxpoqL012}|>@s8Zuw+ngvjRKXI*aj5u!SdG5JNEVi4hwJFPxT2q1KnoT=D#eO8MDEN>e~3 z{X?0DNsR6lc)p>8x!>Q_H}dOQF-BETEn#2WMMR{n90TvP(H4C*a^B_x3^YPx7r;uY zp|^G5#?jDVg7+2346l%_1)E1bFXJg11z6|lzWchmhaTP?+f?F8w@`$1jmMk)QFQV2frwiky&_D&xX1LJQgH| zp|#@_XYc_@;T&}?2gLb>#F7RGgryCBXHKQaxlf)GB;{m5mHlAhj|&Vkdgbqet@o9t z6#6(RP+nMjO0*T`nb)XHaTWnvTsd)C;2Y7sxK6iu(Md5mBep)Q5;=DzehX{WQTZ`^ zJn;AGs+^>|0-X~cX^;xl*ad$Nja8Kxi*h{Qb+Y}PJR9~35Z)+Ot>h{pr-oN{0WE>I zscH6lK4r}QT@q8eJ))yk)WrrVwyqY?$bMYp@A0b59_i+U+=eTeLgKmBmiBGY)Q0`P zk_4?&YuhQ@6u(LsWR%xh(Fyb}msUsM?;<9K`>;^aT6z{!1kT%ux2A247^^PviGA? z_il0Uw$J9`DD8@Kks5jrmTDDkyeID47V%leNn$>1_`J_&KAaZ-Jz=& z-NMx5XqXg3)ydLfBIpOx(k?{3njIx&+t_GH zuva2wI|YVQ-_k994BGD2gys~kh14ym%E89z9A?~*Fg&Mh>Xx*a79ue*exM_=olFB0 zb8HVvX4$EL?Sn@ed7NCa(&P07j689TshekYjZt^_b?ppt!jr`NJzGhmB%s%!QFne= zXz>cN9$E64$RQbL%jk5gRrg2YpaKLKJSh;_WkK#L$3SPh5KJGVH)#PDz+QIj$sPxz zbh2qF&~fx!_GeUy1+7;@+Z_-Zgrje@!A6>q1P~wg7JJcCZ117GTime% z4%l!1!4uiu@R4!#whUYSmrXZ~?`>g`T!|ut7{mb<(u0Zea36240w&#H&1hUgdyXCA zCqLje8L<>c+fedyZ&E<+X^F&n68bm4TFS4MdTZA9qu^=AYCRP~{h2bNj=7Hl6LNy* z{e-F{GQC6KAHOZrBSn=iB%z9@xE|esPvm;age>RNTH250eC=0%1IpOJbmC=UPzKsO8nZ8MD9tjOzF!NaXFh&a%&_rF2@a=e6) zakS=rPB5Ec&>Pe;j`z$Yv)EruDUullW|u+wCasn$Wbi4a)_ zXrq&GlU(8Wj>sH1E|myM;S?HiDQ_BL!3bjdIO`rhQCW;fNHQh2$cKU?qu48R5369{ zI;k5p%_#~7qAiY*Op=z6xiAGL2a-y?6aThhe!Wh>ZqJn}0ZFM?C!m-KX$HS=uJlUH zK&^O(9-SHuDG z!Caj(Kx^10WczE& zTi`4MU=3Ivfun#k!{f;uQ@IPa5C)iSfIkI4V*FQ(g_^SKi~g(KucbuW)>_TWSs`dXwg-M?lruL5I3vpX6^_+omtXgkBGD<%3Uh zJz4&~I2es7T*#S$#(0F8!_!SFxN`%QQ;_r6TM;G&aQfxsKNqt{9-*S9(>9)kpB63E z%%|fq6#(-Yz~zG*5zZ5v6ktWbePx1#v|a6(8-DuaNfa)Gs=F{P8W^vU9!1YX+n%$(UiMaS76|K|5mnh6+0mF5|8W2Ua>B^f z=4I)ocw3bN&m@GPfQJaw59;m#XEyWAb{dyC2x9ZiXb0;EXxsdfyW|N;EFZvZnjIn; z{&wu|!2;KL@Q;}=>=5mW_C|7!>&MC9c2-Te6EU_V;~LgS?&HO#5WFW4ucRjy9!R=F z8Wxh*xSTjm0k4DS`J`-5fnh;#1DN0fQ-vk})l6}(xf;&Tz>jEhr(Wl>iOr#d-oXa> zp)+u0TY1u~&dUxVFq-uCyOK7Zc!r{j|oOlY^+mb|UuLvcMWMngcO$Fy47JXHrcC=Fh*F_cQY zC#7qclGW5030@UgkX@oa*j-=r&wH6%Hw?YuBfPrk^kyf%@78lMDIahWZk9i}Yi+tD z9F9DZ%J~jGHw(VnJv}|>y@I&C`wD2ZWcVUfq!y-a;k%o=2Z>kz^lWpRs{ueJ193LV zhJuj{C$1A2m)FR@0R5hdve-<;b@{ENtOfMTU^k)vrI|@Ug|E8j{gywS_4Y5$&JTa=wfz0O-|Zjn zU%hc7^v+g1(|fc0fs@nT@$x55&yK%e{>0JQ#fl+TPQ%^FXDgq0zVeCBmp|b&kQHBX zPptTgd*bt$krTKfI_5y9R5Hl68b^+_o<403nP5|&B<*P$CNXgYlVjr53^wL2pm#!= z0wz8%tX~U(iRT%r$-s3YxLYOE>sE=kaT)xU8frH{*flJUw<#EkR($S&7uy(~0oP;z5Hcv;Nr~ZG8}_mc#~l~>2g_i9 zG-{RZ1VX^Q;FQ@YMJ7lvBeO-mE$W=I67kat$HcTb#aammCW@1cPf5#byrg_DMoMnC zotR4`Pp`w`EWJ%LCeBDF@0jOxa^WxW`U$^oEX zcASQe^|D0K#+7r+=@;G$11kHxoG-YQ0C{&3b^x$QtdS?IcsI-GxO%*!Oo*AXQh1Ew ztzKVM`$;j#5Na=hJ{S6;I`Q=JZlfF|1UG5^SySnJ>p^ipV^$v;KBpY;;k{pMncoVf zW!QCd`KK+a4l-g?N2$Bg2WOp9t5skI*kDCcB{-leaR)IKT8y-gO|l4Q|9!9DSb%c% z2PFN&2^1#~pqnahkMTm#g-H1KVVh5$syfq%T!hP~e0JiK+e=MEWJ)RcX@=0HlO{-c z+#9gbU=XUD1~ayi4Pd`~nOJ=flcIj*;_KVRdw!{iT6>^ho(1b~%-CX*Dfl*zx#uTh8%HBF2t<@z-Md8h0@#+wN>u9RWP2BHwr*@irAjSOba)xE^bg^ zseP5HEn~8?+P0xs&s=;bX)!iQa|b*n1f;NT0|-ynI7#1v*D%AS-!g6>QS|b_p$JT$0a)Te^G7ot`V1P=r}4n&Obv$uhqH2g z>+3c>f6NI8iJ-ESk{(j<$f&Cj2te+^)*~ejiukb_hxp&Zv~Fh)nujP46e>C$&u|91 zAb(jQJ#aj70#NjXE<=E-WCb$Sj$Z+_G}(R; z{mE^u`AcLJ%0qbE+iVYVzZLl#2-oec=*8w^D0kD(+37fmyvATCtXB^PVtn;eBH9xV zrXa4#TKut?LH`J%@H21m32#e@#Dq^#Wnf@6HqvA$=b=U(?6~R-c!$Zc&0@z8hLY4T z6esL(pBEW$;>Se%cM|}R$>hTiC0nwj@sP>O;sp&9_toY+Jd7|&kXQ-Tc0P7`c)#g# zN%92w#=`uGgWk)F?=ce&O2Z#0tdX{vWf>Yn6Y(m7Et)|&3O_=8#pd(6CywQB$W$Z$ zVm};^abDP^H`gB7K6(c~lrwccu?Gxj1DGa!0sgy_S=F+mfuz9QWkqZ=mKSRnvIQYD zHzx$>0tonOKp-`ky1gfk+_qS$3=9vmrPBC@egL^C?-FEu6(B8SgnI6zEl&Y`qdp)* zdnwo{5FgU--xO}d>0$=nN2YMWPITIqP1afN_2c{5aN(f`PhvA-w1x-$j2xSo{{_C0 zLA8K4cisC7Ou~f(CIYMn(J>oav(00cAr<&Iv4=i%!@pe2bq;RRDii03@fi^rkmB;_ zABUuA17S!W1Rp@`f__wp1Dt}=w}$_4)||=riTmLN`vt3YcU;}z_fUW4D8e*nhUH8X=%6t~Z)$4*Jkg8Tgr4oc zMqk=ExWxY&Eol=;Oz>Qz8*QA(#N&OAtvF)MK5Lt|fB!kX{{{8?Iq7E?=e>hf??HZ) zeUHEUa_+RZ6GD+(F#_aI(Fk7#GoLwmSlu}uUaubG=rGqWkJ$Xi3kW$HQRBE9SMVHx4iA^JRcf>=;>P%F`!kev) z7Rx#js<#b%VVEeKqhu2;cw5hH>oswsY=@D}Evrly@vBhfWV3%vE(^sRdoC3Yi(Z z9V8Uv0}GYd+e!rLit!dp(8SP#Ln$(!Mhs%`J;9$zA>ezMdEXB;fTwrABvg6%JBsw) zn^ObVCnYWGf#h>Vwu0?v($^4#aEOQ@IQj-7lu_P71=@zj+~l#Z46Kw_hVGJ)wkJmC zQUinEhmfelF&Jmmo;%7Ev~`+d53-ArXaJRO?zdJ2M}iPnLHp#|z^o={MS>)(d}^t5 z{5bi`kh*MzTJtqOby3f{*$B`Jr%=EWp%KPJ4=W{~uV1QqphI&VYp2m~U|et;CauBK z{9bC^{suCic(s4rKe~E#c+|T(JvlsfD$*sdOX#+mnv#BMY=p-XH>Wn$putKnP3O?- zBEbKZ6RM{`STr80ki7CQERm3b0k4E}|Noy{oE>+M{Pd}AxfVC8@0v^CoybephHur zxJQDiGR;`zH{k8Kk8S}8ZtU?v$21${?ha{WIsux2lbI!8Gx*rd#-{|07U^39)~A_>tYdP( zszhIi+I-QJsoJrc62?tZr|1`yhJ9!n0V+e1FV5XVo;ikb>#*|?*75peX>_;xH0+Fl zugeMD6^?&RD4V^My7EHt-?))lEwX{iEP@U!1dzkP4!->VdXLNwvGC5FGcstgCUs9dq5&AHWZ;St~+k!CZ`x(TcO|0I?!? zZy+y;eahj3)(0%zeWH$O-Wg^b7jDZiT*F@vca`#6%b9E+=Vbdm;%$CJZ%T&|Bq-$k z2>visdT4`1@~}Td3c%f@N-j#in2gK!&>o?lN1NdYH-_`!W4Kwkxwv&AIWlX5NH)Re z)^mzstMeuFx{%9d$)yXffZVFRy}h;W6reWpUhczQ2L5heFeHsP6~fX|wNay_J!~2j z$YzOz7xyxBw3`tbkklM6;akRMB?`JZu8c=xY)vVd;7hDGm?|Yu3A0`;_Bu+0H7G>3 zileIIZA%NP+8btbzjxl>@1KEEbryND_}`bUuYe2Z>b&cHT5G;?=6*Uk3*Y)`gJv{*S$V{5c%r>-O#FUL5tW4v)|KU1wsLe}8QMO7Hma`{S!O?uC>6tJfzd zKb*5;rG0I^m9cH5`Thm7|}!Kc6RF`MmWN*zdFE z!Di3CXnp16w14>K@Xy`8Q{L>yp0!iM;W?Y%@mIcD`)JSi&$|8n*R<(&i1n!hRb0@? zUtJvUo7q46L+dNNybq|lP&iikI(|h*EwI_OVyx*gna0Qj; z=dVwW4rqwhSB`s5oxa*XIXk;JwV!?7PLn?#yo78|_g?pVO90Q?X%fiSogz7`?JMmx zd3b(!e3&5P=j}9kesbmx>gvs#?rHc+J53(GIXw|adhp5;4%Iz7$1RIC;CVZTaz{bT zqJP%w8fNjloq&jS_IfepKVL>b{j;v4_t(8Q-7EKh_nEysZ$JH`I5;6+A(}gKk`c;3 z<@uy96ud4!u+wJ$wis~mH4&B8w64HS$w40&X6yvz0^IZL1R@kRr{PsM6U+hE%-lG{ z1FoG^>VfT9!%oimEuni8<~Mg?8+Z@djO$mqhi*N{rvQmyD|XnMQB0)w1DMLy;(A={ z{&i77ViZOlxh*9YHjg9>>O^zx4N+?<@S?BKdQH}Fd0iaADY+UL#?cK!E2^GDzh%E! zOFjlR?bdPU&z&RtLBNfn&mHg1Z`CKq8LH&V-1##Z_;ij=U6rSb2j~jH`R5n?S6}9WvdZJ4X_PMQ9)Th^i41F7ysP~W-S;swfg5c6nQieS)aC@FsGN{q$_|m5+ypj}Z|O`i`*L}$W0H>G zGHyjDi@&5&=AwwMgP40qyKpFUbmm&%{zu!N%aL__s+k7cF-k6w60ms~f#*##6Q?Vo zrOM}uW#aDKO$psu$RLDR@(7%57VdIUb6LLSZr`-ya@to%Nh3-|ux!oq%}L z?KmB7`^BbDbG6It$feRU6NDq6R9K*bVYZ2bZi?p)s<)^w3&F18+nfB!%}%ySU)>}_ za?^c$(=Fl{ysVHEfMB!N1*W?||Ac|`TE|{eJ~2Z%N^bi4%)m6?hj6&Nuf^bYQUX4J zuR6k{Iet@P32w6ElJamE6DH^jin-dSi#eLOmJ1_P94Czh+;uPW?dQPS#wsN8n&3YW zCG4ak_T3nEFZgiVM}PmjKR$cm3|05PpT964#R5$zh{$Ki5IXv0NC72szh~4zh@63c z8wn2c@hV4+1m^1G;f=G??$|KZuo(W+?e%kgS=^LTv2Et;@pXzhcy>1byh*YLzpv+r zkiL?Xe6yya+<}st~!)Va_{HPjom2v z1ldJ|n83~ugP5?)7ZS>NPJ>BED%Wo$Wiby3y*%4Va9x%b^^E-DN%K1f|;}*+q77H376yWH&AEwSg81d}*FMwEhALrnq@eRJPG*;A1xaZB#6{a;-s!uMjK- z1|f|zwO&PSW~CduLGq1qO7U(r+VyoBgg)(~#DE$?J3{X8>q3ku$ce+$kGa(8KnM%( zwp2mQ3Vah49Cw2{Y3PCD6G)&!Z*ya_e9$X?`6>EN8!xyo-^_36c?d!U@1TATA6j-O zqIyOx*TtSg=PjA39(*Qwc+&OITpab&qUv4QZt4VT5uTrf!VOD2XaT6VA7;sgedh%a z1KzjqmXj8WBk>CFb|iU6LD^vt+F<4Ubgh}&Q=Uc4YBb?-HMG47O6BCCH{G}LNLwBe9KcSz=4DAlubgoS{KT=ckd5JH zCOXwEV_%-a%&lg2-Xs*>v9}aqZ9)CZg?({%3N5b1yA&05ef0%LjtQqw#4|lZ{fC~jZ97vuv%l{r66@;PUcrh z;_VKHnEM92zF#FtIBvV*$+xe$+X5v%97C&f*!nC$2D zCvDFv)iB4tXhQqp@R75|L_3ow{BMTRp<)!QMt3(JJ1R938{v2hb0k3|AjZCG1K~Zl zhs_-%R)!tVwTTKRIJHdoys@dDcBXJi-JFg)`^{M$Q!gRO6(IcxGiK502Cuqtq$!~1A@-+m2Z~v0B{tB=8%Q0&s-Vg59JwBU0e?|jiQhEb(C#2d zN(;BcE+cMAhQ=JhkV4@|EZ{v_(O$9JjyWy+??5S3V791zFbcR4cY7d&PiGph&`q$b zwBYX#pm>CJdOWbETA$QX-!@T@0@xtS+bsW%GLl{)?~$B|WrKbAh|xaeS5O79Vnk+A zOU66o?jFZ$jRd!K>0oP(f)^|thC7hqIQuIGA$ndVF#*wXQDgJaUneZ3bnw>W>eMtg z8C^-Ebi-#Vf>l5j-K@|cT$l9s(T=)u_1L-(y)|?j11bI1DD-XQt2OW;3Sk~X(EAoe zl5MtXJQH!r&PEFm^oVvgO3_B0Ta{> zN+J)4$;{HcXj1VJwDU?fIGbw?&YzwFswKwPVe=(1>n3MyS0KFt&1PAvQEH~Cu@Lso zi&zSTBtb0sSYmVGsO+cK-ADxHO(0jVh~@Q{{+6wg)t0xP5(vk9lHZv6hb7jPx;Ds_ z1C>2vh5Q4uGy;GZTY1EfHeE1|SzCY%^4-Zk$$}CZt}KXZCem|3nG{V(r|_3>4!*XM zEkAo4d<=Fv?OSZZY?8Q$g}m7Dj2kjO61C%m7V}!lF=sdd_tB>fQEKQEPDaH)mKMP{ z+#8*TPVb97YqLko9QBrOMS^0<8$8?g7n5(FAGJ%5Er2VY*Lmc-{;900CB2G-<5xRrlg+*)P^yneXDh zzT(bMfHz>|bU3sf7@HT4*p+C;4w^0s4z1Y_y-_%z`35_Y7X^pj2(T^8T827vwDanq z5GMG(1SW!I5gwMdA>G23rgmC9ABFl3X^WdK&SP;B&KGXQILDZ%8M%GVa*$~xS|X(g zRfT>DzBHe6)BtNf`62UQ%jAakwsqLORq-MWTm+|<%$vkHOKlBC^DDRT88CHB!aySi zl5!L`IL|(RzI$EH?l)h3VLp@ilm8@-pdZ};Hr-}3oCdeVgiss&NTR6yG&%x!gxy^M zC7T&7@bO*C$m2Q!>^j4SYf>-b!;mxkc1ZEjcke>R=(O>Zv!AaZ=k)T@UD0oc^Y2=p z`1XnWD~&e%4t)^;%e1tc-+><%I4f)Q7^5z*0tQBi;;#xp){%>#<&&6MB|rIkx>0$9 z5SpaT)|_W`mk&c%v<@s9VTAiiF+_p+p{Xvgm2p_e=xa>6i-&StLKz7Zo9zzr!L5ZT zn>%x47SyqIY&g>@)2uCwP$F%6-& z6X(+53s2V3+FJw}=&z1WesbGHTGX=M3yk)@S%SeKVEX9 z{?+*_R~8AUYVNRoAlTpI3SA|f^Gu&v@ey;^Q->Kp_G>@KbkqK!2F-lLN4SE<{j~o> zD{=ZqBGN2cXu?wIuqdVll{-Ubxg(Lm`#mKGf9`5O+eXCkC-fl!m*hfEXq!{Ex88jB z^UwV=H~lx=x44Xh-YF!bc$&)GfBMwf;=ZZShdHNIDG!=I&~JH{EZ1zR=Dw<@QPP!^ zr~GiEn5$KyWC;wi#0}7Ce7>rlt%auX<&`L8O;yuxK%=NDL2deQqnsmip+h+V{S-N36z_HzeI>J7*Q6`NUEeejZYTN2GLDPW9qQy_%M35YlhIxQ(S zqB^#vW5YC|JfB-2RN2kUX*N#UElVc%uBfDMQk$}dQmpCQ5~J4o5h-)q{l5ZS3(Dyl z&b<3MJ1NCa%YKk$KFaji>fxmDKQ^%l<3jAkOZni8GpPX{*6wU0rD{EYTf&3o6^x+Y zQ9Zw#2i}xc-*vO_Kqe@^hn&M*aOuy%~6%1cTrA5DagsLer(ZgJI&i2u1u#C#y61-nX`{R4v5&VS$5r({$Cw|R0yP#wsha?O2CF>< ziTS)fY&ba5PkrR1$;^~ykZiP}If%|QHF3!e5U+2~n>WA`cOz}mYmqPHwhUsmlylC3 z3ij68i8qJm=d8RpTms7;|1CC#t{EgtP|N|^o37X*ESLihj7hnQD5EZ7<306a?z+IC zB7@uy4P=F$PP}*jO=s}x;^^oj&Hx_&pK}Jly7Vz~2GZe_PN2k+`~T8SZg&kP9$9xk zF_Y<`yaP{W!s~TgxSVFw+ON=eaxW;ypv_vT-7KrxRa}ngF7h& z!w*YpTmW`JiN6R1PUA=a894L#9G;@eYyT-~7(3zO8?5{6P{I1dElRo$U5va=ZLO0lvyQf>=KbPWa5y<`)2JV9_}Qc>6e%lIj+52ESv+ga zeS8Ud%42#?YY_B?4~e%^-Fl?WC?`uffqCYi$O-^SVP3J8T)Tb0%LxnGZKemWZJ`rG z9=nLR=}yUUbFNjJJSw*BE-+^q4X9Lkh-0hcW=z$#eWyv)lqNztVh8VptxTbb^V|Mv z;!No_q-+Zo7^EB18|>^w^NQp|F#)?_xc8}S&z$3$#L<7#UqKr3#BWR(aBL0v8b}Oj zEa1E8q;AP?FFSO_@fK!DPi=HRmnqo##HR(~gkRs5qQi*xA_>kw?w>9$-NZ6+5Pj^j zK{Z>kZg}L^E&Q&m72f){T{_I|lh^*!nfv96#p5#{zxrW0n?LgEq3?VdFCX<*@j(&P z?EAg!oKpjR@xOsDc}D6n$yW{(;QYd9kja4_tZ>M^tUGy(M#*bw z-->s8mQU)On7$5TeK%Zh^5|hKYwgu2Ng>iO&PnLQ6L_0=v@Lw$x&W92b!)`%A@3&b zA9b-sf}7ZU*(IkfT1y>9O_)w$s81qQ8v9e|^!)S?EUl$nZ4X zZfd(`N?ajTLUz({G2l#E-{}S>b_<1gS+r{wPye>7k5H!_vPn*(0kQ8a~k8-s~_6Aw0&qD3P6Wj+y$G>)Da~?Q;SF3B)6IF z*`mCe08R{7D&&ZdwKarZ0yA>Ym3Mc=5H7*CFD79}IP3)8pCqGiyAcvQY=n+lymf66 zz?5z2|21NONuA822DU%0+K2hq0CG(G?BwwVh~qMURwCB7%=MCp_9fH^^RE%_ONn0p zuL0VaWPc{c*Y>z2XFa8LPF1X{6m)EgTY4I3Kh-zgw^{rT`tn%lNCB+VcmqI4Hli7) zq86WvTHGGM#K4OLhqijq;=8F;qcKH@2Btv4=OMi5^K=*#pyvE8E;KNL0Hx!Id;6Ba z`)etYfDcN!f|u2JmnDosg9GCud7(DrT{S7^Vzirz3$6c!AjUuu#bt$PtJy}J0Vo!i zzSY2(E%lK3wE8^d4aETr94gRrgXxdyi2P=oCsp&>;j+7{NoD zWH%23gUh6Zpt;Il0&(Cr?UsEFWI$m>@`Eq`h1TpVBh>_n0YOFHa>-(s$W5NTYtBph zBP4^K}a@i2uhXUU{lqXvQxxuTjxl*ew z4SOh>YrrLQjbGItA5gVHvE`*%KJaRP=cB5h7CcSZ<{Qb_Y4e!=vE*-2XcfLf9l^nM zmk(x@v}q5^ndm|>fTFfD5vcftuel{K9l?3^F%yr0>X}%ivOw7tHXI00)RF;2zg85Y z=lfkiukM}3iDT)f0&VOs7SPeKr1DO7g43*k{Q^ImQm5kkd?pFi(ZI6I#z#pZG}TZ8pWs z5qP;+!r@(;IXO7N7Bm`@<_HB9tD|-*b?c0&h#=i2c~&%fjELvx>B4z9#Rw|2#`$FF zUR)fv@506Lr>}n)Zh*Rx;QD2beQ-AAru*49TlB49Mj4I#jQS2OhFMK zaW3_r4d5CAMPc00eyIMTo92$HM;Tavl;*}q2zy|Jj0Pnkz_l*h=r_GLsRa7?@9i7D zMrbDUc$UqWUE;DzpEgZTK!joLMo+p1Z%#)rodZ=m$P`VgWo#F48MN=c%5C(@I&0mD z_546>T36by6R8=YNuNmWZc5^IuTE1un6Vp9ofNatrxW?x_EJW!h(rQ+yqD(bKPD2Z z_ZN;#?lS1yob97)Qt@i#lE~>!$#n@Jxp*n3`CqXTov=eou+Q(L`dUoy>3DH-gSzQm zHC&7(k@(y+$h;*W@As4Heq0O@Bm+qY`l2Dw&CJ&>5=hD-XsbCaob9DH0(uX^39~)R z$r_F`+*acuq3;YaofGv9?pwg(bgu7NBkx@}vQ&*eza(qd`;$!``Q8#>VV+?4V+vmQ zV-M*H10jm*%XRUli#`6`mmrz4tBm^<$S(x@k#L6<2V42H_ZYZWe`GUDpv+7@36BPf zvhNX5`SHXF1x!g>dPZHo2zR9vS9X|1{m(lf+Reo8UTiFR{%;!@!E)_PUoJ*3AvYZM zEhNM-JtWf25!z$mdm9J2qo(Y>UfhK}H{ij0G{m@eRXvzK1I90qyo;D=KI~`-#k3li z7}^q*0>i{oGNSmMG(LDF2<|P4Bt^h^2tnbLt2u~O8 zLbx3^-t2rX1#D;=`s5%y-eCbfvm<2RS`|T$m}&@-AX@J32>*VB>Sv8uRvsK}%UtGq zZE~bN0gy~;Dl$ zTBf(~-F)aWZ!K!nR_V-fG)6tfWa)BLP`LTlXqw%OtLvN+=saOaJFvel%9*F&ChrKDQ9gH&mzLQLnqpf!QXXRZIKN%Yq5NqHjr61E8e|e6yXbRd!yRhCT{x68 z#h_2xl*;!AUJ)DF5XxI!EoPv+To(}37NW>xT#PTt?(Z#|p9P#3Uck3CwDap?#w{AW z-KvMgqaie6-TXZ{xfpH$+9Kscz~(p5-8wU~Z+IPe^CBQ>zkTqza*n`==uNBU)}!XX z#fUW6GG@#vIHKJN-m-t1*qHmncwW+Pi(!M|+P$I{;Hbw_EsrN&GG4*cH5vFez#L|p zeJCaj`6;Zz9MWD$h18uRMT0dHp$K-I0@>XDE#6sba>oiEwc6m@!pg{=Q4w%mPN`%f zAa^TfGl%bZ{+DRAPP`ob%yZM1$+t4zQ#y!RUw5+l7f|jx3YP zU4&YXW~>0s(U@WoV9EvnU*5AX=)N+9*=Rdo|H3*f_Wx=+F$(-E_$=TXczYua7q`hA zA>=DPYP~EE?>{K5IrMAZcl!Lxr+Zm&R1A?JnnkYT@%$#{>*`u@-^r1Edt|||!@C|Q znPU^q@-u)9EO5|eFQ24FQDhJizvh{`TT*i}lbZzudFJ5cn}bn6N*m}@vaH-!>w8Y- z=x7$!Dk`0Kvg^}@8xyScj)Y1j-cCD?$EfMNd_0yy}9BD`W0)mxiVg#0?jmR}2P0su)6Y5*nVgaDicr(WF6Tzx)^EfIyAF z3FR?FB|emOMdWreLEj?U#)zikU&M}nu$+#iE(%vz9(OUBmLN=|fCO52j>~Iw2fMGi z9{|vu@)SCNF(cXEkoA0R6 zA${ozCUv<9w;F62Ov34U&zCs@(#lj8%$rtqDXk${(TuJNk4fGgoazhdamg1!JGPs% z1L+{0UE4%$KYmb-ZlPsDQH+7MJ}9B(b5N7WeZ_GvcRwV+4}^S9%}P)b z66jLK=^#QKz_8)i3Ajw%9I6MsFCMuD%>5d91ti2OM7MkA8K}u|Kny|-c0^9fT+fdVo~$ici+x$zcU}t@aLD@t(f9mEi2dk zr(uTQWluBwpM#1YWiLCK7krz}d?&ZP;N@rZa<};wYg0vDKT?~IY61omt9*{r*A)&G z|3i%8`?6MSh~`J1(?{O`90avYEk+~A$DyL?#Qd>x+9L+X|B%T+;yL52p~uuOr1qYn zF*;VcF*3&p@#rL<<1br*SqZ*!N^2plOPD%Rac++gaoOGBJyWv)hQm?Nng;rdUwAG+ z?A*A53rrJ3KO@ZxHF2)KwS~H%#L3i9tyAUE=`+X~ss0^X@_|qbs$%KdkdSnY3dC@Fibr4EQhQbqw%mR+o3y1$x3WaTYe}GjN(Iyo!}Hh$vg8UhgAHhwmuyGjw8pz zk{ZgdPUG6@Gkf z(x-uwvGCCuRCg4Zu?@N!7VT*AM&NmogT_zRej{eZjoSdUyQ?@c$X^=rd74`g(b-wy z#Q2VH0p~jaPgwDYzvKAY55;2#m@^X} znyo@9?yS4o3CDOjTE>B8dT)^Sw@2;4E5GnNERd3@JDHBKYyH_`GO%8*j!|rJf zS#yOT4}~RTI49gZ$vWL~dtGl+M!poNziMV}&h(Qh>?ZIu7QH5CuqH{EoBbuz3wZ7`wsg8J3&_^A<0DD10b`X!|z8H^p zuR(1DgCiKHHZ4bo73Vx$1K{iGTm>I&O#i+uXF=cl8@B-{es= z6IQoF*!VQBcCIJ<0|t z*E+{)JVe2xzaR+`d_j2Zvb7SA4qjtUlHOEL6mTz7&-i2&>mRGG>k64d2Z z*Y3s2o{sZ@W>mKYZ8Q3cZ!fRisZ=+Wl(r3w#D-0tp-9+qGxTPIj{z#%p+JLt?e6kk zmt*X&O5U+GFKf%MS6o$_Vf0^eGyf|uBdzP7dHZk+KK{D#YyZs`>mRAkEY8q|w49fY zCY?BIO%c4NziW0NVM=3aaF}6s%>mbHa#OK$x}s0W5R%NVQMlwM!2aV{!L{TT$N3%f z2BvvP)f_tEa0jA-TYwS+$=66_j- zS~Kffe=EIlBY!HG^y)_CR&uC0NuC3#k5FsGJz{|U;I_izXnZuYJR%c^*AQ59`bZgc zaXbw@0qzMjeWxJtYn&2rxOy-9#LWz1{E%)7u5oH(XMrLx=FKrqIBMy_7=*!P4fxQ4 z=uIq!1|6#YO)9h5(i%JJ?K({x!8a$Aw>B;~u0c3X@Q4Zifo$Lx7>bnaJedwPeQuq_ zqVCvPvRlAcR%66&3@K0XY&qLO%u7xrTmn)hMZmBCd~~L$DB?|zKY@!k)8i7F*?s<~ zA(Ovs^(*faXe{)bj2wF3R#Y|#|GpiU-+g=iUGiRk`{eq&H~|cEfF-v}>~Q%y<1!VliUUWs{m7g{)}d4GzOo=Xn7CL@q&T8|F2aYR*9&kgnX@t07H+=1hnip$xvl;9ya z+f6`V@D)t(lRnhRHot`g94M{W&i7joEAOUBS~|w(Wv?LoR{TzRPZgnOA@6D1V15jTF(;P#UVWKu znc4ta+yP~CvQu|hj?jNON52!KBrIJb`Y*squLyP0WnFXDy36l{AELwI4q(5OdRdM* z{~E5U3EAb+=ar<>auJE{fCMRrjkF_#EJ__-wsdx1QyfOD9ttNDMx#OJ#^2D7j-_I& zI4XEF0r_~E>3e$M&pjGm29|rpz`aZNp4?l~5-@V-?8~mO7{uA!K z9sc#%S6E+YT~$C3>+;NWh5+S#M{Lx#M~`|?hYyHCu?W(clClxjmAK?y49L1*RwD01 z?;;B#Gy<%mlavHpDw&c5URVp&zT%H3r~a~Y%oht&vfT{a438z=#R8kJRvQEHx~^Hy zW9zoQ)WFX%DuKlf79@07as!*k@ECo}d!8wupL4MfNA1h;M1wH{GzVl!ERhJ-maZ1! znPIlFMDDKTVN2ru$`n>Ob+?0qcAnAt91_6Su$zAF!1ztS*vUQ_*Hs!oAhl7*j zo}Wd7N1-a}Y-HNkmO1+P9f&~N;=!t=;zCh9q;($P45jb75@3<#reUCNOT*-# z)`g>$=oPi&$PHB}53Y!Shhb{Cd(sevFSaFHq;Grkw8IS|YwuykDg$qG@{aM|wCI$O4x@kRn6w4(G*<&0i3>X8` z68R`OZce3}=VL*U3v1Otd(Q`$7EM#(go)S?M(;nXhEmAg_8>+pP1Lzf4YF3cHzU

dOtUi%ky(0s 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�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

F9RfpPwAI4$qbPq_bUgsXu#` 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

jy~>-k~c%M4JU!{P4DU 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%0AIco;`kpciJ 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�ju}_aDOYK!Vwf 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%0AmyA21Bw3wKtMI*bn7ZIixttFry4Ggy+SW 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%0Db_65}VGeIo`2c&sQhH#vsmPNj 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

xS|KT@L=nqel>r}gt8~w7&s$`Hf*$JY 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%0A3%v65gDQ9@6cK_jK`E>pHG7pjh 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

+{&qzcXI7q%7?LE_`;;)3 zMock-{`l)rosD_5zWJdNB3OIFvg0pWny!BUc>$xWk=7COsSigE$N9iq*v+PZ@2vWU z5b(D)mxde6PsT~sP(}%9n3oMhrt?Fy?azKVJexJ)h+&+eh)@8aC!P@^FA3H=ibQy_ zBG)42CaRHH^}92)=)5_~73@cX$twu?0xUIz(Kx!(GMRkC0cJ3vX_kFv*X;hstY86v zz$#*y#9D;O;cC=Y`R+4_s=ujU`KkY3oc&<<3`8}($< z{J*jJ?V7B=>93}cso8uIqo>WGoWsN0o@P`VqFHL$Z+a2vfsobkQ$g`Xp?mbUsbO&L z`=*{ezkA<#NL#Vs0SKr668A87)yo@@B zr4W87fL^rn;O~-j7jjVF^+1;lyp#0Sjjn@;-yxBWN;!e&9hUTy##h4#)Nr8dzg!q; z5*|DC_iy1$`Tf2}(2KZ4VU%;#JqjU1ea`~V$9tu6KdyRREa7vpgvW*UT<&PkLicik zbI5`fve1!Z#in?JyQ$b#ROU!~el1|=;rtBWQC1eYveX?m0sopp|<%wUF`WVVuR>;I?Y+} zhBi1DfXzQ6$6t}mBk2e~$(pvm&-1}&!OO9BC_H!?8Ce<;*)I2wCxTX{a3lgZMgm*^ z!CwR06iWhl3q^qLTyFgkt3IXUiSOp%BHqL>$ySgK69aH_4;KXxbILNg0nvE%>j+nJ{ZO=yQ>9G}h zdTf5*bY9I$y|0%33h^HM^6}>LKtazX?9&pefppHiYl-U-S7-*LqK3Q2o8}t)&6X$N z9ppuRH7B1Dw{J)=fXkkLF5IWjY$}h}70Xa<@RC{eHNIevAA6@8bjyEKs|VfCr79{! zaY~{>*n)e_n>Dhu9>&U1j8ebto*LieB`1=d7X!1DfZKpSgMbowhHE$efYAWJCL+#( zl$R!(?WceKHo2G&FEb8Lqi{n&%(7LdBe)eBc@vY!5Nezin`r=y-0*E6EG&D_VRb(6 znw3$g9`8##{nZ>DOB^036U3q^_RLkZK9-^dSJ#Ef>f$jKp;c6AizfrJg~rehC0+Jp zo;g-GF3nxY`lE0hq;**^tLDPUc7%3e6Ih8*e|Y?A?>Kq+vz%tRgXs^_&b>~_9A@7; zL_TKea1Mm@O2j$~6p-cwA+>4ON3)=IhK;052La(QWD^gV1L*UQ*=YPOpMAt=@t1e^ zL~X7F(3bE(06V6p@yL5Xoq;}AYvaS0+unoJ@Ly3CVLd?Y`sBc-83EIa_y|)AHw@KC z1HuqiG>0MbRk8p~ zvNL69Cb&(GG8bC{I|JfCXjLm8R=Q@HE2tSYMA!r1?f}pMQ_N8MAEpRdf9C1L+(B%P zOu|1nUk7o8O0^g)^*Wz`&p2!D1gKZ?dL#}?y$zb9rZksHQ3f7PjCALtP~bO_6O0CP z!X1ZHQ0TdBF~VNsfLwsb5yjyt`>l*nLwxv}?xu*)Y!gKYeo$4(ux)F})AmM8_G3E0CSH?tyv!k0aiAVgln(U@cdu%c^_H+PZ8>7hmyKY

    >B01(p`X!XUW9x0n)2hU!Z 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

    l0^c7dWu%Q@cR(5vz8j^Oo` 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⧁Q0v;W8_e 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

    #H%rhqMFL@jXSFqU+yZ{f7ip}lp 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%0A;7TR(11W)945u)D9c%%GlZ8zb4v! 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�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�+es4O5#tVDwX0g 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%0AMON%A7k*_TB; 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

    sr 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%0Ab-BM5KQu-G=KKl#0 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

    e-#wB^!ycgBjd=%q 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≷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�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

    %1Vwc7S57vb-%GXM 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 Ii2y*W06GxHL;wH) literal 0 HcmV?d00001 diff --git a/node_modules/sqlite3/deps/sqlite3.gyp b/node_modules/sqlite3/deps/sqlite3.gyp new file mode 100755 index 0000000..5444069 --- /dev/null +++ b/node_modules/sqlite3/deps/sqlite3.gyp @@ -0,0 +1,119 @@ +{ + 'includes': [ 'common-sqlite.gypi' ], + + 'variables': { + 'sqlite_magic%': '', + }, + + 'target_defaults': { + 'default_configuration': 'Release', + 'cflags':[ + '-std=c99' + ], + 'configurations': { + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'action_before_build', + 'type': 'none', + 'hard_dependency': 1, + 'actions': [ + { + 'action_name': 'unpack_sqlite_dep', + 'inputs': [ + './sqlite-autoconf-<@(sqlite_version).tar.gz' + ], + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/sqlite-autoconf-<@(sqlite_version)/sqlite3.c' + ], + 'action': ['WnB5%stBS!*XNt33tY^S$3c@A%oK`DUH9*Is+= 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�ZG5fJBJ|JUN{`4iGD#Mqnfa1;yJK$i=+X`zw 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%0DGew%WOS38eC> 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�LTH`BV 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%0D;;LE_X$4%s# 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 z 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ÐdpY{ERzJ;y9LEzC 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

    JMTchnCd*OVEPv5m>xZBw^TFPmM$A;l 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%0A$u}kdCLZkf`O$3 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%0D4t*2YyX-CSLfg_5(k1+g482%&f@E>s~ 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%0De&R#HlOzSpdS?_jHpRoRt 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

    A(@KX%f7Nt(0&7pncgQ0@PPYX2`(`+s2| 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
    IeF|F!|CzEi-obn2TEUYL@b-be` zp%Tfic)PS@e9YF~0$;gZZckCXBiY?mLRtv4MEL(so|xa3xXDC{xp1OGWC3Q18-&rR z=eW&@Cf!-2Vw;=eoulz}uuWYwq8!dkT5Rxs;b@-xV2|PltvkdiR6V&0GCi;NOY79;8VlJ^U9m=?b!1zF8*OTvHzjgRxfU2`0HQBda+O-%oS zNn|#;vcouk(WSXe(unv*OG`R;V|RWS9 zPRA=W*Hkq=+n9sM0Cj1xdy!kNayUjmi|K3>F`zeXVZJ28Ow*R)G!F?2SscWj9x$^L z;d?wPA*S$k)Fo~?opmDt6IOb#2t~0(Z+qNi=(E%ILeMbdk!|D z@@F^JkreYA{iQCGXLx4+(bSt6Zc%yJ%-QZVY2eve@~eDMEwt+r!|n*DR=M77V)8wT z4|?MjwQD!jh)mAJv9fYw^_mspe(|D9-Atn~^$b?dl_W@*OWjq~tE=niXZ%FYBw<~N zu4r3PIo;35MvH6>B6W6|CR|L+qopUCG?cb(KGIMwq2%8sMYFw0h4E(vBg#N#1ro5h z&We;gON-@8rb_VeztSQ35$Rezb|SNgCN4{~Y*X&CQmu259h_exw%JKev(Q|u#qoJ?9wbU_O+pDbR#O+ z)DzG@mnYCQrMp8k4x5FCZFbWHO3Gn%CxrA8VW?MBiY>)ae$ zl*^7+FLyHxVY+aIw}o#KafK+Aa)dEP3atgw2txcu17Xs4*&JEAs_8P6)~0XLm0!=; zgsd6gM}I>JB{MZd#(GMor?dWKw~eU{6Iq%~yuG{KpXAE4Hlwy!U0JtuWtRU1Xpc}G zkrosVb!tsjWo@>+6oMG;I8BT+hn^)n9nF=n57|Q0qud08=rJAXL2)5<_*k(8JpMve zTB;ySi`JYrCE7KS*hI8rb2p-uc(Xzxq4hYiX696*H3B`cil#8tN63@wM(dCC_Z+WG zSkZ7XP1K)^&VhG&MsCs~bJ{E?fl4x?j8wt2m3*e%iqu0UkG^obyQzz|SYI!hAtOv_ z*Oj=rmA40hH^mevDO}B#q@U6sik0~=N^K_C61T9apjp%beQ;nwFK{8UTl8iXfWzkn%7zdMR|2s~!Sh2V{5|0Mw>SyEOL zoo2C%$4FREfs4kZCu6>d;{41Zi!Wkc#N^17fC%S{dZzpImJdDCQF#c!dTB{eRfdi6?G*P!lV#sNd zMrF#@#?dA*U1&<7<3IYHDEURTn(c0;(#6o!N^h|U+Dp@?k#nzyCq!aRbkqoNbU)vg zh-&3|M*k%l=0pH~>WvvlJspEQE^ud-mCr9NFXKPA3(Ds&m_5fWpV!=2Hfv^c*_?ST z<+EqaZHmomjz#CqE}K{0GCLNV6D@0*IdjhZX!HDwXO)#V&z{vZd*qoCO(=omIApXo9B}kuCQ4n zrvqC`+-*7R8$EqXd~+e=xz;|rlG|*H0k^0{OF5CvXQY`7fXo~^yF1)MpC2ex$<3*q zsx_Kw)e^KcJD{*yK)cTrZCL zEu0o_E~Ks+dla2;Ezg!=Lo}H=lhQN^B|hOjjux?u5I^Pm@S~46%M8qL^-w%#`jhr> zbSbIqId_h`B3+Ipx=BfaXNi1}!W3sUy|yY>SC69H=0`*9z-S~hUW{-@3w?J^q&XY0 zYw=NB;WncvNH<;jqU}@}h6$Q`rsghi({fc~twE|8Y7X`bD}ETe56(>LgwGtE*6}rnzgTxl0pRRKejUL|t-pPorAdDWy$zOHqyO zGv^#duQZ`_9~WqV(w^X>VK>B7L-#epduHzHyRbrgcWk-#-GceXKjWV9sSQ0l8C7dA z*uj`XOi|ulgtRKOZEDIC=0)xTS2MRo3c&(ntZ>D;Whl+@D`tJ1Kc5ms0p4)0N*OX_ zCSq=`D`-}w+LlCKxz{Q9=AGASIxLXE1--qCMUU23MLT1z=)N*WO-0QNQ1P}!V#-(S zdrIx-=!*7aTd7PDB4a40yKqJW`XUi{G;MLkJglXSTAWsW=^0I|v&7v@L^&Qw`#UD& z{6%8hQmm4#ozavS7fLG?qD&v;3{9x>KtN9t2O9V==YnT^s`au{^qnaoiW*dkK8nc0wG z&=)bigcD*upj)=64YfIj&%T>bQ+i&d>y7{3XlF+#5t)0r^XJcJ%GKT06-SAb&Pr}9 zDK&yfL5{N$k`BV3;EW8xf9)&!M!GhykM<)~RgZcZG8huc%UtI$gHmm?2BV$>T0Nvj zcU7rK8Feo4oP@l{|wllF@CuUTt9=^dm^EYkfR!n{RV z;^KDHBvOl*AEj7{s3-5-x!1LAYvZNcv0951CU?`P7c}1>{Yo7<=B}s_STU%<#H9V>h6MgkKhJ34g8fBe?)?P|esS_PEM0L5lm))ORvZ$kY)heeaNvF$Cs*^)C$6PGhJ6($0(|PT0^KM#!IL2D7;|>y(k+rgo;;JE7-j zE_1lI%nVtW)gXDAK{}e^aEo<;Jv2o0Q;UrWW?;hIrkO-v3LT_fwEeVCu`Vrz;ZTK{ z`$D=egl`>fJ7`ZXEN!zk+;*cmp<~h@vkN)wC3v3|qe}D2Ixrc|juBQSr9n~pEzod( zMN)+qFD@@GarNzm<+)jTMkmdQSSou=$Lbf;c^N1Dbm|@j$$GS7OS-bqgwl1LslFH$35QWEW6+4+U;E36 zJK#-I*t*0iA{o}xj zF5Tw}{JQKLq-1#hRaF?A3s0GX*%mPqgz_zGAx(M;&P0HEFqYhvMk#U?wPl1jHfwG{ zJbqI|h9Yt*>8!7)u3NcwL!GN_<@E@(z~@x-k^?cMNwr3s6Wjfg*Bz)|8|sC)W2Pu0 z$&!Ie#vfDrrSg|#r_!HA>CYVYXyh^rf=-|f!x83>m8-PyNXP7(J|~ix2kQkOBDzek z7-$jcBE5wy84z#Uf}X5)Bt$E(;_dC-x)Wg>WMK!>6ecvS3Cu-%yat7NdX7k8Zl~M zPmLCXI;g8(4|`vvz2q9>%Ur)S9m1G)_`VgJmh8%!5m)AUNM^*k+$V#}QCC`qOG2@V zjYBToT-|7+SP(U5mT@4cmqN*YWhSec4=ku)nMRlJDzX?RMz<~66y2Q%l%eP#MrU_Y z2OdvtajR#n^^+915!v1rH{Pz7Y{-fWf8_%7FxEs=Cj?F+$Vhu(OfbHvPD~K8NT=&w z+MTY1k`ZYxNkn}KSjbE;{*nmfD=yM4jOz>q^cs`2RI)KDi(P!lxR?tjD85ctY6EU4 z91(*_oir2YfUrJ0ubJ{3-dk61G5ga6maarpyRLYP%-^LN(NIzlL~W0DO7ES14rt<+ zsuWwWGNaa4P%+6jDWt1+qubz%r6x+PMyyJ`OKiu6Km9sW>6+RS)KtHEbtAuGz}1>J z(QTNu9+G?gC7zO%G>uI8x|2+|wW&L46uB*xKns%#x}|3DtL+&BH@uRjCQ^X(H!;=o zWxgUjtWV1lgXKV?A)!k!9DBX+38R16%#6FcqbEVM+yN$cmW-JU7s; zvng0i{OXSD#cP~uE4pSzjc*^p8?W$jgUpxRVZnRk8I0A3@ZM1HM^{(bY^*!KXOApN(;(nnjcs07NmbheDzbF zqfJg91DKwbMST-UEJLNglXZZBs7ffI4-!09@< zjf!sG+=&LBmK_XMbTqz*$sb=Op)&ZTEpbc)RBd0BAtkMc$TUOhyC~?)@TlSl9ZAe| zp;~u@{dTY{C5VH52+;;p>@HPs{`B%W)Zk8`681kjfE=T0EOvs4Jvr>6I(N9`1S&dy zk(2t9BU6g4%!qY1^qRrU>KdJRpV8KO7|E*a0<8nm+dxZwAPvn4-TRLfke_s4+#!pL zu#c+5Rz*~Swd+~KqN+A6t*T)+a``k0`Aj|o>XM8p)2CqOAOk7ffN768wK~&XW{Dg0 zM2r@VMO8qQvgu_yH|4B0)dQG6_AwmLw@YOS3SZa6vD>c*FNumlxi#Jh`_Qb*%`Bs( z-az?nEYrmm6A4KYor}a5Ozs%6qcCE0!Q0a@D)XGFi1auzK>I`w5~k-S2#W)rFnCXb zWzzC4Wwtt5YI*f4O5~{2$@*iG+fkZn6DA+hpZiiznOf02sWdXsZ1)W`Op2RTZRMI3 zRff|v>H`?_s-;!SuvnY1oROXtwAikt7v&+P%CwJ6hZv;KZ^vUyx6|!*1U*x#rn0uK zx=w1JUzGw5pE0g8E=w3vLR{m|FL1+X=e(i;q^n7qTcU#!Ue6cfBQh7Mu~`z6Rc`Pg zaM;am79kOgri(TBJR;?!3*B`$d{3!fH5y2ZS&a<6qiwR(d;64h4e-0%Xgh1oyHRm4 zd}u+r?mkVQit0KH1f)X0G=rA7{0 z5>-}c(m04-ngl2@HN`udx-q25OlGsQGh+3wE*g_5`ZKEH&IJYCY4^;Cy8Wf}zDmjr zpW2o~PkAVStl6^;Z4{STD&JAQHZwz(7K~t(WV3`=ufx${wZ@y7j%2zqOk-FAEjn+Z ztgOmkKwar^=gyfkYfcu;H96#S7Nyd;(nDrYC-p!)B=v4FXnU!+LE$s>jG+R;*n#!hnk#>BX`gr6+%S;E<35Z#tH4 zZH(jBJxaMWT@N7}!hFmVx+I-Cc$1@aZgq{)xh)jQYI=H+ZeM=Kv!kAZPmADl37szD zEMZov}LT`5mKO|#?iMK76P45yNbG9A9;FiIz)`$?JR zvoo)I8CH3IA2b>_f*VceOtESquix$Iak)fl5TP}zRn?bQN%5_a#o4Tx=Cder5+qwz z)AT4Ly_GdpqL_!~+NdFrzmqOzV<<~xioklVSf}zizKrS%W(Xxd=gCXHDq{~(dFoauKW5zs^ z7Hi5#`mm$7on(It6qWE2)oYejZK_%(oRm-D zpt>0;iY&PD%|;>fy9-my8G~^D9|<&PuLc=tgT`-W*s8fZ*`~GSTGEz9EK|P&hBW9N z$P$&zmkn;LuC3cZ-(WVSD1Z&CStgrQAjP9eh;gkPJc-*v;ln5={DwcuDLe$|Oca znf@Q*KYcHV0g4%?Bwnp=)@`NG1i7icprFw88%N<_>VpX#leZ!v{Lv-TT)apO(_Mci!8}BFW&vsb-%MM1khGjl zc!EL9WG(3ZeXd*gaHay)tMssu#m*y7ko`{JZL;?D5jkL*;SXFaHM;;s*{?!oCYnVP zfs&pnC_fJEn0QbpsvHklMw7nh-0$fv9Q5=%$7^lX@+x$dORLrg(WV)ET~cThqB7Ui zqhM~RQs=cBKfT&xj(f8TAt%0Uw=#>+?3m2Le2+nE3975~IDTu<;v(JL%S)s^Uw^$T zwOx?@gM20%uP_lb3-DomhSkTaQUv&PWQFfeJchlE0=Po=Mtjc}yTS(DTMyLIx$^zLg+gt^_S znDuEAj_hAapDqi@dOBA+G`~x(PkXIDx`?F|r~?<3&ntGTR*^DYq^xfbx9GA*2+{KR-S1*o8Cl1ZA!XpN=()_~|i8+K4pKG$EDQ zbH|WJxPD{5q}!SBs>~@7YUuW55_C;{fm*U;iO62N>O}}HRukRkG1;AJHFxojIOoA; zZ9tVSFTBmpewY>TIX-_QT#YuLAEC0QVVl9I09%uFaHoOFODkcbh}qg%nJ#<55EHSBn{Q@ix+h_y zvLy$B)I$h~G$`P$g9(%WIy0MLJFpb{!ogVc&dhg^(p0an@}*Np*)iyOj9;py2nII8 zg_>!KQR-5cD{EQg!bH(0G`1XxFQ%*Vno0 zH!NWXqS`BEhEtF_>ebSZ1|H! zjqL3$npIhks738yt;OMomy4NPgZj=GqUv1ss#_3$)7|O z@MS)??WYilT}Qxqn`sZTIzO<2y7V9)>tQyT-diy@2nivz1LbwQ31CD-)3kGUAsKnr|uCnK?#wh`IRIiDKPC_OI5N;m+Bul6-sW4 zcE+V+N^dZQ5PdC!j!ZNBRm|zWw}io*|79hGffYz?^$J-^N8eGba*Hg@B`wlDODWw_ zi)?Pi27bsjjVx2FO?ZL)Q|rie|7Z+2WrfT7XiKbXhre(%i$(Hv(Xdr1k+IT|qH9da z&U@&n z5wm8kTe(z3}sbwVg@57(cWiGiqYk^mlB;50%hYnb#W` zk&LR?PN%iYL1Qs){Ygc=pAK~XidV7DdY@YL>@Ap5V(YO3u3VIAIBjba?LV)5!Uv=k z$9_7qyqkzx*wIK*hl-QbC`r7p?bO?M$|?i1tCMj~K~Y>LFj-9ID|AJAPIn~hqoQpA zfi+nnE?e4|TTKOX+vC6Xm)82JdoNmOSgCq32U5XBT?j`Y_kUv{@`L#Uhy{ zh-QB26Ft=mBetd9x4=jxTDt06W2D@WK`K`(J8_{EF|&6=WKEEILs=PEX%T zvVe?K^Ku9CN68SIjl#*MleHbvORLCKW^7%k4pPH)-9`_`syh1ZdXu57p-g|vuQe>xF6>YXVNxNVvO-Dd1I&N+0(cD6nH*dZ0a|j#o z5W2qV0Z-ov$H`_OB+568^+goS1agHLLDR^hNONZbvz6w5f)&wG7Lqq@ujQ*}f;n7f z=9`vU!V4PiA3>!a3)5dja_KW@G9{6x>@_6DIKh{3=sBq`5?=-%TfK%28byS_pqb%_ zXl)~vy;R3QMjIGgXwD|+Ltq$GF!TpIU>Va zvQo`FV8nOmV7{l^Ms{rD(M%IuEQb(3V@K2`s;3P#>#J&I8$gsfqHvI&EQTp6dCZZ4 zF$&277O~edmO}Vt+u(LgA|-6yI5h7Q)k-SGz@&E`TwhnYM%#_5)r?rxrDpcPWWt|D zh|RK0JhTUu#qxKn^hAU;N1FAl+)%f6b!A=kQdg^jk$Ep&yRoWP^j2^wWZI_0p`(QVPG*Pox(Z)u)R@3Ipr)Zn3SL}d4zHtb|bWv0^Q)L?BFk)F1cmbx$+h6zov zaez=#_~_~tYh;&AYFxVY8~v-KPt#VBoM0o$AYG$a&182aRKc_uGzivo`$U_bYS7^_ zqG=@)42#~GT|e&-M~$&2V>3kU78?x_ZBN+!%RP* z)uh6P(@ECxpXp_tf;uaix1hdSE@E?xreWAcVVF^S`KE2?%F|(Gh>uLg*c=Jdq?hFy zTX|UcVE@KU!$I`W>>?}mrg$Afw(OhUCm8+`ZJb4T{HDe@&&dg7* zv?rPG1cpwg`38ajJ#Y3K%!rnh4l!dBLD6*6Dd;I+tcQsL85N6=pjshDUW|6V4H~D7uSIb8x!9k=3tEDmK()IJ-N;G3rG@9w1w8iw8mD8RBc0tmgwVHxX%d|+-i_yM? zi!&}ZR##miy_)Yp!j|tNWP|}95NsoFSO#AZGSV^hHs1q*sR&D?VM~)ouJ3cdg~4P) z&S(%>1pfRYPxrgL_8WmeWHb5HJ+bfw8I!%NE{K+$o*RznCPlV5svr4~j?y2J(|wm8 zv9?d4i^~aLmY*=iV?OV9puT`5YMQBG|HzrNKwbGv+BHYuXCtTlv_oZ z+O@#N(P|!_U{Y9`*)get*n#ZKmk|ZRIL1}&1l3zT-D1XmVx%Qg_K>4(WJd0uE)&*{ z7G~3O#)b$;M~q|HmOMsML#lkHK&&DBQ4Eepvs$A_d~`w!eR&TID|cuxbiEv*Z#ORe zQBW7A*t}?4`Yt(eK{{Ft$lFEEO?}iH5nOC-)#@tPFvdV#69WTS$`n7Na62;R&L|N@ zR^rzm+4m^mhyz7nmi2<~N>Z+cAHtAjqL)rDE9#s@MW%Q$^5fu!N(9HkO$3r1k{MJp zrN<;C%{|ZyKx}PvGKSd$21xH{^B^R5sW{TYO`FeHJp{71O3pG7LEVTxq)75w!b}W_ zT%fthDYNXJqU3njRmW%V66Jn&K>zOeGVi;yR91IT` ziM79qg_>rBLt#}nJPI;C1aI5YFNtPK^GWxxN^nnN_IwAH$AANhL!43 z1x>owWLcxE?uRAv7w)MNpKxYLU(gZjoEe#@3>l)PV^j-b)0LFe$*SZ)wQp=Uvzc;5 z0~v)c->I_|)r)qR$Q5XlXQ7&Y?+*lqvRIgFDF`-zG9gWure-FzE-8CeTPkp#9T2-! z$B-tv>5s<_D;S5g&?#Hu{I0xd-Y!>Ct*bFbpDTy)qv=F~A_7DLhqPJpZ9Qo)`y1q@ z=ok(SyPk9Wj_Fb;hJd|x&6FrT&DXmh(l=AYzV5?k(XxhQy(CPS3xq^6re&JWWUPj%D*}V5)C9A=ozyfx*BdLBZrHH;7!l^WdxvV$QL0Zi63M0X zN2;=}t`g0osG`;*q!1Z(eRHFvpH05a!pspJoWFdSUdvb`Wh?c~;Y|VSMvDoo21L&# z@m;bwuvZ9d1B^jiuxg2kzB#k0q`Y`>8LY8BrsLhlJ5$Kp19V0WNrzbbSth5+qMeb*xCzh_LdQFkBTq{X4!^PC` z99s>cdO*-cWqRlnMo6t@ITRJj$l%##M)abAJLWSO3&}2Ptl^1K<7EK@Vqi{b(4W-N zGI#oUk!+;b?B@hWyOJersz&6r($O*h5{b3wTANi3d?K@M_|zl@xM>#|PCD>MDl=ma zBc;~zi;wBST4-7&drqiE*an(s)@`T`G9x@6--L44z_23a4dF(Baro!vUbuBQu4K2bPA#m(Q8NfK&tez zOX#4_2EbqrmW^bjGem(h$dMMEL4R^XP%}wvx*TMB=Mz9JH;X)ZBhq}Az15`jV0eZ6 zOUxTxpl0|tAH;?lEkLY!5%o*kqaiX0?z7f}O3?-p1vM1CXjGVBR7IMH!JZ&H{dCJz zD#<84R%Y=Qi3v6#()Q4VqE8$vNR_s~ca#1%f77O&YV~FQ#8nTOJi$jp4#Pv^l=Y9B z=CdqtlZf0@A?z;JBf+XneFO&|QRLD2NUEYFBL&j~y)~ng9bSYv9vV z4RTBBQCfd;nNe`97X8-7<>(t?ooeF-qvKe?N@%qrfrSS<;l{g`CRk9)R4b;gjK|XX;bl1VVyQos zOMoLY_9iKCO%rJt9@nmQ$S=3`3oB&jhNQ!BdEs+d~U zrB<+jvMm*pgl>gcO`RK!N_V3sx=>HmpkP~$zOGEkue8Ck^t<#cvLQA!s;Z+oL++KR z7Y#j?+!DT#v4L}EtM#xZvU3M2Ii0K}veI{>Z_c1rQ_m3tC6YVDo5otLot2_lN^M?` zTC1|Txw^fbxT9^AEn4QV1N&5=4?<72ThJni>QtSaY-f5jhKVh)T2?J|LQjagG?Ca6 zC!!cp=(}1LV#hit0ksy?beEeeWDfwfB;Hj?SpjP)!`669*DBUOn!8#p`d;5nUyX<| z=-GB~49hke9+Ao6febh#UN3BxP?vQlB`~P3W0O{(hkN~0mE=T2SiZDrN4L85Qg@(XBHX5)V?5O;k(i?K+_W5t^vf(#{xDxFs?) zsr6gis(NBg42$S|*J}l@TE$xVN;KFz&}FJ+sQc<k^Gt8~2Sd`F?rCa<~ zLd}r!ZIdvuOIyB0=M(C$ja`Wcu4y|ui+^+A6B?By%n~k#gM{btO zo&mDn7~QYZ$ytSdTy0#!HX|KsqsfulxQqtcnb@H=>Vn#6%0g|dHN0sJBe+qZlZ=|p z?87KM9zD=fy(QGjI4{;D5=n_iAFNs_6DpneV26&F&y;BUmZSUR^iCduI~s;eJ$W3( zaRmZ|>@#Zv;|UplV5k_E(-Ob*C-``Vw5IK_95NEHeGA)q%BBaL;>>=F%xI;%(!aFx zq~1Tn2cG4mXSOZiq)8_9;z>3&=-9&Cod%IstG91K#jZNrG}q_8E3_e^hEAhQt}keH2#l$$9U*}<|-EI@=K zkYs4xq%ajSrC=mYu?=YwwY+d6Gn!-DW^_n@T9BH-76ffu5eK%l^{`$03^c1Vx)@Ss zbf?UXf4FVk>Y8QMwZjnk0}!ofJbVDOflv zEJ8`E9^unV-X!CCS)n-BpR_+?(|eRR*oIUqdq+Sq5#!a%gUkfkIwI>|<{;3@B}=gs z$~^lAgJ!vvTkEXw!l@h^-4x;A?+@?wD!5Pf@AZ1Y{?G6A9s+B=y4QOP930r|xg2<1 z@$g;`d5szZ`@ov7@AU@c85{!39@*;+gMDEB9G<_i*DC{u!5VPjoA?JCzK=h!_c7w- zWbHw)0aQ=y_3i)%p4{v02HhVJzu*sv|6=@s72xpGd%ae$_rFO8I0Wtn^Pj;z*Z@wP zhr1tq<_~TyhX>bS}25Vj=edJgD33p)s zo5TZFyhT3c`R%=)x`gMy?e&Vl{(lfYSf=)QJ>a0V&+C`xynWu&;1GBKtQoh@8^@vM zWvA}*%E08LeO@ov5B7t-llOUp;LruQ2i>W-U(ELc+=De2?(=HEff>Xj&*k_7hi4KG zST+lPVDFrLUjC)LpS#bS2PWt5^BM#f?(^;d^B3*&2Eek4eco&z4Cl5;mR}kG&uYo!dn8?lW$N($+uwRJ}(L8H|_KK1e?hR=*ISW zL*O28Sl+h~KI!P+44uFsun*h=J|uV@?!kuZaS!(0NcxsR*IURpSaU1>!C|l$?7Iy* zgJriVf-4OZNXKQRA3;sI;GVZo0R&vMdpKXe82KLK6A zJ)fi;K=)Joytlw4IB^B>e42EF>H+czx}U)vnBPx%t)!eEgf3vszmq<&4;%!C9wL46 z{Y&JdnsC5g(ETd;2W!4YIbTM8A11$G**8fKIQ%H_fyr+ZAE>@VdcX>B;^n*t=Ya#e z2p1gw?mn+*HP7E8T=LiOeZrIUKZSpA_@_Ke`kyC!u>WP;ldgfolnYq%KhTf#H2i~b zL3R9oZwSmkb-(u(*nc+9#6NJse(w(A%P-vT4S+S%_Ita*e()_x2RLyR`MYSpHxFz8 zH-Q6S512oFzt;~|fP-K!xCa~p73p`&_IoSAWchxt73>G^kbKSD?>z+W0iTxVS^K?V za1b1~2LGT7_Rq#Y*sy57mjrvkKKZ_4zxOEEx03XN71hMImhfu#dqv>T`u$!F*jI-? zuwn!Lz#8x&umKzdli+T!7aRuNjr+a)8oq;Npt^!^Y`0aW+w z_jyah*bDZ4oN|-r`=J9^^9lTe z{hucNb;S1o{=p>!sI)O!CKUe_{fSbVl zuM<9b4Mf`$~?)MIW1E9Ks z^n4fp;P8|9m*<~SU%{H^@CWwp#vjPp`KjrhP}a3whScl?9OBfatr4uHMtfHx%1-~st=9q`mu_y;F~Nw5qY z0BgWuuoYCH170s!1NMV`;G^IWI0WX02@fm-)z!EICxQ)NnLIm$2bM(+cuBAq>;s3v z0k9#DaO6FB0L(w(fR}#_?!h9k2CM*+;3lvSOoHmf1K#~$J~$xX!69%M90qGnBAjc< z56A)TD*t5C0jg8*57vNv@*Nxi%kmF+PlFBM9&iX$?;%~qqyy{&E5Lqm6F3Ma!9Cy| zU~<|4?;&si90VIm$PbubdcYf3Pdxx#une3B)_^r&{&d0-oI!d7%Sex4Ir$NsNqz)p zk)H-|Hu(XE!5YCi_y-5);vXEinDPPp=aCP22H%qB`NSXP8Jq_Wf;Hft1qZwyFn=NR zl=t8u*tZD(pju4&8=(WpVGe2ltN|M?#UGdi`{X@101kprgZWEHH#h`NY$Bee&<`92 zH-Qz)NVmKP?+4446R*4ncY_V!FxU%@YbJcq1=R||0V`G>@EX7xum>Cj?+5eO5)Rk^ z?g9I2@E;@m2GS1>bP&JbR_Zmlr;~aO)^w9@a1h)h&)4Cvg>t(Ae}XrXZ?Ft(1^4ul zZ&2Mtxr6!OAUJ$0+QGYfQ-tE*Mu;Tp(yp>=L*Z>aSL%jjjy~GbDA0U3PA3Ok- zeU|uJ$;ZDFKR5{1fI|JH#6&eV_{tgY&@N?-MWB5B7iq zV4vXQ_y-4{B;Vkk9}w?*3HK@D1&6^+pn4j5fkQtczo7dY>L*wM9sv7(i@z6$U>P_Jt^^17LwB(MRpf@=Ih?;$V=4uSa-NGI3}PTWd3;5=~8 zq=Q}qIC$1U?+$qn_Jh6W5Fa=I?glH)J?On9-@%EU_yfzpit|V>m;@WZUa$uoTt+zH z5cnuKu$***6)Q-0iuYg{*nc_c29v8vx4Z}Y!Ll{P4_1J?!5VNFYyih~;l2+4;Lt|m z1skp){oo+@ki5T=e1m;0q#Nwr41K!^rQ7 zjP!!Z`^YcY3pRj#V2`~29CQYUzCeBjzXW~d`&TL7oy7n3gI)#L_XytIOH{e6(xtfJHVQGhr9tWx#*BL1okaHp*+8K$SVTX*GVrp z0QSiHN64?>cS$E$^F8Pb_JiYY#r@;t6Kr_ukhclU|L;RyuRK44KXA{p_ydzaA%9^1 zbENM!zW zdxK!j4Trr0-~c%8F47CSVDF8@3-*DVz>4>gPr+W&4K{!SU@!PIn12)DfJsn&7F*OBfKgB<&_TnEL*hhH@zJWja{xGjcdI1jojd}qNc+d;n6FTDcgJt0(-lJeI zI0U-(5pNhAI{t_^@gDr2aKx(s-4l;^4Pf6XN4z@(Ps1NrbH)*G4_J2Q5pUeR&>1WO z%iJSg4cJ?F#OnbE!TZ61za4YEp`+JUfZ-F(}9r4`zcz^p5Zzbs7al~sC{Lm4v58U%H;sNtNMLb~d=ZWXz z`1=py0rxyge!zyu$qzXA7Jg|?20>5joJ{Ha z@SNoTn0|w0U<|AQLtmSdklMdaJ8H_+~{3!i@d`^6zCq_NN z2-pIKo|uy^(Ese541?Z(&B+WH0P}C7j$j!W`Y-K3&vWDp`lg8s`gaf)w7>~4yiC47 zA-^Q;KriSAt;6P}2@D=SFYSt_&PzWS17nJ>o0lXw1s2{;obq|`fl;sq44*zPAus~A zs~wDj7B~!s&X|`8aLP9?o*wG=`gth>LvNTDKj^KPm!Q4}!(a@If>YoiXn`@%_vU$- z0sF!HpYr}p{D9H3<|P37&n6Er=%1G^Fm?g)!6|S;`FGL}FaQ?bLHl>jOC?wsAU+rY z!(i;nm(0s37<}KnSfKTO;{J?$KS=*U-=)L_ha2Xl1@v4_T;+qrRXaGP_A6=E zOZ(5zPVw{eQV;qf!~;FwAs*=eF8u@p;0)Lg=HH1Q&<`A2MFx6xa?H-oki+ z-dpJ>ID8v*{yFb&r#@ix4%&g?pHm+&bQgJoQxB6T7<`m?patgNMZX^-Pq6>5O^BuM&q+w}J^1k_#19UimyjmVQp=?)fuRs}1%scnWLWJjmdt?t zSJCb_w7;6Vf*~*f7Pit(?O!2paQLg1^n>ARESUhKZH∈jgvC3r4=dcz}i9q8&KZ zK|Ig``@v|0cHr=LXg5UMPU3-u-ywV-0M(-y-up{<9avGXf75gTtT?3|1{jK;MH+p!L=TiGbmAX%BkNr#%>Y2XTLozYAywdTM9~ z7J^M+2y6$#U=)migJ2Ylf&JhN7`$*n3je@70DWNiUHH-WUT9$ILtiI8Sa=Qb!629fhr!}MV{fCq;&lrW1byEiKIm_!-eB;0 z;)0P5;)26B5_b%YP-n3JX6g)vJLxwVxP`c25bOs-;HdK8l-lp5-hZJUpcnMrM|{Qm z$sde>Eui&l;)7Gar9J3|B&~&md9SIR)|@p~lzh6?ve3m7=cNn`u01aSaO%QkX#xH3S(Yd`Jh&{Q`u@RXu@oO!mf|Vw=dFkz zwBETQO`yMSMIwszD>A5f>55E&(GRVN=Rfr8vK8@yL9i0Ef-4dPr>MY_On zRwUV(I&DuSoH8 z#JPz)!DuIWg1+yqNIU55T9JOR|A#9w0fv9HB1wIJD|t@i_a`e-0|t9mBm`PNB|pVG z$PWznk{>ucup)&!$mcio3-mukzrfHialr7S#8LZx;((F7qHJnNa)f#My&AMjWv4pTq(C z|3e(m{~U4j{UUL|sdeIj)_&r|iT~zR@q?kauSyf>f7hx+K+i?1GN?Q_1;!dyC4UaQ za#eib)bCcM9`rrADq+z7^s4kK55^RqU6mx*|MyiXo<|Q>f`NamN&xH!L!kHHtJ0aBhmBIvhtkVt*=C4T*j2^!x?V#`FYtj#TU$G{mpaoiB#JeWN7Vj(8 z#1BT#T$3iyU%4g`(D#-#83aA&t;rPV1(S-OUK8&Eb^Yv`)PS+itw{(BY+sWu(BDEF zu)mEsYQK&+i`2V=IADK-IG}YWalqJbi33hONE|Tm(3*Jm;vXyqBfqB|=zENIihraX z=#SA(c`ybBo+6&&1nrin1Ly;X|GOsjU~HN^6?c-S+Go~e7!1y?$%MY&L)_=7!{VBh zf&I^~NdTMzo4~*darONgalzqzv;#va+AZUEKXF0t5&Oiic7XAFKfbU=Zv-bDy+>k;;A24|?CRPbT#JyY`7ENxO^pNg3$* z_&y1M;pTnPqV_NBlPKu_%03y@_g~#77C7~-eNw!N|8J8Y==l!$frZ~AKQIRN>-#8i zK>u%vvqn8YFF5re`GKB4?voJc`xEUzYm9z@-oMZe^#7H1``{m^9TT)+GW)+t+0foB}7n;Pu4w z9Oen%Ks+#XJMqB4J;Vcp_Yx0`-A6nyIzT+d``4xTu*3NKE&T!m57RHOA8ZGGkE~0t z@*}hZLw}^5;-AR#@WVXAPm?DYe1<&rJ=g+9Cf213^gc_TU>KYL{eNGVBP@7*u$`u>vr(yLgvUt(b7{re>e4ui!<;lF`)U}12-G=Z@z z_e%uyHtv@}wKwgTDRB7a{gQt)?Z3NUe4yt?`=uV70>k?L$HW1LZy^royNx(t_R9nqxqH8OjzNFVe({3-`)CLH2FMTW2iw8${lo*O zz){fi(0;K%A6WPT;tcPXN-+Egd4drz1jfJ!=>0u$!2lQo!=MHBgN4VU{{#I5V_*$9 zJW6}e0wbX3FVqJN#i$P$e3JSU5dW$DQU*rA8qhON-e4Gvs2%JD1AilLF!l^_!Tt&A zbR4>8=`R@iJ9PqMU|8S(W4}c8Jva<{CW#9Mrii-@9`u3{uoCn?M|-t{VYN>a7qq|_ z=-WYD&=2MxPycq3Hy8u`io3`g^zSBbeZPnPf`K{Wf90r46 zI6-{SvzPc_AW3|1Dn)y+f1SKv2p%O;0|xU&n!pek1_Q^4MAZ%ssvV4hVQ>bFfSwl- zA1ns@K_55_)_^fE2u^`5%D+IQ3-ld}KhO`xz#wRWAu#_0{DWRF0#<^$6>a>_Ds=UG zJ%_av9`>?=qw^zBrPxdOH*+b!1$iMawiUi(Tk(a*AN$4pu;-kU&OY^xrKf1qO#36Y zYTwLnFY*wcyRGoL!_PnNsCQp;bjMLQ9C>5jw~x^F8mF3nR%nOZb__2vy1=2jX6Tk5 z@mmmZQ}?cGj_TO-cEDdJbl~b8^6|qBolD#y=&sfs@;NOog+W3 z6;s|b`sE#RBd<68op;SfKb0?sul&jm`Ro>aEqqrNz8O9VAKapShx-5O)_fm)3;g%Y z_V2i6qk5X(nEHo*U<*DD-xb~=_nZ9r*W}$u4|N<1sCVVpcE}z1yvfwlQ74@*73ij@ z=aK3sy=nVe?7i3Tkdw@DyTCran&);&k(xN zAMcP~n||JTupX1}mEYnwRVJSvPt7+4Ul0G*EOAs7^>Bp`A8t>ce-&^>ZgfEWlkn7C69e%Wbd3l_3 ze#fD6^iT6HM>liR4yoQEUM+k+zs<|pe{>dp{4RbpPA7cf%{$~>E_^Ar0eCHSILlrX`I@7f_3nQ>g!muhtWz8!LfsdLm><29?l&K>eQ zUT==8F<(32n|`rFE--mx{po}6g1=-7ehhvBzG(|S4qtZn4%xm1UvL!lfXlh2!FX*XLJ37PyTZ2{NnKW z{1#OEvRVIheRW+cV82!V70RbK)s|u}#D1RIGW)eLF4gdU_={Y4okxxEA^2~aykj0| zoDOso=)Pp?((^<8^uc$r-;9{NW8SN7T=ThkhdgfT9P?3iDReW$`-wT;F1k{V2O)kN ztNZ0<{~ha^`m04Z^P3%VvpGJFeyVOey5P_b`H&gc#a}nNuHWVMH-fHkIJdtzx|&BE z>zqq}i#U(z=eNGO*3Bw(#ry{N)9hE9b#eI9acx8w{L>D(iPxJtWB#SqjH6Te~ph3UsQuZY7Z z;Xj-uAB|UZEY|`S7%wxPqduyuLf5;PUAHm*=)6meijB@r?1Fgl|8B-^OOyA2d$haqJJr?vz)Xbuf<0rSSa) zTjx;?KMWt=B9BJ+$Z^^8(7JS>>wPJ|@iqOp%<}l^DtE|80bi!Dl;<(sAfO*ITr6%k!f?_=%F8!lmegJ%B2mB2D$tG{C z6MfpA`iz*o+wmWrh3;`v=U7kld?$sjmv|>?z0#Z7iwaq{e{49%3`!$ZP|Lr^F9$s&bhw(Xo3Euw>*554aqQ)zE5&IMOp!ky+ z&+&O)b=BxREj#5Wrq0pNjqyiU8Q>lS$T#yc=645tJ$%yS9ey<406O2rJLPIKo@2hL zZW3MbRXcNj9?fIk2H(3=-e|@(@+yT7!w;G9T=J?#H~7_^@;Q#HoBeZ{m)p^K>Np;_ z#M3%;!h7KZCU1N$9e@wOzsJnSt^eqHxo1YU&*NIBJa+ELcXrB6Ir1(?SN1;lywy)F zd<}ewnU_nQwxjcNPm>*{&L#hDbouohH_Y=17k?w@Lfpe6S3l$E%09&Ylfz%piOetV z`H`z0Rp@#z-?|zM#l)M~DVOD_V=cP+f9#aA zvgkDb?dU@P+9~I{_$d5ETkr$$G5C|W;K$*o;NQFjzXb33_f9$Ah1Ypn^it}l zyg45n$79X23SHBGw$7sgz6E}(JX+zq;J3=78-5f%*Lm{@x?#q9tLuu>@Uj2ylxlOF zjd`1Q5}ldex*w(Rh4939~rjPtp9&WBBZ`kGDSm8bc4a2;VY zo}(Y?rw(1=>P~rx*PA+H9oP=v4}Z7GJN#(8ZgiDvJLS9P^$JJcsvA*%N9>Ym)1Tu! zP4kMQYsuSX|NDo}Cd_rg2Jry6?{J0Gt$H`O;_@4~LjL1t6? zcI**{9h0Yn|Jt!{b-vvPpMTUY`}JYte0&VP4E{$NEb}=eoxl2z^ItD~y~&&Xe>vk1 z|5}qb+Lyy8;ZHO710#Mde187c?VI6?;jeP>uXX8wZ-M7B_2#B|_h1iU_o+40FXMcE z1U?L3oMXL;tN$15lJYJ56ma3Y9sa@B8*v=Ram}X!U98HHkNRX&z7Bp0{uVVj@>PC2 zyxzm>11`MI=T7)2{9AJLX9(TkIlJT>(~mKplkgMp9Oe$@p|9CAk5rn!R}GFlbv#O5 zNxl5LLDX=gm#+wbuF17Q+p%!Fm}RiZW_Net^bEw9r2a#hOaqy zmwb2&en{KH-)Qp2x;_b?gnykmUuzCtFG<1YpTA4qZMHYAmy~!}f8ZZ9d82(5`~>{# zP5-qA|NhzlpRC>`ZDxCY&8Fkr>gD+P_FZzmE)bdiJLa3#uLqsp+wBrwXEwDDd5Mp` zF=GVP?>KfJ_keqonU`ZdR9y;P&4s($OHbx{%KLW7sir^U`d~G@-W%>pV6z|T zI%%9n_yD}*8N5qBJJ6LiaL+mQliqY5^kDa5|Df73bxQC5T89z%AiQ(lO=7Rdu7|zM zrui&k4`9FSFy3VRIgTqDx8xM&*JZ3L+Bl;#*2Aha|51}S=1&9s1ns%Zc(A>`X4{zm z@T2gybs*hd^X!JtznpumX@g9BmvJ0H7e#kz7M;e6Yd+|{Z|c(Ph1Rj)Rn+UlhaSgD zu?Mj0VK}pCepT3Out&{0I*#KSw-McNaF^`U#+iPk_Y;lV1|Pj5y-ulyZKMC#d$Bhi zfg#h*F>h2ig3fB(C68t~zfoNrUDv0$H=Q29GyWXouDT-ri(a)$PCq=mt_of6mv%|1 zc^%HhUn9Ey@GhC;?~U2wcA#r&XFtzUPb8iJ{)=AEx@6YHCGI4;${TjcM@@e&^C$1s ztk2wo@nKWv7)Om;j;<`icyRq}vmXwfj%OXZ&~3Xmc6Z)xY-(@D-sEC$!yd%Gao(BM zYrO8X{`Y2Hj{J3gji4*MeV6@upK%8HMCQ-5*zdiXbPSPuNB_B=jFhq0UIuj;P^dkgj&m1g`I{i%ZQg?IL+ z4tvbS-i$rzVsFFl?cF7sOJ>{XKlU>0=Dbk*0CpdCbG_f_e_B6l&KKkSG!CDnod{=a5?V}2Bz z%J^_^)(f}b%i#y%FLU9wF17GU_>Ipus$o-mBlh4gcL|4|%}wjoioFGUNUe_fxUv4h zkHUXU2Qb4sj(_TZ1YO|I_T#hKC$ZOH&*yb!Q~MHjKX&K5D0tlgy)N&WP4g_puKsQ3 z*~WQ8HT*FAIhjVPCTuDNNtWd$`|m#u!}frCT|=k%Hdlc-r!&h?e z-Nh~V4*23Hx90oclklrsv>$_?;GVuuY{AFjyT-R}UvL`zdwQ4r$)&xHXE}V?-*(BY z$vf5u)zzW1(AoAg$GGb}Y(+QtjC~!^_MO=Ku}^1-qwR;#wQ%p^L&hI_2>X%RKE0{m zIQAy&uQ2DM9oLuDPXoFnx<8oljPr_C z_}+gw_J5ap_Mo%SeNGd|v+_{CmroHZX&&Kp3%I~Eiv3nKX5u^is;&Z^|36$eFvr!Q(>M+2 zn*M9AquRG)4`MfuziRJD>z(!<>>>1=#%^vp9z)pMvA&P#CKA?4Mg>QjB)6CDY zAE~YfU1SgU4nKbDc&Zyim*gJgpWkNaT;|Uby1+3r^1L}8FFN#l`Xz5*z2n~9w(A}j z9{iqu6@2A!+{4%O<1!B#(S?tnIdI-cYPxOoANvIM>vf^ZjGs%sJ?Q)=&e+!xM;xv9 z7`mAk(=QE>@n;;T$VNhOuY+9<0una&$E(&B%+?e|l4UHTD4Zf{YQ= z{xzia6FJUn+t7JlF(WT@wC~2AkNwUp^F#YRf-dsP8T)yq(eG(^3tp#1X4Cvq*k`bJ zYT}uCIqI+dE3IIE<=*LqnZ|14UlsOx>>oddH(RvV{2I|kxhML@{+rQZ*G>60_9e%g4DcbP{;Z(=uWZx+jjVV_!nwHGkLnKAKmDBFP^dgJwlzZ74dHf zeh~h+4aa4m}bQ71($V<%ea2(fF*Mlzhp&9utaWWhSMyo>e!emPu?Mi%nsrF8 zvthq)*I&1S!h{d)x7^Lg$muY7vbc$3)6u|X4A3_e)Tw187&PZ5rM z@UKfB-_F}seBL(idE3g)+vYoWTjjwY*j;z{#{OHa`m1K_-``8CwoCV0=S2g2JG|}hFOGSue%jDQct*jQ=Ki8S z**4}seE)Sb@}S8({A~0eUCs4}<~fbskG)DAX8M<27qwm9TUg)Wb(&{3wU=P8cd=Js z4>;_aXDxP(|F0MDCKJc8U#Z{i==2#2D$8tIhYsw?n`fk1jhXgFJ^R!@?LsE+STEGi zIJyYBznePayl@FV@ZA~v-wRaBruh|d0Wkt^p8sqA%CWa&e@um${2cvLT^%~#_hw|> z+@Bpf&9fC9#z=Ou-|UBH`bK~_`$no zL}O((ZMPkJ411dzGxOTGPTC3Y@0*dYx$v6L0DM2ZxqqsC40|v3i?v;PQ~NY_3p5c(9Z)!dLa+{+w_Drlb_?bukEYQ6+dZTZ?&&=*bA{wn00ZP*RAMApPG?x z(PlG_V_jE&J?MPnJR2s5ZVX))y1(Yw&zI2oCwSJ2nV(}n*KsQGvwuE2BMoL;++G=)ZXD|y}+(%Wwwp}``N#+ADccOak~$Jp0|vl ztDKtI{9R$T^A`1+Lf`aXNBte+q;)7gm-&jWj@O&xWbC)q@P*IiKHqIdmz+-=3z9C0HgoA$R&`4!gpEcxmD z=tEbZoRJr6!}O-@N3aL6->$YyU0trD#L>;5%l7$2^DR1`2mokwh)hx%(n7v`Bv=jF(^4_)uEyJZh;Hv47#oqG(vg=ad=o4iriIDE}CcWJWAoZ(dEB% zx9I&KHv8*14r#m*bm0=7`D6M^$J2Q@4e#X{Q|czOsXc|g7`u5Mu5pVvu_(m;w=C!J zs;fdb`kLMHfh^Z$RM)5{Dn6bmWX>~}{&t|7c>Qh}FzfE38$cJT*q!xzC)&SBbS-D? zKJYs@-s`6MEMfP(g=agdA+vut)f&RD`tB~f3$rYI=_GSf$w+mUN;@rZtU&YZJ!_0^I7>J_^xwz+rQ^#%(F@O!Si-+ zuE!h4O-KHkXI>5YpTAo^aWro-^>EBH)s>@5UdS`3jx=UC4a+zult0BifAbsH5gtg|6vaJWI^1k1_um;Cnl$bKcf| zbiTBq(`T!_*&JU-Jk|A~E9=@VpE1YH*X_h)@K9lHb9^1X;?@LnfE%2wB^VTsRb$u$WWj_ANewu@!^@2TCQ_r=<5Z=82D!UvvaypA(?$NHf4 z>_FH4-`(;wuQQw4d$j#?yAQd}KZLyo`$cA*9rH!oPosTr0dAB)F9G{a^SBq|9aku^Z1&(~Qp4-vIc!r?uI!JomP`(pBu(aF$J8`4l z1DX$fCt7E{%Q20^`<~w|59S@&>_0v55%^2fKYNOL|r>Y#a*u*0{%eOBIS*1^cD z3Vx7hR9>CMkB(0xI(>%awY=W!zoSm7>p<6nPVcj}sdLF|0A2W^S^M{Fjl9O;z3<_f zi&^H4_AiC5tZr6L;`L@cea*Jf|MzaqYra)!{+DL|9miw!(}-^P1G8KH4xkObA3mXh zGwZ9dAN0V7>u2r1gK=4Z#?TF-`>MGPyVQ9JUEzmjrNo@KE_E)sg!8E@XXOoMUdHjH z3cd_p%beM?E_K+w*t5+q)wQDQ{ivhgF8%637y8(&e9v5`9r@}yKZb6mdG^r1e_@}( z{yI%EQ(t|}rg`Mmv46sI>)wOB%Q%*!oA}i1f$uwK{G{id#;=7>!hfFEnN9sSVh?_L zR*o>o#o=Fd9q4L8v-0&U^Hy~O==9mE*O>Ki9A{KFiLQlbu>SEB-emH1=yZPOy^s8E zos}1x{Wp$BrOHQV~GcZ{XE+>+vgoUE;XYozI|5u()&xU<5D;Jt~+M!f46j* zA0z1eKg+F)qnklz`<{hk9%-IM@8|e?=d3*G%=6rBzRb6THa@eV)jC(B_xxg3{%+RC z;a7Fd=mzhel{52rlNk>eT_?KOFK1<^>Ca_99zxeOFe_g&=aq|Y8lCm4S^1Z#bD4hy zA7Fp{^{gzvz{t;KzEq$a9+?$x?R>Bw#(Gr;-~anr`}bTOc@@#L6o@@Ke{5E!3k=>R&q;Lo7*2W^`RVQ~1t&BX1X7Cpzy=&OglYa+&u-=<<2y@KIUjlh%0} zowaB7z~=(q>!x*1VXxs?#jR?{)YhEKwO!G+iTx&yv`byiL}i8q=4y6o2j=z=Hgv44-v$a5S% zP_)PXy|Hv28fQt{!`r^s>Da$?JWCp=|A~8S^GDlPU=L#7c1rd<8_?C9xyQZ^8uy26 zg)ie-+}tw#V1FI!^2Yo}=RJ%5BFk(gycoh>jQuz@X6ls|Xr7bs`S4emyrZA0%e#zv zq5FfGhhsn0Jj&4}-$K6XFTJU~8oTH0L-T7$>)rCxcCGL;_;a2wbz%?T?^bgjI`YxH zhtQ3_b&tH=%-c~vtv(&#~#x;(&Bk=l+^)pP~alF<19M_ld40J{D!GG9$U4xPrEL|4zV<-cg^jJl=Z2jM@NrJuTvmInE+b6IP%kew4!U`+4N8Fdb1u5-NyK%^YV=Px0yPlZX@u1_y^4M zHiw^$@kclDEuI-~e(rP3bB$MY1^?Z=N6rK`^D@@Y3V1L4)2}dihaZjCfNtjAJ<@5O z@3`pN&;@_PyfEjb%R1GEZenPUw4S(iT+M$RUF69<^2}j|&ZyTCd|-T!>@(xJ)T`u5 z=HoN$2YH4c7hN?v-#@4avdwzA?0?PZX3#yAV}5s{i~e_y+;+I(&n4~n`=<-jC%XK;O+m0@LW?a5+&QBMA-RP2)ar^J>T;|mXy5Y0p@@dnbWB<{4 z5ZC<9j!UztGuFd`kFs7?#pQp|ZuZj=PuKSfbWwDAc*|^Ruf^Vly)a`0HEtvJ2=)=R zXX{@dcxrxSXM`K0~qMpyasxc$C%#{N14KLLMz zp5eza?i=$To&TP={d?BN@i6Zbj5mDpHHIIT`CX2#{+YPE@MuHlh^PIlLl^j0TxNK^ z**}-RtF@vl{x{>DBmW+Bp6BBB`^TsA*Zz&bd*MH8#xu@Wrs2cz-#2;3d{#dNpJe`_ zd&<-qbt;D+oQ}(rdQ!N>xNYp{eBS|n@#<6!#BY{YtAPZ zKO-9N#dBNtA3hA9v;QpoNpxHGAAay9b2<0pI&_hj&dDdtydCpI>)ncO;$?GkOS(=Q z--}FNSXI6ozW(KN_UrP-abpO+<`r}DX|$W;VT{)#d>8!5=KOM52lAR(-%pv7xg6_2 zIl88@Imz{V#yWJ~^0`C)e&39}7`yHMdB$Jf+UJ!8)PcSx7{RP-s%pL|=-g9`W<{9`%Rfd+Ifm2>h>v;Ho5x1saBb#BY+ zTs`o9_|wdB*4J#hpNzl<;P+%%pLIUP(G{ONCmq@_v;U^+zp?)_k=o&H<6~T}DTnVm zZ_a+b)1`iO=)&jE*{@$4ZgeembE40)+tfMcubv-`pqqN1 zeZFa3Cb3UofAkomy-WS`K104Ap0i&kGS<&h_!xXD%ke?$SBtLq8*}#GpBR3c;gj%5 zw442L)KB}g#@cMJui3QSSepN_8mOy&FHGw&jXiKZ^U$oLqYm1> zAjJ9cx8`hr&s2LUc8|lZIaFa!esk`?^^eRrV%JUEHNcnA&Ut-nJN5|nk7UV5^X^7B z(J`0x`hdn6QGYkgNe{0xo8~vE@o!`vnsJQvGX+2R?KydmHp=9mo~PQrgahgfJeQ3Q z^2T~q1z#39v|e@Cy)O1(Wk6+67z(=>>wN4}Oo}1?6qdAT@ zadb7E90$#M82e?x=a^sLos*&*$AJoT!#`yFvaEj_>FSBWXwqy5Tf1jC$ zQP)m*|Lt>!TzBrnUWq-|-xA`**p9|vf6Th63wj6$nwp0K6=Xf@;;m0@*RKN#+H774M{kU9rZa`N*IA?!e zr7_=H;V0nFG~+nd!;Suua+ z4x0CNbpGe(q}!Z7F1l`XgDZ3L!7To?ek16tB zm}Ono`Y)jiylP&)n4|tBEzJK{&)e4lM?H%0SB-A?f94PQ-ChIsLG0lidAFe}Jat~G zbLjfeRh~94=a}_$tUKDjadd&x=jHS)b=X+{(bd0c-v0XuDXI}nl`g4r0=2v<(|Gk%aW!AxEf2~EA{J^}7WU0IQ+m0^!;d%L> z8P~;MH@b-{=IzfFamjB4-Bjbe{3eILIJ%aP&&%04@+W9C5W2b?BzL*`Lk)jN{36_`+M}<+VBDb)zf3ect{%Lr2{--UzzT zPtoyubG{p&yQbk|@VA?JyX+4IUuJ*!`Mmvk;x7HGK-YiQy#4#U>3Et?9lW=1{=j`^ zGy9+B#L%N;}!FR2(9w?vQ)c-j4seSX(m}NcH z_9=8_GA~D~F1=~{qOY(X9iEV*j^|A#KbLw{q3eBNBIo&5Bf9X3iLBQ_G@lN1l_wE5 zor{9z(}UfI-F6>rN4-=xhOXu13Hx*29rH!wETN0NB4N8erS^ia^7#k*3wWK`bUaJ3 z4`ct4IiHR5;c9rlH(~$2l*@TyGrHoF6Qa){-mI%jKRVG(y(S^YX;NA0KZI`d?1X&m z#O%6hbe{Jne(%2-+$E42)f`$5;D%~&3YN%Z<&VoHYV)Pi*xi}{SMFULCAgRU@?kaw8t zxFdh{H-@hAa|!vasdI_Dgf6x{k@b42`YZW5{rv*<=k;cPUE)@w3w|*nm*SvwZxBHv5MiH93HmvNp%*WQ(ops90-o7cwr_QQk>zsT_CqAN#N|BHm&Yu3YU{-d+* zPUQUlS}VGydlUBGH#_QEN=iNGLcdJdf5+_d_p~wfcV9xTGV^oz((5ZT%RC!{PtuNQeUNwSKf2(r5^}QY(wo+~;5ybn?0j54*xqG) zE6~Nz?J?`@GXEOTbqyxu`lAegF1j{!o`(|lzw(!&U#?_GwwfG3LlA3%(KcMEx9nq ze$lG_POzjT$9Yi?y1@Tfa@R3NUXFfgea6sDoMG9&=ayc-%i-hj#jm&I+;p9DeSfp$ z2G+ATTJlqKTwLZ?HM-$9S@Jh?-Z+k5T9;;YEoWNxzt1@QZ5;p61uHH26>T!x#`t5; zKg&9B-*?A#Zf!RPpM=*~nN8bGV=sJ*Wq&S?@%M$i8yPS7TQiM7^;d#@5POBgUV(iI z``5L<=}qI*Vy~~Vq{Xa*aeQo6e{Z$y`@dtJYwn%sf__ULeIai$>y~4@RX2n#|Gk#H zGspN$qx0182$DR}2NRAHaMuG2iTX`DLjG3;8V%%=8c?4#JV%$ZH= z+J=1?yX`)rjyhY52k$sGFIG@i`)|lk=GyExGYXqrFRi%F#{SY{^?pKaTS<&9@Gn)oIzU z^BD2AEB{?fcAD#t%XoLA8|<>=1~Z;9UPJI@KeX)kdvN5V<2sEl+|6;*jOQ4Kjq(33 z<9~}K^JYAUPWxAZ&KI@ppAXXe%SQj<`){-C_X{<~V>`SB|28v@(Y_PD@OI1fx~Tde zfcL{+%InSfV)!4255sqxyixxpcux=KQ(5MD5t5Sc@%f?G60iD6Z)&f=9(A$TV()d> zwXTiW`>`KqehzUQ&$VA28t-n-qcm1#|4Y|J{q(`t-(zjw*T?Petm&`#E&Fr!jQzb6J_vvD z7VQV%qg%AsI*r4};1|sNUFLBLUGHxk`>9cfk}mk)vR<2h(!9p0g6|r#?APTSaW=*u zUF1PaUX|szxiS9gZy24qpBlff?$dl8vF!I%H$JD1!MBfCGH13o_&9w1W0pK@*44Pa zU+@FY4@NEdeU{G|8}lDs{}cA(sM>3>_qx~{u}2+ttxGHRF6{q!5pOc{-LYS&-yU>< zY3soEym_yi+J`hA_Kok+ZCDSS2aRL5c386PGHzPuCHUB`^m$Mwt}(7fKVITe>eOf{3RxD)OQFz3IBGJH{wsi zmo23~pJc{A&1;`i@b&Pv?`1mHuM%{nKjyz>_dIm|Rm1z?o%62&dnNW?quH##(Z5#s z3HbM$ym6fFhA&=W9WON6JJtv7#|S#>=moj|*zCGEy7m(m;;)L$H!&e9YE(fZ$Vykis8>?UQD7ZYg~}8WI4WQetA*W&o3;9$E=4-+;VjF zEerPNHM#V+4qf1?1^e&6T>9IJuIB0m`|ki;bUo-IUs{lP^ZdclU)@i~(A9r+!T$SQ z<2rR5z8AjO?59iqMYnOh{@Q|^YR*@edQ_q7y?#NSKaAj+^~Isn^`Q}6_*)BdrRvg~ z=G%&WqGLgRW41T`-qa1>a^r$LsBJR-jd?x{S%y273X`}cs1!ssS3Ll2ovS+r9{$p>!{;nK(G@^?>v|#`Kxyydnfv#zIL7qOG zC|mSj^BF+reUy2WNd{E=81^#kZ+6(Hu?Mh!&|yzu@4~L>XSPya6#bO?Vt>lqZye*Q zbF&Iv&F>dBe}BLE_k=C(i_(mK<_`;Ur0LgXd^^#_9$S#lXi}LvIO1!bL+FY}7i21j zziIXN#|8O*j`ghI4*K)tf*hA;#C7DS^Q8iv?{C!EjGNwnbR6p71J5i-zK&yh({|13 z|Jeokp*gZtkV{fzSybk2ED zf_)JC4|B}#YIMFu>UJv5GUMeqK53k0bj2l$axSkko95YuJ%Bx6*3+?n=zQx#*Yfg3 zc_2MLx#rs>`utNCwY5NiEG3+lh>*o?Dj&Ae~ zi*li*I4$1y)uSMYP@*N^wg zQ<_{x=g3=i73h4w+$&$#HyNFazXo(&f7>f9Wk85WXUguZuHnC={VZZx%ex+i~gRlB%e7cyRH^p%V|q;{bPpCrN7(J zSxZYYZT7=O*Ntv4xnzI-uSxxYI4r@97ogI`~^Unh60Pnt&?I`1{h_UG{!b?DJ}@JX|t#(BdC zeE3@0oB6n`A8~ZaZ!Bkhj;iKebPwl$-(0rex7Ed86}qw;mgQly&MtLmL>G%J%bQ+` z^DOI82fCR%m*sx5A1?j|(1rV!b;5@qSk8JMe2q7RuKl;m zGH=Fn%rDhVtH0l|KbZNu=n6Q|nR#egzMVr?fiCdyvi-iME}x4V(3L&1EZ3O+T*k8v zUF6Yad2@kL4;Nh@y57f^qPSd|$O9cbN0aCBG_k6R%#e-w((ozeaTZuUWAl*IfK{pldH* zk=tHo)WxNK1Lz8CR^*1f?7B&GEww8-?~j!?!1{afif~!<;CQ5u16sFI_$d4fv&<*m zuWQkbzJJC3ykBF#ZicV_z>2&gM_oJ71wObUmO9PM4@Vu88bVk6g%$hvlZ@Z}Ou|pV z|HRz?T;_Kk7iNPkD{@4RdX}TBXC4nm)5HeU8sFUt~=Jq-!a~re=E9)n^$Cw z*PHz`>fQ}M*tsGv&Qf=cH-fJJ2P^X09CeMWzaOp0&&_(c&HrC?bSs=PA03Lx=kN>5BZr?1xKz2he$XSL7`@){jYa#dojBdvoNM z_W<+lmn-)32S-12yvosy4y?!@dA&Ja`kGDqSqtBC|BC&2F)sbwjxPGE75n!^UB;ms zUH#yS^pxX#i~T_3j-d1GSdo9{n3r*Mg9|GX%~6k{LCy!3SL8->o;d2EajVdEt*pqW zk2msj(KVu*Iw~orn)`#xxOSkMd0|qH&k=V3UF=0kx$R6Nu8Y4(boCb|7uJc=f5Ip|GTTpJZMEXi0*VVKbL;=pd0>7QkKm8 zTy$gTy8bUI$21uIb_sn$acEt(xZ% zj`7g_tP@>qPtyKe3ghn@0~#-$lvknM+%M9{nIcT%@KN}WD4*WcZ(QSJ52`J*KN;(7 z!EZS~m`mpTopA-au$9dD+{y-YGmA<4^-f2Bbw6rD7koY`Z#d4#%Vpg9(6t=CDxWd; zBNu<;=!TD5mG_xC7k?>q$>LRclll4BMOQk+`G$8@t~2v<#MQdjqH8&ARV-d-Htk;{ z_Q2_@_Vaz0`O$$ciSFiH`#-vnZ&lu}K{Mm%lJ_LK-s)Ak$J}2Xd24=o{DIAP!K!_K zb;++BT`#)f9QoCu3%zqy9yaUhh^wi$qAR|5RbI~P%%=HtV)tTSe;seK^lu1VvUOE1 zH}@x(yr@_#Nxz*H*KBZ&?pT73liEzPfqeq0Q^iTige`5q;>oRr#oS zd~(!7``v+V@TOI{)y&gHH-OI9xhnUY>!FKo65Z$z@Rw)Q(M6Z{5bO0Vt5We&L+3J| z%F)$7uqsc!FuSe}UEv>BWy0)-WBo6|MJu}GpH>h2T{tt&>GeqGM>l-U*y@4%Lh@cW zt48TY(l){CcB?cW!4sZ%++uBTV!_#E@P4qbS1^}zR)$yYb+ zZ}TwYi`{noG_Esrz}Nqqd7ovxv@QeaeABD8@1tv7#;})RKl=r|$<)&^j@o_+U2vXp z)bUAg+P>gn;#;dZzXwr)&bPQ~|K6LUt{SHSU2^a0f%}OVakgU*KffxM9fmQJr=z{* z(~WL$c~z!zjPnS((E6$zk!2mweB$WpJ!^;jT|Ms++GDrf7u_YFa&&`-tx3d;`<9-?2;iuq#X7Y~xL-XxM*L2j{f#0vImQCw2fW1F|P2Qcyn@s&2 zb1FhE>y5w8eZ1+!5`!se7dmgVdo5oLJpTXX6IBzoXUHV-* zLVW+4{l3U9x>|G-=&sFjo}h8Jqw`<1CjV=$-!A>`M%RAHntVTpZUmj@gKP5p6SMat zj;{C9Yw}sspG!ZAey>TcNzXCa{Z*lB|MHp~lb>DJh%R*Pn#>{Ftg}mhJJ3~LwjRm2 zImSiTlL~acoon)(=9S*G-?iBDcd>t|Ewi2&-&bpfZ-TEgdE;|k2YfI57fjx`e%Pn} zXV&DOW_~Vp8%H-hyC&79pLG2-|0Q?}Udxf$HpZU|J2TkBYINkU?aJY6_N>|d-lpxU zvHP(vo9&G8ZiM&7*QCZACztwnsQ<*8yg1K@@93Y7(}2d?yCxT&!UW3X=@=)~O`Gl*dDWsTJ0~S4<;Z_KI`8=@`|qG#>d}oZ zzdB|A`-Dq9M$i?$JtZH?vOj4(;^=DLk&?TP&fbrrKU0r)r|iE+bex~4zbbU~?;$_) z`j^W%G@=V$o{}eXtUn#-ia(jMUw1XupFa4q|4m6e%kfp`<2X92B_)@d^)NnHEW!J( zPRWbWX10y_KgN24J!rNw=5aZE%a>BpZpL@?SN+tXn`%!Tc&=$?ej5Anc6iVADcP>U zGrUWEyV2F7J0Zt>8bKGhAtgJ_Uib- zmGOEgb>Q#(2gifs%z@8srSRV2lzm+{*6nKeF#PY$d1K7mMtI*NDQV1ce$j!h<*}6P zHT!R@Lw)e|qbWK6Sfk&Lan}BfYd%k^{oiUB-6^UH-oqmmKqSTJxDo z$$LzHE_Ex2asIP2C8wBqrSsN#Tn^s_|2uP>UGl0!=bK4oeV&^7YeknIPv!jF*@G@H zmy($ramUaVCsOv`O}eZrOX?5ZN|yPk`IS7udi#9J{{0D;{#K*wUrtG-nV%!B&dX+W zqbn)<-&u{%#U1c9$&~$f+Ai@1&_!2M@-Opz!lBc6lj!Q#QwQ$zmD#V2@l3%t!FvOU zGrY^ZD1DOo^X_%~-&u|QyBgkm(YpQjv@XZ&dkTLaT+jKvn{srO4eN5QInFNqtV0*PY+YuujL*jW zM^|>my7axy=%=Ips_Q}5-?1)#HRHPUV+>vWjqCF99P@e!UG(O4`3Jr?>+9mLWE_8; z>sddiXnxh`0^g;6Ir3{pH}k!9`BawmO6P4SI^Pf0^B-Ny zkJq>S9F~G_htKxh4DDa()0_|7x^91NhD*I_(be3xE~n=h_wDEcJ?mM|S2h1`bnQP~ z7d_4294F&AGz8yu$NHA{y`O|n-nlOGG~aCRn6DZq?{A#n|9sv4xy$(eT`9cxu66tI z(BP}#WAGm^;~4vEBYa^W^XM2O4@dnpj}CPC_pi$tTlndNFNXiESr3Ao3?L; zZ-KYl|aV&?ghd(^ei0>FjjaP@x|1kTxxgR*@o$6ZAwU4aZzgOt+r~U3h7x=@v z@Ui`nek(r$?|F=MehYqD^MU`k$s6lQ-m@HU;IA@yM}2hOl%tzL_y6p@3D{NB`~SaE zQZ$_AN0QT^L8%j!N^}|}#W97XPIHl*1`UdiBueTS8Vqp~$q*+);$t{zFqT6kln#>2 zCqqQTZ>@d5?mW--Jn{K_Ki}*6UjM&+UG;wUYv21`_Zs%vYwxr7+HTmbi%Y+gwntX?XTMHXXoFZ?|A8Lx0hPK zx8QsI`P$PYyFJft--0!z`;dk~Hn6J+9=PmDQxx0<1iz~->Est1!U;g9N zSB|cH_E@`3?-qW%IzKh+337+sUNe8a`PzlE>tyY+@9o_mwSONdN1vTbZ@9I~+qk#j zcdRK7m!Fw-dn>!$-Ja0J?RUTBA$u-sL*E{@-A`Hh9}r!0>b;{Q#{#}{J1 z&GJ|w_IoTJ>f^4wDsQ#rW%ySTK|?+Jh0XK%I?t>MEnFD4IZX-GnE4hz8GO9Sxi%>)~OdkxND6XzDUqPotTe zWj!-XG&ft+Bt!#f9F5#6Jch>61ghndYlA=3cn_o4$a;snL^a)XA6fqf4fU1v?&vUdDw;%}Mc+m%MrFSq=q>0< zv{^sdz5@LQZPH)(MdFBd)9m;Vy8lrsT-$}i;Vm($?u3o#b9;hnoVb)W5vflh5N$(Kj2CK&WHcZxw z7n37t-+^`MNe;PGwwLfOHth8p{&dW}n(fld7_*LbNzIrySU;Qw@aFU4PkL!%wEbu+ z-RQIb#J7$clj$N61Wpr8prNkt(=|ffLo_s=?GxD#4NZc3lU^0v$E^h>vmK3JE9=4Q z3TkMotS8aTjk2De1;14^h30OP^*^WhUnaLpI@vj*>A9kjd7`2DqMEAqt6A@1DVzTX zWP2D5JtXUCH1{z3KPs9+!!O8s=0(vgntD~%gRh}GMH8w&$a)e@qtPFQhkq80piwl1 z>Ul8nJATjznYe>wy^sw}0y2 zKC9sN;24Q7H&6I+teg3=K8y7L>wQ>H-67lO_K^K`yj5n3tZO{U*|M(fLAmPU39?=L zp<0t=UC(Dr*{=I%Pb}l@nnO)vp>gk}V0%9s4V@(W1zU@z+KI-( zqG>eLUe+@m;GIM@KRM!UewE~70;=b^J6V4j)$`q#tOq8_er?eHsQRxGm+i(#iPSi- zF6R@qQ*D+Od##_k*lT&#XI;-9?_4MLadqI+D%Z;P+Nf?mf%P-ci_qcd`;1erXZ>Mx zIl2bjj{b^PpglG5wX1fle@Oc)^N7TCG5m6${cPX*{j9%;zK4E=YI$k?Li?ni13cXp zMPsI{m>eP+K;vkzxbQfdDk1CPQlhbPqG>dPhRS1yM$jm#aTzKub-m=@w&<^pEqQSV zZ+m!lShqiOV7qzX;thM+d)vEz8)g_{Ui@QwD)Q1j-uCdgGuj(YM793d9=>VvdEWNe z9k;hH#z5kMKepRB(GT^ue{j}k?Y-YLY+{e(+a7=Z&9FtO)qRfc(5kA$-Q9v-_TTyT zpIbV@FS38<=bL_z>m5Ho6Z_uQ-uZC*xaHz}yr*4PJ}6(h`R!-s^m?wzQ?l-kyJGgAf64Z#MW`vG{dIU14ZGWa1HMqKzxc=3SuHN^uv^;{(WOZfb($NtdU514v?dIFR2hL=)9{GR~Ve8u6lM^Zj{0`wkg82iI3c(avb zZOobQBjy}mp!)jx{M%o=ynV*_IeXm%FQes53b(_{Ryd}>334&KTt6IRKg91pEE}GI z8}fy@S?jacL`wU(wv$cp@&RvF0d-@x`|LTroBi;BUJ$TH#rvh4EA%U0V9U|)iv6nV zC7!oOgFo!OGlmv+b9g21$N2-{m`?D@xBS7}UuVOsBnt9@aBUBEt5+1`d|VsX40tu4 zpLy^+U%HFoM;1)hq~O&9r8P^QgY{yF}RhI>C$SX0e(V|Y#MG}mo>e!^_%0Y6471b#6* z=<{fj_)|V1724TAmVupeylH^zV-K6*J8}Fu8Dl<+rHDceK+eGr=fp7 zuOZ8&b?w^ zhx^Y%u)6})^JL~`vAYWH-~WiqWP6%HsQJ_DVNYCbfc+u?Vi_o13k zz5lKE!yhifPs1q^$Kz~&ajL98#k!`qlJz&Se~ooLZ?E;$pO#~odMtar`0c>@m)N&w zedWWly(8-bDHm-|@7^Tab-n9SS-%>+begQESl@=?&ggy9r_U9;_KZurpl6_J-|}g( zI~kq6O4d8D-WlzRo`If;YWvgj?+LFkUi@e}s+k9>d4DFBh{hih)$QhCS&yPwG`&=K z;4#r4nnVxm|6l%N+H%Q9?I%QMvpxs?@Z~7&UJY-?dTX>j z+6C>7_CllRrRWvt7<2+U4!s(^0iA`;LGMNvp^u`^pwFRc^mX)I^aJ!W^h@+R^k?*U zv>5q53@wZ1q4%$p@>_t`fj2^%qixVm=-KFnXcQfb4nPN^!_eXA73c(XDmnw5joyJS zLLWt+MxRGtL*GR|KtDmhK;J^YLw`Z{podZpN1%tJ0W=S-jUI{b z`iSWI!)!+*kH~ro)$??a=TrV}T#={6PZW)z|LwTK%O#z^8&~>S>|YX1t`aROuGnhX z{&&kOkP-VJ8bZTp1dXCGRO>}G4o{#-wSQau=TJkx6-0G^)$ebVez5p-(cP@;_UrBw zJ{Y|MortR4Kl)Dz{8Iw|l)yhF@J|W+Qv&~#z&|DM|Bn*T>yqQnllYu|cD-}>3U z^?t0EquB0YU7tS5oF|^;sR8>O660C@y=3S|ZM{8Zv}&Ix!;g%H?fV^UckffUMQ?)t zyiY!tl_PNdQ7PM1?DW2SD}LzHr?OrpK7HCqe>T(WArp}2o%O!?s{~qE+!}ozQSbhh zI#~ix{_A~WsBs47%ep*GX5R+7j)8_CyDxW6^2oTy!zI99@fUM7N{6(2_l+f2@ku zLtCO<(4OdEbSydzor^9;m!oUZjp%lC7h2MrRKl35Xg#zg+6C>24o1hK)6lu-VstsW z7Tt($M|YtmFC_nHJ+vj-1?`CrM#rMl(7EVhbUC^f-H2{SccCROB7L+T+7j)8_CyDx zW6^2oTy!zI99@fUM7N{6(30MyWVZa#dT2|u3)&MMjE+U8p>xs2=yG%|x)I%u?m|m? zlf>Ed(Ryf0vxs2 z=yG%|x)I%u?m|m?lMdVbqxI01Xcx36Iv5>`PDAISi_zuiT68129o>bN>_h(1dT2|u z3)&MMjE+U8p>xs2=yG%|x)I%u?m|oUC4ICW+7j)8_CyDxW6^2oTy!zI99@fUM7N{6 z(2`NoN9&<2(Jp9DbTB#=orcau7o*G3wdh84JGu)k*^l(mdT2|u3)&MMjE+U8p>xs2 z=yG%|x)I%u?m|oUCw;UY+7j)8_CyDxW6^2oTy!zI99@fUM7N{6(2@g4AFYSBM7y9p z(ZT3gbQ(GrU5qYA*P!B^tE@)45Fgg~UhR#J7qs!5?=tguqx(h8i zi1g8VXiKyU+7lg&jzy=TbJ4}~bXBw-n#z;$3YTjKhAo%8FIRp^ z-mlgTW8k`;Ps1*UlFNLwkU#Yrt&mOL{>6$}v5xGu*<@#vve#MzJ>$RQy)du;UuIH9 z`E#h($d3J%f5ZRaZ&w%g+Ssd){BGR!`gjNQLY<8>d&r%H1osVMgXGFSJW@0^N;IoF zPS$g1#QS)yy-$J0(98tv(CAh8Lo;Y%B6g@-D=f}ih;#n`@i^}y&gB2`IG6k%t9P2? z0g2|x9jOeOK2q;ciAi9ptS76BW^0Isj}r|x5)GlLX0m=Df&b+{{wn@3asOY5UyedM zFG^C%DTXG{$o;~jXygG|PobeDvL1O{G=V13$dkguPl;xq6U`N&T0OykiCySoxT2DKVCdR63HjQ3VLTZAI$gX4qrS)`APnTpF?== zRb6|2^d_@HtKo_VkLM_#AFq7=13z_re*V*VjxNlPy?N~XxS@>ILKT`_X*)+u>j3t6dTK^83jbTA_dX{b;`Ye*P+7 zh55O*korpc%EKR2M_;~N9PJD76FjP5x%&My<~eKSdYtOIYO=<`{dDui*aPW8%K0hv$VnO?#Z~3e8nfEvS1W!D8 zJd1sPifYgCzwq;n&reb9FxdRy@$6!Lu>8eQSiNUk9o)~$zIdF!!u*)l2lw;g-}Dpw z3qSAr{J3#OVf||OFZ`6{y*4eMqRKha?%?_Q)E7@t^&Scz+|SoOKSky1-}U3=OEZ~I zbDbofSQnq3ChI@=;`u8-$*!`WY79TS{!Krj)5VXf`q|_2^<)1vKct)KF7f1gh?=ud-VfA_cVX;*Pj0yeu_FyHJzfgqOY8tU19x3QTr?R`|-wO|G|0L???T6 z{uXJLK{IYVc!lY9lH7StH)IxkQD;_!a7 z$q($`aqLq*RX;k9PyXEs^Aq$wZfbuI@TvOId4K-OPn!L6K23WcS-10zFptk)`N?4) zyg|xGHO;!tE2MtpeE8=RP!9W)_i;D-TNj#`E`D_$qQCN!#y&nn_RFH7n`HemU%uqL z@#lEr*hg-b{Zgow^H`ssqVknyzxb@e{lx#KA5B-|P*tw;F=_b}l`pl|{Z*Cw{dnW4 zLXHcy*ZozM`~4JEK5DP~t18#|r2eP*^85Ku^X2!Wak=MdigQf*KWgXKZ9YHl`QyU;Bp*4rpI?1`{ORcWvuk8L_%iwex`z8n55FhlryTEh z>VCtRhgsKE8^sHbFO}cFx^S-Z^@e=!BR+zC*vFR@;pbmP@Ry6=D~sT-6u~n^@VAQK z8;jsui{RUf;JG6BFUlV+IKDlU`qOe(J)#I+p$MK=1P>O$k1c{XE`py3k1s74f4d^= zyTT*B_Hbqq_NR61*e2NE{Qg&t7;|N?d6U*nnje3{mEKyjYnnB05^CP0SwrClqXEPF zjTjOfJ80DCVONX@p4g;ClhENi35(7!JoV9ngFE*cq`!v@$muCU(ie@(n3#eM(LqfL_mS6qJipb=xVnf}M> zdKcH{y7Q%5US%ktT37Ia|NT9@`_|Sj`!0m;ukU}TcA~p==Nq^9Z`rl7%)R@e`|JB5 zs!LkCz2rR%XQTV;dmCZPoNwJ<-#1a!_e-paxA;doT`hI*dg%W8euwIMGOY2dovNGP z(Y-sO>-zqPYTQdz;&-kzez5mEljFL-zOSOH@2hC~y1(Xsgxxp){`&rls=hDd_IHHfm>!s~O-`^Vgk-VYhFE9W8%k94Il`P#~ z-|rgF{(gJ^`pb4-SAM#Goad6_e{=s=eEaKjVhQ$7x(+7a;?K{!cAIOvn!dhw5jy;6 zZ?6CqtL3iotDh~_Du4XpGIIYUTt@a!t7FgGAIFdS`P8?+zOQBivVTeqi`f5b-~Rd> zW-3qiFIAfz5sh2vPWy*TLc>hAk@#1%k^OnRM$Her&!=FQ{ln!yqyW|Zm-)D}b&IMy zyftla1OE*>S<-j+lkzXRpE9>j6)Ey`Nk`c~{IX!znxC|TdM!@v|J?CiSo%8-t?BJJ z{6*Pc|M#b_yf7_pbE)US{M(D$i1qwdkQX<4-YUpT7(E{qn z&s}btYkwuoPXA$H+#^rL%%Ah+JRD+2Nd9_p-J;_$&X;!8TiVjKM**|%La zPCX6=d;HJkd^3Iw-`BFM-g1ZiznJYs{PnfM^1|}8Wvm_C};-11_knpwef z^I_s|hrK>8{}a<=Pb|X!f&5-)4eX-v%r3%yCH_-C$cXJxI=?sJiPgfd6EW{wUd&W7 zJ2)@TC(bXikL?x152d)xZn*hX_>J&VHl1R24*TejG9rxQCl8)r+*1o4RQ{{j*M^^< zyrhhCUg!FtBRq}0@^j&VFT{_Yr~1HW!u7l`93DJF{Ld!cG4NzJ;gjL++mc?sJ{SLL z@4iCmc*^JJCU|(8*w>_d=6Kvz_IL9B{0?4#Ux@uzAB(-d^YDuMtJ5#;c4vWz#}(H`P&-?-m*~b8@ti7G1@;o4i8dbCz0RP zmb-E@Tg6Yr+sl6Q6nmXNei{=Qysvz4WzX_-{A`2AmI$8(cje^#XOEY9k*&6zZSlJD z*Wb18BHg3m*?G3&?4qydG=fJaO1;o--`{y5K@G2P*D+bg<7 z+xhwMTqoh)H-7E*0q{Tv;cLm)NaZg{&l!MERsVNO1-gFFEqB5b)YlHU3(u89`c8>| zf|#4<;h`7A|3>Uzhlg(yJ^=eq;1T=`fqxGV-XZ>9g&$%Ys(0KyA?-6u!z}|(4HtXw z8}@deW8lFngwG?M7I3pl;?Z_^5j>j~UJm=q;L(?b-%C7G)Ia=W_yTx%n#6gSU3beP zR$aSFd@1qB|HdrCUVkUl>ty#hyvuKpc$SMB^9nq-QsSu#-wfC1c!Kb4aDBdTJICX< z@K8eP{YUKgz+=x#{Egw2ZHMXA`wX!kXzR%>HQ}LKgm>h)YYflSlbk+Hx-HdDOn4JH zY>fN-pz|MkQ%*#@He}9&CmYF;c$#F}^o7UYlzv9rx%=#(^OOBa;xDEBmHN3}I@Aub zo0$&J%@=+s@!SbFYs9dehNoiU{~hkDJPnWS69=D)xk+2@>OIVRIIZBDuuqJY zey=6%?F+a*_pj}34_x0X7>l2Z_Jr&58>jsr53dbRjF<9c+5yuTo_$T?-(~%}r2{-R zQR-#2U~@h^H$nXDBF=$ulaToDq}-;$)BVKHNBFrN9$F*~XC;2_gX?oXXJhZK*S&mo zlXTC7zW~?gdz8NdPr4JRU1njw37#k?>8>Zv9q`l}(ogOsp5H8YY0zFQTg6s1F%8!HV@6URio@}{m5BhtwyBFvd_xU~NUw_ALDA-&K*Wa_}z(>IK zc@T|%99*BvSc$#+yq@QOqLk-FaQ9g|$Ac$IJyzp*Sqx7mrQBw~pN2N3Dd}hSHj*7Gz;i!Kzj`zE z;y$P6>|-4z{)X^|YJaHIFPD*~6+F36(j7oNo#AG`@HFLfAw0fX+W)Pz=V9!Qg!xI09^0LERc$JuuD<>~IfJNq>Lr_;Z6g-0riA3Yyk43CAx&+qt;!4r20 zzf6k3T&ui^@b^jgc6i`!;Q{O)fhSKA{vP}#c#8HQTa9^7{ogC(9Q=Qy{`n4iZRsY= zUgdnpydVB6+W@@dk^KHzUpBaR5gm_yA^uyF-w-_crSL_h+X0>t;N04p>dmZM=GqqFr9{91!e-vH< z|83#P$-*Z}b2L5R*>i+H3m*uNJums~O?w`%obS_X|2YG$-?i84)4Sk?c4E6PZ+T4Z z@uPedJmoHI?ZV+`Hozm;+f{G*0v>%w?8m`>g@-l^e+EZoDoVNKUK8E{`?~O?kGF$o zUl)6(12AVRC*4aah@tQ>_P5}F5vzVR z!i~MGbLr~$$n9y}TPnfzyW)f3_2Bw_@lS}q9bCUZo`j#Re)tagQ}AJM{r)-KiJ1u3 z@0?HPIGqL8@2R&Yo_pZ>z4Th}N8tLMbRF-#0FUsU^%JmP2iNbnYrEP4Pu?gs9w+|q z;o*_Ox8rBO`Z-c+d;;yTyuB=S86Qu8az^6;(rT%8$450 z_yp2jr2I4CwJ4uu@YwN^?!E9;@LZnov^{^jWg|TOki@U&mmTmBe5RP2z3}iIl5U)Q zmAAJGT=~cA3)kNzYr}Iv;Zupn{VwX+*AX5jzg^%N+K=?E#<-t-oqf2O#9tlz0m{1x z-%Xqo;L$ULUkINKPu(HqzaQ>?=5zj2cMAW82C)>Lnn9ga0^S-Pgok#C{W17&4$u53ybtBvUHK2ff5K0Hc94DEROcj2uBn>=`|yp;3r_-PDJ(O=zQub13%iu$4dSs>V)2ao?M z$Ho2d!SKx0;@|zQ@0Q8%>~CU!mS8gzo|{*&oiBo$+a!LyKlvm)FhlsS}I}&2TKajcCrU@fwn}@r z3i}t;J}3NRcm|%WBmBnhUh-xOJmG$ru*)dyzk>&`zh2DEes~hD{aZylkn`HxAj#L= zw716a_)y_Y3vNz>N2f@8)8FHI!y_L{Jnxe3PJ0v?1<5p1TZ{n287Jbo6! z6M4d4q8$DOPtrd$#Q%DDY_8PfXzV{z` zMDbse3z*~K(MjU}3jDW)hklp(>Vuyi@bEaX*YR*4c#84u)#Pg=JTqAA_4l%y;E|!i zyO8ev@YopPt0~Ww$}bkqbnWJSc=%~4=d-c@79MdwnA)WY^`QJW13eOg&{11@~l&&M?6LCMR+ocNQ=cD1VH-)bz z-4o!+jlvtz9y-9ohl&4_@!wPVyJCM4d>A~wO89#CILqDdr18pjz+)Hfx2MCSK7KcT zvY$x0i@m+;01-;qgww-E+)tDR!*HQ;OfsbsU%nH$L7J9`Nzb@CeU!+sij^=>^w$iAul+ zSnkd{I!}_G$H&2Sz9hY#ouT$T-?fwSyc4eTEER)4qJA361zB6l?Mb!2%3eU(Wi0W$ z3Xjzh?w(V3%ZKo6D>*<9!_Rhjfajlk!+(S8e18jw=a70*&dJTqSr)LZQLBcWh;fCiuWUDdF;lYTMd?gCHqvh`TjqyCcq4nDX`|NQN&kpi?AzbIp zoOP%q+#haMiQ(hKGv4!G$%J_REeyXM`?Pz&%q|1qNqBgW92XyPz&{9&3@zzdzRdBs z!g6=KBxzSc{JevGqL0`=gZ-!Q^o_zVp&WjMX9B{dSF~kcU&=rIo@CTLZ|ar++-wo9 zFACR%C(DYT<0!Wi;930R#;W|IMo=+cy>pbZCd&HA)oiAOdX?odm_r6Tx=uHJWnp*j6e3Ac59|hpS0BROWbTs`hP#-%7fzEO+fE zP5ZGc-qH#C_;|5z4nH3r87;gi?SCLVc&l)I-gq=TI#qZt+S~PNPn_D`=D^L5;+Wep z=6-mN_ESsTnJ3{P{2WHUR>1?Oh~Y%|8}Q&L;d&11Rl8*y-{xHGR??vA5K&4S0#2Oh6vpIa+<-v1Ooxx>XlFZze?;Su_uj>NN9IrGNV z!TyNjq`u4?Ia7RseKpJ7aiQ}9Q9R}t>~)^dAok7RIzQF9@UC#3r%L1Lg@2v5O2;R| zu-EynUc}ENxXydk8J@t8&dWr#m^-l7d7{VC9`0ApyoYsY&r9)>;XNJA@3U~7?@;+# z{OJ7t`drO=cw~}vNPXDhW4O*2{2lS^P(HS_m!qTM-@}8ih@TGR_s~YtP8u*DU>^K% z%e`^JO>(|&0;v5%0hwueRVsE?=Mp^U^Mxvx_&NuB zou5yC#~cXP`2y=w&Li=o^9O3VO~hX39efV^>2RHYaFf;-T<6#B0bc|UZansR z1vigMeQCe?B0SMjuBTQ~VQ*UQ+EwsdX(u84e}aAbdhw(E(r$Qei0}(2(2}-8bH`EA z{Qzedy$-4jPY)3OH1>7jLEaOzw}ri>DLgb!>_5Z42Rt`gIG>d?QT0DnuA9yvUzfu( ztIK$P$Kz)LJouV$_q?53ZiJ_1i+}h2ty}JaN8O8=cH!}E^AtQZRQLrPc&p%%D~0Rx zx*x&Q?!`~L=>6U=;JI^!&!a#2N$qcwcrMoi%vOXe=kOMZ|0nWQ1s?iETG~1<6`Kw` z6))?N&#^xq9yn7ndb_wYZQ=3jB%T)7pAL`NW5X@e;l1F|{o+8M%Nhz#l@R+Ih<_YB zaES21o;PEr!qcUN>wVOD@W>R2rxEEcf`|4=x|{LyINac$YBXthu(W&F$33WT z7roE36&@}nT<>px3lEUrj`-ONkK?~SahA0Ql&h~e@!W=eb<5p#ef$&|PwIK6F7~-= zCBGWysc@YqwJv_n@%)rMFmI|vYp>VUo_SX7@X}kxtABU~J_{b|Drce%@H^p|F2dWu zAA|=^6Ry{%Ph0N#&oJ-3MzDWb?N1l`cN)uvb?^j!=3&3d^JDv}&!k^!1^*7N^Nr~F zZV!Hf?uU50C@|NxIr^G{ZizM8+GR5l?4$^kLz8 zKk9sV@G;?W><7a$4+z)aDaON7*zdxA7Ciot*pGxSf(NkY@HNZeS>oA3fAX^BuAh(m zBKb<=X9M=>rQ*L6{8PBW&w22j@FeN#`LWmuQl9#ql{U2hGVn}q@{6B_@FeH)m*FQ{ z?j0B0@5R2TCy>^Z+o^D!|M>!VcX+&;l-Sqs3*d=S!k?lY z4ptr${wwu6Ui}P`{9cazRCwz0N}lKIu)hT!x>U+ppAWf5{TwPsw449MEf2v1o6C9Y zk9z+b^E_PV%iS4}4eQ`(?5AV@DLnMP_}NOq<=~O$r3dD<7E`>r)K}&S;a5xdXY%0D zcg2rhPaOx(GVkuwM@YhL;A!lSq8!eI>-@T<8EE!VzFPb@ApRIU178N83eUbL_TBJ5 z7p~vu;I@Ui51!a5?KZ;s{YiMPcO}oWj^Eb8gMG#Sd(_JYc=jVHpNh35pwHmZs$%~g z{(pfdrbxP*i1V-(92eYIZ%Mvt!bAJS|1}k5LkJ!{x3ULx+!cl=be>oIcZciujV2R+ zPk8J`X@?_8cd**SFM^M=+?^kF{&uR@Ov7I1eb@TBL;dg`^m+JM3Xkq8INn>Ke)#?( z&B3gP>vtdBd^c{{qW57ZMsyYW*OuHTc? za%&3L??~!>%ah^yol5BqjOhx`@ma602ovt9{V=$BNdjc}Xs&|m_b$ID&KuOv z{bDbz#h7_;{hp=0UEnQ`z(ds}zdyiN!1X(sdLCJ+_Pjt-Lv}Ok;HI@$PR7qxc<@Lu z+{Ow1OL+VZiSsp%m)-Di8}XCG&k-lN_EyaVjwyKGvYO?t9`(DP_H^SdwUqPyPrcvL z2%h?0(j7*7Xa(2rdFuGTlltNNpjysn!S%bJtx30!@;u3}L~DQFQ~yi2o;*(|$(7S6S}HMM>`8=D|ONr+xQzzr|1Xa7lL;1E9Td{SN9}DJE0e z4qRP12k#OPqCr%KNADE=9O)hd584o#y<6UHIH=V zcs~aooh|+9wb&1bCvOv8_Bh!v5uSa!st20q3BL)RdO_^lu%CzjlPq`T-^zEL(gS<_4p}ekdnunN1C8<2%Sd?mTH({+(>(vx zOs=II5u5O{6#MLL(jKOfua)q4X*vJamS$=)o*(PkF;Hd4;|4Df2CMoy^^tZ3WqrVFH8b6!i zk>7=HhW`YQb3$|T$GN5a$@Bvc3OJYYISw8@;z-Yq*9c7qxH(+7-tRgeo~tAL9R?6X zEqCP{V?2+0GaLI%Q?YNrhK2BSW#LWBd&!%p)c-<@|0H z@v~FyPm>yF*k#Jt%TISa2AD5P>$es>gT20&*8-keD&@A4bi2XRhe`bUyl502IbP!V zT*5Kq;qi_#-un%HD?C|T{8XobF16g1=L*{A3hdWlA8RbfmtMbYRzF#B@BwkUX$f6^ z(;QeIbH4Z;9)3^!=zM){`cr409VYFQ*P%@#cxI8rpCrysmb>%2et$~eQ#c3vTuS>q+}geN&MZh?Pox$9S#?6(DF7wu=drXF*R)9z3%{%I$lO$7Ys0KM`Ml zbq4nF6_Q`3jWfNKcan0hD$U4@f+u>4y?dU_EmQDszLYq32sU%Dk1$V*oDGe+51wPb zyFS=I4Ue^udik07*QlRsq}+bT{sVYsoa9&MJ^L1(t}Z+eKl|We=G95zr$Rd^&&Yad zhpn-%4^L!-FNU{+hi(wA^QZNNhd&g)@F+=Or1BZU?`|#p2Fu-bPzQd`)&BoJ>?3c8 zy*~f29G;yZ`OTY>(6 zfoE@@r`l27^AN|+3)pARlyrZf{k#hg+$Ik0Jw$fc2~W)t-np3YavdeVkq?CH?|pUP zv8BR)ljd&P!h_6PvYL2$TJG{2;{7Z;y!Vy~*e9w=Lx>X3Jb2Pgv}Kq3DgUL)7YZ*c z&Bd&SM^kb_*7m#=o_cD2SQ@6zoV^DKTE`3 zfA8A_Pq_)o>@t-&zgM0WuJ2JE+F8mW`?c^c#B(&<@V;aZ$*yS)4{sOyxf~Z~!XqCD z*XKiqz(d~&{}=uz!2>+c{~_f(2Of13k=Z5d{cp@tczTrZ6!veZeN?zU_xm+G(_8oy z%ArIT$!}()@GtNmRDQPb)%b4%H~oe8!q0{9h?_{wE>p1|p?sX=_b}|I!{eibpN)Oe za(6z>GEewS%I8IRY?mDGcM|7E9_T%lOW?6H=+DXTTJLdT6zofPmH1QjCC(k<-sHifOT_;s;y=!E@A`}1 zb4y|08b02~yW%H4S;hmSO2`hq;o*1XzecXK(otG(!C2F=KfyL z+iK@$w%oPbaDOQ`z5n(KJpQ;Gh(jeC<_mbPo|MCA&TGHHBO`@Z2uK2fZj#@)?>Gv= z4f)l0PPE*`6Kf@YjwAjK@JLOGN5{z#c!&w=Xy&FrJT*`P%;0AnJn*6%UkUn|S<2l+ zd3Mq3{UkhHPTFT_Z>ycB4jw5l95?1gcno{nJiO&Ccm{q6{1bQ>KQu%0qvhUp9P{&s zv9ET9lus0UvSp5ghu~6r# z|JI*pU(J-_`OhGHK7K;K(hfQ9mU-OH6W(3g|5EHs4uyBd-n=OF9-$!4fv0$0OP_lj2oK*Y0W#f~ znGBE7!GDMU+u;$ON98p+^RU{7CC(`6u7M{{l>$44^V$}8bduQjEhP#3q<*+hKIw4b zC3;AH<2$7Mwcj`fo`P$?(b{tF{B^aY>%RZtmIyq4mGHL&n?atRYUWqIOQP*KXXc-5Z`9bOIQ7*X`xyO?-ha3l9=<}_XG;Pd z;rXd%GW(fjasz(Y%=MjB%O5IhQ( z(y-4F!IKTd|3%oZhlfdbCOoV5t;PRP>g8v6psn!Bu`hkDlxMhv)Jqo*upr!goab4V z#!oYN@ENJWZndT0+FS0*vormYwyU1-u&*5sho9lIzZTxk$LD%H&qO&+rL`OLDE4P# zuj9tG9=G$;GA;^|-!0hp^4agQ+_mR;c`2XHWZ;PNgd6&k&G@Mak1(!~)?!Qxcxbbf zn?BFq10JX(HM@xRHo$V%|Afhx>}AYVYM&KyeH}@720TtZPN#j|tM=`sf6)0ro`9#D z2){tGXV$=z9fZF{zBa>ir%If?i1R0Sm=9mfl;&bepU?4ly!g@gm}t)Ix68m?^*ILV6 zyKUubpPyi#aua^qWeEZO0yoX1e7=$H+m!1m<&e5T#`)Ldzdqc&Cx)A8SMA|B-oI-= zd0wP`0+qaUyOG}*JiI};K0h#1{og6&TthaSh3aRn@NW2DrhYz_40Z8RG3FI`Zn89} zUx@!B^;1#mSKq(*R_!YbAAo)F3n+&*Qf>=Rk_4*2O~oo6(D$&8hbP>GqIN0W+Y{5x za#t_Sef2T|9`fFbKR}Ycl`{A*( z#Xd>BKW(}DJvViNoME}_Hy>bcYDqjgf7DLpM+yHOKgOPbT)iat-8PSW9R<(v-MujU z1bAq>92YTocX%4!2|f^>gzI(6HI}>nImQobhm+siJbU{bOLfUt621gK<9o>UubvlP zhDV5BMDw)hTZ9U7b*e9^h_7VF8|e${#Cs4QknSdU_+n{?YbfZ?;gPk{|LD9-`{2oQs(Bt_w5w7VOL+!*3fFOaWq2qo z{`EPcW8kqa!ha&3M#@hU9wJ{Y;ki!2_5HO|m47I4o=&-Sv)t8VCF%<|rZ0RBTn~$p z_=!GS)r+J!8z#f!7f8C_;{Qf?@){Y*+y=i@c~`NYNxqWsU~Az)_+x5cQTQ92r=GFg z-G^yKJ!-$V*5hT(d|$pcs-NoO=Suv4f}a3>8o+42JEZA z&F#WJraA2V6y-oV?qdfy787L)DJIS=zZ50 z;GqY_|54b#50COdpVs4N@Z2~_*LG9h@;y8Y*KzW1@Cbg6z`n#K)Yl`DZWLY)p1x1` zUh-QL9^(5`wi$R!BY2i_-cNgI3y)F`Qk%x~fF~x3<6ijbtNaN`_iEb774SIE&ujlY z8J>Pt>^rmJMtE$Ua2;nXT3$|=uFi1S@|V1f7_ z2j8Nc`mKroZ{QiqX9av8+&nCPn!wBUp}z2=-|IXQ9$PK;e9p(zg`1S{DfBbV;353i zB+gUe8QQa+-@C%YN%8X?@tkeB8&_mbI>jR)_)zR)_lo^m_?7S!?d??fweY}8Vt*a& zXC^#xkMK>{&xOZl3$G79$ODxM?K*?W(ubgU1^Pe-1w< z!?WCnx5IL8>8kc?j`Y?)=J>q`9(_%CE$n0PB==#)z^{UbiBtQr+3*elqa*Jrd7q{A`0Kj*{}x{Qj!;M+?{cVCAAxp0Tv}(eYAkxLGY+&-*99 zqpO79L%N;d5&Rzq?+p(U=SA=<;He`ep3U&<;fd!>cq__n zH9Y>fv|F7&_5-zFCS3cUo$v_lu$hsiR6i-70O_6$uMSTwmvr?xkfxTq@z3SlC*d;G zoQ{2Ph1l;XCXV{Ta}Nq1N&6oKPp5?Iadaa*oD}{v@hpJH9u|HU*UQV)KYm^;COfw`aPXrlrvAoQ^ZrEzm!{;@l`K)z;ZW!NN`_N&&zq( zXRnjvl<7N7V|ZwVj5FIGB92am$3GGNZZYBAls_l@0qie==O#+S(dXhWhX>tOd*C1og7JxNN8k&u$YxtFUhik5sJY zk$IH!8Sq?Z;Y*~sn2Xd;8R3^-6I$|zBt|ni1!sDD5NY*?E zk9{HMyBZR{dC_w3zIrd=>nXQa;E{IH@Hb-bHkU9v_p^FH-u3*KH-Qh;vuyg*;}uPu z`!ff2uzwWh=R493^WJ@VcG%_lvB$c5Q6k?`W-$E^_L|>H@Q9BeWw{#4)opdI6OT->}~V* zmRl^>ynsAeSp?rz1RpxY&S_=OgRhcbJrB;eyfFW-S?=NwH#yWx?`0C-YPpx+ozl?G zgqI#F_MxnlLlby=c#0cB94_W8%blOlui~c`_E%#cen2c6z;A;`c>zfK=dEi0iKN?^ z^J&##;y>`P@H6l;*m9Sz)T`ouID8`Z*Z^6#sf3sl}xdPv#f#{{#NJ!b41eZEp*BOFy{bhkd$9GtTnD>T$Ja&(8T| zljXJSeWyS%Y0p8n9e$a_6MRkLkHPCGe_!HMekwdSN%Hlih>2NV!5&|Ge9yzo#6Go3 z{Je?(J1uwZA-F~y==IuO>_h7%p3kY5YPRBBJqFGY`vv$JV0mHXFtG^!9DY(vF#kAy zvX;AeGV>+DEu?$+<%Rptv%Dhv=9k7ExAS7{mN?h4@f6FQ|I~cp#SfDWBb6_c1T|lC zi}3#t{u4*Yak_~(SKud?5>ShDw__jbFX^6zea#Vt=j%Mn3(MCKkK6dyNj(n0|JCq# z52>$7@Y~_J-I5^HX4YC>SbbHu4`8_Ri9I24YI~TZ{0HIsUg~|8yY>)2M&fBmx=&)C zZXou>$nR$CBYZef+w-^ZBonJl!`@f}=il(Vb9wxivD~Xi`omiA6R;2S98?J20Ul`~ z^|c7zA0BNYaW;j=J%^k#CbM6 zW4UWT$;RTp7W{kc4IdcM_ft+DE&0uUB?;<%l40;L$D=*Wy=AiH&VPazaVEkaQ$HU` zoc46!Eic2P--!RE@Sox7H4^`m@G|xWlshhx{UrV{yfZv@llZZxKX17d9-SuXmV-~W z+&hlyi61>qpYZH4$|q~_6WSp0Xg{;ra;@up=BC7z5@)ESq}!H_dGJg{N%vR@*L3rE zeh>2ZNbJL}NV+<%n+lIJkH_Qey3lfWp3NFL&+75G0v_dkeC6-sC-J$&X?q-R`9}TI z&r9!N%pQ1jx!5Z&J67_W`AOpZ4L`L#&PqOMi+yUg6oB@7BjMpg#eWm_xegxW0;LN4 z7LS)PQO4Vv#60X18^q6gHY|fDkCZsK!Pml5JZH5I{yyAXEA>?$e#AJAqYlEgowv2z zwa?7E;{Q|Z&xVKiLF`ueaCn-2V@PS)FaaK{A|-r8N#XP0aekORh4!-!o_Sl+m8&^p zw!xzn#m}qQ?^n(Pr&|7z@sh7FF9dfa&Iy)RpDwKri7n2`UUv_{Ompdpv*S^7j=*@JI2JyGjy_vg=V-6g&y{1}ewYl**2Vl9cf|h zs)psxf95zb)c(1%XK%}SlyLoy##nfY2U2zu=S;Za{I27ih4Ab^@uTDXO_mo{4ppu$ zoF8SmcRng6^?p3*HiZY6_*VO?cJRn%vDfq9x$rD6{H>y5hQL#dGi|fwg> z3rjcZ*<+MX#^WdWy5yJPk(mJxuaI<4l5ox4MfiUW`y}@V4kwKdm7gH}c17a<&hlWs zIP}lMHB#&tt*RqR^f z3E%ywJa~rVMaM0T;VB-VNEQ=EVdayhAnmZwTgI!O;=(IQ_RMqe5I<1-fS+$Y&d&Ly z*c6E~%eaxLPGc&4v+qRh)1raeO_a^E4S!p!nNF%TV7Z>e`tAO z{oyzG338pDAl(Yr6>fj5$8CMxEbY*)ddsQykHXTu&hj8O`DKCUCqI$DUn|0onJW2> zasQzfy9O;UEZx4AyY>^NKM!L+4?hXUA!kyLpBCY#_VtDPztD15{t@o0jKcpIc!n3t zG|mNGKv(@s#^4n{g_|N<*{(r#N74YbO;bq|0 z!vl;1DF$;lJk9+C&DZ0W7nbg8mb-FD*Ozv<6aPQJV|=Lm5=q|lxIyBK-z53c=X;~@ zFyqfw__-gRyI<^;KWlkm@vOu?QCkvhjGqna=SSg3!na%Q;t$;{@$)*m>3pNa8NEzO zW+4?Y%ksj~eGdCHFD|@{|F11~{tefyGvKwRi~rcg63;C736{I@YK-w}2p+M#uykiw z?);~YEm;09;6KWJ_;c~I4j!XDY=eL9`C%oW6te+){rnIqhXzs&rZqgx^`q9yS@6Im z63?&rx?b&9h@ac>lYu8D2)DOKyrtbul5U#&B+X^BIoEP8zmEv$2j675E4K*Or$PMe z!#=@_+S;D0&J_Pyo~L~U`zG*sU#XX=@DA{VZ`{7ja+hw(cU`;=`w-(aE{Dv=*e85( z9&)q9liDNczD~MTEibIz+h8BtCIzW+cC*}-Pwq)6m|FN5f_;$tOLxI1!*lDz{#JMf zp77lt%X%E6eDX8)p+ltJZ>3&Z*oN)ePm24cZP@2>%Uzs_C&aK1_A{^#yeZ}IKK2Vd zo-aZET#ldgW8&a=N#1NzKTQwyEcJfZukh3vQf_+Pal~wi)6gHvUN%OL|2f?jMey@2 z_l{p*{Z7GuhWm%lli$}Zcjb^iMgrIGIeuw*Vf9`Zvt_RJ?Ek#sF8qYKUMr2sQp?@%BZl|HB^6^{!#=?AqQ`ZMTO|I(6=HcW ze$MsypVJ*{dEn33+>D=CHz~IT*nC)opWiI^`i(oKV4lUkp>6OL3-NzS5&UeAA7RXy z5`Q`N?Pt03AN)b$=?K3G`w;gNK7ucRr+mNrdGp&|4N+?v9r*_YZ^c4E7n0Q@U@n4IbdSED!tLmb-K_Jn-IHvSH4jBl!(7 zzeGdq2YQ^9d~$UW{5H!AD~E;nk8P9$^*Z`rmV4#E@3uP5EIwD_3B{!Sd`a3tcz_r9 z-YX>=IxFuZ^~>R8;_ygk;YZV9y$Mg0rhQWW+tiQmx@ouiDKGIqMm&ellQ_d%r|9uj z7oOnv)4^0gGkDZK1>u(R_&G!UJSzSN5l=tM3oFn0>W6+t>-RBuj0am5Q$Fu`oW%0U zm)K_*?_q9=&6j+|9*{U2m6V+-!ZU-VJkO;4Tndj6kNTMkPjG?WnY3Sk8{SjC0KNep z+a(2{=f{e7NIVJNj|)ihrm^LPl}``s%_50kpJ(f5xjT;1zWbchun+PcWghX|1&@r7 z1W%-1-h^lS36EgE&+@|JX?dr_ANW=r^yS1b0-jqZafb18Gd$En8f;bggYY2Zy(;h* zEiWwH4cMo-|JD`zFFnpmKG}zToZt1zu&tsU2)Xe|fN^+Vcx}tw@f(;c`C0+zgyyo`^MELTV9y|D=c?$26=9$2JuYCPmX@6 z4*UUlV!h;RB)ozRz?DPzQi;v=wNCJgb|B%^Blpep{L&Dfs4f|L8vC&2uH0h$fUMU?1F#QOmU8$8`+MNI z_odw0&=I_kpCEot!~QqygEgg{p9jxN7G9p`TV4^H{4(0(cKpomgJ-jGy2tZd%HMZ; z+|Ii@M&fToJ#Mf(VDHEJpA*~a*~`B9|8KIe@Hj6ofh zWkKMo7}2O%5MvPO?dq?&H({6QkGeBGbNhp?o;&P{o~f=n-CfgFb!zII>f1doVN@_E zAQLqBk0u)gjRMOe1QA?!jhdh)G8&8tnmB(DmzZeQ1eK_4{QaKidB4u7>N|Hq?;p3% z`<(Z@pU?O6yl*+Wd*6@f_&@m@+V8DSqxF)(-!Z$})&DlYInL*ekNsim`v!2zwd0yx z`?$0d4bUEc+S;F59Qor0|5t!7TA$Ba{ZE>la_jI#e`|65FIxitFyO?85Bz1FuhZMd z2LHIl%N+fFY)LymxCH(QYv;9ruCuwxTAx}{|NL(+9{*1Q&T)P&*LGHnkNtwdr#1cj zKN$Qo|MrVzC10}j{56BO{)x`l<#oISLCN;tYX5er`3LlM>rWf}wRaWpuC??12LFut z>ps=i7e8$9RnybnXZ3&1;O|&~?!Li4Z}6$b3(gGw6@N#^^Ow6O%YK{xz6$U~c(?&L@qD$0=iesnU_I?X zw_e-+P}0d9aH03_RDyHont#aJY5gbN_pi6FK56iG{+I6Wzc%;;4{~b=V`Ar7@W(PNV|3QQQ1mIksw~XMNoc$H6{{g!{^J}gCuL;}=(Vs8*q_*?! zH|RS2tiAhVfOFkiU#8=PdMW?*q`noRKj&8ewG(aUuY8HVd>in4Q9bwgX{+D5r+mPU z$G85C!QcK;ZO6sO-~W?3o_jx|8}&o_y0r^9*Wr^U#}BQ8KWX*f`f(k<4W~5$e9?Hm zN9w!Lg}*;)?MzL-TDMo9UQ+*;tp2LW%|B}OKWp&UKBeP#dH5TDPv`a4FDQJXVx#q4 zfG-;7Pg(t`DLCJ*%h&o;pzkd$+y#?n@ z-jVuNDf;tk)=ujybRpliclUl;*WvA2zkeKX%E1rR{DCJ{f7STXfweQR`mI|1@0I$| zK>uKcMsdh%u&I z;LY*eSp8$;W4TrNeuKaBKXk``!{9#x_@e#&r6uiu7VzJN^Kr*^AJOlycK)Ze{{eGE zeV2`YX~JNlT_f8OHbMn@jzzW~mBr(dn*JN-5=aH((pflIC4`Ub#>KlfhKb>20?{xIN+ z#xs`s_Hp#*FD`-q^(F96E`k3d;H0~EYx?J}1J3c^`#PO($NJv*2Ri;$({=RE@bXx|$H27!C|5;i) zkN%;K=Pk>xbMx&R{A~+Fe2=yBhQU8+^tfa2?*p9uzV@TKu})w5rv|@gdZxp-uYe*d z`i~i!|H8)eg2AU>uAId6`x@Y+$9HP<_ybn|wcn@s@ZDdj1NvdWWju!Ght~do1$@yu zzwaOEc-}5_{O)}8hYWtt&esfVz9$BM-ttsYXK>M5PQhtEB46$_L9?|AS|}{?&ZC(#POG zdbobro2(DV(?@IV7xD@t-|dY?tnuosH=X9Q&f(hi{mn;3zc<=H?6$LwLv+{abWUDo zX>Ij*R-jgO>pt6`oEK7Y^Kox9XU$qK-Dm0Lu)CI}t=-x0b-lOshx19l8Ws~bJU1&e zgL$p3*55A}zOCAzSM|<%WzKao(4-jTS^36jSmo=woNH^D-|qPBH5TEyY+MZHqnzu} zUdvv1bhNYmD9aABc6;N*(B?pDq-(yKZ5^Gxp7$%RrS)7^y(%9A0od(HKFTq$4;E*y zfAAuod{9U9jlFqQ^oz;)H?FU*uC`ZK4UUnvwg<1z%j$HN=dIn#qA2r6dGEY+kdI#~ z=Ces}bdXn<#h`3;i&?dEyEjBnB^J?_(fy>Kw|d)Ue>glXuJXz5WpCE%?F}!6RoUu2 ztjf(-Cc{3~XJ=IOuM)@}7BT@G^ro%ei@n+4(QrJhT0J+2-o>!r>b?BxE}G%r7klL; z|31nm{BxM!pz_PF9-W_;Ii8MZy^C>==*j2&e0bC9b#F@`?x@xK*7IUEKE0jd-C4;^ zZ}s~9yeyA6lfZ)SR9La&-US*l$nJbr7MM8J?6w@1 zkI+#z6{f?Z zV%(X{IG*Wrbh~{{UQyj@>2N;IXTyE~&Q6Ls`>3j3|58^32(v%w?*JFEz*?9ImdRjh zfEBAD@2)Q%4l&r_n|VvQ3&to5rKMM_+J`9r+zPJ6&esfZDs&U%xwCzS7CU~SvL z1gWu)bMsRWw1&iyCgfLFUcpw)ady44DTfKv77I-fn^ zxH(3B89>FP0--AOxHl`Ml2Rb2^RSq)?)k{g)7Lq!Y$P#ce=^8#YK@`dVc{@Y1_b=S z9v1Vm)fb%abNOYt`?iQ|J9-YE_b+>s3rH>eo#_`OhHZ#~$>5;8035~LVp3MK-f&WN zZl>rP^eOO1kbU|@-Xbg92XC6mvdELeT}YecDg zq@a%+>}4+=bWvjhtf;sSq*Gm`)1o^+dt;tM?Dvc5Ef*eJA?VdFX0!RU>S7J90+#1MK7G}#@+q{K9B2V9C2fEN6+qJLamrTa1XhQgLb7P2RM zb9g9#gW<(xwF9aK-^&MU0wdz@m%@d5V6AL71s%;^m=*Ks&TaH=5BohE6IUwe75qkt z>XnibUCY&rIlI%+tiMY#l7e7|qu#AL!M+D`;%8Mq5TV>GZLx!>ae<`&LaH9 zV0b?(tL&P(G4@(SrmT1b7tD*w9`&Ho?2s7@Cl@=#P3!#XQBgpXhj^fXIlt=mdr-uN zqXEjT^D&s_c>((XoOr|ju&dn)p9+vXPoA&w9ZKn%i?g4P#;&>2z)pJjG-B(0E!1L>W+#6X{VS>AP3@l z!s23p^h(V_2EKRJ0jBGtARXmBn^F|q0ZBg@4h$kR9<>Fz)Nk~-R~$iJj41@9ouWSi z!X3>Ha?qN9I>mX^NC&8ZPDQ_@`U4)VwE*869be9%_=%#y)>!!v@)R-+JLds66_q4c z)^DUgQO#>Fx>aumWU-IIl9IBL#9n?5W&jP?Rg;hE!#l;d9gvZ)rItWZ!US+1s^%wj zWI%kdV|t)eLRpyOUOufZ^*exG5aakoSQEQv9=Hzzh716za`dS62o+xFRUo_of(pK; ziynUpCfOU+n$v}nu|=Jbxv5D(Em7KiI2@tpXw%50NlFxp5ttu5u6jD)eF&0SMSVxw zuwv0K9cmox@4$tSjhm4jZ@za-5nL%3;N zes?^TF<~$U2>i>#4DlLu1NmeP%1-Ao^R+nP{?@~vLnj)w!q6AhKKL9Qi5`d>t0DuOQ0jx&hfYj&~5Rp*P z;Hu(k(KGl)YhQn=n9} z8;=_%Wf{M!X$eR)+yo*{h7>|2 zUG4ORqks0GUlX#ZW<1hwp$(|jU2|BiWOTB6?j@K*PgIbnq|!~=<& zY}(o&Bx;kMzug%PNPW+;DovrB^ik6pHy0r3=FWI+)5%q7W*5FGsQwT_V#9I!b}#3X zE7JtDPD-7db(}T;mrun!0I50&z~p>*@j`J1tLfEZCc?{r;(O^%^Zu|mTIs=t=nX|f zwAbCM;q(z4KeL{PrYb1v!G>@h%YtDibl_5o5M0;Ot(vf@&E0Yq?*q3eT4ok0j-)*; zK(~fL$(3SRy=hVsbJ!%2z86Tc-g|1uMq^q;_?vs9;oydQ;8dglA@-hV^R5z|Q4#3T zHFQ{b8#t(heQZ(}Kc+$`9;6+{67<7t@`(!lu zZok|fP3EFONmrspd3xqogm41c_TirY%mWXPPMg3ZoqqCl_w;1{@P%gG)6U630;QVW z=u3e0z67|S-H+z8B1R&P!#I`co-)DCh{Hvy_npN zsXWR|>M~(-vHmRJ6#J>as!$L|*aWg#vEU()$0@6u)FhyC+PFQRd=aMnh~~Ua#FrD? z5P45hc?{EwUN2&T03VL#a4Y$uSDNd&c+x#Es|;nZkoH*@$a_0wUs!Urhs9^j0G zP0|n+?`U4Zk6mV9U0SCBM*L>cn}>9pNH^&hhlu=)AW#>-Q#HKa`C(Crid%;hdoVE9 z8g)g_a%2%S*uve`y%C^@iU=lwEn_b-s)PBc8gl-7Xx%G@n;z^;mjF4;#mJ2T#zshv z5zk7si%n(W&@RFx1msXnhI0&68o^Jo-8QWt{5g6XFaZ+MSp{AP&J+OAmp^rH9al7k1vumFTfLe-F(^p;pho55I$tfS4y2ofi{d??5jrj00T zKi}8TfxJiT0zSB)zjYM=h13~Pn+8%pLV`od8wmK)sdfGZ0wRb``53)US-aq#1+&TZ z!aYx*X^>cy8z>>zx{0{?7*3+IMS7{csF_b%8$2a(RXS+Rgfg%&l!&yX-KNf^;04}A zZ6;Nkq;f;T3N-dd>8C`&djB*oSPB@P_Vrg#-hqj*w!nq2TsD~1~RL_C=) z_Yu=WumaxtyoK})dBM=ZN#2KxX?UHBv4>a1IBK9m+{W`e1Sc8b;j*A!Woa1xX{C2? zLpXPzit0-5<^1*u?HmBzDhYc;nSYh#S>b^B8TNdLEDBgUD0O@1d37uL&&m)P85eNg z*1;<98sNtae$=6Fo?>t<=0xc%7`}m720sr_Ml%a80?Y+7BannNqq6lfE1n!p*IS5c zBeL)O+6Rb0RfPdr7??1-geK{fl*`^VJfNqA#C50yLo8h8H==do??7{1hKL7Nkk2jT zP(`sU5Ks#->lvb}>ey!Caj!q0k7c043HCu0d$U^#CJ-*%;l*sFcQkDcB^*{v7!Mnkpw7JYddZ+I?RGF>Or-%>>6u|0z0qZp zPib;fHA5g93FcY3GE8xiv;@01Te3`1B6Rz=?3W#ea#Ty_Y!?{NNRv5 zQggr57#o2azB3jX0Di?(yJl2CKGiI+ct;cxw#3SAPqgTp(_+{Gqzg&Aq6~*8$XqfB zU_59hfW;LPm9dgwIQSO$&j2dNFD;4U?n~m=3ok?O*hR}blDeYuO1*EHL!0n8bdrxj zpNNn#LR?A(1w}QevvJ7w7LjUba&8gA08VnKFcYZ+)y`MomPU9W2@M<)AABW@Th-*& z>vIs`WB^KF4_C@a8T@XIdKcm&N6uJ<-BI8GD2&HqMP*BN54*?c?mC%G#|l zJW5dDEJ_JYOf2kiK3>JE@%{w12^l(`q4jA>4GXW&CL<+hD*$71_bFeBj%e?w{<)8w zf8UiwQD`A@f6#-M+=PJ^t>@unj91(bfbl3OPrPCJSW&gcv^7lz!!GLPZ^WRZ8Sn?G z0#PjkK}?D?n&eNY??@8f1j~gSE=`h|Xu1TM`F8(}`49;JeCEu6l9Xs#RHq!DbuyEJ zc^b{65Q9rjh(7PTl#sM286gg&8eNIL*eXJuSN3S>AQM>j2jJp2vW0kO#SZ8@D!?WR zMWJHIp1jcrJKQfLHr1lLGdJDPp%RmS}IEN)BaGTIm^ZUai5aF+)lK_L|C=q%5?iV06I1 zL3aeCk^*>#x~5rD+bon%a%j6+aYp|Xst_SHI%!$1(#-6LV{+lg0D2X=78{;HfFoH| zp8!4y1#7%zXjEIuTrq>4ow0_&(HVS4`pH~V zinQ=Vk~5=c`D#Q*AKe&}O3@q7W&Yyj!MMvoGOOI@f=v4msd-y5(F!73#AqG09u9z@UB8QaH(tP^wF8#USFn$Z<&_DJVTkVm!NuI6C6B=XbTp|7rWvs3 z$P4*~SJHsSgJO&{|Ff1p%ChJqj=z-0(0_>P9*bEB*vr+}J0or4piFOIT=B)hOo|6k zrSh3$m9zY8j_fw8Ojq5F@@p_^NM%GWv>8hNLuzE;NMMxeqcICE2I)wnI;J9ECIajX zh843QwIs?dQEr0FMg@Us6eDOEmSU_x8B)@lK%&m1Tn^zQVw_`~5j|8k&e`l1z@s0BbA{5I5C9#WD5JLE>Wvgko#%s@Y~I>&3W zd;S|$$DI>|YbQ2 z&&Lo&G`1`sL2aNUv`>U7>(|QE>{p zcsHSz!896^>r9X{4h>yCAU~7`V}<(6;rCQA(YL}$THr=+Bcx{mc3>I@Vr0S_dHQ68!56F3~xR1o4XAHolb zREt&#O-~(8<j%Xz?BE6ugwCxSB;Ss2S z6}Ylm2ee}VeS?xQF1*Pdta3GWhShc6S6#|NzRhM{?CSI$vh zFf>iQia%8LmGnrDZ&g5Jhb4q0=eV}wtSu;4MKL!5*f}d<_O*|h=pv`C;ufJ>NvtG> zIU6wPI&i?aD)y6FjrdI#z-JHPb@Es%ffVQiQ_upn#eN`q<3^&T zuaxp9)aS%F=@epWnJ7T6J7kZ6bqwTB!aDX~MI@9V097k_RL>fqa2KzIE6?Z|KzIi_ zN&rFKiwkOgCZKwK3Xd3u-SdZbTvLScoPuu%0Kt-dznmg#fEn9JqJ`fh`jYrk#|c*( zW{7I&N9XC}*a5z4wtq@*N27g(uDpqn*SkK=k-eP^N1cEPNOMpkkaD4bEgbOv`9owF zd!DBt_ySUhhJyGq?v>WEoOYVfmkr$~d09d;mUD~I2uMPzh1&VX+B=@Hia=dT=i&J< zA8bzsM@io_6b?mUQ2L=4i;4+dq1FOHd(Z|#1;;F6*#0CTI)0Sw+QZ>ZJZ}_L&j@YY zbZ7mTH$1%BR@v>VsADt~;n9RPoc4QlG#ZS1z3|F#_THsjQD1R z?ySg@HJTE4Y+0{v9qc7dGZ#Kgn!+Z>e1?tDipRi@v1xqX+&YAQE~ArxO!~W%7bbFSe*+B6j?ymaQ>c8LNd6KHk)`GfEtmGa9|s zgx=b|#2LL&Z!!1;zKP~5$lyc|#X3lyBQ21qQ(2DF0$!-34e&QRCKJ^qitxBz%qZC` z;cBc#l?C%fH(dP6^l>9xv?3p9+CaUTy6VAB57eI(&qbXbnlKkNAz;l8s6%-!4c0=V z5rfzFLRu2rxzP}K{=(Ws$fS9tRH|%2Qgc3*_taPx2N#{Av7_NF4^%hk*R`7JrcrnL z0x~ilqc!TXvZA@#8`-L6XF_~P+Q&hv=o_Pp-5zv8p5<=7k{sy8;FVrSE{s|Bc8K_2 z+@en*BJ0ugq3E>@h5a=fwwL>5kGa&a$#^=T`LTbW4D1EVff0wQI7URx@JgCN#TPtza35X{~`?NG8lnc^d{gw zE zqY3W8FbLfR5;w1vL!wdr#hchT$@uXv^x_%NKHWp`y}&WAAwO3GA^A3k3v{~h>h4Pc z8k+|Z811-WqEGr%j?QI;98_H7>Y|5EL@Vc`#rSOKw^Ox`M9Bf@3M!WK_1Op?6&IZn z!}ASG86>>oZIpvlROuB4uD+IHOHW*F$QRLTE36v;agz%+=FR-^Fi4<-9G<2`hXo|& zqbSDG2E|(U8o!TJd{jB1dp2MkAP|OT4Z)BRAB~IrxbdNm3zkJ7CZ$^O5V}+jH-5yz zsGEvE19_&wej#*`&4tXBL@_}*!tPI4AwT#Mu3Dh_(Rpg@IqZy- zB1mVU2|7*uXy=+a<|Wn1e4@FMQ4IwE&v5aL0~67~g~KxH_!HisAc$!Hk@&sS5}365 zASlH^_S6XU4jh}J&MUIF6+q&(D?^fsk!7G2x%p|Aw8$UwFk$jx-A>0^L7kw#fR4UU z7v};HgAM>8RKe+(qPj@d9dSxTbidhVf2-}}n^dD*f%Im@+P3?mEa8`{ITr0*s;W3( zkQ@f-=%q8hR~}bSm@jfU48pArlpDb(srLkLA_u#aylRD2k|=1STLq`CF;pJqll4_U zxLb%RyHU+HNrvh)E>};0R0$ja>MsIrL4Wmdy#~$NdIhPuGX#~GZWn6Er4fb2mt4*2 z{JsSB{Jb956p55t#I%V}P|CohNJdg$1=1f)y_V}C8*VTj5~CD>NFl*}Sh!Ti#wRcY z#%JnBj=_no$a-?$O7tDeFd)9gJDyynm0pbT0s6w}f~t=e0b{Rj_#Sytxa9~p05t}o zcUjfJ#cWZ1hU2?y8rpz%#G66g_5!Y~DbbN7 z=O1U^n7CVa%|dQ8LpB7)Q5%#^b*BaDdIOYRT*1`{c9n{9)G|n{uu8I!c&7Z9yafx_ zX5wnRL<~z!GIUs*j9d#pPd}=?q+0M3;?%X@02_tKfvc@HfGIj#pokfdeXre(b- z4YQPhA$~#wiH?40)8tM(!G4c+29Osc-MjwT3GHZpTXOF z(cW4a4@=;VTetwn38^DooaH@$*+pJuAe2#_^}R&Mic+pUUgnCB66Sp6 zO=z&bb@(^tdB(sYQh)J(c!8FY6)U414g0X_qsSsvd$}4C=e_L-=an}Rggp~8?-uFc)W8v(A`|Ghpc7)ZO@(avAtD@tBRY(-$$I%trIg_YQ@P0$ zQfVwRat|=g=<@PKD1B1K{ui1(PK3}$)D^s#>utus{^&fa0hPzP0t`q{&7m?3o5KKe>Uj$~<>jhAUu;* z82EV3YyYeu8Jt=eAPrfUCMe8t1Sw>4&BgeLb3*4dKm;X)4bsI@w&c;JaA@hY5Krwjv?r(e%e@lYG=4`q#qaSo3(? zBSMK-jLH@|h#)w8birlteb|?D1;VJ34m@aaMMCAYV6zS3Gf8i9`z0ZXRt-iWJtaU@ z=?#v-lyr_@HI=Kd4b2UADtiOsT1~0}xYEN}QE4}M;}K1v5>Y)q*p4b{kTu|iR+Iol z9Z0kFv`9ZE={rh`TE&#+Q(3?m2qj;NuS|GLc?)6;#tqVn$XY1V;2l%)IWNUTzNS78 z4yKmBda|ET=cYee^=lL%(Bh&v`OFuCw^F3Ubwb&}h)Yb1cV*=9TMnjn7 zd{9MB#`c7IIl39$!ltMYK9G)rkD_cz4b|K&45SbSLndHLZmlA6R^nQZ;UUIt--}=r*uE;wmq%dY;Km*nPl2uLQG301 zU29P!b>ZYIkuXz=TN63%^1ZyFv(wsxn7GI_1BX~EbzJb?FGK(f#YrV-`_ND01#dmU zSc@l!V2QR8io!PZrAT}6+1Tp~>4}F=&MwGjOg)0PK4KX`efY$9T@}lI{O+3a|G=!2|&k(L* zz!P*=xq?9+p`il)c=P2~g>}4nz#olx5mUnas8EJs zi+;)B6HEe=2bwTK!&&z5Wc#3#bq@FNLoWKOF8YiMAbQlH+%I++o#Vr9_S`<4{P?tkXZz8Y?rPTQbT_aj(uw^RN&7jNEno{rPbMy&7Jb8(s19Nh zoetn_{)mhJ=@?h`zYv3W?dM!G_z{5F@C>I_<%eV1YfPkfKeDp5gN)tzbZxaSKR_V( zf+f-EO8pI1-_qouEf6cNrAU8Gr5*p8inCVdvmp*L@=zrd22M2X_JLP$9>}c)&^ji2 ztJt$f&HFAe*xtZBf>)XFWy&0`?rOHV!%sVY1N)-EH(Ck(wRsE`Bg^GO>C=t*N>84{ z%;E8aMjL)48?W|;6@RXWzx1>02XFWrKf(a8U3au)v)Vq#GU==y%&#-tByyFN{H$Bu z&rZ&8?i4?&F&uWQ2iZQa$H3J?`@>GR+8BXJ^QnjbI`^{!SocsVI>+6rz3x8DxPy4_ z7YS#DZjFlW+?(23HED{pe%IvIA>kba48(hWZ|j+V|)9B; ze02t&kN)0;Uqf^RM{k1+LfacVkZfQ>tJwnxwNfY0=^USC&p;a?iz&mA4KPZ{;%1l> zVck1AUx$VJtTgztCrWT-IaID32Vi5u>)`KC<+`4(yPLwpm$5c7U^*Wbu{GnnyK5pO zJWh04p#C0xI9Z86duu%IO}92uoN{|d`8Y2rMwfHfP4NiG9vP?Xbgr>M&2Rh=w4N|V z;8uTnn;^97yZ{GYv_UqnHWDUrjkS2J0;9cSpfMjLS|!+u@32KqlD0Qs#1>Dy*C^dD zzd0=t1&f!?Xh?t5!y`P<9lsif-|3pcgk8WG{Svk7d<`UUjDz_Yr%228dIvwQu+44c zGGL3N;bXWETX1g3&%eb#MRo|TCR=4{1X#_WxlxPg?>@r&UoiRIu`7lPG2>_ayXY^% zI=?&*7=aAC?ob9c&j7CEm`Ov;fPN72H>j1|HRA|3U8~?3v1dP%qk`~cgE3aK+YGC$ zI&}8YwGI6y+GB_V#{5Nn>z2Fi4n)iN=Q@?AIs-<@xmP#6BlEI5-=rP2n1&K z(skyNdF1!y;B~tLt7A=4CF3GZl7SUwG@Z+xwQd!4_(;Kp=b|rR4nJyRDpb*%y?f$# zik7=U+Id#FmI@%>ReMtpk~;;4g2>Io21^A_5!d}{WqSj@B%Ydi2uC({VV}GU+#K1v zoz6N8T^KvA5rm|`=dw$NJ{#*DhOsKxFFySQ=Y2Eu$z@~@pvCvRb1Eg`oofui$nOF0 z8rOwvk4Dh~7$LW}NXm^b!{8SvX|{!f(ed?SCJ|wRE^cf?ZP1ll6A5HHepQ7}5{njb z6hAOk?8FjD3?aLiA{+B|A{?om!6yK+DQ*|@3dLu^S+^a^L6L5gvQH?o#F5y_reV|2 zZv&$U21hBre(J0fe=1PIoY}R{mSH4Q2JIKZ40J}YN?vYAmRFqPp0IQ(jm>j9h#HK- zb?FOQhsdj>Um3zY6PNh=@y$fY(j^o9puu=7gpOdSL02bsIwqi_=!BIH8iA zj11r0NsG@JeKx4kuugW=4+TC;%DX~r+T`?UmV?vydKUIomk2~>Z@}9~8{>CNyD22S zM3#9(iY%2##+#b&O|(U7WI%JxE}>9*7HQKMcv$%RuvLO`LQ^nBClJd79-tJcT2Bf? zA7G8`EjqhsuQ(@ByN&!pI7{UhT~i4jl+!y2C-_7n5)$Q9e@eqGFovqmEx(O^QO)kf z+9HUBOPA_Hhkw937Qi8}CyX}HZ4kiXC*lol_OYo#jkWbiK_8$v#9*62Y&YCQT~%u2 zr;gQk;#^ctM2U?}Z&p~T*%-eslMdg_A3iH2J`hVqzgD>=GAi-BiF%jH$Os(-lW9yY zvX70Xpx&{UNJHDliH!?*>+e>Tmbum31i<8B<>do%Musr_KDsL$(q6armRiuK$N z;xesbvE~t`8X1F$!M@lav|Zg0*7=*FJ!|Pc^M;v})q#H{mRTMABsC{08aT9Xr`9gR zx4<0eF$=WZK+G`p`>KFL16Z`nCTO^R5uZ}gXg1;k}IbjWQm;ZwY@76V~` zz`U}HLLQC|3e97qBAL(YxSP_#8di53zjHFdQ3#yF16}isKK{6{)C0fg1$lvAo@Iywk}= zbF00oE_ur8J3||rknT(xa>8Bx|F{*F1Y1+E8Ut}k#ReD?t{I-)iYK$|oOG*osLcC_ zg`~j`&nnD&fM3K6hnwj+$TVNk*Mq(Bbe~AHlYxV{T~w@b$lrbrL$y3H7plWg6N1&I ze6TT9zvi*KO-@dvA3CHl1$rzQ&O{y^$Ac~~7B1mg-c*4S&fZj6F`-sQqFhFj-EspS zmT7wx5hk-Ip^q={lj%?pQEA`T9~_0|j-ywgb^I2H`nrXnKuK=h5OTSTaXW{}VqKf0 zDlQ-43duBs7xk{@O?pdMksg9rG2wUJYIA@*&3ym37RLz`wm}4E2oC<+PN)4G*2uh) z3}*ne!4`P1U+xqID=#tzJaI=}ar)EIM5nH= z9i+C^X0VqK+i?RX>(PAfW^cw`*VGFk*dJT-=*|yZxl&k37bcfXQYZp)$D-@g5If_ss*mTR5O0PIVZnv7J8*WH#RyjN+HR0 zi4Vd5Be(T25D3bT>3DrnUd8p;ZWdYKK=3__R7O)|5?)nnukB)UD%0MUu;K-r*tfbU zUY+RDkg<|G<8Z;K3*LoM#ghP8*1ze|u_j@`lxHm4J9wiJKugwTVZMp#P2wtC*O9H9yOiGe|>R$*3rA;|?23O-~&}#s+f=1bxnlgPbIFGRJ!AIg&TtX>9sUe=N z;|8neVqg9u>8}cdWj!p*Xn~dPIV}hRB@JSBw;=TnySt2Cu4O?B5v8K(AGVdij^tB~ zS(1i?Bvv)B>m`(%mMJ{v=4kT_4hUyT-FcG^{fZ+9qUPam<%%yLKkG0sN{8tfTfdmwhtY(9OqWDCD@ zc47oOh0AAaZoI}&eXnb4@U9`(IG@$Cf9{O;`0v{rPz!l-i03zO%&DQ(EhNr_nJGgN zN67`89d=UUy)mt3_Cp*&XT11K6$X#VqAF>i!z~?pRnNTy*;?n!CTMiuEw_g9vnZW0 zV@USiJI)$t=ZPW+`#^)~q6C&HvYG0BwS{X_5fp?jTvtb^{ceB{+<{6EaiaDF(Ym&Z zpMBs-PC>F@T>E7)VsLETEzJOTJKC*n?#S1A##Hh6d>KbVCCyas2Xdrifxg`z9wP_I z>9eoH-cMKAb&4Z&h@~+q;vl@lsh&L5z-hPQYrL5t|9`^uaVoN(YnUhUoVgjP)(!(2 zYI`FLK*0)Q?SUMNu>7~?7B*2q`1LYDfi}IMU}G+`Vwu6Hyq{a6!Vid26ZoOIdC7A= z=?*a$X_;dSjEBE~cGsMOFFfUu5H4`u-JJrrj>MZFshxS^3>=MS)R!YAv%s_3)c8lE zoYxTj=Gt^Px4IAY{I^!>-C?vyfZt8MbKGvjrK+jgn#!8a+l{d;>X=686K%{!i^h|DvyAm#k;6XQ6EP3r+_>hPJG5Rd9(%`0nE^1yr&mznOCWd;L z4Z~ZK>AFO1*37`;{!{J1t)QVrcAy3?@w1FGC{VBf>a;??Y%@ma6A`i2A!o}5FGe4% zI)to9;LCg@w#o0wLE`pTXig+w#LOCO)ss!?Az!+d&xIJxds6+wHaxTL?Rgj}95Js_j!bY(=A1cX=lx6gC{teT79kE?(ly}VNGXz> zz-Av|N4CJy5X5Ja`_mPYK)} z6WmFNxr&~2AC?U~0?6@%g@|j?E{mEk5CNJ-N(xMImVE089#DKd=%of}z@PPP_|3ha!?oj7hy~h{YhTw??WJ@)Z6ynx2FSvD z#p8IkU(D#l*gB#V(F|e|$f}|^(>#+Du>*rxWhTP^Cr#@)@V?XHrS5ywZU$ zZudsE#bL9&f#9lYjR&}{A1o4?pi8}<5=))9BuIbcg-Tg7ZdOoolKBcje0I2oV+4&%ynu zPk0KWzA&G7X0xnW=p5;P)2#wEu#|^ zTmD3aT>t`?4$#a?J=yPC=qJ;JQ{;0%>qUazVy0{TS@O>tC61`46&tf}Y_*6P^0Gt> zW@k9P1rCZM@7YJY)!GAp9#3618GQ4wFwYREhW&oFB=-(X`J|iKh`eJ*NUXu;+ikEQ z$3{~ki}Q*wp&)MCTOiDuV8vnvzUf6m${vu5CLven(n(?sVnS&*p6@g@735GjhEAhS z!}Cxv?>u@FodT6q`FgxI#qqFJQ6S$(H$mTvbKk;eAzPHln)p;Cxf=cf3gY*SF(J<7 zTgE7GBI_B%Aly|8Jjw}aE%3vIImPPi2|XOCd(`cTavt15q`{jdjB88z)-#E5U`C`u ztXcF_Wj0-lo~ns*%QiF|LrGA;jou6+A9w`DGb>>ow=UrKG;>W(SeSa?7P7-Qgq+7} z_;VfNxXz#(!eX`L+-lZHA9nQ^3d7N3@l|@zW7yyO`=yzaf!u2W9a=ST zH}u`v?eH=5OP)M=x;mF)iEW{p8w@lhoY^fAG*s{%j@FQ4jdzFkd!x>HTHVU($UMx0 z><+(&X`lfl4_X6Ft$P8-ds>Js(r*G27RUNwcUzA9C-Jo*#ohxbIGBeV-QUSCd-%aD z(XbkNiyLSy8?`yi&^6m{h#6qNN8Y>AHEa2_CTN{UgriA!&0}7BJ=H~?fj9br0V|n% zCP@m*dr}M`qA$b{iY0f=op0IYKX}%X&LZNo>U0vffpQBr#=XwRLyCefH|3mm6Gs=yK)Nd(0R9>Ky$%XZ!QSC!i4>x3$E}75)8mkMn_F8;f z0~Hck!x$(o1qjZFfziL_4lr)&k?o~yDNcL^es}JV7^B7yha%ds>iy-VB_?{kkf`=@;yUtJ$#cz-`VVDP`DLNPyp%2SY?sLLW52D zS5AB~(xJ__TP|BYTu-uWxm@=X7=f^u;H5>!mU6nbnsqar7^rwz(G+hB{NO;|Nev>` zfO$OKP4j4FDQ{Mnu2^oS1IG?R=y2uqZi6vWjDcs)dC3E^4HY)%GdS68%1|O>W9!V# z#dIWfD|)hkww{e}(<9DTARdjYOyoz58xwV$Ct};+^>?!EyP0&t&zr2l`iqP#@KTrG zQ_Fdu>Jj=@Pj2RH@ceYgJia%ha{hWDtObA7A@NkaaD?7$@p@HC!_A=f!#63-qD&+LXhjt#SO zR#tlzs9|~QV8?C|%^BTD8gO$}1`RUT>a34^Yl{0?457q&h*#Pl{lTqQb28L`FbzA;BHDHb23& zQ@(NAHXe`N5|NNc}Sk4fGU z$O=9cKaJ~1NZt9RyFsNzcOh=lAJ?2ZZqeoPEIEokUywLwOCGqN&|tD0?f^x)8Vzg? z=!9z==%jfT+Hix#$@$8ojoh`B_Uh`H;CE3f2R8LKoPi9I>^TV!;8KXCf-L*!ssiv9uA-5BE&eOEaL`Xf5=!9g?CYurosuU6R ze&ZA)?!d#~yG)KkJ+t%DVS$_s2nRtMJvV774jAATe0S3{zKqYtZ0zwwAVr+_VkbG{ zs1D__e1d~HC-uX|=lw}FN>>DF48@b0E+|cGsmB_GS#RY|CKd9{#7p}g6z9dZfm=qw zQ4A>1CR}bB230W?UTk&V!0oT)QkvChT4Em=XK-GdC=W#tTrFSx{7brK7!H=-l;SoM zHk|3tpuzG11nPlk3l71QNd(TgAu{$0VT?_WW!i_Q$2A0oH5J+1tWG0I9Vc!xRBMv7 z;qlediwk%oN0i;PT-a!HxS0XseK1l7sp|@h-jZY1O~D^lC?K1Q$%vB3drV!pGo=)y z57hjFaQ9h^6ql8C-4zZDzivJyS{vsRXnjSn=PX>iW#QUAglo}nBVG&Gf)l-dFpDF$ z9);4(84s2OQeUcZ>Ba8Cu$+;B6LgIbMS7ai-{9?wDI3(2Vq+MRlZ^z+TVr&Pa$S-}huAOGDdb$rP}J>kd=73nyT3AjxI0KXJXWBLCA DrFsjw literal 0 HcmV?d00001 diff --git a/node_modules/sqlite3/lib/index.js b/node_modules/sqlite3/lib/index.js new file mode 100644 index 0000000..3f8eeb3 --- /dev/null +++ b/node_modules/sqlite3/lib/index.js @@ -0,0 +1 @@ +module.exports = require('./sqlite3'); diff --git a/node_modules/sqlite3/lib/sqlite3.js b/node_modules/sqlite3/lib/sqlite3.js new file mode 100644 index 0000000..c8e3e8c --- /dev/null +++ b/node_modules/sqlite3/lib/sqlite3.js @@ -0,0 +1,207 @@ +var binary = require('node-pre-gyp'); +var path = require('path'); +var binding_path = binary.find(path.resolve(path.join(__dirname,'../package.json'))); +var binding = require(binding_path); +var sqlite3 = module.exports = exports = binding; +var EventEmitter = require('events').EventEmitter; + +function normalizeMethod (fn) { + return function (sql) { + var errBack; + var args = Array.prototype.slice.call(arguments, 1); + if (typeof args[args.length - 1] === 'function') { + var callback = args[args.length - 1]; + errBack = function(err) { + if (err) { + callback(err); + } + }; + } + var statement = new Statement(this, sql, errBack); + return fn.call(this, statement, args); + }; +} + +function inherits(target, source) { + for (var k in source.prototype) + target.prototype[k] = source.prototype[k]; +} + +sqlite3.cached = { + Database: function(file, a, b) { + if (file === '' || file === ':memory:') { + // Don't cache special databases. + return new Database(file, a, b); + } + + var db; + file = path.resolve(file); + function cb() { callback.call(db, null); } + + if (!sqlite3.cached.objects[file]) { + db = sqlite3.cached.objects[file] = new Database(file, a, b); + } + else { + // Make sure the callback is called. + db = sqlite3.cached.objects[file]; + var callback = (typeof a === 'number') ? b : a; + if (typeof callback === 'function') { + if (db.open) process.nextTick(cb); + else db.once('open', cb); + } + } + + return db; + }, + objects: {} +}; + + +var Database = sqlite3.Database; +var Statement = sqlite3.Statement; +var Backup = sqlite3.Backup; + +inherits(Database, EventEmitter); +inherits(Statement, EventEmitter); +inherits(Backup, EventEmitter); + +// Database#prepare(sql, [bind1, bind2, ...], [callback]) +Database.prototype.prepare = normalizeMethod(function(statement, params) { + return params.length + ? statement.bind.apply(statement, params) + : statement; +}); + +// Database#run(sql, [bind1, bind2, ...], [callback]) +Database.prototype.run = normalizeMethod(function(statement, params) { + statement.run.apply(statement, params).finalize(); + return this; +}); + +// Database#get(sql, [bind1, bind2, ...], [callback]) +Database.prototype.get = normalizeMethod(function(statement, params) { + statement.get.apply(statement, params).finalize(); + return this; +}); + +// Database#all(sql, [bind1, bind2, ...], [callback]) +Database.prototype.all = normalizeMethod(function(statement, params) { + statement.all.apply(statement, params).finalize(); + return this; +}); + +// Database#each(sql, [bind1, bind2, ...], [callback], [complete]) +Database.prototype.each = normalizeMethod(function(statement, params) { + statement.each.apply(statement, params).finalize(); + return this; +}); + +Database.prototype.map = normalizeMethod(function(statement, params) { + statement.map.apply(statement, params).finalize(); + return this; +}); + +// Database#backup(filename, [callback]) +// Database#backup(filename, destName, sourceName, filenameIsDest, [callback]) +Database.prototype.backup = function() { + var backup; + if (arguments.length <= 2) { + // By default, we write the main database out to the main database of the named file. + // This is the most likely use of the backup api. + backup = new Backup(this, arguments[0], 'main', 'main', true, arguments[1]); + } else { + // Otherwise, give the user full control over the sqlite3_backup_init arguments. + backup = new Backup(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); + } + // Per the sqlite docs, exclude the following errors as non-fatal by default. + backup.retryErrors = [sqlite3.BUSY, sqlite3.LOCKED]; + return backup; +}; + +Statement.prototype.map = function() { + var params = Array.prototype.slice.call(arguments); + var callback = params.pop(); + params.push(function(err, rows) { + if (err) return callback(err); + var result = {}; + if (rows.length) { + var keys = Object.keys(rows[0]), key = keys[0]; + if (keys.length > 2) { + // Value is an object + for (var i = 0; i < rows.length; i++) { + result[rows[i][key]] = rows[i]; + } + } else { + var value = keys[1]; + // Value is a plain value + for (i = 0; i < rows.length; i++) { + result[rows[i][key]] = rows[i][value]; + } + } + } + callback(err, result); + }); + return this.all.apply(this, params); +}; + +var isVerbose = false; + +var supportedEvents = [ 'trace', 'profile', 'insert', 'update', 'delete' ]; + +Database.prototype.addListener = Database.prototype.on = function(type) { + var val = EventEmitter.prototype.addListener.apply(this, arguments); + if (supportedEvents.indexOf(type) >= 0) { + this.configure(type, true); + } + return val; +}; + +Database.prototype.removeListener = function(type) { + var val = EventEmitter.prototype.removeListener.apply(this, arguments); + if (supportedEvents.indexOf(type) >= 0 && !this._events[type]) { + this.configure(type, false); + } + return val; +}; + +Database.prototype.removeAllListeners = function(type) { + var val = EventEmitter.prototype.removeAllListeners.apply(this, arguments); + if (supportedEvents.indexOf(type) >= 0) { + this.configure(type, false); + } + return val; +}; + +// Save the stack trace over EIO callbacks. +sqlite3.verbose = function() { + if (!isVerbose) { + var trace = require('./trace'); + [ + 'prepare', + 'get', + 'run', + 'all', + 'each', + 'map', + 'close', + 'exec' + ].forEach(function (name) { + trace.extendTrace(Database.prototype, name); + }); + [ + 'bind', + 'get', + 'run', + 'all', + 'each', + 'map', + 'reset', + 'finalize', + ].forEach(function (name) { + trace.extendTrace(Statement.prototype, name); + }); + isVerbose = true; + } + + return this; +}; diff --git a/node_modules/sqlite3/lib/trace.js b/node_modules/sqlite3/lib/trace.js new file mode 100644 index 0000000..987f38a --- /dev/null +++ b/node_modules/sqlite3/lib/trace.js @@ -0,0 +1,41 @@ +// Inspired by https://github.com/tlrobinson/long-stack-traces +var util = require('util'); + +function extendTrace(object, property, pos) { + var old = object[property]; + object[property] = function() { + var error = new Error(); + var name = object.constructor.name + '#' + property + '(' + + Array.prototype.slice.call(arguments).map(function(el) { + return util.inspect(el, false, 0); + }).join(', ') + ')'; + + if (typeof pos === 'undefined') pos = -1; + if (pos < 0) pos += arguments.length; + var cb = arguments[pos]; + if (typeof arguments[pos] === 'function') { + arguments[pos] = function replacement() { + try { + return cb.apply(this, arguments); + } catch (err) { + if (err && err.stack && !err.__augmented) { + err.stack = filter(err).join('\n'); + err.stack += '\n--> in ' + name; + err.stack += '\n' + filter(error).slice(1).join('\n'); + err.__augmented = true; + } + throw err; + } + }; + } + return old.apply(this, arguments); + }; +} +exports.extendTrace = extendTrace; + + +function filter(error) { + return error.stack.split('\n').filter(function(line) { + return line.indexOf(__filename) < 0; + }); +} diff --git a/node_modules/sqlite3/package.json b/node_modules/sqlite3/package.json new file mode 100644 index 0000000..1e11947 --- /dev/null +++ b/node_modules/sqlite3/package.json @@ -0,0 +1,142 @@ +{ + "_args": [ + [ + "sqlite3@4.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "sqlite3@4.1.1", + "_id": "sqlite3@4.1.1", + "_inBundle": false, + "_integrity": "sha512-CvT5XY+MWnn0HkbwVKJAyWEMfzpAPwnTiB3TobA5Mri44SrTovmmh499NPQP+gatkeOipqPlBLel7rn4E/PCQg==", + "_location": "/sqlite3", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "sqlite3@4.1.1", + "name": "sqlite3", + "escapedName": "sqlite3", + "rawSpec": "4.1.1", + "saveSpec": null, + "fetchSpec": "4.1.1" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.1.tgz", + "_spec": "4.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "MapBox", + "url": "https://mapbox.com/" + }, + "binary": { + "module_name": "node_sqlite3", + "module_path": "./lib/binding/{node_abi}-{platform}-{arch}", + "host": "https://mapbox-node-binary.s3.amazonaws.com", + "remote_path": "./{name}/v{version}/{toolset}/", + "package_name": "{node_abi}-{platform}-{arch}.tar.gz" + }, + "bugs": { + "url": "https://github.com/mapbox/node-sqlite3/issues" + }, + "contributors": [ + { + "name": "Konstantin Käfer", + "email": "mail@kkaefer.com" + }, + { + "name": "Dane Springmeyer", + "email": "dane@mapbox.com" + }, + { + "name": "Will White", + "email": "will@mapbox.com" + }, + { + "name": "Orlando Vazquez", + "email": "ovazquez@gmail.com" + }, + { + "name": "Artem Kustikov", + "email": "kustikoff@gmail.com" + }, + { + "name": "Eric Fredricksen", + "email": "efredricksen@gmail.com" + }, + { + "name": "John Wright", + "email": "mrjjwright@gmail.com" + }, + { + "name": "Ryan Dahl", + "email": "ry@tinyclouds.org" + }, + { + "name": "Tom MacWright", + "email": "tom@mapbox.com" + }, + { + "name": "Carter Thaxton", + "email": "carter.thaxton@gmail.com" + }, + { + "name": "Audrius Kažukauskas", + "email": "audrius@neutrino.lt" + }, + { + "name": "Johannes Schauer", + "email": "josch@pyneo.org" + }, + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net" + }, + { + "name": "AJ ONeal", + "email": "coolaj86@gmail.com" + }, + { + "name": "Mithgol" + }, + { + "name": "Ben Noordhuis", + "email": "ben@strongloop.com" + } + ], + "dependencies": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0", + "request": "^2.87.0" + }, + "description": "Asynchronous, non-blocking SQLite3 bindings", + "devDependencies": { + "@mapbox/cloudfriend": "^1.9.0", + "aws-sdk": "2.x", + "eslint": "3.5.0", + "mocha": "^5.2.0" + }, + "homepage": "https://github.com/mapbox/node-sqlite3", + "keywords": [ + "sql", + "sqlite", + "sqlite3", + "database" + ], + "license": "BSD-3-Clause", + "main": "./lib/sqlite3", + "name": "sqlite3", + "repository": { + "type": "git", + "url": "git://github.com/mapbox/node-sqlite3.git" + }, + "scripts": { + "install": "node-pre-gyp install --fallback-to-build", + "pack": "node-pre-gyp package", + "pretest": "node test/support/createdb.js", + "test": "mocha -R spec --timeout 480000" + }, + "version": "4.1.1" +} diff --git a/node_modules/sqlite3/sqlite3.js b/node_modules/sqlite3/sqlite3.js new file mode 100644 index 0000000..c4b587d --- /dev/null +++ b/node_modules/sqlite3/sqlite3.js @@ -0,0 +1 @@ +module.exports = require('./lib/sqlite3'); diff --git a/node_modules/sqlite3/src/async.h b/node_modules/sqlite3/src/async.h new file mode 100644 index 0000000..5232c12 --- /dev/null +++ b/node_modules/sqlite3/src/async.h @@ -0,0 +1,78 @@ +#ifndef NODE_SQLITE3_SRC_ASYNC_H +#define NODE_SQLITE3_SRC_ASYNC_H + +#include "threading.h" +#include + +#if defined(NODE_SQLITE3_BOOST_THREADING) +#include +#endif + + +// Generic uv_async handler. +template class Async { + typedef void (*Callback)(Parent* parent, Item* item); + +protected: + uv_async_t watcher; + NODE_SQLITE3_MUTEX_t + std::vector data; + Callback callback; +public: + Parent* parent; + +public: + Async(Parent* parent_, Callback cb_) + : callback(cb_), parent(parent_) { + watcher.data = this; + NODE_SQLITE3_MUTEX_INIT + uv_async_init(uv_default_loop(), &watcher, reinterpret_cast(listener)); + } + + static void listener(uv_async_t* handle, int status) { + Async* async = static_cast(handle->data); + std::vector rows; + NODE_SQLITE3_MUTEX_LOCK(&async->mutex) + rows.swap(async->data); + NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex) + for (unsigned int i = 0, size = rows.size(); i < size; i++) { + async->callback(async->parent, rows[i]); + } + } + + static void close(uv_handle_t* handle) { + assert(handle != NULL); + assert(handle->data != NULL); + Async* async = static_cast(handle->data); + delete async; + } + + void finish() { + // Need to call the listener again to ensure all items have been + // processed. Is this a bug in uv_async? Feels like uv_close + // should handle that. + listener(&watcher, 0); + uv_close((uv_handle_t*)&watcher, close); + } + + void add(Item* item) { + NODE_SQLITE3_MUTEX_LOCK(&mutex); + data.push_back(item); + NODE_SQLITE3_MUTEX_UNLOCK(&mutex) + } + + void send() { + uv_async_send(&watcher); + } + + void send(Item* item) { + add(item); + send(); + } + + ~Async() { + NODE_SQLITE3_MUTEX_DESTROY + } +}; + +#endif diff --git a/node_modules/sqlite3/src/backup.cc b/node_modules/sqlite3/src/backup.cc new file mode 100644 index 0000000..17eafc3 --- /dev/null +++ b/node_modules/sqlite3/src/backup.cc @@ -0,0 +1,416 @@ +#include +#include +#include +#include + +#include "macros.h" +#include "database.h" +#include "backup.h" + +using namespace node_sqlite3; + +Nan::Persistent Backup::constructor_template; + + +NAN_MODULE_INIT(Backup::Init) { + Nan::HandleScope scope; + + Local t = Nan::New(New); + + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(Nan::New("Backup").ToLocalChecked()); + + Nan::SetPrototypeMethod(t, "step", Step); + Nan::SetPrototypeMethod(t, "finish", Finish); + + NODE_SET_GETTER(t, "idle", IdleGetter); + NODE_SET_GETTER(t, "completed", CompletedGetter); + NODE_SET_GETTER(t, "failed", FailedGetter); + NODE_SET_GETTER(t, "remaining", RemainingGetter); + NODE_SET_GETTER(t, "pageCount", PageCountGetter); + + NODE_SET_SETTER(t, "retryErrors", RetryErrorGetter, RetryErrorSetter); + + constructor_template.Reset(t); + Nan::Set(target, Nan::New("Backup").ToLocalChecked(), + Nan::GetFunction(t).ToLocalChecked()); +} + +void Backup::Process() { + if (finished && !queue.empty()) { + return CleanQueue(); + } + + while (inited && !locked && !queue.empty()) { + Call* call = queue.front(); + queue.pop(); + + call->callback(call->baton); + delete call; + } +} + +void Backup::Schedule(Work_Callback callback, Baton* baton) { + if (finished) { + queue.push(new Call(callback, baton)); + CleanQueue(); + } + else if (!inited || locked || !queue.empty()) { + queue.push(new Call(callback, baton)); + } + else { + callback(baton); + } +} + +template void Backup::Error(T* baton) { + Nan::HandleScope scope; + + Backup* backup = baton->backup; + // Fail hard on logic errors. + assert(backup->status != 0); + EXCEPTION(backup->message, backup->status, exception); + + Local cb = Nan::New(baton->callback); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(backup->handle(), cb, 1, argv); + } + else { + Local argv[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(backup->handle(), 2, argv); + } +} + +void Backup::CleanQueue() { + Nan::HandleScope scope; + + if (inited && !queue.empty()) { + // This backup has already been initialized and is now finished. + // Fire error for all remaining items in the queue. + EXCEPTION("Backup is already finished", SQLITE_MISUSE, exception); + Local argv[] = { exception }; + bool called = false; + + // Clear out the queue so that this object can get GC'ed. + while (!queue.empty()) { + Call* call = queue.front(); + queue.pop(); + + Local cb = Nan::New(call->baton->callback); + + if (inited && !cb.IsEmpty() && + cb->IsFunction()) { + TRY_CATCH_CALL(handle(), cb, 1, argv); + called = true; + } + + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } + + // When we couldn't call a callback function, emit an error on the + // Backup object. + if (!called) { + Local info[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(handle(), 2, info); + } + } + else while (!queue.empty()) { + // Just delete all items in the queue; we already fired an event when + // initializing the backup failed. + Call* call = queue.front(); + queue.pop(); + + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } +} + +NAN_METHOD(Backup::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Use the new operator to create new Backup objects"); + } + + int length = info.Length(); + + if (length <= 0 || !Database::HasInstance(info[0])) { + return Nan::ThrowTypeError("Database object expected"); + } + else if (length <= 1 || !info[1]->IsString()) { + return Nan::ThrowTypeError("Filename expected"); + } + else if (length <= 2 || !info[2]->IsString()) { + return Nan::ThrowTypeError("Source database name expected"); + } + else if (length <= 3 || !info[3]->IsString()) { + return Nan::ThrowTypeError("Destination database name expected"); + } + else if (length <= 4 || !info[4]->IsBoolean()) { + return Nan::ThrowTypeError("Direction flag expected"); + } + else if (length > 5 && !info[5]->IsUndefined() && !info[5]->IsFunction()) { + return Nan::ThrowTypeError("Callback expected"); + } + + Database* db = Nan::ObjectWrap::Unwrap(info[0].As()); + Local filename = Local::Cast(info[1]); + Local sourceName = Local::Cast(info[2]); + Local destName = Local::Cast(info[3]); + Local filenameIsDest = Local::Cast(info[4]); + + Nan::ForceSet(info.This(), Nan::New("filename").ToLocalChecked(), filename, ReadOnly); + Nan::ForceSet(info.This(), Nan::New("sourceName").ToLocalChecked(), sourceName, ReadOnly); + Nan::ForceSet(info.This(), Nan::New("destName").ToLocalChecked(), destName, ReadOnly); + Nan::ForceSet(info.This(), Nan::New("filenameIsDest").ToLocalChecked(), filenameIsDest, ReadOnly); + + Backup* backup = new Backup(db); + backup->Wrap(info.This()); + + InitializeBaton* baton = new InitializeBaton(db, Local::Cast(info[5]), backup); + baton->filename = std::string(*Nan::Utf8String(filename)); + baton->sourceName = std::string(*Nan::Utf8String(sourceName)); + baton->destName = std::string(*Nan::Utf8String(destName)); + baton->filenameIsDest = Nan::To(filenameIsDest).FromJust(); + db->Schedule(Work_BeginInitialize, baton); + + info.GetReturnValue().Set(info.This()); +} + +void Backup::Work_BeginInitialize(Database::Baton* baton) { + assert(baton->db->open); + baton->db->pending++; + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Initialize, (uv_after_work_cb)Work_AfterInitialize); + assert(status == 0); +} + +void Backup::Work_Initialize(uv_work_t* req) { + BACKUP_INIT(InitializeBaton); + + // In case stepping fails, we use a mutex to make sure we get the associated + // error message. + sqlite3_mutex* mtx = sqlite3_db_mutex(baton->db->_handle); + sqlite3_mutex_enter(mtx); + + backup->status = sqlite3_open(baton->filename.c_str(), &backup->_otherDb); + + if (backup->status == SQLITE_OK) { + backup->_handle = sqlite3_backup_init( + baton->filenameIsDest ? backup->_otherDb : backup->db->_handle, + baton->destName.c_str(), + baton->filenameIsDest ? backup->db->_handle : backup->_otherDb, + baton->sourceName.c_str()); + } + backup->_destDb = baton->filenameIsDest ? backup->_otherDb : backup->db->_handle; + + if (backup->status != SQLITE_OK) { + backup->message = std::string(sqlite3_errmsg(backup->_destDb)); + sqlite3_close(backup->_otherDb); + backup->_otherDb = NULL; + backup->_destDb = NULL; + } + + sqlite3_mutex_leave(mtx); +} + +void Backup::Work_AfterInitialize(uv_work_t* req) { + Nan::HandleScope scope; + + BACKUP_INIT(InitializeBaton); + + if (backup->status != SQLITE_OK) { + Error(baton); + backup->FinishAll(); + } + else { + backup->inited = true; + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(backup->handle(), cb, 1, argv); + } + } + BACKUP_END(); +} + +NAN_METHOD(Backup::Step) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + + REQUIRE_ARGUMENT_INTEGER(0, pages); + OPTIONAL_ARGUMENT_FUNCTION(1, callback); + + StepBaton* baton = new StepBaton(backup, callback, pages); + backup->GetRetryErrors(baton->retryErrorsSet); + backup->Schedule(Work_BeginStep, baton); + info.GetReturnValue().Set(info.This()); +} + +void Backup::Work_BeginStep(Baton* baton) { + BACKUP_BEGIN(Step); +} + +void Backup::Work_Step(uv_work_t* req) { + BACKUP_INIT(StepBaton); + if (backup->_handle) { + backup->status = sqlite3_backup_step(backup->_handle, baton->pages); + backup->remaining = sqlite3_backup_remaining(backup->_handle); + backup->pageCount = sqlite3_backup_pagecount(backup->_handle); + } + if (backup->status != SQLITE_OK) { + // Text of message is a little awkward to get, since the error is not associated + // with a db connection. +#if SQLITE_VERSION_NUMBER >= 3007015 + // sqlite3_errstr is a relatively new method + backup->message = std::string(sqlite3_errstr(backup->status)); +#else + backup->message = "Sqlite error"; +#endif + if (baton->retryErrorsSet.size() > 0) { + if (baton->retryErrorsSet.find(backup->status) == baton->retryErrorsSet.end()) { + backup->FinishSqlite(); + } + } + } +} + +void Backup::Work_AfterStep(uv_work_t* req) { + Nan::HandleScope scope; + + BACKUP_INIT(StepBaton); + + if (backup->status == SQLITE_DONE) { + backup->completed = true; + } else if (!backup->_handle) { + backup->failed = true; + } + + if (backup->status != SQLITE_OK && backup->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null(), Nan::New(backup->status == SQLITE_DONE) }; + TRY_CATCH_CALL(backup->handle(), cb, 2, argv); + } + } + + BACKUP_END(); +} + +NAN_METHOD(Backup::Finish) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(backup, callback); + backup->Schedule(Work_BeginFinish, baton); + info.GetReturnValue().Set(info.This()); +} + +void Backup::Work_BeginFinish(Baton* baton) { + BACKUP_BEGIN(Finish); +} + +void Backup::Work_Finish(uv_work_t* req) { + BACKUP_INIT(Baton); + backup->FinishSqlite(); +} + +void Backup::Work_AfterFinish(uv_work_t* req) { + Nan::HandleScope scope; + + BACKUP_INIT(Baton); + backup->FinishAll(); + + // Fire callback in case there was one. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(backup->handle(), cb, 0, NULL); + } + + BACKUP_END(); +} + +void Backup::FinishAll() { + assert(!finished); + if (!completed && !failed) { + failed = true; + } + finished = true; + CleanQueue(); + FinishSqlite(); + db->Unref(); +} + +void Backup::FinishSqlite() { + if (_handle) { + sqlite3_backup_finish(_handle); + _handle = NULL; + } + if (_otherDb) { + sqlite3_close(_otherDb); + _otherDb = NULL; + } + _destDb = NULL; +} + +NAN_GETTER(Backup::IdleGetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + bool idle = backup->inited && !backup->locked && backup->queue.empty(); + info.GetReturnValue().Set(idle); +} + +NAN_GETTER(Backup::CompletedGetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + info.GetReturnValue().Set(backup->completed); +} + +NAN_GETTER(Backup::FailedGetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + info.GetReturnValue().Set(backup->failed); +} + +NAN_GETTER(Backup::RemainingGetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + info.GetReturnValue().Set(backup->remaining); +} + +NAN_GETTER(Backup::PageCountGetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + info.GetReturnValue().Set(backup->pageCount); +} + +NAN_GETTER(Backup::RetryErrorGetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + info.GetReturnValue().Set(Nan::New(backup->retryErrors)); +} + +NAN_SETTER(Backup::RetryErrorSetter) { + Backup* backup = Nan::ObjectWrap::Unwrap(info.This()); + if (!value->IsArray()) { + return Nan::ThrowError("retryErrors must be an array"); + } + Local array = Local::Cast(value); + backup->retryErrors.Reset(array); +} + +void Backup::GetRetryErrors(std::set& retryErrorsSet) { + retryErrorsSet.clear(); + Local array = Nan::New(retryErrors); + int length = array->Length(); + for (int i = 0; i < length; i++) { + Local code = Nan::Get(array, i).ToLocalChecked(); + if (code->IsInt32()) { + retryErrorsSet.insert(Nan::To(code).FromJust()); + } + } +} + diff --git a/node_modules/sqlite3/src/backup.h b/node_modules/sqlite3/src/backup.h new file mode 100644 index 0000000..723f8c9 --- /dev/null +++ b/node_modules/sqlite3/src/backup.h @@ -0,0 +1,223 @@ +#ifndef NODE_SQLITE3_SRC_BACKUP_H +#define NODE_SQLITE3_SRC_BACKUP_H + +#include "database.h" + +#include +#include +#include + +#include +#include + +using namespace v8; +using namespace node; + +namespace node_sqlite3 { + +/** + * + * A class for managing an sqlite3_backup object. For consistency + * with other node-sqlite3 classes, it maintains an internal queue + * of calls. + * + * Intended usage from node: + * + * var db = new sqlite3.Database('live.db'); + * var backup = db.backup('backup.db'); + * ... + * // in event loop, move backup forward when we have time. + * if (backup.idle) { backup.step(NPAGES); } + * if (backup.completed) { ... success ... } + * if (backup.failed) { ... sadness ... } + * // do other work in event loop - fine to modify live.db + * ... + * + * Here is how sqlite's backup api is exposed: + * + * - `sqlite3_backup_init`: This is implemented as + * `db.backup(filename, [callback])` or + * `db.backup(filename, destDbName, sourceDbName, filenameIsDest, [callback])`. + * - `sqlite3_backup_step`: `backup.step(pages, [callback])`. + * - `sqlite3_backup_finish`: `backup.finish([callback])`. + * - `sqlite3_backup_remaining`: `backup.remaining`. + * - `sqlite3_backup_pagecount`: `backup.pageCount`. + * + * There are the following read-only properties: + * + * - `backup.completed` is set to `true` when the backup + * succeeeds. + * - `backup.failed` is set to `true` when the backup + * has a fatal error. + * - `backup.idle` is set to `true` when no operation + * is currently in progress or queued for the backup. + * - `backup.remaining` is an integer with the remaining + * number of pages after the last call to `backup.step` + * (-1 if `step` not yet called). + * - `backup.pageCount` is an integer with the total number + * of pages measured during the last call to `backup.step` + * (-1 if `step` not yet called). + * + * There is the following writable property: + * + * - `backup.retryErrors`: an array of sqlite3 error codes + * that are treated as non-fatal - meaning, if they occur, + * backup.failed is not set, and the backup may continue. + * By default, this is `[sqlite3.BUSY, sqlite3.LOCKED]`. + * + * The `db.backup(filename, [callback])` shorthand is sufficient + * for making a backup of a database opened by node-sqlite3. If + * using attached or temporary databases, or moving data in the + * opposite direction, the more complete (but daunting) + * `db.backup(filename, destDbName, sourceDbName, filenameIsDest, [callback])` + * signature is provided. + * + * A backup will finish automatically when it succeeds or a fatal + * error occurs, meaning it is not necessary to call `db.finish()`. + * By default, SQLITE_LOCKED and SQLITE_BUSY errors are not + * treated as failures, and the backup will continue if they + * occur. The set of errors that are tolerated can be controlled + * by setting `backup.retryErrors`. To disable automatic + * finishing and stick strictly to sqlite's raw api, set + * `backup.retryErrors` to `[]`. In that case, it is necessary + * to call `backup.finish()`. + * + * In the same way as node-sqlite3 databases and statements, + * backup methods can be called safely without callbacks, due + * to an internal call queue. So for example this naive code + * will correctly back up a db, if there are no errors: + * + * var backup = db.backup('backup.db'); + * backup.step(-1); + * backup.finish(); + * + */ +class Backup : public Nan::ObjectWrap { +public: + static Nan::Persistent constructor_template; + + static NAN_MODULE_INIT(Init); + static NAN_METHOD(New); + + struct Baton { + uv_work_t request; + Backup* backup; + Nan::Persistent callback; + + Baton(Backup* backup_, Local cb_) : backup(backup_) { + backup->Ref(); + request.data = this; + callback.Reset(cb_); + } + virtual ~Baton() { + backup->Unref(); + callback.Reset(); + } + }; + + struct InitializeBaton : Database::Baton { + Backup* backup; + std::string filename; + std::string sourceName; + std::string destName; + bool filenameIsDest; + InitializeBaton(Database* db_, Local cb_, Backup* backup_) : + Baton(db_, cb_), backup(backup_), filenameIsDest(true) { + backup->Ref(); + } + virtual ~InitializeBaton() { + backup->Unref(); + if (!db->IsOpen() && db->IsLocked()) { + // The database handle was closed before the backup could be opened. + backup->FinishAll(); + } + } + }; + + struct StepBaton : Baton { + int pages; + std::set retryErrorsSet; + StepBaton(Backup* backup_, Local cb_, int pages_) : + Baton(backup_, cb_), pages(pages_) {} + }; + + typedef void (*Work_Callback)(Baton* baton); + + struct Call { + Call(Work_Callback cb_, Baton* baton_) : callback(cb_), baton(baton_) {}; + Work_Callback callback; + Baton* baton; + }; + + Backup(Database* db_) : Nan::ObjectWrap(), + db(db_), + _handle(NULL), + _otherDb(NULL), + _destDb(NULL), + inited(false), + locked(true), + completed(false), + failed(false), + remaining(-1), + pageCount(-1), + finished(false) { + db->Ref(); + } + + ~Backup() { + if (!finished) { + FinishAll(); + } + retryErrors.Reset(); + } + + WORK_DEFINITION(Step); + WORK_DEFINITION(Finish); + static NAN_GETTER(IdleGetter); + static NAN_GETTER(CompletedGetter); + static NAN_GETTER(FailedGetter); + static NAN_GETTER(PageCountGetter); + static NAN_GETTER(RemainingGetter); + static NAN_GETTER(FatalErrorGetter); + static NAN_GETTER(RetryErrorGetter); + + static NAN_SETTER(FatalErrorSetter); + static NAN_SETTER(RetryErrorSetter); + +protected: + static void Work_BeginInitialize(Database::Baton* baton); + static void Work_Initialize(uv_work_t* req); + static void Work_AfterInitialize(uv_work_t* req); + + void Schedule(Work_Callback callback, Baton* baton); + void Process(); + void CleanQueue(); + template static void Error(T* baton); + + void FinishAll(); + void FinishSqlite(); + void GetRetryErrors(std::set& retryErrorsSet); + + Database* db; + + sqlite3_backup* _handle; + sqlite3* _otherDb; + sqlite3* _destDb; + int status; + std::string message; + + bool inited; + bool locked; + bool completed; + bool failed; + int remaining; + int pageCount; + bool finished; + std::queue queue; + + Nan::Persistent retryErrors; +}; + +} + +#endif diff --git a/node_modules/sqlite3/src/database.cc b/node_modules/sqlite3/src/database.cc new file mode 100644 index 0000000..ace5fa0 --- /dev/null +++ b/node_modules/sqlite3/src/database.cc @@ -0,0 +1,692 @@ +#include + +#include "macros.h" +#include "database.h" +#include "statement.h" + +using namespace node_sqlite3; + +Nan::Persistent Database::constructor_template; + +NAN_MODULE_INIT(Database::Init) { + Nan::HandleScope scope; + + Local t = Nan::New(New); + + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(Nan::New("Database").ToLocalChecked()); + + Nan::SetPrototypeMethod(t, "close", Close); + Nan::SetPrototypeMethod(t, "exec", Exec); + Nan::SetPrototypeMethod(t, "wait", Wait); + Nan::SetPrototypeMethod(t, "loadExtension", LoadExtension); + Nan::SetPrototypeMethod(t, "serialize", Serialize); + Nan::SetPrototypeMethod(t, "parallelize", Parallelize); + Nan::SetPrototypeMethod(t, "configure", Configure); + Nan::SetPrototypeMethod(t, "interrupt", Interrupt); + + NODE_SET_GETTER(t, "open", OpenGetter); + + constructor_template.Reset(t); + + Nan::Set(target, Nan::New("Database").ToLocalChecked(), + Nan::GetFunction(t).ToLocalChecked()); +} + +void Database::Process() { + Nan::HandleScope scope; + + if (!open && locked && !queue.empty()) { + EXCEPTION("Database handle is closed", SQLITE_MISUSE, exception); + Local argv[] = { exception }; + bool called = false; + + // Call all callbacks with the error object. + while (!queue.empty()) { + Call* call = queue.front(); + Local cb = Nan::New(call->baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(this->handle(), cb, 1, argv); + called = true; + } + queue.pop(); + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } + + // When we couldn't call a callback function, emit an error on the + // Database object. + if (!called) { + Local info[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(handle(), 2, info); + } + return; + } + + while (open && (!locked || pending == 0) && !queue.empty()) { + Call* call = queue.front(); + + if (call->exclusive && pending > 0) { + break; + } + + queue.pop(); + locked = call->exclusive; + call->callback(call->baton); + delete call; + + if (locked) break; + } +} + +void Database::Schedule(Work_Callback callback, Baton* baton, bool exclusive) { + Nan::HandleScope scope; + + if (!open && locked) { + EXCEPTION("Database is closed", SQLITE_MISUSE, exception); + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(handle(), cb, 1, argv); + } + else { + Local argv[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(handle(), 2, argv); + } + return; + } + + if (!open || ((locked || exclusive || serialize) && pending > 0)) { + queue.push(new Call(callback, baton, exclusive || serialize)); + } + else { + locked = exclusive; + callback(baton); + } +} + +NAN_METHOD(Database::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Use the new operator to create new Database objects"); + } + + REQUIRE_ARGUMENT_STRING(0, filename); + int pos = 1; + + int mode; + if (info.Length() >= pos && info[pos]->IsInt32()) { + mode = Nan::To(info[pos++]).FromJust(); + } else { + mode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; + } + + Local callback; + if (info.Length() >= pos && info[pos]->IsFunction()) { + callback = Local::Cast(info[pos++]); + } + + Database* db = new Database(); + db->Wrap(info.This()); + + Nan::ForceSet(info.This(), Nan::New("filename").ToLocalChecked(), info[0].As(), ReadOnly); + Nan::ForceSet(info.This(), Nan::New("mode").ToLocalChecked(), Nan::New(mode), ReadOnly); + + // Start opening the database. + OpenBaton* baton = new OpenBaton(db, callback, *filename, mode); + Work_BeginOpen(baton); + + info.GetReturnValue().Set(info.This()); +} + +void Database::Work_BeginOpen(Baton* baton) { + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Open, (uv_after_work_cb)Work_AfterOpen); + assert(status == 0); +} + +void Database::Work_Open(uv_work_t* req) { + OpenBaton* baton = static_cast(req->data); + Database* db = baton->db; + + baton->status = sqlite3_open_v2( + baton->filename.c_str(), + &db->_handle, + baton->mode, + NULL + ); + + if (baton->status != SQLITE_OK) { + baton->message = std::string(sqlite3_errmsg(db->_handle)); + sqlite3_close(db->_handle); + db->_handle = NULL; + } + else { + // Set default database handle values. + sqlite3_busy_timeout(db->_handle, 1000); + } +} + +void Database::Work_AfterOpen(uv_work_t* req) { + Nan::HandleScope scope; + + OpenBaton* baton = static_cast(req->data); + Database* db = baton->db; + + Local argv[1]; + if (baton->status != SQLITE_OK) { + EXCEPTION(baton->message, baton->status, exception); + argv[0] = exception; + } + else { + db->open = true; + argv[0] = Nan::Null(); + } + + Local cb = Nan::New(baton->callback); + + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(db->handle(), cb, 1, argv); + } + else if (!db->open) { + Local info[] = { Nan::New("error").ToLocalChecked(), argv[0] }; + EMIT_EVENT(db->handle(), 2, info); + } + + if (db->open) { + Local info[] = { Nan::New("open").ToLocalChecked() }; + EMIT_EVENT(db->handle(), 1, info); + db->Process(); + } + + delete baton; +} + +NAN_GETTER(Database::OpenGetter) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + info.GetReturnValue().Set(db->open); +} + +NAN_METHOD(Database::Close) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(db, callback); + db->Schedule(Work_BeginClose, baton, true); + + info.GetReturnValue().Set(info.This()); +} + +void Database::Work_BeginClose(Baton* baton) { + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + + baton->db->RemoveCallbacks(); + baton->db->closing = true; + + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Close, (uv_after_work_cb)Work_AfterClose); + assert(status == 0); +} + +void Database::Work_Close(uv_work_t* req) { + Baton* baton = static_cast(req->data); + Database* db = baton->db; + + baton->status = sqlite3_close(db->_handle); + + if (baton->status != SQLITE_OK) { + baton->message = std::string(sqlite3_errmsg(db->_handle)); + } + else { + db->_handle = NULL; + } +} + +void Database::Work_AfterClose(uv_work_t* req) { + Nan::HandleScope scope; + + Baton* baton = static_cast(req->data); + Database* db = baton->db; + + db->closing = false; + + Local argv[1]; + if (baton->status != SQLITE_OK) { + EXCEPTION(baton->message, baton->status, exception); + argv[0] = exception; + } + else { + db->open = false; + // Leave db->locked to indicate that this db object has reached + // the end of its life. + argv[0] = Nan::Null(); + } + + Local cb = Nan::New(baton->callback); + + // Fire callbacks. + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(db->handle(), cb, 1, argv); + } + else if (db->open) { + Local info[] = { Nan::New("error").ToLocalChecked(), argv[0] }; + EMIT_EVENT(db->handle(), 2, info); + } + + if (!db->open) { + Local info[] = { Nan::New("close").ToLocalChecked(), argv[0] }; + EMIT_EVENT(db->handle(), 1, info); + db->Process(); + } + + delete baton; +} + +NAN_METHOD(Database::Serialize) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + bool before = db->serialize; + db->serialize = true; + + if (!callback.IsEmpty() && callback->IsFunction()) { + TRY_CATCH_CALL(info.This(), callback, 0, NULL); + db->serialize = before; + } + + db->Process(); + + info.GetReturnValue().Set(info.This()); +} + +NAN_METHOD(Database::Parallelize) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + bool before = db->serialize; + db->serialize = false; + + if (!callback.IsEmpty() && callback->IsFunction()) { + TRY_CATCH_CALL(info.This(), callback, 0, NULL); + db->serialize = before; + } + + db->Process(); + + info.GetReturnValue().Set(info.This()); +} + +NAN_METHOD(Database::Configure) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + + REQUIRE_ARGUMENTS(2); + + if (Nan::Equals(info[0], Nan::New("trace").ToLocalChecked()).FromJust()) { + Local handle; + Baton* baton = new Baton(db, handle); + db->Schedule(RegisterTraceCallback, baton); + } + else if (Nan::Equals(info[0], Nan::New("profile").ToLocalChecked()).FromJust()) { + Local handle; + Baton* baton = new Baton(db, handle); + db->Schedule(RegisterProfileCallback, baton); + } + else if (Nan::Equals(info[0], Nan::New("busyTimeout").ToLocalChecked()).FromJust()) { + if (!info[1]->IsInt32()) { + return Nan::ThrowTypeError("Value must be an integer"); + } + Local handle; + Baton* baton = new Baton(db, handle); + baton->status = Nan::To(info[1]).FromJust(); + db->Schedule(SetBusyTimeout, baton); + } + else { + return Nan::ThrowError(Exception::Error(String::Concat( +#if V8_MAJOR_VERSION > 6 + info.GetIsolate(), +#endif + Nan::To(info[0]).ToLocalChecked(), + Nan::New(" is not a valid configuration option").ToLocalChecked() + ))); + } + + db->Process(); + + info.GetReturnValue().Set(info.This()); +} + +NAN_METHOD(Database::Interrupt) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + + if (!db->open) { + return Nan::ThrowError("Database is not open"); + } + + if (db->closing) { + return Nan::ThrowError("Database is closing"); + } + + sqlite3_interrupt(db->_handle); + info.GetReturnValue().Set(info.This()); +} + +void Database::SetBusyTimeout(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + + // Abuse the status field for passing the timeout. + sqlite3_busy_timeout(baton->db->_handle, baton->status); + + delete baton; +} + +void Database::RegisterTraceCallback(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + Database* db = baton->db; + + if (db->debug_trace == NULL) { + // Add it. + db->debug_trace = new AsyncTrace(db, TraceCallback); + sqlite3_trace(db->_handle, TraceCallback, db); + } + else { + // Remove it. + sqlite3_trace(db->_handle, NULL, NULL); + db->debug_trace->finish(); + db->debug_trace = NULL; + } + + delete baton; +} + +void Database::TraceCallback(void* db, const char* sql) { + // Note: This function is called in the thread pool. + // Note: Some queries, such as "EXPLAIN" queries, are not sent through this. + static_cast(db)->debug_trace->send(new std::string(sql)); +} + +void Database::TraceCallback(Database* db, std::string* sql) { + // Note: This function is called in the main V8 thread. + Nan::HandleScope scope; + + Local argv[] = { + Nan::New("trace").ToLocalChecked(), + Nan::New(sql->c_str()).ToLocalChecked() + }; + EMIT_EVENT(db->handle(), 2, argv); + delete sql; +} + +void Database::RegisterProfileCallback(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + Database* db = baton->db; + + if (db->debug_profile == NULL) { + // Add it. + db->debug_profile = new AsyncProfile(db, ProfileCallback); + sqlite3_profile(db->_handle, ProfileCallback, db); + } + else { + // Remove it. + sqlite3_profile(db->_handle, NULL, NULL); + db->debug_profile->finish(); + db->debug_profile = NULL; + } + + delete baton; +} + +void Database::ProfileCallback(void* db, const char* sql, sqlite3_uint64 nsecs) { + // Note: This function is called in the thread pool. + // Note: Some queries, such as "EXPLAIN" queries, are not sent through this. + ProfileInfo* info = new ProfileInfo(); + info->sql = std::string(sql); + info->nsecs = nsecs; + static_cast(db)->debug_profile->send(info); +} + +void Database::ProfileCallback(Database *db, ProfileInfo* info) { + Nan::HandleScope scope; + + Local argv[] = { + Nan::New("profile").ToLocalChecked(), + Nan::New(info->sql.c_str()).ToLocalChecked(), + Nan::New((double)info->nsecs / 1000000.0) + }; + EMIT_EVENT(db->handle(), 3, argv); + delete info; +} + +void Database::RegisterUpdateCallback(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + Database* db = baton->db; + + if (db->update_event == NULL) { + // Add it. + db->update_event = new AsyncUpdate(db, UpdateCallback); + sqlite3_update_hook(db->_handle, UpdateCallback, db); + } + else { + // Remove it. + sqlite3_update_hook(db->_handle, NULL, NULL); + db->update_event->finish(); + db->update_event = NULL; + } + + delete baton; +} + +void Database::UpdateCallback(void* db, int type, const char* database, + const char* table, sqlite3_int64 rowid) { + // Note: This function is called in the thread pool. + // Note: Some queries, such as "EXPLAIN" queries, are not sent through this. + UpdateInfo* info = new UpdateInfo(); + info->type = type; + info->database = std::string(database); + info->table = std::string(table); + info->rowid = rowid; + static_cast(db)->update_event->send(info); +} + +void Database::UpdateCallback(Database *db, UpdateInfo* info) { + Nan::HandleScope scope; + + Local argv[] = { + Nan::New(sqlite_authorizer_string(info->type)).ToLocalChecked(), + Nan::New(info->database.c_str()).ToLocalChecked(), + Nan::New(info->table.c_str()).ToLocalChecked(), + Nan::New(info->rowid), + }; + EMIT_EVENT(db->handle(), 4, argv); + delete info; +} + +NAN_METHOD(Database::Exec) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + + REQUIRE_ARGUMENT_STRING(0, sql); + OPTIONAL_ARGUMENT_FUNCTION(1, callback); + + Baton* baton = new ExecBaton(db, callback, *sql); + db->Schedule(Work_BeginExec, baton, true); + + info.GetReturnValue().Set(info.This()); +} + +void Database::Work_BeginExec(Baton* baton) { + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Exec, (uv_after_work_cb)Work_AfterExec); + assert(status == 0); +} + +void Database::Work_Exec(uv_work_t* req) { + ExecBaton* baton = static_cast(req->data); + + char* message = NULL; + baton->status = sqlite3_exec( + baton->db->_handle, + baton->sql.c_str(), + NULL, + NULL, + &message + ); + + if (baton->status != SQLITE_OK && message != NULL) { + baton->message = std::string(message); + sqlite3_free(message); + } +} + +void Database::Work_AfterExec(uv_work_t* req) { + Nan::HandleScope scope; + + ExecBaton* baton = static_cast(req->data); + Database* db = baton->db; + + Local cb = Nan::New(baton->callback); + + if (baton->status != SQLITE_OK) { + EXCEPTION(baton->message, baton->status, exception); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(db->handle(), cb, 1, argv); + } + else { + Local info[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(db->handle(), 2, info); + } + } + else if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(db->handle(), cb, 1, argv); + } + + db->Process(); + + delete baton; +} + +NAN_METHOD(Database::Wait) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(db, callback); + db->Schedule(Work_Wait, baton, true); + + info.GetReturnValue().Set(info.This()); +} + +void Database::Work_Wait(Baton* baton) { + Nan::HandleScope scope; + + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(baton->db->handle(), cb, 1, argv); + } + + baton->db->Process(); + + delete baton; +} + +NAN_METHOD(Database::LoadExtension) { + Database* db = Nan::ObjectWrap::Unwrap(info.This()); + + REQUIRE_ARGUMENT_STRING(0, filename); + OPTIONAL_ARGUMENT_FUNCTION(1, callback); + + Baton* baton = new LoadExtensionBaton(db, callback, *filename); + db->Schedule(Work_BeginLoadExtension, baton, true); + + info.GetReturnValue().Set(info.This()); +} + +void Database::Work_BeginLoadExtension(Baton* baton) { + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_LoadExtension, reinterpret_cast(Work_AfterLoadExtension)); + assert(status == 0); +} + +void Database::Work_LoadExtension(uv_work_t* req) { + LoadExtensionBaton* baton = static_cast(req->data); + + sqlite3_enable_load_extension(baton->db->_handle, 1); + + char* message = NULL; + baton->status = sqlite3_load_extension( + baton->db->_handle, + baton->filename.c_str(), + 0, + &message + ); + + sqlite3_enable_load_extension(baton->db->_handle, 0); + + if (baton->status != SQLITE_OK && message != NULL) { + baton->message = std::string(message); + sqlite3_free(message); + } +} + +void Database::Work_AfterLoadExtension(uv_work_t* req) { + Nan::HandleScope scope; + + LoadExtensionBaton* baton = static_cast(req->data); + Database* db = baton->db; + Local cb = Nan::New(baton->callback); + + if (baton->status != SQLITE_OK) { + EXCEPTION(baton->message, baton->status, exception); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(db->handle(), cb, 1, argv); + } + else { + Local info[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(db->handle(), 2, info); + } + } + else if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(db->handle(), cb, 1, argv); + } + + db->Process(); + + delete baton; +} + +void Database::RemoveCallbacks() { + if (debug_trace) { + debug_trace->finish(); + debug_trace = NULL; + } + if (debug_profile) { + debug_profile->finish(); + debug_profile = NULL; + } +} diff --git a/node_modules/sqlite3/src/database.h b/node_modules/sqlite3/src/database.h new file mode 100644 index 0000000..1ec1015 --- /dev/null +++ b/node_modules/sqlite3/src/database.h @@ -0,0 +1,193 @@ + +#ifndef NODE_SQLITE3_SRC_DATABASE_H +#define NODE_SQLITE3_SRC_DATABASE_H + + +#include +#include + +#include +#include + +#include "async.h" + +using namespace v8; + +namespace node_sqlite3 { + +class Database; + + +class Database : public Nan::ObjectWrap { +public: + static Nan::Persistent constructor_template; + static NAN_MODULE_INIT(Init); + + static inline bool HasInstance(Local val) { + Nan::HandleScope scope; + if (!val->IsObject()) return false; + Local obj = val.As(); + return Nan::New(constructor_template)->HasInstance(obj); + } + + struct Baton { + uv_work_t request; + Database* db; + Nan::Persistent callback; + int status; + std::string message; + + Baton(Database* db_, Local cb_) : + db(db_), status(SQLITE_OK) { + db->Ref(); + request.data = this; + callback.Reset(cb_); + } + virtual ~Baton() { + db->Unref(); + callback.Reset(); + } + }; + + struct OpenBaton : Baton { + std::string filename; + int mode; + OpenBaton(Database* db_, Local cb_, const char* filename_, int mode_) : + Baton(db_, cb_), filename(filename_), mode(mode_) {} + }; + + struct ExecBaton : Baton { + std::string sql; + ExecBaton(Database* db_, Local cb_, const char* sql_) : + Baton(db_, cb_), sql(sql_) {} + }; + + struct LoadExtensionBaton : Baton { + std::string filename; + LoadExtensionBaton(Database* db_, Local cb_, const char* filename_) : + Baton(db_, cb_), filename(filename_) {} + }; + + typedef void (*Work_Callback)(Baton* baton); + + struct Call { + Call(Work_Callback cb_, Baton* baton_, bool exclusive_ = false) : + callback(cb_), exclusive(exclusive_), baton(baton_) {}; + Work_Callback callback; + bool exclusive; + Baton* baton; + }; + + struct ProfileInfo { + std::string sql; + sqlite3_int64 nsecs; + }; + + struct UpdateInfo { + int type; + std::string database; + std::string table; + sqlite3_int64 rowid; + }; + + bool IsOpen() { return open; } + bool IsLocked() { return locked; } + + typedef Async AsyncTrace; + typedef Async AsyncProfile; + typedef Async AsyncUpdate; + + friend class Statement; + friend class Backup; + +protected: + Database() : Nan::ObjectWrap(), + _handle(NULL), + open(false), + closing(false), + locked(false), + pending(0), + serialize(false), + debug_trace(NULL), + debug_profile(NULL), + update_event(NULL) { + } + + ~Database() { + RemoveCallbacks(); + sqlite3_close(_handle); + _handle = NULL; + open = false; + } + + static NAN_METHOD(New); + static void Work_BeginOpen(Baton* baton); + static void Work_Open(uv_work_t* req); + static void Work_AfterOpen(uv_work_t* req); + + static NAN_GETTER(OpenGetter); + + void Schedule(Work_Callback callback, Baton* baton, bool exclusive = false); + void Process(); + + static NAN_METHOD(Exec); + static void Work_BeginExec(Baton* baton); + static void Work_Exec(uv_work_t* req); + static void Work_AfterExec(uv_work_t* req); + + static NAN_METHOD(Wait); + static void Work_Wait(Baton* baton); + + static NAN_METHOD(Close); + static void Work_BeginClose(Baton* baton); + static void Work_Close(uv_work_t* req); + static void Work_AfterClose(uv_work_t* req); + + static NAN_METHOD(LoadExtension); + static void Work_BeginLoadExtension(Baton* baton); + static void Work_LoadExtension(uv_work_t* req); + static void Work_AfterLoadExtension(uv_work_t* req); + + static NAN_METHOD(Serialize); + static NAN_METHOD(Parallelize); + + static NAN_METHOD(Configure); + + static NAN_METHOD(Interrupt); + + static void SetBusyTimeout(Baton* baton); + + static void RegisterTraceCallback(Baton* baton); + static void TraceCallback(void* db, const char* sql); + static void TraceCallback(Database* db, std::string* sql); + + static void RegisterProfileCallback(Baton* baton); + static void ProfileCallback(void* db, const char* sql, sqlite3_uint64 nsecs); + static void ProfileCallback(Database* db, ProfileInfo* info); + + static void RegisterUpdateCallback(Baton* baton); + static void UpdateCallback(void* db, int type, const char* database, const char* table, sqlite3_int64 rowid); + static void UpdateCallback(Database* db, UpdateInfo* info); + + void RemoveCallbacks(); + +protected: + sqlite3* _handle; + + bool open; + bool closing; + bool locked; + unsigned int pending; + + bool serialize; + + std::queue queue; + + AsyncTrace* debug_trace; + AsyncProfile* debug_profile; + AsyncUpdate* update_event; +}; + +} + +#endif diff --git a/node_modules/sqlite3/src/gcc-preinclude.h b/node_modules/sqlite3/src/gcc-preinclude.h new file mode 100644 index 0000000..9ea8c57 --- /dev/null +++ b/node_modules/sqlite3/src/gcc-preinclude.h @@ -0,0 +1,6 @@ + +// http://web.archive.org/web/20140401031018/http://rjpower9000.wordpress.com:80/2012/04/09/fun-with-shared-libraries-version-glibc_2-14-not-found/ + +#if defined(__linux__) && defined(__x86_64__) +__asm__(".symver memcpy,memcpy@GLIBC_2.2.5"); +#endif diff --git a/node_modules/sqlite3/src/macros.h b/node_modules/sqlite3/src/macros.h new file mode 100644 index 0000000..9c0136c --- /dev/null +++ b/node_modules/sqlite3/src/macros.h @@ -0,0 +1,183 @@ +#ifndef NODE_SQLITE3_SRC_MACROS_H +#define NODE_SQLITE3_SRC_MACROS_H + +const char* sqlite_code_string(int code); +const char* sqlite_authorizer_string(int type); + + +#define REQUIRE_ARGUMENTS(n) \ + if (info.Length() < (n)) { \ + return Nan::ThrowTypeError("Expected " #n "arguments"); \ + } + + +#define REQUIRE_ARGUMENT_EXTERNAL(i, var) \ + if (info.Length() <= (i) || !info[i]->IsExternal()) { \ + return Nan::ThrowTypeError("Argument " #i " invalid"); \ + } \ + Local var = Local::Cast(info[i]); + + +#define REQUIRE_ARGUMENT_FUNCTION(i, var) \ + if (info.Length() <= (i) || !info[i]->IsFunction()) { \ + return Nan::ThrowTypeError("Argument " #i " must be a function"); \ + } \ + Local var = Local::Cast(info[i]); + + +#define REQUIRE_ARGUMENT_STRING(i, var) \ + if (info.Length() <= (i) || !info[i]->IsString()) { \ + return Nan::ThrowTypeError("Argument " #i " must be a string"); \ + } \ + Nan::Utf8String var(info[i]); + +#define REQUIRE_ARGUMENT_INTEGER(i, var) \ + if (info.Length() <= (i) || !info[i]->IsInt32()) { \ + return Nan::ThrowTypeError("Argument " #i " must be an integer"); \ + } \ + int var(Nan::To(info[i]).FromJust()); + +#define OPTIONAL_ARGUMENT_FUNCTION(i, var) \ + Local var; \ + if (info.Length() > i && !info[i]->IsUndefined()) { \ + if (!info[i]->IsFunction()) { \ + return Nan::ThrowTypeError("Argument " #i " must be a function"); \ + } \ + var = Local::Cast(info[i]); \ + } + + +#define OPTIONAL_ARGUMENT_INTEGER(i, var, default) \ + int var; \ + if (info.Length() <= (i)) { \ + var = (default); \ + } \ + else if (info[i]->IsInt32()) { \ + var = Nan::To(info[i]).FromJust(); \ + } \ + else { \ + return Nan::ThrowTypeError("Argument " #i " must be an integer"); \ + } + + +#define DEFINE_CONSTANT_INTEGER(target, constant, name) \ + Nan::ForceSet(target, \ + Nan::New(#name).ToLocalChecked(), \ + Nan::New(constant), \ + static_cast(ReadOnly | DontDelete) \ + ); + +#define DEFINE_CONSTANT_STRING(target, constant, name) \ + Nan::ForceSet(target, \ + Nan::New(#name).ToLocalChecked(), \ + Nan::New(constant).ToLocalChecked(), \ + static_cast(ReadOnly | DontDelete) \ + ); + + +#define NODE_SET_GETTER(target, name, function) \ + Nan::SetAccessor((target)->InstanceTemplate(), \ + Nan::New(name).ToLocalChecked(), (function)); + +#define NODE_SET_SETTER(target, name, getter, setter) \ + Nan::SetAccessor((target)->InstanceTemplate(), \ + Nan::New(name).ToLocalChecked(), getter, setter); + +#define GET_STRING(source, name, property) \ + Nan::Utf8String name(Nan::Get(source, \ + Nan::New(prop).ToLocalChecked()).ToLocalChecked()); + +#define GET_INTEGER(source, name, prop) \ + int name = Nan::To(Nan::Get(source, \ + Nan::New(property).ToLocalChecked()).ToLocalChecked()).FromJust(); + +#define EXCEPTION(msg, errno, name) \ + Local name = Exception::Error(Nan::New( \ + std::string(sqlite_code_string(errno)) + \ + std::string(": ") + std::string(msg) \ + ).ToLocalChecked()); \ + Local name ##_obj = name.As(); \ + Nan::Set(name ##_obj, Nan::New("errno").ToLocalChecked(), Nan::New(errno));\ + Nan::Set(name ##_obj, Nan::New("code").ToLocalChecked(), \ + Nan::New(sqlite_code_string(errno)).ToLocalChecked()); + +#define EMIT_EVENT(obj, argc, argv) \ + TRY_CATCH_CALL((obj), \ + Nan::Get(obj, \ + Nan::New("emit").ToLocalChecked()).ToLocalChecked().As(),\ + argc, argv \ + ); + +#define TRY_CATCH_CALL(context, callback, argc, argv) \ + Nan::MakeCallback((context), (callback), (argc), (argv)) + +#define WORK_DEFINITION(name) \ + static NAN_METHOD(name); \ + static void Work_Begin##name(Baton* baton); \ + static void Work_##name(uv_work_t* req); \ + static void Work_After##name(uv_work_t* req); + +#define STATEMENT_BEGIN(type) \ + assert(baton); \ + assert(baton->stmt); \ + assert(!baton->stmt->locked); \ + assert(!baton->stmt->finalized); \ + assert(baton->stmt->prepared); \ + baton->stmt->locked = true; \ + baton->stmt->db->pending++; \ + int status = uv_queue_work(uv_default_loop(), \ + &baton->request, \ + Work_##type, reinterpret_cast(Work_After##type)); \ + assert(status == 0); + +#define STATEMENT_INIT(type) \ + type* baton = static_cast(req->data); \ + Statement* stmt = baton->stmt; + +#define STATEMENT_END() \ + assert(stmt->locked); \ + assert(stmt->db->pending); \ + stmt->locked = false; \ + stmt->db->pending--; \ + stmt->Process(); \ + stmt->db->Process(); \ + delete baton; + +#define BACKUP_BEGIN(type) \ + assert(baton); \ + assert(baton->backup); \ + assert(!baton->backup->locked); \ + assert(!baton->backup->finished); \ + assert(baton->backup->inited); \ + baton->backup->locked = true; \ + baton->backup->db->pending++; \ + int status = uv_queue_work(uv_default_loop(), \ + &baton->request, \ + Work_##type, reinterpret_cast(Work_After##type)); \ + assert(status == 0); + +#define BACKUP_INIT(type) \ + type* baton = static_cast(req->data); \ + Backup* backup = baton->backup; + +#define BACKUP_END() \ + assert(backup->locked); \ + assert(backup->db->pending); \ + backup->locked = false; \ + backup->db->pending--; \ + backup->Process(); \ + backup->db->Process(); \ + delete baton; + +#define DELETE_FIELD(field) \ + if (field != NULL) { \ + switch ((field)->type) { \ + case SQLITE_INTEGER: delete (Values::Integer*)(field); break; \ + case SQLITE_FLOAT: delete (Values::Float*)(field); break; \ + case SQLITE_TEXT: delete (Values::Text*)(field); break; \ + case SQLITE_BLOB: delete (Values::Blob*)(field); break; \ + case SQLITE_NULL: delete (Values::Null*)(field); break; \ + } \ + } + +#endif diff --git a/node_modules/sqlite3/src/node_sqlite3.cc b/node_modules/sqlite3/src/node_sqlite3.cc new file mode 100644 index 0000000..10f88ea --- /dev/null +++ b/node_modules/sqlite3/src/node_sqlite3.cc @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include + +#include "macros.h" +#include "database.h" +#include "statement.h" +#include "backup.h" + +using namespace node_sqlite3; + +namespace { + +NAN_MODULE_INIT(RegisterModule) { + Nan::HandleScope scope; + + Database::Init(target); + Statement::Init(target); + Backup::Init(target); + + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_READONLY, OPEN_READONLY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_READWRITE, OPEN_READWRITE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_CREATE, OPEN_CREATE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_FULLMUTEX, OPEN_FULLMUTEX); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_URI, OPEN_URI); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_SHAREDCACHE, OPEN_SHAREDCACHE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_PRIVATECACHE, OPEN_PRIVATECACHE); + DEFINE_CONSTANT_STRING(target, SQLITE_VERSION, VERSION); +#ifdef SQLITE_SOURCE_ID + DEFINE_CONSTANT_STRING(target, SQLITE_SOURCE_ID, SOURCE_ID); +#endif + DEFINE_CONSTANT_INTEGER(target, SQLITE_VERSION_NUMBER, VERSION_NUMBER); + + DEFINE_CONSTANT_INTEGER(target, SQLITE_OK, OK); + DEFINE_CONSTANT_INTEGER(target, SQLITE_ERROR, ERROR); + DEFINE_CONSTANT_INTEGER(target, SQLITE_INTERNAL, INTERNAL); + DEFINE_CONSTANT_INTEGER(target, SQLITE_PERM, PERM); + DEFINE_CONSTANT_INTEGER(target, SQLITE_ABORT, ABORT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_BUSY, BUSY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_LOCKED, LOCKED); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOMEM, NOMEM); + DEFINE_CONSTANT_INTEGER(target, SQLITE_READONLY, READONLY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_INTERRUPT, INTERRUPT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_IOERR, IOERR); + DEFINE_CONSTANT_INTEGER(target, SQLITE_CORRUPT, CORRUPT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOTFOUND, NOTFOUND); + DEFINE_CONSTANT_INTEGER(target, SQLITE_FULL, FULL); + DEFINE_CONSTANT_INTEGER(target, SQLITE_CANTOPEN, CANTOPEN); + DEFINE_CONSTANT_INTEGER(target, SQLITE_PROTOCOL, PROTOCOL); + DEFINE_CONSTANT_INTEGER(target, SQLITE_EMPTY, EMPTY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_SCHEMA, SCHEMA); + DEFINE_CONSTANT_INTEGER(target, SQLITE_TOOBIG, TOOBIG); + DEFINE_CONSTANT_INTEGER(target, SQLITE_CONSTRAINT, CONSTRAINT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_MISMATCH, MISMATCH); + DEFINE_CONSTANT_INTEGER(target, SQLITE_MISUSE, MISUSE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOLFS, NOLFS); + DEFINE_CONSTANT_INTEGER(target, SQLITE_AUTH, AUTH); + DEFINE_CONSTANT_INTEGER(target, SQLITE_FORMAT, FORMAT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_RANGE, RANGE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOTADB, NOTADB); +} + +} + +const char* sqlite_code_string(int code) { + switch (code) { + case SQLITE_OK: return "SQLITE_OK"; + case SQLITE_ERROR: return "SQLITE_ERROR"; + case SQLITE_INTERNAL: return "SQLITE_INTERNAL"; + case SQLITE_PERM: return "SQLITE_PERM"; + case SQLITE_ABORT: return "SQLITE_ABORT"; + case SQLITE_BUSY: return "SQLITE_BUSY"; + case SQLITE_LOCKED: return "SQLITE_LOCKED"; + case SQLITE_NOMEM: return "SQLITE_NOMEM"; + case SQLITE_READONLY: return "SQLITE_READONLY"; + case SQLITE_INTERRUPT: return "SQLITE_INTERRUPT"; + case SQLITE_IOERR: return "SQLITE_IOERR"; + case SQLITE_CORRUPT: return "SQLITE_CORRUPT"; + case SQLITE_NOTFOUND: return "SQLITE_NOTFOUND"; + case SQLITE_FULL: return "SQLITE_FULL"; + case SQLITE_CANTOPEN: return "SQLITE_CANTOPEN"; + case SQLITE_PROTOCOL: return "SQLITE_PROTOCOL"; + case SQLITE_EMPTY: return "SQLITE_EMPTY"; + case SQLITE_SCHEMA: return "SQLITE_SCHEMA"; + case SQLITE_TOOBIG: return "SQLITE_TOOBIG"; + case SQLITE_CONSTRAINT: return "SQLITE_CONSTRAINT"; + case SQLITE_MISMATCH: return "SQLITE_MISMATCH"; + case SQLITE_MISUSE: return "SQLITE_MISUSE"; + case SQLITE_NOLFS: return "SQLITE_NOLFS"; + case SQLITE_AUTH: return "SQLITE_AUTH"; + case SQLITE_FORMAT: return "SQLITE_FORMAT"; + case SQLITE_RANGE: return "SQLITE_RANGE"; + case SQLITE_NOTADB: return "SQLITE_NOTADB"; + case SQLITE_ROW: return "SQLITE_ROW"; + case SQLITE_DONE: return "SQLITE_DONE"; + default: return "UNKNOWN"; + } +} + +const char* sqlite_authorizer_string(int type) { + switch (type) { + case SQLITE_INSERT: return "insert"; + case SQLITE_UPDATE: return "update"; + case SQLITE_DELETE: return "delete"; + default: return ""; + } +} + +NODE_MODULE(node_sqlite3, RegisterModule) diff --git a/node_modules/sqlite3/src/statement.cc b/node_modules/sqlite3/src/statement.cc new file mode 100644 index 0000000..e09aeaf --- /dev/null +++ b/node_modules/sqlite3/src/statement.cc @@ -0,0 +1,901 @@ +#include +#include +#include +#include + +#include "macros.h" +#include "database.h" +#include "statement.h" + +using namespace node_sqlite3; + +Nan::Persistent Statement::constructor_template; + +NAN_MODULE_INIT(Statement::Init) { + Nan::HandleScope scope; + + Local t = Nan::New(New); + + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(Nan::New("Statement").ToLocalChecked()); + + Nan::SetPrototypeMethod(t, "bind", Bind); + Nan::SetPrototypeMethod(t, "get", Get); + Nan::SetPrototypeMethod(t, "run", Run); + Nan::SetPrototypeMethod(t, "all", All); + Nan::SetPrototypeMethod(t, "each", Each); + Nan::SetPrototypeMethod(t, "reset", Reset); + Nan::SetPrototypeMethod(t, "finalize", Finalize); + + constructor_template.Reset(t); + Nan::Set(target, Nan::New("Statement").ToLocalChecked(), + Nan::GetFunction(t).ToLocalChecked()); +} + +void Statement::Process() { + if (finalized && !queue.empty()) { + return CleanQueue(); + } + + while (prepared && !locked && !queue.empty()) { + Call* call = queue.front(); + queue.pop(); + + call->callback(call->baton); + delete call; + } +} + +void Statement::Schedule(Work_Callback callback, Baton* baton) { + if (finalized) { + queue.push(new Call(callback, baton)); + CleanQueue(); + } + else if (!prepared || locked) { + queue.push(new Call(callback, baton)); + } + else { + callback(baton); + } +} + +template void Statement::Error(T* baton) { + Nan::HandleScope scope; + + Statement* stmt = baton->stmt; + // Fail hard on logic errors. + assert(stmt->status != 0); + EXCEPTION(stmt->message, stmt->status, exception); + + Local cb = Nan::New(baton->callback); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(stmt->handle(), cb, 1, argv); + } + else { + Local argv[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(stmt->handle(), 2, argv); + } +} + +// { Database db, String sql, Array params, Function callback } +NAN_METHOD(Statement::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Use the new operator to create new Statement objects"); + } + + int length = info.Length(); + + if (length <= 0 || !Database::HasInstance(info[0])) { + return Nan::ThrowTypeError("Database object expected"); + } + else if (length <= 1 || !info[1]->IsString()) { + return Nan::ThrowTypeError("SQL query expected"); + } + else if (length > 2 && !info[2]->IsUndefined() && !info[2]->IsFunction()) { + return Nan::ThrowTypeError("Callback expected"); + } + + Database* db = Nan::ObjectWrap::Unwrap(info[0].As()); + Local sql = Local::Cast(info[1]); + + Nan::ForceSet(info.This(),Nan::New("sql").ToLocalChecked(), sql, ReadOnly); + + Statement* stmt = new Statement(db); + stmt->Wrap(info.This()); + + PrepareBaton* baton = new PrepareBaton(db, Local::Cast(info[2]), stmt); + baton->sql = std::string(*Nan::Utf8String(sql)); + db->Schedule(Work_BeginPrepare, baton); + + info.GetReturnValue().Set(info.This()); +} + +void Statement::Work_BeginPrepare(Database::Baton* baton) { + assert(baton->db->open); + baton->db->pending++; + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Prepare, (uv_after_work_cb)Work_AfterPrepare); + assert(status == 0); +} + +void Statement::Work_Prepare(uv_work_t* req) { + STATEMENT_INIT(PrepareBaton); + + // In case preparing fails, we use a mutex to make sure we get the associated + // error message. + sqlite3_mutex* mtx = sqlite3_db_mutex(baton->db->_handle); + sqlite3_mutex_enter(mtx); + + stmt->status = sqlite3_prepare_v2( + baton->db->_handle, + baton->sql.c_str(), + baton->sql.size(), + &stmt->_handle, + NULL + ); + + if (stmt->status != SQLITE_OK) { + stmt->message = std::string(sqlite3_errmsg(baton->db->_handle)); + stmt->_handle = NULL; + } + + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterPrepare(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(PrepareBaton); + + if (stmt->status != SQLITE_OK) { + Error(baton); + stmt->Finalize(); + } + else { + stmt->prepared = true; + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(stmt->handle(), cb, 1, argv); + } + } + + STATEMENT_END(); +} + +template Values::Field* + Statement::BindParameter(const Local source, T pos) { + if (source->IsString() || source->IsRegExp()) { + Nan::Utf8String val(source); + return new Values::Text(pos, val.length(), *val); + } + else if (source->IsInt32()) { + return new Values::Integer(pos, Nan::To(source).FromJust()); + } + else if (source->IsNumber()) { + return new Values::Float(pos, Nan::To(source).FromJust()); + } + else if (source->IsBoolean()) { + return new Values::Integer(pos, Nan::To(source).FromJust() ? 1 : 0); + } + else if (source->IsNull()) { + return new Values::Null(pos); + } + else if (Buffer::HasInstance(source)) { + Local buffer = Nan::To(source).ToLocalChecked(); + return new Values::Blob(pos, Buffer::Length(buffer), Buffer::Data(buffer)); + } + else if (source->IsDate()) { + return new Values::Float(pos, Nan::To(source).FromJust()); + } + else { + return NULL; + } +} + +template T* Statement::Bind(Nan::NAN_METHOD_ARGS_TYPE info, int start, int last) { + Nan::HandleScope scope; + + if (last < 0) last = info.Length(); + Local callback; + if (last > start && info[last - 1]->IsFunction()) { + callback = Local::Cast(info[last - 1]); + last--; + } + + T* baton = new T(this, callback); + + if (start < last) { + if (info[start]->IsArray()) { + Local array = Local::Cast(info[start]); + int length = array->Length(); + // Note: bind parameters start with 1. + for (int i = 0, pos = 1; i < length; i++, pos++) { + baton->parameters.push_back(BindParameter(Nan::Get(array, i).ToLocalChecked(), pos)); + } + } + else if (!info[start]->IsObject() || info[start]->IsRegExp() || info[start]->IsDate() || Buffer::HasInstance(info[start])) { + // Parameters directly in array. + // Note: bind parameters start with 1. + for (int i = start, pos = 1; i < last; i++, pos++) { + baton->parameters.push_back(BindParameter(info[i], pos)); + } + } + else if (info[start]->IsObject()) { + Local object = Local::Cast(info[start]); + Local array = Nan::GetPropertyNames(object).ToLocalChecked(); + int length = array->Length(); + for (int i = 0; i < length; i++) { + Local name = Nan::Get(array, i).ToLocalChecked(); + + if (name->IsInt32()) { + baton->parameters.push_back( + BindParameter(Nan::Get(object, name).ToLocalChecked(), Nan::To(name).FromJust())); + } + else { + baton->parameters.push_back(BindParameter(Nan::Get(object, name).ToLocalChecked(), + *Nan::Utf8String(name))); + } + } + } + else { + return NULL; + } + } + + return baton; +} + +bool Statement::Bind(const Parameters & parameters) { + if (parameters.size() == 0) { + return true; + } + + sqlite3_reset(_handle); + sqlite3_clear_bindings(_handle); + + Parameters::const_iterator it = parameters.begin(); + Parameters::const_iterator end = parameters.end(); + + for (; it < end; ++it) { + Values::Field* field = *it; + + if (field != NULL) { + int pos; + if (field->index > 0) { + pos = field->index; + } + else { + pos = sqlite3_bind_parameter_index(_handle, field->name.c_str()); + } + + switch (field->type) { + case SQLITE_INTEGER: { + status = sqlite3_bind_int(_handle, pos, + ((Values::Integer*)field)->value); + } break; + case SQLITE_FLOAT: { + status = sqlite3_bind_double(_handle, pos, + ((Values::Float*)field)->value); + } break; + case SQLITE_TEXT: { + status = sqlite3_bind_text(_handle, pos, + ((Values::Text*)field)->value.c_str(), + ((Values::Text*)field)->value.size(), SQLITE_TRANSIENT); + } break; + case SQLITE_BLOB: { + status = sqlite3_bind_blob(_handle, pos, + ((Values::Blob*)field)->value, + ((Values::Blob*)field)->length, SQLITE_TRANSIENT); + } break; + case SQLITE_NULL: { + status = sqlite3_bind_null(_handle, pos); + } break; + } + + if (status != SQLITE_OK) { + message = std::string(sqlite3_errmsg(db->_handle)); + return false; + } + } + } + + return true; +} + +NAN_METHOD(Statement::Bind) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + + Baton* baton = stmt->Bind(info); + if (baton == NULL) { + return Nan::ThrowTypeError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginBind, baton); + info.GetReturnValue().Set(info.This()); + } +} + +void Statement::Work_BeginBind(Baton* baton) { + STATEMENT_BEGIN(Bind); +} + +void Statement::Work_Bind(uv_work_t* req) { + STATEMENT_INIT(Baton); + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + stmt->Bind(baton->parameters); + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterBind(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(Baton); + + if (stmt->status != SQLITE_OK) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(stmt->handle(), cb, 1, argv); + } + } + + STATEMENT_END(); +} + + + +NAN_METHOD(Statement::Get) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + + Baton* baton = stmt->Bind(info); + if (baton == NULL) { + return Nan::ThrowError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginGet, baton); + info.GetReturnValue().Set(info.This()); + } +} + +void Statement::Work_BeginGet(Baton* baton) { + STATEMENT_BEGIN(Get); +} + +void Statement::Work_Get(uv_work_t* req) { + STATEMENT_INIT(RowBaton); + + if (stmt->status != SQLITE_DONE || baton->parameters.size()) { + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + + if (stmt->Bind(baton->parameters)) { + stmt->status = sqlite3_step(stmt->_handle); + + if (!(stmt->status == SQLITE_ROW || stmt->status == SQLITE_DONE)) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + } + + sqlite3_mutex_leave(mtx); + + if (stmt->status == SQLITE_ROW) { + // Acquire one result row before returning. + GetRow(&baton->row, stmt->_handle); + } + } +} + +void Statement::Work_AfterGet(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(RowBaton); + + if (stmt->status != SQLITE_ROW && stmt->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + if (stmt->status == SQLITE_ROW) { + // Create the result array from the data we acquired. + Local argv[] = { Nan::Null(), RowToJS(&baton->row) }; + TRY_CATCH_CALL(stmt->handle(), cb, 2, argv); + } + else { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(stmt->handle(), cb, 1, argv); + } + } + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::Run) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + + Baton* baton = stmt->Bind(info); + if (baton == NULL) { + return Nan::ThrowError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginRun, baton); + info.GetReturnValue().Set(info.This()); + } +} + +void Statement::Work_BeginRun(Baton* baton) { + STATEMENT_BEGIN(Run); +} + +void Statement::Work_Run(uv_work_t* req) { + STATEMENT_INIT(RunBaton); + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + + // Make sure that we also reset when there are no parameters. + if (!baton->parameters.size()) { + sqlite3_reset(stmt->_handle); + } + + if (stmt->Bind(baton->parameters)) { + stmt->status = sqlite3_step(stmt->_handle); + + if (!(stmt->status == SQLITE_ROW || stmt->status == SQLITE_DONE)) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + else { + baton->inserted_id = sqlite3_last_insert_rowid(stmt->db->_handle); + baton->changes = sqlite3_changes(stmt->db->_handle); + } + } + + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterRun(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(RunBaton); + + if (stmt->status != SQLITE_ROW && stmt->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Nan::Set(stmt->handle(), Nan::New("lastID").ToLocalChecked(), Nan::New(baton->inserted_id)); + Nan::Set(stmt->handle(), Nan::New("changes").ToLocalChecked(), Nan::New(baton->changes)); + + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(stmt->handle(), cb, 1, argv); + } + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::All) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + + Baton* baton = stmt->Bind(info); + if (baton == NULL) { + return Nan::ThrowError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginAll, baton); + info.GetReturnValue().Set(info.This()); + } +} + +void Statement::Work_BeginAll(Baton* baton) { + STATEMENT_BEGIN(All); +} + +void Statement::Work_All(uv_work_t* req) { + STATEMENT_INIT(RowsBaton); + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + + // Make sure that we also reset when there are no parameters. + if (!baton->parameters.size()) { + sqlite3_reset(stmt->_handle); + } + + if (stmt->Bind(baton->parameters)) { + while ((stmt->status = sqlite3_step(stmt->_handle)) == SQLITE_ROW) { + Row* row = new Row(); + GetRow(row, stmt->_handle); + baton->rows.push_back(row); + } + + if (stmt->status != SQLITE_DONE) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + } + + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterAll(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(RowsBaton); + + if (stmt->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + if (baton->rows.size()) { + // Create the result array from the data we acquired. + Local result(Nan::New(baton->rows.size())); + Rows::const_iterator it = baton->rows.begin(); + Rows::const_iterator end = baton->rows.end(); + for (int i = 0; it < end; ++it, i++) { + Nan::Set(result, i, RowToJS(*it)); + delete *it; + } + + Local argv[] = { Nan::Null(), result }; + TRY_CATCH_CALL(stmt->handle(), cb, 2, argv); + } + else { + // There were no result rows. + Local argv[] = { + Nan::Null(), + Nan::New(0) + }; + TRY_CATCH_CALL(stmt->handle(), cb, 2, argv); + } + } + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::Each) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + + int last = info.Length(); + + Local completed; + if (last >= 2 && info[last - 1]->IsFunction() && info[last - 2]->IsFunction()) { + completed = Local::Cast(info[--last]); + } + + EachBaton* baton = stmt->Bind(info, 0, last); + if (baton == NULL) { + return Nan::ThrowError("Data type is not supported"); + } + else { + baton->completed.Reset(completed); + stmt->Schedule(Work_BeginEach, baton); + info.GetReturnValue().Set(info.This()); + } +} + +void Statement::Work_BeginEach(Baton* baton) { + // Only create the Async object when we're actually going into + // the event loop. This prevents dangling events. + EachBaton* each_baton = static_cast(baton); + each_baton->async = new Async(each_baton->stmt, reinterpret_cast(AsyncEach)); + each_baton->async->item_cb.Reset(each_baton->callback); + each_baton->async->completed_cb.Reset(each_baton->completed); + + STATEMENT_BEGIN(Each); +} + +void Statement::Work_Each(uv_work_t* req) { + STATEMENT_INIT(EachBaton); + + Async* async = baton->async; + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + + int retrieved = 0; + + // Make sure that we also reset when there are no parameters. + if (!baton->parameters.size()) { + sqlite3_reset(stmt->_handle); + } + + if (stmt->Bind(baton->parameters)) { + while (true) { + sqlite3_mutex_enter(mtx); + stmt->status = sqlite3_step(stmt->_handle); + if (stmt->status == SQLITE_ROW) { + sqlite3_mutex_leave(mtx); + Row* row = new Row(); + GetRow(row, stmt->_handle); + NODE_SQLITE3_MUTEX_LOCK(&async->mutex) + async->data.push_back(row); + retrieved++; + NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex) + + uv_async_send(&async->watcher); + } + else { + if (stmt->status != SQLITE_DONE) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + sqlite3_mutex_leave(mtx); + break; + } + } + } + + async->completed = true; + uv_async_send(&async->watcher); +} + +void Statement::CloseCallback(uv_handle_t* handle) { + assert(handle != NULL); + assert(handle->data != NULL); + Async* async = static_cast(handle->data); + delete async; +} + +void Statement::AsyncEach(uv_async_t* handle, int status) { + Nan::HandleScope scope; + + Async* async = static_cast(handle->data); + + while (true) { + // Get the contents out of the data cache for us to process in the JS callback. + Rows rows; + NODE_SQLITE3_MUTEX_LOCK(&async->mutex) + rows.swap(async->data); + NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex) + + if (rows.empty()) { + break; + } + + Local cb = Nan::New(async->item_cb); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[2]; + argv[0] = Nan::Null(); + + Rows::const_iterator it = rows.begin(); + Rows::const_iterator end = rows.end(); + for (int i = 0; it < end; ++it, i++) { + argv[1] = RowToJS(*it); + async->retrieved++; + TRY_CATCH_CALL(async->stmt->handle(), cb, 2, argv); + delete *it; + } + } + } + + Local cb = Nan::New(async->completed_cb); + if (async->completed) { + if (!cb.IsEmpty() && + cb->IsFunction()) { + Local argv[] = { + Nan::Null(), + Nan::New(async->retrieved) + }; + TRY_CATCH_CALL(async->stmt->handle(), cb, 2, argv); + } + uv_close(reinterpret_cast(handle), CloseCallback); + } +} + +void Statement::Work_AfterEach(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(EachBaton); + + if (stmt->status != SQLITE_DONE) { + Error(baton); + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::Reset) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(stmt, callback); + stmt->Schedule(Work_BeginReset, baton); + + info.GetReturnValue().Set(info.This()); +} + +void Statement::Work_BeginReset(Baton* baton) { + STATEMENT_BEGIN(Reset); +} + +void Statement::Work_Reset(uv_work_t* req) { + STATEMENT_INIT(Baton); + + sqlite3_reset(stmt->_handle); + stmt->status = SQLITE_OK; +} + +void Statement::Work_AfterReset(uv_work_t* req) { + Nan::HandleScope scope; + + STATEMENT_INIT(Baton); + + // Fire callbacks. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { Nan::Null() }; + TRY_CATCH_CALL(stmt->handle(), cb, 1, argv); + } + + STATEMENT_END(); +} + +Local Statement::RowToJS(Row* row) { + Nan::EscapableHandleScope scope; + + Local result = Nan::New(); + + Row::const_iterator it = row->begin(); + Row::const_iterator end = row->end(); + for (int i = 0; it < end; ++it, i++) { + Values::Field* field = *it; + + Local value; + + switch (field->type) { + case SQLITE_INTEGER: { + value = Nan::New(((Values::Integer*)field)->value); + } break; + case SQLITE_FLOAT: { + value = Nan::New(((Values::Float*)field)->value); + } break; + case SQLITE_TEXT: { + value = Nan::New(((Values::Text*)field)->value.c_str(), ((Values::Text*)field)->value.size()).ToLocalChecked(); + } break; + case SQLITE_BLOB: { + value = Nan::CopyBuffer(((Values::Blob*)field)->value, ((Values::Blob*)field)->length).ToLocalChecked(); + } break; + case SQLITE_NULL: { + value = Nan::Null(); + } break; + } + + Nan::Set(result, Nan::New(field->name.c_str()).ToLocalChecked(), value); + + DELETE_FIELD(field); + } + + return scope.Escape(result); +} + +void Statement::GetRow(Row* row, sqlite3_stmt* stmt) { + int rows = sqlite3_column_count(stmt); + + for (int i = 0; i < rows; i++) { + int type = sqlite3_column_type(stmt, i); + const char* name = sqlite3_column_name(stmt, i); + switch (type) { + case SQLITE_INTEGER: { + row->push_back(new Values::Integer(name, sqlite3_column_int64(stmt, i))); + } break; + case SQLITE_FLOAT: { + row->push_back(new Values::Float(name, sqlite3_column_double(stmt, i))); + } break; + case SQLITE_TEXT: { + const char* text = (const char*)sqlite3_column_text(stmt, i); + int length = sqlite3_column_bytes(stmt, i); + row->push_back(new Values::Text(name, length, text)); + } break; + case SQLITE_BLOB: { + const void* blob = sqlite3_column_blob(stmt, i); + int length = sqlite3_column_bytes(stmt, i); + row->push_back(new Values::Blob(name, length, blob)); + } break; + case SQLITE_NULL: { + row->push_back(new Values::Null(name)); + } break; + default: + assert(false); + } + } +} + +NAN_METHOD(Statement::Finalize) { + Statement* stmt = Nan::ObjectWrap::Unwrap(info.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(stmt, callback); + stmt->Schedule(Finalize, baton); + + info.GetReturnValue().Set(stmt->db->handle()); +} + +void Statement::Finalize(Baton* baton) { + Nan::HandleScope scope; + + baton->stmt->Finalize(); + + // Fire callback in case there was one. + Local cb = Nan::New(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(baton->stmt->handle(), cb, 0, NULL); + } + + delete baton; +} + +void Statement::Finalize() { + assert(!finalized); + finalized = true; + CleanQueue(); + // Finalize returns the status code of the last operation. We already fired + // error events in case those failed. + sqlite3_finalize(_handle); + _handle = NULL; + db->Unref(); +} + +void Statement::CleanQueue() { + Nan::HandleScope scope; + + if (prepared && !queue.empty()) { + // This statement has already been prepared and is now finalized. + // Fire error for all remaining items in the queue. + EXCEPTION("Statement is already finalized", SQLITE_MISUSE, exception); + Local argv[] = { exception }; + bool called = false; + + // Clear out the queue so that this object can get GC'ed. + while (!queue.empty()) { + Call* call = queue.front(); + queue.pop(); + + Local cb = Nan::New(call->baton->callback); + + if (prepared && !cb.IsEmpty() && + cb->IsFunction()) { + TRY_CATCH_CALL(handle(), cb, 1, argv); + called = true; + } + + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } + + // When we couldn't call a callback function, emit an error on the + // Statement object. + if (!called) { + Local info[] = { Nan::New("error").ToLocalChecked(), exception }; + EMIT_EVENT(handle(), 2, info); + } + } + else while (!queue.empty()) { + // Just delete all items in the queue; we already fired an event when + // preparing the statement failed. + Call* call = queue.front(); + queue.pop(); + + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } +} diff --git a/node_modules/sqlite3/src/statement.h b/node_modules/sqlite3/src/statement.h new file mode 100644 index 0000000..90d295b --- /dev/null +++ b/node_modules/sqlite3/src/statement.h @@ -0,0 +1,248 @@ +#ifndef NODE_SQLITE3_SRC_STATEMENT_H +#define NODE_SQLITE3_SRC_STATEMENT_H + + +#include "database.h" +#include "threading.h" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace v8; +using namespace node; + +namespace node_sqlite3 { + +namespace Values { + struct Field { + inline Field(unsigned short _index, unsigned short _type = SQLITE_NULL) : + type(_type), index(_index) {} + inline Field(const char* _name, unsigned short _type = SQLITE_NULL) : + type(_type), index(0), name(_name) {} + + unsigned short type; + unsigned short index; + std::string name; + }; + + struct Integer : Field { + template inline Integer(T _name, int64_t val) : + Field(_name, SQLITE_INTEGER), value(val) {} + int64_t value; + }; + + struct Float : Field { + template inline Float(T _name, double val) : + Field(_name, SQLITE_FLOAT), value(val) {} + double value; + }; + + struct Text : Field { + template inline Text(T _name, size_t len, const char* val) : + Field(_name, SQLITE_TEXT), value(val, len) {} + std::string value; + }; + + struct Blob : Field { + template inline Blob(T _name, size_t len, const void* val) : + Field(_name, SQLITE_BLOB), length(len) { + value = (char*)malloc(len); + memcpy(value, val, len); + } + inline ~Blob() { + free(value); + } + int length; + char* value; + }; + + typedef Field Null; +} + +typedef std::vector Row; +typedef std::vector Rows; +typedef Row Parameters; + + + +class Statement : public Nan::ObjectWrap { +public: + static Nan::Persistent constructor_template; + + static NAN_MODULE_INIT(Init); + static NAN_METHOD(New); + + struct Baton { + uv_work_t request; + Statement* stmt; + Nan::Persistent callback; + Parameters parameters; + + Baton(Statement* stmt_, Local cb_) : stmt(stmt_) { + stmt->Ref(); + request.data = this; + callback.Reset(cb_); + } + virtual ~Baton() { + for (unsigned int i = 0; i < parameters.size(); i++) { + Values::Field* field = parameters[i]; + DELETE_FIELD(field); + } + stmt->Unref(); + callback.Reset(); + } + }; + + struct RowBaton : Baton { + RowBaton(Statement* stmt_, Local cb_) : + Baton(stmt_, cb_) {} + Row row; + }; + + struct RunBaton : Baton { + RunBaton(Statement* stmt_, Local cb_) : + Baton(stmt_, cb_), inserted_id(0), changes(0) {} + sqlite3_int64 inserted_id; + int changes; + }; + + struct RowsBaton : Baton { + RowsBaton(Statement* stmt_, Local cb_) : + Baton(stmt_, cb_) {} + Rows rows; + }; + + struct Async; + + struct EachBaton : Baton { + Nan::Persistent completed; + Async* async; // Isn't deleted when the baton is deleted. + + EachBaton(Statement* stmt_, Local cb_) : + Baton(stmt_, cb_) {} + virtual ~EachBaton() { + completed.Reset(); + } + }; + + struct PrepareBaton : Database::Baton { + Statement* stmt; + std::string sql; + PrepareBaton(Database* db_, Local cb_, Statement* stmt_) : + Baton(db_, cb_), stmt(stmt_) { + stmt->Ref(); + } + virtual ~PrepareBaton() { + stmt->Unref(); + if (!db->IsOpen() && db->IsLocked()) { + // The database handle was closed before the statement could be + // prepared. + stmt->Finalize(); + } + } + }; + + typedef void (*Work_Callback)(Baton* baton); + + struct Call { + Call(Work_Callback cb_, Baton* baton_) : callback(cb_), baton(baton_) {}; + Work_Callback callback; + Baton* baton; + }; + + struct Async { + uv_async_t watcher; + Statement* stmt; + Rows data; + NODE_SQLITE3_MUTEX_t; + bool completed; + int retrieved; + + // Store the callbacks here because we don't have + // access to the baton in the async callback. + Nan::Persistent item_cb; + Nan::Persistent completed_cb; + + Async(Statement* st, uv_async_cb async_cb) : + stmt(st), completed(false), retrieved(0) { + watcher.data = this; + NODE_SQLITE3_MUTEX_INIT + stmt->Ref(); + uv_async_init(uv_default_loop(), &watcher, async_cb); + } + + ~Async() { + stmt->Unref(); + item_cb.Reset(); + completed_cb.Reset(); + NODE_SQLITE3_MUTEX_DESTROY + } + }; + + Statement(Database* db_) : Nan::ObjectWrap(), + db(db_), + _handle(NULL), + status(SQLITE_OK), + prepared(false), + locked(true), + finalized(false) { + db->Ref(); + } + + ~Statement() { + if (!finalized) Finalize(); + } + + WORK_DEFINITION(Bind); + WORK_DEFINITION(Get); + WORK_DEFINITION(Run); + WORK_DEFINITION(All); + WORK_DEFINITION(Each); + WORK_DEFINITION(Reset); + + static NAN_METHOD(Finalize); + +protected: + static void Work_BeginPrepare(Database::Baton* baton); + static void Work_Prepare(uv_work_t* req); + static void Work_AfterPrepare(uv_work_t* req); + + static void AsyncEach(uv_async_t* handle, int status); + static void CloseCallback(uv_handle_t* handle); + + static void Finalize(Baton* baton); + void Finalize(); + + template inline Values::Field* BindParameter(const Local source, T pos); + template T* Bind(Nan::NAN_METHOD_ARGS_TYPE info, int start = 0, int end = -1); + bool Bind(const Parameters ¶meters); + + static void GetRow(Row* row, sqlite3_stmt* stmt); + static Local RowToJS(Row* row); + void Schedule(Work_Callback callback, Baton* baton); + void Process(); + void CleanQueue(); + template static void Error(T* baton); + +protected: + Database* db; + + sqlite3_stmt* _handle; + int status; + std::string message; + + bool prepared; + bool locked; + bool finalized; + std::queue queue; +}; + +} + +#endif diff --git a/node_modules/sqlite3/src/threading.h b/node_modules/sqlite3/src/threading.h new file mode 100644 index 0000000..fe738a4 --- /dev/null +++ b/node_modules/sqlite3/src/threading.h @@ -0,0 +1,48 @@ +#ifndef NODE_SQLITE3_SRC_THREADING_H +#define NODE_SQLITE3_SRC_THREADING_H + + +#ifdef _WIN32 + +#include + + #define NODE_SQLITE3_MUTEX_t HANDLE mutex; + + #define NODE_SQLITE3_MUTEX_INIT mutex = CreateMutex(NULL, FALSE, NULL); + + #define NODE_SQLITE3_MUTEX_LOCK(m) WaitForSingleObject(*m, INFINITE); + + #define NODE_SQLITE3_MUTEX_UNLOCK(m) ReleaseMutex(*m); + + #define NODE_SQLITE3_MUTEX_DESTROY CloseHandle(mutex); + +#elif defined(NODE_SQLITE3_BOOST_THREADING) + +#include + + #define NODE_SQLITE3_MUTEX_t boost::mutex mutex; + + #define NODE_SQLITE3_MUTEX_INIT + + #define NODE_SQLITE3_MUTEX_LOCK(m) (*m).lock(); + + #define NODE_SQLITE3_MUTEX_UNLOCK(m) (*m).unlock(); + + #define NODE_SQLITE3_MUTEX_DESTROY mutex.unlock(); + +#else + + #define NODE_SQLITE3_MUTEX_t pthread_mutex_t mutex; + + #define NODE_SQLITE3_MUTEX_INIT pthread_mutex_init(&mutex,NULL); + + #define NODE_SQLITE3_MUTEX_LOCK(m) pthread_mutex_lock(m); + + #define NODE_SQLITE3_MUTEX_UNLOCK(m) pthread_mutex_unlock(m); + + #define NODE_SQLITE3_MUTEX_DESTROY pthread_mutex_destroy(&mutex); + +#endif + + +#endif // NODE_SQLITE3_SRC_THREADING_H diff --git a/node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile b/node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile new file mode 100755 index 0000000..ed587a7 --- /dev/null +++ b/node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile @@ -0,0 +1,81 @@ +#!/bin/echo docker build . -f +# -*- coding: utf-8 -*- +# SPDX-License-Identifier: ISC +# Copyright 2019-present Samsung Electronics Co., Ltd. and other contributors +#{ +# ISC License +# Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +# Copyright (c) 1995-2003 by Internet Software Consortium +# 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 ISC DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. +# IN NO EVENT SHALL ISC 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. +#} + +FROM resin/rpi-raspbian:stretch +MAINTAINER Philippe Coval (p.coval@samsung.com) + +RUN [ "cross-build-start" ] + +ENV DEBIAN_FRONTEND noninteractive +ENV LC_ALL en_US.UTF-8 +ENV LANG ${LC_ALL} + +RUN echo "#log: Configuring locales" \ + && set -x \ + && apt-get update -y \ + && apt-get install -y locales \ + && echo "${LC_ALL} UTF-8" | tee /etc/locale.gen \ + && locale-gen ${LC_ALL} \ + && dpkg-reconfigure locales \ + && sync + +ENV project node-sqlite3 + +RUN echo "#log: ${project}: Setup system" \ + && set -x \ + && apt-get update -y \ + && apt-get install -y \ + curl \ + sudo \ + build-essential \ + python \ + && apt-get clean \ + && NVM_VERSION="v0.33.8" \ + && NODE_VERSION="--lts=carbon" \ + && curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash \ + && which nvm || . ~/.bashrc \ + && nvm install ${NODE_VERSION} \ + && nvm use ${NODE_VERSION} \ + && sync + +ADD . /usr/local/opt/${project}/src/${project} +WORKDIR /usr/local/opt/${project}/src/${project} +RUN echo "#log: ${project}: Preparing sources" \ + && set -x \ + && which npm || . ~/.bashrc \ + && npm install || cat npm-debug.log \ + && npm install \ + && npm install --unsafe-perm --build-from-source \ + && sync + +WORKDIR /usr/local/opt/${project}/src/${project} +RUN echo "#log: ${project}: Building sources" \ + && set -x \ + && which npm || . ~/.bashrc \ + && npm run pack \ + && npm pack \ + && find ${PWD}/build/stage/ -type f \ + && sync + +RUN [ "cross-build-end" ] diff --git a/node_modules/sqlite3/tools/docker/architecture/linux-arm/run.sh b/node_modules/sqlite3/tools/docker/architecture/linux-arm/run.sh new file mode 100755 index 0000000..4f5c885 --- /dev/null +++ b/node_modules/sqlite3/tools/docker/architecture/linux-arm/run.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# -*- coding: utf-8 -*- +# SPDX-License-Identifier: ISC +# Copyright 2019-present Samsung Electronics Co., Ltd. and other contributors +#{ +# ISC License +# Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +# Copyright (c) 1995-2003 by Internet Software Consortium +# 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 ISC DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. +# IN NO EVENT SHALL ISC 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. +#} + +set -e +set -x + +this_dir=$(dirname -- "$0") +this_dir=$(realpath "${this_dir}") +this_name=$(basename -- "$0") +top_dir="${this_dir}/../../.." + +module_name="sqlite3" +project="node-${module_name}" +arch="arm" +architecture=$(basename "${this_dir}") +name="${project}-${architecture}" +dir="/usr/local/opt/${project}/" +dist_dir="${dir}/src/${project}/build" +tag=$(git describe --tags || echo v0.0.0) +version=$(echo "${tag}" | cut -dv -f2 | cut -d'-' -f1) + +mkdir -p "${this_dir}/local" "${this_dir}/tmp" +cp -a "/usr/bin/qemu-${arch}-static" "${this_dir}/local" +time docker build -t "${name}" -f "${this_dir}/Dockerfile" . +container=$(docker create "${name}") +mkdir -p "${this_dir}/tmp/${dist_dir}" +rm -rf "${this_dir}/tmp/${dist_dir}" +docker cp "${container}:${dist_dir}" "${this_dir}/tmp/${dist_dir}" +file=$(ls "${this_dir}/tmp/${dist_dir}/stage/${module_name}/"*/*".tar.gz" | head -n1 \ + || echo "/tmp/${USER}/failure.tmp") + +sha256sum "${file}" diff --git a/node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile b/node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile new file mode 100755 index 0000000..5a19c73 --- /dev/null +++ b/node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile @@ -0,0 +1,80 @@ +#!/bin/echo docker build . -f +# -*- coding: utf-8 -*- +# SPDX-License-Identifier: ISC +# Copyright 2019-present Samsung Electronics Co., Ltd. and other contributors +#{ +# ISC License +# Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +# Copyright (c) 1995-2003 by Internet Software Consortium +# 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 ISC DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. +# IN NO EVENT SHALL ISC 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. +#} + +FROM arm64v8/node:carbon +ADD tools/docker/architecture/linux-arm64/local/qemu-aarch64-static /usr/bin/qemu-aarch64-static + +MAINTAINER Philippe Coval (p.coval@samsung.com) + +ENV DEBIAN_FRONTEND noninteractive +ENV LC_ALL en_US.UTF-8 +ENV LANG ${LC_ALL} + +RUN echo "#log: Configuring locales" \ + && set -x \ + && apt-get update -y \ + && apt-get install -y locales \ + && echo "${LC_ALL} UTF-8" | tee /etc/locale.gen \ + && locale-gen ${LC_ALL} \ + && dpkg-reconfigure locales \ + && sync + +ENV project node-sqlite3 + +RUN echo "#log: ${project}: Setup system" \ + && set -x \ + && apt-get update -y \ + && apt-get install -y \ + curl \ + sudo \ + build-essential \ + python \ + && apt-get clean \ + && NVM_VERSION="v0.33.8" \ + && NODE_VERSION="--lts=carbon" \ + && curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash \ + && which nvm || . ~/.bashrc \ + && nvm install ${NODE_VERSION} \ + && nvm use ${NODE_VERSION} \ + && sync + +ADD . /usr/local/opt/${project}/src/${project} +WORKDIR /usr/local/opt/${project}/src/${project} +RUN echo "#log: ${project}: Preparing sources" \ + && set -x \ + && which npm || . ~/.bashrc \ + && npm install || cat npm-debug.log \ + && npm install \ + && npm install --unsafe-perm --build-from-source \ + && sync + +WORKDIR /usr/local/opt/${project}/src/${project} +RUN echo "#log: ${project}: Building sources" \ + && set -x \ + && which npm || . ~/.bashrc \ + && npm run pack \ + && npm pack \ + && find ${PWD}/build/stage/ -type f \ + && sync + diff --git a/node_modules/sqlite3/tools/docker/architecture/linux-arm64/run.sh b/node_modules/sqlite3/tools/docker/architecture/linux-arm64/run.sh new file mode 100755 index 0000000..6bdda58 --- /dev/null +++ b/node_modules/sqlite3/tools/docker/architecture/linux-arm64/run.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# -*- coding: utf-8 -*- +# SPDX-License-Identifier: ISC +# Copyright 2019-present Samsung Electronics Co., Ltd. and other contributors +#{ +# ISC License +# Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +# Copyright (c) 1995-2003 by Internet Software Consortium +# 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 ISC DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. +# IN NO EVENT SHALL ISC 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. +#} + +set -e +set -x + +this_dir=$(dirname -- "$0") +this_dir=$(realpath "${this_dir}") +this_name=$(basename -- "$0") +top_dir="${this_dir}/../../.." + +module_name="sqlite3" +project="node-${module_name}" +arch="aarch64" # AKA: arm64, arm64v8 +architecture=$(basename "${this_dir}") +name="${project}-${architecture}" +dir="/usr/local/opt/${project}/" +dist_dir="${dir}/src/${project}/build" +tag=$(git describe --tags || echo v0.0.0) +version=$(echo "${tag}" | cut -dv -f2 | cut -d'-' -f1) + +mkdir -p "${this_dir}/local" "${this_dir}/tmp" +cp -a "/usr/bin/qemu-${arch}-static" "${this_dir}/local" +time docker build -t "${name}" -f "${this_dir}/Dockerfile" . +container=$(docker create "${name}") +mkdir -p "${this_dir}/tmp/${dist_dir}" +rm -rf "${this_dir}/tmp/${dist_dir}" +docker cp "${container}:${dist_dir}" "${this_dir}/tmp/${dist_dir}" +file=$(ls "${this_dir}/tmp/${dist_dir}/stage/${module_name}/"*/*".tar.gz" | head -n1 \ + || echo "/tmp/${USER}/failure.tmp") + +sha256sum "${file}" diff --git a/node_modules/sshpk/.npmignore b/node_modules/sshpk/.npmignore new file mode 100644 index 0000000..8000b59 --- /dev/null +++ b/node_modules/sshpk/.npmignore @@ -0,0 +1,9 @@ +.gitmodules +deps +docs +Makefile +node_modules +test +tools +coverage +man/src diff --git a/node_modules/sshpk/.travis.yml b/node_modules/sshpk/.travis.yml new file mode 100644 index 0000000..c3394c2 --- /dev/null +++ b/node_modules/sshpk/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - "5.10" + - "4.4" + - "4.1" + - "0.12" + - "0.10" +before_install: + - "make check" +after_success: + - '[ "${TRAVIS_NODE_VERSION}" = "4.4" ] && make codecovio' diff --git a/node_modules/sshpk/LICENSE b/node_modules/sshpk/LICENSE new file mode 100644 index 0000000..f6d947d --- /dev/null +++ b/node_modules/sshpk/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. 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/sshpk/README.md b/node_modules/sshpk/README.md new file mode 100644 index 0000000..5740f74 --- /dev/null +++ b/node_modules/sshpk/README.md @@ -0,0 +1,804 @@ +sshpk +========= + +Parse, convert, fingerprint and use SSH keys (both public and private) in pure +node -- no `ssh-keygen` or other external dependencies. + +Supports RSA, DSA, ECDSA (nistp-\*) and ED25519 key types, in PEM (PKCS#1, +PKCS#8) and OpenSSH formats. + +This library has been extracted from +[`node-http-signature`](https://github.com/joyent/node-http-signature) +(work by [Mark Cavage](https://github.com/mcavage) and +[Dave Eddy](https://github.com/bahamas10)) and +[`node-ssh-fingerprint`](https://github.com/bahamas10/node-ssh-fingerprint) +(work by Dave Eddy), with additions (including ECDSA support) by +[Alex Wilson](https://github.com/arekinath). + +Install +------- + +``` +npm install sshpk +``` + +Examples +-------- + +```js +var sshpk = require('sshpk'); + +var fs = require('fs'); + +/* Read in an OpenSSH-format public key */ +var keyPub = fs.readFileSync('id_rsa.pub'); +var key = sshpk.parseKey(keyPub, 'ssh'); + +/* Get metadata about the key */ +console.log('type => %s', key.type); +console.log('size => %d bits', key.size); +console.log('comment => %s', key.comment); + +/* Compute key fingerprints, in new OpenSSH (>6.7) format, and old MD5 */ +console.log('fingerprint => %s', key.fingerprint().toString()); +console.log('old-style fingerprint => %s', key.fingerprint('md5').toString()); +``` + +Example output: + +``` +type => rsa +size => 2048 bits +comment => foo@foo.com +fingerprint => SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w +old-style fingerprint => a0:c8:ad:6c:32:9a:32:fa:59:cc:a9:8c:0a:0d:6e:bd +``` + +More examples: converting between formats: + +```js +/* Read in a PEM public key */ +var keyPem = fs.readFileSync('id_rsa.pem'); +var key = sshpk.parseKey(keyPem, 'pem'); + +/* Convert to PEM PKCS#8 public key format */ +var pemBuf = key.toBuffer('pkcs8'); + +/* Convert to SSH public key format (and return as a string) */ +var sshKey = key.toString('ssh'); +``` + +Signing and verifying: + +```js +/* Read in an OpenSSH/PEM *private* key */ +var keyPriv = fs.readFileSync('id_ecdsa'); +var key = sshpk.parsePrivateKey(keyPriv, 'pem'); + +var data = 'some data'; + +/* Sign some data with the key */ +var s = key.createSign('sha1'); +s.update(data); +var signature = s.sign(); + +/* Now load the public key (could also use just key.toPublic()) */ +var keyPub = fs.readFileSync('id_ecdsa.pub'); +key = sshpk.parseKey(keyPub, 'ssh'); + +/* Make a crypto.Verifier with this key */ +var v = key.createVerify('sha1'); +v.update(data); +var valid = v.verify(signature); +/* => true! */ +``` + +Matching fingerprints with keys: + +```js +var fp = sshpk.parseFingerprint('SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w'); + +var keys = [sshpk.parseKey(...), sshpk.parseKey(...), ...]; + +keys.forEach(function (key) { + if (fp.matches(key)) + console.log('found it!'); +}); +``` + +Usage +----- + +## Public keys + +### `parseKey(data[, format = 'auto'[, options]])` + +Parses a key from a given data format and returns a new `Key` object. + +Parameters + +- `data` -- Either a Buffer or String, containing the key +- `format` -- String name of format to use, valid options are: + - `auto`: choose automatically from all below + - `pem`: supports both PKCS#1 and PKCS#8 + - `ssh`: standard OpenSSH format, + - `pkcs1`, `pkcs8`: variants of `pem` + - `rfc4253`: raw OpenSSH wire format + - `openssh`: new post-OpenSSH 6.5 internal format, produced by + `ssh-keygen -o` + - `dnssec`: `.key` file format output by `dnssec-keygen` etc + - `putty`: the PuTTY `.ppk` file format (supports truncated variant without + all the lines from `Private-Lines:` onwards) +- `options` -- Optional Object, extra options, with keys: + - `filename` -- Optional String, name for the key being parsed + (eg. the filename that was opened). Used to generate + Error messages + - `passphrase` -- Optional String, encryption passphrase used to decrypt an + encrypted PEM file + +### `Key.isKey(obj)` + +Returns `true` if the given object is a valid `Key` object created by a version +of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Key#type` + +String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`. + +### `Key#size` + +Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus; +for ECDSA this is the bit size of the curve in use. + +### `Key#comment` + +Optional string, a key comment used by some formats (eg the `ssh` format). + +### `Key#curve` + +Only present if `this.type === 'ecdsa'`, string containing the name of the +named curve used with this key. Possible values include `nistp256`, `nistp384` +and `nistp521`. + +### `Key#toBuffer([format = 'ssh'])` + +Convert the key into a given data format and return the serialized key as +a Buffer. + +Parameters + +- `format` -- String name of format to use, for valid options see `parseKey()` + +### `Key#toString([format = 'ssh])` + +Same as `this.toBuffer(format).toString()`. + +### `Key#fingerprint([algorithm = 'sha256'[, hashType = 'ssh']])` + +Creates a new `Fingerprint` object representing this Key's fingerprint. + +Parameters + +- `algorithm` -- String name of hash algorithm to use, valid options are `md5`, + `sha1`, `sha256`, `sha384`, `sha512` +- `hashType` -- String name of fingerprint hash type to use, valid options are + `ssh` (the type of fingerprint used by OpenSSH, e.g. in + `ssh-keygen`), `spki` (used by HPKP, some OpenSSL applications) + +### `Key#createVerify([hashAlgorithm])` + +Creates a `crypto.Verifier` specialized to use this Key (and the correct public +key algorithm to match it). The returned Verifier has the same API as a regular +one, except that the `verify()` function takes only the target signature as an +argument. + +Parameters + +- `hashAlgorithm` -- optional String name of hash algorithm to use, any + supported by OpenSSL are valid, usually including + `sha1`, `sha256`. + +`v.verify(signature[, format])` Parameters + +- `signature` -- either a Signature object, or a Buffer or String +- `format` -- optional String, name of format to interpret given String with. + Not valid if `signature` is a Signature or Buffer. + +### `Key#createDiffieHellman()` +### `Key#createDH()` + +Creates a Diffie-Hellman key exchange object initialized with this key and all +necessary parameters. This has the same API as a `crypto.DiffieHellman` +instance, except that functions take `Key` and `PrivateKey` objects as +arguments, and return them where indicated for. + +This is only valid for keys belonging to a cryptosystem that supports DHE +or a close analogue (i.e. `dsa`, `ecdsa` and `curve25519` keys). An attempt +to call this function on other keys will yield an `Error`. + +## Private keys + +### `parsePrivateKey(data[, format = 'auto'[, options]])` + +Parses a private key from a given data format and returns a new +`PrivateKey` object. + +Parameters + +- `data` -- Either a Buffer or String, containing the key +- `format` -- String name of format to use, valid options are: + - `auto`: choose automatically from all below + - `pem`: supports both PKCS#1 and PKCS#8 + - `ssh`, `openssh`: new post-OpenSSH 6.5 internal format, produced by + `ssh-keygen -o` + - `pkcs1`, `pkcs8`: variants of `pem` + - `rfc4253`: raw OpenSSH wire format + - `dnssec`: `.private` format output by `dnssec-keygen` etc. +- `options` -- Optional Object, extra options, with keys: + - `filename` -- Optional String, name for the key being parsed + (eg. the filename that was opened). Used to generate + Error messages + - `passphrase` -- Optional String, encryption passphrase used to decrypt an + encrypted PEM file + +### `generatePrivateKey(type[, options])` + +Generates a new private key of a certain key type, from random data. + +Parameters + +- `type` -- String, type of key to generate. Currently supported are `'ecdsa'` + and `'ed25519'` +- `options` -- optional Object, with keys: + - `curve` -- optional String, for `'ecdsa'` keys, specifies the curve to use. + If ECDSA is specified and this option is not given, defaults to + using `'nistp256'`. + +### `PrivateKey.isPrivateKey(obj)` + +Returns `true` if the given object is a valid `PrivateKey` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `PrivateKey#type` + +String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`. + +### `PrivateKey#size` + +Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus; +for ECDSA this is the bit size of the curve in use. + +### `PrivateKey#curve` + +Only present if `this.type === 'ecdsa'`, string containing the name of the +named curve used with this key. Possible values include `nistp256`, `nistp384` +and `nistp521`. + +### `PrivateKey#toBuffer([format = 'pkcs1'])` + +Convert the key into a given data format and return the serialized key as +a Buffer. + +Parameters + +- `format` -- String name of format to use, valid options are listed under + `parsePrivateKey`. Note that ED25519 keys default to `openssh` + format instead (as they have no `pkcs1` representation). + +### `PrivateKey#toString([format = 'pkcs1'])` + +Same as `this.toBuffer(format).toString()`. + +### `PrivateKey#toPublic()` + +Extract just the public part of this private key, and return it as a `Key` +object. + +### `PrivateKey#fingerprint([algorithm = 'sha256'])` + +Same as `this.toPublic().fingerprint()`. + +### `PrivateKey#createVerify([hashAlgorithm])` + +Same as `this.toPublic().createVerify()`. + +### `PrivateKey#createSign([hashAlgorithm])` + +Creates a `crypto.Sign` specialized to use this PrivateKey (and the correct +key algorithm to match it). The returned Signer has the same API as a regular +one, except that the `sign()` function takes no arguments, and returns a +`Signature` object. + +Parameters + +- `hashAlgorithm` -- optional String name of hash algorithm to use, any + supported by OpenSSL are valid, usually including + `sha1`, `sha256`. + +`v.sign()` Parameters + +- none + +### `PrivateKey#derive(newType)` + +Derives a related key of type `newType` from this key. Currently this is +only supported to change between `ed25519` and `curve25519` keys which are +stored with the same private key (but usually distinct public keys in order +to avoid degenerate keys that lead to a weak Diffie-Hellman exchange). + +Parameters + +- `newType` -- String, type of key to derive, either `ed25519` or `curve25519` + +## Fingerprints + +### `parseFingerprint(fingerprint[, options])` + +Pre-parses a fingerprint, creating a `Fingerprint` object that can be used to +quickly locate a key by using the `Fingerprint#matches` function. + +Parameters + +- `fingerprint` -- String, the fingerprint value, in any supported format +- `options` -- Optional Object, with properties: + - `algorithms` -- Array of strings, names of hash algorithms to limit + support to. If `fingerprint` uses a hash algorithm not on + this list, throws `InvalidAlgorithmError`. + - `hashType` -- String, the type of hash the fingerprint uses, either `ssh` + or `spki` (normally auto-detected based on the format, but + can be overridden) + - `type` -- String, the entity this fingerprint identifies, either `key` or + `certificate` + +### `Fingerprint.isFingerprint(obj)` + +Returns `true` if the given object is a valid `Fingerprint` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Fingerprint#toString([format])` + +Returns a fingerprint as a string, in the given format. + +Parameters + +- `format` -- Optional String, format to use, valid options are `hex` and + `base64`. If this `Fingerprint` uses the `md5` algorithm, the + default format is `hex`. Otherwise, the default is `base64`. + +### `Fingerprint#matches(keyOrCertificate)` + +Verifies whether or not this `Fingerprint` matches a given `Key` or +`Certificate`. This function uses double-hashing to avoid leaking timing +information. Returns a boolean. + +Note that a `Key`-type Fingerprint will always return `false` if asked to match +a `Certificate` and vice versa. + +Parameters + +- `keyOrCertificate` -- a `Key` object or `Certificate` object, the entity to + match this fingerprint against + +## Signatures + +### `parseSignature(signature, algorithm, format)` + +Parses a signature in a given format, creating a `Signature` object. Useful +for converting between the SSH and ASN.1 (PKCS/OpenSSL) signature formats, and +also returned as output from `PrivateKey#createSign().sign()`. + +A Signature object can also be passed to a verifier produced by +`Key#createVerify()` and it will automatically be converted internally into the +correct format for verification. + +Parameters + +- `signature` -- a Buffer (binary) or String (base64), data of the actual + signature in the given format +- `algorithm` -- a String, name of the algorithm to be used, possible values + are `rsa`, `dsa`, `ecdsa` +- `format` -- a String, either `asn1` or `ssh` + +### `Signature.isSignature(obj)` + +Returns `true` if the given object is a valid `Signature` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Signature#toBuffer([format = 'asn1'])` + +Converts a Signature to the given format and returns it as a Buffer. + +Parameters + +- `format` -- a String, either `asn1` or `ssh` + +### `Signature#toString([format = 'asn1'])` + +Same as `this.toBuffer(format).toString('base64')`. + +## Certificates + +`sshpk` includes basic support for parsing certificates in X.509 (PEM) format +and the OpenSSH certificate format. This feature is intended to be used mainly +to access basic metadata about certificates, extract public keys from them, and +also to generate simple self-signed certificates from an existing key. + +Notably, there is no implementation of CA chain-of-trust verification, and only +very minimal support for key usage restrictions. Please do the security world +a favour, and DO NOT use this code for certificate verification in the +traditional X.509 CA chain style. + +### `parseCertificate(data, format)` + +Parameters + + - `data` -- a Buffer or String + - `format` -- a String, format to use, one of `'openssh'`, `'pem'` (X.509 in a + PEM wrapper), or `'x509'` (raw DER encoded) + +### `createSelfSignedCertificate(subject, privateKey[, options])` + +Parameters + + - `subject` -- an Identity, the subject of the certificate + - `privateKey` -- a PrivateKey, the key of the subject: will be used both to be + placed in the certificate and also to sign it (since this is + a self-signed certificate) + - `options` -- optional Object, with keys: + - `lifetime` -- optional Number, lifetime of the certificate from now in + seconds + - `validFrom`, `validUntil` -- optional Dates, beginning and end of + certificate validity period. If given + `lifetime` will be ignored + - `serial` -- optional Buffer, the serial number of the certificate + - `purposes` -- optional Array of String, X.509 key usage restrictions + +### `createCertificate(subject, key, issuer, issuerKey[, options])` + +Parameters + + - `subject` -- an Identity, the subject of the certificate + - `key` -- a Key, the public key of the subject + - `issuer` -- an Identity, the issuer of the certificate who will sign it + - `issuerKey` -- a PrivateKey, the issuer's private key for signing + - `options` -- optional Object, with keys: + - `lifetime` -- optional Number, lifetime of the certificate from now in + seconds + - `validFrom`, `validUntil` -- optional Dates, beginning and end of + certificate validity period. If given + `lifetime` will be ignored + - `serial` -- optional Buffer, the serial number of the certificate + - `purposes` -- optional Array of String, X.509 key usage restrictions + +### `Certificate#subjects` + +Array of `Identity` instances describing the subject of this certificate. + +### `Certificate#issuer` + +The `Identity` of the Certificate's issuer (signer). + +### `Certificate#subjectKey` + +The public key of the subject of the certificate, as a `Key` instance. + +### `Certificate#issuerKey` + +The public key of the signing issuer of this certificate, as a `Key` instance. +May be `undefined` if the issuer's key is unknown (e.g. on an X509 certificate). + +### `Certificate#serial` + +The serial number of the certificate. As this is normally a 64-bit or wider +integer, it is returned as a Buffer. + +### `Certificate#purposes` + +Array of Strings indicating the X.509 key usage purposes that this certificate +is valid for. The possible strings at the moment are: + + * `'signature'` -- key can be used for digital signatures + * `'identity'` -- key can be used to attest about the identity of the signer + (X.509 calls this `nonRepudiation`) + * `'codeSigning'` -- key can be used to sign executable code + * `'keyEncryption'` -- key can be used to encrypt other keys + * `'encryption'` -- key can be used to encrypt data (only applies for RSA) + * `'keyAgreement'` -- key can be used for key exchange protocols such as + Diffie-Hellman + * `'ca'` -- key can be used to sign other certificates (is a Certificate + Authority) + * `'crl'` -- key can be used to sign Certificate Revocation Lists (CRLs) + +### `Certificate#getExtension(nameOrOid)` + +Retrieves information about a certificate extension, if present, or returns +`undefined` if not. The string argument `nameOrOid` should be either the OID +(for X509 extensions) or the name (for OpenSSH extensions) of the extension +to retrieve. + +The object returned will have the following properties: + + * `format` -- String, set to either `'x509'` or `'openssh'` + * `name` or `oid` -- String, only one set based on value of `format` + * `data` -- Buffer, the raw data inside the extension + +### `Certificate#getExtensions()` + +Returns an Array of all present certificate extensions, in the same manner and +format as `getExtension()`. + +### `Certificate#isExpired([when])` + +Tests whether the Certificate is currently expired (i.e. the `validFrom` and +`validUntil` dates specify a range of time that does not include the current +time). + +Parameters + + - `when` -- optional Date, if specified, tests whether the Certificate was or + will be expired at the specified time instead of now + +Returns a Boolean. + +### `Certificate#isSignedByKey(key)` + +Tests whether the Certificate was validly signed by the given (public) Key. + +Parameters + + - `key` -- a Key instance + +Returns a Boolean. + +### `Certificate#isSignedBy(certificate)` + +Tests whether this Certificate was validly signed by the subject of the given +certificate. Also tests that the issuer Identity of this Certificate and the +subject Identity of the other Certificate are equivalent. + +Parameters + + - `certificate` -- another Certificate instance + +Returns a Boolean. + +### `Certificate#fingerprint([hashAlgo])` + +Returns the X509-style fingerprint of the entire certificate (as a Fingerprint +instance). This matches what a web-browser or similar would display as the +certificate fingerprint and should not be confused with the fingerprint of the +subject's public key. + +Parameters + + - `hashAlgo` -- an optional String, any hash function name + +### `Certificate#toBuffer([format])` + +Serializes the Certificate to a Buffer and returns it. + +Parameters + + - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or + `'x509'`. Defaults to `'x509'`. + +Returns a Buffer. + +### `Certificate#toString([format])` + + - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or + `'x509'`. Defaults to `'pem'`. + +Returns a String. + +## Certificate identities + +### `identityForHost(hostname)` + +Constructs a host-type Identity for a given hostname. + +Parameters + + - `hostname` -- the fully qualified DNS name of the host + +Returns an Identity instance. + +### `identityForUser(uid)` + +Constructs a user-type Identity for a given UID. + +Parameters + + - `uid` -- a String, user identifier (login name) + +Returns an Identity instance. + +### `identityForEmail(email)` + +Constructs an email-type Identity for a given email address. + +Parameters + + - `email` -- a String, email address + +Returns an Identity instance. + +### `identityFromDN(dn)` + +Parses an LDAP-style DN string (e.g. `'CN=foo, C=US'`) and turns it into an +Identity instance. + +Parameters + + - `dn` -- a String + +Returns an Identity instance. + +### `identityFromArray(arr)` + +Constructs an Identity from an array of DN components (see `Identity#toArray()` +for the format). + +Parameters + + - `arr` -- an Array of Objects, DN components with `name` and `value` + +Returns an Identity instance. + + +Supported attributes in DNs: + +| Attribute name | OID | +| -------------- | --- | +| `cn` | `2.5.4.3` | +| `o` | `2.5.4.10` | +| `ou` | `2.5.4.11` | +| `l` | `2.5.4.7` | +| `s` | `2.5.4.8` | +| `c` | `2.5.4.6` | +| `sn` | `2.5.4.4` | +| `postalCode` | `2.5.4.17` | +| `serialNumber` | `2.5.4.5` | +| `street` | `2.5.4.9` | +| `x500UniqueIdentifier` | `2.5.4.45` | +| `role` | `2.5.4.72` | +| `telephoneNumber` | `2.5.4.20` | +| `description` | `2.5.4.13` | +| `dc` | `0.9.2342.19200300.100.1.25` | +| `uid` | `0.9.2342.19200300.100.1.1` | +| `mail` | `0.9.2342.19200300.100.1.3` | +| `title` | `2.5.4.12` | +| `gn` | `2.5.4.42` | +| `initials` | `2.5.4.43` | +| `pseudonym` | `2.5.4.65` | + +### `Identity#toString()` + +Returns the identity as an LDAP-style DN string. +e.g. `'CN=foo, O=bar corp, C=us'` + +### `Identity#type` + +The type of identity. One of `'host'`, `'user'`, `'email'` or `'unknown'` + +### `Identity#hostname` +### `Identity#uid` +### `Identity#email` + +Set when `type` is `'host'`, `'user'`, or `'email'`, respectively. Strings. + +### `Identity#cn` + +The value of the first `CN=` in the DN, if any. It's probably better to use +the `#get()` method instead of this property. + +### `Identity#get(name[, asArray])` + +Returns the value of a named attribute in the Identity DN. If there is no +attribute of the given name, returns `undefined`. If multiple components +of the DN contain an attribute of this name, an exception is thrown unless +the `asArray` argument is given as `true` -- then they will be returned as +an Array in the same order they appear in the DN. + +Parameters + + - `name` -- a String + - `asArray` -- an optional Boolean + +### `Identity#toArray()` + +Returns the Identity as an Array of DN component objects. This looks like: + +```js +[ { + "name": "cn", + "value": "Joe Bloggs" +}, +{ + "name": "o", + "value": "Organisation Ltd" +} ] +``` + +Each object has a `name` and a `value` property. The returned objects may be +safely modified. + +Errors +------ + +### `InvalidAlgorithmError` + +The specified algorithm is not valid, either because it is not supported, or +because it was not included on a list of allowed algorithms. + +Thrown by `Fingerprint.parse`, `Key#fingerprint`. + +Properties + +- `algorithm` -- the algorithm that could not be validated + +### `FingerprintFormatError` + +The fingerprint string given could not be parsed as a supported fingerprint +format, or the specified fingerprint format is invalid. + +Thrown by `Fingerprint.parse`, `Fingerprint#toString`. + +Properties + +- `fingerprint` -- if caused by a fingerprint, the string value given +- `format` -- if caused by an invalid format specification, the string value given + +### `KeyParseError` + +The key data given could not be parsed as a valid key. + +Properties + +- `keyName` -- `filename` that was given to `parseKey` +- `format` -- the `format` that was trying to parse the key (see `parseKey`) +- `innerErr` -- the inner Error thrown by the format parser + +### `KeyEncryptedError` + +The key is encrypted with a symmetric key (ie, it is password protected). The +parsing operation would succeed if it was given the `passphrase` option. + +Properties + +- `keyName` -- `filename` that was given to `parseKey` +- `format` -- the `format` that was trying to parse the key (currently can only + be `"pem"`) + +### `CertificateParseError` + +The certificate data given could not be parsed as a valid certificate. + +Properties + +- `certName` -- `filename` that was given to `parseCertificate` +- `format` -- the `format` that was trying to parse the key + (see `parseCertificate`) +- `innerErr` -- the inner Error thrown by the format parser + +Friends of sshpk +---------------- + + * [`sshpk-agent`](https://github.com/arekinath/node-sshpk-agent) is a library + for speaking the `ssh-agent` protocol from node.js, which uses `sshpk` diff --git a/node_modules/sshpk/bin/sshpk-conv b/node_modules/sshpk/bin/sshpk-conv new file mode 100755 index 0000000..e839ede --- /dev/null +++ b/node_modules/sshpk/bin/sshpk-conv @@ -0,0 +1,243 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2018 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var tty = require('tty'); +var readline = require('readline'); +var getPassword = require('getpass').getPass; + +var options = [ + { + names: ['outformat', 't'], + type: 'string', + help: 'Output format' + }, + { + names: ['informat', 'T'], + type: 'string', + help: 'Input format' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input file name (default stdin)' + }, + { + names: ['out', 'o'], + type: 'string', + help: 'Output file name (default stdout)' + }, + { + names: ['private', 'p'], + type: 'bool', + help: 'Produce a private key as output' + }, + { + names: ['derive', 'd'], + type: 'string', + help: 'Output a new key derived from this one, with given algo' + }, + { + names: ['identify', 'i'], + type: 'bool', + help: 'Print key metadata instead of converting' + }, + { + names: ['fingerprint', 'F'], + type: 'bool', + help: 'Output key fingerprint' + }, + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash function to use for key fingeprint with -F' + }, + { + names: ['spki', 's'], + type: 'bool', + help: 'With -F, generates an SPKI fingerprint instead of SSH' + }, + { + names: ['comment', 'c'], + type: 'string', + help: 'Set key comment, if output format supports' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-conv: error: %s', e.message); + process.exit(1); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-conv: converts between SSH key formats\n'); + console.error(help); + console.error('\navailable key formats:'); + console.error(' - pem, pkcs1 eg id_rsa'); + console.error(' - ssh eg id_rsa.pub'); + console.error(' - pkcs8 format you want for openssl'); + console.error(' - openssh like output of ssh-keygen -o'); + console.error(' - rfc4253 raw OpenSSH wire format'); + console.error(' - dnssec dnssec-keygen format'); + console.error(' - putty PuTTY ppk format'); + console.error('\navailable fingerprint formats:'); + console.error(' - hex colon-separated hex for SSH'); + console.error(' straight hex for SPKI'); + console.error(' - base64 SHA256:* format from OpenSSH'); + process.exit(1); + } + + /* + * Key derivation can only be done on private keys, so use of the -d + * option necessarily implies -p. + */ + if (opts.derive) + opts.private = true; + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + ifError(e, 'error opening input file'); + } + + var outFile = process.stdout; + + try { + if (opts.out && !opts.identify) { + fs.accessSync(path.dirname(opts.out), fs.W_OK); + outFile = fs.createWriteStream(opts.out); + } + } catch (e) { + ifError(e, 'error opening output file'); + } + + var bufs = []; + inFile.on('readable', function () { + var data; + while ((data = inFile.read())) + bufs.push(data); + }); + var parseOpts = {}; + parseOpts.filename = inFileName; + inFile.on('end', function processKey() { + var buf = Buffer.concat(bufs); + var fmt = 'auto'; + if (opts.informat) + fmt = opts.informat; + var f = sshpk.parseKey; + if (opts.private) + f = sshpk.parsePrivateKey; + try { + var key = f(buf, fmt, parseOpts); + } catch (e) { + if (e.name === 'KeyEncryptedError') { + getPassword(function (err, pw) { + if (err) + ifError(err); + parseOpts.passphrase = pw; + processKey(); + }); + return; + } + ifError(e); + } + + if (opts.derive) + key = key.derive(opts.derive); + + if (opts.comment) + key.comment = opts.comment; + + if (opts.identify) { + var kind = 'public'; + if (sshpk.PrivateKey.isPrivateKey(key)) + kind = 'private'; + console.log('%s: a %d bit %s %s key', inFileName, + key.size, key.type.toUpperCase(), kind); + if (key.type === 'ecdsa') + console.log('ECDSA curve: %s', key.curve); + if (key.comment) + console.log('Comment: %s', key.comment); + console.log('SHA256 fingerprint: ' + + key.fingerprint('sha256').toString()); + console.log('MD5 fingerprint: ' + + key.fingerprint('md5').toString()); + console.log('SPKI-SHA256 fingerprint: ' + + key.fingerprint('sha256', 'spki').toString()); + process.exit(0); + return; + } + + if (opts.fingerprint) { + var hash = opts.hash; + var type = opts.spki ? 'spki' : 'ssh'; + var format = opts.outformat; + var fp = key.fingerprint(hash, type).toString(format); + outFile.write(fp); + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + return; + } + + fmt = undefined; + if (opts.outformat) + fmt = opts.outformat; + outFile.write(key.toBuffer(fmt)); + if (fmt === 'ssh' || + (!opts.private && fmt === undefined)) + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + }); +} + +function ifError(e, txt) { + if (txt) + txt = txt + ': '; + else + txt = ''; + console.error('sshpk-conv: ' + txt + e.name + ': ' + e.message); + if (process.env['DEBUG'] || process.env['V']) { + console.error(e.stack); + if (e.innerErr) + console.error(e.innerErr.stack); + } + process.exit(1); +} diff --git a/node_modules/sshpk/bin/sshpk-sign b/node_modules/sshpk/bin/sshpk-sign new file mode 100755 index 0000000..673fc98 --- /dev/null +++ b/node_modules/sshpk/bin/sshpk-sign @@ -0,0 +1,191 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2015 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var getPassword = require('getpass').getPass; + +var options = [ + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash algorithm (sha1, sha256, sha384, sha512)' + }, + { + names: ['verbose', 'v'], + type: 'bool', + help: 'Display verbose info about key and hash used' + }, + { + names: ['identity', 'i'], + type: 'string', + help: 'Path to key to use' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input filename' + }, + { + names: ['out', 'o'], + type: 'string', + help: 'Output filename' + }, + { + names: ['format', 't'], + type: 'string', + help: 'Signature format (asn1, ssh, raw)' + }, + { + names: ['binary', 'b'], + type: 'bool', + help: 'Output raw binary instead of base64' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +var parseOpts = {}; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-sign: error: %s', e.message); + process.exit(1); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-sign: sign data using an SSH key\n'); + console.error(help); + process.exit(1); + } + + if (!opts.identity) { + var help = parser.help({}).trimRight(); + console.error('sshpk-sign: the -i or --identity option ' + + 'is required\n'); + console.error(help); + process.exit(1); + } + + var keyData = fs.readFileSync(opts.identity); + parseOpts.filename = opts.identity; + + run(); +} + +function run() { + var key; + try { + key = sshpk.parsePrivateKey(keyData, 'auto', parseOpts); + } catch (e) { + if (e.name === 'KeyEncryptedError') { + getPassword(function (err, pw) { + parseOpts.passphrase = pw; + run(); + }); + return; + } + console.error('sshpk-sign: error loading private key "' + + opts.identity + '": ' + e.name + ': ' + e.message); + process.exit(1); + } + + var hash = opts.hash || key.defaultHashAlgorithm(); + + var signer; + try { + signer = key.createSign(hash); + } catch (e) { + console.error('sshpk-sign: error creating signer: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + if (opts.verbose) { + console.error('sshpk-sign: using %s-%s with a %d bit key', + key.type, hash, key.size); + } + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + console.error('sshpk-sign: error opening input file' + + ': ' + e.name + ': ' + e.message); + process.exit(1); + } + + var outFile = process.stdout; + + try { + if (opts.out && !opts.identify) { + fs.accessSync(path.dirname(opts.out), fs.W_OK); + outFile = fs.createWriteStream(opts.out); + } + } catch (e) { + console.error('sshpk-sign: error opening output file' + + ': ' + e.name + ': ' + e.message); + process.exit(1); + } + + inFile.pipe(signer); + inFile.on('end', function () { + var sig; + try { + sig = signer.sign(); + } catch (e) { + console.error('sshpk-sign: error signing data: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + var fmt = opts.format || 'asn1'; + var output; + try { + output = sig.toBuffer(fmt); + if (!opts.binary) + output = output.toString('base64'); + } catch (e) { + console.error('sshpk-sign: error converting signature' + + ' to ' + fmt + ' format: ' + e.name + ': ' + + e.message); + process.exit(1); + } + + outFile.write(output); + if (!opts.binary) + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + }); +} diff --git a/node_modules/sshpk/bin/sshpk-verify b/node_modules/sshpk/bin/sshpk-verify new file mode 100755 index 0000000..fc71a82 --- /dev/null +++ b/node_modules/sshpk/bin/sshpk-verify @@ -0,0 +1,167 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2015 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var Buffer = require('safer-buffer').Buffer; + +var options = [ + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash algorithm (sha1, sha256, sha384, sha512)' + }, + { + names: ['verbose', 'v'], + type: 'bool', + help: 'Display verbose info about key and hash used' + }, + { + names: ['identity', 'i'], + type: 'string', + help: 'Path to (public) key to use' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input filename' + }, + { + names: ['format', 't'], + type: 'string', + help: 'Signature format (asn1, ssh, raw)' + }, + { + names: ['signature', 's'], + type: 'string', + help: 'base64-encoded signature data' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-verify: error: %s', e.message); + process.exit(3); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: sign data using an SSH key\n'); + console.error(help); + process.exit(3); + } + + if (!opts.identity) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: the -i or --identity option ' + + 'is required\n'); + console.error(help); + process.exit(3); + } + + if (!opts.signature) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: the -s or --signature option ' + + 'is required\n'); + console.error(help); + process.exit(3); + } + + var keyData = fs.readFileSync(opts.identity); + + var key; + try { + key = sshpk.parseKey(keyData); + } catch (e) { + console.error('sshpk-verify: error loading key "' + + opts.identity + '": ' + e.name + ': ' + e.message); + process.exit(2); + } + + var fmt = opts.format || 'asn1'; + var sigData = Buffer.from(opts.signature, 'base64'); + + var sig; + try { + sig = sshpk.parseSignature(sigData, key.type, fmt); + } catch (e) { + console.error('sshpk-verify: error parsing signature: ' + + e.name + ': ' + e.message); + process.exit(2); + } + + var hash = opts.hash || key.defaultHashAlgorithm(); + + var verifier; + try { + verifier = key.createVerify(hash); + } catch (e) { + console.error('sshpk-verify: error creating verifier: ' + + e.name + ': ' + e.message); + process.exit(2); + } + + if (opts.verbose) { + console.error('sshpk-verify: using %s-%s with a %d bit key', + key.type, hash, key.size); + } + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + console.error('sshpk-verify: error opening input file' + + ': ' + e.name + ': ' + e.message); + process.exit(2); + } + + inFile.pipe(verifier); + inFile.on('end', function () { + var ret; + try { + ret = verifier.verify(sig); + } catch (e) { + console.error('sshpk-verify: error verifying data: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + if (ret) { + console.error('OK'); + process.exit(0); + } + + console.error('NOT OK'); + process.exit(1); + }); +} diff --git a/node_modules/sshpk/lib/algs.js b/node_modules/sshpk/lib/algs.js new file mode 100644 index 0000000..3b01e7d --- /dev/null +++ b/node_modules/sshpk/lib/algs.js @@ -0,0 +1,168 @@ +// Copyright 2015 Joyent, Inc. + +var Buffer = require('safer-buffer').Buffer; + +var algInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y'], + sizePart: 'p' + }, + 'rsa': { + parts: ['e', 'n'], + sizePart: 'n' + }, + 'ecdsa': { + parts: ['curve', 'Q'], + sizePart: 'Q' + }, + 'ed25519': { + parts: ['A'], + sizePart: 'A' + } +}; +algInfo['curve25519'] = algInfo['ed25519']; + +var algPrivInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y', 'x'] + }, + 'rsa': { + parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'] + }, + 'ecdsa': { + parts: ['curve', 'Q', 'd'] + }, + 'ed25519': { + parts: ['A', 'k'] + } +}; +algPrivInfo['curve25519'] = algPrivInfo['ed25519']; + +var hashAlgs = { + 'md5': true, + 'sha1': true, + 'sha256': true, + 'sha384': true, + 'sha512': true +}; + +/* + * Taken from + * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf + */ +var curves = { + 'nistp256': { + size: 256, + pkcs8oid: '1.2.840.10045.3.1.7', + p: Buffer.from(('00' + + 'ffffffff 00000001 00000000 00000000' + + '00000000 ffffffff ffffffff ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF 00000001 00000000 00000000' + + '00000000 FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + + '651d06b0 cc53b0f6 3bce3c3e 27d2604b'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'c49d3608 86e70493 6a6678e1 139d26b7' + + '819f7e90'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff 00000000 ffffffff ffffffff' + + 'bce6faad a7179e84 f3b9cac2 fc632551'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + + '77037d81 2deb33a0 f4a13945 d898c296' + + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + + '2bce3357 6b315ece cbb64068 37bf51f5'). + replace(/ /g, ''), 'hex') + }, + 'nistp384': { + size: 384, + pkcs8oid: '1.3.132.0.34', + p: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffe' + + 'ffffffff 00000000 00000000 ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + + 'FFFFFFFF 00000000 00000000 FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + 'b3312fa7 e23ee7e4 988e056b e3f82d19' + + '181d9c6e fe814112 0314088f 5013875a' + + 'c656398d 8a2ed19d 2a85c8ed d3ec2aef'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'a335926a a319a27a 1d00896a 6773a482' + + '7acdac73'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff c7634d81 f4372ddf' + + '581a0db2 48b0a77a ecec196a ccc52973'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + 'aa87ca22 be8b0537 8eb1c71e f320ad74' + + '6e1d3b62 8ba79b98 59f741e0 82542a38' + + '5502f25d bf55296c 3a545e38 72760ab7' + + '3617de4a 96262c6f 5d9e98bf 9292dc29' + + 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'). + replace(/ /g, ''), 'hex') + }, + 'nistp521': { + size: 521, + pkcs8oid: '1.3.132.0.35', + p: Buffer.from(( + '01ffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffff').replace(/ /g, ''), 'hex'), + a: Buffer.from(('01FF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(('51' + + '953eb961 8e1c9a1f 929a21a0 b68540ee' + + 'a2da725b 99b315f3 b8b48991 8ef109e1' + + '56193951 ec7e937b 1652c0bd 3bb1bf07' + + '3573df88 3d2c34f1 ef451fd4 6b503f00'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'd09e8800 291cb853 96cc6717 393284aa' + + 'a0da64ba').replace(/ /g, ''), 'hex'), + n: Buffer.from(('01ff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffa' + + '51868783 bf2f966b 7fcc0148 f709a5d0' + + '3bb5c9b8 899c47ae bb6fb71e 91386409'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + + '9c648139 053fb521 f828af60 6b4d3dba' + + 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + + '3348b3c1 856a429b f97e7e31 c2e5bd66' + + '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + + '98f54449 579b4468 17afbd17 273e662c' + + '97ee7299 5ef42640 c550b901 3fad0761' + + '353c7086 a272c240 88be9476 9fd16650'). + replace(/ /g, ''), 'hex') + } +}; + +module.exports = { + info: algInfo, + privInfo: algPrivInfo, + hashAlgs: hashAlgs, + curves: curves +}; diff --git a/node_modules/sshpk/lib/certificate.js b/node_modules/sshpk/lib/certificate.js new file mode 100644 index 0000000..6932357 --- /dev/null +++ b/node_modules/sshpk/lib/certificate.js @@ -0,0 +1,410 @@ +// Copyright 2016 Joyent, Inc. + +module.exports = Certificate; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var Key = require('./key'); +var PrivateKey = require('./private-key'); +var Identity = require('./identity'); + +var formats = {}; +formats['openssh'] = require('./formats/openssh-cert'); +formats['x509'] = require('./formats/x509'); +formats['pem'] = require('./formats/x509-pem'); + +var CertificateParseError = errs.CertificateParseError; +var InvalidAlgorithmError = errs.InvalidAlgorithmError; + +function Certificate(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.subjects, 'options.subjects'); + utils.assertCompatible(opts.subjects[0], Identity, [1, 0], + 'options.subjects'); + utils.assertCompatible(opts.subjectKey, Key, [1, 0], + 'options.subjectKey'); + utils.assertCompatible(opts.issuer, Identity, [1, 0], 'options.issuer'); + if (opts.issuerKey !== undefined) { + utils.assertCompatible(opts.issuerKey, Key, [1, 0], + 'options.issuerKey'); + } + assert.object(opts.signatures, 'options.signatures'); + assert.buffer(opts.serial, 'options.serial'); + assert.date(opts.validFrom, 'options.validFrom'); + assert.date(opts.validUntil, 'optons.validUntil'); + + assert.optionalArrayOfString(opts.purposes, 'options.purposes'); + + this._hashCache = {}; + + this.subjects = opts.subjects; + this.issuer = opts.issuer; + this.subjectKey = opts.subjectKey; + this.issuerKey = opts.issuerKey; + this.signatures = opts.signatures; + this.serial = opts.serial; + this.validFrom = opts.validFrom; + this.validUntil = opts.validUntil; + this.purposes = opts.purposes; +} + +Certificate.formats = formats; + +Certificate.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'x509'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +Certificate.prototype.toString = function (format, options) { + if (format === undefined) + format = 'pem'; + return (this.toBuffer(format, options).toString()); +}; + +Certificate.prototype.fingerprint = function (algo) { + if (algo === undefined) + algo = 'sha256'; + assert.string(algo, 'algorithm'); + var opts = { + type: 'certificate', + hash: this.hash(algo), + algorithm: algo + }; + return (new Fingerprint(opts)); +}; + +Certificate.prototype.hash = function (algo) { + assert.string(algo, 'algorithm'); + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + if (this._hashCache[algo]) + return (this._hashCache[algo]); + + var hash = crypto.createHash(algo). + update(this.toBuffer('x509')).digest(); + this._hashCache[algo] = hash; + return (hash); +}; + +Certificate.prototype.isExpired = function (when) { + if (when === undefined) + when = new Date(); + return (!((when.getTime() >= this.validFrom.getTime()) && + (when.getTime() < this.validUntil.getTime()))); +}; + +Certificate.prototype.isSignedBy = function (issuerCert) { + utils.assertCompatible(issuerCert, Certificate, [1, 0], 'issuer'); + + if (!this.issuer.equals(issuerCert.subjects[0])) + return (false); + if (this.issuer.purposes && this.issuer.purposes.length > 0 && + this.issuer.purposes.indexOf('ca') === -1) { + return (false); + } + + return (this.isSignedByKey(issuerCert.subjectKey)); +}; + +Certificate.prototype.getExtension = function (keyOrOid) { + assert.string(keyOrOid, 'keyOrOid'); + var ext = this.getExtensions().filter(function (maybeExt) { + if (maybeExt.format === 'x509') + return (maybeExt.oid === keyOrOid); + if (maybeExt.format === 'openssh') + return (maybeExt.name === keyOrOid); + return (false); + })[0]; + return (ext); +}; + +Certificate.prototype.getExtensions = function () { + var exts = []; + var x509 = this.signatures.x509; + if (x509 && x509.extras && x509.extras.exts) { + x509.extras.exts.forEach(function (ext) { + ext.format = 'x509'; + exts.push(ext); + }); + } + var openssh = this.signatures.openssh; + if (openssh && openssh.exts) { + openssh.exts.forEach(function (ext) { + ext.format = 'openssh'; + exts.push(ext); + }); + } + return (exts); +}; + +Certificate.prototype.isSignedByKey = function (issuerKey) { + utils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey'); + + if (this.issuerKey !== undefined) { + return (this.issuerKey. + fingerprint('sha512').matches(issuerKey)); + } + + var fmt = Object.keys(this.signatures)[0]; + var valid = formats[fmt].verify(this, issuerKey); + if (valid) + this.issuerKey = issuerKey; + return (valid); +}; + +Certificate.prototype.signWith = function (key) { + utils.assertCompatible(key, PrivateKey, [1, 2], 'key'); + var fmts = Object.keys(formats); + var didOne = false; + for (var i = 0; i < fmts.length; ++i) { + if (fmts[i] !== 'pem') { + var ret = formats[fmts[i]].sign(this, key); + if (ret === true) + didOne = true; + } + } + if (!didOne) { + throw (new Error('Failed to sign the certificate for any ' + + 'available certificate formats')); + } +}; + +Certificate.createSelfSigned = function (subjectOrSubjects, key, options) { + var subjects; + if (Array.isArray(subjectOrSubjects)) + subjects = subjectOrSubjects; + else + subjects = [subjectOrSubjects]; + + assert.arrayOfObject(subjects); + subjects.forEach(function (subject) { + utils.assertCompatible(subject, Identity, [1, 0], 'subject'); + }); + + utils.assertCompatible(key, PrivateKey, [1, 2], 'private key'); + + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalObject(options.validFrom, 'options.validFrom'); + assert.optionalObject(options.validUntil, 'options.validUntil'); + var validFrom = options.validFrom; + var validUntil = options.validUntil; + if (validFrom === undefined) + validFrom = new Date(); + if (validUntil === undefined) { + assert.optionalNumber(options.lifetime, 'options.lifetime'); + var lifetime = options.lifetime; + if (lifetime === undefined) + lifetime = 10*365*24*3600; + validUntil = new Date(); + validUntil.setTime(validUntil.getTime() + lifetime*1000); + } + assert.optionalBuffer(options.serial, 'options.serial'); + var serial = options.serial; + if (serial === undefined) + serial = Buffer.from('0000000000000001', 'hex'); + + var purposes = options.purposes; + if (purposes === undefined) + purposes = []; + + if (purposes.indexOf('signature') === -1) + purposes.push('signature'); + + /* Self-signed certs are always CAs. */ + if (purposes.indexOf('ca') === -1) + purposes.push('ca'); + if (purposes.indexOf('crl') === -1) + purposes.push('crl'); + + /* + * If we weren't explicitly given any other purposes, do the sensible + * thing and add some basic ones depending on the subject type. + */ + if (purposes.length <= 3) { + var hostSubjects = subjects.filter(function (subject) { + return (subject.type === 'host'); + }); + var userSubjects = subjects.filter(function (subject) { + return (subject.type === 'user'); + }); + if (hostSubjects.length > 0) { + if (purposes.indexOf('serverAuth') === -1) + purposes.push('serverAuth'); + } + if (userSubjects.length > 0) { + if (purposes.indexOf('clientAuth') === -1) + purposes.push('clientAuth'); + } + if (userSubjects.length > 0 || hostSubjects.length > 0) { + if (purposes.indexOf('keyAgreement') === -1) + purposes.push('keyAgreement'); + if (key.type === 'rsa' && + purposes.indexOf('encryption') === -1) + purposes.push('encryption'); + } + } + + var cert = new Certificate({ + subjects: subjects, + issuer: subjects[0], + subjectKey: key.toPublic(), + issuerKey: key.toPublic(), + signatures: {}, + serial: serial, + validFrom: validFrom, + validUntil: validUntil, + purposes: purposes + }); + cert.signWith(key); + + return (cert); +}; + +Certificate.create = + function (subjectOrSubjects, key, issuer, issuerKey, options) { + var subjects; + if (Array.isArray(subjectOrSubjects)) + subjects = subjectOrSubjects; + else + subjects = [subjectOrSubjects]; + + assert.arrayOfObject(subjects); + subjects.forEach(function (subject) { + utils.assertCompatible(subject, Identity, [1, 0], 'subject'); + }); + + utils.assertCompatible(key, Key, [1, 0], 'key'); + if (PrivateKey.isPrivateKey(key)) + key = key.toPublic(); + utils.assertCompatible(issuer, Identity, [1, 0], 'issuer'); + utils.assertCompatible(issuerKey, PrivateKey, [1, 2], 'issuer key'); + + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalObject(options.validFrom, 'options.validFrom'); + assert.optionalObject(options.validUntil, 'options.validUntil'); + var validFrom = options.validFrom; + var validUntil = options.validUntil; + if (validFrom === undefined) + validFrom = new Date(); + if (validUntil === undefined) { + assert.optionalNumber(options.lifetime, 'options.lifetime'); + var lifetime = options.lifetime; + if (lifetime === undefined) + lifetime = 10*365*24*3600; + validUntil = new Date(); + validUntil.setTime(validUntil.getTime() + lifetime*1000); + } + assert.optionalBuffer(options.serial, 'options.serial'); + var serial = options.serial; + if (serial === undefined) + serial = Buffer.from('0000000000000001', 'hex'); + + var purposes = options.purposes; + if (purposes === undefined) + purposes = []; + + if (purposes.indexOf('signature') === -1) + purposes.push('signature'); + + if (options.ca === true) { + if (purposes.indexOf('ca') === -1) + purposes.push('ca'); + if (purposes.indexOf('crl') === -1) + purposes.push('crl'); + } + + var hostSubjects = subjects.filter(function (subject) { + return (subject.type === 'host'); + }); + var userSubjects = subjects.filter(function (subject) { + return (subject.type === 'user'); + }); + if (hostSubjects.length > 0) { + if (purposes.indexOf('serverAuth') === -1) + purposes.push('serverAuth'); + } + if (userSubjects.length > 0) { + if (purposes.indexOf('clientAuth') === -1) + purposes.push('clientAuth'); + } + if (userSubjects.length > 0 || hostSubjects.length > 0) { + if (purposes.indexOf('keyAgreement') === -1) + purposes.push('keyAgreement'); + if (key.type === 'rsa' && + purposes.indexOf('encryption') === -1) + purposes.push('encryption'); + } + + var cert = new Certificate({ + subjects: subjects, + issuer: issuer, + subjectKey: key, + issuerKey: issuerKey.toPublic(), + signatures: {}, + serial: serial, + validFrom: validFrom, + validUntil: validUntil, + purposes: purposes + }); + cert.signWith(issuerKey); + + return (cert); +}; + +Certificate.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + return (k); + } catch (e) { + throw (new CertificateParseError(options.filename, format, e)); + } +}; + +Certificate.isCertificate = function (obj, ver) { + return (utils.isCompatible(obj, Certificate, ver)); +}; + +/* + * API versions for Certificate: + * [1,0] -- initial ver + * [1,1] -- openssh format now unpacks extensions + */ +Certificate.prototype._sshpkApiVersion = [1, 1]; + +Certificate._oldVersionDetect = function (obj) { + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/dhe.js b/node_modules/sshpk/lib/dhe.js new file mode 100644 index 0000000..a3c8032 --- /dev/null +++ b/node_modules/sshpk/lib/dhe.js @@ -0,0 +1,397 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + DiffieHellman: DiffieHellman, + generateECDSA: generateECDSA, + generateED25519: generateED25519 +}; + +var assert = require('assert-plus'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var utils = require('./utils'); +var nacl = require('tweetnacl'); + +var Key = require('./key'); +var PrivateKey = require('./private-key'); + +var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined); + +var ecdh = require('ecc-jsbn'); +var ec = require('ecc-jsbn/lib/ec'); +var jsbn = require('jsbn').BigInteger; + +function DiffieHellman(key) { + utils.assertCompatible(key, Key, [1, 4], 'key'); + this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]); + this._algo = key.type; + this._curve = key.curve; + this._key = key; + if (key.type === 'dsa') { + if (!CRYPTO_HAVE_ECDH) { + throw (new Error('Due to bugs in the node 0.10 ' + + 'crypto API, node 0.12.x or later is required ' + + 'to use DH')); + } + this._dh = crypto.createDiffieHellman( + key.part.p.data, undefined, + key.part.g.data, undefined); + this._p = key.part.p; + this._g = key.part.g; + if (this._isPriv) + this._dh.setPrivateKey(key.part.x.data); + this._dh.setPublicKey(key.part.y.data); + + } else if (key.type === 'ecdsa') { + if (!CRYPTO_HAVE_ECDH) { + this._ecParams = new X9ECParameters(this._curve); + + if (this._isPriv) { + this._priv = new ECPrivate( + this._ecParams, key.part.d.data); + } + return; + } + + var curve = { + 'nistp256': 'prime256v1', + 'nistp384': 'secp384r1', + 'nistp521': 'secp521r1' + }[key.curve]; + this._dh = crypto.createECDH(curve); + if (typeof (this._dh) !== 'object' || + typeof (this._dh.setPrivateKey) !== 'function') { + CRYPTO_HAVE_ECDH = false; + DiffieHellman.call(this, key); + return; + } + if (this._isPriv) + this._dh.setPrivateKey(key.part.d.data); + this._dh.setPublicKey(key.part.Q.data); + + } else if (key.type === 'curve25519') { + if (this._isPriv) { + utils.assertCompatible(key, PrivateKey, [1, 5], 'key'); + this._priv = key.part.k.data; + } + + } else { + throw (new Error('DH not supported for ' + key.type + ' keys')); + } +} + +DiffieHellman.prototype.getPublicKey = function () { + if (this._isPriv) + return (this._key.toPublic()); + return (this._key); +}; + +DiffieHellman.prototype.getPrivateKey = function () { + if (this._isPriv) + return (this._key); + else + return (undefined); +}; +DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey; + +DiffieHellman.prototype._keyCheck = function (pk, isPub) { + assert.object(pk, 'key'); + if (!isPub) + utils.assertCompatible(pk, PrivateKey, [1, 3], 'key'); + utils.assertCompatible(pk, Key, [1, 4], 'key'); + + if (pk.type !== this._algo) { + throw (new Error('A ' + pk.type + ' key cannot be used in ' + + this._algo + ' Diffie-Hellman')); + } + + if (pk.curve !== this._curve) { + throw (new Error('A key from the ' + pk.curve + ' curve ' + + 'cannot be used with a ' + this._curve + + ' Diffie-Hellman')); + } + + if (pk.type === 'dsa') { + assert.deepEqual(pk.part.p, this._p, + 'DSA key prime does not match'); + assert.deepEqual(pk.part.g, this._g, + 'DSA key generator does not match'); + } +}; + +DiffieHellman.prototype.setKey = function (pk) { + this._keyCheck(pk); + + if (pk.type === 'dsa') { + this._dh.setPrivateKey(pk.part.x.data); + this._dh.setPublicKey(pk.part.y.data); + + } else if (pk.type === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + this._dh.setPrivateKey(pk.part.d.data); + this._dh.setPublicKey(pk.part.Q.data); + } else { + this._priv = new ECPrivate( + this._ecParams, pk.part.d.data); + } + + } else if (pk.type === 'curve25519') { + var k = pk.part.k; + if (!pk.part.k) + k = pk.part.r; + this._priv = k.data; + if (this._priv[0] === 0x00) + this._priv = this._priv.slice(1); + this._priv = this._priv.slice(0, 32); + } + this._key = pk; + this._isPriv = true; +}; +DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey; + +DiffieHellman.prototype.computeSecret = function (otherpk) { + this._keyCheck(otherpk, true); + if (!this._isPriv) + throw (new Error('DH exchange has not been initialized with ' + + 'a private key yet')); + + var pub; + if (this._algo === 'dsa') { + return (this._dh.computeSecret( + otherpk.part.y.data)); + + } else if (this._algo === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + return (this._dh.computeSecret( + otherpk.part.Q.data)); + } else { + pub = new ECPublic( + this._ecParams, otherpk.part.Q.data); + return (this._priv.deriveSharedSecret(pub)); + } + + } else if (this._algo === 'curve25519') { + pub = otherpk.part.A.data; + while (pub[0] === 0x00 && pub.length > 32) + pub = pub.slice(1); + var priv = this._priv; + assert.strictEqual(pub.length, 32); + assert.strictEqual(priv.length, 32); + + var secret = nacl.box.before(new Uint8Array(pub), + new Uint8Array(priv)); + + return (Buffer.from(secret)); + } + + throw (new Error('Invalid algorithm: ' + this._algo)); +}; + +DiffieHellman.prototype.generateKey = function () { + var parts = []; + var priv, pub; + if (this._algo === 'dsa') { + this._dh.generateKeys(); + + parts.push({name: 'p', data: this._p.data}); + parts.push({name: 'q', data: this._key.part.q.data}); + parts.push({name: 'g', data: this._g.data}); + parts.push({name: 'y', data: this._dh.getPublicKey()}); + parts.push({name: 'x', data: this._dh.getPrivateKey()}); + this._key = new PrivateKey({ + type: 'dsa', + parts: parts + }); + this._isPriv = true; + return (this._key); + + } else if (this._algo === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + this._dh.generateKeys(); + + parts.push({name: 'curve', + data: Buffer.from(this._curve)}); + parts.push({name: 'Q', data: this._dh.getPublicKey()}); + parts.push({name: 'd', data: this._dh.getPrivateKey()}); + this._key = new PrivateKey({ + type: 'ecdsa', + curve: this._curve, + parts: parts + }); + this._isPriv = true; + return (this._key); + + } else { + var n = this._ecParams.getN(); + var r = new jsbn(crypto.randomBytes(n.bitLength())); + var n1 = n.subtract(jsbn.ONE); + priv = r.mod(n1).add(jsbn.ONE); + pub = this._ecParams.getG().multiply(priv); + + priv = Buffer.from(priv.toByteArray()); + pub = Buffer.from(this._ecParams.getCurve(). + encodePointHex(pub), 'hex'); + + this._priv = new ECPrivate(this._ecParams, priv); + + parts.push({name: 'curve', + data: Buffer.from(this._curve)}); + parts.push({name: 'Q', data: pub}); + parts.push({name: 'd', data: priv}); + + this._key = new PrivateKey({ + type: 'ecdsa', + curve: this._curve, + parts: parts + }); + this._isPriv = true; + return (this._key); + } + + } else if (this._algo === 'curve25519') { + var pair = nacl.box.keyPair(); + priv = Buffer.from(pair.secretKey); + pub = Buffer.from(pair.publicKey); + priv = Buffer.concat([priv, pub]); + assert.strictEqual(priv.length, 64); + assert.strictEqual(pub.length, 32); + + parts.push({name: 'A', data: pub}); + parts.push({name: 'k', data: priv}); + this._key = new PrivateKey({ + type: 'curve25519', + parts: parts + }); + this._isPriv = true; + return (this._key); + } + + throw (new Error('Invalid algorithm: ' + this._algo)); +}; +DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey; + +/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */ + +function X9ECParameters(name) { + var params = algs.curves[name]; + assert.object(params); + + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var n = new jsbn(params.n); + var h = jsbn.ONE; + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + this.curve = curve; + this.g = G; + this.n = n; + this.h = h; +} +X9ECParameters.prototype.getCurve = function () { return (this.curve); }; +X9ECParameters.prototype.getG = function () { return (this.g); }; +X9ECParameters.prototype.getN = function () { return (this.n); }; +X9ECParameters.prototype.getH = function () { return (this.h); }; + +function ECPublic(params, buffer) { + this._params = params; + if (buffer[0] === 0x00) + buffer = buffer.slice(1); + this._pub = params.getCurve().decodePointHex(buffer.toString('hex')); +} + +function ECPrivate(params, buffer) { + this._params = params; + this._priv = new jsbn(utils.mpNormalize(buffer)); +} +ECPrivate.prototype.deriveSharedSecret = function (pubKey) { + assert.ok(pubKey instanceof ECPublic); + var S = pubKey._pub.multiply(this._priv); + return (Buffer.from(S.getX().toBigInteger().toByteArray())); +}; + +function generateED25519() { + var pair = nacl.sign.keyPair(); + var priv = Buffer.from(pair.secretKey); + var pub = Buffer.from(pair.publicKey); + assert.strictEqual(priv.length, 64); + assert.strictEqual(pub.length, 32); + + var parts = []; + parts.push({name: 'A', data: pub}); + parts.push({name: 'k', data: priv.slice(0, 32)}); + var key = new PrivateKey({ + type: 'ed25519', + parts: parts + }); + return (key); +} + +/* Generates a new ECDSA private key on a given curve. */ +function generateECDSA(curve) { + var parts = []; + var key; + + if (CRYPTO_HAVE_ECDH) { + /* + * Node crypto doesn't expose key generation directly, but the + * ECDH instances can generate keys. It turns out this just + * calls into the OpenSSL generic key generator, and we can + * read its output happily without doing an actual DH. So we + * use that here. + */ + var osCurve = { + 'nistp256': 'prime256v1', + 'nistp384': 'secp384r1', + 'nistp521': 'secp521r1' + }[curve]; + + var dh = crypto.createECDH(osCurve); + dh.generateKeys(); + + parts.push({name: 'curve', + data: Buffer.from(curve)}); + parts.push({name: 'Q', data: dh.getPublicKey()}); + parts.push({name: 'd', data: dh.getPrivateKey()}); + + key = new PrivateKey({ + type: 'ecdsa', + curve: curve, + parts: parts + }); + return (key); + } else { + + var ecParams = new X9ECParameters(curve); + + /* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */ + var n = ecParams.getN(); + /* + * The crypto.randomBytes() function can only give us whole + * bytes, so taking a nod from X9.62, we round up. + */ + var cByteLen = Math.ceil((n.bitLength() + 64) / 8); + var c = new jsbn(crypto.randomBytes(cByteLen)); + + var n1 = n.subtract(jsbn.ONE); + var priv = c.mod(n1).add(jsbn.ONE); + var pub = ecParams.getG().multiply(priv); + + priv = Buffer.from(priv.toByteArray()); + pub = Buffer.from(ecParams.getCurve(). + encodePointHex(pub), 'hex'); + + parts.push({name: 'curve', data: Buffer.from(curve)}); + parts.push({name: 'Q', data: pub}); + parts.push({name: 'd', data: priv}); + + key = new PrivateKey({ + type: 'ecdsa', + curve: curve, + parts: parts + }); + return (key); + } +} diff --git a/node_modules/sshpk/lib/ed-compat.js b/node_modules/sshpk/lib/ed-compat.js new file mode 100644 index 0000000..70732e1 --- /dev/null +++ b/node_modules/sshpk/lib/ed-compat.js @@ -0,0 +1,92 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + Verifier: Verifier, + Signer: Signer +}; + +var nacl = require('tweetnacl'); +var stream = require('stream'); +var util = require('util'); +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var Signature = require('./signature'); + +function Verifier(key, hashAlgo) { + if (hashAlgo.toLowerCase() !== 'sha512') + throw (new Error('ED25519 only supports the use of ' + + 'SHA-512 hashes')); + + this.key = key; + this.chunks = []; + + stream.Writable.call(this, {}); +} +util.inherits(Verifier, stream.Writable); + +Verifier.prototype._write = function (chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; + +Verifier.prototype.update = function (chunk) { + if (typeof (chunk) === 'string') + chunk = Buffer.from(chunk, 'binary'); + this.chunks.push(chunk); +}; + +Verifier.prototype.verify = function (signature, fmt) { + var sig; + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== 'ed25519') + return (false); + sig = signature.toBuffer('raw'); + + } else if (typeof (signature) === 'string') { + sig = Buffer.from(signature, 'base64'); + + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + } + + assert.buffer(sig); + return (nacl.sign.detached.verify( + new Uint8Array(Buffer.concat(this.chunks)), + new Uint8Array(sig), + new Uint8Array(this.key.part.A.data))); +}; + +function Signer(key, hashAlgo) { + if (hashAlgo.toLowerCase() !== 'sha512') + throw (new Error('ED25519 only supports the use of ' + + 'SHA-512 hashes')); + + this.key = key; + this.chunks = []; + + stream.Writable.call(this, {}); +} +util.inherits(Signer, stream.Writable); + +Signer.prototype._write = function (chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; + +Signer.prototype.update = function (chunk) { + if (typeof (chunk) === 'string') + chunk = Buffer.from(chunk, 'binary'); + this.chunks.push(chunk); +}; + +Signer.prototype.sign = function () { + var sig = nacl.sign.detached( + new Uint8Array(Buffer.concat(this.chunks)), + new Uint8Array(Buffer.concat([ + this.key.part.k.data, this.key.part.A.data]))); + var sigBuf = Buffer.from(sig); + var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw'); + sigObj.hashAlgorithm = 'sha512'; + return (sigObj); +}; diff --git a/node_modules/sshpk/lib/errors.js b/node_modules/sshpk/lib/errors.js new file mode 100644 index 0000000..1cc09ec --- /dev/null +++ b/node_modules/sshpk/lib/errors.js @@ -0,0 +1,84 @@ +// Copyright 2015 Joyent, Inc. + +var assert = require('assert-plus'); +var util = require('util'); + +function FingerprintFormatError(fp, format) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, FingerprintFormatError); + this.name = 'FingerprintFormatError'; + this.fingerprint = fp; + this.format = format; + this.message = 'Fingerprint format is not supported, or is invalid: '; + if (fp !== undefined) + this.message += ' fingerprint = ' + fp; + if (format !== undefined) + this.message += ' format = ' + format; +} +util.inherits(FingerprintFormatError, Error); + +function InvalidAlgorithmError(alg) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, InvalidAlgorithmError); + this.name = 'InvalidAlgorithmError'; + this.algorithm = alg; + this.message = 'Algorithm "' + alg + '" is not supported'; +} +util.inherits(InvalidAlgorithmError, Error); + +function KeyParseError(name, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, KeyParseError); + this.name = 'KeyParseError'; + this.format = format; + this.keyName = name; + this.innerErr = innerErr; + this.message = 'Failed to parse ' + name + ' as a valid ' + format + + ' format key: ' + innerErr.message; +} +util.inherits(KeyParseError, Error); + +function SignatureParseError(type, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, SignatureParseError); + this.name = 'SignatureParseError'; + this.type = type; + this.format = format; + this.innerErr = innerErr; + this.message = 'Failed to parse the given data as a ' + type + + ' signature in ' + format + ' format: ' + innerErr.message; +} +util.inherits(SignatureParseError, Error); + +function CertificateParseError(name, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, CertificateParseError); + this.name = 'CertificateParseError'; + this.format = format; + this.certName = name; + this.innerErr = innerErr; + this.message = 'Failed to parse ' + name + ' as a valid ' + format + + ' format certificate: ' + innerErr.message; +} +util.inherits(CertificateParseError, Error); + +function KeyEncryptedError(name, format) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, KeyEncryptedError); + this.name = 'KeyEncryptedError'; + this.format = format; + this.keyName = name; + this.message = 'The ' + format + ' format key ' + name + ' is ' + + 'encrypted (password-protected), and no passphrase was ' + + 'provided in `options`'; +} +util.inherits(KeyEncryptedError, Error); + +module.exports = { + FingerprintFormatError: FingerprintFormatError, + InvalidAlgorithmError: InvalidAlgorithmError, + KeyParseError: KeyParseError, + SignatureParseError: SignatureParseError, + KeyEncryptedError: KeyEncryptedError, + CertificateParseError: CertificateParseError +}; diff --git a/node_modules/sshpk/lib/fingerprint.js b/node_modules/sshpk/lib/fingerprint.js new file mode 100644 index 0000000..0004b37 --- /dev/null +++ b/node_modules/sshpk/lib/fingerprint.js @@ -0,0 +1,220 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = Fingerprint; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var errs = require('./errors'); +var Key = require('./key'); +var PrivateKey = require('./private-key'); +var Certificate = require('./certificate'); +var utils = require('./utils'); + +var FingerprintFormatError = errs.FingerprintFormatError; +var InvalidAlgorithmError = errs.InvalidAlgorithmError; + +function Fingerprint(opts) { + assert.object(opts, 'options'); + assert.string(opts.type, 'options.type'); + assert.buffer(opts.hash, 'options.hash'); + assert.string(opts.algorithm, 'options.algorithm'); + + this.algorithm = opts.algorithm.toLowerCase(); + if (algs.hashAlgs[this.algorithm] !== true) + throw (new InvalidAlgorithmError(this.algorithm)); + + this.hash = opts.hash; + this.type = opts.type; + this.hashType = opts.hashType; +} + +Fingerprint.prototype.toString = function (format) { + if (format === undefined) { + if (this.algorithm === 'md5' || this.hashType === 'spki') + format = 'hex'; + else + format = 'base64'; + } + assert.string(format); + + switch (format) { + case 'hex': + if (this.hashType === 'spki') + return (this.hash.toString('hex')); + return (addColons(this.hash.toString('hex'))); + case 'base64': + if (this.hashType === 'spki') + return (this.hash.toString('base64')); + return (sshBase64Format(this.algorithm, + this.hash.toString('base64'))); + default: + throw (new FingerprintFormatError(undefined, format)); + } +}; + +Fingerprint.prototype.matches = function (other) { + assert.object(other, 'key or certificate'); + if (this.type === 'key' && this.hashType !== 'ssh') { + utils.assertCompatible(other, Key, [1, 7], 'key with spki'); + if (PrivateKey.isPrivateKey(other)) { + utils.assertCompatible(other, PrivateKey, [1, 6], + 'privatekey with spki support'); + } + } else if (this.type === 'key') { + utils.assertCompatible(other, Key, [1, 0], 'key'); + } else { + utils.assertCompatible(other, Certificate, [1, 0], + 'certificate'); + } + + var theirHash = other.hash(this.algorithm, this.hashType); + var theirHash2 = crypto.createHash(this.algorithm). + update(theirHash).digest('base64'); + + if (this.hash2 === undefined) + this.hash2 = crypto.createHash(this.algorithm). + update(this.hash).digest('base64'); + + return (this.hash2 === theirHash2); +}; + +/*JSSTYLED*/ +var base64RE = /^[A-Za-z0-9+\/=]+$/; +/*JSSTYLED*/ +var hexRE = /^[a-fA-F0-9]+$/; + +Fingerprint.parse = function (fp, options) { + assert.string(fp, 'fingerprint'); + + var alg, hash, enAlgs; + if (Array.isArray(options)) { + enAlgs = options; + options = {}; + } + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + if (options.enAlgs !== undefined) + enAlgs = options.enAlgs; + if (options.algorithms !== undefined) + enAlgs = options.algorithms; + assert.optionalArrayOfString(enAlgs, 'algorithms'); + + var hashType = 'ssh'; + if (options.hashType !== undefined) + hashType = options.hashType; + assert.string(hashType, 'options.hashType'); + + var parts = fp.split(':'); + if (parts.length == 2) { + alg = parts[0].toLowerCase(); + if (!base64RE.test(parts[1])) + throw (new FingerprintFormatError(fp)); + try { + hash = Buffer.from(parts[1], 'base64'); + } catch (e) { + throw (new FingerprintFormatError(fp)); + } + } else if (parts.length > 2) { + alg = 'md5'; + if (parts[0].toLowerCase() === 'md5') + parts = parts.slice(1); + parts = parts.map(function (p) { + while (p.length < 2) + p = '0' + p; + if (p.length > 2) + throw (new FingerprintFormatError(fp)); + return (p); + }); + parts = parts.join(''); + if (!hexRE.test(parts) || parts.length % 2 !== 0) + throw (new FingerprintFormatError(fp)); + try { + hash = Buffer.from(parts, 'hex'); + } catch (e) { + throw (new FingerprintFormatError(fp)); + } + } else { + if (hexRE.test(fp)) { + hash = Buffer.from(fp, 'hex'); + } else if (base64RE.test(fp)) { + hash = Buffer.from(fp, 'base64'); + } else { + throw (new FingerprintFormatError(fp)); + } + + switch (hash.length) { + case 32: + alg = 'sha256'; + break; + case 16: + alg = 'md5'; + break; + case 20: + alg = 'sha1'; + break; + case 64: + alg = 'sha512'; + break; + default: + throw (new FingerprintFormatError(fp)); + } + + /* Plain hex/base64: guess it's probably SPKI unless told. */ + if (options.hashType === undefined) + hashType = 'spki'; + } + + if (alg === undefined) + throw (new FingerprintFormatError(fp)); + + if (algs.hashAlgs[alg] === undefined) + throw (new InvalidAlgorithmError(alg)); + + if (enAlgs !== undefined) { + enAlgs = enAlgs.map(function (a) { return a.toLowerCase(); }); + if (enAlgs.indexOf(alg) === -1) + throw (new InvalidAlgorithmError(alg)); + } + + return (new Fingerprint({ + algorithm: alg, + hash: hash, + type: options.type || 'key', + hashType: hashType + })); +}; + +function addColons(s) { + /*JSSTYLED*/ + return (s.replace(/(.{2})(?=.)/g, '$1:')); +} + +function base64Strip(s) { + /*JSSTYLED*/ + return (s.replace(/=*$/, '')); +} + +function sshBase64Format(alg, h) { + return (alg.toUpperCase() + ':' + base64Strip(h)); +} + +Fingerprint.isFingerprint = function (obj, ver) { + return (utils.isCompatible(obj, Fingerprint, ver)); +}; + +/* + * API versions for Fingerprint: + * [1,0] -- initial ver + * [1,1] -- first tagged ver + * [1,2] -- hashType and spki support + */ +Fingerprint.prototype._sshpkApiVersion = [1, 2]; + +Fingerprint._oldVersionDetect = function (obj) { + assert.func(obj.toString); + assert.func(obj.matches); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/formats/auto.js b/node_modules/sshpk/lib/formats/auto.js new file mode 100644 index 0000000..f32cd96 --- /dev/null +++ b/node_modules/sshpk/lib/formats/auto.js @@ -0,0 +1,124 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var pem = require('./pem'); +var ssh = require('./ssh'); +var rfc4253 = require('./rfc4253'); +var dnssec = require('./dnssec'); +var putty = require('./putty'); + +var DNSSEC_PRIVKEY_HEADER_PREFIX = 'Private-key-format: v1'; + +function read(buf, options) { + if (typeof (buf) === 'string') { + if (buf.trim().match(/^[-]+[ ]*BEGIN/)) + return (pem.read(buf, options)); + if (buf.match(/^\s*ssh-[a-z]/)) + return (ssh.read(buf, options)); + if (buf.match(/^\s*ecdsa-/)) + return (ssh.read(buf, options)); + if (buf.match(/^putty-user-key-file-2:/i)) + return (putty.read(buf, options)); + if (findDNSSECHeader(buf)) + return (dnssec.read(buf, options)); + buf = Buffer.from(buf, 'binary'); + } else { + assert.buffer(buf); + if (findPEMHeader(buf)) + return (pem.read(buf, options)); + if (findSSHHeader(buf)) + return (ssh.read(buf, options)); + if (findPuTTYHeader(buf)) + return (putty.read(buf, options)); + if (findDNSSECHeader(buf)) + return (dnssec.read(buf, options)); + } + if (buf.readUInt32BE(0) < buf.length) + return (rfc4253.read(buf, options)); + throw (new Error('Failed to auto-detect format of key')); +} + +function findPuTTYHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) + ++offset; + if (offset + 22 <= buf.length && + buf.slice(offset, offset + 22).toString('ascii').toLowerCase() === + 'putty-user-key-file-2:') + return (true); + return (false); +} + +function findSSHHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) + ++offset; + if (offset + 4 <= buf.length && + buf.slice(offset, offset + 4).toString('ascii') === 'ssh-') + return (true); + if (offset + 6 <= buf.length && + buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-') + return (true); + return (false); +} + +function findPEMHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10)) + ++offset; + if (buf[offset] !== 45) + return (false); + while (offset < buf.length && + (buf[offset] === 45)) + ++offset; + while (offset < buf.length && + (buf[offset] === 32)) + ++offset; + if (offset + 5 > buf.length || + buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN') + return (false); + return (true); +} + +function findDNSSECHeader(buf) { + // private case first + if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length) + return (false); + var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length); + if (headerCheck.toString('ascii') === DNSSEC_PRIVKEY_HEADER_PREFIX) + return (true); + + // public-key RFC3110 ? + // 'domain.com. IN KEY ...' or 'domain.com. IN DNSKEY ...' + // skip any comment-lines + if (typeof (buf) !== 'string') { + buf = buf.toString('ascii'); + } + var lines = buf.split('\n'); + var line = 0; + /* JSSTYLED */ + while (lines[line].match(/^\;/)) + line++; + if (lines[line].toString('ascii').match(/\. IN KEY /)) + return (true); + if (lines[line].toString('ascii').match(/\. IN DNSKEY /)) + return (true); + return (false); +} + +function write(key, options) { + throw (new Error('"auto" format cannot be used for writing')); +} diff --git a/node_modules/sshpk/lib/formats/dnssec.js b/node_modules/sshpk/lib/formats/dnssec.js new file mode 100644 index 0000000..a74ea9c --- /dev/null +++ b/node_modules/sshpk/lib/formats/dnssec.js @@ -0,0 +1,287 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var utils = require('../utils'); +var SSHBuffer = require('../ssh-buffer'); +var Dhe = require('../dhe'); + +var supportedAlgos = { + 'rsa-sha1' : 5, + 'rsa-sha256' : 8, + 'rsa-sha512' : 10, + 'ecdsa-p256-sha256' : 13, + 'ecdsa-p384-sha384' : 14 + /* + * ed25519 is hypothetically supported with id 15 + * but the common tools available don't appear to be + * capable of generating/using ed25519 keys + */ +}; + +var supportedAlgosById = {}; +Object.keys(supportedAlgos).forEach(function (k) { + supportedAlgosById[supportedAlgos[k]] = k.toUpperCase(); +}); + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + var lines = buf.split('\n'); + if (lines[0].match(/^Private-key-format\: v1/)) { + var algElems = lines[1].split(' '); + var algoNum = parseInt(algElems[1], 10); + var algoName = algElems[2]; + if (!supportedAlgosById[algoNum]) + throw (new Error('Unsupported algorithm: ' + algoName)); + return (readDNSSECPrivateKey(algoNum, lines.slice(2))); + } + + // skip any comment-lines + var line = 0; + /* JSSTYLED */ + while (lines[line].match(/^\;/)) + line++; + // we should now have *one single* line left with our KEY on it. + if ((lines[line].match(/\. IN KEY /) || + lines[line].match(/\. IN DNSKEY /)) && lines[line+1].length === 0) { + return (readRFC3110(lines[line])); + } + throw (new Error('Cannot parse dnssec key')); +} + +function readRFC3110(keyString) { + var elems = keyString.split(' '); + //unused var flags = parseInt(elems[3], 10); + //unused var protocol = parseInt(elems[4], 10); + var algorithm = parseInt(elems[5], 10); + if (!supportedAlgosById[algorithm]) + throw (new Error('Unsupported algorithm: ' + algorithm)); + var base64key = elems.slice(6, elems.length).join(); + var keyBuffer = Buffer.from(base64key, 'base64'); + if (supportedAlgosById[algorithm].match(/^RSA-/)) { + // join the rest of the body into a single base64-blob + var publicExponentLen = keyBuffer.readUInt8(0); + if (publicExponentLen != 3 && publicExponentLen != 1) + throw (new Error('Cannot parse dnssec key: ' + + 'unsupported exponent length')); + + var publicExponent = keyBuffer.slice(1, publicExponentLen+1); + publicExponent = utils.mpNormalize(publicExponent); + var modulus = keyBuffer.slice(1+publicExponentLen); + modulus = utils.mpNormalize(modulus); + // now, make the key + var rsaKey = { + type: 'rsa', + parts: [] + }; + rsaKey.parts.push({ name: 'e', data: publicExponent}); + rsaKey.parts.push({ name: 'n', data: modulus}); + return (new Key(rsaKey)); + } + if (supportedAlgosById[algorithm] === 'ECDSA-P384-SHA384' || + supportedAlgosById[algorithm] === 'ECDSA-P256-SHA256') { + var curve = 'nistp384'; + var size = 384; + if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) { + curve = 'nistp256'; + size = 256; + } + + var ecdsaKey = { + type: 'ecdsa', + curve: curve, + size: size, + parts: [ + {name: 'curve', data: Buffer.from(curve) }, + {name: 'Q', data: utils.ecNormalize(keyBuffer) } + ] + }; + return (new Key(ecdsaKey)); + } + throw (new Error('Unsupported algorithm: ' + + supportedAlgosById[algorithm])); +} + +function elementToBuf(e) { + return (Buffer.from(e.split(' ')[1], 'base64')); +} + +function readDNSSECRSAPrivateKey(elements) { + var rsaParams = {}; + elements.forEach(function (element) { + if (element.split(' ')[0] === 'Modulus:') + rsaParams['n'] = elementToBuf(element); + else if (element.split(' ')[0] === 'PublicExponent:') + rsaParams['e'] = elementToBuf(element); + else if (element.split(' ')[0] === 'PrivateExponent:') + rsaParams['d'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Prime1:') + rsaParams['p'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Prime2:') + rsaParams['q'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Exponent1:') + rsaParams['dmodp'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Exponent2:') + rsaParams['dmodq'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Coefficient:') + rsaParams['iqmp'] = elementToBuf(element); + }); + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'e', data: utils.mpNormalize(rsaParams['e'])}, + { name: 'n', data: utils.mpNormalize(rsaParams['n'])}, + { name: 'd', data: utils.mpNormalize(rsaParams['d'])}, + { name: 'p', data: utils.mpNormalize(rsaParams['p'])}, + { name: 'q', data: utils.mpNormalize(rsaParams['q'])}, + { name: 'dmodp', + data: utils.mpNormalize(rsaParams['dmodp'])}, + { name: 'dmodq', + data: utils.mpNormalize(rsaParams['dmodq'])}, + { name: 'iqmp', + data: utils.mpNormalize(rsaParams['iqmp'])} + ] + }; + return (new PrivateKey(key)); +} + +function readDNSSECPrivateKey(alg, elements) { + if (supportedAlgosById[alg].match(/^RSA-/)) { + return (readDNSSECRSAPrivateKey(elements)); + } + if (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' || + supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { + var d = Buffer.from(elements[0].split(' ')[1], 'base64'); + var curve = 'nistp384'; + var size = 384; + if (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { + curve = 'nistp256'; + size = 256; + } + // DNSSEC generates the public-key on the fly (go calculate it) + var publicKey = utils.publicFromPrivateECDSA(curve, d); + var Q = publicKey.part['Q'].data; + var ecdsaKey = { + type: 'ecdsa', + curve: curve, + size: size, + parts: [ + {name: 'curve', data: Buffer.from(curve) }, + {name: 'd', data: d }, + {name: 'Q', data: Q } + ] + }; + return (new PrivateKey(ecdsaKey)); + } + throw (new Error('Unsupported algorithm: ' + supportedAlgosById[alg])); +} + +function dnssecTimestamp(date) { + var year = date.getFullYear() + ''; //stringify + var month = (date.getMonth() + 1); + var timestampStr = year + month + date.getUTCDate(); + timestampStr += '' + date.getUTCHours() + date.getUTCMinutes(); + timestampStr += date.getUTCSeconds(); + return (timestampStr); +} + +function rsaAlgFromOptions(opts) { + if (!opts || !opts.hashAlgo || opts.hashAlgo === 'sha1') + return ('5 (RSASHA1)'); + else if (opts.hashAlgo === 'sha256') + return ('8 (RSASHA256)'); + else if (opts.hashAlgo === 'sha512') + return ('10 (RSASHA512)'); + else + throw (new Error('Unknown or unsupported hash: ' + + opts.hashAlgo)); +} + +function writeRSA(key, options) { + // if we're missing parts, add them. + if (!key.part.dmodp || !key.part.dmodq) { + utils.addRSAMissing(key); + } + + var out = ''; + out += 'Private-key-format: v1.3\n'; + out += 'Algorithm: ' + rsaAlgFromOptions(options) + '\n'; + var n = utils.mpDenormalize(key.part['n'].data); + out += 'Modulus: ' + n.toString('base64') + '\n'; + var e = utils.mpDenormalize(key.part['e'].data); + out += 'PublicExponent: ' + e.toString('base64') + '\n'; + var d = utils.mpDenormalize(key.part['d'].data); + out += 'PrivateExponent: ' + d.toString('base64') + '\n'; + var p = utils.mpDenormalize(key.part['p'].data); + out += 'Prime1: ' + p.toString('base64') + '\n'; + var q = utils.mpDenormalize(key.part['q'].data); + out += 'Prime2: ' + q.toString('base64') + '\n'; + var dmodp = utils.mpDenormalize(key.part['dmodp'].data); + out += 'Exponent1: ' + dmodp.toString('base64') + '\n'; + var dmodq = utils.mpDenormalize(key.part['dmodq'].data); + out += 'Exponent2: ' + dmodq.toString('base64') + '\n'; + var iqmp = utils.mpDenormalize(key.part['iqmp'].data); + out += 'Coefficient: ' + iqmp.toString('base64') + '\n'; + // Assume that we're valid as-of now + var timestamp = new Date(); + out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; + return (Buffer.from(out, 'ascii')); +} + +function writeECDSA(key, options) { + var out = ''; + out += 'Private-key-format: v1.3\n'; + + if (key.curve === 'nistp256') { + out += 'Algorithm: 13 (ECDSAP256SHA256)\n'; + } else if (key.curve === 'nistp384') { + out += 'Algorithm: 14 (ECDSAP384SHA384)\n'; + } else { + throw (new Error('Unsupported curve')); + } + var base64Key = key.part['d'].data.toString('base64'); + out += 'PrivateKey: ' + base64Key + '\n'; + + // Assume that we're valid as-of now + var timestamp = new Date(); + out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; + + return (Buffer.from(out, 'ascii')); +} + +function write(key, options) { + if (PrivateKey.isPrivateKey(key)) { + if (key.type === 'rsa') { + return (writeRSA(key, options)); + } else if (key.type === 'ecdsa') { + return (writeECDSA(key, options)); + } else { + throw (new Error('Unsupported algorithm: ' + key.type)); + } + } else if (Key.isKey(key)) { + /* + * RFC3110 requires a keyname, and a keytype, which we + * don't really have a mechanism for specifying such + * additional metadata. + */ + throw (new Error('Format "dnssec" only supports ' + + 'writing private keys')); + } else { + throw (new Error('key is not a Key or PrivateKey')); + } +} diff --git a/node_modules/sshpk/lib/formats/openssh-cert.js b/node_modules/sshpk/lib/formats/openssh-cert.js new file mode 100644 index 0000000..766f3d3 --- /dev/null +++ b/node_modules/sshpk/lib/formats/openssh-cert.js @@ -0,0 +1,352 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + verify: verify, + sign: sign, + signAsync: signAsync, + write: write, + + /* Internal private API */ + fromBuffer: fromBuffer, + toBuffer: toBuffer +}; + +var assert = require('assert-plus'); +var SSHBuffer = require('../ssh-buffer'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var Identity = require('../identity'); +var rfc4253 = require('./rfc4253'); +var Signature = require('../signature'); +var utils = require('../utils'); +var Certificate = require('../certificate'); + +function verify(cert, key) { + /* + * We always give an issuerKey, so if our verify() is being called then + * there was no signature. Return false. + */ + return (false); +} + +var TYPES = { + 'user': 1, + 'host': 2 +}; +Object.keys(TYPES).forEach(function (k) { TYPES[TYPES[k]] = k; }); + +var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/; + +function read(buf, options) { + if (Buffer.isBuffer(buf)) + buf = buf.toString('ascii'); + var parts = buf.trim().split(/[ \t\n]+/g); + if (parts.length < 2 || parts.length > 3) + throw (new Error('Not a valid SSH certificate line')); + + var algo = parts[0]; + var data = parts[1]; + + data = Buffer.from(data, 'base64'); + return (fromBuffer(data, algo)); +} + +function fromBuffer(data, algo, partial) { + var sshbuf = new SSHBuffer({ buffer: data }); + var innerAlgo = sshbuf.readString(); + if (algo !== undefined && innerAlgo !== algo) + throw (new Error('SSH certificate algorithm mismatch')); + if (algo === undefined) + algo = innerAlgo; + + var cert = {}; + cert.signatures = {}; + cert.signatures.openssh = {}; + + cert.signatures.openssh.nonce = sshbuf.readBuffer(); + + var key = {}; + var parts = (key.parts = []); + key.type = getAlg(algo); + + var partCount = algs.info[key.type].parts.length; + while (parts.length < partCount) + parts.push(sshbuf.readPart()); + assert.ok(parts.length >= 1, 'key must have at least one part'); + + var algInfo = algs.info[key.type]; + if (key.type === 'ecdsa') { + var res = ECDSA_ALGO.exec(algo); + assert.ok(res !== null); + assert.strictEqual(res[1], parts[0].data.toString()); + } + + for (var i = 0; i < algInfo.parts.length; ++i) { + parts[i].name = algInfo.parts[i]; + if (parts[i].name !== 'curve' && + algInfo.normalize !== false) { + var p = parts[i]; + p.data = utils.mpNormalize(p.data); + } + } + + cert.subjectKey = new Key(key); + + cert.serial = sshbuf.readInt64(); + + var type = TYPES[sshbuf.readInt()]; + assert.string(type, 'valid cert type'); + + cert.signatures.openssh.keyId = sshbuf.readString(); + + var principals = []; + var pbuf = sshbuf.readBuffer(); + var psshbuf = new SSHBuffer({ buffer: pbuf }); + while (!psshbuf.atEnd()) + principals.push(psshbuf.readString()); + if (principals.length === 0) + principals = ['*']; + + cert.subjects = principals.map(function (pr) { + if (type === 'user') + return (Identity.forUser(pr)); + else if (type === 'host') + return (Identity.forHost(pr)); + throw (new Error('Unknown identity type ' + type)); + }); + + cert.validFrom = int64ToDate(sshbuf.readInt64()); + cert.validUntil = int64ToDate(sshbuf.readInt64()); + + var exts = []; + var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); + var ext; + while (!extbuf.atEnd()) { + ext = { critical: true }; + ext.name = extbuf.readString(); + ext.data = extbuf.readBuffer(); + exts.push(ext); + } + extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); + while (!extbuf.atEnd()) { + ext = { critical: false }; + ext.name = extbuf.readString(); + ext.data = extbuf.readBuffer(); + exts.push(ext); + } + cert.signatures.openssh.exts = exts; + + /* reserved */ + sshbuf.readBuffer(); + + var signingKeyBuf = sshbuf.readBuffer(); + cert.issuerKey = rfc4253.read(signingKeyBuf); + + /* + * OpenSSH certs don't give the identity of the issuer, just their + * public key. So, we use an Identity that matches anything. The + * isSignedBy() function will later tell you if the key matches. + */ + cert.issuer = Identity.forHost('**'); + + var sigBuf = sshbuf.readBuffer(); + cert.signatures.openssh.signature = + Signature.parse(sigBuf, cert.issuerKey.type, 'ssh'); + + if (partial !== undefined) { + partial.remainder = sshbuf.remainder(); + partial.consumed = sshbuf._offset; + } + + return (new Certificate(cert)); +} + +function int64ToDate(buf) { + var i = buf.readUInt32BE(0) * 4294967296; + i += buf.readUInt32BE(4); + var d = new Date(); + d.setTime(i * 1000); + d.sourceInt64 = buf; + return (d); +} + +function dateToInt64(date) { + if (date.sourceInt64 !== undefined) + return (date.sourceInt64); + var i = Math.round(date.getTime() / 1000); + var upper = Math.floor(i / 4294967296); + var lower = Math.floor(i % 4294967296); + var buf = Buffer.alloc(8); + buf.writeUInt32BE(upper, 0); + buf.writeUInt32BE(lower, 4); + return (buf); +} + +function sign(cert, key) { + if (cert.signatures.openssh === undefined) + cert.signatures.openssh = {}; + try { + var blob = toBuffer(cert, true); + } catch (e) { + delete (cert.signatures.openssh); + return (false); + } + var sig = cert.signatures.openssh; + var hashAlgo = undefined; + if (key.type === 'rsa' || key.type === 'dsa') + hashAlgo = 'sha1'; + var signer = key.createSign(hashAlgo); + signer.write(blob); + sig.signature = signer.sign(); + return (true); +} + +function signAsync(cert, signer, done) { + if (cert.signatures.openssh === undefined) + cert.signatures.openssh = {}; + try { + var blob = toBuffer(cert, true); + } catch (e) { + delete (cert.signatures.openssh); + done(e); + return; + } + var sig = cert.signatures.openssh; + + signer(blob, function (err, signature) { + if (err) { + done(err); + return; + } + try { + /* + * This will throw if the signature isn't of a + * type/algo that can be used for SSH. + */ + signature.toBuffer('ssh'); + } catch (e) { + done(e); + return; + } + sig.signature = signature; + done(); + }); +} + +function write(cert, options) { + if (options === undefined) + options = {}; + + var blob = toBuffer(cert); + var out = getCertType(cert.subjectKey) + ' ' + blob.toString('base64'); + if (options.comment) + out = out + ' ' + options.comment; + return (out); +} + + +function toBuffer(cert, noSig) { + assert.object(cert.signatures.openssh, 'signature for openssh format'); + var sig = cert.signatures.openssh; + + if (sig.nonce === undefined) + sig.nonce = crypto.randomBytes(16); + var buf = new SSHBuffer({}); + buf.writeString(getCertType(cert.subjectKey)); + buf.writeBuffer(sig.nonce); + + var key = cert.subjectKey; + var algInfo = algs.info[key.type]; + algInfo.parts.forEach(function (part) { + buf.writePart(key.part[part]); + }); + + buf.writeInt64(cert.serial); + + var type = cert.subjects[0].type; + assert.notStrictEqual(type, 'unknown'); + cert.subjects.forEach(function (id) { + assert.strictEqual(id.type, type); + }); + type = TYPES[type]; + buf.writeInt(type); + + if (sig.keyId === undefined) { + sig.keyId = cert.subjects[0].type + '_' + + (cert.subjects[0].uid || cert.subjects[0].hostname); + } + buf.writeString(sig.keyId); + + var sub = new SSHBuffer({}); + cert.subjects.forEach(function (id) { + if (type === TYPES.host) + sub.writeString(id.hostname); + else if (type === TYPES.user) + sub.writeString(id.uid); + }); + buf.writeBuffer(sub.toBuffer()); + + buf.writeInt64(dateToInt64(cert.validFrom)); + buf.writeInt64(dateToInt64(cert.validUntil)); + + var exts = sig.exts; + if (exts === undefined) + exts = []; + + var extbuf = new SSHBuffer({}); + exts.forEach(function (ext) { + if (ext.critical !== true) + return; + extbuf.writeString(ext.name); + extbuf.writeBuffer(ext.data); + }); + buf.writeBuffer(extbuf.toBuffer()); + + extbuf = new SSHBuffer({}); + exts.forEach(function (ext) { + if (ext.critical === true) + return; + extbuf.writeString(ext.name); + extbuf.writeBuffer(ext.data); + }); + buf.writeBuffer(extbuf.toBuffer()); + + /* reserved */ + buf.writeBuffer(Buffer.alloc(0)); + + sub = rfc4253.write(cert.issuerKey); + buf.writeBuffer(sub); + + if (!noSig) + buf.writeBuffer(sig.signature.toBuffer('ssh')); + + return (buf.toBuffer()); +} + +function getAlg(certType) { + if (certType === 'ssh-rsa-cert-v01@openssh.com') + return ('rsa'); + if (certType === 'ssh-dss-cert-v01@openssh.com') + return ('dsa'); + if (certType.match(ECDSA_ALGO)) + return ('ecdsa'); + if (certType === 'ssh-ed25519-cert-v01@openssh.com') + return ('ed25519'); + throw (new Error('Unsupported cert type ' + certType)); +} + +function getCertType(key) { + if (key.type === 'rsa') + return ('ssh-rsa-cert-v01@openssh.com'); + if (key.type === 'dsa') + return ('ssh-dss-cert-v01@openssh.com'); + if (key.type === 'ecdsa') + return ('ecdsa-sha2-' + key.curve + '-cert-v01@openssh.com'); + if (key.type === 'ed25519') + return ('ssh-ed25519-cert-v01@openssh.com'); + throw (new Error('Unsupported key type ' + key.type)); +} diff --git a/node_modules/sshpk/lib/formats/pem.js b/node_modules/sshpk/lib/formats/pem.js new file mode 100644 index 0000000..bbe78fc --- /dev/null +++ b/node_modules/sshpk/lib/formats/pem.js @@ -0,0 +1,290 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var pkcs1 = require('./pkcs1'); +var pkcs8 = require('./pkcs8'); +var sshpriv = require('./ssh-private'); +var rfc4253 = require('./rfc4253'); + +var errors = require('../errors'); + +var OID_PBES2 = '1.2.840.113549.1.5.13'; +var OID_PBKDF2 = '1.2.840.113549.1.5.12'; + +var OID_TO_CIPHER = { + '1.2.840.113549.3.7': '3des-cbc', + '2.16.840.1.101.3.4.1.2': 'aes128-cbc', + '2.16.840.1.101.3.4.1.42': 'aes256-cbc' +}; +var CIPHER_TO_OID = {}; +Object.keys(OID_TO_CIPHER).forEach(function (k) { + CIPHER_TO_OID[OID_TO_CIPHER[k]] = k; +}); + +var OID_TO_HASH = { + '1.2.840.113549.2.7': 'sha1', + '1.2.840.113549.2.9': 'sha256', + '1.2.840.113549.2.11': 'sha512' +}; +var HASH_TO_OID = {}; +Object.keys(OID_TO_HASH).forEach(function (k) { + HASH_TO_OID[OID_TO_HASH[k]] = k; +}); + +/* + * For reading we support both PKCS#1 and PKCS#8. If we find a private key, + * we just take the public component of it and use that. + */ +function read(buf, options, forceType) { + var input = buf; + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var lines = buf.trim().split(/[\r\n]+/g); + + var m; + var si = -1; + while (!m && si < lines.length) { + m = lines[++si].match(/*JSSTYLED*/ + /[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); + } + assert.ok(m, 'invalid PEM header'); + + var m2; + var ei = lines.length; + while (!m2 && ei > 0) { + m2 = lines[--ei].match(/*JSSTYLED*/ + /[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); + } + assert.ok(m2, 'invalid PEM footer'); + + /* Begin and end banners must match key type */ + assert.equal(m[2], m2[2]); + var type = m[2].toLowerCase(); + + var alg; + if (m[1]) { + /* They also must match algorithms, if given */ + assert.equal(m[1], m2[1], 'PEM header and footer mismatch'); + alg = m[1].trim(); + } + + lines = lines.slice(si, ei + 1); + + var headers = {}; + while (true) { + lines = lines.slice(1); + m = lines[0].match(/*JSSTYLED*/ + /^([A-Za-z0-9-]+): (.+)$/); + if (!m) + break; + headers[m[1].toLowerCase()] = m[2]; + } + + /* Chop off the first and last lines */ + lines = lines.slice(0, -1).join(''); + buf = Buffer.from(lines, 'base64'); + + var cipher, key, iv; + if (headers['proc-type']) { + var parts = headers['proc-type'].split(','); + if (parts[0] === '4' && parts[1] === 'ENCRYPTED') { + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from( + options.passphrase, 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } else { + parts = headers['dek-info'].split(','); + assert.ok(parts.length === 2); + cipher = parts[0].toLowerCase(); + iv = Buffer.from(parts[1], 'hex'); + key = utils.opensslKeyDeriv(cipher, iv, + options.passphrase, 1).key; + } + } + } + + if (alg && alg.toLowerCase() === 'encrypted') { + var eder = new asn1.BerReader(buf); + var pbesEnd; + eder.readSequence(); + + eder.readSequence(); + pbesEnd = eder.offset + eder.length; + + var method = eder.readOID(); + if (method !== OID_PBES2) { + throw (new Error('Unsupported PEM/PKCS8 encryption ' + + 'scheme: ' + method)); + } + + eder.readSequence(); /* PBES2-params */ + + eder.readSequence(); /* keyDerivationFunc */ + var kdfEnd = eder.offset + eder.length; + var kdfOid = eder.readOID(); + if (kdfOid !== OID_PBKDF2) + throw (new Error('Unsupported PBES2 KDF: ' + kdfOid)); + eder.readSequence(); + var salt = eder.readString(asn1.Ber.OctetString, true); + var iterations = eder.readInt(); + var hashAlg = 'sha1'; + if (eder.offset < kdfEnd) { + eder.readSequence(); + var hashAlgOid = eder.readOID(); + hashAlg = OID_TO_HASH[hashAlgOid]; + if (hashAlg === undefined) { + throw (new Error('Unsupported PBKDF2 hash: ' + + hashAlgOid)); + } + } + eder._offset = kdfEnd; + + eder.readSequence(); /* encryptionScheme */ + var cipherOid = eder.readOID(); + cipher = OID_TO_CIPHER[cipherOid]; + if (cipher === undefined) { + throw (new Error('Unsupported PBES2 cipher: ' + + cipherOid)); + } + iv = eder.readString(asn1.Ber.OctetString, true); + + eder._offset = pbesEnd; + buf = eder.readString(asn1.Ber.OctetString, true); + + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from( + options.passphrase, 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } + + var cinfo = utils.opensshCipherInfo(cipher); + + cipher = cinfo.opensslName; + key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize, + options.passphrase); + alg = undefined; + } + + if (cipher && key && iv) { + var cipherStream = crypto.createDecipheriv(cipher, key, iv); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(buf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + buf = Buffer.concat(chunks); + } + + /* The new OpenSSH internal format abuses PEM headers */ + if (alg && alg.toLowerCase() === 'openssh') + return (sshpriv.readSSHPrivate(type, buf, options)); + if (alg && alg.toLowerCase() === 'ssh2') + return (rfc4253.readType(type, buf, options)); + + var der = new asn1.BerReader(buf); + der.originalInput = input; + + /* + * All of the PEM file types start with a sequence tag, so chop it + * off here + */ + der.readSequence(); + + /* PKCS#1 type keys name an algorithm in the banner explicitly */ + if (alg) { + if (forceType) + assert.strictEqual(forceType, 'pkcs1'); + return (pkcs1.readPkcs1(alg, type, der)); + } else { + if (forceType) + assert.strictEqual(forceType, 'pkcs8'); + return (pkcs8.readPkcs8(alg, type, der)); + } +} + +function write(key, options, type) { + assert.object(key); + + var alg = { + 'ecdsa': 'EC', + 'rsa': 'RSA', + 'dsa': 'DSA', + 'ed25519': 'EdDSA' + }[key.type]; + var header; + + var der = new asn1.BerWriter(); + + if (PrivateKey.isPrivateKey(key)) { + if (type && type === 'pkcs8') { + header = 'PRIVATE KEY'; + pkcs8.writePkcs8(der, key); + } else { + if (type) + assert.strictEqual(type, 'pkcs1'); + header = alg + ' PRIVATE KEY'; + pkcs1.writePkcs1(der, key); + } + + } else if (Key.isKey(key)) { + if (type && type === 'pkcs1') { + header = alg + ' PUBLIC KEY'; + pkcs1.writePkcs1(der, key); + } else { + if (type) + assert.strictEqual(type, 'pkcs8'); + header = 'PUBLIC KEY'; + pkcs8.writePkcs8(der, key); + } + + } else { + throw (new Error('key is not a Key or PrivateKey')); + } + + var tmp = der.buffer.toString('base64'); + var len = tmp.length + (tmp.length / 64) + + 18 + 16 + header.length*2 + 10; + var buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 64; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/node_modules/sshpk/lib/formats/pkcs1.js b/node_modules/sshpk/lib/formats/pkcs1.js new file mode 100644 index 0000000..bc48550 --- /dev/null +++ b/node_modules/sshpk/lib/formats/pkcs1.js @@ -0,0 +1,373 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + readPkcs1: readPkcs1, + write: write, + writePkcs1: writePkcs1 +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); + +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); + +var pkcs8 = require('./pkcs8'); +var readECDSACurve = pkcs8.readECDSACurve; + +function read(buf, options) { + return (pem.read(buf, options, 'pkcs1')); +} + +function write(key, options) { + return (pem.write(key, options, 'pkcs1')); +} + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function readPkcs1(alg, type, der) { + switch (alg) { + case 'RSA': + if (type === 'public') + return (readPkcs1RSAPublic(der)); + else if (type === 'private') + return (readPkcs1RSAPrivate(der)); + throw (new Error('Unknown key type: ' + type)); + case 'DSA': + if (type === 'public') + return (readPkcs1DSAPublic(der)); + else if (type === 'private') + return (readPkcs1DSAPrivate(der)); + throw (new Error('Unknown key type: ' + type)); + case 'EC': + case 'ECDSA': + if (type === 'private') + return (readPkcs1ECDSAPrivate(der)); + else if (type === 'public') + return (readPkcs1ECDSAPublic(der)); + throw (new Error('Unknown key type: ' + type)); + case 'EDDSA': + case 'EdDSA': + if (type === 'private') + return (readPkcs1EdDSAPrivate(der)); + throw (new Error(type + ' keys not supported with EdDSA')); + default: + throw (new Error('Unknown key algo: ' + alg)); + } +} + +function readPkcs1RSAPublic(der) { + // modulus and exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'exponent'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'e', data: e }, + { name: 'n', data: n } + ] + }; + + return (new Key(key)); +} + +function readPkcs1RSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version[0], 0); + + // modulus then public exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'public exponent'); + var d = readMPInt(der, 'private exponent'); + var p = readMPInt(der, 'prime1'); + var q = readMPInt(der, 'prime2'); + var dmodp = readMPInt(der, 'exponent1'); + var dmodq = readMPInt(der, 'exponent2'); + var iqmp = readMPInt(der, 'iqmp'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'n', data: n }, + { name: 'e', data: e }, + { name: 'd', data: d }, + { name: 'iqmp', data: iqmp }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'dmodp', data: dmodp }, + { name: 'dmodq', data: dmodq } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1DSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 0); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + var y = readMPInt(der, 'y'); + var x = readMPInt(der, 'x'); + + // now, make the key + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y }, + { name: 'x', data: x } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1EdDSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 1); + + // private key + var k = der.readString(asn1.Ber.OctetString, true); + + der.readSequence(0xa0); + var oid = der.readOID(); + assert.strictEqual(oid, '1.3.101.112', 'the ed25519 curve identifier'); + + der.readSequence(0xa1); + var A = utils.readBitString(der); + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: k } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1DSAPublic(der) { + var y = readMPInt(der, 'y'); + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + var key = { + type: 'dsa', + parts: [ + { name: 'y', data: y }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g } + ] + }; + + return (new Key(key)); +} + +function readPkcs1ECDSAPublic(der) { + der.readSequence(); + + var oid = der.readOID(); + assert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey'); + + var curveOid = der.readOID(); + + var curve; + var curves = Object.keys(algs.curves); + for (var j = 0; j < curves.length; ++j) { + var c = curves[j]; + var cd = algs.curves[c]; + if (cd.pkcs8oid === curveOid) { + curve = c; + break; + } + } + assert.string(curve, 'a known ECDSA named curve'); + + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curve) }, + { name: 'Q', data: Q } + ] + }; + + return (new Key(key)); +} + +function readPkcs1ECDSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 1); + + // private key + var d = der.readString(asn1.Ber.OctetString, true); + + der.readSequence(0xa0); + var curve = readECDSACurve(der); + assert.string(curve, 'a known elliptic curve'); + + der.readSequence(0xa1); + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curve) }, + { name: 'Q', data: Q }, + { name: 'd', data: d } + ] + }; + + return (new PrivateKey(key)); +} + +function writePkcs1(der, key) { + der.startSequence(); + + switch (key.type) { + case 'rsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1RSAPrivate(der, key); + else + writePkcs1RSAPublic(der, key); + break; + case 'dsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1DSAPrivate(der, key); + else + writePkcs1DSAPublic(der, key); + break; + case 'ecdsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1ECDSAPrivate(der, key); + else + writePkcs1ECDSAPublic(der, key); + break; + case 'ed25519': + if (PrivateKey.isPrivateKey(key)) + writePkcs1EdDSAPrivate(der, key); + else + writePkcs1EdDSAPublic(der, key); + break; + default: + throw (new Error('Unknown key algo: ' + key.type)); + } + + der.endSequence(); +} + +function writePkcs1RSAPublic(der, key) { + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); +} + +function writePkcs1RSAPrivate(der, key) { + var ver = Buffer.from([0]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.writeBuffer(key.part.d.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + if (!key.part.dmodp || !key.part.dmodq) + utils.addRSAMissing(key); + der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); + der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); + der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); +} + +function writePkcs1DSAPrivate(der, key) { + var ver = Buffer.from([0]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.writeBuffer(key.part.x.data, asn1.Ber.Integer); +} + +function writePkcs1DSAPublic(der, key) { + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); +} + +function writePkcs1ECDSAPublic(der, key) { + der.startSequence(); + + der.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */ + var curve = key.part.curve.data.toString(); + var curveOid = algs.curves[curve].pkcs8oid; + assert.string(curveOid, 'a known ECDSA named curve'); + der.writeOID(curveOid); + + der.endSequence(); + + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); +} + +function writePkcs1ECDSAPrivate(der, key) { + var ver = Buffer.from([1]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); + + der.startSequence(0xa0); + var curve = key.part.curve.data.toString(); + var curveOid = algs.curves[curve].pkcs8oid; + assert.string(curveOid, 'a known ECDSA named curve'); + der.writeOID(curveOid); + der.endSequence(); + + der.startSequence(0xa1); + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); + der.endSequence(); +} + +function writePkcs1EdDSAPrivate(der, key) { + var ver = Buffer.from([1]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.k.data, asn1.Ber.OctetString); + + der.startSequence(0xa0); + der.writeOID('1.3.101.112'); + der.endSequence(); + + der.startSequence(0xa1); + utils.writeBitString(der, key.part.A.data); + der.endSequence(); +} + +function writePkcs1EdDSAPublic(der, key) { + throw (new Error('Public keys are not supported for EdDSA PKCS#1')); +} diff --git a/node_modules/sshpk/lib/formats/pkcs8.js b/node_modules/sshpk/lib/formats/pkcs8.js new file mode 100644 index 0000000..2ca3ca7 --- /dev/null +++ b/node_modules/sshpk/lib/formats/pkcs8.js @@ -0,0 +1,631 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + readPkcs8: readPkcs8, + write: write, + writePkcs8: writePkcs8, + pkcs8ToBuffer: pkcs8ToBuffer, + + readECDSACurve: readECDSACurve, + writeECDSACurve: writeECDSACurve +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); + +function read(buf, options) { + return (pem.read(buf, options, 'pkcs8')); +} + +function write(key, options) { + return (pem.write(key, options, 'pkcs8')); +} + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function readPkcs8(alg, type, der) { + /* Private keys in pkcs#8 format have a weird extra int */ + if (der.peek() === asn1.Ber.Integer) { + assert.strictEqual(type, 'private', + 'unexpected Integer at start of public key'); + der.readString(asn1.Ber.Integer, true); + } + + der.readSequence(); + var next = der.offset + der.length; + + var oid = der.readOID(); + switch (oid) { + case '1.2.840.113549.1.1.1': + der._offset = next; + if (type === 'public') + return (readPkcs8RSAPublic(der)); + else + return (readPkcs8RSAPrivate(der)); + case '1.2.840.10040.4.1': + if (type === 'public') + return (readPkcs8DSAPublic(der)); + else + return (readPkcs8DSAPrivate(der)); + case '1.2.840.10045.2.1': + if (type === 'public') + return (readPkcs8ECDSAPublic(der)); + else + return (readPkcs8ECDSAPrivate(der)); + case '1.3.101.112': + if (type === 'public') { + return (readPkcs8EdDSAPublic(der)); + } else { + return (readPkcs8EdDSAPrivate(der)); + } + case '1.3.101.110': + if (type === 'public') { + return (readPkcs8X25519Public(der)); + } else { + return (readPkcs8X25519Private(der)); + } + default: + throw (new Error('Unknown key type OID ' + oid)); + } +} + +function readPkcs8RSAPublic(der) { + // bit string sequence + der.readSequence(asn1.Ber.BitString); + der.readByte(); + der.readSequence(); + + // modulus + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'exponent'); + + // now, make the key + var key = { + type: 'rsa', + source: der.originalInput, + parts: [ + { name: 'e', data: e }, + { name: 'n', data: n } + ] + }; + + return (new Key(key)); +} + +function readPkcs8RSAPrivate(der) { + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + + var ver = readMPInt(der, 'version'); + assert.equal(ver[0], 0x0, 'unknown RSA private key version'); + + // modulus then public exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'public exponent'); + var d = readMPInt(der, 'private exponent'); + var p = readMPInt(der, 'prime1'); + var q = readMPInt(der, 'prime2'); + var dmodp = readMPInt(der, 'exponent1'); + var dmodq = readMPInt(der, 'exponent2'); + var iqmp = readMPInt(der, 'iqmp'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'n', data: n }, + { name: 'e', data: e }, + { name: 'd', data: d }, + { name: 'iqmp', data: iqmp }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'dmodp', data: dmodp }, + { name: 'dmodq', data: dmodq } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8DSAPublic(der) { + der.readSequence(); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + // bit string sequence + der.readSequence(asn1.Ber.BitString); + der.readByte(); + + var y = readMPInt(der, 'y'); + + // now, make the key + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y } + ] + }; + + return (new Key(key)); +} + +function readPkcs8DSAPrivate(der) { + der.readSequence(); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + der.readSequence(asn1.Ber.OctetString); + var x = readMPInt(der, 'x'); + + /* The pkcs#8 format does not include the public key */ + var y = utils.calculateDSAPublic(g, p, x); + + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y }, + { name: 'x', data: x } + ] + }; + + return (new PrivateKey(key)); +} + +function readECDSACurve(der) { + var curveName, curveNames; + var j, c, cd; + + if (der.peek() === asn1.Ber.OID) { + var oid = der.readOID(); + + curveNames = Object.keys(algs.curves); + for (j = 0; j < curveNames.length; ++j) { + c = curveNames[j]; + cd = algs.curves[c]; + if (cd.pkcs8oid === oid) { + curveName = c; + break; + } + } + + } else { + // ECParameters sequence + der.readSequence(); + var version = der.readString(asn1.Ber.Integer, true); + assert.strictEqual(version[0], 1, 'ECDSA key not version 1'); + + var curve = {}; + + // FieldID sequence + der.readSequence(); + var fieldTypeOid = der.readOID(); + assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1', + 'ECDSA key is not from a prime-field'); + var p = curve.p = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + /* + * p always starts with a 1 bit, so count the zeros to get its + * real size. + */ + curve.size = p.length * 8 - utils.countZeros(p); + + // Curve sequence + der.readSequence(); + curve.a = utils.mpNormalize( + der.readString(asn1.Ber.OctetString, true)); + curve.b = utils.mpNormalize( + der.readString(asn1.Ber.OctetString, true)); + if (der.peek() === asn1.Ber.BitString) + curve.s = der.readString(asn1.Ber.BitString, true); + + // Combined Gx and Gy + curve.G = der.readString(asn1.Ber.OctetString, true); + assert.strictEqual(curve.G[0], 0x4, + 'uncompressed G is required'); + + curve.n = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + curve.h = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' + + 'required'); + + curveNames = Object.keys(algs.curves); + var ks = Object.keys(curve); + for (j = 0; j < curveNames.length; ++j) { + c = curveNames[j]; + cd = algs.curves[c]; + var equal = true; + for (var i = 0; i < ks.length; ++i) { + var k = ks[i]; + if (cd[k] === undefined) + continue; + if (typeof (cd[k]) === 'object' && + cd[k].equals !== undefined) { + if (!cd[k].equals(curve[k])) { + equal = false; + break; + } + } else if (Buffer.isBuffer(cd[k])) { + if (cd[k].toString('binary') + !== curve[k].toString('binary')) { + equal = false; + break; + } + } else { + if (cd[k] !== curve[k]) { + equal = false; + break; + } + } + } + if (equal) { + curveName = c; + break; + } + } + } + return (curveName); +} + +function readPkcs8ECDSAPrivate(der) { + var curveName = readECDSACurve(der); + assert.string(curveName, 'a known elliptic curve'); + + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + + var version = readMPInt(der, 'version'); + assert.equal(version[0], 1, 'unknown version of ECDSA key'); + + var d = der.readString(asn1.Ber.OctetString, true); + var Q; + + if (der.peek() == 0xa0) { + der.readSequence(0xa0); + der._offset += der.length; + } + if (der.peek() == 0xa1) { + der.readSequence(0xa1); + Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + } + + if (Q === undefined) { + var pub = utils.publicFromPrivateECDSA(curveName, d); + Q = pub.part.Q.data; + } + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curveName) }, + { name: 'Q', data: Q }, + { name: 'd', data: d } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8ECDSAPublic(der) { + var curveName = readECDSACurve(der); + assert.string(curveName, 'a known elliptic curve'); + + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curveName) }, + { name: 'Q', data: Q } + ] + }; + + return (new Key(key)); +} + +function readPkcs8EdDSAPublic(der) { + if (der.peek() === 0x00) + der.readByte(); + + var A = utils.readBitString(der); + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) } + ] + }; + + return (new Key(key)); +} + +function readPkcs8X25519Public(der) { + var A = utils.readBitString(der); + + var key = { + type: 'curve25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) } + ] + }; + + return (new Key(key)); +} + +function readPkcs8EdDSAPrivate(der) { + if (der.peek() === 0x00) + der.readByte(); + + der.readSequence(asn1.Ber.OctetString); + var k = der.readString(asn1.Ber.OctetString, true); + k = utils.zeroPadToLength(k, 32); + + var A; + if (der.peek() === asn1.Ber.BitString) { + A = utils.readBitString(der); + A = utils.zeroPadToLength(A, 32); + } else { + A = utils.calculateED25519Public(k); + } + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: utils.zeroPadToLength(k, 32) } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8X25519Private(der) { + if (der.peek() === 0x00) + der.readByte(); + + der.readSequence(asn1.Ber.OctetString); + var k = der.readString(asn1.Ber.OctetString, true); + k = utils.zeroPadToLength(k, 32); + + var A = utils.calculateX25519Public(k); + + var key = { + type: 'curve25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: utils.zeroPadToLength(k, 32) } + ] + }; + + return (new PrivateKey(key)); +} + +function pkcs8ToBuffer(key) { + var der = new asn1.BerWriter(); + writePkcs8(der, key); + return (der.buffer); +} + +function writePkcs8(der, key) { + der.startSequence(); + + if (PrivateKey.isPrivateKey(key)) { + var sillyInt = Buffer.from([0]); + der.writeBuffer(sillyInt, asn1.Ber.Integer); + } + + der.startSequence(); + switch (key.type) { + case 'rsa': + der.writeOID('1.2.840.113549.1.1.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8RSAPrivate(key, der); + else + writePkcs8RSAPublic(key, der); + break; + case 'dsa': + der.writeOID('1.2.840.10040.4.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8DSAPrivate(key, der); + else + writePkcs8DSAPublic(key, der); + break; + case 'ecdsa': + der.writeOID('1.2.840.10045.2.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8ECDSAPrivate(key, der); + else + writePkcs8ECDSAPublic(key, der); + break; + case 'ed25519': + der.writeOID('1.3.101.112'); + if (PrivateKey.isPrivateKey(key)) + throw (new Error('Ed25519 private keys in pkcs8 ' + + 'format are not supported')); + writePkcs8EdDSAPublic(key, der); + break; + default: + throw (new Error('Unsupported key type: ' + key.type)); + } + + der.endSequence(); +} + +function writePkcs8RSAPrivate(key, der) { + der.writeNull(); + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + + var version = Buffer.from([0]); + der.writeBuffer(version, asn1.Ber.Integer); + + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.writeBuffer(key.part.d.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + if (!key.part.dmodp || !key.part.dmodq) + utils.addRSAMissing(key); + der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); + der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); + der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); + + der.endSequence(); + der.endSequence(); +} + +function writePkcs8RSAPublic(key, der) { + der.writeNull(); + der.endSequence(); + + der.startSequence(asn1.Ber.BitString); + der.writeByte(0x00); + + der.startSequence(); + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.endSequence(); + + der.endSequence(); +} + +function writePkcs8DSAPrivate(key, der) { + der.startSequence(); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.endSequence(); + + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.writeBuffer(key.part.x.data, asn1.Ber.Integer); + der.endSequence(); +} + +function writePkcs8DSAPublic(key, der) { + der.startSequence(); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.endSequence(); + der.endSequence(); + + der.startSequence(asn1.Ber.BitString); + der.writeByte(0x00); + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.endSequence(); +} + +function writeECDSACurve(key, der) { + var curve = algs.curves[key.curve]; + if (curve.pkcs8oid) { + /* This one has a name in pkcs#8, so just write the oid */ + der.writeOID(curve.pkcs8oid); + + } else { + // ECParameters sequence + der.startSequence(); + + var version = Buffer.from([1]); + der.writeBuffer(version, asn1.Ber.Integer); + + // FieldID sequence + der.startSequence(); + der.writeOID('1.2.840.10045.1.1'); // prime-field + der.writeBuffer(curve.p, asn1.Ber.Integer); + der.endSequence(); + + // Curve sequence + der.startSequence(); + var a = curve.p; + if (a[0] === 0x0) + a = a.slice(1); + der.writeBuffer(a, asn1.Ber.OctetString); + der.writeBuffer(curve.b, asn1.Ber.OctetString); + der.writeBuffer(curve.s, asn1.Ber.BitString); + der.endSequence(); + + der.writeBuffer(curve.G, asn1.Ber.OctetString); + der.writeBuffer(curve.n, asn1.Ber.Integer); + var h = curve.h; + if (!h) { + h = Buffer.from([1]); + } + der.writeBuffer(h, asn1.Ber.Integer); + + // ECParameters + der.endSequence(); + } +} + +function writePkcs8ECDSAPublic(key, der) { + writeECDSACurve(key, der); + der.endSequence(); + + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); +} + +function writePkcs8ECDSAPrivate(key, der) { + writeECDSACurve(key, der); + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + + var version = Buffer.from([1]); + der.writeBuffer(version, asn1.Ber.Integer); + + der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); + + der.startSequence(0xa1); + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); + der.endSequence(); + + der.endSequence(); + der.endSequence(); +} + +function writePkcs8EdDSAPublic(key, der) { + der.endSequence(); + + utils.writeBitString(der, key.part.A.data); +} + +function writePkcs8EdDSAPrivate(key, der) { + der.endSequence(); + + var k = utils.mpNormalize(key.part.k.data, true); + der.startSequence(asn1.Ber.OctetString); + der.writeBuffer(k, asn1.Ber.OctetString); + der.endSequence(); +} diff --git a/node_modules/sshpk/lib/formats/putty.js b/node_modules/sshpk/lib/formats/putty.js new file mode 100644 index 0000000..344419f --- /dev/null +++ b/node_modules/sshpk/lib/formats/putty.js @@ -0,0 +1,99 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var rfc4253 = require('./rfc4253'); +var Key = require('../key'); + +var errors = require('../errors'); + +function read(buf, options) { + var lines = buf.toString('ascii').split(/[\r\n]+/); + var found = false; + var parts; + var si = 0; + while (si < lines.length) { + parts = splitHeader(lines[si++]); + if (parts && + parts[0].toLowerCase() === 'putty-user-key-file-2') { + found = true; + break; + } + } + if (!found) { + throw (new Error('No PuTTY format first line found')); + } + var alg = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'encryption'); + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'comment'); + var comment = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'public-lines'); + var publicLines = parseInt(parts[1], 10); + if (!isFinite(publicLines) || publicLines < 0 || + publicLines > lines.length) { + throw (new Error('Invalid public-lines count')); + } + + var publicBuf = Buffer.from( + lines.slice(si, si + publicLines).join(''), 'base64'); + var keyType = rfc4253.algToKeyType(alg); + var key = rfc4253.read(publicBuf); + if (key.type !== keyType) { + throw (new Error('Outer key algorithm mismatch')); + } + key.comment = comment; + return (key); +} + +function splitHeader(line) { + var idx = line.indexOf(':'); + if (idx === -1) + return (null); + var header = line.slice(0, idx); + ++idx; + while (line[idx] === ' ') + ++idx; + var rest = line.slice(idx); + return ([header, rest]); +} + +function write(key, options) { + assert.object(key); + if (!Key.isKey(key)) + throw (new Error('Must be a public key')); + + var alg = rfc4253.keyTypeToAlg(key); + var buf = rfc4253.write(key); + var comment = key.comment || ''; + + var b64 = buf.toString('base64'); + var lines = wrap(b64, 64); + + lines.unshift('Public-Lines: ' + lines.length); + lines.unshift('Comment: ' + comment); + lines.unshift('Encryption: none'); + lines.unshift('PuTTY-User-Key-File-2: ' + alg); + + return (Buffer.from(lines.join('\n') + '\n')); +} + +function wrap(txt, len) { + var lines = []; + var pos = 0; + while (pos < txt.length) { + lines.push(txt.slice(pos, pos + 64)); + pos += 64; + } + return (lines); +} diff --git a/node_modules/sshpk/lib/formats/rfc4253.js b/node_modules/sshpk/lib/formats/rfc4253.js new file mode 100644 index 0000000..52fddcb --- /dev/null +++ b/node_modules/sshpk/lib/formats/rfc4253.js @@ -0,0 +1,166 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read.bind(undefined, false, undefined), + readType: read.bind(undefined, false), + write: write, + /* semi-private api, used by sshpk-agent */ + readPartial: read.bind(undefined, true), + + /* shared with ssh format */ + readInternal: read, + keyTypeToAlg: keyTypeToAlg, + algToKeyType: algToKeyType +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var SSHBuffer = require('../ssh-buffer'); + +function algToKeyType(alg) { + assert.string(alg); + if (alg === 'ssh-dss') + return ('dsa'); + else if (alg === 'ssh-rsa') + return ('rsa'); + else if (alg === 'ssh-ed25519') + return ('ed25519'); + else if (alg === 'ssh-curve25519') + return ('curve25519'); + else if (alg.match(/^ecdsa-sha2-/)) + return ('ecdsa'); + else + throw (new Error('Unknown algorithm ' + alg)); +} + +function keyTypeToAlg(key) { + assert.object(key); + if (key.type === 'dsa') + return ('ssh-dss'); + else if (key.type === 'rsa') + return ('ssh-rsa'); + else if (key.type === 'ed25519') + return ('ssh-ed25519'); + else if (key.type === 'curve25519') + return ('ssh-curve25519'); + else if (key.type === 'ecdsa') + return ('ecdsa-sha2-' + key.part.curve.data.toString()); + else + throw (new Error('Unknown key type ' + key.type)); +} + +function read(partial, type, buf, options) { + if (typeof (buf) === 'string') + buf = Buffer.from(buf); + assert.buffer(buf, 'buf'); + + var key = {}; + + var parts = key.parts = []; + var sshbuf = new SSHBuffer({buffer: buf}); + + var alg = sshbuf.readString(); + assert.ok(!sshbuf.atEnd(), 'key must have at least one part'); + + key.type = algToKeyType(alg); + + var partCount = algs.info[key.type].parts.length; + if (type && type === 'private') + partCount = algs.privInfo[key.type].parts.length; + + while (!sshbuf.atEnd() && parts.length < partCount) + parts.push(sshbuf.readPart()); + while (!partial && !sshbuf.atEnd()) + parts.push(sshbuf.readPart()); + + assert.ok(parts.length >= 1, + 'key must have at least one part'); + assert.ok(partial || sshbuf.atEnd(), + 'leftover bytes at end of key'); + + var Constructor = Key; + var algInfo = algs.info[key.type]; + if (type === 'private' || algInfo.parts.length !== parts.length) { + algInfo = algs.privInfo[key.type]; + Constructor = PrivateKey; + } + assert.strictEqual(algInfo.parts.length, parts.length); + + if (key.type === 'ecdsa') { + var res = /^ecdsa-sha2-(.+)$/.exec(alg); + assert.ok(res !== null); + assert.strictEqual(res[1], parts[0].data.toString()); + } + + var normalized = true; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = parts[i]; + p.name = algInfo.parts[i]; + /* + * OpenSSH stores ed25519 "private" keys as seed + public key + * concat'd together (k followed by A). We want to keep them + * separate for other formats that don't do this. + */ + if (key.type === 'ed25519' && p.name === 'k') + p.data = p.data.slice(0, 32); + + if (p.name !== 'curve' && algInfo.normalize !== false) { + var nd; + if (key.type === 'ed25519') { + nd = utils.zeroPadToLength(p.data, 32); + } else { + nd = utils.mpNormalize(p.data); + } + if (nd.toString('binary') !== + p.data.toString('binary')) { + p.data = nd; + normalized = false; + } + } + } + + if (normalized) + key._rfc4253Cache = sshbuf.toBuffer(); + + if (partial && typeof (partial) === 'object') { + partial.remainder = sshbuf.remainder(); + partial.consumed = sshbuf._offset; + } + + return (new Constructor(key)); +} + +function write(key, options) { + assert.object(key); + + var alg = keyTypeToAlg(key); + var i; + + var algInfo = algs.info[key.type]; + if (PrivateKey.isPrivateKey(key)) + algInfo = algs.privInfo[key.type]; + var parts = algInfo.parts; + + var buf = new SSHBuffer({}); + + buf.writeString(alg); + + for (i = 0; i < parts.length; ++i) { + var data = key.part[parts[i]].data; + if (algInfo.normalize !== false) { + if (key.type === 'ed25519') + data = utils.zeroPadToLength(data, 32); + else + data = utils.mpNormalize(data); + } + if (key.type === 'ed25519' && parts[i] === 'k') + data = Buffer.concat([data, key.part.A.data]); + buf.writeBuffer(data); + } + + return (buf.toBuffer()); +} diff --git a/node_modules/sshpk/lib/formats/ssh-private.js b/node_modules/sshpk/lib/formats/ssh-private.js new file mode 100644 index 0000000..5e7eed8 --- /dev/null +++ b/node_modules/sshpk/lib/formats/ssh-private.js @@ -0,0 +1,262 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + readSSHPrivate: readSSHPrivate, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var crypto = require('crypto'); + +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var rfc4253 = require('./rfc4253'); +var SSHBuffer = require('../ssh-buffer'); +var errors = require('../errors'); + +var bcrypt; + +function read(buf, options) { + return (pem.read(buf, options)); +} + +var MAGIC = 'openssh-key-v1'; + +function readSSHPrivate(type, buf, options) { + buf = new SSHBuffer({buffer: buf}); + + var magic = buf.readCString(); + assert.strictEqual(magic, MAGIC, 'bad magic string'); + + var cipher = buf.readString(); + var kdf = buf.readString(); + var kdfOpts = buf.readBuffer(); + + var nkeys = buf.readInt(); + if (nkeys !== 1) { + throw (new Error('OpenSSH-format key file contains ' + + 'multiple keys: this is unsupported.')); + } + + var pubKey = buf.readBuffer(); + + if (type === 'public') { + assert.ok(buf.atEnd(), 'excess bytes left after key'); + return (rfc4253.read(pubKey)); + } + + var privKeyBlob = buf.readBuffer(); + assert.ok(buf.atEnd(), 'excess bytes left after key'); + + var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts }); + switch (kdf) { + case 'none': + if (cipher !== 'none') { + throw (new Error('OpenSSH-format key uses KDF "none" ' + + 'but specifies a cipher other than "none"')); + } + break; + case 'bcrypt': + var salt = kdfOptsBuf.readBuffer(); + var rounds = kdfOptsBuf.readInt(); + var cinf = utils.opensshCipherInfo(cipher); + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from(options.passphrase, + 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'OpenSSH')); + } + + var pass = new Uint8Array(options.passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = Buffer.from(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + var cipherStream = crypto.createDecipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(privKeyBlob); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privKeyBlob = Buffer.concat(chunks); + break; + default: + throw (new Error( + 'OpenSSH-format key uses unknown KDF "' + kdf + '"')); + } + + buf = new SSHBuffer({buffer: privKeyBlob}); + + var checkInt1 = buf.readInt(); + var checkInt2 = buf.readInt(); + if (checkInt1 !== checkInt2) { + throw (new Error('Incorrect passphrase supplied, could not ' + + 'decrypt key')); + } + + var ret = {}; + var key = rfc4253.readInternal(ret, 'private', buf.remainder()); + + buf.skip(ret.consumed); + + var comment = buf.readString(); + key.comment = comment; + + return (key); +} + +function write(key, options) { + var pubKey; + if (PrivateKey.isPrivateKey(key)) + pubKey = key.toPublic(); + else + pubKey = key; + + var cipher = 'none'; + var kdf = 'none'; + var kdfopts = Buffer.alloc(0); + var cinf = { blockSize: 8 }; + var passphrase; + if (options !== undefined) { + passphrase = options.passphrase; + if (typeof (passphrase) === 'string') + passphrase = Buffer.from(passphrase, 'utf-8'); + if (passphrase !== undefined) { + assert.buffer(passphrase, 'options.passphrase'); + assert.optionalString(options.cipher, 'options.cipher'); + cipher = options.cipher; + if (cipher === undefined) + cipher = 'aes128-ctr'; + cinf = utils.opensshCipherInfo(cipher); + kdf = 'bcrypt'; + } + } + + var privBuf; + if (PrivateKey.isPrivateKey(key)) { + privBuf = new SSHBuffer({}); + var checkInt = crypto.randomBytes(4).readUInt32BE(0); + privBuf.writeInt(checkInt); + privBuf.writeInt(checkInt); + privBuf.write(key.toBuffer('rfc4253')); + privBuf.writeString(key.comment || ''); + + var n = 1; + while (privBuf._offset % cinf.blockSize !== 0) + privBuf.writeChar(n++); + privBuf = privBuf.toBuffer(); + } + + switch (kdf) { + case 'none': + break; + case 'bcrypt': + var salt = crypto.randomBytes(16); + var rounds = 16; + var kdfssh = new SSHBuffer({}); + kdfssh.writeBuffer(salt); + kdfssh.writeInt(rounds); + kdfopts = kdfssh.toBuffer(); + + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + var pass = new Uint8Array(passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = Buffer.from(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + + var cipherStream = crypto.createCipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + throw (e); + }); + cipherStream.write(privBuf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privBuf = Buffer.concat(chunks); + break; + default: + throw (new Error('Unsupported kdf ' + kdf)); + } + + var buf = new SSHBuffer({}); + + buf.writeCString(MAGIC); + buf.writeString(cipher); /* cipher */ + buf.writeString(kdf); /* kdf */ + buf.writeBuffer(kdfopts); /* kdfoptions */ + + buf.writeInt(1); /* nkeys */ + buf.writeBuffer(pubKey.toBuffer('rfc4253')); + + if (privBuf) + buf.writeBuffer(privBuf); + + buf = buf.toBuffer(); + + var header; + if (PrivateKey.isPrivateKey(key)) + header = 'OPENSSH PRIVATE KEY'; + else + header = 'OPENSSH PUBLIC KEY'; + + var tmp = buf.toString('base64'); + var len = tmp.length + (tmp.length / 70) + + 18 + 16 + header.length*2 + 10; + buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 70; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/node_modules/sshpk/lib/formats/ssh.js b/node_modules/sshpk/lib/formats/ssh.js new file mode 100644 index 0000000..c8e9c93 --- /dev/null +++ b/node_modules/sshpk/lib/formats/ssh.js @@ -0,0 +1,115 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var rfc4253 = require('./rfc4253'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var sshpriv = require('./ssh-private'); + +/*JSSTYLED*/ +var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/; +/*JSSTYLED*/ +var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/; + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var trimmed = buf.trim().replace(/[\\\r]/g, ''); + var m = trimmed.match(SSHKEY_RE); + if (!m) + m = trimmed.match(SSHKEY_RE2); + assert.ok(m, 'key must match regex'); + + var type = rfc4253.algToKeyType(m[1]); + var kbuf = Buffer.from(m[2], 'base64'); + + /* + * This is a bit tricky. If we managed to parse the key and locate the + * key comment with the regex, then do a non-partial read and assert + * that we have consumed all bytes. If we couldn't locate the key + * comment, though, there may be whitespace shenanigans going on that + * have conjoined the comment to the rest of the key. We do a partial + * read in this case to try to make the best out of a sorry situation. + */ + var key; + var ret = {}; + if (m[4]) { + try { + key = rfc4253.read(kbuf); + + } catch (e) { + m = trimmed.match(SSHKEY_RE2); + assert.ok(m, 'key must match regex'); + kbuf = Buffer.from(m[2], 'base64'); + key = rfc4253.readInternal(ret, 'public', kbuf); + } + } else { + key = rfc4253.readInternal(ret, 'public', kbuf); + } + + assert.strictEqual(type, key.type); + + if (m[4] && m[4].length > 0) { + key.comment = m[4]; + + } else if (ret.consumed) { + /* + * Now the magic: trying to recover the key comment when it's + * gotten conjoined to the key or otherwise shenanigan'd. + * + * Work out how much base64 we used, then drop all non-base64 + * chars from the beginning up to this point in the the string. + * Then offset in this and try to make up for missing = chars. + */ + var data = m[2] + (m[3] ? m[3] : ''); + var realOffset = Math.ceil(ret.consumed / 3) * 4; + data = data.slice(0, realOffset - 2). /*JSSTYLED*/ + replace(/[^a-zA-Z0-9+\/=]/g, '') + + data.slice(realOffset - 2); + + var padding = ret.consumed % 3; + if (padding > 0 && + data.slice(realOffset - 1, realOffset) !== '=') + realOffset--; + while (data.slice(realOffset, realOffset + 1) === '=') + realOffset++; + + /* Finally, grab what we think is the comment & clean it up. */ + var trailer = data.slice(realOffset); + trailer = trailer.replace(/[\r\n]/g, ' '). + replace(/^\s+/, ''); + if (trailer.match(/^[a-zA-Z0-9]/)) + key.comment = trailer; + } + + return (key); +} + +function write(key, options) { + assert.object(key); + if (!Key.isKey(key)) + throw (new Error('Must be a public key')); + + var parts = []; + var alg = rfc4253.keyTypeToAlg(key); + parts.push(alg); + + var buf = rfc4253.write(key); + parts.push(buf.toString('base64')); + + if (key.comment) + parts.push(key.comment); + + return (Buffer.from(parts.join(' '))); +} diff --git a/node_modules/sshpk/lib/formats/x509-pem.js b/node_modules/sshpk/lib/formats/x509-pem.js new file mode 100644 index 0000000..3155ef0 --- /dev/null +++ b/node_modules/sshpk/lib/formats/x509-pem.js @@ -0,0 +1,88 @@ +// Copyright 2016 Joyent, Inc. + +var x509 = require('./x509'); + +module.exports = { + read: read, + verify: x509.verify, + sign: x509.sign, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var Identity = require('../identity'); +var Signature = require('../signature'); +var Certificate = require('../certificate'); + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var lines = buf.trim().split(/[\r\n]+/g); + + var m; + var si = -1; + while (!m && si < lines.length) { + m = lines[++si].match(/*JSSTYLED*/ + /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/); + } + assert.ok(m, 'invalid PEM header'); + + var m2; + var ei = lines.length; + while (!m2 && ei > 0) { + m2 = lines[--ei].match(/*JSSTYLED*/ + /[-]+[ ]*END CERTIFICATE[ ]*[-]+/); + } + assert.ok(m2, 'invalid PEM footer'); + + lines = lines.slice(si, ei + 1); + + var headers = {}; + while (true) { + lines = lines.slice(1); + m = lines[0].match(/*JSSTYLED*/ + /^([A-Za-z0-9-]+): (.+)$/); + if (!m) + break; + headers[m[1].toLowerCase()] = m[2]; + } + + /* Chop off the first and last lines */ + lines = lines.slice(0, -1).join(''); + buf = Buffer.from(lines, 'base64'); + + return (x509.read(buf, options)); +} + +function write(cert, options) { + var dbuf = x509.write(cert, options); + + var header = 'CERTIFICATE'; + var tmp = dbuf.toString('base64'); + var len = tmp.length + (tmp.length / 64) + + 18 + 16 + header.length*2 + 10; + var buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 64; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/node_modules/sshpk/lib/formats/x509.js b/node_modules/sshpk/lib/formats/x509.js new file mode 100644 index 0000000..0144c44 --- /dev/null +++ b/node_modules/sshpk/lib/formats/x509.js @@ -0,0 +1,752 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + verify: verify, + sign: sign, + signAsync: signAsync, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var Identity = require('../identity'); +var Signature = require('../signature'); +var Certificate = require('../certificate'); +var pkcs8 = require('./pkcs8'); + +/* + * This file is based on RFC5280 (X.509). + */ + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function verify(cert, key) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + var algParts = sig.algo.split('-'); + if (algParts[0] !== key.type) + return (false); + + var blob = sig.cache; + if (blob === undefined) { + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + blob = der.buffer; + } + + var verifier = key.createVerify(algParts[1]); + verifier.write(blob); + return (verifier.verify(sig.signature)); +} + +function Local(i) { + return (asn1.Ber.Context | asn1.Ber.Constructor | i); +} + +function Context(i) { + return (asn1.Ber.Context | i); +} + +var SIGN_ALGS = { + 'rsa-md5': '1.2.840.113549.1.1.4', + 'rsa-sha1': '1.2.840.113549.1.1.5', + 'rsa-sha256': '1.2.840.113549.1.1.11', + 'rsa-sha384': '1.2.840.113549.1.1.12', + 'rsa-sha512': '1.2.840.113549.1.1.13', + 'dsa-sha1': '1.2.840.10040.4.3', + 'dsa-sha256': '2.16.840.1.101.3.4.3.2', + 'ecdsa-sha1': '1.2.840.10045.4.1', + 'ecdsa-sha256': '1.2.840.10045.4.3.2', + 'ecdsa-sha384': '1.2.840.10045.4.3.3', + 'ecdsa-sha512': '1.2.840.10045.4.3.4', + 'ed25519-sha512': '1.3.101.112' +}; +Object.keys(SIGN_ALGS).forEach(function (k) { + SIGN_ALGS[SIGN_ALGS[k]] = k; +}); +SIGN_ALGS['1.3.14.3.2.3'] = 'rsa-md5'; +SIGN_ALGS['1.3.14.3.2.29'] = 'rsa-sha1'; + +var EXTS = { + 'issuerKeyId': '2.5.29.35', + 'altName': '2.5.29.17', + 'basicConstraints': '2.5.29.19', + 'keyUsage': '2.5.29.15', + 'extKeyUsage': '2.5.29.37' +}; + +function read(buf, options) { + if (typeof (buf) === 'string') { + buf = Buffer.from(buf, 'binary'); + } + assert.buffer(buf, 'buf'); + + var der = new asn1.BerReader(buf); + + der.readSequence(); + if (Math.abs(der.length - der.remain) > 1) { + throw (new Error('DER sequence does not contain whole byte ' + + 'stream')); + } + + var tbsStart = der.offset; + der.readSequence(); + var sigOffset = der.offset + der.length; + var tbsEnd = sigOffset; + + if (der.peek() === Local(0)) { + der.readSequence(Local(0)); + var version = der.readInt(); + assert.ok(version <= 3, + 'only x.509 versions up to v3 supported'); + } + + var cert = {}; + cert.signatures = {}; + var sig = (cert.signatures.x509 = {}); + sig.extras = {}; + + cert.serial = readMPInt(der, 'serial'); + + der.readSequence(); + var after = der.offset + der.length; + var certAlgOid = der.readOID(); + var certAlg = SIGN_ALGS[certAlgOid]; + if (certAlg === undefined) + throw (new Error('unknown signature algorithm ' + certAlgOid)); + + der._offset = after; + cert.issuer = Identity.parseAsn1(der); + + der.readSequence(); + cert.validFrom = readDate(der); + cert.validUntil = readDate(der); + + cert.subjects = [Identity.parseAsn1(der)]; + + der.readSequence(); + after = der.offset + der.length; + cert.subjectKey = pkcs8.readPkcs8(undefined, 'public', der); + der._offset = after; + + /* issuerUniqueID */ + if (der.peek() === Local(1)) { + der.readSequence(Local(1)); + sig.extras.issuerUniqueID = + buf.slice(der.offset, der.offset + der.length); + der._offset += der.length; + } + + /* subjectUniqueID */ + if (der.peek() === Local(2)) { + der.readSequence(Local(2)); + sig.extras.subjectUniqueID = + buf.slice(der.offset, der.offset + der.length); + der._offset += der.length; + } + + /* extensions */ + if (der.peek() === Local(3)) { + der.readSequence(Local(3)); + var extEnd = der.offset + der.length; + der.readSequence(); + + while (der.offset < extEnd) + readExtension(cert, buf, der); + + assert.strictEqual(der.offset, extEnd); + } + + assert.strictEqual(der.offset, sigOffset); + + der.readSequence(); + after = der.offset + der.length; + var sigAlgOid = der.readOID(); + var sigAlg = SIGN_ALGS[sigAlgOid]; + if (sigAlg === undefined) + throw (new Error('unknown signature algorithm ' + sigAlgOid)); + der._offset = after; + + var sigData = der.readString(asn1.Ber.BitString, true); + if (sigData[0] === 0) + sigData = sigData.slice(1); + var algParts = sigAlg.split('-'); + + sig.signature = Signature.parse(sigData, algParts[0], 'asn1'); + sig.signature.hashAlgorithm = algParts[1]; + sig.algo = sigAlg; + sig.cache = buf.slice(tbsStart, tbsEnd); + + return (new Certificate(cert)); +} + +function readDate(der) { + if (der.peek() === asn1.Ber.UTCTime) { + return (utcTimeToDate(der.readString(asn1.Ber.UTCTime))); + } else if (der.peek() === asn1.Ber.GeneralizedTime) { + return (gTimeToDate(der.readString(asn1.Ber.GeneralizedTime))); + } else { + throw (new Error('Unsupported date format')); + } +} + +function writeDate(der, date) { + if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) { + der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime); + } else { + der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime); + } +} + +/* RFC5280, section 4.2.1.6 (GeneralName type) */ +var ALTNAME = { + OtherName: Local(0), + RFC822Name: Context(1), + DNSName: Context(2), + X400Address: Local(3), + DirectoryName: Local(4), + EDIPartyName: Local(5), + URI: Context(6), + IPAddress: Context(7), + OID: Context(8) +}; + +/* RFC5280, section 4.2.1.12 (KeyPurposeId) */ +var EXTPURPOSE = { + 'serverAuth': '1.3.6.1.5.5.7.3.1', + 'clientAuth': '1.3.6.1.5.5.7.3.2', + 'codeSigning': '1.3.6.1.5.5.7.3.3', + + /* See https://github.com/joyent/oid-docs/blob/master/root.md */ + 'joyentDocker': '1.3.6.1.4.1.38678.1.4.1', + 'joyentCmon': '1.3.6.1.4.1.38678.1.4.2' +}; +var EXTPURPOSE_REV = {}; +Object.keys(EXTPURPOSE).forEach(function (k) { + EXTPURPOSE_REV[EXTPURPOSE[k]] = k; +}); + +var KEYUSEBITS = [ + 'signature', 'identity', 'keyEncryption', + 'encryption', 'keyAgreement', 'ca', 'crl' +]; + +function readExtension(cert, buf, der) { + der.readSequence(); + var after = der.offset + der.length; + var extId = der.readOID(); + var id; + var sig = cert.signatures.x509; + if (!sig.extras.exts) + sig.extras.exts = []; + + var critical; + if (der.peek() === asn1.Ber.Boolean) + critical = der.readBoolean(); + + switch (extId) { + case (EXTS.basicConstraints): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + var bcEnd = der.offset + der.length; + var ca = false; + if (der.peek() === asn1.Ber.Boolean) + ca = der.readBoolean(); + if (cert.purposes === undefined) + cert.purposes = []; + if (ca === true) + cert.purposes.push('ca'); + var bc = { oid: extId, critical: critical }; + if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer) + bc.pathLen = der.readInt(); + sig.extras.exts.push(bc); + break; + case (EXTS.extKeyUsage): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + if (cert.purposes === undefined) + cert.purposes = []; + var ekEnd = der.offset + der.length; + while (der.offset < ekEnd) { + var oid = der.readOID(); + cert.purposes.push(EXTPURPOSE_REV[oid] || oid); + } + /* + * This is a bit of a hack: in the case where we have a cert + * that's only allowed to do serverAuth or clientAuth (and not + * the other), we want to make sure all our Subjects are of + * the right type. But we already parsed our Subjects and + * decided if they were hosts or users earlier (since it appears + * first in the cert). + * + * So we go through and mutate them into the right kind here if + * it doesn't match. This might not be hugely beneficial, as it + * seems that single-purpose certs are not often seen in the + * wild. + */ + if (cert.purposes.indexOf('serverAuth') !== -1 && + cert.purposes.indexOf('clientAuth') === -1) { + cert.subjects.forEach(function (ide) { + if (ide.type !== 'host') { + ide.type = 'host'; + ide.hostname = ide.uid || + ide.email || + ide.components[0].value; + } + }); + } else if (cert.purposes.indexOf('clientAuth') !== -1 && + cert.purposes.indexOf('serverAuth') === -1) { + cert.subjects.forEach(function (ide) { + if (ide.type !== 'user') { + ide.type = 'user'; + ide.uid = ide.hostname || + ide.email || + ide.components[0].value; + } + }); + } + sig.extras.exts.push({ oid: extId, critical: critical }); + break; + case (EXTS.keyUsage): + der.readSequence(asn1.Ber.OctetString); + var bits = der.readString(asn1.Ber.BitString, true); + var setBits = readBitField(bits, KEYUSEBITS); + setBits.forEach(function (bit) { + if (cert.purposes === undefined) + cert.purposes = []; + if (cert.purposes.indexOf(bit) === -1) + cert.purposes.push(bit); + }); + sig.extras.exts.push({ oid: extId, critical: critical, + bits: bits }); + break; + case (EXTS.altName): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + var aeEnd = der.offset + der.length; + while (der.offset < aeEnd) { + switch (der.peek()) { + case ALTNAME.OtherName: + case ALTNAME.EDIPartyName: + der.readSequence(); + der._offset += der.length; + break; + case ALTNAME.OID: + der.readOID(ALTNAME.OID); + break; + case ALTNAME.RFC822Name: + /* RFC822 specifies email addresses */ + var email = der.readString(ALTNAME.RFC822Name); + id = Identity.forEmail(email); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + case ALTNAME.DirectoryName: + der.readSequence(ALTNAME.DirectoryName); + id = Identity.parseAsn1(der); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + case ALTNAME.DNSName: + var host = der.readString( + ALTNAME.DNSName); + id = Identity.forHost(host); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + default: + der.readString(der.peek()); + break; + } + } + sig.extras.exts.push({ oid: extId, critical: critical }); + break; + default: + sig.extras.exts.push({ + oid: extId, + critical: critical, + data: der.readString(asn1.Ber.OctetString, true) + }); + break; + } + + der._offset = after; +} + +var UTCTIME_RE = + /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; +function utcTimeToDate(t) { + var m = t.match(UTCTIME_RE); + assert.ok(m, 'timestamps must be in UTC'); + var d = new Date(); + + var thisYear = d.getUTCFullYear(); + var century = Math.floor(thisYear / 100) * 100; + + var year = parseInt(m[1], 10); + if (thisYear % 100 < 50 && year >= 60) + year += (century - 1); + else + year += century; + d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10)); + d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); + if (m[6] && m[6].length > 0) + d.setUTCSeconds(parseInt(m[6], 10)); + return (d); +} + +var GTIME_RE = + /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; +function gTimeToDate(t) { + var m = t.match(GTIME_RE); + assert.ok(m); + var d = new Date(); + + d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1, + parseInt(m[3], 10)); + d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); + if (m[6] && m[6].length > 0) + d.setUTCSeconds(parseInt(m[6], 10)); + return (d); +} + +function zeroPad(n, m) { + if (m === undefined) + m = 2; + var s = '' + n; + while (s.length < m) + s = '0' + s; + return (s); +} + +function dateToUTCTime(d) { + var s = ''; + s += zeroPad(d.getUTCFullYear() % 100); + s += zeroPad(d.getUTCMonth() + 1); + s += zeroPad(d.getUTCDate()); + s += zeroPad(d.getUTCHours()); + s += zeroPad(d.getUTCMinutes()); + s += zeroPad(d.getUTCSeconds()); + s += 'Z'; + return (s); +} + +function dateToGTime(d) { + var s = ''; + s += zeroPad(d.getUTCFullYear(), 4); + s += zeroPad(d.getUTCMonth() + 1); + s += zeroPad(d.getUTCDate()); + s += zeroPad(d.getUTCHours()); + s += zeroPad(d.getUTCMinutes()); + s += zeroPad(d.getUTCSeconds()); + s += 'Z'; + return (s); +} + +function sign(cert, key) { + if (cert.signatures.x509 === undefined) + cert.signatures.x509 = {}; + var sig = cert.signatures.x509; + + sig.algo = key.type + '-' + key.defaultHashAlgorithm(); + if (SIGN_ALGS[sig.algo] === undefined) + return (false); + + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + var blob = der.buffer; + sig.cache = blob; + + var signer = key.createSign(); + signer.write(blob); + cert.signatures.x509.signature = signer.sign(); + + return (true); +} + +function signAsync(cert, signer, done) { + if (cert.signatures.x509 === undefined) + cert.signatures.x509 = {}; + var sig = cert.signatures.x509; + + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + var blob = der.buffer; + sig.cache = blob; + + signer(blob, function (err, signature) { + if (err) { + done(err); + return; + } + sig.algo = signature.type + '-' + signature.hashAlgorithm; + if (SIGN_ALGS[sig.algo] === undefined) { + done(new Error('Invalid signing algorithm "' + + sig.algo + '"')); + return; + } + sig.signature = signature; + done(); + }); +} + +function write(cert, options) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + var der = new asn1.BerWriter(); + der.startSequence(); + if (sig.cache) { + der._ensure(sig.cache.length); + sig.cache.copy(der._buf, der._offset); + der._offset += sig.cache.length; + } else { + writeTBSCert(cert, der); + } + + der.startSequence(); + der.writeOID(SIGN_ALGS[sig.algo]); + if (sig.algo.match(/^rsa-/)) + der.writeNull(); + der.endSequence(); + + var sigData = sig.signature.toBuffer('asn1'); + var data = Buffer.alloc(sigData.length + 1); + data[0] = 0; + sigData.copy(data, 1); + der.writeBuffer(data, asn1.Ber.BitString); + der.endSequence(); + + return (der.buffer); +} + +function writeTBSCert(cert, der) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + der.startSequence(); + + der.startSequence(Local(0)); + der.writeInt(2); + der.endSequence(); + + der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer); + + der.startSequence(); + der.writeOID(SIGN_ALGS[sig.algo]); + if (sig.algo.match(/^rsa-/)) + der.writeNull(); + der.endSequence(); + + cert.issuer.toAsn1(der); + + der.startSequence(); + writeDate(der, cert.validFrom); + writeDate(der, cert.validUntil); + der.endSequence(); + + var subject = cert.subjects[0]; + var altNames = cert.subjects.slice(1); + subject.toAsn1(der); + + pkcs8.writePkcs8(der, cert.subjectKey); + + if (sig.extras && sig.extras.issuerUniqueID) { + der.writeBuffer(sig.extras.issuerUniqueID, Local(1)); + } + + if (sig.extras && sig.extras.subjectUniqueID) { + der.writeBuffer(sig.extras.subjectUniqueID, Local(2)); + } + + if (altNames.length > 0 || subject.type === 'host' || + (cert.purposes !== undefined && cert.purposes.length > 0) || + (sig.extras && sig.extras.exts)) { + der.startSequence(Local(3)); + der.startSequence(); + + var exts = []; + if (cert.purposes !== undefined && cert.purposes.length > 0) { + exts.push({ + oid: EXTS.basicConstraints, + critical: true + }); + exts.push({ + oid: EXTS.keyUsage, + critical: true + }); + exts.push({ + oid: EXTS.extKeyUsage, + critical: true + }); + } + exts.push({ oid: EXTS.altName }); + if (sig.extras && sig.extras.exts) + exts = sig.extras.exts; + + for (var i = 0; i < exts.length; ++i) { + der.startSequence(); + der.writeOID(exts[i].oid); + + if (exts[i].critical !== undefined) + der.writeBoolean(exts[i].critical); + + if (exts[i].oid === EXTS.altName) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + if (subject.type === 'host') { + der.writeString(subject.hostname, + Context(2)); + } + for (var j = 0; j < altNames.length; ++j) { + if (altNames[j].type === 'host') { + der.writeString( + altNames[j].hostname, + ALTNAME.DNSName); + } else if (altNames[j].type === + 'email') { + der.writeString( + altNames[j].email, + ALTNAME.RFC822Name); + } else { + /* + * Encode anything else as a + * DN style name for now. + */ + der.startSequence( + ALTNAME.DirectoryName); + altNames[j].toAsn1(der); + der.endSequence(); + } + } + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.basicConstraints) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + var ca = (cert.purposes.indexOf('ca') !== -1); + var pathLen = exts[i].pathLen; + der.writeBoolean(ca); + if (pathLen !== undefined) + der.writeInt(pathLen); + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.extKeyUsage) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + cert.purposes.forEach(function (purpose) { + if (purpose === 'ca') + return; + if (KEYUSEBITS.indexOf(purpose) !== -1) + return; + var oid = purpose; + if (EXTPURPOSE[purpose] !== undefined) + oid = EXTPURPOSE[purpose]; + der.writeOID(oid); + }); + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.keyUsage) { + der.startSequence(asn1.Ber.OctetString); + /* + * If we parsed this certificate from a byte + * stream (i.e. we didn't generate it in sshpk) + * then we'll have a ".bits" property on the + * ext with the original raw byte contents. + * + * If we have this, use it here instead of + * regenerating it. This guarantees we output + * the same data we parsed, so signatures still + * validate. + */ + if (exts[i].bits !== undefined) { + der.writeBuffer(exts[i].bits, + asn1.Ber.BitString); + } else { + var bits = writeBitField(cert.purposes, + KEYUSEBITS); + der.writeBuffer(bits, + asn1.Ber.BitString); + } + der.endSequence(); + } else { + der.writeBuffer(exts[i].data, + asn1.Ber.OctetString); + } + + der.endSequence(); + } + + der.endSequence(); + der.endSequence(); + } + + der.endSequence(); +} + +/* + * Reads an ASN.1 BER bitfield out of the Buffer produced by doing + * `BerReader#readString(asn1.Ber.BitString)`. That function gives us the raw + * contents of the BitString tag, which is a count of unused bits followed by + * the bits as a right-padded byte string. + * + * `bits` is the Buffer, `bitIndex` should contain an array of string names + * for the bits in the string, ordered starting with bit #0 in the ASN.1 spec. + * + * Returns an array of Strings, the names of the bits that were set to 1. + */ +function readBitField(bits, bitIndex) { + var bitLen = 8 * (bits.length - 1) - bits[0]; + var setBits = {}; + for (var i = 0; i < bitLen; ++i) { + var byteN = 1 + Math.floor(i / 8); + var bit = 7 - (i % 8); + var mask = 1 << bit; + var bitVal = ((bits[byteN] & mask) !== 0); + var name = bitIndex[i]; + if (bitVal && typeof (name) === 'string') { + setBits[name] = true; + } + } + return (Object.keys(setBits)); +} + +/* + * `setBits` is an array of strings, containing the names for each bit that + * sould be set to 1. `bitIndex` is same as in `readBitField()`. + * + * Returns a Buffer, ready to be written out with `BerWriter#writeString()`. + */ +function writeBitField(setBits, bitIndex) { + var bitLen = bitIndex.length; + var blen = Math.ceil(bitLen / 8); + var unused = blen * 8 - bitLen; + var bits = Buffer.alloc(1 + blen); // zero-filled + bits[0] = unused; + for (var i = 0; i < bitLen; ++i) { + var byteN = 1 + Math.floor(i / 8); + var bit = 7 - (i % 8); + var mask = 1 << bit; + var name = bitIndex[i]; + if (name === undefined) + continue; + var bitVal = (setBits.indexOf(name) !== -1); + if (bitVal) { + bits[byteN] |= mask; + } + } + return (bits); +} diff --git a/node_modules/sshpk/lib/identity.js b/node_modules/sshpk/lib/identity.js new file mode 100644 index 0000000..7d75b66 --- /dev/null +++ b/node_modules/sshpk/lib/identity.js @@ -0,0 +1,373 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = Identity; + +var assert = require('assert-plus'); +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; + +/*JSSTYLED*/ +var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i; + +var oids = {}; +oids.cn = '2.5.4.3'; +oids.o = '2.5.4.10'; +oids.ou = '2.5.4.11'; +oids.l = '2.5.4.7'; +oids.s = '2.5.4.8'; +oids.c = '2.5.4.6'; +oids.sn = '2.5.4.4'; +oids.postalCode = '2.5.4.17'; +oids.serialNumber = '2.5.4.5'; +oids.street = '2.5.4.9'; +oids.x500UniqueIdentifier = '2.5.4.45'; +oids.role = '2.5.4.72'; +oids.telephoneNumber = '2.5.4.20'; +oids.description = '2.5.4.13'; +oids.dc = '0.9.2342.19200300.100.1.25'; +oids.uid = '0.9.2342.19200300.100.1.1'; +oids.mail = '0.9.2342.19200300.100.1.3'; +oids.title = '2.5.4.12'; +oids.gn = '2.5.4.42'; +oids.initials = '2.5.4.43'; +oids.pseudonym = '2.5.4.65'; +oids.emailAddress = '1.2.840.113549.1.9.1'; + +var unoids = {}; +Object.keys(oids).forEach(function (k) { + unoids[oids[k]] = k; +}); + +function Identity(opts) { + var self = this; + assert.object(opts, 'options'); + assert.arrayOfObject(opts.components, 'options.components'); + this.components = opts.components; + this.componentLookup = {}; + this.components.forEach(function (c) { + if (c.name && !c.oid) + c.oid = oids[c.name]; + if (c.oid && !c.name) + c.name = unoids[c.oid]; + if (self.componentLookup[c.name] === undefined) + self.componentLookup[c.name] = []; + self.componentLookup[c.name].push(c); + }); + if (this.componentLookup.cn && this.componentLookup.cn.length > 0) { + this.cn = this.componentLookup.cn[0].value; + } + assert.optionalString(opts.type, 'options.type'); + if (opts.type === undefined) { + if (this.components.length === 1 && + this.componentLookup.cn && + this.componentLookup.cn.length === 1 && + this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { + this.type = 'host'; + this.hostname = this.componentLookup.cn[0].value; + + } else if (this.componentLookup.dc && + this.components.length === this.componentLookup.dc.length) { + this.type = 'host'; + this.hostname = this.componentLookup.dc.map( + function (c) { + return (c.value); + }).join('.'); + + } else if (this.componentLookup.uid && + this.components.length === + this.componentLookup.uid.length) { + this.type = 'user'; + this.uid = this.componentLookup.uid[0].value; + + } else if (this.componentLookup.cn && + this.componentLookup.cn.length === 1 && + this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { + this.type = 'host'; + this.hostname = this.componentLookup.cn[0].value; + + } else if (this.componentLookup.uid && + this.componentLookup.uid.length === 1) { + this.type = 'user'; + this.uid = this.componentLookup.uid[0].value; + + } else if (this.componentLookup.mail && + this.componentLookup.mail.length === 1) { + this.type = 'email'; + this.email = this.componentLookup.mail[0].value; + + } else if (this.componentLookup.cn && + this.componentLookup.cn.length === 1) { + this.type = 'user'; + this.uid = this.componentLookup.cn[0].value; + + } else { + this.type = 'unknown'; + } + } else { + this.type = opts.type; + if (this.type === 'host') + this.hostname = opts.hostname; + else if (this.type === 'user') + this.uid = opts.uid; + else if (this.type === 'email') + this.email = opts.email; + else + throw (new Error('Unknown type ' + this.type)); + } +} + +Identity.prototype.toString = function () { + return (this.components.map(function (c) { + var n = c.name.toUpperCase(); + /*JSSTYLED*/ + n = n.replace(/=/g, '\\='); + var v = c.value; + /*JSSTYLED*/ + v = v.replace(/,/g, '\\,'); + return (n + '=' + v); + }).join(', ')); +}; + +Identity.prototype.get = function (name, asArray) { + assert.string(name, 'name'); + var arr = this.componentLookup[name]; + if (arr === undefined || arr.length === 0) + return (undefined); + if (!asArray && arr.length > 1) + throw (new Error('Multiple values for attribute ' + name)); + if (!asArray) + return (arr[0].value); + return (arr.map(function (c) { + return (c.value); + })); +}; + +Identity.prototype.toArray = function (idx) { + return (this.components.map(function (c) { + return ({ + name: c.name, + value: c.value + }); + })); +}; + +/* + * These are from X.680 -- PrintableString allowed chars are in section 37.4 + * table 8. Spec for IA5Strings is "1,6 + SPACE + DEL" where 1 refers to + * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006 + * (the basic ASCII character set). + */ +/* JSSTYLED */ +var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/; +/* JSSTYLED */ +var NOT_IA5 = /[^\x00-\x7f]/; + +Identity.prototype.toAsn1 = function (der, tag) { + der.startSequence(tag); + this.components.forEach(function (c) { + der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set); + der.startSequence(); + der.writeOID(c.oid); + /* + * If we fit in a PrintableString, use that. Otherwise use an + * IA5String or UTF8String. + * + * If this identity was parsed from a DN, use the ASN.1 types + * from the original representation (otherwise this might not + * be a full match for the original in some validators). + */ + if (c.asn1type === asn1.Ber.Utf8String || + c.value.match(NOT_IA5)) { + var v = Buffer.from(c.value, 'utf8'); + der.writeBuffer(v, asn1.Ber.Utf8String); + + } else if (c.asn1type === asn1.Ber.IA5String || + c.value.match(NOT_PRINTABLE)) { + der.writeString(c.value, asn1.Ber.IA5String); + + } else { + var type = asn1.Ber.PrintableString; + if (c.asn1type !== undefined) + type = c.asn1type; + der.writeString(c.value, type); + } + der.endSequence(); + der.endSequence(); + }); + der.endSequence(); +}; + +function globMatch(a, b) { + if (a === '**' || b === '**') + return (true); + var aParts = a.split('.'); + var bParts = b.split('.'); + if (aParts.length !== bParts.length) + return (false); + for (var i = 0; i < aParts.length; ++i) { + if (aParts[i] === '*' || bParts[i] === '*') + continue; + if (aParts[i] !== bParts[i]) + return (false); + } + return (true); +} + +Identity.prototype.equals = function (other) { + if (!Identity.isIdentity(other, [1, 0])) + return (false); + if (other.components.length !== this.components.length) + return (false); + for (var i = 0; i < this.components.length; ++i) { + if (this.components[i].oid !== other.components[i].oid) + return (false); + if (!globMatch(this.components[i].value, + other.components[i].value)) { + return (false); + } + } + return (true); +}; + +Identity.forHost = function (hostname) { + assert.string(hostname, 'hostname'); + return (new Identity({ + type: 'host', + hostname: hostname, + components: [ { name: 'cn', value: hostname } ] + })); +}; + +Identity.forUser = function (uid) { + assert.string(uid, 'uid'); + return (new Identity({ + type: 'user', + uid: uid, + components: [ { name: 'uid', value: uid } ] + })); +}; + +Identity.forEmail = function (email) { + assert.string(email, 'email'); + return (new Identity({ + type: 'email', + email: email, + components: [ { name: 'mail', value: email } ] + })); +}; + +Identity.parseDN = function (dn) { + assert.string(dn, 'dn'); + var parts = ['']; + var idx = 0; + var rem = dn; + while (rem.length > 0) { + var m; + /*JSSTYLED*/ + if ((m = /^,/.exec(rem)) !== null) { + parts[++idx] = ''; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^\\,/.exec(rem)) !== null) { + parts[idx] += ','; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^\\./.exec(rem)) !== null) { + parts[idx] += m[0]; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^[^\\,]+/.exec(rem)) !== null) { + parts[idx] += m[0]; + rem = rem.slice(m[0].length); + } else { + throw (new Error('Failed to parse DN')); + } + } + var cmps = parts.map(function (c) { + c = c.trim(); + var eqPos = c.indexOf('='); + while (eqPos > 0 && c.charAt(eqPos - 1) === '\\') + eqPos = c.indexOf('=', eqPos + 1); + if (eqPos === -1) { + throw (new Error('Failed to parse DN')); + } + /*JSSTYLED*/ + var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, '='); + var value = c.slice(eqPos + 1); + return ({ name: name, value: value }); + }); + return (new Identity({ components: cmps })); +}; + +Identity.fromArray = function (components) { + assert.arrayOfObject(components, 'components'); + components.forEach(function (cmp) { + assert.object(cmp, 'component'); + assert.string(cmp.name, 'component.name'); + if (!Buffer.isBuffer(cmp.value) && + !(typeof (cmp.value) === 'string')) { + throw (new Error('Invalid component value')); + } + }); + return (new Identity({ components: components })); +}; + +Identity.parseAsn1 = function (der, top) { + var components = []; + der.readSequence(top); + var end = der.offset + der.length; + while (der.offset < end) { + der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set); + var after = der.offset + der.length; + der.readSequence(); + var oid = der.readOID(); + var type = der.peek(); + var value; + switch (type) { + case asn1.Ber.PrintableString: + case asn1.Ber.IA5String: + case asn1.Ber.OctetString: + case asn1.Ber.T61String: + value = der.readString(type); + break; + case asn1.Ber.Utf8String: + value = der.readString(type, true); + value = value.toString('utf8'); + break; + case asn1.Ber.CharacterString: + case asn1.Ber.BMPString: + value = der.readString(type, true); + value = value.toString('utf16le'); + break; + default: + throw (new Error('Unknown asn1 type ' + type)); + } + components.push({ oid: oid, asn1type: type, value: value }); + der._offset = after; + } + der._offset = end; + return (new Identity({ + components: components + })); +}; + +Identity.isIdentity = function (obj, ver) { + return (utils.isCompatible(obj, Identity, ver)); +}; + +/* + * API versions for Identity: + * [1,0] -- initial ver + */ +Identity.prototype._sshpkApiVersion = [1, 0]; + +Identity._oldVersionDetect = function (obj) { + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/index.js b/node_modules/sshpk/lib/index.js new file mode 100644 index 0000000..f76db79 --- /dev/null +++ b/node_modules/sshpk/lib/index.js @@ -0,0 +1,40 @@ +// Copyright 2015 Joyent, Inc. + +var Key = require('./key'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var PrivateKey = require('./private-key'); +var Certificate = require('./certificate'); +var Identity = require('./identity'); +var errs = require('./errors'); + +module.exports = { + /* top-level classes */ + Key: Key, + parseKey: Key.parse, + Fingerprint: Fingerprint, + parseFingerprint: Fingerprint.parse, + Signature: Signature, + parseSignature: Signature.parse, + PrivateKey: PrivateKey, + parsePrivateKey: PrivateKey.parse, + generatePrivateKey: PrivateKey.generate, + Certificate: Certificate, + parseCertificate: Certificate.parse, + createSelfSignedCertificate: Certificate.createSelfSigned, + createCertificate: Certificate.create, + Identity: Identity, + identityFromDN: Identity.parseDN, + identityForHost: Identity.forHost, + identityForUser: Identity.forUser, + identityForEmail: Identity.forEmail, + identityFromArray: Identity.fromArray, + + /* errors */ + FingerprintFormatError: errs.FingerprintFormatError, + InvalidAlgorithmError: errs.InvalidAlgorithmError, + KeyParseError: errs.KeyParseError, + SignatureParseError: errs.SignatureParseError, + KeyEncryptedError: errs.KeyEncryptedError, + CertificateParseError: errs.CertificateParseError +}; diff --git a/node_modules/sshpk/lib/key.js b/node_modules/sshpk/lib/key.js new file mode 100644 index 0000000..706f834 --- /dev/null +++ b/node_modules/sshpk/lib/key.js @@ -0,0 +1,294 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = Key; + +var assert = require('assert-plus'); +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var DiffieHellman = require('./dhe').DiffieHellman; +var errs = require('./errors'); +var utils = require('./utils'); +var PrivateKey = require('./private-key'); +var edCompat; + +try { + edCompat = require('./ed-compat'); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; + +var formats = {}; +formats['auto'] = require('./formats/auto'); +formats['pem'] = require('./formats/pem'); +formats['pkcs1'] = require('./formats/pkcs1'); +formats['pkcs8'] = require('./formats/pkcs8'); +formats['rfc4253'] = require('./formats/rfc4253'); +formats['ssh'] = require('./formats/ssh'); +formats['ssh-private'] = require('./formats/ssh-private'); +formats['openssh'] = formats['ssh-private']; +formats['dnssec'] = require('./formats/dnssec'); +formats['putty'] = require('./formats/putty'); +formats['ppk'] = formats['putty']; + +function Key(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + assert.optionalString(opts.comment, 'options.comment'); + + var algInfo = algs.info[opts.type]; + if (typeof (algInfo) !== 'object') + throw (new InvalidAlgorithmError(opts.type)); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.parts = opts.parts; + this.part = partLookup; + this.comment = undefined; + this.source = opts.source; + + /* for speeding up hashing/fingerprint operations */ + this._rfc4253Cache = opts._rfc4253Cache; + this._hashCache = {}; + + var sz; + this.curve = undefined; + if (this.type === 'ecdsa') { + var curve = this.part.curve.data.toString(); + this.curve = curve; + sz = algs.curves[curve].size; + } else if (this.type === 'ed25519' || this.type === 'curve25519') { + sz = 256; + this.curve = 'curve25519'; + } else { + var szPart = this.part[algInfo.sizePart]; + sz = szPart.data.length; + sz = sz * 8 - utils.countZeros(szPart.data); + } + this.size = sz; +} + +Key.formats = formats; + +Key.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'ssh'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + if (format === 'rfc4253') { + if (this._rfc4253Cache === undefined) + this._rfc4253Cache = formats['rfc4253'].write(this); + return (this._rfc4253Cache); + } + + return (formats[format].write(this, options)); +}; + +Key.prototype.toString = function (format, options) { + return (this.toBuffer(format, options).toString()); +}; + +Key.prototype.hash = function (algo, type) { + assert.string(algo, 'algorithm'); + assert.optionalString(type, 'type'); + if (type === undefined) + type = 'ssh'; + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + var cacheKey = algo + '||' + type; + if (this._hashCache[cacheKey]) + return (this._hashCache[cacheKey]); + + var buf; + if (type === 'ssh') { + buf = this.toBuffer('rfc4253'); + } else if (type === 'spki') { + buf = formats.pkcs8.pkcs8ToBuffer(this); + } else { + throw (new Error('Hash type ' + type + ' not supported')); + } + var hash = crypto.createHash(algo).update(buf).digest(); + this._hashCache[cacheKey] = hash; + return (hash); +}; + +Key.prototype.fingerprint = function (algo, type) { + if (algo === undefined) + algo = 'sha256'; + if (type === undefined) + type = 'ssh'; + assert.string(algo, 'algorithm'); + assert.string(type, 'type'); + var opts = { + type: 'key', + hash: this.hash(algo, type), + algorithm: algo, + hashType: type + }; + return (new Fingerprint(opts)); +}; + +Key.prototype.defaultHashAlgorithm = function () { + var hashAlgo = 'sha1'; + if (this.type === 'rsa') + hashAlgo = 'sha256'; + if (this.type === 'dsa' && this.size > 1024) + hashAlgo = 'sha256'; + if (this.type === 'ed25519') + hashAlgo = 'sha512'; + if (this.type === 'ecdsa') { + if (this.size <= 256) + hashAlgo = 'sha256'; + else if (this.size <= 384) + hashAlgo = 'sha384'; + else + hashAlgo = 'sha512'; + } + return (hashAlgo); +}; + +Key.prototype.createVerify = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Verifier(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldVerify = v.verify.bind(v); + var key = this.toBuffer('pkcs8'); + var curve = this.curve; + var self = this; + v.verify = function (signature, fmt) { + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== self.type) + return (false); + if (signature.hashAlgorithm && + signature.hashAlgorithm !== hashAlgo) + return (false); + if (signature.curve && self.type === 'ecdsa' && + signature.curve !== curve) + return (false); + return (oldVerify(key, signature.toBuffer('asn1'))); + + } else if (typeof (signature) === 'string' || + Buffer.isBuffer(signature)) { + return (oldVerify(key, signature, fmt)); + + /* + * Avoid doing this on valid arguments, walking the prototype + * chain can be quite slow. + */ + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + + } else { + throw (new TypeError('signature must be a string, ' + + 'Buffer, or Signature object')); + } + }; + return (v); +}; + +Key.prototype.createDiffieHellman = function () { + if (this.type === 'rsa') + throw (new Error('RSA keys do not support Diffie-Hellman')); + + return (new DiffieHellman(this)); +}; +Key.prototype.createDH = Key.prototype.createDiffieHellman; + +Key.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + if (k instanceof PrivateKey) + k = k.toPublic(); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +Key.isKey = function (obj, ver) { + return (utils.isCompatible(obj, Key, ver)); +}; + +/* + * API versions for Key: + * [1,0] -- initial ver, may take Signature for createVerify or may not + * [1,1] -- added pkcs1, pkcs8 formats + * [1,2] -- added auto, ssh-private, openssh formats + * [1,3] -- added defaultHashAlgorithm + * [1,4] -- added ed support, createDH + * [1,5] -- first explicitly tagged version + * [1,6] -- changed ed25519 part names + * [1,7] -- spki hash types + */ +Key.prototype._sshpkApiVersion = [1, 7]; + +Key._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + assert.func(obj.fingerprint); + if (obj.createDH) + return ([1, 4]); + if (obj.defaultHashAlgorithm) + return ([1, 3]); + if (obj.formats['auto']) + return ([1, 2]); + if (obj.formats['pkcs1']) + return ([1, 1]); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/private-key.js b/node_modules/sshpk/lib/private-key.js new file mode 100644 index 0000000..5600838 --- /dev/null +++ b/node_modules/sshpk/lib/private-key.js @@ -0,0 +1,246 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = PrivateKey; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var dhe = require('./dhe'); +var generateECDSA = dhe.generateECDSA; +var generateED25519 = dhe.generateED25519; +var edCompat = require('./ed-compat'); +var nacl = require('tweetnacl'); + +var Key = require('./key'); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; +var KeyEncryptedError = errs.KeyEncryptedError; + +var formats = {}; +formats['auto'] = require('./formats/auto'); +formats['pem'] = require('./formats/pem'); +formats['pkcs1'] = require('./formats/pkcs1'); +formats['pkcs8'] = require('./formats/pkcs8'); +formats['rfc4253'] = require('./formats/rfc4253'); +formats['ssh-private'] = require('./formats/ssh-private'); +formats['openssh'] = formats['ssh-private']; +formats['ssh'] = formats['ssh-private']; +formats['dnssec'] = require('./formats/dnssec'); + +function PrivateKey(opts) { + assert.object(opts, 'options'); + Key.call(this, opts); + + this._pubCache = undefined; +} +util.inherits(PrivateKey, Key); + +PrivateKey.formats = formats; + +PrivateKey.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'pkcs1'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +PrivateKey.prototype.hash = function (algo, type) { + return (this.toPublic().hash(algo, type)); +}; + +PrivateKey.prototype.fingerprint = function (algo, type) { + return (this.toPublic().fingerprint(algo, type)); +}; + +PrivateKey.prototype.toPublic = function () { + if (this._pubCache) + return (this._pubCache); + + var algInfo = algs.info[this.type]; + var pubParts = []; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = algInfo.parts[i]; + pubParts.push(this.part[p]); + } + + this._pubCache = new Key({ + type: this.type, + source: this, + parts: pubParts + }); + if (this.comment) + this._pubCache.comment = this.comment; + return (this._pubCache); +}; + +PrivateKey.prototype.derive = function (newType) { + assert.string(newType, 'type'); + var priv, pub, pair; + + if (this.type === 'ed25519' && newType === 'curve25519') { + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'curve25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } else if (this.type === 'curve25519' && newType === 'ed25519') { + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'ed25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } + throw (new Error('Key derivation not supported from ' + this.type + + ' to ' + newType)); +}; + +PrivateKey.prototype.createVerify = function (hashAlgo) { + return (this.toPublic().createVerify(hashAlgo)); +}; + +PrivateKey.prototype.createSign = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Signer(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldSign = v.sign.bind(v); + var key = this.toBuffer('pkcs1'); + var type = this.type; + var curve = this.curve; + v.sign = function () { + var sig = oldSign(key); + if (typeof (sig) === 'string') + sig = Buffer.from(sig, 'binary'); + sig = Signature.parse(sig, type, 'asn1'); + sig.hashAlgorithm = hashAlgo; + sig.curve = curve; + return (sig); + }; + return (v); +}; + +PrivateKey.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + assert.ok(k instanceof PrivateKey, 'key is not a private key'); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +PrivateKey.isPrivateKey = function (obj, ver) { + return (utils.isCompatible(obj, PrivateKey, ver)); +}; + +PrivateKey.generate = function (type, options) { + if (options === undefined) + options = {}; + assert.object(options, 'options'); + + switch (type) { + case 'ecdsa': + if (options.curve === undefined) + options.curve = 'nistp256'; + assert.string(options.curve, 'options.curve'); + return (generateECDSA(options.curve)); + case 'ed25519': + return (generateED25519()); + default: + throw (new Error('Key generation not supported with key ' + + 'type "' + type + '"')); + } +}; + +/* + * API versions for PrivateKey: + * [1,0] -- initial ver + * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats + * [1,2] -- added defaultHashAlgorithm + * [1,3] -- added derive, ed, createDH + * [1,4] -- first tagged version + * [1,5] -- changed ed25519 part names and format + * [1,6] -- type arguments for hash() and fingerprint() + */ +PrivateKey.prototype._sshpkApiVersion = [1, 6]; + +PrivateKey._oldVersionDetect = function (obj) { + assert.func(obj.toPublic); + assert.func(obj.createSign); + if (obj.derive) + return ([1, 3]); + if (obj.defaultHashAlgorithm) + return ([1, 2]); + if (obj.formats['auto']) + return ([1, 1]); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/signature.js b/node_modules/sshpk/lib/signature.js new file mode 100644 index 0000000..aa8fdbb --- /dev/null +++ b/node_modules/sshpk/lib/signature.js @@ -0,0 +1,314 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = Signature; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var errs = require('./errors'); +var utils = require('./utils'); +var asn1 = require('asn1'); +var SSHBuffer = require('./ssh-buffer'); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var SignatureParseError = errs.SignatureParseError; + +function Signature(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.hashAlgorithm = opts.hashAlgo; + this.curve = opts.curve; + this.parts = opts.parts; + this.part = partLookup; +} + +Signature.prototype.toBuffer = function (format) { + if (format === undefined) + format = 'asn1'; + assert.string(format, 'format'); + + var buf; + var stype = 'ssh-' + this.type; + + switch (this.type) { + case 'rsa': + switch (this.hashAlgorithm) { + case 'sha256': + stype = 'rsa-sha2-256'; + break; + case 'sha512': + stype = 'rsa-sha2-512'; + break; + case 'sha1': + case undefined: + break; + default: + throw (new Error('SSH signature ' + + 'format does not support hash ' + + 'algorithm ' + this.hashAlgorithm)); + } + if (format === 'ssh') { + buf = new SSHBuffer({}); + buf.writeString(stype); + buf.writePart(this.part.sig); + return (buf.toBuffer()); + } else { + return (this.part.sig.data); + } + break; + + case 'ed25519': + if (format === 'ssh') { + buf = new SSHBuffer({}); + buf.writeString(stype); + buf.writePart(this.part.sig); + return (buf.toBuffer()); + } else { + return (this.part.sig.data); + } + break; + + case 'dsa': + case 'ecdsa': + var r, s; + if (format === 'asn1') { + var der = new asn1.BerWriter(); + der.startSequence(); + r = utils.mpNormalize(this.part.r.data); + s = utils.mpNormalize(this.part.s.data); + der.writeBuffer(r, asn1.Ber.Integer); + der.writeBuffer(s, asn1.Ber.Integer); + der.endSequence(); + return (der.buffer); + } else if (format === 'ssh' && this.type === 'dsa') { + buf = new SSHBuffer({}); + buf.writeString('ssh-dss'); + r = this.part.r.data; + if (r.length > 20 && r[0] === 0x00) + r = r.slice(1); + s = this.part.s.data; + if (s.length > 20 && s[0] === 0x00) + s = s.slice(1); + if ((this.hashAlgorithm && + this.hashAlgorithm !== 'sha1') || + r.length + s.length !== 40) { + throw (new Error('OpenSSH only supports ' + + 'DSA signatures with SHA1 hash')); + } + buf.writeBuffer(Buffer.concat([r, s])); + return (buf.toBuffer()); + } else if (format === 'ssh' && this.type === 'ecdsa') { + var inner = new SSHBuffer({}); + r = this.part.r.data; + inner.writeBuffer(r); + inner.writePart(this.part.s); + + buf = new SSHBuffer({}); + /* XXX: find a more proper way to do this? */ + var curve; + if (r[0] === 0x00) + r = r.slice(1); + var sz = r.length * 8; + if (sz === 256) + curve = 'nistp256'; + else if (sz === 384) + curve = 'nistp384'; + else if (sz === 528) + curve = 'nistp521'; + buf.writeString('ecdsa-sha2-' + curve); + buf.writeBuffer(inner.toBuffer()); + return (buf.toBuffer()); + } + throw (new Error('Invalid signature format')); + default: + throw (new Error('Invalid signature data')); + } +}; + +Signature.prototype.toString = function (format) { + assert.optionalString(format, 'format'); + return (this.toBuffer(format).toString('base64')); +}; + +Signature.parse = function (data, type, format) { + if (typeof (data) === 'string') + data = Buffer.from(data, 'base64'); + assert.buffer(data, 'data'); + assert.string(format, 'format'); + assert.string(type, 'type'); + + var opts = {}; + opts.type = type.toLowerCase(); + opts.parts = []; + + try { + assert.ok(data.length > 0, 'signature must not be empty'); + switch (opts.type) { + case 'rsa': + return (parseOneNum(data, type, format, opts)); + case 'ed25519': + return (parseOneNum(data, type, format, opts)); + + case 'dsa': + case 'ecdsa': + if (format === 'asn1') + return (parseDSAasn1(data, type, format, opts)); + else if (opts.type === 'dsa') + return (parseDSA(data, type, format, opts)); + else + return (parseECDSA(data, type, format, opts)); + + default: + throw (new InvalidAlgorithmError(type)); + } + + } catch (e) { + if (e instanceof InvalidAlgorithmError) + throw (e); + throw (new SignatureParseError(type, format, e)); + } +}; + +function parseOneNum(data, type, format, opts) { + if (format === 'ssh') { + try { + var buf = new SSHBuffer({buffer: data}); + var head = buf.readString(); + } catch (e) { + /* fall through */ + } + if (buf !== undefined) { + var msg = 'SSH signature does not match expected ' + + 'type (expected ' + type + ', got ' + head + ')'; + switch (head) { + case 'ssh-rsa': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha1'; + break; + case 'rsa-sha2-256': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha256'; + break; + case 'rsa-sha2-512': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha512'; + break; + case 'ssh-ed25519': + assert.strictEqual(type, 'ed25519', msg); + opts.hashAlgo = 'sha512'; + break; + default: + throw (new Error('Unknown SSH signature ' + + 'type: ' + head)); + } + var sig = buf.readPart(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + sig.name = 'sig'; + opts.parts.push(sig); + return (new Signature(opts)); + } + } + opts.parts.push({name: 'sig', data: data}); + return (new Signature(opts)); +} + +function parseDSAasn1(data, type, format, opts) { + var der = new asn1.BerReader(data); + der.readSequence(); + var r = der.readString(asn1.Ber.Integer, true); + var s = der.readString(asn1.Ber.Integer, true); + + opts.parts.push({name: 'r', data: utils.mpNormalize(r)}); + opts.parts.push({name: 's', data: utils.mpNormalize(s)}); + + return (new Signature(opts)); +} + +function parseDSA(data, type, format, opts) { + if (data.length != 40) { + var buf = new SSHBuffer({buffer: data}); + var d = buf.readBuffer(); + if (d.toString('ascii') === 'ssh-dss') + d = buf.readBuffer(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + assert.strictEqual(d.length, 40, 'invalid inner length'); + data = d; + } + opts.parts.push({name: 'r', data: data.slice(0, 20)}); + opts.parts.push({name: 's', data: data.slice(20, 40)}); + return (new Signature(opts)); +} + +function parseECDSA(data, type, format, opts) { + var buf = new SSHBuffer({buffer: data}); + + var r, s; + var inner = buf.readBuffer(); + var stype = inner.toString('ascii'); + if (stype.slice(0, 6) === 'ecdsa-') { + var parts = stype.split('-'); + assert.strictEqual(parts[0], 'ecdsa'); + assert.strictEqual(parts[1], 'sha2'); + opts.curve = parts[2]; + switch (opts.curve) { + case 'nistp256': + opts.hashAlgo = 'sha256'; + break; + case 'nistp384': + opts.hashAlgo = 'sha384'; + break; + case 'nistp521': + opts.hashAlgo = 'sha512'; + break; + default: + throw (new Error('Unsupported ECDSA curve: ' + + opts.curve)); + } + inner = buf.readBuffer(); + assert.ok(buf.atEnd(), 'extra trailing bytes on outer'); + buf = new SSHBuffer({buffer: inner}); + r = buf.readPart(); + } else { + r = {data: inner}; + } + + s = buf.readPart(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + + r.name = 'r'; + s.name = 's'; + + opts.parts.push(r); + opts.parts.push(s); + return (new Signature(opts)); +} + +Signature.isSignature = function (obj, ver) { + return (utils.isCompatible(obj, Signature, ver)); +}; + +/* + * API versions for Signature: + * [1,0] -- initial ver + * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent + * hashAlgorithm property + * [2,1] -- first tagged version + */ +Signature.prototype._sshpkApiVersion = [2, 1]; + +Signature._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + if (obj.hasOwnProperty('hashAlgorithm')) + return ([2, 0]); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/ssh-buffer.js b/node_modules/sshpk/lib/ssh-buffer.js new file mode 100644 index 0000000..1dd286c --- /dev/null +++ b/node_modules/sshpk/lib/ssh-buffer.js @@ -0,0 +1,149 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = SSHBuffer; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; + +function SSHBuffer(opts) { + assert.object(opts, 'options'); + if (opts.buffer !== undefined) + assert.buffer(opts.buffer, 'options.buffer'); + + this._size = opts.buffer ? opts.buffer.length : 1024; + this._buffer = opts.buffer || Buffer.alloc(this._size); + this._offset = 0; +} + +SSHBuffer.prototype.toBuffer = function () { + return (this._buffer.slice(0, this._offset)); +}; + +SSHBuffer.prototype.atEnd = function () { + return (this._offset >= this._buffer.length); +}; + +SSHBuffer.prototype.remainder = function () { + return (this._buffer.slice(this._offset)); +}; + +SSHBuffer.prototype.skip = function (n) { + this._offset += n; +}; + +SSHBuffer.prototype.expand = function () { + this._size *= 2; + var buf = Buffer.alloc(this._size); + this._buffer.copy(buf, 0); + this._buffer = buf; +}; + +SSHBuffer.prototype.readPart = function () { + return ({data: this.readBuffer()}); +}; + +SSHBuffer.prototype.readBuffer = function () { + var len = this._buffer.readUInt32BE(this._offset); + this._offset += 4; + assert.ok(this._offset + len <= this._buffer.length, + 'length out of bounds at +0x' + this._offset.toString(16) + + ' (data truncated?)'); + var buf = this._buffer.slice(this._offset, this._offset + len); + this._offset += len; + return (buf); +}; + +SSHBuffer.prototype.readString = function () { + return (this.readBuffer().toString()); +}; + +SSHBuffer.prototype.readCString = function () { + var offset = this._offset; + while (offset < this._buffer.length && + this._buffer[offset] !== 0x00) + offset++; + assert.ok(offset < this._buffer.length, 'c string does not terminate'); + var str = this._buffer.slice(this._offset, offset).toString(); + this._offset = offset + 1; + return (str); +}; + +SSHBuffer.prototype.readInt = function () { + var v = this._buffer.readUInt32BE(this._offset); + this._offset += 4; + return (v); +}; + +SSHBuffer.prototype.readInt64 = function () { + assert.ok(this._offset + 8 < this._buffer.length, + 'buffer not long enough to read Int64'); + var v = this._buffer.slice(this._offset, this._offset + 8); + this._offset += 8; + return (v); +}; + +SSHBuffer.prototype.readChar = function () { + var v = this._buffer[this._offset++]; + return (v); +}; + +SSHBuffer.prototype.writeBuffer = function (buf) { + while (this._offset + 4 + buf.length > this._size) + this.expand(); + this._buffer.writeUInt32BE(buf.length, this._offset); + this._offset += 4; + buf.copy(this._buffer, this._offset); + this._offset += buf.length; +}; + +SSHBuffer.prototype.writeString = function (str) { + this.writeBuffer(Buffer.from(str, 'utf8')); +}; + +SSHBuffer.prototype.writeCString = function (str) { + while (this._offset + 1 + str.length > this._size) + this.expand(); + this._buffer.write(str, this._offset); + this._offset += str.length; + this._buffer[this._offset++] = 0; +}; + +SSHBuffer.prototype.writeInt = function (v) { + while (this._offset + 4 > this._size) + this.expand(); + this._buffer.writeUInt32BE(v, this._offset); + this._offset += 4; +}; + +SSHBuffer.prototype.writeInt64 = function (v) { + assert.buffer(v, 'value'); + if (v.length > 8) { + var lead = v.slice(0, v.length - 8); + for (var i = 0; i < lead.length; ++i) { + assert.strictEqual(lead[i], 0, + 'must fit in 64 bits of precision'); + } + v = v.slice(v.length - 8, v.length); + } + while (this._offset + 8 > this._size) + this.expand(); + v.copy(this._buffer, this._offset); + this._offset += 8; +}; + +SSHBuffer.prototype.writeChar = function (v) { + while (this._offset + 1 > this._size) + this.expand(); + this._buffer[this._offset++] = v; +}; + +SSHBuffer.prototype.writePart = function (p) { + this.writeBuffer(p.data); +}; + +SSHBuffer.prototype.write = function (buf) { + while (this._offset + buf.length > this._size) + this.expand(); + buf.copy(this._buffer, this._offset); + this._offset += buf.length; +}; diff --git a/node_modules/sshpk/lib/utils.js b/node_modules/sshpk/lib/utils.js new file mode 100644 index 0000000..6b83a32 --- /dev/null +++ b/node_modules/sshpk/lib/utils.js @@ -0,0 +1,404 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + bufferSplit: bufferSplit, + addRSAMissing: addRSAMissing, + calculateDSAPublic: calculateDSAPublic, + calculateED25519Public: calculateED25519Public, + calculateX25519Public: calculateX25519Public, + mpNormalize: mpNormalize, + mpDenormalize: mpDenormalize, + ecNormalize: ecNormalize, + countZeros: countZeros, + assertCompatible: assertCompatible, + isCompatible: isCompatible, + opensslKeyDeriv: opensslKeyDeriv, + opensshCipherInfo: opensshCipherInfo, + publicFromPrivateECDSA: publicFromPrivateECDSA, + zeroPadToLength: zeroPadToLength, + writeBitString: writeBitString, + readBitString: readBitString, + pbkdf2: pbkdf2 +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var PrivateKey = require('./private-key'); +var Key = require('./key'); +var crypto = require('crypto'); +var algs = require('./algs'); +var asn1 = require('asn1'); + +var ec = require('ecc-jsbn/lib/ec'); +var jsbn = require('jsbn').BigInteger; +var nacl = require('tweetnacl'); + +var MAX_CLASS_DEPTH = 3; + +function isCompatible(obj, klass, needVer) { + if (obj === null || typeof (obj) !== 'object') + return (false); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return (true); + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + if (!proto || ++depth > MAX_CLASS_DEPTH) + return (false); + } + if (proto.constructor.name !== klass.name) + return (false); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + if (ver[0] != needVer[0] || ver[1] < needVer[1]) + return (false); + return (true); +} + +function assertCompatible(obj, klass, needVer, name) { + if (name === undefined) + name = 'object'; + assert.ok(obj, name + ' must not be null'); + assert.object(obj, name + ' must be an object'); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return; + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, + name + ' must be a ' + klass.name + ' instance'); + } + assert.strictEqual(proto.constructor.name, klass.name, + name + ' must be a ' + klass.name + ' instance'); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], + name + ' must be compatible with ' + klass.name + ' klass ' + + 'version ' + needVer[0] + '.' + needVer[1]); +} + +var CIPHER_LEN = { + 'des-ede3-cbc': { key: 24, iv: 8 }, + 'aes-128-cbc': { key: 16, iv: 16 }, + 'aes-256-cbc': { key: 32, iv: 16 } +}; +var PKCS5_SALT_LEN = 8; + +function opensslKeyDeriv(cipher, salt, passphrase, count) { + assert.buffer(salt, 'salt'); + assert.buffer(passphrase, 'passphrase'); + assert.number(count, 'iteration count'); + + var clen = CIPHER_LEN[cipher]; + assert.object(clen, 'supported cipher'); + + salt = salt.slice(0, PKCS5_SALT_LEN); + + var D, D_prev, bufs; + var material = Buffer.alloc(0); + while (material.length < clen.key + clen.iv) { + bufs = []; + if (D_prev) + bufs.push(D_prev); + bufs.push(passphrase); + bufs.push(salt); + D = Buffer.concat(bufs); + for (var j = 0; j < count; ++j) + D = crypto.createHash('md5').update(D).digest(); + material = Buffer.concat([material, D]); + D_prev = D; + } + + return ({ + key: material.slice(0, clen.key), + iv: material.slice(clen.key, clen.key + clen.iv) + }); +} + +/* See: RFC2898 */ +function pbkdf2(hashAlg, salt, iterations, size, passphrase) { + var hkey = Buffer.alloc(salt.length + 4); + salt.copy(hkey); + + var gen = 0, ts = []; + var i = 1; + while (gen < size) { + var t = T(i++); + gen += t.length; + ts.push(t); + } + return (Buffer.concat(ts).slice(0, size)); + + function T(I) { + hkey.writeUInt32BE(I, hkey.length - 4); + + var hmac = crypto.createHmac(hashAlg, passphrase); + hmac.update(hkey); + + var Ti = hmac.digest(); + var Uc = Ti; + var c = 1; + while (c++ < iterations) { + hmac = crypto.createHmac(hashAlg, passphrase); + hmac.update(Uc); + Uc = hmac.digest(); + for (var x = 0; x < Ti.length; ++x) + Ti[x] ^= Uc[x]; + } + return (Ti); + } +} + +/* Count leading zero bits on a buffer */ +function countZeros(buf) { + var o = 0, obit = 8; + while (o < buf.length) { + var mask = (1 << obit); + if ((buf[o] & mask) === mask) + break; + obit--; + if (obit < 0) { + o++; + obit = 8; + } + } + return (o*8 + (8 - obit) - 1); +} + +function bufferSplit(buf, chr) { + assert.buffer(buf); + assert.string(chr); + + var parts = []; + var lastPart = 0; + var matches = 0; + for (var i = 0; i < buf.length; ++i) { + if (buf[i] === chr.charCodeAt(matches)) + ++matches; + else if (buf[i] === chr.charCodeAt(0)) + matches = 1; + else + matches = 0; + + if (matches >= chr.length) { + var newPart = i + 1; + parts.push(buf.slice(lastPart, newPart - matches)); + lastPart = newPart; + matches = 0; + } + } + if (lastPart <= buf.length) + parts.push(buf.slice(lastPart, buf.length)); + + return (parts); +} + +function ecNormalize(buf, addZero) { + assert.buffer(buf); + if (buf[0] === 0x00 && buf[1] === 0x04) { + if (addZero) + return (buf); + return (buf.slice(1)); + } else if (buf[0] === 0x04) { + if (!addZero) + return (buf); + } else { + while (buf[0] === 0x00) + buf = buf.slice(1); + if (buf[0] === 0x02 || buf[0] === 0x03) + throw (new Error('Compressed elliptic curve points ' + + 'are not supported')); + if (buf[0] !== 0x04) + throw (new Error('Not a valid elliptic curve point')); + if (!addZero) + return (buf); + } + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x0; + buf.copy(b, 1); + return (b); +} + +function readBitString(der, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var buf = der.readString(tag, true); + assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' + + 'not supported (0x' + buf[0].toString(16) + ')'); + return (buf.slice(1)); +} + +function writeBitString(der, buf, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + der.writeBuffer(b, tag); +} + +function mpNormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) + buf = buf.slice(1); + if ((buf[0] & 0x80) === 0x80) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function mpDenormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00) + buf = buf.slice(1); + return (buf); +} + +function zeroPadToLength(buf, len) { + assert.buffer(buf); + assert.number(len); + while (buf.length > len) { + assert.equal(buf[0], 0x00); + buf = buf.slice(1); + } + while (buf.length < len) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function bigintToMpBuf(bigint) { + var buf = Buffer.from(bigint.toByteArray()); + buf = mpNormalize(buf); + return (buf); +} + +function calculateDSAPublic(g, p, x) { + assert.buffer(g); + assert.buffer(p); + assert.buffer(x); + g = new jsbn(g); + p = new jsbn(p); + x = new jsbn(x); + var y = g.modPow(x, p); + var ybuf = bigintToMpBuf(y); + return (ybuf); +} + +function calculateED25519Public(k) { + assert.buffer(k); + + var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function calculateX25519Public(k) { + assert.buffer(k); + + var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function addRSAMissing(key) { + assert.object(key); + assertCompatible(key, PrivateKey, [1, 1]); + + var d = new jsbn(key.part.d.data); + var buf; + + if (!key.part.dmodp) { + var p = new jsbn(key.part.p.data); + var dmodp = d.mod(p.subtract(1)); + + buf = bigintToMpBuf(dmodp); + key.part.dmodp = {name: 'dmodp', data: buf}; + key.parts.push(key.part.dmodp); + } + if (!key.part.dmodq) { + var q = new jsbn(key.part.q.data); + var dmodq = d.mod(q.subtract(1)); + + buf = bigintToMpBuf(dmodq); + key.part.dmodq = {name: 'dmodq', data: buf}; + key.parts.push(key.part.dmodq); + } +} + +function publicFromPrivateECDSA(curveName, priv) { + assert.string(curveName, 'curveName'); + assert.buffer(priv); + var params = algs.curves[curveName]; + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + var d = new jsbn(mpNormalize(priv)); + var pub = G.multiply(d); + pub = Buffer.from(curve.encodePointHex(pub), 'hex'); + + var parts = []; + parts.push({name: 'curve', data: Buffer.from(curveName)}); + parts.push({name: 'Q', data: pub}); + + var key = new Key({type: 'ecdsa', curve: curve, parts: parts}); + return (key); +} + +function opensshCipherInfo(cipher) { + var inf = {}; + switch (cipher) { + case '3des-cbc': + inf.keySize = 24; + inf.blockSize = 8; + inf.opensslName = 'des-ede3-cbc'; + break; + case 'blowfish-cbc': + inf.keySize = 16; + inf.blockSize = 8; + inf.opensslName = 'bf-cbc'; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'aes128-gcm@openssh.com': + inf.keySize = 16; + inf.blockSize = 16; + inf.opensslName = 'aes-128-' + cipher.slice(7, 10); + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'aes192-gcm@openssh.com': + inf.keySize = 24; + inf.blockSize = 16; + inf.opensslName = 'aes-192-' + cipher.slice(7, 10); + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'aes256-gcm@openssh.com': + inf.keySize = 32; + inf.blockSize = 16; + inf.opensslName = 'aes-256-' + cipher.slice(7, 10); + break; + default: + throw (new Error( + 'Unsupported openssl cipher "' + cipher + '"')); + } + return (inf); +} diff --git a/node_modules/sshpk/man/man1/sshpk-conv.1 b/node_modules/sshpk/man/man1/sshpk-conv.1 new file mode 100644 index 0000000..0887dce --- /dev/null +++ b/node_modules/sshpk/man/man1/sshpk-conv.1 @@ -0,0 +1,135 @@ +.TH sshpk\-conv 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-conv \- convert between key formats +.SH SYNOPSYS +.PP +\fB\fCsshpk\-conv\fR \-t FORMAT [FILENAME] [OPTIONS...] +.PP +\fB\fCsshpk\-conv\fR \-i [FILENAME] [OPTIONS...] +.SH DESCRIPTION +.PP +Reads in a public or private key and converts it between different formats, +particularly formats used in the SSH protocol and the well\-known PEM PKCS#1/7 +formats. +.PP +In the second form, with the \fB\fC\-i\fR option given, identifies a key and prints to +stderr information about its nature, size and fingerprint. +.SH EXAMPLES +.PP +Assume the following SSH\-format public key in \fB\fCid_ecdsa.pub\fR: +.PP +.RS +.nf +ecdsa\-sha2\-nistp256 AAAAE2VjZHNhLXNoYTI...9M/4c4= user@host +.fi +.RE +.PP +Identify it with \fB\fC\-i\fR: +.PP +.RS +.nf +$ sshpk\-conv \-i id_ecdsa.pub +id_ecdsa: a 256 bit ECDSA public key +ECDSA curve: nistp256 +Comment: user@host +Fingerprint: + SHA256:vCNX7eUkdvqqW0m4PoxQAZRv+CM4P4fS8+CbliAvS4k + 81:ad:d5:57:e5:6f:7d:a2:93:79:56:af:d7:c0:38:51 +.fi +.RE +.PP +Convert it to \fB\fCpkcs8\fR format, for use with e.g. OpenSSL: +.PP +.RS +.nf +$ sshpk\-conv \-t pkcs8 id_ecdsa +\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAsA4R6N6AS3gzaPBeLjG2ObSgUsR +zOt+kWJoijLnw3ZMYUKmAx+lD0I5XUxdrPcs1vH5f3cn9TvRvO9L0z/hzg== +\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- +.fi +.RE +.PP +Retrieve the public half of a private key: +.PP +.RS +.nf +$ openssl genrsa 2048 | sshpk\-conv \-t ssh \-c foo@bar +ssh\-rsa AAAAB3NzaC1yc2EAAA...koK7 foo@bar +.fi +.RE +.PP +Convert a private key to PKCS#1 (OpenSSL) format from a new\-style OpenSSH key +format (the \fB\fCssh\-keygen \-o\fR format): +.PP +.RS +.nf +$ ssh\-keygen \-o \-f foobar +\&... +$ sshpk\-conv \-p \-t pkcs1 foobar +\-\-\-\-\-BEGIN RSA PRIVATE KEY\-\-\-\-\- +MIIDpAIBAAKCAQEA6T/GYJndb1TRH3+NL.... +\-\-\-\-\-END RSA PRIVATE KEY\-\-\-\-\- +.fi +.RE +.SH OPTIONS +.TP +\fB\fC\-i, \-\-identify\fR +Instead of converting the key, output identifying information about it to +stderr, including its type, size and fingerprints. +.TP +\fB\fC\-p, \-\-private\fR +Treat the key as a private key instead of a public key (the default). If you +supply \fB\fCsshpk\-conv\fR with a private key and do not give this option, it will +extract only the public half of the key from it and work with that. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to take the key from instead of stdin. If a filename is supplied +as a positional argument, it is equivalent to using this option. +.TP +\fB\fC\-o PATH, \-\-out=PATH\fR +Output file name to use instead of stdout. +.PP +\fB\fC\-T FORMAT, \-\-informat=FORMAT\fR +.TP +\fB\fC\-t FORMAT, \-\-outformat=FORMAT\fR +Selects the input and output formats to be used (see FORMATS, below). +.TP +\fB\fC\-c TEXT, \-\-comment=TEXT\fR +Sets the key comment for the output file, if supported. +.SH FORMATS +.PP +Currently supported formats: +.TP +\fB\fCpem, pkcs1\fR +The standard PEM format used by older OpenSSH and most TLS libraries such as +OpenSSL. The classic \fB\fCid_rsa\fR file is usually in this format. It is an ASN.1 +encoded structure, base64\-encoded and placed between PEM headers. +.TP +\fB\fCssh\fR +The SSH public key text format (the format of an \fB\fCid_rsa.pub\fR file). A single +line, containing 3 space separated parts: the key type, key body and optional +key comment. +.TP +\fB\fCpkcs8\fR +A newer PEM format, usually used only for public keys by TLS libraries such +as OpenSSL. The ASN.1 structure is more generic than that of \fB\fCpkcs1\fR\&. +.TP +\fB\fCopenssh\fR +The new \fB\fCssh\-keygen \-o\fR format from OpenSSH. This can be mistaken for a PEM +encoding but is actually an OpenSSH internal format. +.TP +\fB\fCrfc4253\fR +The internal binary format of keys when sent over the wire in the SSH +protocol. This is also the format that the \fB\fCssh\-agent\fR uses in its protocol. +.SH SEE ALSO +.PP +.BR ssh-keygen (1), +.BR openssl (1) +.SH BUGS +.PP +Encrypted (password\-protected) keys are not supported. +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/node_modules/sshpk/man/man1/sshpk-sign.1 b/node_modules/sshpk/man/man1/sshpk-sign.1 new file mode 100644 index 0000000..749916b --- /dev/null +++ b/node_modules/sshpk/man/man1/sshpk-sign.1 @@ -0,0 +1,81 @@ +.TH sshpk\-sign 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-sign \- sign data using an SSH key +.SH SYNOPSYS +.PP +\fB\fCsshpk\-sign\fR \-i KEYPATH [OPTION...] +.SH DESCRIPTION +.PP +Takes in arbitrary bytes, and signs them using an SSH private key. The key can +be of any type or format supported by the \fB\fCsshpk\fR library, including the +standard OpenSSH formats, as well as PEM PKCS#1 and PKCS#8. +.PP +The signature is printed out in Base64 encoding, unless the \fB\fC\-\-binary\fR or \fB\fC\-b\fR +option is given. +.SH EXAMPLES +.PP +Signing with default settings: +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa +MEUCIAMdLS/vXrrtWFepwe... +.fi +.RE +.PP +Signing in SSH (RFC 4253) format (rather than the default ASN.1): +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \-t ssh +AAAAFGVjZHNhLXNoYTIt... +.fi +.RE +.PP +Saving the binary signature to a file: +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \\ + \-o signature.bin \-b +$ cat signature.bin | base64 +MEUCIAMdLS/vXrrtWFepwe... +.fi +.RE +.SH OPTIONS +.TP +\fB\fC\-v, \-\-verbose\fR +Print extra information about the key and signature to stderr when signing. +.TP +\fB\fC\-b, \-\-binary\fR +Don't base64\-encode the signature before outputting it. +.TP +\fB\fC\-i KEY, \-\-identity=KEY\fR +Select the key to be used for signing. \fB\fCKEY\fR must be a relative or absolute +filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR library +is supported, including OpenSSH formats and standard PEM PKCS. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to sign instead of stdin. +.TP +\fB\fC\-o PATH, \-\-out=PATH\fR +Output file to save signature in instead of stdout. +.TP +\fB\fC\-H HASH, \-\-hash=HASH\fR +Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR, +\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash +algorithms may be used (e.g. ED25519 keys can only use SHA\-512). +.TP +\fB\fC\-t FORMAT, \-\-format=FORMAT\fR +Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for +ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format +used with TLS and typically the standard in most non\-SSH libraries (e.g. +OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent. +.SH SEE ALSO +.PP +.BR sshpk-verify (1) +.SH BUGS +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/node_modules/sshpk/man/man1/sshpk-verify.1 b/node_modules/sshpk/man/man1/sshpk-verify.1 new file mode 100644 index 0000000..f79169d --- /dev/null +++ b/node_modules/sshpk/man/man1/sshpk-verify.1 @@ -0,0 +1,68 @@ +.TH sshpk\-verify 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-verify \- verify a signature on data using an SSH key +.SH SYNOPSYS +.PP +\fB\fCsshpk\-verify\fR \-i KEYPATH \-s SIGNATURE [OPTION...] +.SH DESCRIPTION +.PP +Takes in arbitrary bytes and a Base64\-encoded signature, and verifies that the +signature was produced by the private half of the given SSH public key. +.SH EXAMPLES +.PP +.RS +.nf +$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s MEUCIQCYp... +OK +$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s GARBAGE... +NOT OK +.fi +.RE +.SH EXIT STATUS +.TP +\fB\fC0\fR +Signature validates and matches the key. +.TP +\fB\fC1\fR +Signature is parseable and the correct length but does not match the key or +otherwise is invalid. +.TP +\fB\fC2\fR +The signature or key could not be parsed. +.TP +\fB\fC3\fR +Invalid commandline options were supplied. +.SH OPTIONS +.TP +\fB\fC\-v, \-\-verbose\fR +Print extra information about the key and signature to stderr when verifying. +.TP +\fB\fC\-i KEY, \-\-identity=KEY\fR +Select the key to be used for verification. \fB\fCKEY\fR must be a relative or +absolute filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR +library is supported, including OpenSSH formats and standard PEM PKCS. +.TP +\fB\fC\-s BASE64, \-\-signature=BASE64\fR +Supplies the base64\-encoded signature to be verified. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to verify instead of stdin. +.TP +\fB\fC\-H HASH, \-\-hash=HASH\fR +Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR, +\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash +algorithms may be used (e.g. ED25519 keys can only use SHA\-512). +.TP +\fB\fC\-t FORMAT, \-\-format=FORMAT\fR +Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for +ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format +used with TLS and typically the standard in most non\-SSH libraries (e.g. +OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent. +.SH SEE ALSO +.PP +.BR sshpk-sign (1) +.SH BUGS +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/node_modules/sshpk/package.json b/node_modules/sshpk/package.json new file mode 100644 index 0000000..e39ec90 --- /dev/null +++ b/node_modules/sshpk/package.json @@ -0,0 +1,99 @@ +{ + "_args": [ + [ + "sshpk@1.16.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "sshpk@1.16.1", + "_id": "sshpk@1.16.1", + "_inBundle": false, + "_integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "_location": "/sshpk", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "sshpk@1.16.1", + "name": "sshpk", + "escapedName": "sshpk", + "rawSpec": "1.16.1", + "saveSpec": null, + "fetchSpec": "1.16.1" + }, + "_requiredBy": [ + "/http-signature" + ], + "_resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "_spec": "1.16.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Joyent, Inc" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "bugs": { + "url": "https://github.com/arekinath/node-sshpk/issues" + }, + "contributors": [ + { + "name": "Dave Eddy", + "email": "dave@daveeddy.com" + }, + { + "name": "Mark Cavage", + "email": "mcavage@gmail.com" + }, + { + "name": "Alex Wilson", + "email": "alex@cooperi.net" + } + ], + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "description": "A library for finding and using SSH public keys", + "devDependencies": { + "benchmark": "^1.0.0", + "sinon": "^1.17.2", + "tape": "^3.5.0", + "temp": "^0.8.2" + }, + "directories": { + "bin": "./bin", + "lib": "./lib", + "man": "./man/man1" + }, + "engines": { + "node": ">=0.10.0" + }, + "homepage": "https://github.com/arekinath/node-sshpk#readme", + "license": "MIT", + "main": "lib/index.js", + "man": [ + "/home/rui/code/personal/dijkstra-app/backend-dijkstra/node_modules/sshpk/man/man1/sshpk-conv.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra/node_modules/sshpk/man/man1/sshpk-sign.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra/node_modules/sshpk/man/man1/sshpk-verify.1" + ], + "name": "sshpk", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git+https://github.com/joyent/node-sshpk.git" + }, + "scripts": { + "test": "tape test/*.js" + }, + "version": "1.16.1" +} diff --git a/node_modules/static-extend/LICENSE b/node_modules/static-extend/LICENSE new file mode 100644 index 0000000..e28e603 --- /dev/null +++ b/node_modules/static-extend/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016, Jon Schlinkert. + +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/static-extend/index.js b/node_modules/static-extend/index.js new file mode 100644 index 0000000..f4124b2 --- /dev/null +++ b/node_modules/static-extend/index.js @@ -0,0 +1,90 @@ +/*! + * static-extend + * + * Copyright (c) 2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var copy = require('object-copy'); +var define = require('define-property'); +var util = require('util'); + +/** + * Returns a function for extending the static properties, + * prototype properties, and descriptors from the `Parent` + * constructor onto `Child` constructors. + * + * ```js + * var extend = require('static-extend'); + * Parent.extend = extend(Parent); + * + * // optionally pass a custom merge function as the second arg + * Parent.extend = extend(Parent, function(Child) { + * Child.prototype.mixin = function(key, val) { + * Child.prototype[key] = val; + * }; + * }); + * + * // extend "child" constructors + * Parent.extend(Child); + * + * // optionally define prototype methods as the second arg + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @param {Function} `Parent` Parent ctor + * @param {Function} `extendFn` Optional extend function for handling any necessary custom merging. Useful when updating methods that require a specific prototype. + * @param {Function} `Child` Child ctor + * @param {Object} `proto` Optionally pass additional prototype properties to inherit. + * @return {Object} + * @api public + */ + +function extend(Parent, extendFn) { + if (typeof Parent !== 'function') { + throw new TypeError('expected Parent to be a function.'); + } + + return function(Ctor, proto) { + if (typeof Ctor !== 'function') { + throw new TypeError('expected Ctor to be a function.'); + } + + util.inherits(Ctor, Parent); + copy(Ctor, Parent); + + // proto can be null or a plain object + if (typeof proto === 'object') { + var obj = Object.create(proto); + + for (var k in obj) { + Ctor.prototype[k] = obj[k]; + } + } + + // keep a reference to the parent prototype + define(Ctor.prototype, '_parent_', { + configurable: true, + set: function() {}, + get: function() { + return Parent.prototype; + } + }); + + if (typeof extendFn === 'function') { + extendFn(Ctor, Parent); + } + + Ctor.extend = extend(Ctor, extendFn); + }; +}; + +/** + * Expose `extend` + */ + +module.exports = extend; diff --git a/node_modules/static-extend/node_modules/define-property/LICENSE b/node_modules/static-extend/node_modules/define-property/LICENSE new file mode 100644 index 0000000..65f90ac --- /dev/null +++ b/node_modules/static-extend/node_modules/define-property/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, Jon Schlinkert. + +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/static-extend/node_modules/define-property/README.md b/node_modules/static-extend/node_modules/define-property/README.md new file mode 100644 index 0000000..8cac698 --- /dev/null +++ b/node_modules/static-extend/node_modules/define-property/README.md @@ -0,0 +1,77 @@ +# define-property [![NPM version](https://badge.fury.io/js/define-property.svg)](http://badge.fury.io/js/define-property) + +> Define a non-enumerable property on an object. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i define-property --save +``` + +## Usage + +**Params** + +* `obj`: The object on which to define the property. +* `prop`: The name of the property to be defined or modified. +* `descriptor`: The descriptor for the property being defined or modified. + +```js +var define = require('define-property'); +var obj = {}; +define(obj, 'foo', function(val) { + return val.toUpperCase(); +}); + +console.log(obj); +//=> {} + +console.log(obj.foo('bar')); +//=> 'BAR' +``` + +**get/set** + +```js +define(obj, 'foo', { + get: function() {}, + set: function() {} +}); +``` + +## Related projects + +* [delegate-object](https://www.npmjs.com/package/delegate-object): Copy properties from an object to another object, where properties with function values will be… [more](https://www.npmjs.com/package/delegate-object) | [homepage](https://github.com/doowb/delegate-object) +* [forward-object](https://www.npmjs.com/package/forward-object): Copy properties from an object to another object, where properties with function values will be… [more](https://www.npmjs.com/package/forward-object) | [homepage](https://github.com/doowb/forward-object) +* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep) +* [mixin-object](https://www.npmjs.com/package/mixin-object): Mixin the own and inherited properties of other objects onto the first object. Pass an… [more](https://www.npmjs.com/package/mixin-object) | [homepage](https://github.com/jonschlinkert/mixin-object) + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/define-property/issues/new). + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on August 31, 2015._ diff --git a/node_modules/static-extend/node_modules/define-property/index.js b/node_modules/static-extend/node_modules/define-property/index.js new file mode 100644 index 0000000..3e0e5e1 --- /dev/null +++ b/node_modules/static-extend/node_modules/define-property/index.js @@ -0,0 +1,31 @@ +/*! + * define-property + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var isDescriptor = require('is-descriptor'); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; diff --git a/node_modules/static-extend/node_modules/define-property/package.json b/node_modules/static-extend/node_modules/define-property/package.json new file mode 100644 index 0000000..9517d71 --- /dev/null +++ b/node_modules/static-extend/node_modules/define-property/package.json @@ -0,0 +1,85 @@ +{ + "_args": [ + [ + "define-property@0.2.5", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "define-property@0.2.5", + "_id": "define-property@0.2.5", + "_inBundle": false, + "_integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "_location": "/static-extend/define-property", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "define-property@0.2.5", + "name": "define-property", + "escapedName": "define-property", + "rawSpec": "0.2.5", + "saveSpec": null, + "fetchSpec": "0.2.5" + }, + "_requiredBy": [ + "/static-extend" + ], + "_resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "_spec": "0.2.5", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/define-property/issues" + }, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "description": "Define a non-enumerable property on an object.", + "devDependencies": { + "mocha": "*", + "should": "^7.0.4" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/define-property", + "keywords": [ + "define", + "define-property", + "enumerable", + "key", + "non", + "non-enumerable", + "object", + "prop", + "property", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "define-property", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/define-property.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "mixin-deep", + "mixin-object", + "delegate-object", + "forward-object" + ] + } + }, + "version": "0.2.5" +} diff --git a/node_modules/static-extend/package.json b/node_modules/static-extend/package.json new file mode 100644 index 0000000..7038012 --- /dev/null +++ b/node_modules/static-extend/package.json @@ -0,0 +1,99 @@ +{ + "_args": [ + [ + "static-extend@0.1.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "static-extend@0.1.2", + "_id": "static-extend@0.1.2", + "_inBundle": false, + "_integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "_location": "/static-extend", + "_phantomChildren": { + "is-descriptor": "0.1.6" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "static-extend@0.1.2", + "name": "static-extend", + "escapedName": "static-extend", + "rawSpec": "0.1.2", + "saveSpec": null, + "fetchSpec": "0.1.2" + }, + "_requiredBy": [ + "/class-utils" + ], + "_resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "_spec": "0.1.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/static-extend/issues" + }, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "description": "Adds a static `extend` method to a class, to simplify inheritance. Extends the static properties, prototype properties, and descriptors from a `Parent` constructor onto `Child` constructors.", + "devDependencies": { + "gulp-format-md": "^0.1.9", + "mocha": "^2.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/static-extend", + "keywords": [ + "class", + "ctor", + "descriptor", + "extend", + "extends", + "inherit", + "inheritance", + "merge", + "method", + "prop", + "properties", + "property", + "prototype" + ], + "license": "MIT", + "main": "index.js", + "name": "static-extend", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/static-extend.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "reflinks": [ + "verb", + "verb-readme-generator" + ], + "lint": { + "reflinks": true + } + }, + "version": "0.1.2" +} diff --git a/node_modules/statuses/HISTORY.md b/node_modules/statuses/HISTORY.md new file mode 100644 index 0000000..a1977b2 --- /dev/null +++ b/node_modules/statuses/HISTORY.md @@ -0,0 +1,65 @@ +1.5.0 / 2018-03-27 +================== + + * Add `103 Early Hints` + +1.4.0 / 2017-10-20 +================== + + * Add `STATUS_CODES` export + +1.3.1 / 2016-11-11 +================== + + * Fix return type in JSDoc + +1.3.0 / 2016-05-17 +================== + + * Add `421 Misdirected Request` + * perf: enable strict mode + +1.2.1 / 2015-02-01 +================== + + * Fix message for status 451 + - `451 Unavailable For Legal Reasons` + +1.2.0 / 2014-09-28 +================== + + * Add `208 Already Repored` + * Add `226 IM Used` + * Add `306 (Unused)` + * Add `415 Unable For Legal Reasons` + * Add `508 Loop Detected` + +1.1.1 / 2014-09-24 +================== + + * Add missing 308 to `codes.json` + +1.1.0 / 2014-09-21 +================== + + * Add `codes.json` for universal support + +1.0.4 / 2014-08-20 +================== + + * Package cleanup + +1.0.3 / 2014-06-08 +================== + + * Add 308 to `.redirect` category + +1.0.2 / 2014-03-13 +================== + + * Add `.retry` category + +1.0.1 / 2014-03-12 +================== + + * Initial release diff --git a/node_modules/statuses/LICENSE b/node_modules/statuses/LICENSE new file mode 100644 index 0000000..28a3161 --- /dev/null +++ b/node_modules/statuses/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +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/statuses/README.md b/node_modules/statuses/README.md new file mode 100644 index 0000000..0fe5720 --- /dev/null +++ b/node_modules/statuses/README.md @@ -0,0 +1,127 @@ +# Statuses + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +HTTP status utility for node. + +This module provides a list of status codes and messages sourced from +a few different projects: + + * The [IANA Status Code Registry](https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) + * The [Node.js project](https://nodejs.org/) + * The [NGINX project](https://www.nginx.com/) + * The [Apache HTTP Server project](https://httpd.apache.org/) + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install statuses +``` + +## API + + + +```js +var status = require('statuses') +``` + +### var code = status(Integer || String) + +If `Integer` or `String` is a valid HTTP code or status message, then the +appropriate `code` will be returned. Otherwise, an error will be thrown. + + + +```js +status(403) // => 403 +status('403') // => 403 +status('forbidden') // => 403 +status('Forbidden') // => 403 +status(306) // throws, as it's not supported by node.js +``` + +### status.STATUS_CODES + +Returns an object which maps status codes to status messages, in +the same format as the +[Node.js http module](https://nodejs.org/dist/latest/docs/api/http.html#http_http_status_codes). + +### status.codes + +Returns an array of all the status codes as `Integer`s. + +### var msg = status[code] + +Map of `code` to `status message`. `undefined` for invalid `code`s. + + + +```js +status[404] // => 'Not Found' +``` + +### var code = status[msg] + +Map of `status message` to `code`. `msg` can either be title-cased or +lower-cased. `undefined` for invalid `status message`s. + + + +```js +status['not found'] // => 404 +status['Not Found'] // => 404 +``` + +### status.redirect[code] + +Returns `true` if a status code is a valid redirect status. + + + +```js +status.redirect[200] // => undefined +status.redirect[301] // => true +``` + +### status.empty[code] + +Returns `true` if a status code expects an empty body. + + + +```js +status.empty[200] // => undefined +status.empty[204] // => true +status.empty[304] // => true +``` + +### status.retry[code] + +Returns `true` if you should retry the rest. + + + +```js +status.retry[501] // => undefined +status.retry[503] // => true +``` + +[npm-image]: https://img.shields.io/npm/v/statuses.svg +[npm-url]: https://npmjs.org/package/statuses +[node-version-image]: https://img.shields.io/node/v/statuses.svg +[node-version-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/jshttp/statuses.svg +[travis-url]: https://travis-ci.org/jshttp/statuses +[coveralls-image]: https://img.shields.io/coveralls/jshttp/statuses.svg +[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master +[downloads-image]: https://img.shields.io/npm/dm/statuses.svg +[downloads-url]: https://npmjs.org/package/statuses diff --git a/node_modules/statuses/codes.json b/node_modules/statuses/codes.json new file mode 100644 index 0000000..a09283a --- /dev/null +++ b/node_modules/statuses/codes.json @@ -0,0 +1,66 @@ +{ + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "306": "(Unused)", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Unordered Collection", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" +} diff --git a/node_modules/statuses/index.js b/node_modules/statuses/index.js new file mode 100644 index 0000000..4df469a --- /dev/null +++ b/node_modules/statuses/index.js @@ -0,0 +1,113 @@ +/*! + * statuses + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var codes = require('./codes.json') + +/** + * Module exports. + * @public + */ + +module.exports = status + +// status code to message map +status.STATUS_CODES = codes + +// array of status codes +status.codes = populateStatusesMap(status, codes) + +// status codes for redirects +status.redirect = { + 300: true, + 301: true, + 302: true, + 303: true, + 305: true, + 307: true, + 308: true +} + +// status codes for empty bodies +status.empty = { + 204: true, + 205: true, + 304: true +} + +// status codes for when you should retry the request +status.retry = { + 502: true, + 503: true, + 504: true +} + +/** + * Populate the statuses map for given codes. + * @private + */ + +function populateStatusesMap (statuses, codes) { + var arr = [] + + Object.keys(codes).forEach(function forEachCode (code) { + var message = codes[code] + var status = Number(code) + + // Populate properties + statuses[status] = message + statuses[message] = status + statuses[message.toLowerCase()] = status + + // Add to array + arr.push(status) + }) + + return arr +} + +/** + * Get the status code. + * + * Given a number, this will throw if it is not a known status + * code, otherwise the code will be returned. Given a string, + * the string will be parsed for a number and return the code + * if valid, otherwise will lookup the code assuming this is + * the status message. + * + * @param {string|number} code + * @returns {number} + * @public + */ + +function status (code) { + if (typeof code === 'number') { + if (!status[code]) throw new Error('invalid status code: ' + code) + return code + } + + if (typeof code !== 'string') { + throw new TypeError('code must be a number or string') + } + + // '403' + var n = parseInt(code, 10) + if (!isNaN(n)) { + if (!status[n]) throw new Error('invalid status code: ' + n) + return n + } + + n = status[code.toLowerCase()] + if (!n) throw new Error('invalid status message: "' + code + '"') + return n +} diff --git a/node_modules/statuses/package.json b/node_modules/statuses/package.json new file mode 100644 index 0000000..6fd6534 --- /dev/null +++ b/node_modules/statuses/package.json @@ -0,0 +1,93 @@ +{ + "_args": [ + [ + "statuses@1.5.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "statuses@1.5.0", + "_id": "statuses@1.5.0", + "_inBundle": false, + "_integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "_location": "/statuses", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "statuses@1.5.0", + "name": "statuses", + "escapedName": "statuses", + "rawSpec": "1.5.0", + "saveSpec": null, + "fetchSpec": "1.5.0" + }, + "_requiredBy": [ + "/express", + "/finalhandler", + "/http-errors", + "/send" + ], + "_resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "_spec": "1.5.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/jshttp/statuses/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "description": "HTTP status utility", + "devDependencies": { + "csv-parse": "1.2.4", + "eslint": "4.19.1", + "eslint-config-standard": "11.0.0", + "eslint-plugin-import": "2.9.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "6.0.1", + "eslint-plugin-promise": "3.7.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "1.21.5", + "raw-body": "2.3.2", + "stream-to-array": "2.3.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "index.js", + "codes.json", + "LICENSE" + ], + "homepage": "https://github.com/jshttp/statuses#readme", + "keywords": [ + "http", + "status", + "code" + ], + "license": "MIT", + "name": "statuses", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/statuses.git" + }, + "scripts": { + "build": "node scripts/build.js", + "fetch": "node scripts/fetch-apache.js && node scripts/fetch-iana.js && node scripts/fetch-nginx.js && node scripts/fetch-node.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "update": "npm run fetch && npm run build" + }, + "version": "1.5.0" +} diff --git a/node_modules/string-width/index.js b/node_modules/string-width/index.js new file mode 100644 index 0000000..b9bec62 --- /dev/null +++ b/node_modules/string-width/index.js @@ -0,0 +1,37 @@ +'use strict'; +var stripAnsi = require('strip-ansi'); +var codePointAt = require('code-point-at'); +var isFullwidthCodePoint = require('is-fullwidth-code-point'); + +// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345 +module.exports = function (str) { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + var width = 0; + + str = stripAnsi(str); + + for (var i = 0; i < str.length; i++) { + var code = codePointAt(str, i); + + // ignore control characters + if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) { + continue; + } + + // surrogates + if (code >= 0x10000) { + i++; + } + + if (isFullwidthCodePoint(code)) { + width += 2; + } else { + width++; + } + } + + return width; +}; diff --git a/node_modules/string-width/license b/node_modules/string-width/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/string-width/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/string-width/package.json b/node_modules/string-width/package.json new file mode 100644 index 0000000..16fdc2d --- /dev/null +++ b/node_modules/string-width/package.json @@ -0,0 +1,92 @@ +{ + "_args": [ + [ + "string-width@1.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "string-width@1.0.2", + "_id": "string-width@1.0.2", + "_inBundle": false, + "_integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "_location": "/string-width", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "string-width@1.0.2", + "name": "string-width", + "escapedName": "string-width", + "rawSpec": "1.0.2", + "saveSpec": null, + "fetchSpec": "1.0.2" + }, + "_requiredBy": [ + "/gauge", + "/wide-align" + ], + "_resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "_spec": "1.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/string-width/issues" + }, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "description": "Get the visual width of a string - the number of columns required to display it", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/string-width#readme", + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "license": "MIT", + "name": "string-width", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/string-width.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.2" +} diff --git a/node_modules/string-width/readme.md b/node_modules/string-width/readme.md new file mode 100644 index 0000000..1ab42c9 --- /dev/null +++ b/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install --save string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/string_decoder/.travis.yml b/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000..3347a72 --- /dev/null +++ b/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/string_decoder/LICENSE b/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000..778edb2 --- /dev/null +++ b/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js 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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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/string_decoder/README.md b/node_modules/string_decoder/README.md new file mode 100644 index 0000000..5fd5831 --- /dev/null +++ b/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/string_decoder/lib/string_decoder.js b/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000..2e89e63 --- /dev/null +++ b/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/string_decoder/package.json b/node_modules/string_decoder/package.json new file mode 100644 index 0000000..516e730 --- /dev/null +++ b/node_modules/string_decoder/package.json @@ -0,0 +1,62 @@ +{ + "_args": [ + [ + "string_decoder@1.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "string_decoder@1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "string_decoder@1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "1.1.1", + "saveSpec": null, + "fetchSpec": "1.1.1" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_spec": "1.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/strip-ansi/index.js b/node_modules/strip-ansi/index.js new file mode 100644 index 0000000..099480f --- /dev/null +++ b/node_modules/strip-ansi/index.js @@ -0,0 +1,6 @@ +'use strict'; +var ansiRegex = require('ansi-regex')(); + +module.exports = function (str) { + return typeof str === 'string' ? str.replace(ansiRegex, '') : str; +}; diff --git a/node_modules/strip-ansi/license b/node_modules/strip-ansi/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/strip-ansi/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/strip-ansi/package.json b/node_modules/strip-ansi/package.json new file mode 100644 index 0000000..633a136 --- /dev/null +++ b/node_modules/strip-ansi/package.json @@ -0,0 +1,105 @@ +{ + "_args": [ + [ + "strip-ansi@3.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "strip-ansi@3.0.1", + "_id": "strip-ansi@3.0.1", + "_inBundle": false, + "_integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "_location": "/strip-ansi", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "strip-ansi@3.0.1", + "name": "strip-ansi", + "escapedName": "strip-ansi", + "rawSpec": "3.0.1", + "saveSpec": null, + "fetchSpec": "3.0.1" + }, + "_requiredBy": [ + "/gauge", + "/string-width" + ], + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "_spec": "3.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/strip-ansi/issues" + }, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "description": "Strip ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/strip-ansi#readme", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "maintainers": [ + { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + { + "name": "Joshua Boy Nicolai Appelman", + "email": "joshua@jbna.nl", + "url": "jbna.nl" + }, + { + "name": "JD Ballard", + "email": "i.am.qix@gmail.com", + "url": "github.com/qix-" + } + ], + "name": "strip-ansi", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/strip-ansi.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "3.0.1" +} diff --git a/node_modules/strip-ansi/readme.md b/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000..cb7d9ff --- /dev/null +++ b/node_modules/strip-ansi/readme.md @@ -0,0 +1,33 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install --save strip-ansi +``` + + +## Usage + +```js +var stripAnsi = require('strip-ansi'); + +stripAnsi('\u001b[4mcake\u001b[0m'); +//=> 'cake' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/strip-eof/index.js b/node_modules/strip-eof/index.js new file mode 100644 index 0000000..a17d0af --- /dev/null +++ b/node_modules/strip-eof/index.js @@ -0,0 +1,15 @@ +'use strict'; +module.exports = function (x) { + var lf = typeof x === 'string' ? '\n' : '\n'.charCodeAt(); + var cr = typeof x === 'string' ? '\r' : '\r'.charCodeAt(); + + if (x[x.length - 1] === lf) { + x = x.slice(0, x.length - 1); + } + + if (x[x.length - 1] === cr) { + x = x.slice(0, x.length - 1); + } + + return x; +}; diff --git a/node_modules/strip-eof/license b/node_modules/strip-eof/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/strip-eof/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/strip-eof/package.json b/node_modules/strip-eof/package.json new file mode 100644 index 0000000..41372c8 --- /dev/null +++ b/node_modules/strip-eof/package.json @@ -0,0 +1,75 @@ +{ + "_args": [ + [ + "strip-eof@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "strip-eof@1.0.0", + "_id": "strip-eof@1.0.0", + "_inBundle": false, + "_integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "_location": "/strip-eof", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "strip-eof@1.0.0", + "name": "strip-eof", + "escapedName": "strip-eof", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/execa" + ], + "_resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/strip-eof/issues" + }, + "description": "Strip the End-Of-File (EOF) character from a string/buffer", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/strip-eof#readme", + "keywords": [ + "strip", + "trim", + "remove", + "delete", + "eof", + "end", + "file", + "newline", + "linebreak", + "character", + "string", + "buffer" + ], + "license": "MIT", + "name": "strip-eof", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/strip-eof.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.0" +} diff --git a/node_modules/strip-eof/readme.md b/node_modules/strip-eof/readme.md new file mode 100644 index 0000000..45ffe04 --- /dev/null +++ b/node_modules/strip-eof/readme.md @@ -0,0 +1,28 @@ +# strip-eof [![Build Status](https://travis-ci.org/sindresorhus/strip-eof.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-eof) + +> Strip the [End-Of-File](https://en.wikipedia.org/wiki/End-of-file) (EOF) character from a string/buffer + + +## Install + +``` +$ npm install --save strip-eof +``` + + +## Usage + +```js +const stripEof = require('strip-eof'); + +stripEof('foo\nbar\n\n'); +//=> 'foo\nbar\n' + +stripEof(new Buffer('foo\nbar\n\n')).toString(); +//=> 'foo\nbar\n' +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/strip-json-comments/index.js b/node_modules/strip-json-comments/index.js new file mode 100644 index 0000000..4e6576e --- /dev/null +++ b/node_modules/strip-json-comments/index.js @@ -0,0 +1,70 @@ +'use strict'; +var singleComment = 1; +var multiComment = 2; + +function stripWithoutWhitespace() { + return ''; +} + +function stripWithWhitespace(str, start, end) { + return str.slice(start, end).replace(/\S/g, ' '); +} + +module.exports = function (str, opts) { + opts = opts || {}; + + var currentChar; + var nextChar; + var insideString = false; + var insideComment = false; + var offset = 0; + var ret = ''; + var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace; + + for (var i = 0; i < str.length; i++) { + currentChar = str[i]; + nextChar = str[i + 1]; + + if (!insideComment && currentChar === '"') { + var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\'; + if (!escaped) { + insideString = !insideString; + } + } + + if (insideString) { + continue; + } + + if (!insideComment && currentChar + nextChar === '//') { + ret += str.slice(offset, i); + offset = i; + insideComment = singleComment; + i++; + } else if (insideComment === singleComment && currentChar + nextChar === '\r\n') { + i++; + insideComment = false; + ret += strip(str, offset, i); + offset = i; + continue; + } else if (insideComment === singleComment && currentChar === '\n') { + insideComment = false; + ret += strip(str, offset, i); + offset = i; + } else if (!insideComment && currentChar + nextChar === '/*') { + ret += str.slice(offset, i); + offset = i; + insideComment = multiComment; + i++; + continue; + } else if (insideComment === multiComment && currentChar + nextChar === '*/') { + i++; + insideComment = false; + ret += strip(str, offset, i + 1); + offset = i + 1; + continue; + } + } + + return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset)); +}; diff --git a/node_modules/strip-json-comments/license b/node_modules/strip-json-comments/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/strip-json-comments/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/strip-json-comments/package.json b/node_modules/strip-json-comments/package.json new file mode 100644 index 0000000..9fa6bb0 --- /dev/null +++ b/node_modules/strip-json-comments/package.json @@ -0,0 +1,77 @@ +{ + "_args": [ + [ + "strip-json-comments@2.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "strip-json-comments@2.0.1", + "_id": "strip-json-comments@2.0.1", + "_inBundle": false, + "_integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "_location": "/strip-json-comments", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "strip-json-comments@2.0.1", + "name": "strip-json-comments", + "escapedName": "strip-json-comments", + "rawSpec": "2.0.1", + "saveSpec": null, + "fetchSpec": "2.0.1" + }, + "_requiredBy": [ + "/rc" + ], + "_resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "_spec": "2.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/strip-json-comments/issues" + }, + "description": "Strip comments from JSON. Lets you use comments in your JSON files!", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/strip-json-comments#readme", + "keywords": [ + "json", + "strip", + "remove", + "delete", + "trim", + "comments", + "multiline", + "parse", + "config", + "configuration", + "conf", + "settings", + "util", + "env", + "environment" + ], + "license": "MIT", + "name": "strip-json-comments", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/strip-json-comments.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.1" +} diff --git a/node_modules/strip-json-comments/readme.md b/node_modules/strip-json-comments/readme.md new file mode 100644 index 0000000..0ee58df --- /dev/null +++ b/node_modules/strip-json-comments/readme.md @@ -0,0 +1,64 @@ +# strip-json-comments [![Build Status](https://travis-ci.org/sindresorhus/strip-json-comments.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-json-comments) + +> Strip comments from JSON. Lets you use comments in your JSON files! + +This is now possible: + +```js +{ + // rainbows + "unicorn": /* ❤ */ "cake" +} +``` + +It will replace single-line comments `//` and multi-line comments `/**/` with whitespace. This allows JSON error positions to remain as close as possible to the original source. + +Also available as a [gulp](https://github.com/sindresorhus/gulp-strip-json-comments)/[grunt](https://github.com/sindresorhus/grunt-strip-json-comments)/[broccoli](https://github.com/sindresorhus/broccoli-strip-json-comments) plugin. + + +## Install + +``` +$ npm install --save strip-json-comments +``` + + +## Usage + +```js +const json = '{/*rainbows*/"unicorn":"cake"}'; + +JSON.parse(stripJsonComments(json)); +//=> {unicorn: 'cake'} +``` + + +## API + +### stripJsonComments(input, [options]) + +#### input + +Type: `string` + +Accepts a string with JSON and returns a string without comments. + +#### options + +##### whitespace + +Type: `boolean` +Default: `true` + +Replace comments with whitespace instead of stripping them entirely. + + +## Related + +- [strip-json-comments-cli](https://github.com/sindresorhus/strip-json-comments-cli) - CLI for this module +- [strip-css-comments](https://github.com/sindresorhus/strip-css-comments) - Strip comments from CSS + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/supports-color/browser.js b/node_modules/supports-color/browser.js new file mode 100644 index 0000000..62afa3a --- /dev/null +++ b/node_modules/supports-color/browser.js @@ -0,0 +1,5 @@ +'use strict'; +module.exports = { + stdout: false, + stderr: false +}; diff --git a/node_modules/supports-color/index.js b/node_modules/supports-color/index.js new file mode 100644 index 0000000..1704131 --- /dev/null +++ b/node_modules/supports-color/index.js @@ -0,0 +1,131 @@ +'use strict'; +const os = require('os'); +const hasFlag = require('has-flag'); + +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + + const min = forceColor ? 1 : 0; + + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + if (env.TERM === 'dumb') { + return min; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; diff --git a/node_modules/supports-color/license b/node_modules/supports-color/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/supports-color/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/supports-color/package.json b/node_modules/supports-color/package.json new file mode 100644 index 0000000..64e911f --- /dev/null +++ b/node_modules/supports-color/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "supports-color@5.5.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "supports-color@5.5.0", + "_id": "supports-color@5.5.0", + "_inBundle": false, + "_integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "_location": "/supports-color", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "supports-color@5.5.0", + "name": "supports-color", + "escapedName": "supports-color", + "rawSpec": "5.5.0", + "saveSpec": null, + "fetchSpec": "5.5.0" + }, + "_requiredBy": [ + "/chalk", + "/nodemon" + ], + "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "_spec": "5.5.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "browser": "browser.js", + "bugs": { + "url": "https://github.com/chalk/supports-color/issues" + }, + "dependencies": { + "has-flag": "^3.0.0" + }, + "description": "Detect whether a terminal supports color", + "devDependencies": { + "ava": "^0.25.0", + "import-fresh": "^2.0.0", + "xo": "^0.20.0" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js", + "browser.js" + ], + "homepage": "https://github.com/chalk/supports-color#readme", + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "supports", + "capability", + "detect", + "truecolor", + "16m" + ], + "license": "MIT", + "name": "supports-color", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/supports-color.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "5.5.0" +} diff --git a/node_modules/supports-color/readme.md b/node_modules/supports-color/readme.md new file mode 100644 index 0000000..f6e4019 --- /dev/null +++ b/node_modules/supports-color/readme.md @@ -0,0 +1,66 @@ +# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color) + +> Detect whether a terminal supports color + + +## Install + +``` +$ npm install supports-color +``` + + +## Usage + +```js +const supportsColor = require('supports-color'); + +if (supportsColor.stdout) { + console.log('Terminal stdout supports color'); +} + +if (supportsColor.stdout.has256) { + console.log('Terminal stdout supports 256 colors'); +} + +if (supportsColor.stderr.has16m) { + console.log('Terminal stderr supports 16 million colors (truecolor)'); +} +``` + + +## API + +Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported. + +The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag: + +- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors) +- `.level = 2` and `.has256 = true`: 256 color support +- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors) + + +## Info + +It obeys the `--color` and `--no-color` CLI flags. + +Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks. + +Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively. + + +## Related + +- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/tar/LICENSE b/node_modules/tar/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/tar/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/tar/README.md b/node_modules/tar/README.md new file mode 100644 index 0000000..034e486 --- /dev/null +++ b/node_modules/tar/README.md @@ -0,0 +1,954 @@ +# node-tar + +[![Build Status](https://travis-ci.org/npm/node-tar.svg?branch=master)](https://travis-ci.org/npm/node-tar) + +[Fast](./benchmarks) and full-featured Tar for Node.js + +The API is designed to mimic the behavior of `tar(1)` on unix systems. +If you are familiar with how tar works, most of this will hopefully be +straightforward for you. If not, then hopefully this module can teach +you useful unix skills that may come in handy someday :) + +## Background + +A "tar file" or "tarball" is an archive of file system entries +(directories, files, links, etc.) The name comes from "tape archive". +If you run `man tar` on almost any Unix command line, you'll learn +quite a bit about what it can do, and its history. + +Tar has 5 main top-level commands: + +* `c` Create an archive +* `r` Replace entries within an archive +* `u` Update entries within an archive (ie, replace if they're newer) +* `t` List out the contents of an archive +* `x` Extract an archive to disk + +The other flags and options modify how this top level function works. + +## High-Level API + +These 5 functions are the high-level API. All of them have a +single-character name (for unix nerds familiar with `tar(1)`) as well +as a long name (for everyone else). + +All the high-level functions take the following arguments, all three +of which are optional and may be omitted. + +1. `options` - An optional object specifying various options +2. `paths` - An array of paths to add or extract +3. `callback` - Called when the command is completed, if async. (If + sync or no file specified, providing a callback throws a + `TypeError`.) + +If the command is sync (ie, if `options.sync=true`), then the +callback is not allowed, since the action will be completed immediately. + +If a `file` argument is specified, and the command is async, then a +`Promise` is returned. In this case, if async, a callback may be +provided which is called when the command is completed. + +If a `file` option is not specified, then a stream is returned. For +`create`, this is a readable stream of the generated archive. For +`list` and `extract` this is a writable stream that an archive should +be written into. If a file is not specified, then a callback is not +allowed, because you're already getting a stream to work with. + +`replace` and `update` only work on existing archives, and so require +a `file` argument. + +Sync commands without a file argument return a stream that acts on its +input immediately in the same tick. For readable streams, this means +that all of the data is immediately available by calling +`stream.read()`. For writable streams, it will be acted upon as soon +as it is provided, but this can be at any time. + +### Warnings + +Some things cause tar to emit a warning, but should usually not cause +the entire operation to fail. There are three ways to handle +warnings: + +1. **Ignore them** (default) Invalid entries won't be put in the + archive, and invalid entries won't be unpacked. This is usually + fine, but can hide failures that you might care about. +2. **Notice them** Add an `onwarn` function to the options, or listen + to the `'warn'` event on any tar stream. The function will get + called as `onwarn(message, data)`. Handle as appropriate. +3. **Explode them.** Set `strict: true` in the options object, and + `warn` messages will be emitted as `'error'` events instead. If + there's no `error` handler, this causes the program to crash. If + used with a promise-returning/callback-taking method, then it'll + send the error to the promise/callback. + +### Examples + +The API mimics the `tar(1)` command line functionality, with aliases +for more human-readable option and function names. The goal is that +if you know how to use `tar(1)` in Unix, then you know how to use +`require('tar')` in JavaScript. + +To replicate `tar czf my-tarball.tgz files and folders`, you'd do: + +```js +tar.c( + { + gzip: , + file: 'my-tarball.tgz' + }, + ['some', 'files', 'and', 'folders'] +).then(_ => { .. tarball has been created .. }) +``` + +To replicate `tar cz files and folders > my-tarball.tgz`, you'd do: + +```js +tar.c( // or tar.create + { + gzip: + }, + ['some', 'files', 'and', 'folders'] +).pipe(fs.createWriteStream('my-tarball.tgz')) +``` + +To replicate `tar xf my-tarball.tgz` you'd do: + +```js +tar.x( // or tar.extract( + { + file: 'my-tarball.tgz' + } +).then(_=> { .. tarball has been dumped in cwd .. }) +``` + +To replicate `cat my-tarball.tgz | tar x -C some-dir --strip=1`: + +```js +fs.createReadStream('my-tarball.tgz').pipe( + tar.x({ + strip: 1, + C: 'some-dir' // alias for cwd:'some-dir', also ok + }) +) +``` + +To replicate `tar tf my-tarball.tgz`, do this: + +```js +tar.t({ + file: 'my-tarball.tgz', + onentry: entry => { .. do whatever with it .. } +}) +``` + +To replicate `cat my-tarball.tgz | tar t` do: + +```js +fs.createReadStream('my-tarball.tgz') + .pipe(tar.t()) + .on('entry', entry => { .. do whatever with it .. }) +``` + +To do anything synchronous, add `sync: true` to the options. Note +that sync functions don't take a callback and don't return a promise. +When the function returns, it's already done. Sync methods without a +file argument return a sync stream, which flushes immediately. But, +of course, it still won't be done until you `.end()` it. + +To filter entries, add `filter: ` to the options. +Tar-creating methods call the filter with `filter(path, stat)`. +Tar-reading methods (including extraction) call the filter with +`filter(path, entry)`. The filter is called in the `this`-context of +the `Pack` or `Unpack` stream object. + +The arguments list to `tar t` and `tar x` specify a list of filenames +to extract or list, so they're equivalent to a filter that tests if +the file is in the list. + +For those who _aren't_ fans of tar's single-character command names: + +``` +tar.c === tar.create +tar.r === tar.replace (appends to archive, file is required) +tar.u === tar.update (appends if newer, file is required) +tar.x === tar.extract +tar.t === tar.list +``` + +Keep reading for all the command descriptions and options, as well as +the low-level API that they are built on. + +### tar.c(options, fileList, callback) [alias: tar.create] + +Create a tarball archive. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Write the tarball archive to the specified filename. If this + is specified, then the callback will be fired when the file has been + written, and a promise will be returned that resolves when the file + is written. If a filename is not specified, then a Readable Stream + will be returned which will emit the file data. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. If this is set, + and a file is not provided, then the resulting stream will already + have the data ready to `read` or `emit('data')` as soon as you + request it. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `mode` The mode to set on the created file archive +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + + +The following options are mostly internal, but can be modified in some +advanced use cases, such as re-using caches between runs. + +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `readdirCache` A Map object that caches calls to `readdir`. +- `jobs` A number specifying how many concurrent jobs to run. + Defaults to 4. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. + +### tar.x(options, fileList, callback) [alias: tar.extract] + +Extract a tarball archive. + +The `fileList` is an array of paths to extract from the tarball. If +no paths are provided, then all the entries are extracted. + +If the archive is gzipped, then tar will detect this and unzip it. + +Note that all directories that are created will be forced to be +writable, readable, and listable by their owner, to avoid cases where +a directory prevents extraction of child entries by virtue of its +mode. + +Most extraction errors will cause a `warn` event to be emitted. If +the `cwd` is missing, or not a directory, then the extraction will +fail completely. + +The following options are supported: + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. If provided, this must exist and must be a + directory. [Alias: `C`] +- `file` The archive file to extract. If not specified, then a + Writable stream is returned where the archive data should be + written. [Alias: `f`] +- `sync` Create files and directories synchronously. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being unpacked. Return `true` to unpack the entry from the + archive, or `false` to skip it. +- `newer` Set to true to keep the existing file on disk if it's newer + than the file in the archive. [Alias: `keep-newer`, + `keep-newer-files`] +- `keep` Do not overwrite existing files. In particular, if a file + appears more than once in an archive, later copies will not + overwrite earlier copies. [Alias: `k`, `keep-existing`] +- `preservePaths` Allow absolute paths, paths containing `..`, and + extracting through symbolic links. By default, `/` is stripped from + absolute paths, `..` paths are not extracted, and any file whose + location would be modified by a symbolic link is not extracted. + [Alias: `P`] +- `unlink` Unlink files before creating them. Without this option, + tar overwrites existing files, which preserves existing hardlinks. + With this option, existing hardlinks will be broken, as will any + symlink that would affect the location of an extracted file. [Alias: + `U`] +- `strip` Remove the specified number of leading path elements. + Pathnames with fewer elements will be silently skipped. Note that + the pathname is edited after applying the filter, but before + security checks. [Alias: `strip-components`, `stripComponents`] +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `preserveOwner` If true, tar will set the `uid` and `gid` of + extracted entries to the `uid` and `gid` fields in the archive. + This defaults to true when run as root, and false otherwise. If + false, then files and directories will be set with the owner and + group of the user running the process. This is similar to `-p` in + `tar(1)`, but ACLs and other system-specific data is never unpacked + in this implementation, and modes are set by default already. + [Alias: `p`] +- `uid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified user id, regardless of the `uid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `gid` option. +- `gid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified group id, regardless of the `gid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `uid` option. +- `noMtime` Set to true to omit writing `mtime` value for extracted + entries. [Alias: `m`, `no-mtime`] +- `transform` Provide a function that takes an `entry` object, and + returns a stream, or any falsey value. If a stream is provided, + then that stream's data will be written instead of the contents of + the archive entry. If a falsey value is provided, then the entry is + written to disk as normal. (To exclude items from extraction, use + the `filter` option described above.) +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. + +The following options are mostly internal, but can be modified in some +advanced use cases, such as re-using caches between runs. + +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `umask` Filter the modes of entries like `process.umask()`. +- `dmode` Default mode for directories +- `fmode` Default mode for files +- `dirCache` A Map object of which directories exist. +- `maxMetaEntrySize` The maximum size of meta entries that is + supported. Defaults to 1 MB. + +Note that using an asynchronous stream type with the `transform` +option will cause undefined behavior in sync extractions. +[MiniPass](http://npm.im/minipass)-based streams are designed for this +use case. + +### tar.t(options, fileList, callback) [alias: tar.list] + +List the contents of a tarball archive. + +The `fileList` is an array of paths to list from the tarball. If +no paths are provided, then all the entries are listed. + +If the archive is gzipped, then tar will detect this and unzip it. + +Returns an event emitter that emits `entry` events with +`tar.ReadEntry` objects. However, they don't emit `'data'` or `'end'` +events. (If you want to get actual readable entries, use the +`tar.Parse` class instead.) + +The following options are supported: + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. [Alias: `C`] +- `file` The archive file to list. If not specified, then a + Writable stream is returned where the archive data should be + written. [Alias: `f`] +- `sync` Read the specified file synchronously. (This has no effect + when a file option isn't specified, because entries are emitted as + fast as they are parsed from the stream anyway.) +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being listed. Return `true` to emit the entry from the + archive, or `false` to skip it. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. This is important for when both `file` and + `sync` are set, because it will be called synchronously. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noResume` By default, `entry` streams are resumed immediately after + the call to `onentry`. Set `noResume: true` to suppress this + behavior. Note that by opting into this, the stream will never + complete until the entry data is consumed. + +### tar.u(options, fileList, callback) [alias: tar.update] + +Add files to an archive if they are newer than the entry already in +the tarball archive. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Required. Write the tarball archive to the specified + filename. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for adding entries to the + archive. Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +### tar.r(options, fileList, callback) [alias: tar.replace] + +Add files to an existing archive. Because later entries override +earlier entries, this effectively replaces any existing entries. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Required. Write the tarball archive to the specified + filename. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for adding entries to the + archive. Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + + +## Low-Level API + +### class tar.Pack + +A readable tar stream. + +Has all the standard readable stream interface stuff. `'data'` and +`'end'` events, `read()` method, `pause()` and `resume()`, etc. + +#### constructor(options) + +The following options are supported: + +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `readdirCache` A Map object that caches calls to `readdir`. +- `jobs` A number specifying how many concurrent jobs to run. + Defaults to 4. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +#### add(path) + +Adds an entry to the archive. Returns the Pack stream. + +#### write(path) + +Adds an entry to the archive. Returns true if flushed. + +#### end() + +Finishes the archive. + +### class tar.Pack.Sync + +Synchronous version of `tar.Pack`. + +### class tar.Unpack + +A writable stream that unpacks a tar archive onto the file system. + +All the normal writable stream stuff is supported. `write()` and +`end()` methods, `'drain'` events, etc. + +Note that all directories that are created will be forced to be +writable, readable, and listable by their owner, to avoid cases where +a directory prevents extraction of child entries by virtue of its +mode. + +`'close'` is emitted when it's done writing stuff to the file system. + +Most unpack errors will cause a `warn` event to be emitted. If the +`cwd` is missing, or not a directory, then an error will be emitted. + +#### constructor(options) + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. If provided, this must exist and must be a + directory. +- `filter` A function that gets called with `(path, entry)` for each + entry being unpacked. Return `true` to unpack the entry from the + archive, or `false` to skip it. +- `newer` Set to true to keep the existing file on disk if it's newer + than the file in the archive. +- `keep` Do not overwrite existing files. In particular, if a file + appears more than once in an archive, later copies will not + overwrite earlier copies. +- `preservePaths` Allow absolute paths, paths containing `..`, and + extracting through symbolic links. By default, `/` is stripped from + absolute paths, `..` paths are not extracted, and any file whose + location would be modified by a symbolic link is not extracted. +- `unlink` Unlink files before creating them. Without this option, + tar overwrites existing files, which preserves existing hardlinks. + With this option, existing hardlinks will be broken, as will any + symlink that would affect the location of an extracted file. +- `strip` Remove the specified number of leading path elements. + Pathnames with fewer elements will be silently skipped. Note that + the pathname is edited after applying the filter, but before + security checks. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `umask` Filter the modes of entries like `process.umask()`. +- `dmode` Default mode for directories +- `fmode` Default mode for files +- `dirCache` A Map object of which directories exist. +- `maxMetaEntrySize` The maximum size of meta entries that is + supported. Defaults to 1 MB. +- `preserveOwner` If true, tar will set the `uid` and `gid` of + extracted entries to the `uid` and `gid` fields in the archive. + This defaults to true when run as root, and false otherwise. If + false, then files and directories will be set with the owner and + group of the user running the process. This is similar to `-p` in + `tar(1)`, but ACLs and other system-specific data is never unpacked + in this implementation, and modes are set by default already. +- `win32` True if on a windows platform. Causes behavior where + filenames containing `<|>?` chars are converted to + windows-compatible values while being unpacked. +- `uid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified user id, regardless of the `uid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `gid` option. +- `gid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified group id, regardless of the `gid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `uid` option. +- `noMtime` Set to true to omit writing `mtime` value for extracted + entries. +- `transform` Provide a function that takes an `entry` object, and + returns a stream, or any falsey value. If a stream is provided, + then that stream's data will be written instead of the contents of + the archive entry. If a falsey value is provided, then the entry is + written to disk as normal. (To exclude items from extraction, use + the `filter` option described above.) +- `strict` Treat warnings as crash-worthy errors. Default false. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. + +### class tar.Unpack.Sync + +Synchronous version of `tar.Unpack`. + +Note that using an asynchronous stream type with the `transform` +option will cause undefined behavior in sync unpack streams. +[MiniPass](http://npm.im/minipass)-based streams are designed for this +use case. + +### class tar.Parse + +A writable stream that parses a tar archive stream. All the standard +writable stream stuff is supported. + +If the archive is gzipped, then tar will detect this and unzip it. + +Emits `'entry'` events with `tar.ReadEntry` objects, which are +themselves readable streams that you can pipe wherever. + +Each `entry` will not emit until the one before it is flushed through, +so make sure to either consume the data (with `on('data', ...)` or +`.pipe(...)`) or throw it away with `.resume()` to keep the stream +flowing. + +#### constructor(options) + +Returns an event emitter that emits `entry` events with +`tar.ReadEntry` objects. + +The following options are supported: + +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being listed. Return `true` to emit the entry from the + archive, or `false` to skip it. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. + +#### abort(message, error) + +Stop all parsing activities. This is called when there are zlib +errors. It also emits a warning with the message and error provided. + +### class tar.ReadEntry extends [MiniPass](http://npm.im/minipass) + +A representation of an entry that is being read out of a tar archive. + +It has the following fields: + +- `extended` The extended metadata object provided to the constructor. +- `globalExtended` The global extended metadata object provided to the + constructor. +- `remain` The number of bytes remaining to be written into the + stream. +- `blockRemain` The number of 512-byte blocks remaining to be written + into the stream. +- `ignore` Whether this entry should be ignored. +- `meta` True if this represents metadata about the next entry, false + if it represents a filesystem object. +- All the fields from the header, extended header, and global extended + header are added to the ReadEntry object. So it has `path`, `type`, + `size, `mode`, and so on. + +#### constructor(header, extended, globalExtended) + +Create a new ReadEntry object with the specified header, extended +header, and global extended header values. + +### class tar.WriteEntry extends [MiniPass](http://npm.im/minipass) + +A representation of an entry that is being written from the file +system into a tar archive. + +Emits data for the Header, and for the Pax Extended Header if one is +required, as well as any body data. + +Creating a WriteEntry for a directory does not also create +WriteEntry objects for all of the directory contents. + +It has the following fields: + +- `path` The path field that will be written to the archive. By + default, this is also the path from the cwd to the file system + object. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `myuid` If supported, the uid of the user running the current + process. +- `myuser` The `env.USER` string if set, or `''`. Set as the entry + `uname` field if the file's `uid` matches `this.myuid`. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 1 MB. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `absolute` The absolute path to the entry on the filesystem. By + default, this is `path.resolve(this.cwd, this.path)`, but it can be + overridden explicitly. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `win32` True if on a windows platform. Causes behavior where paths + replace `\` with `/` and filenames containing the windows-compatible + forms of `<|>?:` characters are converted to actual `<|>?:` characters + in the archive. +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + + +#### constructor(path, options) + +`path` is the path of the entry as it is written in the archive. + +The following options are supported: + +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 1 MB. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `absolute` The absolute path to the entry on the filesystem. By + default, this is `path.resolve(this.cwd, this.path)`, but it can be + overridden explicitly. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `win32` True if on a windows platform. Causes behavior where paths + replace `\` with `/`. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. +- `umask` Set to restrict the modes on the entries in the archive, + somewhat like how umask works on file creation. Defaults to + `process.umask()` on unix systems, or `0o22` on Windows. + +#### warn(message, data) + +If strict, emit an error with the provided message. + +Othewise, emit a `'warn'` event with the provided message and data. + +### class tar.WriteEntry.Sync + +Synchronous version of tar.WriteEntry + +### class tar.WriteEntry.Tar + +A version of tar.WriteEntry that gets its data from a tar.ReadEntry +instead of from the filesystem. + +#### constructor(readEntry, options) + +`readEntry` is the entry being read out of another archive. + +The following options are supported: + +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + +### class tar.Header + +A class for reading and writing header blocks. + +It has the following fields: + +- `nullBlock` True if decoding a block which is entirely composed of + `0x00` null bytes. (Useful because tar files are terminated by + at least 2 null blocks.) +- `cksumValid` True if the checksum in the header is valid, false + otherwise. +- `needPax` True if the values, as encoded, will require a Pax + extended header. +- `path` The path of the entry. +- `mode` The 4 lowest-order octal digits of the file mode. That is, + read/write/execute permissions for world, group, and owner, and the + setuid, setgid, and sticky bits. +- `uid` Numeric user id of the file owner +- `gid` Numeric group id of the file owner +- `size` Size of the file in bytes +- `mtime` Modified time of the file +- `cksum` The checksum of the header. This is generated by adding all + the bytes of the header block, treating the checksum field itself as + all ascii space characters (that is, `0x20`). +- `type` The human-readable name of the type of entry this represents, + or the alphanumeric key if unknown. +- `typeKey` The alphanumeric key for the type of entry this header + represents. +- `linkpath` The target of Link and SymbolicLink entries. +- `uname` Human-readable user name of the file owner +- `gname` Human-readable group name of the file owner +- `devmaj` The major portion of the device number. Always `0` for + files, directories, and links. +- `devmin` The minor portion of the device number. Always `0` for + files, directories, and links. +- `atime` File access time. +- `ctime` File change time. + +#### constructor(data, [offset=0]) + +`data` is optional. It is either a Buffer that should be interpreted +as a tar Header starting at the specified offset and continuing for +512 bytes, or a data object of keys and values to set on the header +object, and eventually encode as a tar Header. + +#### decode(block, offset) + +Decode the provided buffer starting at the specified offset. + +Buffer length must be greater than 512 bytes. + +#### set(data) + +Set the fields in the data object. + +#### encode(buffer, offset) + +Encode the header fields into the buffer at the specified offset. + +Returns `this.needPax` to indicate whether a Pax Extended Header is +required to properly encode the specified data. + +### class tar.Pax + +An object representing a set of key-value pairs in an Pax extended +header entry. + +It has the following fields. Where the same name is used, they have +the same semantics as the tar.Header field of the same name. + +- `global` True if this represents a global extended header, or false + if it is for a single entry. +- `atime` +- `charset` +- `comment` +- `ctime` +- `gid` +- `gname` +- `linkpath` +- `mtime` +- `path` +- `size` +- `uid` +- `uname` +- `dev` +- `ino` +- `nlink` + +#### constructor(object, global) + +Set the fields set in the object. `global` is a boolean that defaults +to false. + +#### encode() + +Return a Buffer containing the header and body for the Pax extended +header entry, or `null` if there is nothing to encode. + +#### encodeBody() + +Return a string representing the body of the pax extended header +entry. + +#### encodeField(fieldName) + +Return a string representing the key/value encoding for the specified +fieldName, or `''` if the field is unset. + +### tar.Pax.parse(string, extended, global) + +Return a new Pax object created by parsing the contents of the string +provided. + +If the `extended` object is set, then also add the fields from that +object. (This is necessary because multiple metadata entries can +occur in sequence.) + +### tar.types + +A translation table for the `type` field in tar headers. + +#### tar.types.name.get(code) + +Get the human-readable name for a given alphanumeric code. + +#### tar.types.code.get(name) + +Get the alphanumeric code for a given human-readable name. diff --git a/node_modules/tar/index.js b/node_modules/tar/index.js new file mode 100644 index 0000000..c9ae06e --- /dev/null +++ b/node_modules/tar/index.js @@ -0,0 +1,18 @@ +'use strict' + +// high-level commands +exports.c = exports.create = require('./lib/create.js') +exports.r = exports.replace = require('./lib/replace.js') +exports.t = exports.list = require('./lib/list.js') +exports.u = exports.update = require('./lib/update.js') +exports.x = exports.extract = require('./lib/extract.js') + +// classes +exports.Pack = require('./lib/pack.js') +exports.Unpack = require('./lib/unpack.js') +exports.Parse = require('./lib/parse.js') +exports.ReadEntry = require('./lib/read-entry.js') +exports.WriteEntry = require('./lib/write-entry.js') +exports.Header = require('./lib/header.js') +exports.Pax = require('./lib/pax.js') +exports.types = require('./lib/types.js') diff --git a/node_modules/tar/lib/buffer.js b/node_modules/tar/lib/buffer.js new file mode 100644 index 0000000..7876d5b --- /dev/null +++ b/node_modules/tar/lib/buffer.js @@ -0,0 +1,11 @@ +'use strict' + +// Buffer in node 4.x < 4.5.0 doesn't have working Buffer.from +// or Buffer.alloc, and Buffer in node 10 deprecated the ctor. +// .M, this is fine .\^/M.. +let B = Buffer +/* istanbul ignore next */ +if (!B.alloc) { + B = require('safe-buffer').Buffer +} +module.exports = B diff --git a/node_modules/tar/lib/create.js b/node_modules/tar/lib/create.js new file mode 100644 index 0000000..a37aa52 --- /dev/null +++ b/node_modules/tar/lib/create.js @@ -0,0 +1,105 @@ +'use strict' + +// tar -c +const hlo = require('./high-level-opt.js') + +const Pack = require('./pack.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const t = require('./list.js') +const path = require('path') + +const c = module.exports = (opt_, files, cb) => { + if (typeof files === 'function') + cb = files + + if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + return opt.file && opt.sync ? createFileSync(opt, files) + : opt.file ? createFile(opt, files, cb) + : opt.sync ? createSync(opt, files) + : create(opt, files) +} + +const createFileSync = (opt, files) => { + const p = new Pack.Sync(opt) + const stream = new fsm.WriteStreamSync(opt.file, { + mode: opt.mode || 0o666 + }) + p.pipe(stream) + addFilesSync(p, files) +} + +const createFile = (opt, files, cb) => { + const p = new Pack(opt) + const stream = new fsm.WriteStream(opt.file, { + mode: opt.mode || 0o666 + }) + p.pipe(stream) + + const promise = new Promise((res, rej) => { + stream.on('error', rej) + stream.on('close', res) + p.on('error', rej) + }) + + addFilesAsync(p, files) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry) + }) + else + p.add(file) + }) + p.end() +} + +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry) + }).then(_ => addFilesAsync(p, files)) + else + p.add(file) + } + p.end() +} + +const createSync = (opt, files) => { + const p = new Pack.Sync(opt) + addFilesSync(p, files) + return p +} + +const create = (opt, files) => { + const p = new Pack(opt) + addFilesAsync(p, files) + return p +} diff --git a/node_modules/tar/lib/extract.js b/node_modules/tar/lib/extract.js new file mode 100644 index 0000000..cbb458a --- /dev/null +++ b/node_modules/tar/lib/extract.js @@ -0,0 +1,112 @@ +'use strict' + +// tar -x +const hlo = require('./high-level-opt.js') +const Unpack = require('./unpack.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') + +const x = module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + if (files.length) + filesFilter(opt, files) + + return opt.file && opt.sync ? extractFileSync(opt) + : opt.file ? extractFile(opt, cb) + : opt.sync ? extractSync(opt) + : extract(opt) +} + +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) + const filter = opt.filter + + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) + + map.set(file, ret) + return ret + } + + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) + : file => mapHas(file.replace(/\/+$/, '')) +} + +const extractFileSync = opt => { + const u = new Unpack.Sync(opt) + + const file = opt.file + let threw = true + let fd + const stat = fs.statSync(file) + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16*1024*1024 + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size + }) + stream.pipe(u) +} + +const extractFile = (opt, cb) => { + const u = new Unpack(opt) + const readSize = opt.maxReadSize || 16*1024*1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + u.on('error', reject) + u.on('close', resolve) + + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size + }) + stream.on('error', reject) + stream.pipe(u) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const extractSync = opt => { + return new Unpack.Sync(opt) +} + +const extract = opt => { + return new Unpack(opt) +} diff --git a/node_modules/tar/lib/header.js b/node_modules/tar/lib/header.js new file mode 100644 index 0000000..d29c3b9 --- /dev/null +++ b/node_modules/tar/lib/header.js @@ -0,0 +1,289 @@ +'use strict' +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) + +const Buffer = require('./buffer.js') +const types = require('./types.js') +const pathModule = require('path').posix +const large = require('./large-numbers.js') + +const SLURP = Symbol('slurp') +const TYPE = Symbol('type') + +class Header { + constructor (data, off, ex, gex) { + this.cksumValid = false + this.needPax = false + this.nullBlock = false + + this.block = null + this.path = null + this.mode = null + this.uid = null + this.gid = null + this.size = null + this.mtime = null + this.cksum = null + this[TYPE] = '0' + this.linkpath = null + this.uname = null + this.gname = null + this.devmaj = 0 + this.devmin = 0 + this.atime = null + this.ctime = null + + if (Buffer.isBuffer(data)) + this.decode(data, off || 0, ex, gex) + else if (data) + this.set(data) + } + + decode (buf, off, ex, gex) { + if (!off) + off = 0 + + if (!buf || !(buf.length >= off + 512)) + throw new Error('need 512 bytes for header') + + this.path = decString(buf, off, 100) + this.mode = decNumber(buf, off + 100, 8) + this.uid = decNumber(buf, off + 108, 8) + this.gid = decNumber(buf, off + 116, 8) + this.size = decNumber(buf, off + 124, 12) + this.mtime = decDate(buf, off + 136, 12) + this.cksum = decNumber(buf, off + 148, 12) + + // if we have extended or global extended headers, apply them now + // See https://github.com/npm/node-tar/pull/187 + this[SLURP](ex) + this[SLURP](gex, true) + + // old tar versions marked dirs as a file with a trailing / + this[TYPE] = decString(buf, off + 156, 1) + if (this[TYPE] === '') + this[TYPE] = '0' + if (this[TYPE] === '0' && this.path.substr(-1) === '/') + this[TYPE] = '5' + + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this[TYPE] === '5') + this.size = 0 + + this.linkpath = decString(buf, off + 157, 100) + if (buf.slice(off + 257, off + 265).toString() === 'ustar\u000000') { + this.uname = decString(buf, off + 265, 32) + this.gname = decString(buf, off + 297, 32) + this.devmaj = decNumber(buf, off + 329, 8) + this.devmin = decNumber(buf, off + 337, 8) + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155) + this.path = prefix + '/' + this.path + } else { + const prefix = decString(buf, off + 345, 130) + if (prefix) + this.path = prefix + '/' + this.path + this.atime = decDate(buf, off + 476, 12) + this.ctime = decDate(buf, off + 488, 12) + } + } + + let sum = 8 * 0x20 + for (let i = off; i < off + 148; i++) { + sum += buf[i] + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i] + } + this.cksumValid = sum === this.cksum + if (this.cksum === null && sum === 8 * 0x20) + this.nullBlock = true + } + + [SLURP] (ex, global) { + for (let k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = ex[k] + } + } + + encode (buf, off) { + if (!buf) { + buf = this.block = Buffer.alloc(512) + off = 0 + } + + if (!off) + off = 0 + + if (!(buf.length >= off + 512)) + throw new Error('need 512 bytes for header') + + const prefixSize = this.ctime || this.atime ? 130 : 155 + const split = splitPrefix(this.path || '', prefixSize) + const path = split[0] + const prefix = split[1] + this.needPax = split[2] + + this.needPax = encString(buf, off, 100, path) || this.needPax + this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax + this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax + this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax + this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax + this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax + buf[off + 156] = this[TYPE].charCodeAt(0) + this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax + buf.write('ustar\u000000', off + 257, 8) + this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax + this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax + this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax + this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax + this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax + if (buf[off + 475] !== 0) + this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax + else { + this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax + this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax + this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax + } + + let sum = 8 * 0x20 + for (let i = off; i < off + 148; i++) { + sum += buf[i] + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i] + } + this.cksum = sum + encNumber(buf, off + 148, 8, this.cksum) + this.cksumValid = true + + return this.needPax + } + + set (data) { + for (let i in data) { + if (data[i] !== null && data[i] !== undefined) + this[i] = data[i] + } + } + + get type () { + return types.name.get(this[TYPE]) || this[TYPE] + } + + get typeKey () { + return this[TYPE] + } + + set type (type) { + if (types.code.has(type)) + this[TYPE] = types.code.get(type) + else + this[TYPE] = type + } +} + +const splitPrefix = (p, prefixSize) => { + const pathSize = 100 + let pp = p + let prefix = '' + let ret + const root = pathModule.parse(p).root || '.' + + if (Buffer.byteLength(pp) < pathSize) + ret = [pp, prefix, false] + else { + // first set prefix to the dir, and path to the base + prefix = pathModule.dirname(pp) + pp = pathModule.basename(pp) + + do { + // both fit! + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) + ret = [pp, prefix, false] + + // prefix fits in prefix, but path doesn't fit in path + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) + ret = [pp.substr(0, pathSize - 1), prefix, true] + + else { + // make path take a bit from prefix + pp = pathModule.join(pathModule.basename(prefix), pp) + prefix = pathModule.dirname(prefix) + } + } while (prefix !== root && !ret) + + // at this point, found no resolution, just truncate + if (!ret) + ret = [p.substr(0, pathSize - 1), '', true] + } + return ret +} + +const decString = (buf, off, size) => + buf.slice(off, off + size).toString('utf8').replace(/\0.*/, '') + +const decDate = (buf, off, size) => + numToDate(decNumber(buf, off, size)) + +const numToDate = num => num === null ? null : new Date(num * 1000) + +const decNumber = (buf, off, size) => + buf[off] & 0x80 ? large.parse(buf.slice(off, off + size)) + : decSmallNumber(buf, off, size) + +const nanNull = value => isNaN(value) ? null : value + +const decSmallNumber = (buf, off, size) => + nanNull(parseInt( + buf.slice(off, off + size) + .toString('utf8').replace(/\0.*$/, '').trim(), 8)) + +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8 : 0o7777777 +} + +const encNumber = (buf, off, size, number) => + number === null ? false : + number > MAXNUM[size] || number < 0 + ? (large.encode(number, buf.slice(off, off + size)), true) + : (encSmallNumber(buf, off, size, number), false) + +const encSmallNumber = (buf, off, size, number) => + buf.write(octalString(number, size), off, size, 'ascii') + +const octalString = (number, size) => + padOctal(Math.floor(number).toString(8), size) + +const padOctal = (string, size) => + (string.length === size - 1 ? string + : new Array(size - string.length - 1).join('0') + string + ' ') + '\0' + +const encDate = (buf, off, size, date) => + date === null ? false : + encNumber(buf, off, size, date.getTime() / 1000) + +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0') +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, string) => + string === null ? false : + (buf.write(string + NULLS, off, size, 'utf8'), + string.length !== Buffer.byteLength(string) || string.length > size) + +module.exports = Header diff --git a/node_modules/tar/lib/high-level-opt.js b/node_modules/tar/lib/high-level-opt.js new file mode 100644 index 0000000..7333db9 --- /dev/null +++ b/node_modules/tar/lib/high-level-opt.js @@ -0,0 +1,29 @@ +'use strict' + +// turn tar(1) style args like `C` into the more verbose things like `cwd` + +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'] +]) + +const parse = module.exports = opt => opt ? Object.keys(opt).map(k => [ + argmap.has(k) ? argmap.get(k) : k, opt[k] +]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {} diff --git a/node_modules/tar/lib/large-numbers.js b/node_modules/tar/lib/large-numbers.js new file mode 100644 index 0000000..3e5c992 --- /dev/null +++ b/node_modules/tar/lib/large-numbers.js @@ -0,0 +1,97 @@ +'use strict' +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. + +const encode = exports.encode = (num, buf) => { + if (!Number.isSafeInteger(num)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw TypeError('cannot encode number outside of javascript safe integer range') + else if (num < 0) + encodeNegative(num, buf) + else + encodePositive(num, buf) + return buf +} + +const encodePositive = (num, buf) => { + buf[0] = 0x80 + + for (var i = buf.length; i > 1; i--) { + buf[i-1] = num & 0xff + num = Math.floor(num / 0x100) + } +} + +const encodeNegative = (num, buf) => { + buf[0] = 0xff + var flipped = false + num = num * -1 + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff + num = Math.floor(num / 0x100) + if (flipped) + buf[i-1] = onesComp(byte) + else if (byte === 0) + buf[i-1] = 0 + else { + flipped = true + buf[i-1] = twosComp(byte) + } + } +} + +const parse = exports.parse = (buf) => { + var post = buf[buf.length - 1] + var pre = buf[0] + var value; + if (pre === 0x80) + value = pos(buf.slice(1, buf.length)) + else if (pre === 0xff) + value = twos(buf) + else + throw TypeError('invalid base256 encoding') + + if (!Number.isSafeInteger(value)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw TypeError('parsed number outside of javascript safe integer range') + + return value +} + +const twos = (buf) => { + var len = buf.length + var sum = 0 + var flipped = false + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + var f + if (flipped) + f = onesComp(byte) + else if (byte === 0) + f = byte + else { + flipped = true + f = twosComp(byte) + } + if (f !== 0) + sum -= f * Math.pow(256, len - i - 1) + } + return sum +} + +const pos = (buf) => { + var len = buf.length + var sum = 0 + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + if (byte !== 0) + sum += byte * Math.pow(256, len - i - 1) + } + return sum +} + +const onesComp = byte => (0xff ^ byte) & 0xff + +const twosComp = byte => ((0xff ^ byte) + 1) & 0xff diff --git a/node_modules/tar/lib/list.js b/node_modules/tar/lib/list.js new file mode 100644 index 0000000..250ebe0 --- /dev/null +++ b/node_modules/tar/lib/list.js @@ -0,0 +1,130 @@ +'use strict' + +const Buffer = require('./buffer.js') + +// XXX: This shares a lot in common with extract.js +// maybe some DRY opportunity here? + +// tar -t +const hlo = require('./high-level-opt.js') +const Parser = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') + +const t = module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + if (files.length) + filesFilter(opt, files) + + if (!opt.noResume) + onentryFunction(opt) + + return opt.file && opt.sync ? listFileSync(opt) + : opt.file ? listFile(opt, cb) + : list(opt) +} + +const onentryFunction = opt => { + const onentry = opt.onentry + opt.onentry = onentry ? e => { + onentry(e) + e.resume() + } : e => e.resume() +} + +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) + const filter = opt.filter + + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) + + map.set(file, ret) + return ret + } + + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) + : file => mapHas(file.replace(/\/+$/, '')) +} + +const listFileSync = opt => { + const p = list(opt) + const file = opt.file + let threw = true + let fd + try { + const stat = fs.statSync(file) + const readSize = opt.maxReadSize || 16*1024*1024 + if (stat.size < readSize) { + p.end(fs.readFileSync(file)) + } else { + let pos = 0 + const buf = Buffer.allocUnsafe(readSize) + fd = fs.openSync(file, 'r') + while (pos < stat.size) { + let bytesRead = fs.readSync(fd, buf, 0, readSize, pos) + pos += bytesRead + p.write(buf.slice(0, bytesRead)) + } + p.end() + } + threw = false + } finally { + if (threw && fd) + try { fs.closeSync(fd) } catch (er) {} + } +} + +const listFile = (opt, cb) => { + const parse = new Parser(opt) + const readSize = opt.maxReadSize || 16*1024*1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + parse.on('error', reject) + parse.on('end', resolve) + + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size + }) + stream.on('error', reject) + stream.pipe(parse) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const list = opt => new Parser(opt) diff --git a/node_modules/tar/lib/mkdir.js b/node_modules/tar/lib/mkdir.js new file mode 100644 index 0000000..c6a154c --- /dev/null +++ b/node_modules/tar/lib/mkdir.js @@ -0,0 +1,206 @@ +'use strict' +// wrapper around mkdirp for tar's needs. + +// TODO: This should probably be a class, not functionally +// passing around state in a gazillion args. + +const mkdirp = require('mkdirp') +const fs = require('fs') +const path = require('path') +const chownr = require('chownr') + +class SymlinkError extends Error { + constructor (symlink, path) { + super('Cannot extract through symbolic link') + this.path = path + this.symlink = symlink + } + + get name () { + return 'SylinkError' + } +} + +class CwdError extends Error { + constructor (path, code) { + super(code + ': Cannot cd into \'' + path + '\'') + this.path = path + this.code = code + } + + get name () { + return 'CwdError' + } +} + +const mkdir = module.exports = (dir, opt, cb) => { + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 + + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + ( uid !== opt.processUid || gid !== opt.processGid ) + + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = opt.cwd + + const done = (er, created) => { + if (er) + cb(er) + else { + cache.set(dir, true) + if (created && doChown) + chownr(created, uid, gid, er => done(er)) + else if (needChmod) + fs.chmod(dir, mode, cb) + else + cb() + } + } + + if (cache && cache.get(dir) === true) + return done() + + if (dir === cwd) + return fs.stat(dir, (er, st) => { + if (er || !st.isDirectory()) + er = new CwdError(dir, er && er.code || 'ENOTDIR') + done(er) + }) + + if (preserve) + return mkdirp(dir, mode, done) + + const sub = path.relative(cwd, dir) + const parts = sub.split(/\/|\\/) + mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done) +} + +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) + return cb(null, created) + const p = parts.shift() + const part = base + '/' + p + if (cache.get(part)) + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) +} + +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => { + if (er) { + if (er.path && path.dirname(er.path) === cwd && + (er.code === 'ENOTDIR' || er.code === 'ENOENT')) + return cb(new CwdError(cwd, er.code)) + + fs.lstat(part, (statEr, st) => { + if (statEr) + cb(statEr) + else if (st.isDirectory()) + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + else if (unlink) + fs.unlink(part, er => { + if (er) + return cb(er) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) + }) + else if (st.isSymbolicLink()) + return cb(new SymlinkError(part, part + '/' + parts.join('/'))) + else + cb(er) + }) + } else { + created = created || part + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + } +} + +const mkdirSync = module.exports.sync = (dir, opt) => { + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 + + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + ( uid !== opt.processUid || gid !== opt.processGid ) + + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = opt.cwd + + const done = (created) => { + cache.set(dir, true) + if (created && doChown) + chownr.sync(created, uid, gid) + if (needChmod) + fs.chmodSync(dir, mode) + } + + if (cache && cache.get(dir) === true) + return done() + + if (dir === cwd) { + let ok = false + let code = 'ENOTDIR' + try { + ok = fs.statSync(dir).isDirectory() + } catch (er) { + code = er.code + } finally { + if (!ok) + throw new CwdError(dir, code) + } + done() + return + } + + if (preserve) + return done(mkdirp.sync(dir, mode)) + + const sub = path.relative(cwd, dir) + const parts = sub.split(/\/|\\/) + let created = null + for (let p = parts.shift(), part = cwd; + p && (part += '/' + p); + p = parts.shift()) { + + if (cache.get(part)) + continue + + try { + fs.mkdirSync(part, mode) + created = created || part + cache.set(part, true) + } catch (er) { + if (er.path && path.dirname(er.path) === cwd && + (er.code === 'ENOTDIR' || er.code === 'ENOENT')) + return new CwdError(cwd, er.code) + + const st = fs.lstatSync(part) + if (st.isDirectory()) { + cache.set(part, true) + continue + } else if (unlink) { + fs.unlinkSync(part) + fs.mkdirSync(part, mode) + created = created || part + cache.set(part, true) + continue + } else if (st.isSymbolicLink()) + return new SymlinkError(part, part + '/' + parts.join('/')) + } + } + + return done(created) +} diff --git a/node_modules/tar/lib/mode-fix.js b/node_modules/tar/lib/mode-fix.js new file mode 100644 index 0000000..3363a3b --- /dev/null +++ b/node_modules/tar/lib/mode-fix.js @@ -0,0 +1,14 @@ +'use strict' +module.exports = (mode, isDir) => { + mode &= 0o7777 + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) + mode |= 0o100 + if (mode & 0o40) + mode |= 0o10 + if (mode & 0o4) + mode |= 0o1 + } + return mode +} diff --git a/node_modules/tar/lib/pack.js b/node_modules/tar/lib/pack.js new file mode 100644 index 0000000..857cea9 --- /dev/null +++ b/node_modules/tar/lib/pack.js @@ -0,0 +1,404 @@ +'use strict' + +const Buffer = require('./buffer.js') + +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) + +class PackJob { + constructor (path, absolute) { + this.path = path || './' + this.absolute = absolute + this.entry = null + this.stat = null + this.readdir = null + this.pending = false + this.ignore = false + this.piped = false + } +} + +const MiniPass = require('minipass') +const zlib = require('minizlib') +const ReadEntry = require('./read-entry.js') +const WriteEntry = require('./write-entry.js') +const WriteEntrySync = WriteEntry.Sync +const WriteEntryTar = WriteEntry.Tar +const Yallist = require('yallist') +const EOF = Buffer.alloc(1024) +const ONSTAT = Symbol('onStat') +const ENDED = Symbol('ended') +const QUEUE = Symbol('queue') +const CURRENT = Symbol('current') +const PROCESS = Symbol('process') +const PROCESSING = Symbol('processing') +const PROCESSJOB = Symbol('processJob') +const JOBS = Symbol('jobs') +const JOBDONE = Symbol('jobDone') +const ADDFSENTRY = Symbol('addFSEntry') +const ADDTARENTRY = Symbol('addTarEntry') +const STAT = Symbol('stat') +const READDIR = Symbol('readdir') +const ONREADDIR = Symbol('onreaddir') +const PIPE = Symbol('pipe') +const ENTRY = Symbol('entry') +const ENTRYOPT = Symbol('entryOpt') +const WRITEENTRYCLASS = Symbol('writeEntryClass') +const WRITE = Symbol('write') +const ONDRAIN = Symbol('ondrain') + +const fs = require('fs') +const path = require('path') +const warner = require('./warn-mixin.js') + +const Pack = warner(class Pack extends MiniPass { + constructor (opt) { + super(opt) + opt = opt || Object.create(null) + this.opt = opt + this.cwd = opt.cwd || process.cwd() + this.maxReadSize = opt.maxReadSize + this.preservePaths = !!opt.preservePaths + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.prefix = (opt.prefix || '').replace(/(\\|\/)+$/, '') + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.readdirCache = opt.readdirCache || new Map() + + this[WRITEENTRYCLASS] = WriteEntry + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + this.zip = null + if (opt.gzip) { + if (typeof opt.gzip !== 'object') + opt.gzip = {} + this.zip = new zlib.Gzip(opt.gzip) + this.zip.on('data', chunk => super.write(chunk)) + this.zip.on('end', _ => super.end()) + this.zip.on('drain', _ => this[ONDRAIN]()) + this.on('resume', _ => this.zip.resume()) + } else + this.on('drain', this[ONDRAIN]) + + this.portable = !!opt.portable + this.noDirRecurse = !!opt.noDirRecurse + this.follow = !!opt.follow + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null + + this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true + + this[QUEUE] = new Yallist + this[JOBS] = 0 + this.jobs = +opt.jobs || 4 + this[PROCESSING] = false + this[ENDED] = false + } + + [WRITE] (chunk) { + return super.write(chunk) + } + + add (path) { + this.write(path) + return this + } + + end (path) { + if (path) + this.write(path) + this[ENDED] = true + this[PROCESS]() + return this + } + + write (path) { + if (this[ENDED]) + throw new Error('write after end') + + if (path instanceof ReadEntry) + this[ADDTARENTRY](path) + else + this[ADDFSENTRY](path) + return this.flowing + } + + [ADDTARENTRY] (p) { + const absolute = path.resolve(this.cwd, p.path) + if (this.prefix) + p.path = this.prefix + '/' + p.path.replace(/^\.(\/+|$)/, '') + + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) + p.resume() + else { + const job = new PackJob(p.path, absolute, false) + job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)) + job.entry.on('end', _ => this[JOBDONE](job)) + this[JOBS] += 1 + this[QUEUE].push(job) + } + + this[PROCESS]() + } + + [ADDFSENTRY] (p) { + const absolute = path.resolve(this.cwd, p) + if (this.prefix) + p = this.prefix + '/' + p.replace(/^\.(\/+|$)/, '') + + this[QUEUE].push(new PackJob(p, absolute)) + this[PROCESS]() + } + + [STAT] (job) { + job.pending = true + this[JOBS] += 1 + const stat = this.follow ? 'stat' : 'lstat' + fs[stat](job.absolute, (er, stat) => { + job.pending = false + this[JOBS] -= 1 + if (er) + this.emit('error', er) + else + this[ONSTAT](job, stat) + }) + } + + [ONSTAT] (job, stat) { + this.statCache.set(job.absolute, stat) + job.stat = stat + + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) + job.ignore = true + + this[PROCESS]() + } + + [READDIR] (job) { + job.pending = true + this[JOBS] += 1 + fs.readdir(job.absolute, (er, entries) => { + job.pending = false + this[JOBS] -= 1 + if (er) + return this.emit('error', er) + this[ONREADDIR](job, entries) + }) + } + + [ONREADDIR] (job, entries) { + this.readdirCache.set(job.absolute, entries) + job.readdir = entries + this[PROCESS]() + } + + [PROCESS] () { + if (this[PROCESSING]) + return + + this[PROCESSING] = true + for (let w = this[QUEUE].head; + w !== null && this[JOBS] < this.jobs; + w = w.next) { + this[PROCESSJOB](w.value) + if (w.value.ignore) { + const p = w.next + this[QUEUE].removeNode(w) + w.next = p + } + } + + this[PROCESSING] = false + + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) + this.zip.end(EOF) + else { + super.write(EOF) + super.end() + } + } + } + + get [CURRENT] () { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value + } + + [JOBDONE] (job) { + this[QUEUE].shift() + this[JOBS] -= 1 + this[PROCESS]() + } + + [PROCESSJOB] (job) { + if (job.pending) + return + + if (job.entry) { + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + return + } + + if (!job.stat) { + if (this.statCache.has(job.absolute)) + this[ONSTAT](job, this.statCache.get(job.absolute)) + else + this[STAT](job) + } + if (!job.stat) + return + + // filtered out! + if (job.ignore) + return + + if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { + if (this.readdirCache.has(job.absolute)) + this[ONREADDIR](job, this.readdirCache.get(job.absolute)) + else + this[READDIR](job) + if (!job.readdir) + return + } + + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job) + if (!job.entry) { + job.ignore = true + return + } + + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + } + + [ENTRYOPT] (job) { + return { + onwarn: (msg, data) => { + this.warn(msg, data) + }, + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime + } + } + + [ENTRY] (job) { + this[JOBS] += 1 + try { + return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)) + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)) + } catch (er) { + this.emit('error', er) + } + } + + [ONDRAIN] () { + if (this[CURRENT] && this[CURRENT].entry) + this[CURRENT].entry.resume() + } + + // like .pipe() but using super, because our write() is special + [PIPE] (job) { + job.piped = true + + if (job.readdir) + job.readdir.forEach(entry => { + const p = this.prefix ? + job.path.slice(this.prefix.length + 1) || './' + : job.path + + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) + + const source = job.entry + const zip = this.zip + + if (zip) + source.on('data', chunk => { + if (!zip.write(chunk)) + source.pause() + }) + else + source.on('data', chunk => { + if (!super.write(chunk)) + source.pause() + }) + } + + pause () { + if (this.zip) + this.zip.pause() + return super.pause() + } +}) + +class PackSync extends Pack { + constructor (opt) { + super(opt) + this[WRITEENTRYCLASS] = WriteEntrySync + } + + // pause/resume are no-ops in sync streams. + pause () {} + resume () {} + + [STAT] (job) { + const stat = this.follow ? 'statSync' : 'lstatSync' + this[ONSTAT](job, fs[stat](job.absolute)) + } + + [READDIR] (job, stat) { + this[ONREADDIR](job, fs.readdirSync(job.absolute)) + } + + // gotta get it all in this tick + [PIPE] (job) { + const source = job.entry + const zip = this.zip + + if (job.readdir) + job.readdir.forEach(entry => { + const p = this.prefix ? + job.path.slice(this.prefix.length + 1) || './' + : job.path + + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) + + if (zip) + source.on('data', chunk => { + zip.write(chunk) + }) + else + source.on('data', chunk => { + super[WRITE](chunk) + }) + } +} + +Pack.Sync = PackSync + +module.exports = Pack diff --git a/node_modules/tar/lib/parse.js b/node_modules/tar/lib/parse.js new file mode 100644 index 0000000..43d4383 --- /dev/null +++ b/node_modules/tar/lib/parse.js @@ -0,0 +1,428 @@ +'use strict' + +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away + +const warner = require('./warn-mixin.js') +const path = require('path') +const Header = require('./header.js') +const EE = require('events') +const Yallist = require('yallist') +const maxMetaEntrySize = 1024 * 1024 +const Entry = require('./read-entry.js') +const Pax = require('./pax.js') +const zlib = require('minizlib') +const Buffer = require('./buffer.js') + +const gzipHeader = Buffer.from([0x1f, 0x8b]) +const STATE = Symbol('state') +const WRITEENTRY = Symbol('writeEntry') +const READENTRY = Symbol('readEntry') +const NEXTENTRY = Symbol('nextEntry') +const PROCESSENTRY = Symbol('processEntry') +const EX = Symbol('extendedHeader') +const GEX = Symbol('globalExtendedHeader') +const META = Symbol('meta') +const EMITMETA = Symbol('emitMeta') +const BUFFER = Symbol('buffer') +const QUEUE = Symbol('queue') +const ENDED = Symbol('ended') +const EMITTEDEND = Symbol('emittedEnd') +const EMIT = Symbol('emit') +const UNZIP = Symbol('unzip') +const CONSUMECHUNK = Symbol('consumeChunk') +const CONSUMECHUNKSUB = Symbol('consumeChunkSub') +const CONSUMEBODY = Symbol('consumeBody') +const CONSUMEMETA = Symbol('consumeMeta') +const CONSUMEHEADER = Symbol('consumeHeader') +const CONSUMING = Symbol('consuming') +const BUFFERCONCAT = Symbol('bufferConcat') +const MAYBEEND = Symbol('maybeEnd') +const WRITING = Symbol('writing') +const ABORTED = Symbol('aborted') +const DONE = Symbol('onDone') + +const noop = _ => true + +module.exports = warner(class Parser extends EE { + constructor (opt) { + opt = opt || {} + super(opt) + + if (opt.ondone) + this.on(DONE, opt.ondone) + else + this.on(DONE, _ => { + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + }) + + this.strict = !!opt.strict + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize + this.filter = typeof opt.filter === 'function' ? opt.filter : noop + + // have to set this so that streams are ok piping into it + this.writable = true + this.readable = false + + this[QUEUE] = new Yallist() + this[BUFFER] = null + this[READENTRY] = null + this[WRITEENTRY] = null + this[STATE] = 'begin' + this[META] = '' + this[EX] = null + this[GEX] = null + this[ENDED] = false + this[UNZIP] = null + this[ABORTED] = false + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + if (typeof opt.onentry === 'function') + this.on('entry', opt.onentry) + } + + [CONSUMEHEADER] (chunk, position) { + let header + try { + header = new Header(chunk, position, this[EX], this[GEX]) + } catch (er) { + return this.warn('invalid entry', er) + } + + if (header.nullBlock) + this[EMIT]('nullBlock') + else if (!header.cksumValid) + this.warn('invalid entry', header) + else if (!header.path) + this.warn('invalid: path is required', header) + else { + const type = header.type + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) + this.warn('invalid: linkpath required', header) + else if (!/^(Symbolic)?Link$/.test(type) && header.linkpath) + this.warn('invalid: linkpath forbidden', header) + else { + const entry = this[WRITEENTRY] = new Entry(header, this[EX], this[GEX]) + + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true + this[EMIT]('ignoredEntry', entry) + this[STATE] = 'ignore' + } else if (entry.size > 0) { + this[META] = '' + entry.on('data', c => this[META] += c) + this[STATE] = 'meta' + } + } else { + + this[EX] = null + entry.ignore = entry.ignore || !this.filter(entry.path, entry) + if (entry.ignore) { + this[EMIT]('ignoredEntry', entry) + this[STATE] = entry.remain ? 'ignore' : 'begin' + } else { + if (entry.remain) + this[STATE] = 'body' + else { + this[STATE] = 'begin' + entry.end() + } + + if (!this[READENTRY]) { + this[QUEUE].push(entry) + this[NEXTENTRY]() + } else + this[QUEUE].push(entry) + } + } + } + } + } + + [PROCESSENTRY] (entry) { + let go = true + + if (!entry) { + this[READENTRY] = null + go = false + } else if (Array.isArray(entry)) + this.emit.apply(this, entry) + else { + this[READENTRY] = entry + this.emit('entry', entry) + if (!entry.emittedEnd) { + entry.on('end', _ => this[NEXTENTRY]()) + go = false + } + } + + return go + } + + [NEXTENTRY] () { + do {} while (this[PROCESSENTRY](this[QUEUE].shift())) + + if (!this[QUEUE].length) { + // At this point, there's nothing in the queue, but we may have an + // entry which is being consumed (readEntry). + // If we don't, then we definitely can handle more data. + // If we do, and either it's flowing, or it has never had any data + // written to it, then it needs more. + // The only other possibility is that it has returned false from a + // write() call, so we wait for the next drain to continue. + const re = this[READENTRY] + const drainNow = !re || re.flowing || re.size === re.remain + if (drainNow) { + if (!this[WRITING]) + this.emit('drain') + } else + re.once('drain', _ => this.emit('drain')) + } + } + + [CONSUMEBODY] (chunk, position) { + // write up to but no more than writeEntry.blockRemain + const entry = this[WRITEENTRY] + const br = entry.blockRemain + const c = (br >= chunk.length && position === 0) ? chunk + : chunk.slice(position, position + br) + + entry.write(c) + + if (!entry.blockRemain) { + this[STATE] = 'begin' + this[WRITEENTRY] = null + entry.end() + } + + return c.length + } + + [CONSUMEMETA] (chunk, position) { + const entry = this[WRITEENTRY] + const ret = this[CONSUMEBODY](chunk, position) + + // if we finished, then the entry is reset + if (!this[WRITEENTRY]) + this[EMITMETA](entry) + + return ret + } + + [EMIT] (ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) + this.emit(ev, data, extra) + else + this[QUEUE].push([ev, data, extra]) + } + + [EMITMETA] (entry) { + this[EMIT]('meta', this[META]) + switch (entry.type) { + case 'ExtendedHeader': + case 'OldExtendedHeader': + this[EX] = Pax.parse(this[META], this[EX], false) + break + + case 'GlobalExtendedHeader': + this[GEX] = Pax.parse(this[META], this[GEX], true) + break + + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + this[EX] = this[EX] || Object.create(null) + this[EX].path = this[META].replace(/\0.*/, '') + break + + case 'NextFileHasLongLinkpath': + this[EX] = this[EX] || Object.create(null) + this[EX].linkpath = this[META].replace(/\0.*/, '') + break + + /* istanbul ignore next */ + default: throw new Error('unknown meta: ' + entry.type) + } + } + + abort (msg, error) { + this[ABORTED] = true + this.warn(msg, error) + this.emit('abort', error) + this.emit('error', error) + } + + write (chunk) { + if (this[ABORTED]) + return + + // first write, might be gzipped + if (this[UNZIP] === null && chunk) { + if (this[BUFFER]) { + chunk = Buffer.concat([this[BUFFER], chunk]) + this[BUFFER] = null + } + if (chunk.length < gzipHeader.length) { + this[BUFFER] = chunk + return true + } + for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) + this[UNZIP] = false + } + if (this[UNZIP] === null) { + const ended = this[ENDED] + this[ENDED] = false + this[UNZIP] = new zlib.Unzip() + this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)) + this[UNZIP].on('error', er => + this.abort(er.message, er)) + this[UNZIP].on('end', _ => { + this[ENDED] = true + this[CONSUMECHUNK]() + }) + this[WRITING] = true + const ret = this[UNZIP][ended ? 'end' : 'write' ](chunk) + this[WRITING] = false + return ret + } + } + + this[WRITING] = true + if (this[UNZIP]) + this[UNZIP].write(chunk) + else + this[CONSUMECHUNK](chunk) + this[WRITING] = false + + // return false if there's a queue, or if the current entry isn't flowing + const ret = + this[QUEUE].length ? false : + this[READENTRY] ? this[READENTRY].flowing : + true + + // if we have no queue, then that means a clogged READENTRY + if (!ret && !this[QUEUE].length) + this[READENTRY].once('drain', _ => this.emit('drain')) + + return ret + } + + [BUFFERCONCAT] (c) { + if (c && !this[ABORTED]) + this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c + } + + [MAYBEEND] () { + if (this[ENDED] && + !this[EMITTEDEND] && + !this[ABORTED] && + !this[CONSUMING]) { + this[EMITTEDEND] = true + const entry = this[WRITEENTRY] + if (entry && entry.blockRemain) { + const have = this[BUFFER] ? this[BUFFER].length : 0 + this.warn('Truncated input (needed ' + entry.blockRemain + + ' more bytes, only ' + have + ' available)', entry) + if (this[BUFFER]) + entry.write(this[BUFFER]) + entry.end() + } + this[EMIT](DONE) + } + } + + [CONSUMECHUNK] (chunk) { + if (this[CONSUMING]) { + this[BUFFERCONCAT](chunk) + } else if (!chunk && !this[BUFFER]) { + this[MAYBEEND]() + } else { + this[CONSUMING] = true + if (this[BUFFER]) { + this[BUFFERCONCAT](chunk) + const c = this[BUFFER] + this[BUFFER] = null + this[CONSUMECHUNKSUB](c) + } else { + this[CONSUMECHUNKSUB](chunk) + } + + while (this[BUFFER] && this[BUFFER].length >= 512 && !this[ABORTED]) { + const c = this[BUFFER] + this[BUFFER] = null + this[CONSUMECHUNKSUB](c) + } + this[CONSUMING] = false + } + + if (!this[BUFFER] || this[ENDED]) + this[MAYBEEND]() + } + + [CONSUMECHUNKSUB] (chunk) { + // we know that we are in CONSUMING mode, so anything written goes into + // the buffer. Advance the position and put any remainder in the buffer. + let position = 0 + let length = chunk.length + while (position + 512 <= length && !this[ABORTED]) { + switch (this[STATE]) { + case 'begin': + this[CONSUMEHEADER](chunk, position) + position += 512 + break + + case 'ignore': + case 'body': + position += this[CONSUMEBODY](chunk, position) + break + + case 'meta': + position += this[CONSUMEMETA](chunk, position) + break + + /* istanbul ignore next */ + default: + throw new Error('invalid state: ' + this[STATE]) + } + } + + if (position < length) { + if (this[BUFFER]) + this[BUFFER] = Buffer.concat([chunk.slice(position), this[BUFFER]]) + else + this[BUFFER] = chunk.slice(position) + } + } + + end (chunk) { + if (!this[ABORTED]) { + if (this[UNZIP]) + this[UNZIP].end(chunk) + else { + this[ENDED] = true + this.write(chunk) + } + } + } +}) diff --git a/node_modules/tar/lib/pax.js b/node_modules/tar/lib/pax.js new file mode 100644 index 0000000..9d7e4ab --- /dev/null +++ b/node_modules/tar/lib/pax.js @@ -0,0 +1,146 @@ +'use strict' +const Buffer = require('./buffer.js') +const Header = require('./header.js') +const path = require('path') + +class Pax { + constructor (obj, global) { + this.atime = obj.atime || null + this.charset = obj.charset || null + this.comment = obj.comment || null + this.ctime = obj.ctime || null + this.gid = obj.gid || null + this.gname = obj.gname || null + this.linkpath = obj.linkpath || null + this.mtime = obj.mtime || null + this.path = obj.path || null + this.size = obj.size || null + this.uid = obj.uid || null + this.uname = obj.uname || null + this.dev = obj.dev || null + this.ino = obj.ino || null + this.nlink = obj.nlink || null + this.global = global || false + } + + encode () { + const body = this.encodeBody() + if (body === '') + return null + + const bodyLen = Buffer.byteLength(body) + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512) + const buf = Buffer.allocUnsafe(bufLen) + + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) { + buf[i] = 0 + } + + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99), + mode: this.mode || 0o644, + uid: this.uid || null, + gid: this.gid || null, + size: bodyLen, + mtime: this.mtime || null, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime || null, + ctime: this.ctime || null + }).encode(buf) + + buf.write(body, 512, bodyLen, 'utf8') + + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0 + } + + return buf + } + + encodeBody () { + return ( + this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname') + ) + } + + encodeField (field) { + if (this[field] === null || this[field] === undefined) + return '' + const v = this[field] instanceof Date ? this[field].getTime() / 1000 + : this[field] + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' + ? 'SCHILY.' : '') + + field + '=' + v + '\n' + const byteLen = Buffer.byteLength(s) + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 + if (byteLen + digits >= Math.pow(10, digits)) + digits += 1 + const len = digits + byteLen + return len + s + } +} + +Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g) + +const merge = (a, b) => + b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a + +const parseKV = string => + string + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)) + +const parseKVLine = (set, line) => { + const n = parseInt(line, 10) + + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) + return set + + line = line.substr((n + ' ').length) + const kv = line.split('=') + const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1') + if (!k) + return set + + const v = kv.join('=') + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) + ? new Date(v * 1000) + : /^[0-9]+$/.test(v) ? +v + : v + return set +} + +module.exports = Pax diff --git a/node_modules/tar/lib/read-entry.js b/node_modules/tar/lib/read-entry.js new file mode 100644 index 0000000..8acee94 --- /dev/null +++ b/node_modules/tar/lib/read-entry.js @@ -0,0 +1,98 @@ +'use strict' +const types = require('./types.js') +const MiniPass = require('minipass') + +const SLURP = Symbol('slurp') +module.exports = class ReadEntry extends MiniPass { + constructor (header, ex, gex) { + super() + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause() + this.extended = ex + this.globalExtended = gex + this.header = header + this.startBlockSize = 512 * Math.ceil(header.size / 512) + this.blockRemain = this.startBlockSize + this.remain = header.size + this.type = header.type + this.meta = false + this.ignore = false + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break + + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true + break + + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true + } + + this.path = header.path + this.mode = header.mode + if (this.mode) + this.mode = this.mode & 0o7777 + this.uid = header.uid + this.gid = header.gid + this.uname = header.uname + this.gname = header.gname + this.size = header.size + this.mtime = header.mtime + this.atime = header.atime + this.ctime = header.ctime + this.linkpath = header.linkpath + this.uname = header.uname + this.gname = header.gname + + if (ex) this[SLURP](ex) + if (gex) this[SLURP](gex, true) + } + + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + + const r = this.remain + const br = this.blockRemain + this.remain = Math.max(0, r - writeLen) + this.blockRemain = Math.max(0, br - writeLen) + if (this.ignore) + return true + + if (r >= writeLen) + return super.write(data) + + // r < writeLen + return super.write(data.slice(0, r)) + } + + [SLURP] (ex, global) { + for (let k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = ex[k] + } + } +} diff --git a/node_modules/tar/lib/replace.js b/node_modules/tar/lib/replace.js new file mode 100644 index 0000000..571cee9 --- /dev/null +++ b/node_modules/tar/lib/replace.js @@ -0,0 +1,220 @@ +'use strict' +const Buffer = require('./buffer.js') + +// tar -r +const hlo = require('./high-level-opt.js') +const Pack = require('./pack.js') +const Parse = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const t = require('./list.js') +const path = require('path') + +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. + +const Header = require('./header.js') + +const r = module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) + + if (!opt.file) + throw new TypeError('file is required') + + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + return opt.sync ? replaceSync(opt, files) + : replace(opt, files, cb) +} + +const replaceSync = (opt, files) => { + const p = new Pack.Sync(opt) + + let threw = true + let fd + let position + + try { + try { + fd = fs.openSync(opt.file, 'r+') + } catch (er) { + if (er.code === 'ENOENT') + fd = fs.openSync(opt.file, 'w+') + else + throw er + } + + const st = fs.fstatSync(fd) + const headBuf = Buffer.alloc(512) + + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = fs.readSync( + fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos + ) + + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + throw new Error('cannot append to compressed archives') + + if (!bytes) + break POSITION + } + + let h = new Header(headBuf) + if (!h.cksumValid) + break + let entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > st.size) + break + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + } + threw = false + + streamSync(opt, p, position, fd, files) + } finally { + if (threw) + try { fs.closeSync(fd) } catch (er) {} + } +} + +const streamSync = (opt, p, position, fd, files) => { + const stream = new fsm.WriteStreamSync(opt.file, { + fd: fd, + start: position + }) + p.pipe(stream) + addFilesSync(p, files) +} + +const replace = (opt, files, cb) => { + files = Array.from(files) + const p = new Pack(opt) + + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) + fs.close(fd, _ => cb_(er)) + else + cb_(null, pos) + } + + let position = 0 + if (size === 0) + return cb(null, 0) + + let bufPos = 0 + const headBuf = Buffer.alloc(512) + const onread = (er, bytes) => { + if (er) + return cb(er) + bufPos += bytes + if (bufPos < 512 && bytes) + return fs.read( + fd, headBuf, bufPos, headBuf.length - bufPos, + position + bufPos, onread + ) + + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + return cb(new Error('cannot append to compressed archives')) + + // truncated header + if (bufPos < 512) + return cb(null, position) + + const h = new Header(headBuf) + if (!h.cksumValid) + return cb(null, position) + + const entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > size) + return cb(null, position) + + position += entryBlockSize + 512 + if (position >= size) + return cb(null, position) + + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + bufPos = 0 + fs.read(fd, headBuf, 0, 512, position, onread) + } + fs.read(fd, headBuf, 0, 512, position, onread) + } + + const promise = new Promise((resolve, reject) => { + p.on('error', reject) + let flag = 'r+' + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+' + return fs.open(opt.file, flag, onopen) + } + + if (er) + return reject(er) + + fs.fstat(fd, (er, st) => { + if (er) + return reject(er) + getPos(fd, st.size, (er, position) => { + if (er) + return reject(er) + const stream = new fsm.WriteStream(opt.file, { + fd: fd, + start: position + }) + p.pipe(stream) + stream.on('error', reject) + stream.on('close', resolve) + addFilesAsync(p, files) + }) + }) + } + fs.open(opt.file, flag, onopen) + }) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry) + }) + else + p.add(file) + }) + p.end() +} + +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry) + }).then(_ => addFilesAsync(p, files)) + else + p.add(file) + } + p.end() +} diff --git a/node_modules/tar/lib/types.js b/node_modules/tar/lib/types.js new file mode 100644 index 0000000..df42565 --- /dev/null +++ b/node_modules/tar/lib/types.js @@ -0,0 +1,44 @@ +'use strict' +// map types from key to human-friendly name +exports.name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'] +]) + +// map the other direction +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])) diff --git a/node_modules/tar/lib/unpack.js b/node_modules/tar/lib/unpack.js new file mode 100644 index 0000000..fc76509 --- /dev/null +++ b/node_modules/tar/lib/unpack.js @@ -0,0 +1,621 @@ +'use strict' + +const assert = require('assert') +const EE = require('events').EventEmitter +const Parser = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') +const mkdir = require('./mkdir.js') +const mkdirSync = mkdir.sync +const wc = require('./winchars.js') + +const ONENTRY = Symbol('onEntry') +const CHECKFS = Symbol('checkFs') +const ISREUSABLE = Symbol('isReusable') +const MAKEFS = Symbol('makeFs') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const LINK = Symbol('link') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const UNSUPPORTED = Symbol('unsupported') +const UNKNOWN = Symbol('unknown') +const CHECKPATH = Symbol('checkPath') +const MKDIR = Symbol('mkdir') +const ONERROR = Symbol('onError') +const PENDING = Symbol('pending') +const PEND = Symbol('pend') +const UNPEND = Symbol('unpend') +const ENDED = Symbol('ended') +const MAYBECLOSE = Symbol('maybeClose') +const SKIP = Symbol('skip') +const DOCHOWN = Symbol('doChown') +const UID = Symbol('uid') +const GID = Symbol('gid') +const crypto = require('crypto') + +// Unlinks on Windows are not atomic. +// +// This means that if you have a file entry, followed by another +// file entry with an identical name, and you cannot re-use the file +// (because it's a hardlink, or because unlink:true is set, or it's +// Windows, which does not have useful nlink values), then the unlink +// will be committed to the disk AFTER the new file has been written +// over the old one, deleting the new file. +// +// To work around this, on Windows systems, we rename the file and then +// delete the renamed file. It's a sloppy kludge, but frankly, I do not +// know of a better way to do this, given windows' non-atomic unlink +// semantics. +// +// See: https://github.com/npm/node-tar/issues/183 +/* istanbul ignore next */ +const unlinkFile = (path, cb) => { + if (process.platform !== 'win32') + return fs.unlink(path, cb) + + const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex') + fs.rename(path, name, er => { + if (er) + return cb(er) + fs.unlink(name, cb) + }) +} + +/* istanbul ignore next */ +const unlinkFileSync = path => { + if (process.platform !== 'win32') + return fs.unlinkSync(path) + + const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex') + fs.renameSync(path, name) + fs.unlinkSync(name) +} + +// this.gid, entry.gid, this.processUid +const uint32 = (a, b, c) => + a === a >>> 0 ? a + : b === b >>> 0 ? b + : c + +class Unpack extends Parser { + constructor (opt) { + if (!opt) + opt = {} + + opt.ondone = _ => { + this[ENDED] = true + this[MAYBECLOSE]() + } + + super(opt) + + this.transform = typeof opt.transform === 'function' ? opt.transform : null + + this.writable = true + this.readable = false + + this[PENDING] = 0 + this[ENDED] = false + + this.dirCache = opt.dirCache || new Map() + + if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { + // need both or neither + if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number') + throw new TypeError('cannot set owner without number uid and gid') + if (opt.preserveOwner) + throw new TypeError( + 'cannot preserve owner in archive and also set owner explicitly') + this.uid = opt.uid + this.gid = opt.gid + this.setOwner = true + } else { + this.uid = null + this.gid = null + this.setOwner = false + } + + // default true for root + if (opt.preserveOwner === undefined && typeof opt.uid !== 'number') + this.preserveOwner = process.getuid && process.getuid() === 0 + else + this.preserveOwner = !!opt.preserveOwner + + this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() : null + this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() : null + + // mostly just for testing, but useful in some cases. + // Forcibly trigger a chown on every entry, no matter what + this.forceChown = opt.forceChown === true + + // turn > this[ONENTRY](entry)) + } + + [MAYBECLOSE] () { + if (this[ENDED] && this[PENDING] === 0) { + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + } + } + + [CHECKPATH] (entry) { + if (this.strip) { + const parts = entry.path.split(/\/|\\/) + if (parts.length < this.strip) + return false + entry.path = parts.slice(this.strip).join('/') + + if (entry.type === 'Link') { + const linkparts = entry.linkpath.split(/\/|\\/) + if (linkparts.length >= this.strip) + entry.linkpath = linkparts.slice(this.strip).join('/') + } + } + + if (!this.preservePaths) { + const p = entry.path + if (p.match(/(^|\/|\\)\.\.(\\|\/|$)/)) { + this.warn('path contains \'..\'', p) + return false + } + + // absolutes on posix are also absolutes on win32 + // so we only need to test this one to get both + if (path.win32.isAbsolute(p)) { + const parsed = path.win32.parse(p) + this.warn('stripping ' + parsed.root + ' from absolute path', p) + entry.path = p.substr(parsed.root.length) + } + } + + // only encode : chars that aren't drive letter indicators + if (this.win32) { + const parsed = path.win32.parse(entry.path) + entry.path = parsed.root === '' ? wc.encode(entry.path) + : parsed.root + wc.encode(entry.path.substr(parsed.root.length)) + } + + if (path.isAbsolute(entry.path)) + entry.absolute = entry.path + else + entry.absolute = path.resolve(this.cwd, entry.path) + + return true + } + + [ONENTRY] (entry) { + if (!this[CHECKPATH](entry)) + return entry.resume() + + assert.equal(typeof entry.absolute, 'string') + + switch (entry.type) { + case 'Directory': + case 'GNUDumpDir': + if (entry.mode) + entry.mode = entry.mode | 0o700 + + case 'File': + case 'OldFile': + case 'ContiguousFile': + case 'Link': + case 'SymbolicLink': + return this[CHECKFS](entry) + + case 'CharacterDevice': + case 'BlockDevice': + case 'FIFO': + return this[UNSUPPORTED](entry) + } + } + + [ONERROR] (er, entry) { + // Cwd has to exist, or else nothing works. That's serious. + // Other errors are warnings, which raise the error in strict + // mode, but otherwise continue on. + if (er.name === 'CwdError') + this.emit('error', er) + else { + this.warn(er.message, er) + this[UNPEND]() + entry.resume() + } + } + + [MKDIR] (dir, mode, cb) { + mkdir(dir, { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode + }, cb) + } + + [DOCHOWN] (entry) { + // in preserve owner mode, chown if the entry doesn't match process + // in set owner mode, chown if setting doesn't match process + return this.forceChown || + this.preserveOwner && + ( typeof entry.uid === 'number' && entry.uid !== this.processUid || + typeof entry.gid === 'number' && entry.gid !== this.processGid ) + || + ( typeof this.uid === 'number' && this.uid !== this.processUid || + typeof this.gid === 'number' && this.gid !== this.processGid ) + } + + [UID] (entry) { + return uint32(this.uid, entry.uid, this.processUid) + } + + [GID] (entry) { + return uint32(this.gid, entry.gid, this.processGid) + } + + [FILE] (entry) { + const mode = entry.mode & 0o7777 || this.fmode + const stream = new fsm.WriteStream(entry.absolute, { + mode: mode, + autoClose: false + }) + stream.on('error', er => this[ONERROR](er, entry)) + + let actions = 1 + const done = er => { + if (er) + return this[ONERROR](er, entry) + + if (--actions === 0) + fs.close(stream.fd, _ => this[UNPEND]()) + } + + stream.on('finish', _ => { + // if futimes fails, try utimes + // if utimes fails, fail with the original error + // same for fchown/chown + const abs = entry.absolute + const fd = stream.fd + + if (entry.mtime && !this.noMtime) { + actions++ + const atime = entry.atime || new Date() + const mtime = entry.mtime + fs.futimes(fd, atime, mtime, er => + er ? fs.utimes(abs, atime, mtime, er2 => done(er2 && er)) + : done()) + } + + if (this[DOCHOWN](entry)) { + actions++ + const uid = this[UID](entry) + const gid = this[GID](entry) + fs.fchown(fd, uid, gid, er => + er ? fs.chown(abs, uid, gid, er2 => done(er2 && er)) + : done()) + } + + done() + }) + + const tx = this.transform ? this.transform(entry) || entry : entry + if (tx !== entry) { + tx.on('error', er => this[ONERROR](er, entry)) + entry.pipe(tx) + } + tx.pipe(stream) + } + + [DIRECTORY] (entry) { + const mode = entry.mode & 0o7777 || this.dmode + this[MKDIR](entry.absolute, mode, er => { + if (er) + return this[ONERROR](er, entry) + + let actions = 1 + const done = _ => { + if (--actions === 0) { + this[UNPEND]() + entry.resume() + } + } + + if (entry.mtime && !this.noMtime) { + actions++ + fs.utimes(entry.absolute, entry.atime || new Date(), entry.mtime, done) + } + + if (this[DOCHOWN](entry)) { + actions++ + fs.chown(entry.absolute, this[UID](entry), this[GID](entry), done) + } + + done() + }) + } + + [UNSUPPORTED] (entry) { + this.warn('unsupported entry type: ' + entry.type, entry) + entry.resume() + } + + [SYMLINK] (entry) { + this[LINK](entry, entry.linkpath, 'symlink') + } + + [HARDLINK] (entry) { + this[LINK](entry, path.resolve(this.cwd, entry.linkpath), 'link') + } + + [PEND] () { + this[PENDING]++ + } + + [UNPEND] () { + this[PENDING]-- + this[MAYBECLOSE]() + } + + [SKIP] (entry) { + this[UNPEND]() + entry.resume() + } + + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE] (entry, st) { + return entry.type === 'File' && + !this.unlink && + st.isFile() && + st.nlink <= 1 && + process.platform !== 'win32' + } + + // check if a thing is there, and if so, try to clobber it + [CHECKFS] (entry) { + this[PEND]() + this[MKDIR](path.dirname(entry.absolute), this.dmode, er => { + if (er) + return this[ONERROR](er, entry) + fs.lstat(entry.absolute, (er, st) => { + if (st && (this.keep || this.newer && st.mtime > entry.mtime)) + this[SKIP](entry) + else if (er || this[ISREUSABLE](entry, st)) + this[MAKEFS](null, entry) + else if (st.isDirectory()) { + if (entry.type === 'Directory') { + if (!entry.mode || (st.mode & 0o7777) === entry.mode) + this[MAKEFS](null, entry) + else + fs.chmod(entry.absolute, entry.mode, er => this[MAKEFS](er, entry)) + } else + fs.rmdir(entry.absolute, er => this[MAKEFS](er, entry)) + } else + unlinkFile(entry.absolute, er => this[MAKEFS](er, entry)) + }) + }) + } + + [MAKEFS] (er, entry) { + if (er) + return this[ONERROR](er, entry) + + switch (entry.type) { + case 'File': + case 'OldFile': + case 'ContiguousFile': + return this[FILE](entry) + + case 'Link': + return this[HARDLINK](entry) + + case 'SymbolicLink': + return this[SYMLINK](entry) + + case 'Directory': + case 'GNUDumpDir': + return this[DIRECTORY](entry) + } + } + + [LINK] (entry, linkpath, link) { + // XXX: get the type ('file' or 'dir') for windows + fs[link](linkpath, entry.absolute, er => { + if (er) + return this[ONERROR](er, entry) + this[UNPEND]() + entry.resume() + }) + } +} + +class UnpackSync extends Unpack { + constructor (opt) { + super(opt) + } + + [CHECKFS] (entry) { + const er = this[MKDIR](path.dirname(entry.absolute), this.dmode) + if (er) + return this[ONERROR](er, entry) + try { + const st = fs.lstatSync(entry.absolute) + if (this.keep || this.newer && st.mtime > entry.mtime) + return this[SKIP](entry) + else if (this[ISREUSABLE](entry, st)) + return this[MAKEFS](null, entry) + else { + try { + if (st.isDirectory()) { + if (entry.type === 'Directory') { + if (entry.mode && (st.mode & 0o7777) !== entry.mode) + fs.chmodSync(entry.absolute, entry.mode) + } else + fs.rmdirSync(entry.absolute) + } else + unlinkFileSync(entry.absolute) + return this[MAKEFS](null, entry) + } catch (er) { + return this[ONERROR](er, entry) + } + } + } catch (er) { + return this[MAKEFS](null, entry) + } + } + + [FILE] (entry) { + const mode = entry.mode & 0o7777 || this.fmode + + const oner = er => { + try { fs.closeSync(fd) } catch (_) {} + if (er) + this[ONERROR](er, entry) + } + + let stream + let fd + try { + fd = fs.openSync(entry.absolute, 'w', mode) + } catch (er) { + return oner(er) + } + const tx = this.transform ? this.transform(entry) || entry : entry + if (tx !== entry) { + tx.on('error', er => this[ONERROR](er, entry)) + entry.pipe(tx) + } + + tx.on('data', chunk => { + try { + fs.writeSync(fd, chunk, 0, chunk.length) + } catch (er) { + oner(er) + } + }) + + tx.on('end', _ => { + let er = null + // try both, falling futimes back to utimes + // if either fails, handle the first error + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || new Date() + const mtime = entry.mtime + try { + fs.futimesSync(fd, atime, mtime) + } catch (futimeser) { + try { + fs.utimesSync(entry.absolute, atime, mtime) + } catch (utimeser) { + er = futimeser + } + } + } + + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry) + const gid = this[GID](entry) + + try { + fs.fchownSync(fd, uid, gid) + } catch (fchowner) { + try { + fs.chownSync(entry.absolute, uid, gid) + } catch (chowner) { + er = er || fchowner + } + } + } + + oner(er) + }) + } + + [DIRECTORY] (entry) { + const mode = entry.mode & 0o7777 || this.dmode + const er = this[MKDIR](entry.absolute, mode) + if (er) + return this[ONERROR](er, entry) + if (entry.mtime && !this.noMtime) { + try { + fs.utimesSync(entry.absolute, entry.atime || new Date(), entry.mtime) + } catch (er) {} + } + if (this[DOCHOWN](entry)) { + try { + fs.chownSync(entry.absolute, this[UID](entry), this[GID](entry)) + } catch (er) {} + } + entry.resume() + } + + [MKDIR] (dir, mode) { + try { + return mkdir.sync(dir, { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode + }) + } catch (er) { + return er + } + } + + [LINK] (entry, linkpath, link) { + try { + fs[link + 'Sync'](linkpath, entry.absolute) + entry.resume() + } catch (er) { + return this[ONERROR](er, entry) + } + } +} + +Unpack.Sync = UnpackSync +module.exports = Unpack diff --git a/node_modules/tar/lib/update.js b/node_modules/tar/lib/update.js new file mode 100644 index 0000000..16c3e93 --- /dev/null +++ b/node_modules/tar/lib/update.js @@ -0,0 +1,36 @@ +'use strict' + +// tar -u + +const hlo = require('./high-level-opt.js') +const r = require('./replace.js') +// just call tar.r with the filter and mtimeCache + +const u = module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) + + if (!opt.file) + throw new TypeError('file is required') + + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + mtimeFilter(opt) + return r(opt, files, cb) +} + +const mtimeFilter = opt => { + const filter = opt.filter + + if (!opt.mtimeCache) + opt.mtimeCache = new Map() + + opt.filter = filter ? (path, stat) => + filter(path, stat) && !(opt.mtimeCache.get(path) > stat.mtime) + : (path, stat) => !(opt.mtimeCache.get(path) > stat.mtime) +} diff --git a/node_modules/tar/lib/warn-mixin.js b/node_modules/tar/lib/warn-mixin.js new file mode 100644 index 0000000..94a4b9b --- /dev/null +++ b/node_modules/tar/lib/warn-mixin.js @@ -0,0 +1,14 @@ +'use strict' +module.exports = Base => class extends Base { + warn (msg, data) { + if (!this.strict) + this.emit('warn', msg, data) + else if (data instanceof Error) + this.emit('error', data) + else { + const er = new Error(msg) + er.data = data + this.emit('error', er) + } + } +} diff --git a/node_modules/tar/lib/winchars.js b/node_modules/tar/lib/winchars.js new file mode 100644 index 0000000..cf6ea06 --- /dev/null +++ b/node_modules/tar/lib/winchars.js @@ -0,0 +1,23 @@ +'use strict' + +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. + +const raw = [ + '|', + '<', + '>', + '?', + ':' +] + +const win = raw.map(char => + String.fromCharCode(0xf000 + char.charCodeAt(0))) + +const toWin = new Map(raw.map((char, i) => [char, win[i]])) +const toRaw = new Map(win.map((char, i) => [char, raw[i]])) + +module.exports = { + encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s), + decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s) +} diff --git a/node_modules/tar/lib/write-entry.js b/node_modules/tar/lib/write-entry.js new file mode 100644 index 0000000..0c01900 --- /dev/null +++ b/node_modules/tar/lib/write-entry.js @@ -0,0 +1,422 @@ +'use strict' +const Buffer = require('./buffer.js') +const MiniPass = require('minipass') +const Pax = require('./pax.js') +const Header = require('./header.js') +const ReadEntry = require('./read-entry.js') +const fs = require('fs') +const path = require('path') + +const types = require('./types.js') +const maxReadSize = 16 * 1024 * 1024 +const PROCESS = Symbol('process') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const HEADER = Symbol('header') +const READ = Symbol('read') +const LSTAT = Symbol('lstat') +const ONLSTAT = Symbol('onlstat') +const ONREAD = Symbol('onread') +const ONREADLINK = Symbol('onreadlink') +const OPENFILE = Symbol('openfile') +const ONOPENFILE = Symbol('onopenfile') +const CLOSE = Symbol('close') +const MODE = Symbol('mode') +const warner = require('./warn-mixin.js') +const winchars = require('./winchars.js') + +const modeFix = require('./mode-fix.js') + +const WriteEntry = warner(class WriteEntry extends MiniPass { + constructor (p, opt) { + opt = opt || {} + super(opt) + if (typeof p !== 'string') + throw new TypeError('path is required') + this.path = p + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable + // until node has builtin pwnam functions, this'll have to do + this.myuid = process.getuid && process.getuid() + this.myuser = process.env.USER || '' + this.maxReadSize = opt.maxReadSize || maxReadSize + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.preservePaths = !!opt.preservePaths + this.cwd = opt.cwd || process.cwd() + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null + + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + if (!this.preservePaths && path.win32.isAbsolute(p)) { + // absolutes on posix are also absolutes on win32 + // so we only need to test this one to get both + const parsed = path.win32.parse(p) + this.warn('stripping ' + parsed.root + ' from absolute path', p) + this.path = p.substr(parsed.root.length) + } + + this.win32 = !!opt.win32 || process.platform === 'win32' + if (this.win32) { + this.path = winchars.decode(this.path.replace(/\\/g, '/')) + p = p.replace(/\\/g, '/') + } + + this.absolute = opt.absolute || path.resolve(this.cwd, p) + + if (this.path === '') + this.path = './' + + if (this.statCache.has(this.absolute)) + this[ONLSTAT](this.statCache.get(this.absolute)) + else + this[LSTAT]() + } + + [LSTAT] () { + fs.lstat(this.absolute, (er, stat) => { + if (er) + return this.emit('error', er) + this[ONLSTAT](stat) + }) + } + + [ONLSTAT] (stat) { + this.statCache.set(this.absolute, stat) + this.stat = stat + if (!stat.isFile()) + stat.size = 0 + this.type = getType(stat) + this.emit('stat', stat) + this[PROCESS]() + } + + [PROCESS] () { + switch (this.type) { + case 'File': return this[FILE]() + case 'Directory': return this[DIRECTORY]() + case 'SymbolicLink': return this[SYMLINK]() + // unsupported types are ignored. + default: return this.end() + } + } + + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory') + } + + [HEADER] () { + if (this.type === 'Directory' && this.portable) + this.noMtime = true + + this.header = new Header({ + path: this.path, + linkpath: this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? null : this.stat.uid, + gid: this.portable ? null : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? null : this.mtime || this.stat.mtime, + type: this.type, + uname: this.portable ? null : + this.stat.uid === this.myuid ? this.myuser : '', + atime: this.portable ? null : this.stat.atime, + ctime: this.portable ? null : this.stat.ctime + }) + + if (this.header.encode() && !this.noPax) + this.write(new Pax({ + atime: this.portable ? null : this.header.atime, + ctime: this.portable ? null : this.header.ctime, + gid: this.portable ? null : this.header.gid, + mtime: this.noMtime ? null : this.mtime || this.header.mtime, + path: this.path, + linkpath: this.linkpath, + size: this.header.size, + uid: this.portable ? null : this.header.uid, + uname: this.portable ? null : this.header.uname, + dev: this.portable ? null : this.stat.dev, + ino: this.portable ? null : this.stat.ino, + nlink: this.portable ? null : this.stat.nlink + }).encode()) + this.write(this.header.block) + } + + [DIRECTORY] () { + if (this.path.substr(-1) !== '/') + this.path += '/' + this.stat.size = 0 + this[HEADER]() + this.end() + } + + [SYMLINK] () { + fs.readlink(this.absolute, (er, linkpath) => { + if (er) + return this.emit('error', er) + this[ONREADLINK](linkpath) + }) + } + + [ONREADLINK] (linkpath) { + this.linkpath = linkpath + this[HEADER]() + this.end() + } + + [HARDLINK] (linkpath) { + this.type = 'Link' + this.linkpath = path.relative(this.cwd, linkpath) + this.stat.size = 0 + this[HEADER]() + this.end() + } + + [FILE] () { + if (this.stat.nlink > 1) { + const linkKey = this.stat.dev + ':' + this.stat.ino + if (this.linkCache.has(linkKey)) { + const linkpath = this.linkCache.get(linkKey) + if (linkpath.indexOf(this.cwd) === 0) + return this[HARDLINK](linkpath) + } + this.linkCache.set(linkKey, this.absolute) + } + + this[HEADER]() + if (this.stat.size === 0) + return this.end() + + this[OPENFILE]() + } + + [OPENFILE] () { + fs.open(this.absolute, 'r', (er, fd) => { + if (er) + return this.emit('error', er) + this[ONOPENFILE](fd) + }) + } + + [ONOPENFILE] (fd) { + const blockLen = 512 * Math.ceil(this.stat.size / 512) + const bufLen = Math.min(blockLen, this.maxReadSize) + const buf = Buffer.allocUnsafe(bufLen) + this[READ](fd, buf, 0, buf.length, 0, this.stat.size, blockLen) + } + + [READ] (fd, buf, offset, length, pos, remain, blockRemain) { + fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) + return this[CLOSE](fd, _ => this.emit('error', er)) + this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) + }) + } + + [CLOSE] (fd, cb) { + fs.close(fd, cb) + } + + [ONREAD] (fd, buf, offset, length, pos, remain, blockRemain, bytesRead) { + if (bytesRead <= 0 && remain > 0) { + const er = new Error('encountered unexpected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + this[CLOSE](fd, _ => _) + return this.emit('error', er) + } + + if (bytesRead > remain) { + const er = new Error('did not encounter expected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + this[CLOSE](fd, _ => _) + return this.emit('error', er) + } + + // null out the rest of the buffer, if we could fit the block padding + if (bytesRead === remain) { + for (let i = bytesRead; i < length && bytesRead < blockRemain; i++) { + buf[i + offset] = 0 + bytesRead ++ + remain ++ + } + } + + const writeBuf = offset === 0 && bytesRead === buf.length ? + buf : buf.slice(offset, offset + bytesRead) + remain -= bytesRead + blockRemain -= bytesRead + pos += bytesRead + offset += bytesRead + + this.write(writeBuf) + + if (!remain) { + if (blockRemain) + this.write(Buffer.alloc(blockRemain)) + this.end() + this[CLOSE](fd, _ => _) + return + } + + if (offset >= length) { + buf = Buffer.allocUnsafe(length) + offset = 0 + } + length = buf.length - offset + this[READ](fd, buf, offset, length, pos, remain, blockRemain) + } +}) + +class WriteEntrySync extends WriteEntry { + constructor (path, opt) { + super(path, opt) + } + + [LSTAT] () { + this[ONLSTAT](fs.lstatSync(this.absolute)) + } + + [SYMLINK] () { + this[ONREADLINK](fs.readlinkSync(this.absolute)) + } + + [OPENFILE] () { + this[ONOPENFILE](fs.openSync(this.absolute, 'r')) + } + + [READ] (fd, buf, offset, length, pos, remain, blockRemain) { + let threw = true + try { + const bytesRead = fs.readSync(fd, buf, offset, length, pos) + this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) + threw = false + } finally { + if (threw) + try { this[CLOSE](fd) } catch (er) {} + } + } + + [CLOSE] (fd) { + fs.closeSync(fd) + } +} + +const WriteEntryTar = warner(class WriteEntryTar extends MiniPass { + constructor (readEntry, opt) { + opt = opt || {} + super(opt) + this.preservePaths = !!opt.preservePaths + this.portable = !!opt.portable + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + + this.readEntry = readEntry + this.type = readEntry.type + if (this.type === 'Directory' && this.portable) + this.noMtime = true + + this.path = readEntry.path + this.mode = this[MODE](readEntry.mode) + this.uid = this.portable ? null : readEntry.uid + this.gid = this.portable ? null : readEntry.gid + this.uname = this.portable ? null : readEntry.uname + this.gname = this.portable ? null : readEntry.gname + this.size = readEntry.size + this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime + this.atime = this.portable ? null : readEntry.atime + this.ctime = this.portable ? null : readEntry.ctime + this.linkpath = readEntry.linkpath + + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + if (path.isAbsolute(this.path) && !this.preservePaths) { + const parsed = path.parse(this.path) + this.warn( + 'stripping ' + parsed.root + ' from absolute path', + this.path + ) + this.path = this.path.substr(parsed.root.length) + } + + this.remain = readEntry.size + this.blockRemain = readEntry.startBlockSize + + this.header = new Header({ + path: this.path, + linkpath: this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? null : this.uid, + gid: this.portable ? null : this.gid, + size: this.size, + mtime: this.noMtime ? null : this.mtime, + type: this.type, + uname: this.portable ? null : this.uname, + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime + }) + + if (this.header.encode() && !this.noPax) + super.write(new Pax({ + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime, + gid: this.portable ? null : this.gid, + mtime: this.noMtime ? null : this.mtime, + path: this.path, + linkpath: this.linkpath, + size: this.size, + uid: this.portable ? null : this.uid, + uname: this.portable ? null : this.uname, + dev: this.portable ? null : this.readEntry.dev, + ino: this.portable ? null : this.readEntry.ino, + nlink: this.portable ? null : this.readEntry.nlink + }).encode()) + + super.write(this.header.block) + readEntry.pipe(this) + } + + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory') + } + + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + this.blockRemain -= writeLen + return super.write(data) + } + + end () { + if (this.blockRemain) + this.write(Buffer.alloc(this.blockRemain)) + return super.end() + } +}) + +WriteEntry.Sync = WriteEntrySync +WriteEntry.Tar = WriteEntryTar + +const getType = stat => + stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported' + +module.exports = WriteEntry diff --git a/node_modules/tar/package.json b/node_modules/tar/package.json new file mode 100644 index 0000000..eafc71b --- /dev/null +++ b/node_modules/tar/package.json @@ -0,0 +1,85 @@ +{ + "_args": [ + [ + "tar@4.4.13", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "tar@4.4.13", + "_id": "tar@4.4.13", + "_inBundle": false, + "_integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "_location": "/tar", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "tar@4.4.13", + "name": "tar", + "escapedName": "tar", + "rawSpec": "4.4.13", + "saveSpec": null, + "fetchSpec": "4.4.13" + }, + "_requiredBy": [ + "/node-pre-gyp" + ], + "_resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "_spec": "4.4.13", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/npm/node-tar/issues" + }, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "description": "tar for node", + "devDependencies": { + "chmodr": "^1.2.0", + "end-of-stream": "^1.4.1", + "events-to-array": "^1.1.2", + "mutate-fs": "^2.1.1", + "rimraf": "^2.6.3", + "tap": "^14.6.5", + "tar-fs": "^1.16.3", + "tar-stream": "^1.6.2" + }, + "engines": { + "node": ">=4.5" + }, + "files": [ + "index.js", + "lib/" + ], + "homepage": "https://github.com/npm/node-tar#readme", + "license": "ISC", + "name": "tar", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-tar.git" + }, + "scripts": { + "bench": "for i in benchmarks/*/*.js; do echo $i; for j in {1..5}; do node $i || break; done; done", + "genparse": "node scripts/generate-parse-fixtures.js", + "postpublish": "git push origin --follow-tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap" + }, + "tap": { + "coverage-map": "map.js", + "check-coverage": true + }, + "version": "4.4.13" +} diff --git a/node_modules/tarn/LICENSE b/node_modules/tarn/LICENSE new file mode 100644 index 0000000..90fef6e --- /dev/null +++ b/node_modules/tarn/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Vincit Oy + +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/tarn/README.md b/node_modules/tarn/README.md new file mode 100644 index 0000000..1aab164 --- /dev/null +++ b/node_modules/tarn/README.md @@ -0,0 +1,178 @@ +[![Build Status](https://travis-ci.org/Vincit/tarn.js.svg?branch=master)](https://travis-ci.org/Vincit/tarn.js) + +## Why yet another resource pool? + +Tarn is focused on robustness and ability to recover from errors. Tarn has timeouts for all operations +that can fail or timeout so that you should never end up with pool full of crap. Tarn has a comprehensive +test suite and we are committed to adding tests and fixing all bugs that are found. + +Tarn will always remain simple. + +## Install + +``` +npm install tarn +``` + +## Usage + +```js +const { Pool, TimeoutError } = require('tarn'); + +const pool = new Pool({ + // function that creates a resource. You can either pass the resource + // to the callback(error, resource) or return a promise that resolves the resource + // (but not both). + create: cb => { + cb(null, new SomeResource()); + }, + + // validates a connection before it is used. Return true or false + // from it. If false is returned, the resource is destroyed and a + // another one is acquired. + validate: resource => { + return true; + }, + + // function that destroys a resource, should return promise if + // destroying is asynchronous operation + // (destroy does not support callback syntax like create) + destroy: someResource => { + someResource.cleanup(); + }, + + // logger function, noop by default + log: (message, logLevel) => console.log(`${logLevel}: ${message}`) + + // minimum size + min: 2, + + // maximum size + max: 10, + + // acquire promises are rejected after this many milliseconds + // if a resource cannot be acquired + acquireTimeoutMillis: 30000, + + // create operations are cancelled after this many milliseconds + // if a resource cannot be acquired + createTimeoutMillis: 30000, + + // destroy operations are awaited for at most this many milliseconds + // new resources will be created after this timeout + destroyTimeoutMillis: 5000, + + // free resouces are destroyed after this many milliseconds + idleTimeoutMillis: 30000, + + // how often to check for idle resources to destroy + reapIntervalMillis: 1000, + + // long long to idle after failed create before trying again + createRetryIntervalMillis: 200, + + // If true, when a create fails, the first pending acquire is + // rejected with the error. If this is false (the default) then + // create is retried until acquireTimeoutMillis milliseconds has + // passed. + propagateCreateError: false +}); + +// acquires a resource. The promise is rejected with `tarn.TimeoutError` +// after `acquireTimeoutMillis` if a resource could not be acquired. +const acquire = pool.acquire(); + +// acquire can be aborted using the abort method. +// If acquire had triggered creating new resource to the pool +// creation will continue and it is not aborted. +acquire.abort(); + +// the acquire object has a promise property that gets reolved with +// the acquired resource +try { + const resource = await acquire.promise; +} catch (err) { + // if the acquire times out an error of class TimeoutError is thrown + if (err instanceof TimeoutError) { + console.log('timeout'); + } +} + +// releases the resource. +pool.release(resource); + +// returns the number of non-free resources +pool.numUsed(); + +// returns the number of free resources +pool.numFree(); + +// how many acquires are waiting for a resource to be released +pool.numPendingAcquires(); + +// how many asynchronous create calls are running +pool.numPendingCreates(); + +// waits for all resources to be returned to the pool and destroys them. +// pool cannot be used after this. +await pool.destroy(); + +// The following examples add synchronous event handlers for example to +// allow externally collect diagnostic data of pool behaviour. +// If any of these hooks fail, all errors are catched and warnings are logged. + +// resource is acquired from pool +pool.on('acquireRequest', eventId => {}); +pool.on('acquireSuccess', (eventId, resource) => {}); +pool.on('acquireFail', (eventId, err) => {}); + +// resource returned to pool +pool.on('release', resource => {}); + +// resource was created and added to the pool +pool.on('createRequest', eventId => {}); +pool.on('createSuccess', (eventId, resource) => {}); +pool.on('createFail', (eventId, err) => {}); + +// resource is destroyed and evicted from pool +// resource may or may not be invalid when destroySuccess / destroyFail is called +pool.on('destroyRequest', (eventId, resource) => {}); +pool.on('destroySuccess', (eventId, resource) => {}); +pool.on('destroyFail', (eventId, resource, err) => {}); + +// when internal reaping event clock is activated / deactivated +pool.on('startReaping', () => {}); +pool.on('stopReaping', () => {}); + +// pool is destroyed (after poolDestroySuccess all event handlers are also cleared) +pool.on('poolDestroyRequest', eventId => {}); +pool.on('poolDestroySuccess', eventId => {}); + +// remove single event listener +pool.removeListener(eventName, listener); + +// remove all listeners from an event +pool.removeAllListeners(eventName); +``` + +## Changelog + +### Master + +### 2.0.0 2019-06-02 + +- Accidentally published breaking changes in 1.2.0. Unpublished it and published again with correct version number 2.0.0 #33 + +### 1.2.0 2019-06-02 (UNPUBLISHED) + +- Passing unknown options throws an error #19 #32 +- Diagnostic event handlers to allow monitoring pool behaviour #14 #23 +- Dropped node 6 support #25 #28 +- pool.destroy() now always waits for all pending destroys to finish before resolving #29 + +### 1.1.5 2019-04-06 + +- Added changelog #22 +- Handle opt.destroy() being a promise with destroyTimeout #16 +- Explicitly silence bluebird warnings #17 +- Add strict typings via TypeScript #10 diff --git a/node_modules/tarn/lib/PendingOperation.d.ts b/node_modules/tarn/lib/PendingOperation.d.ts new file mode 100644 index 0000000..71341bb --- /dev/null +++ b/node_modules/tarn/lib/PendingOperation.d.ts @@ -0,0 +1,11 @@ +import { Deferred } from './utils'; +export declare class PendingOperation { + protected timeoutMillis: number; + possibleTimeoutCause: Error | null; + promise: Promise; + protected deferred: Deferred; + constructor(timeoutMillis: number); + abort(): void; + reject(err: Error): void; + resolve(value: T): void; +} diff --git a/node_modules/tarn/lib/PendingOperation.js b/node_modules/tarn/lib/PendingOperation.js new file mode 100644 index 0000000..3b74751 --- /dev/null +++ b/node_modules/tarn/lib/PendingOperation.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const TimeoutError_1 = require("./TimeoutError"); +const utils_1 = require("./utils"); +class PendingOperation { + constructor(timeoutMillis) { + this.timeoutMillis = timeoutMillis; + this.deferred = utils_1.defer(); + this.possibleTimeoutCause = null; + this.promise = timeout(this.deferred.promise, timeoutMillis).catch(err => { + if (err instanceof TimeoutError_1.TimeoutError) { + if (this.possibleTimeoutCause) { + err = new TimeoutError_1.TimeoutError(this.possibleTimeoutCause.message); + } + else { + err = new TimeoutError_1.TimeoutError('operation timed out for an unknown reason'); + } + } + return Promise.reject(err); + }); + } + abort() { + this.reject(new Error('aborted')); + } + reject(err) { + this.deferred.reject(err); + } + resolve(value) { + this.deferred.resolve(value); + } +} +exports.PendingOperation = PendingOperation; +function timeout(promise, time) { + return new Promise((resolve, reject) => { + const timeoutHandle = setTimeout(() => reject(new TimeoutError_1.TimeoutError()), time); + promise + .then(result => { + clearTimeout(timeoutHandle); + resolve(result); + }) + .catch(err => { + clearTimeout(timeoutHandle); + reject(err); + }); + }); +} diff --git a/node_modules/tarn/lib/Pool.d.ts b/node_modules/tarn/lib/Pool.d.ts new file mode 100644 index 0000000..2360ca7 --- /dev/null +++ b/node_modules/tarn/lib/Pool.d.ts @@ -0,0 +1,83 @@ +import { PendingOperation } from './PendingOperation'; +import { Resource } from './Resource'; +import { EventEmitter } from 'events'; +export interface PoolOptions { + create: CallbackOrPromise; + destroy: (resource: T) => any; + min: number; + max: number; + acquireTimeoutMillis?: number; + createTimeoutMillis?: number; + destroyTimeoutMillis?: number; + idleTimeoutMillis?: number; + createRetryIntervalMillis?: number; + reapIntervalMillis?: number; + log?: (msg: string) => any; + validate?: (resource: T) => boolean; + propagateCreateError?: boolean; +} +export declare class Pool { + protected min: number; + protected max: number; + protected used: Resource[]; + protected free: Resource[]; + protected pendingCreates: PendingOperation[]; + protected pendingAcquires: PendingOperation[]; + protected pendingDestroys: PendingOperation[]; + protected interval: NodeJS.Timer | null; + protected destroyed: boolean; + protected propagateCreateError: boolean; + protected idleTimeoutMillis: number; + protected createRetryIntervalMillis: number; + protected reapIntervalMillis: number; + protected createTimeoutMillis: number; + protected destroyTimeoutMillis: number; + protected acquireTimeoutMillis: number; + protected log: (msg: string, level: 'warn') => any; + protected creator: CallbackOrPromise; + protected destroyer: (resource: T) => any; + protected validate: (resource: T) => boolean; + protected eventId: number; + protected emitter: EventEmitter; + constructor(opt: PoolOptions); + numUsed(): number; + numFree(): number; + numPendingAcquires(): number; + numPendingCreates(): number; + acquire(): PendingOperation; + release(resource: T): boolean; + isEmpty(): boolean; + check(): void; + destroy(): Promise | import("./PromiseInspection").PromiseInspection>; + on(eventName: 'acquireRequest', handler: (eventId: number) => void): void; + on(eventName: 'acquireSuccess', handler: (eventId: number, resource: T) => void): void; + on(eventName: 'acquireFail', handler: (eventId: number, err: Error) => void): void; + on(eventName: 'release', handler: (resource: T) => void): void; + on(eventName: 'createRequest', handler: (eventId: number) => void): void; + on(eventName: 'createSuccess', handler: (eventId: number, resource: T) => void): void; + on(eventName: 'createFail', handler: (eventId: number, err: Error) => void): void; + on(eventName: 'destroyRequest', handler: (eventId: number, resource: T) => void): void; + on(eventName: 'destroySuccess', handler: (eventId: number, resource: T) => void): void; + on(eventName: 'destroyFail', handler: (eventId: number, resource: T, err: Error) => void): void; + on(eventName: 'startReaping', handler: () => void): void; + on(eventName: 'stopReaping', handler: () => void): void; + on(eventName: 'poolDestroyRequest', handler: (eventId: number) => void): void; + on(eventName: 'poolDestroySuccess', handler: (eventId: number) => void): void; + removeListener(event: string | symbol, listener: (...args: any[]) => void): void; + removeAllListeners(event?: string | symbol | undefined): void; + _tryAcquireOrCreate(): void; + _hasFreeResources(): boolean; + _doAcquire(): void; + _canAcquire(): boolean; + _validateResource(resource: T): boolean; + _shouldCreateMoreResources(): boolean; + _doCreate(): void; + _create(): PendingOperation; + _destroy(resource: T): Promise; + _logDestroyerError(eventId: number, resource: T, err: Error): void; + _startReaping(): void; + _stopReaping(): void; + _executeEventHandlers(eventName: string, ...args: any): void; +} +export declare type Callback = (err: Error | null, resource: T) => any; +export declare type CallbackOrPromise = (cb: Callback) => any | (() => Promise); diff --git a/node_modules/tarn/lib/Pool.js b/node_modules/tarn/lib/Pool.js new file mode 100644 index 0000000..9ef2abf --- /dev/null +++ b/node_modules/tarn/lib/Pool.js @@ -0,0 +1,402 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const PendingOperation_1 = require("./PendingOperation"); +const Resource_1 = require("./Resource"); +const utils_1 = require("./utils"); +const events_1 = require("events"); +class Pool { + constructor(opt) { + this.destroyed = false; + this.emitter = new events_1.EventEmitter(); + opt = opt || {}; + if (!opt.create) { + throw new Error('Tarn: opt.create function most be provided'); + } + if (!opt.destroy) { + throw new Error('Tarn: opt.destroy function most be provided'); + } + if (typeof opt.min !== 'number' || opt.min < 0 || opt.min !== Math.round(opt.min)) { + throw new Error('Tarn: opt.min must be an integer >= 0'); + } + if (typeof opt.max !== 'number' || opt.max <= 0 || opt.max !== Math.round(opt.max)) { + throw new Error('Tarn: opt.max must be an integer > 0'); + } + if (opt.min > opt.max) { + throw new Error('Tarn: opt.max is smaller than opt.min'); + } + if (!utils_1.checkOptionalTime(opt.acquireTimeoutMillis)) { + throw new Error('Tarn: invalid opt.acquireTimeoutMillis ' + JSON.stringify(opt.acquireTimeoutMillis)); + } + if (!utils_1.checkOptionalTime(opt.createTimeoutMillis)) { + throw new Error('Tarn: invalid opt.createTimeoutMillis ' + JSON.stringify(opt.createTimeoutMillis)); + } + if (!utils_1.checkOptionalTime(opt.destroyTimeoutMillis)) { + throw new Error('Tarn: invalid opt.destroyTimeoutMillis ' + JSON.stringify(opt.destroyTimeoutMillis)); + } + if (!utils_1.checkOptionalTime(opt.idleTimeoutMillis)) { + throw new Error('Tarn: invalid opt.idleTimeoutMillis ' + JSON.stringify(opt.idleTimeoutMillis)); + } + if (!utils_1.checkOptionalTime(opt.reapIntervalMillis)) { + throw new Error('Tarn: invalid opt.reapIntervalMillis ' + JSON.stringify(opt.reapIntervalMillis)); + } + if (!utils_1.checkOptionalTime(opt.createRetryIntervalMillis)) { + throw new Error('Tarn: invalid opt.createRetryIntervalMillis ' + + JSON.stringify(opt.createRetryIntervalMillis)); + } + const allowedKeys = { + create: true, + validate: true, + destroy: true, + log: true, + min: true, + max: true, + acquireTimeoutMillis: true, + createTimeoutMillis: true, + destroyTimeoutMillis: true, + idleTimeoutMillis: true, + reapIntervalMillis: true, + createRetryIntervalMillis: true, + propagateCreateError: true + }; + for (let key of Object.keys(opt)) { + if (!allowedKeys[key]) { + throw new Error(`Tarn: unsupported option opt.${key}`); + } + } + this.creator = opt.create; + this.destroyer = opt.destroy; + this.validate = typeof opt.validate === 'function' ? opt.validate : () => true; + this.log = opt.log || (() => { }); + this.acquireTimeoutMillis = opt.acquireTimeoutMillis || 30000; + this.createTimeoutMillis = opt.createTimeoutMillis || 30000; + this.destroyTimeoutMillis = opt.destroyTimeoutMillis || 5000; + this.idleTimeoutMillis = opt.idleTimeoutMillis || 30000; + this.reapIntervalMillis = opt.reapIntervalMillis || 1000; + this.createRetryIntervalMillis = opt.createRetryIntervalMillis || 200; + this.propagateCreateError = !!opt.propagateCreateError; + this.min = opt.min; + this.max = opt.max; + this.used = []; + this.free = []; + this.pendingCreates = []; + this.pendingAcquires = []; + this.pendingDestroys = []; + this.destroyed = false; + this.interval = null; + this.eventId = 1; + } + numUsed() { + return this.used.length; + } + numFree() { + return this.free.length; + } + numPendingAcquires() { + return this.pendingAcquires.length; + } + numPendingCreates() { + return this.pendingCreates.length; + } + acquire() { + const eventId = this.eventId++; + this._executeEventHandlers('acquireRequest', eventId); + const pendingAcquire = new PendingOperation_1.PendingOperation(this.acquireTimeoutMillis); + this.pendingAcquires.push(pendingAcquire); + // If the acquire fails for whatever reason + // remove it from the pending queue. + pendingAcquire.promise = pendingAcquire.promise + .then(resource => { + this._executeEventHandlers('acquireSuccess', eventId, resource); + return resource; + }) + .catch(err => { + this._executeEventHandlers('acquireFail', eventId, err); + remove(this.pendingAcquires, pendingAcquire); + return Promise.reject(err); + }); + this._tryAcquireOrCreate(); + return pendingAcquire; + } + release(resource) { + this._executeEventHandlers('release', resource); + for (let i = 0, l = this.used.length; i < l; ++i) { + const used = this.used[i]; + if (used.resource === resource) { + this.used.splice(i, 1); + this.free.push(used.resolve()); + this._tryAcquireOrCreate(); + return true; + } + } + return false; + } + isEmpty() { + return ([this.numFree(), this.numUsed(), this.numPendingAcquires(), this.numPendingCreates()].reduce((total, value) => total + value) === 0); + } + check() { + const timestamp = utils_1.now(); + const newFree = []; + const minKeep = this.min - this.used.length; + const maxDestroy = this.free.length - minKeep; + let numDestroyed = 0; + this.free.forEach(free => { + if (utils_1.duration(timestamp, free.timestamp) >= this.idleTimeoutMillis && + numDestroyed < maxDestroy) { + numDestroyed++; + this._destroy(free.resource); + } + else { + newFree.push(free); + } + }); + this.free = newFree; + // Pool is completely empty, stop reaping. + // Next .acquire will start reaping interval again. + if (this.isEmpty()) { + this._stopReaping(); + } + } + destroy() { + const eventId = this.eventId++; + this._executeEventHandlers('poolDestroyRequest', eventId); + this._stopReaping(); + this.destroyed = true; + // First wait for all the pending creates get ready. + return utils_1.reflect(Promise.all(this.pendingCreates.map(create => utils_1.reflect(create.promise))) + .then(() => { + // Wait for all the used resources to be freed. + return Promise.all(this.used.map(used => utils_1.reflect(used.promise))); + }) + .then(() => { + // Abort all pending acquires. + return Promise.all(this.pendingAcquires.map(acquire => { + acquire.abort(); + return utils_1.reflect(acquire.promise); + })); + }) + .then(() => { + // Now we can destroy all the freed resources. + return Promise.all(this.free.map(free => utils_1.reflect(this._destroy(free.resource)))); + }) + .then(() => { + // Also wait rest of the pending destroys to finish + return Promise.all(this.pendingDestroys.map(pd => pd.promise)); + }) + .then(() => { + this.free = []; + this.pendingAcquires = []; + })).then(res => { + this._executeEventHandlers('poolDestroySuccess', eventId); + this.emitter.removeAllListeners(); + return res; + }); + } + on(event, listener) { + this.emitter.on(event, listener); + } + removeListener(event, listener) { + this.emitter.removeListener(event, listener); + } + removeAllListeners(event) { + this.emitter.removeAllListeners(event); + } + _tryAcquireOrCreate() { + if (this.destroyed) { + return; + } + if (this._hasFreeResources()) { + this._doAcquire(); + } + else if (this._shouldCreateMoreResources()) { + this._doCreate(); + } + } + _hasFreeResources() { + return this.free.length > 0; + } + _doAcquire() { + let didDestroyResources = false; + while (this._canAcquire()) { + const pendingAcquire = this.pendingAcquires[0]; + const free = this.free[this.free.length - 1]; + if (!this._validateResource(free.resource)) { + this.free.pop(); + this._destroy(free.resource); + didDestroyResources = true; + continue; + } + this.pendingAcquires.shift(); + this.free.pop(); + this.used.push(free.resolve()); + //At least one active resource, start reaping + this._startReaping(); + pendingAcquire.resolve(free.resource); + } + // If we destroyed invalid resources, we may need to create new ones. + if (didDestroyResources) { + this._tryAcquireOrCreate(); + } + } + _canAcquire() { + return this.free.length > 0 && this.pendingAcquires.length > 0; + } + _validateResource(resource) { + try { + return !!this.validate(resource); + } + catch (err) { + // There's nothing we can do here but log the error. This would otherwise + // leak out as an unhandled exception. + this.log('Tarn: resource validator threw an exception ' + err.stack, 'warn'); + return false; + } + } + _shouldCreateMoreResources() { + return (this.used.length + this.pendingCreates.length < this.max && + this.pendingCreates.length < this.pendingAcquires.length); + } + _doCreate() { + const pendingAcquiresBeforeCreate = this.pendingAcquires.slice(); + const pendingCreate = this._create(); + pendingCreate.promise + .then(() => { + // Not returned on purpose. + this._tryAcquireOrCreate(); + return null; + }) + .catch(err => { + if (this.propagateCreateError && this.pendingAcquires.length !== 0) { + // If propagateCreateError is true, we don't retry the create + // but reject the first pending acquire immediately. Intentionally + // use `this.pendingAcquires` instead of `pendingAcquiresBeforeCreate` + // in case some acquires in pendingAcquiresBeforeCreate have already + // been resolved. + this.pendingAcquires[0].reject(err); + } + // Save the create error to all pending acquires so that we can use it + // as the error to reject the acquire if it times out. + pendingAcquiresBeforeCreate.forEach(pendingAcquire => { + pendingAcquire.possibleTimeoutCause = err; + }); + // Not returned on purpose. + utils_1.delay(this.createRetryIntervalMillis).then(() => this._tryAcquireOrCreate()); + }); + } + _create() { + const eventId = this.eventId++; + this._executeEventHandlers('createRequest', eventId); + const pendingCreate = new PendingOperation_1.PendingOperation(this.createTimeoutMillis); + this.pendingCreates.push(pendingCreate); + callbackOrPromise(this.creator) + .then(resource => { + remove(this.pendingCreates, pendingCreate); + this.free.push(new Resource_1.Resource(resource)); + // Not returned on purpose. + pendingCreate.resolve(resource); + this._executeEventHandlers('createSuccess', eventId, resource); + return null; + }) + .catch(err => { + remove(this.pendingCreates, pendingCreate); + // Not returned on purpose. + pendingCreate.reject(err); + this._executeEventHandlers('createFail', eventId, err); + return null; + }); + return pendingCreate; + } + _destroy(resource) { + const eventId = this.eventId++; + this._executeEventHandlers('destroyRequest', eventId, resource); + // this.destroyer can be both synchronous and asynchronous. + // so we wrap it to promise to get all exceptions through same pipeline + const pendingDestroy = new PendingOperation_1.PendingOperation(this.destroyTimeoutMillis); + const retVal = Promise.resolve().then(() => this.destroyer(resource)); + retVal + .then(() => { + pendingDestroy.resolve(resource); + }) + .catch((err) => { + pendingDestroy.reject(err); + }); + this.pendingDestroys.push(pendingDestroy); + // In case of an error there's nothing we can do here but log it. + return pendingDestroy.promise + .then(res => { + this._executeEventHandlers('destroySuccess', eventId, resource); + return res; + }) + .catch(err => this._logDestroyerError(eventId, resource, err)) + .then(res => { + const index = this.pendingDestroys.findIndex(pd => pd === pendingDestroy); + this.pendingDestroys.splice(index, 1); + return res; + }); + } + _logDestroyerError(eventId, resource, err) { + this._executeEventHandlers('destroyFail', eventId, resource, err); + this.log('Tarn: resource destroyer threw an exception ' + err.stack, 'warn'); + } + _startReaping() { + if (!this.interval) { + this._executeEventHandlers('startReaping'); + this.interval = setInterval(() => this.check(), this.reapIntervalMillis); + } + } + _stopReaping() { + if (this.interval !== null) { + this._executeEventHandlers('stopReaping'); + clearInterval(this.interval); + } + this.interval = null; + } + _executeEventHandlers(eventName, ...args) { + const listeners = this.emitter.listeners(eventName); + // just calling .emit() would stop running rest of the listeners if one them fails + listeners.forEach(listener => { + try { + listener(...args); + } + catch (err) { + // There's nothing we can do here but log the error. This would otherwise + // leak out as an unhandled exception. + this.log(`Tarn: event handler "${eventName}" threw an exception ${err.stack}`, 'warn'); + } + }); + } +} +exports.Pool = Pool; +function remove(arr, item) { + var idx = arr.indexOf(item); + if (idx === -1) { + return false; + } + else { + arr.splice(idx, 1); + return true; + } +} +function callbackOrPromise(func) { + return new Promise((resolve, reject) => { + const callback = (err, resource) => { + if (err) { + reject(err); + } + else { + resolve(resource); + } + }; + utils_1.tryPromise(() => func(callback)) + .then(res => { + // If the result is falsy, we assume that the callback will + // be called instead of interpreting the falsy value as a + // result value. + if (res) { + resolve(res); + } + }) + .catch(err => { + reject(err); + }); + }); +} diff --git a/node_modules/tarn/lib/PromiseInspection.d.ts b/node_modules/tarn/lib/PromiseInspection.d.ts new file mode 100644 index 0000000..2edecb8 --- /dev/null +++ b/node_modules/tarn/lib/PromiseInspection.d.ts @@ -0,0 +1,16 @@ +export declare type PromiseInspectionArgs = { + value: T; + error?: Error; +} | { + value?: T; + error: Error; +}; +export declare class PromiseInspection { + _value: T | void; + _error: Error | void; + constructor(args: PromiseInspectionArgs); + value(): void | T; + reason(): void | Error; + isRejected(): boolean; + isFulfilled(): boolean; +} diff --git a/node_modules/tarn/lib/PromiseInspection.js b/node_modules/tarn/lib/PromiseInspection.js new file mode 100644 index 0000000..26328ae --- /dev/null +++ b/node_modules/tarn/lib/PromiseInspection.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class PromiseInspection { + constructor(args) { + this._value = args.value; + this._error = args.error; + } + value() { + return this._value; + } + reason() { + return this._error; + } + isRejected() { + return !!this._error; + } + isFulfilled() { + return !!this._value; + } +} +exports.PromiseInspection = PromiseInspection; diff --git a/node_modules/tarn/lib/Resource.d.ts b/node_modules/tarn/lib/Resource.d.ts new file mode 100644 index 0000000..7c65e59 --- /dev/null +++ b/node_modules/tarn/lib/Resource.d.ts @@ -0,0 +1,9 @@ +import { Deferred } from './utils'; +export declare class Resource { + resource: T; + readonly timestamp: number; + protected deferred: Deferred; + constructor(resource: T); + readonly promise: Promise; + resolve(): Resource; +} diff --git a/node_modules/tarn/lib/Resource.js b/node_modules/tarn/lib/Resource.js new file mode 100644 index 0000000..86422c4 --- /dev/null +++ b/node_modules/tarn/lib/Resource.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const utils_1 = require("./utils"); +class Resource { + constructor(resource) { + this.resource = resource; + this.resource = resource; + this.timestamp = utils_1.now(); + this.deferred = utils_1.defer(); + } + get promise() { + return this.deferred.promise; + } + resolve() { + this.deferred.resolve(undefined); + return new Resource(this.resource); + } +} +exports.Resource = Resource; diff --git a/node_modules/tarn/lib/TimeoutError.d.ts b/node_modules/tarn/lib/TimeoutError.d.ts new file mode 100644 index 0000000..e8aa4ae --- /dev/null +++ b/node_modules/tarn/lib/TimeoutError.d.ts @@ -0,0 +1,2 @@ +export declare class TimeoutError extends Error { +} diff --git a/node_modules/tarn/lib/TimeoutError.js b/node_modules/tarn/lib/TimeoutError.js new file mode 100644 index 0000000..17fd79f --- /dev/null +++ b/node_modules/tarn/lib/TimeoutError.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class TimeoutError extends Error { +} +exports.TimeoutError = TimeoutError; diff --git a/node_modules/tarn/lib/tarn.d.ts b/node_modules/tarn/lib/tarn.d.ts new file mode 100644 index 0000000..b4f01a7 --- /dev/null +++ b/node_modules/tarn/lib/tarn.d.ts @@ -0,0 +1,3 @@ +import { Pool } from './Pool'; +import { TimeoutError } from './TimeoutError'; +export { Pool, TimeoutError }; diff --git a/node_modules/tarn/lib/tarn.js b/node_modules/tarn/lib/tarn.js new file mode 100644 index 0000000..b602b07 --- /dev/null +++ b/node_modules/tarn/lib/tarn.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Pool_1 = require("./Pool"); +exports.Pool = Pool_1.Pool; +const TimeoutError_1 = require("./TimeoutError"); +exports.TimeoutError = TimeoutError_1.TimeoutError; +module.exports = { + Pool: Pool_1.Pool, + TimeoutError: TimeoutError_1.TimeoutError +}; diff --git a/node_modules/tarn/lib/utils.d.ts b/node_modules/tarn/lib/utils.d.ts new file mode 100644 index 0000000..252a1a4 --- /dev/null +++ b/node_modules/tarn/lib/utils.d.ts @@ -0,0 +1,14 @@ +import { PromiseInspection } from './PromiseInspection'; +export interface Deferred { + resolve: (val: T) => any; + reject: (err: T) => any; + promise: Promise; +} +export declare function defer(): Deferred; +export declare function now(): number; +export declare function duration(t1: number, t2: number): number; +export declare function checkOptionalTime(time?: number): boolean; +export declare function checkRequiredTime(time: number): boolean; +export declare function delay(millis: number): Promise<{}>; +export declare function reflect(promise: Promise): Promise | PromiseInspection<{}>>; +export declare function tryPromise(cb: () => T | PromiseLike): Promise; diff --git a/node_modules/tarn/lib/utils.js b/node_modules/tarn/lib/utils.js new file mode 100644 index 0000000..1e001a6 --- /dev/null +++ b/node_modules/tarn/lib/utils.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const PromiseInspection_1 = require("./PromiseInspection"); +function defer() { + let resolve = null; + let reject = null; + const promise = new Promise((resolver, rejecter) => { + resolve = resolver; + reject = rejecter; + }); + return { + promise, + resolve, + reject + }; +} +exports.defer = defer; +function now() { + return Date.now(); +} +exports.now = now; +function duration(t1, t2) { + return Math.abs(t2 - t1); +} +exports.duration = duration; +function checkOptionalTime(time) { + if (typeof time === 'undefined') { + return true; + } + return checkRequiredTime(time); +} +exports.checkOptionalTime = checkOptionalTime; +function checkRequiredTime(time) { + return typeof time === 'number' && time === Math.round(time) && time > 0; +} +exports.checkRequiredTime = checkRequiredTime; +function delay(millis) { + return new Promise(resolve => setTimeout(resolve, millis)); +} +exports.delay = delay; +function reflect(promise) { + return promise + .then(value => { + return new PromiseInspection_1.PromiseInspection({ value }); + }) + .catch(error => { + return new PromiseInspection_1.PromiseInspection({ error }); + }); +} +exports.reflect = reflect; +function tryPromise(cb) { + try { + const result = cb(); + return Promise.resolve(result); + } + catch (err) { + return Promise.reject(err); + } +} +exports.tryPromise = tryPromise; diff --git a/node_modules/tarn/package.json b/node_modules/tarn/package.json new file mode 100644 index 0000000..6bd0774 --- /dev/null +++ b/node_modules/tarn/package.json @@ -0,0 +1,92 @@ +{ + "_args": [ + [ + "tarn@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "tarn@2.0.0", + "_id": "tarn@2.0.0", + "_inBundle": false, + "_integrity": "sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==", + "_location": "/tarn", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "tarn@2.0.0", + "name": "tarn", + "escapedName": "tarn", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/knex" + ], + "_resolved": "https://registry.npmjs.org/tarn/-/tarn-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sami Koskimäki", + "email": "sami.koskimaki@vincit.com", + "url": "https://github.com/koskimas" + }, + "bugs": { + "url": "https://github.com/vincit/tarn.js/issues" + }, + "dependencies": {}, + "description": "Simple and robust resource pool for node.js", + "devDependencies": { + "@types/node": "^10.5.2", + "bluebird": "^3.5.3", + "expect.js": "^0.3.1", + "husky": "^1.3.1", + "lint-staged": "^8.0.4", + "mocha": "^5.2.0", + "prettier": "^1.13.7", + "typescript": "3.2.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "files": [ + "README.md", + "LICENSE", + "lib/*" + ], + "homepage": "https://github.com/vincit/tarn.js#readme", + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "keywords": [ + "pool", + "pooling", + "throttle" + ], + "license": "MIT", + "lint-staged": { + "*.{js,ts}": [ + "prettier --write", + "git add" + ] + }, + "main": "lib/tarn.js", + "name": "tarn", + "repository": { + "type": "git", + "url": "git://github.com/vincit/tarn.js.git" + }, + "scripts": { + "build": "tsc", + "clean": "rm -rf lib", + "format": "prettier **/*.{js,ts} --write", + "prepublishOnly": "tsc", + "test": "mocha --slow 10 --timeout 5000 --reporter spec tests.js", + "test-bail": "mocha --slow 10 --timeout 5000 --reporter spec --bail tests.js" + }, + "types": "lib/tarn.d.ts", + "version": "2.0.0" +} diff --git a/node_modules/term-size/index.js b/node_modules/term-size/index.js new file mode 100644 index 0000000..95e410d --- /dev/null +++ b/node_modules/term-size/index.js @@ -0,0 +1,70 @@ +'use strict'; +const path = require('path'); +const execa = require('execa'); + +const create = (columns, rows) => ({ + columns: parseInt(columns, 10), + rows: parseInt(rows, 10) +}); + +module.exports = () => { + const env = process.env; + const stdout = process.stdout; + const stderr = process.stderr; + + if (stdout && stdout.columns && stdout.rows) { + return create(stdout.columns, stdout.rows); + } + + if (stderr && stderr.columns && stderr.rows) { + return create(stderr.columns, stderr.rows); + } + + // These values are static, so not the first choice + if (env.COLUMNS && env.LINES) { + return create(env.COLUMNS, env.LINES); + } + + if (process.platform === 'win32') { + try { + // Binary: https://github.com/sindresorhus/win-term-size + const size = execa.sync(path.join(__dirname, 'vendor/windows/term-size.exe')).stdout.split(/\r?\n/); + + if (size.length === 2) { + return create(size[0], size[1]); + } + } catch (err) {} + } else { + if (process.platform === 'darwin') { + try { + // Binary: https://github.com/sindresorhus/macos-term-size + const size = execa.shellSync(path.join(__dirname, 'vendor/macos/term-size')).stdout.split(/\r?\n/); + + if (size.length === 2) { + return create(size[0], size[1]); + } + } catch (err) {} + } + + // `resize` is preferred as it works even when all file descriptors are redirected + // https://linux.die.net/man/1/resize + try { + const size = execa.sync('resize', ['-u']).stdout.match(/\d+/g); + + if (size.length === 2) { + return create(size[0], size[1]); + } + } catch (err) {} + + try { + const columns = execa.sync('tput', ['cols']).stdout; + const rows = execa.sync('tput', ['lines']).stdout; + + if (columns && rows) { + return create(columns, rows); + } + } catch (err) {} + } + + return create(80, 24); +}; diff --git a/node_modules/term-size/license b/node_modules/term-size/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/term-size/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/term-size/package.json b/node_modules/term-size/package.json new file mode 100644 index 0000000..6a2fd71 --- /dev/null +++ b/node_modules/term-size/package.json @@ -0,0 +1,79 @@ +{ + "_args": [ + [ + "term-size@1.2.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "term-size@1.2.0", + "_id": "term-size@1.2.0", + "_inBundle": false, + "_integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "_location": "/term-size", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "term-size@1.2.0", + "name": "term-size", + "escapedName": "term-size", + "rawSpec": "1.2.0", + "saveSpec": null, + "fetchSpec": "1.2.0" + }, + "_requiredBy": [ + "/boxen" + ], + "_resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "_spec": "1.2.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/term-size/issues" + }, + "dependencies": { + "execa": "^0.7.0" + }, + "description": "Reliably get the terminal window size (columns & rows)", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js", + "vendor" + ], + "homepage": "https://github.com/sindresorhus/term-size#readme", + "keywords": [ + "term", + "terminal", + "size", + "console", + "window", + "width", + "height", + "columns", + "rows", + "lines", + "tty", + "redirected" + ], + "license": "MIT", + "name": "term-size", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/term-size.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.2.0" +} diff --git a/node_modules/term-size/readme.md b/node_modules/term-size/readme.md new file mode 100644 index 0000000..dd642ca --- /dev/null +++ b/node_modules/term-size/readme.md @@ -0,0 +1,41 @@ +# term-size [![Build Status: Linux & macOS](https://travis-ci.org/sindresorhus/term-size.svg?branch=master)](https://travis-ci.org/sindresorhus/term-size) [![Build Status: Windows](https://ci.appveyor.com/api/projects/status/c3tydg6uedsk0bob/branch/master?svg=true)](https://ci.appveyor.com/project/sindresorhus/term-size/branch/master) + +> Reliably get the terminal window size + +Because [`process.stdout.columns`](https://nodejs.org/api/tty.html#tty_writestream_columns) doesn't exist when run [non-interactively](http://www.tldp.org/LDP/abs/html/intandnonint.html), for example, in a child process or when piped. This module even works when all the TTY file descriptors are redirected! + +Confirmed working on macOS, Linux, and Windows. + + +## Install + +``` +$ npm install --save term-size +``` + + +## Usage + +```js +const termSize = require('term-size'); + +termSize(); +//=> {columns: 143, rows: 24} +``` + + +## API + +### termSize() + +Returns an `Object` with `columns` and `rows` properties. + + +## Related + +- [term-size-cli](https://github.com/sindresorhus/term-size-cli) - CLI for this module + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/term-size/vendor/macos/term-size b/node_modules/term-size/vendor/macos/term-size new file mode 100755 index 0000000000000000000000000000000000000000..e383cc737f8e232aecd06a8492657b28d5fb9f1c GIT binary patch literal 8760 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 literal 0 HcmV?d00001 diff --git a/node_modules/tildify/index.d.ts b/node_modules/tildify/index.d.ts new file mode 100644 index 0000000..4e34bd6 --- /dev/null +++ b/node_modules/tildify/index.d.ts @@ -0,0 +1,14 @@ +/** +Convert an absolute path to a tilde path: `/Users/sindresorhus/dev` → `~/dev`. + +@example +``` +import tildify = require('tildify'); + +tildify('/Users/sindresorhus/dev'); +//=> '~/dev' +``` +*/ +declare function tildify(absolutePath: string): string; + +export = tildify; diff --git a/node_modules/tildify/index.js b/node_modules/tildify/index.js new file mode 100644 index 0000000..78b53fb --- /dev/null +++ b/node_modules/tildify/index.js @@ -0,0 +1,13 @@ +'use strict'; +const path = require('path'); +const os = require('os'); + +const homeDirectory = os.homedir(); + +module.exports = absolutePath => { + const normalizedPath = path.normalize(absolutePath) + path.sep; + + return (normalizedPath.indexOf(homeDirectory) === 0 ? + normalizedPath.replace(homeDirectory + path.sep, `~${path.sep}`) : + normalizedPath).slice(0, -1); +}; diff --git a/node_modules/tildify/license b/node_modules/tildify/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/tildify/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/tildify/package.json b/node_modules/tildify/package.json new file mode 100644 index 0000000..c2147e7 --- /dev/null +++ b/node_modules/tildify/package.json @@ -0,0 +1,75 @@ +{ + "_args": [ + [ + "tildify@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "tildify@2.0.0", + "_id": "tildify@2.0.0", + "_inBundle": false, + "_integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "_location": "/tildify", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "tildify@2.0.0", + "name": "tildify", + "escapedName": "tildify", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/knex" + ], + "_resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/tildify/issues" + }, + "description": "Convert an absolute path to a tilde path: `/Users/sindresorhus/dev` → `~/dev`", + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + }, + "engines": { + "node": ">=8" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "homepage": "https://github.com/sindresorhus/tildify#readme", + "keywords": [ + "unexpand", + "homedir", + "tilde", + "tildify", + "collapse", + "path", + "home", + "directory", + "user", + "expand", + "convert" + ], + "license": "MIT", + "name": "tildify", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/tildify.git" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "version": "2.0.0" +} diff --git a/node_modules/tildify/readme.md b/node_modules/tildify/readme.md new file mode 100644 index 0000000..954530d --- /dev/null +++ b/node_modules/tildify/readme.md @@ -0,0 +1,30 @@ +# tildify [![Build Status](https://travis-ci.org/sindresorhus/tildify.svg?branch=master)](https://travis-ci.org/sindresorhus/tildify) + +> Convert an absolute path to a tilde path: `/Users/sindresorhus/dev` → `~/dev` + + +## Install + +``` +$ npm install tildify +``` + + +## Usage + +```js +const tildify = require('tildify'); + +tildify('/Users/sindresorhus/dev'); +//=> '~/dev' +``` + + +## Related + +See [untildify](https://github.com/sindresorhus/untildify) for the inverse. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/timed-out/index.js b/node_modules/timed-out/index.js new file mode 100644 index 0000000..94007a4 --- /dev/null +++ b/node_modules/timed-out/index.js @@ -0,0 +1,55 @@ +'use strict'; + +module.exports = function (req, time) { + if (req.timeoutTimer) { + return req; + } + + var delays = isNaN(time) ? time : {socket: time, connect: time}; + var host = req._headers ? (' to ' + req._headers.host) : ''; + + if (delays.connect !== undefined) { + req.timeoutTimer = setTimeout(function timeoutHandler() { + req.abort(); + var e = new Error('Connection timed out on request' + host); + e.code = 'ETIMEDOUT'; + req.emit('error', e); + }, delays.connect); + } + + // Clear the connection timeout timer once a socket is assigned to the + // request and is connected. + req.on('socket', function assign(socket) { + // Socket may come from Agent pool and may be already connected. + if (!(socket.connecting || socket._connecting)) { + connect(); + return; + } + + socket.once('connect', connect); + }); + + function clear() { + if (req.timeoutTimer) { + clearTimeout(req.timeoutTimer); + req.timeoutTimer = null; + } + } + + function connect() { + clear(); + + if (delays.socket !== undefined) { + // Abort the request if there is no activity on the socket for more + // than `delays.socket` milliseconds. + req.setTimeout(delays.socket, function socketTimeoutHandler() { + req.abort(); + var e = new Error('Socket timed out on request' + host); + e.code = 'ESOCKETTIMEDOUT'; + req.emit('error', e); + }); + } + } + + return req.on('error', clear); +}; diff --git a/node_modules/timed-out/license b/node_modules/timed-out/license new file mode 100644 index 0000000..faadd52 --- /dev/null +++ b/node_modules/timed-out/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky + +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/timed-out/package.json b/node_modules/timed-out/package.json new file mode 100644 index 0000000..68894ff --- /dev/null +++ b/node_modules/timed-out/package.json @@ -0,0 +1,72 @@ +{ + "_args": [ + [ + "timed-out@4.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "timed-out@4.0.1", + "_id": "timed-out@4.0.1", + "_inBundle": false, + "_integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "_location": "/timed-out", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "timed-out@4.0.1", + "name": "timed-out", + "escapedName": "timed-out", + "rawSpec": "4.0.1", + "saveSpec": null, + "fetchSpec": "4.0.1" + }, + "_requiredBy": [ + "/got" + ], + "_resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "_spec": "4.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Vsevolod Strukchinsky", + "email": "floatdrop@gmail.com" + }, + "bugs": { + "url": "https://github.com/floatdrop/timed-out/issues" + }, + "description": "Emit `ETIMEDOUT` or `ESOCKETTIMEDOUT` when ClientRequest is hanged", + "devDependencies": { + "mocha": "*", + "xo": "^0.16.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/floatdrop/timed-out#readme", + "keywords": [ + "http", + "https", + "get", + "got", + "url", + "uri", + "request", + "util", + "utility", + "simple" + ], + "license": "MIT", + "name": "timed-out", + "repository": { + "type": "git", + "url": "git+https://github.com/floatdrop/timed-out.git" + }, + "scripts": { + "test": "xo && mocha" + }, + "version": "4.0.1" +} diff --git a/node_modules/timed-out/readme.md b/node_modules/timed-out/readme.md new file mode 100644 index 0000000..fa0a035 --- /dev/null +++ b/node_modules/timed-out/readme.md @@ -0,0 +1,42 @@ +# timed-out [![Build Status](https://travis-ci.org/floatdrop/timed-out.svg?branch=master)](https://travis-ci.org/floatdrop/timed-out) + +> Timeout HTTP/HTTPS requests + +Emit Error object with `code` property equal `ETIMEDOUT` or `ESOCKETTIMEDOUT` when ClientRequest is hanged. + +## Usage + +```js +var get = require('http').get; +var timeout = require('timed-out'); + +var req = get('http://www.google.ru'); +timeout(req, 2000); // Set 2 seconds limit +``` + +### API + +#### timedout(request, time) + +##### request + +*Required* +Type: [`ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) + +The request to watch on. + +##### time + +*Required* +Type: `number` or `object` + +Time in milliseconds to wait for `connect` event on socket and also time to wait on inactive socket. + +Or you can pass Object with following fields: + +- `connect` - time to wait for connection +- `socket` - time to wait for activity on socket + +## License + +MIT © [Vsevolod Strukchinsky](floatdrop@gmail.com) diff --git a/node_modules/to-object-path/LICENSE b/node_modules/to-object-path/LICENSE new file mode 100644 index 0000000..1e49edf --- /dev/null +++ b/node_modules/to-object-path/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert. + +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/to-object-path/README.md b/node_modules/to-object-path/README.md new file mode 100644 index 0000000..7f3cfb1 --- /dev/null +++ b/node_modules/to-object-path/README.md @@ -0,0 +1,71 @@ +# to-object-path [![NPM version](https://badge.fury.io/js/to-object-path.svg)](http://badge.fury.io/js/to-object-path) + +> Create an object path from a list or array of strings. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i to-object-path --save +``` + +## Usage + +```js +var toPath = require('to-object-path'); + +toPath('foo', 'bar', 'baz'); +toPath('foo', ['bar', 'baz']); +//=> 'foo.bar.baz' +``` + +Also supports passing an arguments object (without having to slice args): + +```js +function foo() + return toPath(arguments); +} + +foo('foo', 'bar', 'baz'); +foo('foo', ['bar', 'baz']); +//=> 'foo.bar.baz' +``` + +Visit the [example](./example.js) to see how this could be used in an application. + +## Related projects + +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (` a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value) +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://www.npmjs.com/package/has-value) | [homepage](https://github.com/jonschlinkert/has-value) +* [omit-value](https://www.npmjs.com/package/omit-value): Omit properties from an object or deeply nested property of an object using object path… [more](https://www.npmjs.com/package/omit-value) | [homepage](https://github.com/jonschlinkert/omit-value) +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value) +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value) + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/to-object-path/issues/new). + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on October 28, 2015._ \ No newline at end of file diff --git a/node_modules/to-object-path/index.js b/node_modules/to-object-path/index.js new file mode 100644 index 0000000..489f8f6 --- /dev/null +++ b/node_modules/to-object-path/index.js @@ -0,0 +1,33 @@ +/*! + * to-object-path + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var typeOf = require('kind-of'); + +module.exports = function toPath(args) { + if (typeOf(args) !== 'arguments') { + args = arguments; + } + return filter(args).join('.'); +}; + +function filter(arr) { + var len = arr.length; + var idx = -1; + var res = []; + + while (++idx < len) { + var ele = arr[idx]; + if (typeOf(ele) === 'arguments' || Array.isArray(ele)) { + res.push.apply(res, filter(ele)); + } else if (typeof ele === 'string') { + res.push(ele); + } + } + return res; +} diff --git a/node_modules/to-object-path/node_modules/kind-of/LICENSE b/node_modules/to-object-path/node_modules/kind-of/LICENSE new file mode 100644 index 0000000..d734237 --- /dev/null +++ b/node_modules/to-object-path/node_modules/kind-of/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert + +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/to-object-path/node_modules/kind-of/README.md b/node_modules/to-object-path/node_modules/kind-of/README.md new file mode 100644 index 0000000..6a9df36 --- /dev/null +++ b/node_modules/to-object-path/node_modules/kind-of/README.md @@ -0,0 +1,261 @@ +# kind-of [![NPM version](https://img.shields.io/npm/v/kind-of.svg?style=flat)](https://www.npmjs.com/package/kind-of) [![NPM monthly downloads](https://img.shields.io/npm/dm/kind-of.svg?style=flat)](https://npmjs.org/package/kind-of) [![NPM total downloads](https://img.shields.io/npm/dt/kind-of.svg?style=flat)](https://npmjs.org/package/kind-of) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/kind-of.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/kind-of) + +> Get the native type of a value. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save kind-of +``` + +## Install + +Install with [bower](https://bower.io/) + +```sh +$ bower install kind-of --save +``` + +## Usage + +> es5, browser and es6 ready + +```js +var kindOf = require('kind-of'); + +kindOf(undefined); +//=> 'undefined' + +kindOf(null); +//=> 'null' + +kindOf(true); +//=> 'boolean' + +kindOf(false); +//=> 'boolean' + +kindOf(new Boolean(true)); +//=> 'boolean' + +kindOf(new Buffer('')); +//=> 'buffer' + +kindOf(42); +//=> 'number' + +kindOf(new Number(42)); +//=> 'number' + +kindOf('str'); +//=> 'string' + +kindOf(new String('str')); +//=> 'string' + +kindOf(arguments); +//=> 'arguments' + +kindOf({}); +//=> 'object' + +kindOf(Object.create(null)); +//=> 'object' + +kindOf(new Test()); +//=> 'object' + +kindOf(new Date()); +//=> 'date' + +kindOf([]); +//=> 'array' + +kindOf([1, 2, 3]); +//=> 'array' + +kindOf(new Array()); +//=> 'array' + +kindOf(/foo/); +//=> 'regexp' + +kindOf(new RegExp('foo')); +//=> 'regexp' + +kindOf(function () {}); +//=> 'function' + +kindOf(function * () {}); +//=> 'function' + +kindOf(new Function()); +//=> 'function' + +kindOf(new Map()); +//=> 'map' + +kindOf(new WeakMap()); +//=> 'weakmap' + +kindOf(new Set()); +//=> 'set' + +kindOf(new WeakSet()); +//=> 'weakset' + +kindOf(Symbol('str')); +//=> 'symbol' + +kindOf(new Int8Array()); +//=> 'int8array' + +kindOf(new Uint8Array()); +//=> 'uint8array' + +kindOf(new Uint8ClampedArray()); +//=> 'uint8clampedarray' + +kindOf(new Int16Array()); +//=> 'int16array' + +kindOf(new Uint16Array()); +//=> 'uint16array' + +kindOf(new Int32Array()); +//=> 'int32array' + +kindOf(new Uint32Array()); +//=> 'uint32array' + +kindOf(new Float32Array()); +//=> 'float32array' + +kindOf(new Float64Array()); +//=> 'float64array' +``` + +## Benchmarks + +Benchmarked against [typeof](http://github.com/CodingFu/typeof) and [type-of](https://github.com/ForbesLindesay/type-of). +Note that performaces is slower for es6 features `Map`, `WeakMap`, `Set` and `WeakSet`. + +```bash +#1: array + current x 23,329,397 ops/sec ±0.82% (94 runs sampled) + lib-type-of x 4,170,273 ops/sec ±0.55% (94 runs sampled) + lib-typeof x 9,686,935 ops/sec ±0.59% (98 runs sampled) + +#2: boolean + current x 27,197,115 ops/sec ±0.85% (94 runs sampled) + lib-type-of x 3,145,791 ops/sec ±0.73% (97 runs sampled) + lib-typeof x 9,199,562 ops/sec ±0.44% (99 runs sampled) + +#3: date + current x 20,190,117 ops/sec ±0.86% (92 runs sampled) + lib-type-of x 5,166,970 ops/sec ±0.74% (94 runs sampled) + lib-typeof x 9,610,821 ops/sec ±0.50% (96 runs sampled) + +#4: function + current x 23,855,460 ops/sec ±0.60% (97 runs sampled) + lib-type-of x 5,667,740 ops/sec ±0.54% (100 runs sampled) + lib-typeof x 10,010,644 ops/sec ±0.44% (100 runs sampled) + +#5: null + current x 27,061,047 ops/sec ±0.97% (96 runs sampled) + lib-type-of x 13,965,573 ops/sec ±0.62% (97 runs sampled) + lib-typeof x 8,460,194 ops/sec ±0.61% (97 runs sampled) + +#6: number + current x 25,075,682 ops/sec ±0.53% (99 runs sampled) + lib-type-of x 2,266,405 ops/sec ±0.41% (98 runs sampled) + lib-typeof x 9,821,481 ops/sec ±0.45% (99 runs sampled) + +#7: object + current x 3,348,980 ops/sec ±0.49% (99 runs sampled) + lib-type-of x 3,245,138 ops/sec ±0.60% (94 runs sampled) + lib-typeof x 9,262,952 ops/sec ±0.59% (99 runs sampled) + +#8: regex + current x 21,284,827 ops/sec ±0.72% (96 runs sampled) + lib-type-of x 4,689,241 ops/sec ±0.43% (100 runs sampled) + lib-typeof x 8,957,593 ops/sec ±0.62% (98 runs sampled) + +#9: string + current x 25,379,234 ops/sec ±0.58% (96 runs sampled) + lib-type-of x 3,635,148 ops/sec ±0.76% (93 runs sampled) + lib-typeof x 9,494,134 ops/sec ±0.49% (98 runs sampled) + +#10: undef + current x 27,459,221 ops/sec ±1.01% (93 runs sampled) + lib-type-of x 14,360,433 ops/sec ±0.52% (99 runs sampled) + lib-typeof x 23,202,868 ops/sec ±0.59% (94 runs sampled) + +``` + +## Optimizations + +In 7 out of 8 cases, this library is 2x-10x faster than other top libraries included in the benchmarks. There are a few things that lead to this performance advantage, none of them hard and fast rules, but all of them simple and repeatable in almost any code library: + +1. Optimize around the fastest and most common use cases first. Of course, this will change from project-to-project, but I took some time to understand how and why `typeof` checks were being used in my own libraries and other libraries I use a lot. +2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it. +3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'` + +## About + +### Related projects + +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number "Returns true if the value is a number. comprehensive tests.") +* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 59 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [miguelmota](https://github.com/miguelmota) | +| 1 | [dtothefp](https://github.com/dtothefp) | +| 1 | [ksheedlo](https://github.com/ksheedlo) | +| 1 | [pdehaan](https://github.com/pdehaan) | +| 1 | [laggingreflex](https://github.com/laggingreflex) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 16, 2017._ \ No newline at end of file diff --git a/node_modules/to-object-path/node_modules/kind-of/index.js b/node_modules/to-object-path/node_modules/kind-of/index.js new file mode 100644 index 0000000..b52c291 --- /dev/null +++ b/node_modules/to-object-path/node_modules/kind-of/index.js @@ -0,0 +1,116 @@ +var isBuffer = require('is-buffer'); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; diff --git a/node_modules/to-object-path/node_modules/kind-of/package.json b/node_modules/to-object-path/node_modules/kind-of/package.json new file mode 100644 index 0000000..4ffcabb --- /dev/null +++ b/node_modules/to-object-path/node_modules/kind-of/package.json @@ -0,0 +1,142 @@ +{ + "_args": [ + [ + "kind-of@3.2.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "kind-of@3.2.2", + "_id": "kind-of@3.2.2", + "_inBundle": false, + "_integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "_location": "/to-object-path/kind-of", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "kind-of@3.2.2", + "name": "kind-of", + "escapedName": "kind-of", + "rawSpec": "3.2.2", + "saveSpec": null, + "fetchSpec": "3.2.2" + }, + "_requiredBy": [ + "/to-object-path" + ], + "_resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "_spec": "3.2.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/kind-of/issues" + }, + "contributors": [ + { + "name": "David Fox-Powell", + "url": "https://dtothefp.github.io/me" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Ken Sheedlo", + "url": "kensheedlo.com" + }, + { + "name": "laggingreflex", + "url": "https://github.com/laggingreflex" + }, + { + "name": "Miguel Mota", + "url": "https://miguelmota.com" + }, + { + "name": "Peter deHaan", + "url": "http://about.me/peterdehaan" + } + ], + "dependencies": { + "is-buffer": "^1.1.5" + }, + "description": "Get the native type of a value.", + "devDependencies": { + "ansi-bold": "^0.1.1", + "benchmarked": "^1.0.0", + "browserify": "^14.3.0", + "glob": "^7.1.1", + "gulp-format-md": "^0.1.12", + "mocha": "^3.3.0", + "type-of": "^2.0.1", + "typeof": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/kind-of", + "keywords": [ + "arguments", + "array", + "boolean", + "check", + "date", + "function", + "is", + "is-type", + "is-type-of", + "kind", + "kind-of", + "number", + "object", + "of", + "regexp", + "string", + "test", + "type", + "type-of", + "typeof", + "types" + ], + "license": "MIT", + "main": "index.js", + "name": "kind-of", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/kind-of.git" + }, + "scripts": { + "prepublish": "browserify -o browser.js -e index.js -s index --bare", + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "is-glob", + "is-number", + "is-primitive" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "reflinks": [ + "verb" + ] + }, + "version": "3.2.2" +} diff --git a/node_modules/to-object-path/package.json b/node_modules/to-object-path/package.json new file mode 100644 index 0000000..6000e6f --- /dev/null +++ b/node_modules/to-object-path/package.json @@ -0,0 +1,84 @@ +{ + "_args": [ + [ + "to-object-path@0.3.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "to-object-path@0.3.0", + "_id": "to-object-path@0.3.0", + "_inBundle": false, + "_integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "_location": "/to-object-path", + "_phantomChildren": { + "is-buffer": "1.1.6" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "to-object-path@0.3.0", + "name": "to-object-path", + "escapedName": "to-object-path", + "rawSpec": "0.3.0", + "saveSpec": null, + "fetchSpec": "0.3.0" + }, + "_requiredBy": [ + "/cache-base" + ], + "_resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "_spec": "0.3.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/to-object-path/issues" + }, + "dependencies": { + "kind-of": "^3.0.2" + }, + "description": "Create an object path from a list or array of strings.", + "devDependencies": { + "base": "^0.6.7", + "mocha": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/to-object-path", + "keywords": [ + "dot", + "nested", + "notation", + "object", + "path", + "stringify" + ], + "license": "MIT", + "main": "index.js", + "name": "to-object-path", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/to-object-path.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "get-value", + "set-value", + "has-value", + "omit-value", + "unset-value" + ] + } + }, + "version": "0.3.0" +} diff --git a/node_modules/to-regex-range/LICENSE b/node_modules/to-regex-range/LICENSE new file mode 100644 index 0000000..83b56e7 --- /dev/null +++ b/node_modules/to-regex-range/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert + +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/to-regex-range/README.md b/node_modules/to-regex-range/README.md new file mode 100644 index 0000000..2763c5a --- /dev/null +++ b/node_modules/to-regex-range/README.md @@ -0,0 +1,281 @@ +# to-regex-range [![NPM version](https://img.shields.io/npm/v/to-regex-range.svg?style=flat)](https://www.npmjs.com/package/to-regex-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![Linux Build Status](https://img.shields.io/travis/micromatch/to-regex-range.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/to-regex-range) + +> Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-regex-range +``` + +Install with [yarn](https://yarnpkg.com): + +```sh +$ yarn add to-regex-range +``` + +
    +What does this do? + +
    + +This libary generates the `source` string to be passed to `new RegExp()` for matching a range of numbers. + +**Example** + +```js +var toRegexRange = require('to-regex-range'); +var regex = new RegExp(toRegexRange('15', '95')); +``` + +A string is returned so that you can do whatever you need with it before passing it to `new RegExp()` (like adding `^` or `$` boundaries, defining flags, or combining it another string). + +
    + +
    + +
    +Why use this library? + +
    + +### Convenience + +Creating regular expressions for matching numbers gets deceptively complicated pretty fast. + +For example, let's say you need a validation regex for matching part of a user-id, postal code, social security number, tax id, etc: + +* regex for matching `1` => `/1/` (easy enough) +* regex for matching `1` through `5` => `/[1-5]/` (not bad...) +* regex for matching `1` or `5` => `/(1|5)/` (still easy...) +* regex for matching `1` through `50` => `/([1-9]|[1-4][0-9]|50)/` (uh-oh...) +* regex for matching `1` through `55` => `/([1-9]|[1-4][0-9]|5[0-5])/` (no prob, I can do this...) +* regex for matching `1` through `555` => `/([1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5])/` (maybe not...) +* regex for matching `0001` through `5555` => `/(0{3}[1-9]|0{2}[1-9][0-9]|0[1-9][0-9]{2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5])/` (okay, I get the point!) + +The numbers are contrived, but they're also really basic. In the real world you might need to generate a regex on-the-fly for validation. + +**Learn more** + +If you're interested in learning more about [character classes](http://www.regular-expressions.info/charclass.html) and other regex features, I personally have always found [regular-expressions.info](http://www.regular-expressions.info/charclass.html) to be pretty useful. + +### Heavily tested + +As of April 27, 2017, this library runs [2,783,483 test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are indeed correct. + +Tests run in ~870ms on my MacBook Pro, 2.5 GHz Intel Core i7. + +### Highly optimized + +Generated regular expressions are highly optimized: + +* duplicate sequences and character classes are reduced using quantifiers +* smart enough to use `?` conditionals when number(s) or range(s) can be positive or negative +* uses fragment caching to avoid processing the same exact string more than once + +
    + +
    + +## Usage + +Add this library to your javascript application with the following line of code + +```js +var toRegexRange = require('to-regex-range'); +``` + +The main export is a function that takes two integers: the `min` value and `max` value (formatted as strings or numbers). + +```js +var source = toRegexRange('15', '95'); +//=> 1[5-9]|[2-8][0-9]|9[0-5] + +var re = new RegExp('^' + source + '$'); +console.log(re.test('14')); //=> false +console.log(re.test('50')); //=> true +console.log(re.test('94')); //=> true +console.log(re.test('96')); //=> false +``` + +## Options + +### options.capture + +**Type**: `boolean` + +**Deafault**: `undefined` + +Wrap the returned value in parentheses when there is more than one regex condition. Useful when you're dynamically generating ranges. + +```js +console.log(toRegexRange('-10', '10')); +//=> -[1-9]|-?10|[0-9] + +console.log(toRegexRange('-10', '10', {capture: true})); +//=> (-[1-9]|-?10|[0-9]) +``` + +### options.shorthand + +**Type**: `boolean` + +**Deafault**: `undefined` + +Use the regex shorthand for `[0-9]`: + +```js +console.log(toRegexRange('0', '999999')); +//=> [0-9]|[1-9][0-9]{1,5} + +console.log(toRegexRange('0', '999999', {shorthand: true})); +//=> \d|[1-9]\d{1,5} +``` + +### options.relaxZeros + +**Type**: `boolean` + +**Default**: `true` + +This option only applies to **negative zero-padded ranges**. By default, when a negative zero-padded range is defined, the number of leading zeros is relaxed using `-0*`. + +```js +console.log(toRegexRange('-001', '100')); +//=> -0*1|0{2}[0-9]|0[1-9][0-9]|100 + +console.log(toRegexRange('-001', '100', {relaxZeros: false})); +//=> -0{2}1|0{2}[0-9]|0[1-9][0-9]|100 +``` + +
    +Why are zeros relaxed for negative zero-padded ranges by default? + +Consider the following. + +```js +var regex = toRegexRange('-001', '100'); +``` + +_Note that `-001` and `100` are both three digits long_. + +In most zero-padding implementations, only a single leading zero is enough to indicate that zero-padding should be applied. Thus, the leading zeros would be "corrected" on the negative range in the example to `-01`, instead of `-001`, to make total length of each string no greater than the length of the largest number in the range (in other words, `-001` is 4 digits, but `100` is only three digits). + +If zeros were not relaxed by default, you might expect the resulting regex of the above pattern to match `-001` - given that it's defined that way in the arguments - _but it wouldn't_. It would, however, match `-01`. This gets even more ambiguous with large ranges, like `-01` to `1000000`. + +Thus, we relax zeros by default to provide a more predictable experience for users. + +
    + +## Examples + +| **Range** | **Result** | **Compile time** | +| --- | --- | --- | +| `toRegexRange('5, 5')` | `5` | _33μs_ | +| `toRegexRange('5, 6')` | `5\|6` | _53μs_ | +| `toRegexRange('29, 51')` | `29\|[34][0-9]\|5[01]` | _699μs_ | +| `toRegexRange('31, 877')` | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]` | _711μs_ | +| `toRegexRange('111, 555')` | `11[1-9]\|1[2-9][0-9]\|[2-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _62μs_ | +| `toRegexRange('-10, 10')` | `-[1-9]\|-?10\|[0-9]` | _74μs_ | +| `toRegexRange('-100, -10')` | `-1[0-9]\|-[2-9][0-9]\|-100` | _49μs_ | +| `toRegexRange('-100, 100')` | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]` | _45μs_ | +| `toRegexRange('001, 100')` | `0{2}[1-9]\|0[1-9][0-9]\|100` | _158μs_ | +| `toRegexRange('0010, 1000')` | `0{2}1[0-9]\|0{2}[2-9][0-9]\|0[1-9][0-9]{2}\|1000` | _61μs_ | +| `toRegexRange('1, 2')` | `1\|2` | _10μs_ | +| `toRegexRange('1, 5')` | `[1-5]` | _24μs_ | +| `toRegexRange('1, 10')` | `[1-9]\|10` | _23μs_ | +| `toRegexRange('1, 100')` | `[1-9]\|[1-9][0-9]\|100` | _30μs_ | +| `toRegexRange('1, 1000')` | `[1-9]\|[1-9][0-9]{1,2}\|1000` | _52μs_ | +| `toRegexRange('1, 10000')` | `[1-9]\|[1-9][0-9]{1,3}\|10000` | _47μs_ | +| `toRegexRange('1, 100000')` | `[1-9]\|[1-9][0-9]{1,4}\|100000` | _44μs_ | +| `toRegexRange('1, 1000000')` | `[1-9]\|[1-9][0-9]{1,5}\|1000000` | _49μs_ | +| `toRegexRange('1, 10000000')` | `[1-9]\|[1-9][0-9]{1,6}\|10000000` | _63μs_ | + +## Heads up! + +**Order of arguments** + +When the `min` is larger than the `max`, values will be flipped to create a valid range: + +```js +toRegexRange('51', '29'); +``` + +Is effectively flipped to: + +```js +toRegexRange('29', '51'); +//=> 29|[3-4][0-9]|5[0-1] +``` + +**Steps / increments** + +This library does not support steps (increments). A pr to add support would be welcome. + +## History + +### v2.0.0 - 2017-04-21 + +**New features** + +Adds support for zero-padding! + +### v1.0.0 + +**Optimizations** + +Repeating ranges are now grouped using quantifiers. rocessing time is roughly the same, but the generated regex is much smaller, which should result in faster matching. + +## Attribution + +Inspired by the python library [range-regex](https://github.com/dimka665/range-regex). + +## About + +### Related projects + +* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. See… [more](https://github.com/jonschlinkert/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range "Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. See the benchmarks. Used by micromatch.") +* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") +* [repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.") +* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 27, 2017._ \ No newline at end of file diff --git a/node_modules/to-regex-range/index.js b/node_modules/to-regex-range/index.js new file mode 100644 index 0000000..7bb5a74 --- /dev/null +++ b/node_modules/to-regex-range/index.js @@ -0,0 +1,294 @@ +/*! + * to-regex-range + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var repeat = require('repeat-string'); +var isNumber = require('is-number'); +var cache = {}; + +function toRegexRange(min, max, options) { + if (isNumber(min) === false) { + throw new RangeError('toRegexRange: first argument is invalid.'); + } + + if (typeof max === 'undefined' || min === max) { + return String(min); + } + + if (isNumber(max) === false) { + throw new RangeError('toRegexRange: second argument is invalid.'); + } + + options = options || {}; + var relax = String(options.relaxZeros); + var shorthand = String(options.shorthand); + var capture = String(options.capture); + var key = min + ':' + max + '=' + relax + shorthand + capture; + if (cache.hasOwnProperty(key)) { + return cache[key].result; + } + + var a = Math.min(min, max); + var b = Math.max(min, max); + + if (Math.abs(a - b) === 1) { + var result = min + '|' + max; + if (options.capture) { + return '(' + result + ')'; + } + return result; + } + + var isPadded = padding(min) || padding(max); + var positives = []; + var negatives = []; + + var tok = {min: min, max: max, a: a, b: b}; + if (isPadded) { + tok.isPadded = isPadded; + tok.maxLen = String(tok.max).length; + } + + if (a < 0) { + var newMin = b < 0 ? Math.abs(b) : 1; + var newMax = Math.abs(a); + negatives = splitToPatterns(newMin, newMax, tok, options); + a = tok.a = 0; + } + + if (b >= 0) { + positives = splitToPatterns(a, b, tok, options); + } + + tok.negatives = negatives; + tok.positives = positives; + tok.result = siftPatterns(negatives, positives, options); + + if (options.capture && (positives.length + negatives.length) > 1) { + tok.result = '(' + tok.result + ')'; + } + + cache[key] = tok; + return tok.result; +} + +function siftPatterns(neg, pos, options) { + var onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + var onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + var intersected = filterPatterns(neg, pos, '-?', true, options) || []; + var subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); +} + +function splitToRanges(min, max) { + min = Number(min); + max = Number(max); + + var nines = 1; + var stops = [max]; + var stop = +countNines(min, nines); + + while (min <= stop && stop <= max) { + stops = push(stops, stop); + nines += 1; + stop = +countNines(min, nines); + } + + var zeros = 1; + stop = countZeros(max + 1, zeros) - 1; + + while (min < stop && stop <= max) { + stops = push(stops, stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } + + stops.sort(compare); + return stops; +} + +/** + * Convert a range to a regex pattern + * @param {Number} `start` + * @param {Number} `stop` + * @return {String} + */ + +function rangeToPattern(start, stop, options) { + if (start === stop) { + return {pattern: String(start), digits: []}; + } + + var zipped = zip(String(start), String(stop)); + var len = zipped.length, i = -1; + + var pattern = ''; + var digits = 0; + + while (++i < len) { + var numbers = zipped[i]; + var startDigit = numbers[0]; + var stopDigit = numbers[1]; + + if (startDigit === stopDigit) { + pattern += startDigit; + + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit); + + } else { + digits += 1; + } + } + + if (digits) { + pattern += options.shorthand ? '\\d' : '[0-9]'; + } + + return { pattern: pattern, digits: [digits] }; +} + +function splitToPatterns(min, max, tok, options) { + var ranges = splitToRanges(min, max); + var len = ranges.length; + var idx = -1; + + var tokens = []; + var start = min; + var prev; + + while (++idx < len) { + var range = ranges[idx]; + var obj = rangeToPattern(start, range, options); + var zeros = ''; + + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.digits.length > 1) { + prev.digits.pop(); + } + prev.digits.push(obj.digits[0]); + prev.string = prev.pattern + toQuantifier(prev.digits); + start = range + 1; + continue; + } + + if (tok.isPadded) { + zeros = padZeros(range, tok); + } + + obj.string = zeros + obj.pattern + toQuantifier(obj.digits); + tokens.push(obj); + start = range + 1; + prev = obj; + } + + return tokens; +} + +function filterPatterns(arr, comparison, prefix, intersection, options) { + var res = []; + + for (var i = 0; i < arr.length; i++) { + var tok = arr[i]; + var ele = tok.string; + + if (options.relaxZeros !== false) { + if (prefix === '-' && ele.charAt(0) === '0') { + if (ele.charAt(1) === '{') { + ele = '0*' + ele.replace(/^0\{\d+\}/, ''); + } else { + ele = '0*' + ele.slice(1); + } + } + } + + if (!intersection && !contains(comparison, 'string', ele)) { + res.push(prefix + ele); + } + + if (intersection && contains(comparison, 'string', ele)) { + res.push(prefix + ele); + } + } + return res; +} + +/** + * Zip strings (`for in` can be used on string characters) + */ + +function zip(a, b) { + var arr = []; + for (var ch in a) arr.push([a[ch], b[ch]]); + return arr; +} + +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} + +function push(arr, ele) { + if (arr.indexOf(ele) === -1) arr.push(ele); + return arr; +} + +function contains(arr, key, val) { + for (var i = 0; i < arr.length; i++) { + if (arr[i][key] === val) { + return true; + } + } + return false; +} + +function countNines(min, len) { + return String(min).slice(0, -len) + repeat('9', len); +} + +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} + +function toQuantifier(digits) { + var start = digits[0]; + var stop = digits[1] ? (',' + digits[1]) : ''; + if (!stop && (!start || start === 1)) { + return ''; + } + return '{' + start + stop + '}'; +} + +function toCharacterClass(a, b) { + return '[' + a + ((b - a === 1) ? '' : '-') + b + ']'; +} + +function padding(str) { + return /^-?(0+)\d/.exec(str); +} + +function padZeros(val, tok) { + if (tok.isPadded) { + var diff = Math.abs(tok.maxLen - String(val).length); + switch (diff) { + case 0: + return ''; + case 1: + return '0'; + default: { + return '0{' + diff + '}'; + } + } + } + return val; +} + +/** + * Expose `toRegexRange` + */ + +module.exports = toRegexRange; diff --git a/node_modules/to-regex-range/package.json b/node_modules/to-regex-range/package.json new file mode 100644 index 0000000..3dbcb6d --- /dev/null +++ b/node_modules/to-regex-range/package.json @@ -0,0 +1,120 @@ +{ + "_args": [ + [ + "to-regex-range@2.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "to-regex-range@2.1.1", + "_id": "to-regex-range@2.1.1", + "_inBundle": false, + "_integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "_location": "/to-regex-range", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "to-regex-range@2.1.1", + "name": "to-regex-range", + "escapedName": "to-regex-range", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/fill-range" + ], + "_resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "_spec": "2.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/micromatch/to-regex-range/issues" + }, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "description": "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.", + "devDependencies": { + "fill-range": "^3.1.1", + "gulp-format-md": "^0.1.12", + "mocha": "^3.2.0", + "text-table": "^0.2.0", + "time-diff": "^0.3.1" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/micromatch/to-regex-range", + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "date", + "expand", + "expansion", + "glob", + "match", + "matches", + "matching", + "number", + "numerical", + "range", + "ranges", + "regex", + "sequence", + "sh", + "to", + "year" + ], + "license": "MIT", + "main": "index.js", + "name": "to-regex-range", + "repository": { + "type": "git", + "url": "git+https://github.com/micromatch/to-regex-range.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "expand-range", + "fill-range", + "micromatch", + "repeat-element", + "repeat-string" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "helpers": [ + "./examples.js" + ], + "reflinks": [ + "0-5", + "0-9", + "1-5", + "1-9" + ] + }, + "version": "2.1.1" +} diff --git a/node_modules/to-regex/LICENSE b/node_modules/to-regex/LICENSE new file mode 100644 index 0000000..7c9987b --- /dev/null +++ b/node_modules/to-regex/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-2018, Jon Schlinkert. + +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/to-regex/README.md b/node_modules/to-regex/README.md new file mode 100644 index 0000000..5a28fc3 --- /dev/null +++ b/node_modules/to-regex/README.md @@ -0,0 +1,205 @@ +# to-regex [![NPM version](https://img.shields.io/npm/v/to-regex.svg?style=flat)](https://www.npmjs.com/package/to-regex) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex.svg?style=flat)](https://npmjs.org/package/to-regex) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex.svg?style=flat)](https://npmjs.org/package/to-regex) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/to-regex.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/to-regex) + +> Generate a regex from a string or array of strings. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +- [Install](#install) +- [Usage](#usage) +- [Options](#options) + * [options.contains](#optionscontains) + * [options.negate](#optionsnegate) + * [options.nocase](#optionsnocase) + * [options.flags](#optionsflags) + * [options.cache](#optionscache) + * [options.safe](#optionssafe) +- [About](#about) + * [Related projects](#related-projects) + * [Author](#author) + * [License](#license) + +_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-regex +``` + +## Usage + +```js +var toRegex = require('to-regex'); + +console.log(toRegex('foo')); +//=> /^(?:foo)$/ + +console.log(toRegex('foo', {negate: true})); +//=> /^(?:(?:(?!^(?:foo)$).)*)$/ + +console.log(toRegex('foo', {contains: true})); +//=> /(?:foo)/ + +console.log(toRegex(['foo', 'bar'], {negate: true})); +//=> /^(?:(?:(?!^(?:(?:foo)|(?:bar))$).)*)$/ + +console.log(toRegex(['foo', 'bar'], {negate: true, contains: true})); +//=> /^(?:(?:(?!(?:(?:foo)|(?:bar))).)*)$/ +``` + +## Options + +### options.contains + +**Type**: `Boolean` + +**Default**: `undefined` + +Generate a regex that will match any string that _contains_ the given pattern. By default, regex is strict will only return true for exact matches. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {contains: true})); +//=> /(?:foo)/ +``` + +### options.negate + +**Type**: `Boolean` + +**Default**: `undefined` + +Create a regex that will match everything except the given pattern. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {negate: true})); +//=> /^(?:(?:(?!^(?:foo)$).)*)$/ +``` + +### options.nocase + +**Type**: `Boolean` + +**Default**: `undefined` + +Adds the `i` flag, to enable case-insensitive matching. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {nocase: true})); +//=> /^(?:foo)$/i +``` + +Alternatively you can pass the flags you want directly on [options.flags](#options.flags). + +### options.flags + +**Type**: `String` + +**Default**: `undefined` + +Define the flags you want to use on the generated regex. + +```js +var toRegex = require('to-regex'); +console.log(toRegex('foo', {flags: 'gm'})); +//=> /^(?:foo)$/gm +console.log(toRegex('foo', {flags: 'gmi', nocase: true})); //<= handles redundancy +//=> /^(?:foo)$/gmi +``` + +### options.cache + +**Type**: `Boolean` + +**Default**: `true` + +Generated regex is cached based on the provided string and options. As a result, runtime compilation only happens once per pattern (as long as options are also the same), which can result in dramatic speed improvements. + +This also helps with debugging, since adding options and pattern are added to the generated regex. + +**Disable caching** + +```js +toRegex('foo', {cache: false}); +``` + +### options.safe + +**Type**: `Boolean` + +**Default**: `undefined` + +Check the generated regular expression with [safe-regex](https://github.com/substack/safe-regex) and throw an error if the regex is potentially unsafe. + +**Examples** + +```js +console.log(toRegex('(x+x+)+y')); +//=> /^(?:(x+x+)+y)$/ + +// The following would throw an error +toRegex('(x+x+)+y', {safe: true}); +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [path-regex](https://www.npmjs.com/package/path-regex): Regular expression for matching the parts of a file path. | [homepage](https://github.com/regexps/path-regex "Regular expression for matching the parts of a file path.") +* [to-regex-range](https://www.npmjs.com/package/to-regex-range): Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than… [more](https://github.com/micromatch/to-regex-range) | [homepage](https://github.com/micromatch/to-regex-range "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.") + +### Author + +**Jon Schlinkert** + +* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert) +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 24, 2018._ \ No newline at end of file diff --git a/node_modules/to-regex/index.js b/node_modules/to-regex/index.js new file mode 100644 index 0000000..a87d015 --- /dev/null +++ b/node_modules/to-regex/index.js @@ -0,0 +1,155 @@ +'use strict'; + +var safe = require('safe-regex'); +var define = require('define-property'); +var extend = require('extend-shallow'); +var not = require('regex-not'); +var MAX_LENGTH = 1024 * 64; + +/** + * Session cache + */ + +var cache = {}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +module.exports = function(patterns, options) { + if (!Array.isArray(patterns)) { + return makeRe(patterns, options); + } + return makeRe(patterns.join('|'), options); +}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +function makeRe(pattern, options) { + if (pattern instanceof RegExp) { + return pattern; + } + + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + var key = pattern; + // do this before shallow cloning options, it's a lot faster + if (!options || (options && options.cache !== false)) { + key = createKey(pattern, options); + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + } + + var opts = extend({}, options); + if (opts.contains === true) { + if (opts.negate === true) { + opts.strictNegate = false; + } else { + opts.strict = false; + } + } + + if (opts.strict === false) { + opts.strictOpen = false; + opts.strictClose = false; + } + + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var flags = opts.flags || ''; + var regex; + + if (opts.nocase === true && !/i/.test(flags)) { + flags += 'i'; + } + + try { + if (opts.negate || typeof opts.strictNegate === 'boolean') { + pattern = not.create(pattern, opts); + } + + var str = open + '(?:' + pattern + ')' + close; + regex = new RegExp(str, flags); + + if (opts.safe === true && safe(regex) === false) { + throw new Error('potentially unsafe regular expression: ' + regex.source); + } + + } catch (err) { + if (opts.strictErrors === true || opts.safe === true) { + err.key = key; + err.pattern = pattern; + err.originalOptions = options; + err.createdOptions = opts; + throw err; + } + + try { + regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$'); + } catch (err) { + regex = /.^/; //<= match nothing + } + } + + if (opts.cache !== false) { + memoize(regex, key, pattern, opts); + } + return regex; +} + +/** + * Memoize generated regex. This can result in dramatic speed improvements + * and simplify debugging by adding options and pattern to the regex. It can be + * disabled by passing setting `options.cache` to false. + */ + +function memoize(regex, key, pattern, options) { + define(regex, 'cached', true); + define(regex, 'pattern', pattern); + define(regex, 'options', options); + define(regex, 'key', key); + cache[key] = regex; +} + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +function createKey(pattern, options) { + if (!options) return pattern; + var key = pattern; + for (var prop in options) { + if (options.hasOwnProperty(prop)) { + key += ';' + prop + '=' + String(options[prop]); + } + } + return key; +} + +/** + * Expose `makeRe` + */ + +module.exports.makeRe = makeRe; diff --git a/node_modules/to-regex/package.json b/node_modules/to-regex/package.json new file mode 100644 index 0000000..b418b66 --- /dev/null +++ b/node_modules/to-regex/package.json @@ -0,0 +1,100 @@ +{ + "_args": [ + [ + "to-regex@3.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "to-regex@3.0.2", + "_id": "to-regex@3.0.2", + "_inBundle": false, + "_integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "_location": "/to-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "to-regex@3.0.2", + "name": "to-regex", + "escapedName": "to-regex", + "rawSpec": "3.0.2", + "saveSpec": null, + "fetchSpec": "3.0.2" + }, + "_requiredBy": [ + "/braces", + "/expand-brackets", + "/extglob", + "/micromatch", + "/nanomatch" + ], + "_resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "_spec": "3.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/to-regex/issues" + }, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "description": "Generate a regex from a string or array of strings.", + "devDependencies": { + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/to-regex", + "keywords": [ + "match", + "regex", + "regular expression", + "test", + "to" + ], + "license": "MIT", + "main": "index.js", + "name": "to-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/to-regex.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": { + "method": "preWrite" + }, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "has-glob", + "is-glob", + "path-regex", + "to-regex-range" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "3.0.2" +} diff --git a/node_modules/toidentifier/LICENSE b/node_modules/toidentifier/LICENSE new file mode 100644 index 0000000..de22d15 --- /dev/null +++ b/node_modules/toidentifier/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Douglas Christopher Wilson + +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/toidentifier/README.md b/node_modules/toidentifier/README.md new file mode 100644 index 0000000..7c8794e --- /dev/null +++ b/node_modules/toidentifier/README.md @@ -0,0 +1,61 @@ +# toidentifier + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][codecov-image]][codecov-url] + +> Convert a string of words to a JavaScript identifier + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install toidentifier +``` + +## Example + +```js +var toIdentifier = require('toidentifier') + +console.log(toIdentifier('Bad Request')) +// => "BadRequest" +``` + +## API + +This CommonJS module exports a single default function: `toIdentifier`. + +### toIdentifier(string) + +Given a string as the argument, it will be transformed according to +the following rules and the new string will be returned: + +1. Split into words separated by space characters (`0x20`). +2. Upper case the first character of each word. +3. Join the words together with no separator. +4. Remove all non-word (`[0-9a-z_]`) characters. + +## License + +[MIT](LICENSE) + +[codecov-image]: https://img.shields.io/codecov/c/github/component/toidentifier.svg +[codecov-url]: https://codecov.io/gh/component/toidentifier +[downloads-image]: https://img.shields.io/npm/dm/toidentifier.svg +[downloads-url]: https://npmjs.org/package/toidentifier +[npm-image]: https://img.shields.io/npm/v/toidentifier.svg +[npm-url]: https://npmjs.org/package/toidentifier +[travis-image]: https://img.shields.io/travis/component/toidentifier/master.svg +[travis-url]: https://travis-ci.org/component/toidentifier + + +## + +[npm]: https://www.npmjs.com/ + +[yarn]: https://yarnpkg.com/ diff --git a/node_modules/toidentifier/index.js b/node_modules/toidentifier/index.js new file mode 100644 index 0000000..bba5411 --- /dev/null +++ b/node_modules/toidentifier/index.js @@ -0,0 +1,30 @@ +/*! + * toidentifier + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * Module exports. + * @public + */ + +module.exports = toIdentifier + +/** + * Trasform the given string into a JavaScript identifier + * + * @param {string} str + * @returns {string} + * @public + */ + +function toIdentifier (str) { + return str + .split(' ') + .map(function (token) { + return token.slice(0, 1).toUpperCase() + token.slice(1) + }) + .join('') + .replace(/[^ _0-9a-z]/gi, '') +} diff --git a/node_modules/toidentifier/package.json b/node_modules/toidentifier/package.json new file mode 100644 index 0000000..107a043 --- /dev/null +++ b/node_modules/toidentifier/package.json @@ -0,0 +1,79 @@ +{ + "_args": [ + [ + "toidentifier@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "toidentifier@1.0.0", + "_id": "toidentifier@1.0.0", + "_inBundle": false, + "_integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "_location": "/toidentifier", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "toidentifier@1.0.0", + "name": "toidentifier", + "escapedName": "toidentifier", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/http-errors" + ], + "_resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/component/toidentifier/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Nick Baugh", + "email": "niftylettuce@gmail.com", + "url": "http://niftylettuce.com/" + } + ], + "description": "Convert a string of words to a JavaScript identifier", + "devDependencies": { + "eslint": "4.19.1", + "eslint-config-standard": "11.0.0", + "eslint-plugin-import": "2.11.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "6.0.1", + "eslint-plugin-promise": "3.7.0", + "eslint-plugin-standard": "3.1.0", + "mocha": "1.21.5", + "nyc": "11.8.0" + }, + "engines": { + "node": ">=0.6" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/component/toidentifier#readme", + "license": "MIT", + "name": "toidentifier", + "repository": { + "type": "git", + "url": "git+https://github.com/component/toidentifier.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "version": "1.0.0" +} diff --git a/node_modules/touch/LICENSE b/node_modules/touch/LICENSE new file mode 100644 index 0000000..05eeeb8 --- /dev/null +++ b/node_modules/touch/LICENSE @@ -0,0 +1,15 @@ +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/touch/README.md b/node_modules/touch/README.md new file mode 100644 index 0000000..b5a361e --- /dev/null +++ b/node_modules/touch/README.md @@ -0,0 +1,52 @@ +# node-touch + +For all your node touching needs. + +## Installing + +```bash +npm install touch +``` + +## CLI Usage: + +See `man touch` + +This package exports a binary called `nodetouch` that works mostly +like the unix builtin `touch(1)`. + +## API Usage: + +```javascript +var touch = require("touch") +``` + +Gives you the following functions: + +* `touch(filename, options, cb)` +* `touch.sync(filename, options)` +* `touch.ftouch(fd, options, cb)` +* `touch.ftouchSync(fd, options)` + +All the `options` objects are optional. + +All the async functions return a Promise. If a callback function is +provided, then it's attached to the Promise. + +## Options + +* `force` like `touch -f` Boolean +* `time` like `touch -t ` Can be a Date object, or any parseable + Date string, or epoch ms number. +* `atime` like `touch -a` Can be either a Boolean, or a Date. +* `mtime` like `touch -m` Can be either a Boolean, or a Date. +* `ref` like `touch -r ` Must be path to a file. +* `nocreate` like `touch -c` Boolean + +If neither `atime` nor `mtime` are set, then both values are set. If +one of them is set, then the other is not. + +## cli + +This package creates a `nodetouch` command line executable that works +very much like the unix builtin `touch(1)` diff --git a/node_modules/touch/bin/nodetouch.js b/node_modules/touch/bin/nodetouch.js new file mode 100755 index 0000000..f78f082 --- /dev/null +++ b/node_modules/touch/bin/nodetouch.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node +const touch = require("../index.js") + +const usage = code => { + console[code ? 'error' : 'log']( + 'usage:\n' + + 'touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...' + ) + process.exit(code) +} + +const singleFlags = { + a: 'atime', + m: 'mtime', + c: 'nocreate', + f: 'force' +} + +const singleOpts = { + r: 'ref', + t: 'time' +} + +const files = [] +const args = process.argv.slice(2) +const options = {} +for (let i = 0; i < args.length; i++) { + const arg = args[i] + if (!arg.match(/^-/)) { + files.push(arg) + continue + } + + // expand shorthands + if (arg.charAt(1) !== '-') { + const expand = [] + for (let f = 1; f < arg.length; f++) { + const fc = arg.charAt(f) + const sf = singleFlags[fc] + const so = singleOpts[fc] + if (sf) + expand.push('--' + sf) + else if (so) { + const soslice = arg.slice(f + 1) + const soval = soslice.charAt(0) === '=' ? soslice : '=' + soslice + expand.push('--' + so + soval) + f = arg.length + } else if (arg !== '-' + fc) + expand.push('-' + fc) + } + if (expand.length) { + args.splice.apply(args, [i, 1].concat(expand)) + i-- + continue + } + } + + const argsplit = arg.split('=') + const key = argsplit.shift().replace(/^\-\-/, '') + const val = argsplit.length ? argsplit.join('=') : null + + switch (key) { + case 'time': + const timestr = val || args[++i] + // [-t [[CC]YY]MMDDhhmm[.SS]] + const parsedtime = timestr.match( + /^(([0-9]{2})?([0-9]{2}))?([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})(\.([0-9]{2}))?$/ + ) + if (!parsedtime) { + console.error('touch: out of range or illegal ' + + 'time specification: ' + + '[[CC]YY]MMDDhhmm[.SS]') + process.exit(1) + } else { + const y = +parsedtime[1] + const year = parsedtime[2] ? y + : y <= 68 ? 2000 + y + : 1900 + y + + const MM = +parsedtime[4] - 1 + const dd = +parsedtime[5] + const hh = +parsedtime[6] + const mm = +parsedtime[7] + const ss = +parsedtime[8] + + options.time = new Date(Date.UTC(year, MM, dd, hh, mm, ss)) + } + continue + + case 'ref': + options.ref = val || args[++i] + continue + + case 'mtime': + case 'nocreate': + case 'atime': + case 'force': + options[key] = true + continue + + default: + console.error('touch: illegal option -- ' + arg) + usage(1) + } +} + +if (!files.length) + usage() + +process.exitCode = 0 +Promise.all(files.map(f => touch(f, options))) + .catch(er => process.exitCode = 1) diff --git a/node_modules/touch/index.js b/node_modules/touch/index.js new file mode 100644 index 0000000..f942e42 --- /dev/null +++ b/node_modules/touch/index.js @@ -0,0 +1,224 @@ +'use strict' + +const EE = require('events').EventEmitter +const cons = require('constants') +const fs = require('fs') + +module.exports = (f, options, cb) => { + if (typeof options === 'function') + cb = options, options = {} + + const p = new Promise((res, rej) => { + new Touch(validOpts(options, f, null)) + .on('done', res).on('error', rej) + }) + + return cb ? p.then(res => cb(null, res), cb) : p +} + +module.exports.sync = module.exports.touchSync = (f, options) => + (new TouchSync(validOpts(options, f, null)), undefined) + +module.exports.ftouch = (fd, options, cb) => { + if (typeof options === 'function') + cb = options, options = {} + + const p = new Promise((res, rej) => { + new Touch(validOpts(options, null, fd)) + .on('done', res).on('error', rej) + }) + + return cb ? p.then(res => cb(null, res), cb) : p +} + +module.exports.ftouchSync = (fd, opt) => + (new TouchSync(validOpts(opt, null, fd)), undefined) + +const validOpts = (options, path, fd) => { + options = Object.create(options || {}) + options.fd = fd + options.path = path + + // {mtime: true}, {ctime: true} + // If set to something else, then treat as epoch ms value + const now = parseInt(new Date(options.time || Date.now()).getTime() / 1000) + if (!options.atime && !options.mtime) + options.atime = options.mtime = now + else { + if (true === options.atime) + options.atime = now + + if (true === options.mtime) + options.mtime = now + } + + let oflags = 0 + if (!options.force) + oflags = oflags | cons.O_RDWR + + if (!options.nocreate) + oflags = oflags | cons.O_CREAT + + options.oflags = oflags + return options +} + +class Touch extends EE { + constructor (options) { + super(options) + this.fd = options.fd + this.path = options.path + this.atime = options.atime + this.mtime = options.mtime + this.ref = options.ref + this.nocreate = !!options.nocreate + this.force = !!options.force + this.closeAfter = options.closeAfter + this.oflags = options.oflags + this.options = options + + if (typeof this.fd !== 'number') { + this.closeAfter = true + this.open() + } else + this.onopen(null, this.fd) + } + + emit (ev, data) { + // we only emit when either done or erroring + // in both cases, need to close + this.close() + return super.emit(ev, data) + } + + close () { + if (typeof this.fd === 'number' && this.closeAfter) + fs.close(this.fd, () => {}) + } + + open () { + fs.open(this.path, this.oflags, (er, fd) => this.onopen(er, fd)) + } + + onopen (er, fd) { + if (er) { + if (er.code === 'EISDIR') + this.onopen(null, null) + else if (er.code === 'ENOENT' && this.nocreate) + this.emit('done') + else + this.emit('error', er) + } else { + this.fd = fd + if (this.ref) + this.statref() + else if (!this.atime || !this.mtime) + this.fstat() + else + this.futimes() + } + } + + statref () { + fs.stat(this.ref, (er, st) => { + if (er) + this.emit('error', er) + else + this.onstatref(st) + }) + } + + onstatref (st) { + this.atime = this.atime && parseInt(st.atime.getTime()/1000, 10) + this.mtime = this.mtime && parseInt(st.mtime.getTime()/1000, 10) + if (!this.atime || !this.mtime) + this.fstat() + else + this.futimes() + } + + fstat () { + const stat = this.fd ? 'fstat' : 'stat' + const target = this.fd || this.path + fs[stat](target, (er, st) => { + if (er) + this.emit('error', er) + else + this.onfstat(st) + }) + } + + onfstat (st) { + if (typeof this.atime !== 'number') + this.atime = parseInt(st.atime.getTime()/1000, 10) + + if (typeof this.mtime !== 'number') + this.mtime = parseInt(st.mtime.getTime()/1000, 10) + + this.futimes() + } + + futimes () { + const utimes = this.fd ? 'futimes' : 'utimes' + const target = this.fd || this.path + fs[utimes](target, ''+this.atime, ''+this.mtime, er => { + if (er) + this.emit('error', er) + else + this.emit('done') + }) + } +} + +class TouchSync extends Touch { + open () { + try { + this.onopen(null, fs.openSync(this.path, this.oflags)) + } catch (er) { + this.onopen(er) + } + } + + statref () { + let threw = true + try { + this.onstatref(fs.statSync(this.ref)) + threw = false + } finally { + if (threw) + this.close() + } + } + + fstat () { + let threw = true + const stat = this.fd ? 'fstatSync' : 'statSync' + const target = this.fd || this.path + try { + this.onfstat(fs[stat](target)) + threw = false + } finally { + if (threw) + this.close() + } + } + + futimes () { + let threw = true + const utimes = this.fd ? 'futimesSync' : 'utimesSync' + const target = this.fd || this.path + try { + fs[utimes](target, this.atime, this.mtime) + threw = false + } finally { + if (threw) + this.close() + } + this.emit('done') + } + + close () { + if (typeof this.fd === 'number' && this.closeAfter) + try { fs.closeSync(this.fd) } catch (er) {} + } +} diff --git a/node_modules/touch/node_modules/.bin/nopt b/node_modules/touch/node_modules/.bin/nopt new file mode 120000 index 0000000..6b6566e --- /dev/null +++ b/node_modules/touch/node_modules/.bin/nopt @@ -0,0 +1 @@ +../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/touch/node_modules/nopt/.npmignore b/node_modules/touch/node_modules/nopt/.npmignore new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/touch/node_modules/nopt/LICENSE b/node_modules/touch/node_modules/nopt/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/touch/node_modules/nopt/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/touch/node_modules/nopt/README.md b/node_modules/touch/node_modules/nopt/README.md new file mode 100644 index 0000000..eeddfd4 --- /dev/null +++ b/node_modules/touch/node_modules/nopt/README.md @@ -0,0 +1,208 @@ +If you want to write an option parser, and have it be good, there are +two ways to do it. The Right Way, and the Wrong Way. + +The Wrong Way is to sit down and write an option parser. We've all done +that. + +The Right Way is to write some complex configurable program with so many +options that you go half-insane just trying to manage them all, and put +it off with duct-tape solutions until you see exactly to the core of the +problem, and finally snap and write an awesome option parser. + +If you want to write an option parser, don't write an option parser. +Write a package manager, or a source control system, or a service +restarter, or an operating system. You probably won't end up with a +good one of those, but if you don't give up, and you are relentless and +diligent enough in your procrastination, you may just end up with a very +nice option parser. + +## USAGE + + // my-program.js + var nopt = require("nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + , "many" : [String, Array] + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag"] + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + console.log(parsed) + +This would give you support for any of the following: + +```bash +$ node my-program.js --foo "blerp" --no-flag +{ "foo" : "blerp", "flag" : false } + +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag +{ bar: 7, foo: "Mr. Hand", flag: true } + +$ node my-program.js --foo "blerp" -f -----p +{ foo: "blerp", flag: true, pick: true } + +$ node my-program.js -fp --foofoo +{ foo: "Mr. Foo", flag: true, pick: true } + +$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } + +$ node my-program.js --blatzk 1000 -fp # unknown opts are ok. +{ blatzk: 1000, flag: true, pick: true } + +$ node my-program.js --blatzk true -fp # but they need a value +{ blatzk: true, flag: true, pick: true } + +$ node my-program.js --no-blatzk -fp # unless they start with "no-" +{ blatzk: false, flag: true, pick: true } + +$ node my-program.js --baz b/a/z # known paths are resolved. +{ baz: "/Users/isaacs/b/a/z" } + +# if Array is one of the types, then it can take many +# values, and will always be an array. The other types provided +# specify what types are allowed in the list. + +$ node my-program.js --many 1 --many null --many foo +{ many: ["1", "null", "foo"] } + +$ node my-program.js --many foo +{ many: ["foo"] } +``` + +Read the tests at the bottom of `lib/nopt.js` for more examples of +what this puppy can do. + +## Types + +The following types are supported, and defined on `nopt.typeDefs` + +* String: A normal string. No parsing is done. +* path: A file system path. Gets resolved against cwd if not absolute. +* url: A url. If it doesn't parse, it isn't accepted. +* Number: Must be numeric. +* Date: Must parse as a date. If it does, and `Date` is one of the options, + then it will return a Date object, not a string. +* Boolean: Must be either `true` or `false`. If an option is a boolean, + then it does not need a value, and its presence will imply `true` as + the value. To negate boolean flags, do `--no-whatever` or `--whatever + false` +* NaN: Means that the option is strictly not allowed. Any value will + fail. +* Stream: An object matching the "Stream" class in node. Valuable + for use when validating programmatically. (npm uses this to let you + supply any WriteStream on the `outfd` and `logfd` config options.) +* Array: If `Array` is specified as one of the types, then the value + will be parsed as a list of options. This means that multiple values + can be specified, and that the value will always be an array. + +If a type is an array of values not on this list, then those are +considered valid values. For instance, in the example above, the +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, +and any other value will be rejected. + +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be +interpreted as their JavaScript equivalents, and numeric values will be +interpreted as a number. + +You can also mix types and values, or multiple types, in a list. For +instance `{ blah: [Number, null] }` would allow a value to be set to +either a Number or null. + +To define a new type, add it to `nopt.typeDefs`. Each item in that +hash is an object with a `type` member and a `validate` method. The +`type` member is an object that matches what goes in the type list. The +`validate` method is a function that gets called with `validate(data, +key, val)`. Validate methods should assign `data[key]` to the valid +value of `val` if it can be handled properly, or return boolean +`false` if it cannot. + +You can also call `nopt.clean(data, types, typeDefs)` to clean up a +config object and remove its invalid properties. + +## Error Handling + +By default, nopt outputs a warning to standard error when invalid +options are found. You can change this behavior by assigning a method +to `nopt.invalidHandler`. This method will be called with +the offending `nopt.invalidHandler(key, val, types)`. + +If no `nopt.invalidHandler` is assigned, then it will console.error +its whining. If it is assigned to boolean `false` then the warning is +suppressed. + +## Abbreviations + +Yes, they are supported. If you define options like this: + +```javascript +{ "foolhardyelephants" : Boolean +, "pileofmonkeys" : Boolean } +``` + +Then this will work: + +```bash +node program.js --foolhar --pil +node program.js --no-f --pileofmon +# etc. +``` + +## Shorthands + +Shorthands are a hash of shorter option names to a snippet of args that +they expand to. + +If multiple one-character shorthands are all combined, and the +combination does not unambiguously match any other option or shorthand, +then they will be broken up into their constituent parts. For example: + +```json +{ "s" : ["--loglevel", "silent"] +, "g" : "--global" +, "f" : "--force" +, "p" : "--parseable" +, "l" : "--long" +} +``` + +```bash +npm ls -sgflp +# just like doing this: +npm ls --loglevel silent --global --force --long --parseable +``` + +## The Rest of the args + +The config object returned by nopt is given a special member called +`argv`, which is an object with the following fields: + +* `remain`: The remaining args after all the parsing has occurred. +* `original`: The args as they originally appeared. +* `cooked`: The args after flags and shorthands are expanded. + +## Slicing + +Node programs are called with more or less the exact argv as it appears +in C land, after the v8 and node-specific options have been plucked off. +As such, `argv[0]` is always `node` and `argv[1]` is always the +JavaScript program being run. + +That's usually not very useful to you. So they're sliced off by +default. If you want them, then you can pass in `0` as the last +argument, or any other number that you'd like to slice off the start of +the list. diff --git a/node_modules/touch/node_modules/nopt/bin/nopt.js b/node_modules/touch/node_modules/nopt/bin/nopt.js new file mode 100755 index 0000000..df90c72 --- /dev/null +++ b/node_modules/touch/node_modules/nopt/bin/nopt.js @@ -0,0 +1,44 @@ +#!/usr/bin/env node +var nopt = require("../lib/nopt") + , types = { num: Number + , bool: Boolean + , help: Boolean + , list: Array + , "num-list": [Number, Array] + , "str-list": [String, Array] + , "bool-list": [Boolean, Array] + , str: String } + , shorthands = { s: [ "--str", "astring" ] + , b: [ "--bool" ] + , nb: [ "--no-bool" ] + , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ] + , "?": ["--help"] + , h: ["--help"] + , H: ["--help"] + , n: [ "--num", "125" ] } + , parsed = nopt( types + , shorthands + , process.argv + , 2 ) + +console.log("parsed", parsed) + +if (parsed.help) { + console.log("") + console.log("nopt cli tester") + console.log("") + console.log("types") + console.log(Object.keys(types).map(function M (t) { + var type = types[t] + if (Array.isArray(type)) { + return [t, type.map(function (type) { return type.name })] + } + return [t, type && type.name] + }).reduce(function (s, i) { + s[i[0]] = i[1] + return s + }, {})) + console.log("") + console.log("shorthands") + console.log(shorthands) +} diff --git a/node_modules/touch/node_modules/nopt/examples/my-program.js b/node_modules/touch/node_modules/nopt/examples/my-program.js new file mode 100755 index 0000000..142447e --- /dev/null +++ b/node_modules/touch/node_modules/nopt/examples/my-program.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +//process.env.DEBUG_NOPT = 1 + +// my-program.js +var nopt = require("../lib/nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag", "true"] + , "g" : ["--flag"] + , "s" : "--flag" + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + +console.log("parsed =\n"+ require("util").inspect(parsed)) diff --git a/node_modules/touch/node_modules/nopt/lib/nopt.js b/node_modules/touch/node_modules/nopt/lib/nopt.js new file mode 100644 index 0000000..ff802da --- /dev/null +++ b/node_modules/touch/node_modules/nopt/lib/nopt.js @@ -0,0 +1,552 @@ +// info about each config option. + +var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG + ? function () { console.error.apply(console, arguments) } + : function () {} + +var url = require("url") + , path = require("path") + , Stream = require("stream").Stream + , abbrev = require("abbrev") + +module.exports = exports = nopt +exports.clean = clean + +exports.typeDefs = + { String : { type: String, validate: validateString } + , Boolean : { type: Boolean, validate: validateBoolean } + , url : { type: url, validate: validateUrl } + , Number : { type: Number, validate: validateNumber } + , path : { type: path, validate: validatePath } + , Stream : { type: Stream, validate: validateStream } + , Date : { type: Date, validate: validateDate } + } + +function nopt (types, shorthands, args, slice) { + args = args || process.argv + types = types || {} + shorthands = shorthands || {} + if (typeof slice !== "number") slice = 2 + + debug(types, shorthands, args, slice) + + args = args.slice(slice) + var data = {} + , key + , remain = [] + , cooked = args + , original = args.slice(0) + + parse(args, data, remain, types, shorthands) + // now data is full + clean(data, types, exports.typeDefs) + data.argv = {remain:remain,cooked:cooked,original:original} + data.argv.toString = function () { + return this.original.map(JSON.stringify).join(" ") + } + return data +} + +function clean (data, types, typeDefs) { + typeDefs = typeDefs || exports.typeDefs + var remove = {} + , typeDefault = [false, true, null, String, Number] + + Object.keys(data).forEach(function (k) { + if (k === "argv") return + var val = data[k] + , isArray = Array.isArray(val) + , type = types[k] + if (!isArray) val = [val] + if (!type) type = typeDefault + if (type === Array) type = typeDefault.concat(Array) + if (!Array.isArray(type)) type = [type] + + debug("val=%j", val) + debug("types=", type) + val = val.map(function (val) { + // if it's an unknown value, then parse false/true/null/numbers/dates + if (typeof val === "string") { + debug("string %j", val) + val = val.trim() + if ((val === "null" && ~type.indexOf(null)) + || (val === "true" && + (~type.indexOf(true) || ~type.indexOf(Boolean))) + || (val === "false" && + (~type.indexOf(false) || ~type.indexOf(Boolean)))) { + val = JSON.parse(val) + debug("jsonable %j", val) + } else if (~type.indexOf(Number) && !isNaN(val)) { + debug("convert to number", val) + val = +val + } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) { + debug("convert to date", val) + val = new Date(val) + } + } + + if (!types.hasOwnProperty(k)) { + return val + } + + // allow `--no-blah` to set 'blah' to null if null is allowed + if (val === false && ~type.indexOf(null) && + !(~type.indexOf(false) || ~type.indexOf(Boolean))) { + val = null + } + + var d = {} + d[k] = val + debug("prevalidated val", d, val, types[k]) + if (!validate(d, k, val, types[k], typeDefs)) { + if (exports.invalidHandler) { + exports.invalidHandler(k, val, types[k], data) + } else if (exports.invalidHandler !== false) { + debug("invalid: "+k+"="+val, types[k]) + } + return remove + } + debug("validated val", d, val, types[k]) + return d[k] + }).filter(function (val) { return val !== remove }) + + if (!val.length) delete data[k] + else if (isArray) { + debug(isArray, data[k], val) + data[k] = val + } else data[k] = val[0] + + debug("k=%s val=%j", k, val, data[k]) + }) +} + +function validateString (data, k, val) { + data[k] = String(val) +} + +function validatePath (data, k, val) { + data[k] = path.resolve(String(val)) + return true +} + +function validateNumber (data, k, val) { + debug("validate Number %j %j %j", k, val, isNaN(val)) + if (isNaN(val)) return false + data[k] = +val +} + +function validateDate (data, k, val) { + debug("validate Date %j %j %j", k, val, Date.parse(val)) + var s = Date.parse(val) + if (isNaN(s)) return false + data[k] = new Date(val) +} + +function validateBoolean (data, k, val) { + if (val instanceof Boolean) val = val.valueOf() + else if (typeof val === "string") { + if (!isNaN(val)) val = !!(+val) + else if (val === "null" || val === "false") val = false + else val = true + } else val = !!val + data[k] = val +} + +function validateUrl (data, k, val) { + val = url.parse(String(val)) + if (!val.host) return false + data[k] = val.href +} + +function validateStream (data, k, val) { + if (!(val instanceof Stream)) return false + data[k] = val +} + +function validate (data, k, val, type, typeDefs) { + // arrays are lists of types. + if (Array.isArray(type)) { + for (var i = 0, l = type.length; i < l; i ++) { + if (type[i] === Array) continue + if (validate(data, k, val, type[i], typeDefs)) return true + } + delete data[k] + return false + } + + // an array of anything? + if (type === Array) return true + + // NaN is poisonous. Means that something is not allowed. + if (type !== type) { + debug("Poison NaN", k, val, type) + delete data[k] + return false + } + + // explicit list of values + if (val === type) { + debug("Explicitly allowed %j", val) + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + return true + } + + // now go through the list of typeDefs, validate against each one. + var ok = false + , types = Object.keys(typeDefs) + for (var i = 0, l = types.length; i < l; i ++) { + debug("test type %j %j %j", k, val, types[i]) + var t = typeDefs[types[i]] + if (t && type === t.type) { + var d = {} + ok = false !== t.validate(d, k, val) + val = d[k] + if (ok) { + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + break + } + } + } + debug("OK? %j (%j %j %j)", ok, k, val, types[i]) + + if (!ok) delete data[k] + return ok +} + +function parse (args, data, remain, types, shorthands) { + debug("parse", args, data, remain) + + var key = null + , abbrevs = abbrev(Object.keys(types)) + , shortAbbr = abbrev(Object.keys(shorthands)) + + for (var i = 0; i < args.length; i ++) { + var arg = args[i] + debug("arg", arg) + + if (arg.match(/^-{2,}$/)) { + // done with keys. + // the rest are args. + remain.push.apply(remain, args.slice(i + 1)) + args[i] = "--" + break + } + if (arg.charAt(0) === "-") { + if (arg.indexOf("=") !== -1) { + var v = arg.split("=") + arg = v.shift() + v = v.join("=") + args.splice.apply(args, [i, 1].concat([arg, v])) + } + // see if it's a shorthand + // if so, splice and back up to re-parse it. + var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs) + debug("arg=%j shRes=%j", arg, shRes) + if (shRes) { + debug(arg, shRes) + args.splice.apply(args, [i, 1].concat(shRes)) + if (arg !== shRes[0]) { + i -- + continue + } + } + arg = arg.replace(/^-+/, "") + var no = false + while (arg.toLowerCase().indexOf("no-") === 0) { + no = !no + arg = arg.substr(3) + } + + if (abbrevs[arg]) arg = abbrevs[arg] + + var isArray = types[arg] === Array || + Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 + + var val + , la = args[i + 1] + + var isBool = no || + types[arg] === Boolean || + Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || + (la === "false" && + (types[arg] === null || + Array.isArray(types[arg]) && ~types[arg].indexOf(null))) + + if (isBool) { + // just set and move along + val = !no + // however, also support --bool true or --bool false + if (la === "true" || la === "false") { + val = JSON.parse(la) + la = null + if (no) val = !val + i ++ + } + + // also support "foo":[Boolean, "bar"] and "--foo bar" + if (Array.isArray(types[arg]) && la) { + if (~types[arg].indexOf(la)) { + // an explicit type + val = la + i ++ + } else if ( la === "null" && ~types[arg].indexOf(null) ) { + // null allowed + val = null + i ++ + } else if ( !la.match(/^-{2,}[^-]/) && + !isNaN(la) && + ~types[arg].indexOf(Number) ) { + // number + val = +la + i ++ + } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { + // string + val = la + i ++ + } + } + + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + continue + } + + if (la && la.match(/^-{2,}$/)) { + la = undefined + i -- + } + + val = la === undefined ? true : la + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + i ++ + continue + } + remain.push(arg) + } +} + +function resolveShort (arg, shorthands, shortAbbr, abbrevs) { + // handle single-char shorthands glommed together, like + // npm ls -glp, but only if there is one dash, and only if + // all of the chars are single-char shorthands, and it's + // not a match to some other abbrev. + arg = arg.replace(/^-+/, '') + if (abbrevs[arg] && !shorthands[arg]) { + return null + } + if (shortAbbr[arg]) { + arg = shortAbbr[arg] + } else { + var singles = shorthands.___singles + if (!singles) { + singles = Object.keys(shorthands).filter(function (s) { + return s.length === 1 + }).reduce(function (l,r) { l[r] = true ; return l }, {}) + shorthands.___singles = singles + } + var chrs = arg.split("").filter(function (c) { + return singles[c] + }) + if (chrs.join("") === arg) return chrs.map(function (c) { + return shorthands[c] + }).reduce(function (l, r) { + return l.concat(r) + }, []) + } + + if (shorthands[arg] && !Array.isArray(shorthands[arg])) { + shorthands[arg] = shorthands[arg].split(/\s+/) + } + return shorthands[arg] +} + +if (module === require.main) { +var assert = require("assert") + , util = require("util") + + , shorthands = + { s : ["--loglevel", "silent"] + , d : ["--loglevel", "info"] + , dd : ["--loglevel", "verbose"] + , ddd : ["--loglevel", "silly"] + , noreg : ["--no-registry"] + , reg : ["--registry"] + , "no-reg" : ["--no-registry"] + , silent : ["--loglevel", "silent"] + , verbose : ["--loglevel", "verbose"] + , h : ["--usage"] + , H : ["--usage"] + , "?" : ["--usage"] + , help : ["--usage"] + , v : ["--version"] + , f : ["--force"] + , desc : ["--description"] + , "no-desc" : ["--no-description"] + , "local" : ["--no-global"] + , l : ["--long"] + , p : ["--parseable"] + , porcelain : ["--parseable"] + , g : ["--global"] + } + + , types = + { aoa: Array + , nullstream: [null, Stream] + , date: Date + , str: String + , browser : String + , cache : path + , color : ["always", Boolean] + , depth : Number + , description : Boolean + , dev : Boolean + , editor : path + , force : Boolean + , global : Boolean + , globalconfig : path + , group : [String, Number] + , gzipbin : String + , logfd : [Number, Stream] + , loglevel : ["silent","win","error","warn","info","verbose","silly"] + , long : Boolean + , "node-version" : [false, String] + , npaturl : url + , npat : Boolean + , "onload-script" : [false, String] + , outfd : [Number, Stream] + , parseable : Boolean + , pre: Boolean + , prefix: path + , proxy : url + , "rebuild-bundle" : Boolean + , registry : url + , searchopts : String + , searchexclude: [null, String] + , shell : path + , t: [Array, String] + , tag : String + , tar : String + , tmp : path + , "unsafe-perm" : Boolean + , usage : Boolean + , user : String + , username : String + , userconfig : path + , version : Boolean + , viewer: path + , _exit : Boolean + } + +; [["-v", {version:true}, []] + ,["---v", {version:true}, []] + ,["ls -s --no-reg connect -d", + {loglevel:"info",registry:null},["ls","connect"]] + ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]] + ,["ls --registry blargle", {}, ["ls"]] + ,["--no-registry", {registry:null}, []] + ,["--no-color true", {color:false}, []] + ,["--no-color false", {color:true}, []] + ,["--no-color", {color:false}, []] + ,["--color false", {color:false}, []] + ,["--color --logfd 7", {logfd:7,color:true}, []] + ,["--color=true", {color:true}, []] + ,["--logfd=10", {logfd:10}, []] + ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] + ,["--tmp=tmp -tar=gtar", + {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] + ,["--logfd x", {}, []] + ,["a -true -- -no-false", {true:true},["a","-no-false"]] + ,["a -no-false", {false:false},["a"]] + ,["a -no-no-true", {true:true}, ["a"]] + ,["a -no-no-no-false", {false:false}, ["a"]] + ,["---NO-no-No-no-no-no-nO-no-no"+ + "-No-no-no-no-no-no-no-no-no"+ + "-no-no-no-no-NO-NO-no-no-no-no-no-no"+ + "-no-body-can-do-the-boogaloo-like-I-do" + ,{"body-can-do-the-boogaloo-like-I-do":false}, []] + ,["we are -no-strangers-to-love "+ + "--you-know the-rules --and so-do-i "+ + "---im-thinking-of=a-full-commitment "+ + "--no-you-would-get-this-from-any-other-guy "+ + "--no-gonna-give-you-up "+ + "-no-gonna-let-you-down=true "+ + "--no-no-gonna-run-around false "+ + "--desert-you=false "+ + "--make-you-cry false "+ + "--no-tell-a-lie "+ + "--no-no-and-hurt-you false" + ,{"strangers-to-love":false + ,"you-know":"the-rules" + ,"and":"so-do-i" + ,"you-would-get-this-from-any-other-guy":false + ,"gonna-give-you-up":false + ,"gonna-let-you-down":false + ,"gonna-run-around":false + ,"desert-you":false + ,"make-you-cry":false + ,"tell-a-lie":false + ,"and-hurt-you":false + },["we", "are"]] + ,["-t one -t two -t three" + ,{t: ["one", "two", "three"]} + ,[]] + ,["-t one -t null -t three four five null" + ,{t: ["one", "null", "three"]} + ,["four", "five", "null"]] + ,["-t foo" + ,{t:["foo"]} + ,[]] + ,["--no-t" + ,{t:["false"]} + ,[]] + ,["-no-no-t" + ,{t:["true"]} + ,[]] + ,["-aoa one -aoa null -aoa 100" + ,{aoa:["one", null, 100]} + ,[]] + ,["-str 100" + ,{str:"100"} + ,[]] + ,["--color always" + ,{color:"always"} + ,[]] + ,["--no-nullstream" + ,{nullstream:null} + ,[]] + ,["--nullstream false" + ,{nullstream:null} + ,[]] + ,["--notadate 2011-01-25" + ,{notadate: "2011-01-25"} + ,[]] + ,["--date 2011-01-25" + ,{date: new Date("2011-01-25")} + ,[]] + ].forEach(function (test) { + var argv = test[0].split(/\s+/) + , opts = test[1] + , rem = test[2] + , actual = nopt(types, shorthands, argv, 0) + , parsed = actual.argv + delete actual.argv + console.log(util.inspect(actual, false, 2, true), parsed.remain) + for (var i in opts) { + var e = JSON.stringify(opts[i]) + , a = JSON.stringify(actual[i] === undefined ? null : actual[i]) + if (e && typeof e === "object") { + assert.deepEqual(e, a) + } else { + assert.equal(e, a) + } + } + assert.deepEqual(rem, parsed.remain) + }) +} diff --git a/node_modules/touch/node_modules/nopt/package.json b/node_modules/touch/node_modules/nopt/package.json new file mode 100644 index 0000000..a3c0b46 --- /dev/null +++ b/node_modules/touch/node_modules/nopt/package.json @@ -0,0 +1,61 @@ +{ + "_args": [ + [ + "nopt@1.0.10", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "nopt@1.0.10", + "_id": "nopt@1.0.10", + "_inBundle": false, + "_integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "_location": "/touch/nopt", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "nopt@1.0.10", + "name": "nopt", + "escapedName": "nopt", + "rawSpec": "1.0.10", + "saveSpec": null, + "fetchSpec": "1.0.10" + }, + "_requiredBy": [ + "/touch" + ], + "_resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "_spec": "1.0.10", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "bugs": { + "url": "https://github.com/isaacs/nopt/issues" + }, + "dependencies": { + "abbrev": "1" + }, + "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", + "homepage": "https://github.com/isaacs/nopt#readme", + "license": { + "type": "MIT", + "url": "https://github.com/isaacs/nopt/raw/master/LICENSE" + }, + "main": "lib/nopt.js", + "name": "nopt", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/isaacs/nopt.git" + }, + "scripts": { + "test": "node lib/nopt.js" + }, + "version": "1.0.10" +} diff --git a/node_modules/touch/package.json b/node_modules/touch/package.json new file mode 100644 index 0000000..2a21bd8 --- /dev/null +++ b/node_modules/touch/package.json @@ -0,0 +1,70 @@ +{ + "_args": [ + [ + "touch@3.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "touch@3.1.0", + "_id": "touch@3.1.0", + "_inBundle": false, + "_integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "_location": "/touch", + "_phantomChildren": { + "abbrev": "1.1.1" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "touch@3.1.0", + "name": "touch", + "escapedName": "touch", + "rawSpec": "3.1.0", + "saveSpec": null, + "fetchSpec": "3.1.0" + }, + "_requiredBy": [ + "/nodemon" + ], + "_resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "_spec": "3.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + }, + "bugs": { + "url": "https://github.com/isaacs/node-touch/issues" + }, + "dependencies": { + "nopt": "~1.0.10" + }, + "description": "like touch(1) in node", + "devDependencies": { + "mutate-fs": "^1.1.0", + "tap": "^10.7.0" + }, + "files": [ + "index.js", + "bin/nodetouch.js" + ], + "homepage": "https://github.com/isaacs/node-touch#readme", + "license": "ISC", + "name": "touch", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-touch.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --100 -J" + }, + "version": "3.1.0" +} diff --git a/node_modules/tough-cookie/LICENSE b/node_modules/tough-cookie/LICENSE new file mode 100644 index 0000000..22204e8 --- /dev/null +++ b/node_modules/tough-cookie/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2015, Salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of Salesforce.com 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 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/tough-cookie/README.md b/node_modules/tough-cookie/README.md new file mode 100644 index 0000000..d28bd46 --- /dev/null +++ b/node_modules/tough-cookie/README.md @@ -0,0 +1,507 @@ +[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js + +[![npm package](https://nodei.co/npm/tough-cookie.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/tough-cookie/) + +[![Build Status](https://travis-ci.org/salesforce/tough-cookie.png?branch=master)](https://travis-ci.org/salesforce/tough-cookie) + +# Synopsis + +``` javascript +var tough = require('tough-cookie'); +var Cookie = tough.Cookie; +var cookie = Cookie.parse(header); +cookie.value = 'somethingdifferent'; +header = cookie.toString(); + +var cookiejar = new tough.CookieJar(); +cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); +// ... +cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { + res.headers['cookie'] = cookies.join('; '); +}); +``` + +# Installation + +It's _so_ easy! + +`npm install tough-cookie` + +Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken. + +## Version Support + +Support for versions of node.js will follow that of the [request](https://www.npmjs.com/package/request) module. + +# API + +## tough + +Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound". + +**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary. + +### `parseDate(string)` + +Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. + +### `formatDate(date)` + +Format a Date into a RFC1123 string (the RFC6265-recommended format). + +### `canonicalDomain(str)` + +Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects). + +### `domainMatch(str,domStr[,canonicalize=true])` + +Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". + +The `canonicalize` parameter will run the other two parameters through `canonicalDomain` or not. + +### `defaultPath(path)` + +Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. + +The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output. + +### `pathMatch(reqPath,cookiePath)` + +Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean. + +This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`. + +### `parse(cookieString[, options])` + +alias for `Cookie.parse(cookieString[, options])` + +### `fromJSON(string)` + +alias for `Cookie.fromJSON(string)` + +### `getPublicSuffix(hostname)` + +Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it. + +For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`. + +For further information, see http://publicsuffix.org/. This module derives its list from that site. This call is currently a wrapper around [`psl`](https://www.npmjs.com/package/psl)'s [get() method](https://www.npmjs.com/package/psl#pslgetdomain). + +### `cookieCompare(a,b)` + +For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence: + +* Longest `.path` +* oldest `.creation` (which has a 1ms precision, same as `Date`) +* lowest `.creationIndex` (to get beyond the 1ms precision) + +``` javascript +var cookies = [ /* unsorted array of Cookie objects */ ]; +cookies = cookies.sort(cookieCompare); +``` + +**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`. + +### `permuteDomain(domain)` + +Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores. + +### `permutePath(path)` + +Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores. + + +## Cookie + +Exported via `tough.Cookie`. + +### `Cookie.parse(cookieString[, options])` + +Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. + +The options parameter is not required and currently has only one property: + + * _loose_ - boolean - if `true` enable parsing of key-less cookies like `=abc` and `=`, which are not RFC-compliant. + +If options is not an object, it is ignored, which means you can use `Array#map` with it. + +Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response: + +``` javascript +if (res.headers['set-cookie'] instanceof Array) + cookies = res.headers['set-cookie'].map(Cookie.parse); +else + cookies = [Cookie.parse(res.headers['set-cookie'])]; +``` + +_Note:_ in version 2.3.3, tough-cookie limited the number of spaces before the `=` to 256 characters. This limitation has since been removed. +See [Issue 92](https://github.com/salesforce/tough-cookie/issues/92) + +### Properties + +Cookie object properties: + + * _key_ - string - the name or key of the cookie (default "") + * _value_ - string - the value of the cookie (default "") + * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()` + * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()` + * _domain_ - string - the `Domain=` attribute of the cookie + * _path_ - string - the `Path=` of the cookie + * _secure_ - boolean - the `Secure` cookie flag + * _httpOnly_ - boolean - the `HttpOnly` cookie flag + * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside) + * _creation_ - `Date` - when this cookie was constructed + * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation) + +After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes: + + * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied) + * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one. + * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar + * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute. + +### `Cookie([{properties}])` + +Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties. + +### `.toString()` + +encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`. + +### `.cookieString()` + +encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '='). + +### `.setExpires(String)` + +sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set. + +### `.setMaxAge(number)` + +sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly. + +### `.expiryTime([now=Date.now()])` + +### `.expiryDate([now=Date.now()])` + +expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds. + +Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` parameter -- is used to offset the `.maxAge` attribute. + +If Expires (`.expires`) is set, that's returned. + +Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents). + +### `.TTL([now=Date.now()])` + +compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply. + +The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned. + +### `.canonicalizedDoman()` + +### `.cdomain()` + +return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters. + +### `.toJSON()` + +For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized. + +Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`). + +**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. + +### `Cookie.fromJSON(strOrObj)` + +Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first. + +Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer. + +Returns `null` upon JSON parsing error. + +### `.clone()` + +Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`. + +### `.validate()` + +Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive. + +validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct: + +``` javascript +if (cookie.validate() === true) { + // it's tasty +} else { + // yuck! +} +``` + + +## CookieJar + +Exported via `tough.CookieJar`. + +### `CookieJar([store],[options])` + +Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used. + +The `options` object can be omitted and can have the following properties: + + * _rejectPublicSuffixes_ - boolean - default `true` - reject cookies with domains like "com" and "co.uk" + * _looseMode_ - boolean - default `false` - accept malformed cookies like `bar` and `=bar`, which have an implied empty name. + This is not in the standard, but is used sometimes on the web and is accepted by (most) browsers. + +Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods. + +### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))` + +Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. `Store` errors aren't ignored by this option. + +As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual). + +### `.setCookieSync(cookieOrString, currentUrl, [{options}])` + +Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getCookies(currentUrl, [{options},] cb(err,cookies))` + +Retrieve the list of cookies that can be sent in a Cookie header for the current url. + +If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially). + * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it). + +The `.lastAccessed` property of the returned cookies will have been updated. + +### `.getCookiesSync(currentUrl, [{options}])` + +Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getCookieString(...)` + +Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`. + +### `.getCookieStringSync(...)` + +Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getSetCookieStrings(...)` + +Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`. + +### `.getSetCookieStringsSync(...)` + +Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.serialize(cb(err,serializedObject))` + +Serialize the Jar if the underlying store supports `.getAllCookies`. + +**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. + +See [Serialization Format]. + +### `.serializeSync()` + +Sync version of .serialize + +### `.toJSON()` + +Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`. + +### `CookieJar.deserialize(serialized, [store], cb(err,object))` + +A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization. + +The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. + +As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback. + +### `CookieJar.deserializeSync(serialized, [store])` + +Sync version of `.deserialize`. _Note_ that the `store` must be synchronous for this to work. + +### `CookieJar.fromJSON(string)` + +Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`. + +### `.clone([store,]cb(err,newJar))` + +Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa. + +The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`. + +### `.cloneSync([store])` + +Synchronous version of `.clone`, returning a new `CookieJar` instance. + +The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used. + +The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls. + +## Store + +Base class for CookieJar stores. Available as `tough.Store`. + +## Store API + +The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores. + +Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. + +Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style + +All `domain` parameters will have been normalized before calling. + +The Cookie store must have all of the following methods. + +### `store.findCookie(domain, path, key, cb(err,cookie))` + +Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned. + +Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error). + +### `store.findCookies(domain, path, cb(err,cookies))` + +Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above. + +If no cookies are found, the callback MUST be passed an empty array. + +The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done. + +As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only). + +### `store.putCookie(cookie, cb(err))` + +Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur. + +The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties. + +Pass an error if the cookie cannot be stored. + +### `store.updateCookie(oldCookie, newCookie, cb(err))` + +Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store. + +The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock). Both `.creation` and `.creationIndex` are guaranteed to be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement). + +Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object. + +The `newCookie` and `oldCookie` objects MUST NOT be modified. + +Pass an error if the newCookie cannot be stored. + +### `store.removeCookie(domain, path, key, cb(err))` + +Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint). + +The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie. + +### `store.removeCookies(domain, path, cb(err))` + +Removes matching cookies from the store. The `path` parameter is optional, and if missing means all paths in a domain should be removed. + +Pass an error ONLY if removing any existing cookies failed. + +### `store.getAllCookies(cb(err, cookies))` + +Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure. + +Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms. See `compareCookies` for more detail. + +Pass an error if retrieval fails. + +## MemoryCookieStore + +Inherits from `Store`. + +A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API. + +## Community Cookie Stores + +These are some Store implementations authored and maintained by the community. They aren't official and we don't vouch for them but you may be interested to have a look: + +- [`db-cookie-store`](https://github.com/JSBizon/db-cookie-store): SQL including SQLite-based databases +- [`file-cookie-store`](https://github.com/JSBizon/file-cookie-store): Netscape cookie file format on disk +- [`redis-cookie-store`](https://github.com/benkroeger/redis-cookie-store): Redis +- [`tough-cookie-filestore`](https://github.com/mitsuru/tough-cookie-filestore): JSON on disk +- [`tough-cookie-web-storage-store`](https://github.com/exponentjs/tough-cookie-web-storage-store): DOM localStorage and sessionStorage + + +# Serialization Format + +**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`. + +```js + { + // The version of tough-cookie that serialized this jar. + version: 'tough-cookie@1.x.y', + + // add the store type, to make humans happy: + storeType: 'MemoryCookieStore', + + // CookieJar configuration: + rejectPublicSuffixes: true, + // ... future items go here + + // Gets filled from jar.store.getAllCookies(): + cookies: [ + { + key: 'string', + value: 'string', + // ... + /* other Cookie.serializableProperties go here */ + } + ] + } +``` + +# Copyright and License + +(tl;dr: BSD-3-Clause with some MPL/2.0) + +```text + Copyright (c) 2015, Salesforce.com, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of Salesforce.com 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 HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +``` diff --git a/node_modules/tough-cookie/lib/cookie.js b/node_modules/tough-cookie/lib/cookie.js new file mode 100644 index 0000000..039a0e7 --- /dev/null +++ b/node_modules/tough-cookie/lib/cookie.js @@ -0,0 +1,1431 @@ +/*! + * Copyright (c) 2015, Salesforce.com, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of Salesforce.com 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 HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; +var net = require('net'); +var urlParse = require('url').parse; +var util = require('util'); +var pubsuffix = require('./pubsuffix-psl'); +var Store = require('./store').Store; +var MemoryCookieStore = require('./memstore').MemoryCookieStore; +var pathMatch = require('./pathMatch').pathMatch; +var VERSION = require('../package.json').version; + +var punycode; +try { + punycode = require('punycode'); +} catch(e) { + console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization"); +} + +// From RFC6265 S4.1.1 +// note that it excludes \x3B ";" +var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; + +var CONTROL_CHARS = /[\x00-\x1F]/; + +// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in +// the "relaxed" mode, see: +// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60 +var TERMINATORS = ['\n', '\r', '\0']; + +// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' +// Note ';' is \x3B +var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; + +// date-time parsing constants (RFC6265 S5.1.1) + +var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; + +var MONTH_TO_NUM = { + jan:0, feb:1, mar:2, apr:3, may:4, jun:5, + jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 +}; +var NUM_TO_MONTH = [ + 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' +]; +var NUM_TO_DAY = [ + 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' +]; + +var MAX_TIME = 2147483647000; // 31-bit max +var MIN_TIME = 0; // 31-bit min + +/* + * Parses a Natural number (i.e., non-negative integer) with either the + * *DIGIT ( non-digit *OCTET ) + * or + * *DIGIT + * grammar (RFC6265 S5.1.1). + * + * The "trailingOK" boolean controls if the grammar accepts a + * "( non-digit *OCTET )" trailer. + */ +function parseDigits(token, minDigits, maxDigits, trailingOK) { + var count = 0; + while (count < token.length) { + var c = token.charCodeAt(count); + // "non-digit = %x00-2F / %x3A-FF" + if (c <= 0x2F || c >= 0x3A) { + break; + } + count++; + } + + // constrain to a minimum and maximum number of digits. + if (count < minDigits || count > maxDigits) { + return null; + } + + if (!trailingOK && count != token.length) { + return null; + } + + return parseInt(token.substr(0,count), 10); +} + +function parseTime(token) { + var parts = token.split(':'); + var result = [0,0,0]; + + /* RF6256 S5.1.1: + * time = hms-time ( non-digit *OCTET ) + * hms-time = time-field ":" time-field ":" time-field + * time-field = 1*2DIGIT + */ + + if (parts.length !== 3) { + return null; + } + + for (var i = 0; i < 3; i++) { + // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be + // followed by "( non-digit *OCTET )" so therefore the last time-field can + // have a trailer + var trailingOK = (i == 2); + var num = parseDigits(parts[i], 1, 2, trailingOK); + if (num === null) { + return null; + } + result[i] = num; + } + + return result; +} + +function parseMonth(token) { + token = String(token).substr(0,3).toLowerCase(); + var num = MONTH_TO_NUM[token]; + return num >= 0 ? num : null; +} + +/* + * RFC6265 S5.1.1 date parser (see RFC for full grammar) + */ +function parseDate(str) { + if (!str) { + return; + } + + /* RFC6265 S5.1.1: + * 2. Process each date-token sequentially in the order the date-tokens + * appear in the cookie-date + */ + var tokens = str.split(DATE_DELIM); + if (!tokens) { + return; + } + + var hour = null; + var minute = null; + var second = null; + var dayOfMonth = null; + var month = null; + var year = null; + + for (var i=0; i= 70 && year <= 99) { + year += 1900; + } else if (year >= 0 && year <= 69) { + year += 2000; + } + } + } + } + + /* RFC 6265 S5.1.1 + * "5. Abort these steps and fail to parse the cookie-date if: + * * at least one of the found-day-of-month, found-month, found- + * year, or found-time flags is not set, + * * the day-of-month-value is less than 1 or greater than 31, + * * the year-value is less than 1601, + * * the hour-value is greater than 23, + * * the minute-value is greater than 59, or + * * the second-value is greater than 59. + * (Note that leap seconds cannot be represented in this syntax.)" + * + * So, in order as above: + */ + if ( + dayOfMonth === null || month === null || year === null || second === null || + dayOfMonth < 1 || dayOfMonth > 31 || + year < 1601 || + hour > 23 || + minute > 59 || + second > 59 + ) { + return; + } + + return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); +} + +function formatDate(date) { + var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; + var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; + var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; + var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; + return NUM_TO_DAY[date.getUTCDay()] + ', ' + + d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ + h+':'+m+':'+s+' GMT'; +} + +// S5.1.2 Canonicalized Host Names +function canonicalDomain(str) { + if (str == null) { + return null; + } + str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . + + // convert to IDN if any non-ASCII characters + if (punycode && /[^\u0001-\u007f]/.test(str)) { + str = punycode.toASCII(str); + } + + return str.toLowerCase(); +} + +// S5.1.3 Domain Matching +function domainMatch(str, domStr, canonicalize) { + if (str == null || domStr == null) { + return null; + } + if (canonicalize !== false) { + str = canonicalDomain(str); + domStr = canonicalDomain(domStr); + } + + /* + * "The domain string and the string are identical. (Note that both the + * domain string and the string will have been canonicalized to lower case at + * this point)" + */ + if (str == domStr) { + return true; + } + + /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ + + /* "* The string is a host name (i.e., not an IP address)." */ + if (net.isIP(str)) { + return false; + } + + /* "* The domain string is a suffix of the string" */ + var idx = str.indexOf(domStr); + if (idx <= 0) { + return false; // it's a non-match (-1) or prefix (0) + } + + // e.g "a.b.c".indexOf("b.c") === 2 + // 5 === 3+2 + if (str.length !== domStr.length + idx) { // it's not a suffix + return false; + } + + /* "* The last character of the string that is not included in the domain + * string is a %x2E (".") character." */ + if (str.substr(idx-1,1) !== '.') { + return false; + } + + return true; +} + + +// RFC6265 S5.1.4 Paths and Path-Match + +/* + * "The user agent MUST use an algorithm equivalent to the following algorithm + * to compute the default-path of a cookie:" + * + * Assumption: the path (and not query part or absolute uri) is passed in. + */ +function defaultPath(path) { + // "2. If the uri-path is empty or if the first character of the uri-path is not + // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. + if (!path || path.substr(0,1) !== "/") { + return "/"; + } + + // "3. If the uri-path contains no more than one %x2F ("/") character, output + // %x2F ("/") and skip the remaining step." + if (path === "/") { + return path; + } + + var rightSlash = path.lastIndexOf("/"); + if (rightSlash === 0) { + return "/"; + } + + // "4. Output the characters of the uri-path from the first character up to, + // but not including, the right-most %x2F ("/")." + return path.slice(0, rightSlash); +} + +function trimTerminator(str) { + for (var t = 0; t < TERMINATORS.length; t++) { + var terminatorIdx = str.indexOf(TERMINATORS[t]); + if (terminatorIdx !== -1) { + str = str.substr(0,terminatorIdx); + } + } + + return str; +} + +function parseCookiePair(cookiePair, looseMode) { + cookiePair = trimTerminator(cookiePair); + + var firstEq = cookiePair.indexOf('='); + if (looseMode) { + if (firstEq === 0) { // '=' is immediately at start + cookiePair = cookiePair.substr(1); + firstEq = cookiePair.indexOf('='); // might still need to split on '=' + } + } else { // non-loose mode + if (firstEq <= 0) { // no '=' or is at start + return; // needs to have non-empty "cookie-name" + } + } + + var cookieName, cookieValue; + if (firstEq <= 0) { + cookieName = ""; + cookieValue = cookiePair.trim(); + } else { + cookieName = cookiePair.substr(0, firstEq).trim(); + cookieValue = cookiePair.substr(firstEq+1).trim(); + } + + if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { + return; + } + + var c = new Cookie(); + c.key = cookieName; + c.value = cookieValue; + return c; +} + +function parse(str, options) { + if (!options || typeof options !== 'object') { + options = {}; + } + str = str.trim(); + + // We use a regex to parse the "name-value-pair" part of S5.2 + var firstSemi = str.indexOf(';'); // S5.2 step 1 + var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi); + var c = parseCookiePair(cookiePair, !!options.loose); + if (!c) { + return; + } + + if (firstSemi === -1) { + return c; + } + + // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question)." plus later on in the same section + // "discard the first ";" and trim". + var unparsed = str.slice(firstSemi + 1).trim(); + + // "If the unparsed-attributes string is empty, skip the rest of these + // steps." + if (unparsed.length === 0) { + return c; + } + + /* + * S5.2 says that when looping over the items "[p]rocess the attribute-name + * and attribute-value according to the requirements in the following + * subsections" for every item. Plus, for many of the individual attributes + * in S5.3 it says to use the "attribute-value of the last attribute in the + * cookie-attribute-list". Therefore, in this implementation, we overwrite + * the previous value. + */ + var cookie_avs = unparsed.split(';'); + while (cookie_avs.length) { + var av = cookie_avs.shift().trim(); + if (av.length === 0) { // happens if ";;" appears + continue; + } + var av_sep = av.indexOf('='); + var av_key, av_value; + + if (av_sep === -1) { + av_key = av; + av_value = null; + } else { + av_key = av.substr(0,av_sep); + av_value = av.substr(av_sep+1); + } + + av_key = av_key.trim().toLowerCase(); + + if (av_value) { + av_value = av_value.trim(); + } + + switch(av_key) { + case 'expires': // S5.2.1 + if (av_value) { + var exp = parseDate(av_value); + // "If the attribute-value failed to parse as a cookie date, ignore the + // cookie-av." + if (exp) { + // over and underflow not realistically a concern: V8's getTime() seems to + // store something larger than a 32-bit time_t (even with 32-bit node) + c.expires = exp; + } + } + break; + + case 'max-age': // S5.2.2 + if (av_value) { + // "If the first character of the attribute-value is not a DIGIT or a "-" + // character ...[or]... If the remainder of attribute-value contains a + // non-DIGIT character, ignore the cookie-av." + if (/^-?[0-9]+$/.test(av_value)) { + var delta = parseInt(av_value, 10); + // "If delta-seconds is less than or equal to zero (0), let expiry-time + // be the earliest representable date and time." + c.setMaxAge(delta); + } + } + break; + + case 'domain': // S5.2.3 + // "If the attribute-value is empty, the behavior is undefined. However, + // the user agent SHOULD ignore the cookie-av entirely." + if (av_value) { + // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E + // (".") character." + var domain = av_value.trim().replace(/^\./, ''); + if (domain) { + // "Convert the cookie-domain to lower case." + c.domain = domain.toLowerCase(); + } + } + break; + + case 'path': // S5.2.4 + /* + * "If the attribute-value is empty or if the first character of the + * attribute-value is not %x2F ("/"): + * Let cookie-path be the default-path. + * Otherwise: + * Let cookie-path be the attribute-value." + * + * We'll represent the default-path as null since it depends on the + * context of the parsing. + */ + c.path = av_value && av_value[0] === "/" ? av_value : null; + break; + + case 'secure': // S5.2.5 + /* + * "If the attribute-name case-insensitively matches the string "Secure", + * the user agent MUST append an attribute to the cookie-attribute-list + * with an attribute-name of Secure and an empty attribute-value." + */ + c.secure = true; + break; + + case 'httponly': // S5.2.6 -- effectively the same as 'secure' + c.httpOnly = true; + break; + + default: + c.extensions = c.extensions || []; + c.extensions.push(av); + break; + } + } + + return c; +} + +// avoid the V8 deoptimization monster! +function jsonParse(str) { + var obj; + try { + obj = JSON.parse(str); + } catch (e) { + return e; + } + return obj; +} + +function fromJSON(str) { + if (!str) { + return null; + } + + var obj; + if (typeof str === 'string') { + obj = jsonParse(str); + if (obj instanceof Error) { + return null; + } + } else { + // assume it's an Object + obj = str; + } + + var c = new Cookie(); + for (var i=0; i 1) { + var lindex = path.lastIndexOf('/'); + if (lindex === 0) { + break; + } + path = path.substr(0,lindex); + permutations.push(path); + } + permutations.push('/'); + return permutations; +} + +function getCookieContext(url) { + if (url instanceof Object) { + return url; + } + // NOTE: decodeURI will throw on malformed URIs (see GH-32). + // Therefore, we will just skip decoding for such URIs. + try { + url = decodeURI(url); + } + catch(err) { + // Silently swallow error + } + + return urlParse(url); +} + +function Cookie(options) { + options = options || {}; + + Object.keys(options).forEach(function(prop) { + if (Cookie.prototype.hasOwnProperty(prop) && + Cookie.prototype[prop] !== options[prop] && + prop.substr(0,1) !== '_') + { + this[prop] = options[prop]; + } + }, this); + + this.creation = this.creation || new Date(); + + // used to break creation ties in cookieCompare(): + Object.defineProperty(this, 'creationIndex', { + configurable: false, + enumerable: false, // important for assert.deepEqual checks + writable: true, + value: ++Cookie.cookiesCreated + }); +} + +Cookie.cookiesCreated = 0; // incremented each time a cookie is created + +Cookie.parse = parse; +Cookie.fromJSON = fromJSON; + +Cookie.prototype.key = ""; +Cookie.prototype.value = ""; + +// the order in which the RFC has them: +Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity +Cookie.prototype.maxAge = null; // takes precedence over expires for TTL +Cookie.prototype.domain = null; +Cookie.prototype.path = null; +Cookie.prototype.secure = false; +Cookie.prototype.httpOnly = false; +Cookie.prototype.extensions = null; + +// set by the CookieJar: +Cookie.prototype.hostOnly = null; // boolean when set +Cookie.prototype.pathIsDefault = null; // boolean when set +Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse +Cookie.prototype.lastAccessed = null; // Date when set +Object.defineProperty(Cookie.prototype, 'creationIndex', { + configurable: true, + enumerable: false, + writable: true, + value: 0 +}); + +Cookie.serializableProperties = Object.keys(Cookie.prototype) + .filter(function(prop) { + return !( + Cookie.prototype[prop] instanceof Function || + prop === 'creationIndex' || + prop.substr(0,1) === '_' + ); + }); + +Cookie.prototype.inspect = function inspect() { + var now = Date.now(); + return 'Cookie="'+this.toString() + + '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + + '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + + '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + + '"'; +}; + +// Use the new custom inspection symbol to add the custom inspect function if +// available. +if (util.inspect.custom) { + Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect; +} + +Cookie.prototype.toJSON = function() { + var obj = {}; + + var props = Cookie.serializableProperties; + for (var i=0; i + +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/tough-cookie/node_modules/punycode/README.md b/node_modules/tough-cookie/node_modules/punycode/README.md new file mode 100644 index 0000000..7ad7d1f --- /dev/null +++ b/node_modules/tough-cookie/node_modules/punycode/README.md @@ -0,0 +1,176 @@ +# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/coveralls/bestiejs/punycode.js/master.svg)](https://coveralls.io/r/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js) + +A robust Punycode converter that fully complies to [RFC 3492](https://tools.ietf.org/html/rfc3492) and [RFC 5891](https://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms. + +This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm: + +* [The C example code from RFC 3492](https://tools.ietf.org/html/rfc3492#appendix-C) +* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c) +* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c) +* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287) +* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072)) + +This project is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc) and [io.js v1.0.0+](https://github.com/iojs/io.js/blob/v1.x/lib/punycode.js). + +## Installation + +Via [npm](https://www.npmjs.com/) (only required for Node.js releases older than v0.6.2): + +```bash +npm install punycode +``` + +Via [Bower](http://bower.io/): + +```bash +bower install punycode +``` + +Via [Component](https://github.com/component/component): + +```bash +component install bestiejs/punycode.js +``` + +In a browser: + +```html + +``` + +In [Node.js](https://nodejs.org/), [io.js](https://iojs.org/), [Narwhal](http://narwhaljs.org/), and [RingoJS](http://ringojs.org/): + +```js +var punycode = require('punycode'); +``` + +In [Rhino](http://www.mozilla.org/rhino/): + +```js +load('punycode.js'); +``` + +Using an AMD loader like [RequireJS](http://requirejs.org/): + +```js +require( + { + 'paths': { + 'punycode': 'path/to/punycode' + } + }, + ['punycode'], + function(punycode) { + console.log(punycode); + } +); +``` + +## API + +### `punycode.decode(string)` + +Converts a Punycode string of ASCII symbols to a string of Unicode symbols. + +```js +// decode domain name parts +punycode.decode('maana-pta'); // 'mañana' +punycode.decode('--dqo34k'); // '☃-⌘' +``` + +### `punycode.encode(string)` + +Converts a string of Unicode symbols to a Punycode string of ASCII symbols. + +```js +// encode domain name parts +punycode.encode('mañana'); // 'maana-pta' +punycode.encode('☃-⌘'); // '--dqo34k' +``` + +### `punycode.toUnicode(input)` + +Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode. + +```js +// decode domain names +punycode.toUnicode('xn--maana-pta.com'); +// → 'mañana.com' +punycode.toUnicode('xn----dqo34k.com'); +// → '☃-⌘.com' + +// decode email addresses +punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'); +// → 'джумла@джpумлатест.bрфa' +``` + +### `punycode.toASCII(input)` + +Converts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII. + +```js +// encode domain names +punycode.toASCII('mañana.com'); +// → 'xn--maana-pta.com' +punycode.toASCII('☃-⌘.com'); +// → 'xn----dqo34k.com' + +// encode email addresses +punycode.toASCII('джумла@джpумлатест.bрфa'); +// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq' +``` + +### `punycode.ucs2` + +#### `punycode.ucs2.decode(string)` + +Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16. + +```js +punycode.ucs2.decode('abc'); +// → [0x61, 0x62, 0x63] +// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE: +punycode.ucs2.decode('\uD834\uDF06'); +// → [0x1D306] +``` + +#### `punycode.ucs2.encode(codePoints)` + +Creates a string based on an array of numeric code point values. + +```js +punycode.ucs2.encode([0x61, 0x62, 0x63]); +// → 'abc' +punycode.ucs2.encode([0x1D306]); +// → '\uD834\uDF06' +``` + +### `punycode.version` + +A string representing the current Punycode.js version number. + +## Unit tests & code coverage + +After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`. + +Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`. + +To generate the code coverage report, use `grunt cover`. + +Feel free to fork if you see possible improvements! + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](https://mathiasbynens.be/) | + +## Contributors + +| [![twitter/jdalton](https://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") | +|---| +| [John-David Dalton](http://allyoucanleet.com/) | + +## License + +Punycode.js is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/tough-cookie/node_modules/punycode/package.json b/node_modules/tough-cookie/node_modules/punycode/package.json new file mode 100644 index 0000000..82ae41e --- /dev/null +++ b/node_modules/tough-cookie/node_modules/punycode/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "punycode@1.4.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "punycode@1.4.1", + "_id": "punycode@1.4.1", + "_inBundle": false, + "_integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "_location": "/tough-cookie/punycode", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "punycode@1.4.1", + "name": "punycode", + "escapedName": "punycode", + "rawSpec": "1.4.1", + "saveSpec": null, + "fetchSpec": "1.4.1" + }, + "_requiredBy": [ + "/tough-cookie" + ], + "_resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "_spec": "1.4.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + }, + "bugs": { + "url": "https://github.com/bestiejs/punycode.js/issues" + }, + "contributors": [ + { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + }, + { + "name": "John-David Dalton", + "url": "http://allyoucanleet.com/" + } + ], + "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", + "devDependencies": { + "coveralls": "^2.11.4", + "grunt": "^0.4.5", + "grunt-contrib-uglify": "^0.11.0", + "grunt-shell": "^1.1.2", + "istanbul": "^0.4.1", + "qunit-extras": "^1.4.4", + "qunitjs": "~1.11.0", + "requirejs": "^2.1.22" + }, + "files": [ + "LICENSE-MIT.txt", + "punycode.js" + ], + "homepage": "https://mths.be/punycode", + "jspm": { + "map": { + "./punycode.js": { + "node": "@node/punycode" + } + } + }, + "keywords": [ + "punycode", + "unicode", + "idn", + "idna", + "dns", + "url", + "domain" + ], + "license": "MIT", + "main": "punycode.js", + "name": "punycode", + "repository": { + "type": "git", + "url": "git+https://github.com/bestiejs/punycode.js.git" + }, + "scripts": { + "test": "node tests/tests.js" + }, + "version": "1.4.1" +} diff --git a/node_modules/tough-cookie/node_modules/punycode/punycode.js b/node_modules/tough-cookie/node_modules/punycode/punycode.js new file mode 100644 index 0000000..2c87f6c --- /dev/null +++ b/node_modules/tough-cookie/node_modules/punycode/punycode.js @@ -0,0 +1,533 @@ +/*! https://mths.be/punycode v1.4.1 by @mathias */ +;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.4.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { + // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); diff --git a/node_modules/tough-cookie/package.json b/node_modules/tough-cookie/package.json new file mode 100644 index 0000000..f460802 --- /dev/null +++ b/node_modules/tough-cookie/package.json @@ -0,0 +1,97 @@ +{ + "_args": [ + [ + "tough-cookie@2.4.3", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "tough-cookie@2.4.3", + "_id": "tough-cookie@2.4.3", + "_inBundle": false, + "_integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "_location": "/tough-cookie", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "tough-cookie@2.4.3", + "name": "tough-cookie", + "escapedName": "tough-cookie", + "rawSpec": "2.4.3", + "saveSpec": null, + "fetchSpec": "2.4.3" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "_spec": "2.4.3", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jeremy Stashewsky", + "email": "jstash@gmail.com" + }, + "bugs": { + "url": "https://github.com/salesforce/tough-cookie/issues" + }, + "contributors": [ + { + "name": "Alexander Savin" + }, + { + "name": "Ian Livingstone" + }, + { + "name": "Ivan Nikulin" + }, + { + "name": "Lalit Kapoor" + }, + { + "name": "Sam Thompson" + }, + { + "name": "Sebastian Mayr" + } + ], + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "description": "RFC6265 Cookies and Cookie Jar for node.js", + "devDependencies": { + "async": "^1.4.2", + "nyc": "^11.6.0", + "string.prototype.repeat": "^0.2.0", + "vows": "^0.8.1" + }, + "engines": { + "node": ">=0.8" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/salesforce/tough-cookie", + "keywords": [ + "HTTP", + "cookie", + "cookies", + "set-cookie", + "cookiejar", + "jar", + "RFC6265", + "RFC2965" + ], + "license": "BSD-3-Clause", + "main": "./lib/cookie", + "name": "tough-cookie", + "repository": { + "type": "git", + "url": "git://github.com/salesforce/tough-cookie.git" + }, + "scripts": { + "cover": "nyc --reporter=lcov --reporter=html vows test/*_test.js", + "test": "vows test/*_test.js" + }, + "version": "2.4.3" +} diff --git a/node_modules/tunnel-agent/LICENSE b/node_modules/tunnel-agent/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/tunnel-agent/LICENSE @@ -0,0 +1,55 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +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 + +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 \ No newline at end of file diff --git a/node_modules/tunnel-agent/README.md b/node_modules/tunnel-agent/README.md new file mode 100644 index 0000000..bb533d5 --- /dev/null +++ b/node_modules/tunnel-agent/README.md @@ -0,0 +1,4 @@ +tunnel-agent +============ + +HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module. diff --git a/node_modules/tunnel-agent/index.js b/node_modules/tunnel-agent/index.js new file mode 100644 index 0000000..3ee9abc --- /dev/null +++ b/node_modules/tunnel-agent/index.js @@ -0,0 +1,244 @@ +'use strict' + +var net = require('net') + , tls = require('tls') + , http = require('http') + , https = require('https') + , events = require('events') + , assert = require('assert') + , util = require('util') + , Buffer = require('safe-buffer').Buffer + ; + +exports.httpOverHttp = httpOverHttp +exports.httpsOverHttp = httpsOverHttp +exports.httpOverHttps = httpOverHttps +exports.httpsOverHttps = httpsOverHttps + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + return agent +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + agent.createSocket = createSecureSocket + agent.defaultPort = 443 + return agent +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + return agent +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + agent.createSocket = createSecureSocket + agent.defaultPort = 443 + return agent +} + + +function TunnelingAgent(options) { + var self = this + self.options = options || {} + self.proxyOptions = self.options.proxy || {} + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets + self.requests = [] + self.sockets = [] + + self.on('free', function onFree(socket, host, port) { + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i] + if (pending.host === host && pending.port === port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1) + pending.request.onSocket(socket) + return + } + } + socket.destroy() + self.removeSocket(socket) + }) +} +util.inherits(TunnelingAgent, events.EventEmitter) + +TunnelingAgent.prototype.addRequest = function addRequest(req, options) { + var self = this + + // Legacy API: addRequest(req, host, port, path) + if (typeof options === 'string') { + options = { + host: options, + port: arguments[2], + path: arguments[3] + }; + } + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push({host: options.host, port: options.port, request: req}) + return + } + + // If we are under maxSockets create a new one. + self.createConnection({host: options.host, port: options.port, request: req}) +} + +TunnelingAgent.prototype.createConnection = function createConnection(pending) { + var self = this + + self.createSocket(pending, function(socket) { + socket.on('free', onFree) + socket.on('close', onCloseOrRemove) + socket.on('agentRemove', onCloseOrRemove) + pending.request.onSocket(socket) + + function onFree() { + self.emit('free', socket, pending.host, pending.port) + } + + function onCloseOrRemove(err) { + self.removeSocket(socket) + socket.removeListener('free', onFree) + socket.removeListener('close', onCloseOrRemove) + socket.removeListener('agentRemove', onCloseOrRemove) + } + }) +} + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this + var placeholder = {} + self.sockets.push(placeholder) + + var connectOptions = mergeOptions({}, self.proxyOptions, + { method: 'CONNECT' + , path: options.host + ':' + options.port + , agent: false + } + ) + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {} + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + Buffer.from(connectOptions.proxyAuth).toString('base64') + } + + debug('making CONNECT request') + var connectReq = self.request(connectOptions) + connectReq.useChunkedEncodingByDefault = false // for v0.6 + connectReq.once('response', onResponse) // for v0.6 + connectReq.once('upgrade', onUpgrade) // for v0.6 + connectReq.once('connect', onConnect) // for v0.7 or later + connectReq.once('error', onError) + connectReq.end() + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head) + }) + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners() + socket.removeAllListeners() + + if (res.statusCode === 200) { + assert.equal(head.length, 0) + debug('tunneling connection has established') + self.sockets[self.sockets.indexOf(placeholder)] = socket + cb(socket) + } else { + debug('tunneling socket could not be established, statusCode=%d', res.statusCode) + var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } + } + + function onError(cause) { + connectReq.removeAllListeners() + + debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) + var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } +} + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) return + + this.sockets.splice(pos, 1) + + var pending = this.requests.shift() + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createConnection(pending) + } +} + +function createSecureSocket(options, cb) { + var self = this + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, mergeOptions({}, self.options, + { servername: options.host + , socket: socket + } + )) + self.sockets[self.sockets.indexOf(socket)] = secureSocket + cb(secureSocket) + }) +} + + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i] + if (typeof overrides === 'object') { + var keys = Object.keys(overrides) + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j] + if (overrides[k] !== undefined) { + target[k] = overrides[k] + } + } + } + } + return target +} + + +var debug +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments) + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0] + } else { + args.unshift('TUNNEL:') + } + console.error.apply(console, args) + } +} else { + debug = function() {} +} +exports.debug = debug // for test diff --git a/node_modules/tunnel-agent/package.json b/node_modules/tunnel-agent/package.json new file mode 100644 index 0000000..988ad94 --- /dev/null +++ b/node_modules/tunnel-agent/package.json @@ -0,0 +1,58 @@ +{ + "_args": [ + [ + "tunnel-agent@0.6.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "tunnel-agent@0.6.0", + "_id": "tunnel-agent@0.6.0", + "_inBundle": false, + "_integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "_location": "/tunnel-agent", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "tunnel-agent@0.6.0", + "name": "tunnel-agent", + "escapedName": "tunnel-agent", + "rawSpec": "0.6.0", + "saveSpec": null, + "fetchSpec": "0.6.0" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "_spec": "0.6.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "bugs": { + "url": "https://github.com/mikeal/tunnel-agent/issues" + }, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.", + "devDependencies": {}, + "engines": { + "node": "*" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/mikeal/tunnel-agent#readme", + "license": "Apache-2.0", + "main": "index.js", + "name": "tunnel-agent", + "optionalDependencies": {}, + "repository": { + "url": "git+https://github.com/mikeal/tunnel-agent.git" + }, + "version": "0.6.0" +} diff --git a/node_modules/tweetnacl/.npmignore b/node_modules/tweetnacl/.npmignore new file mode 100644 index 0000000..7d98dcb --- /dev/null +++ b/node_modules/tweetnacl/.npmignore @@ -0,0 +1,4 @@ +.eslintrc +.travis.yml +bower.json +test diff --git a/node_modules/tweetnacl/AUTHORS.md b/node_modules/tweetnacl/AUTHORS.md new file mode 100644 index 0000000..6d74d40 --- /dev/null +++ b/node_modules/tweetnacl/AUTHORS.md @@ -0,0 +1,28 @@ +List of TweetNaCl.js authors +============================ + + Alphabetical order by first name. + Format: Name (GitHub username or URL) + +* AndSDev (@AndSDev) +* Devi Mandiri (@devi) +* Dmitry Chestnykh (@dchest) + +List of authors of third-party public domain code from which TweetNaCl.js code was derived +========================================================================================== + +[TweetNaCl](http://tweetnacl.cr.yp.to/) +-------------------------------------- + +* Bernard van Gastel +* Daniel J. Bernstein +* Peter Schwabe +* Sjaak Smetsers +* Tanja Lange +* Wesley Janssen + + +[Poly1305-donna](https://github.com/floodyberry/poly1305-donna) +-------------------------------------------------------------- + +* Andrew Moon (@floodyberry) diff --git a/node_modules/tweetnacl/CHANGELOG.md b/node_modules/tweetnacl/CHANGELOG.md new file mode 100644 index 0000000..92a4fdc --- /dev/null +++ b/node_modules/tweetnacl/CHANGELOG.md @@ -0,0 +1,221 @@ +TweetNaCl.js Changelog +====================== + + +v0.14.5 +------- + +* Fixed incomplete return types in TypeScript typings. +* Replaced COPYING.txt with LICENSE file, which now has public domain dedication + text from The Unlicense. License fields in package.json and bower.json have + been set to "Unlicense". The project was and will be in the public domain -- + this change just makes it easier for automated tools to know about this fact by + using the widely recognized and SPDX-compatible template for public domain + dedication. + + +v0.14.4 +------- + +* Added TypeScript type definitions (contributed by @AndSDev). +* Improved benchmarking code. + + +v0.14.3 +------- + +Fixed a bug in the fast version of Poly1305 and brought it back. + +Thanks to @floodyberry for promptly responding and fixing the original C code: + +> "The issue was not properly detecting if st->h was >= 2^130 - 5, coupled with +> [testing mistake] not catching the failure. The chance of the bug affecting +> anything in the real world is essentially zero luckily, but it's good to have +> it fixed." + +https://github.com/floodyberry/poly1305-donna/issues/2#issuecomment-202698577 + + +v0.14.2 +------- + +Switched Poly1305 fast version back to original (slow) version due to a bug. + + +v0.14.1 +------- + +No code changes, just tweaked packaging and added COPYING.txt. + + +v0.14.0 +------- + +* **Breaking change!** All functions from `nacl.util` have been removed. These + functions are no longer available: + + nacl.util.decodeUTF8 + nacl.util.encodeUTF8 + nacl.util.decodeBase64 + nacl.util.encodeBase64 + + If want to continue using them, you can include + package: + + + + + or + + var nacl = require('tweetnacl'); + nacl.util = require('tweetnacl-util'); + + However it is recommended to use better packages that have wider + compatibility and better performance. Functions from `nacl.util` were never + intended to be robust solution for string conversion and were included for + convenience: cryptography library is not the right place for them. + + Currently calling these functions will throw error pointing to + `tweetnacl-util-js` (in the next version this error message will be removed). + +* Improved detection of available random number generators, making it possible + to use `nacl.randomBytes` and related functions in Web Workers without + changes. + +* Changes to testing (see README). + + +v0.13.3 +------- + +No code changes. + +* Reverted license field in package.json to "Public domain". + +* Fixed typo in README. + + +v0.13.2 +------- + +* Fixed undefined variable bug in fast version of Poly1305. No worries, this + bug was *never* triggered. + +* Specified CC0 public domain dedication. + +* Updated development dependencies. + + +v0.13.1 +------- + +* Exclude `crypto` and `buffer` modules from browserify builds. + + +v0.13.0 +------- + +* Made `nacl-fast` the default version in NPM package. Now + `require("tweetnacl")` will use fast version; to get the original version, + use `require("tweetnacl/nacl.js")`. + +* Cleanup temporary array after generating random bytes. + + +v0.12.2 +------- + +* Improved performance of curve operations, making `nacl.scalarMult`, `nacl.box`, + `nacl.sign` and related functions up to 3x faster in `nacl-fast` version. + + +v0.12.1 +------- + +* Significantly improved performance of Salsa20 (~1.5x faster) and + Poly1305 (~3.5x faster) in `nacl-fast` version. + + +v0.12.0 +------- + +* Instead of using the given secret key directly, TweetNaCl.js now copies it to + a new array in `nacl.box.keyPair.fromSecretKey` and + `nacl.sign.keyPair.fromSecretKey`. + + +v0.11.2 +------- + +* Added new constant: `nacl.sign.seedLength`. + + +v0.11.1 +------- + +* Even faster hash for both short and long inputs (in `nacl-fast`). + + +v0.11.0 +------- + +* Implement `nacl.sign.keyPair.fromSeed` to enable creation of sign key pairs + deterministically from a 32-byte seed. (It behaves like + [libsodium's](http://doc.libsodium.org/public-key_cryptography/public-key_signatures.html) + `crypto_sign_seed_keypair`: the seed becomes a secret part of the secret key.) + +* Fast version now has an improved hash implementation that is 2x-5x faster. + +* Fixed benchmarks, which may have produced incorrect measurements. + + +v0.10.1 +------- + +* Exported undocumented `nacl.lowlevel.crypto_core_hsalsa20`. + + +v0.10.0 +------- + +* **Signature API breaking change!** `nacl.sign` and `nacl.sign.open` now deal + with signed messages, and new `nacl.sign.detached` and + `nacl.sign.detached.verify` are available. + + Previously, `nacl.sign` returned a signature, and `nacl.sign.open` accepted a + message and "detached" signature. This was unlike NaCl's API, which dealt with + signed messages (concatenation of signature and message). + + The new API is: + + nacl.sign(message, secretKey) -> signedMessage + nacl.sign.open(signedMessage, publicKey) -> message | null + + Since detached signatures are common, two new API functions were introduced: + + nacl.sign.detached(message, secretKey) -> signature + nacl.sign.detached.verify(message, signature, publicKey) -> true | false + + (Note that it's `verify`, not `open`, and it returns a boolean value, unlike + `open`, which returns an "unsigned" message.) + +* NPM package now comes without `test` directory to keep it small. + + +v0.9.2 +------ + +* Improved documentation. +* Fast version: increased theoretical message size limit from 2^32-1 to 2^52 + bytes in Poly1305 (and thus, secretbox and box). However this has no impact + in practice since JavaScript arrays or ArrayBuffers are limited to 32-bit + indexes, and most implementations won't allocate more than a gigabyte or so. + (Obviously, there are no tests for the correctness of implementation.) Also, + it's not recommended to use messages that large without splitting them into + smaller packets anyway. + + +v0.9.1 +------ + +* Initial release diff --git a/node_modules/tweetnacl/LICENSE b/node_modules/tweetnacl/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/node_modules/tweetnacl/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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. + +For more information, please refer to diff --git a/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md b/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a8eb4a9 --- /dev/null +++ b/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,20 @@ +# Important! + +If your contribution is not trivial (not a typo fix, etc.), we can only accept +it if you dedicate your copyright for the contribution to the public domain. +Make sure you understand what it means (see http://unlicense.org/)! If you +agree, please add yourself to AUTHORS.md file, and include the following text +to your pull request description or a comment in it: + +------------------------------------------------------------------------------ + + I dedicate any and all copyright interest in this software to the + public domain. I make this dedication for the benefit of the public at + large and to the detriment of my heirs and successors. I intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. diff --git a/node_modules/tweetnacl/README.md b/node_modules/tweetnacl/README.md new file mode 100644 index 0000000..ffb6871 --- /dev/null +++ b/node_modules/tweetnacl/README.md @@ -0,0 +1,459 @@ +TweetNaCl.js +============ + +Port of [TweetNaCl](http://tweetnacl.cr.yp.to) / [NaCl](http://nacl.cr.yp.to/) +to JavaScript for modern browsers and Node.js. Public domain. + +[![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master) +](https://travis-ci.org/dchest/tweetnacl-js) + +Demo: + +**:warning: The library is stable and API is frozen, however it has not been +independently reviewed. If you can help reviewing it, please [contact +me](mailto:dmitry@codingrobots.com).** + +Documentation +============= + +* [Overview](#overview) +* [Installation](#installation) +* [Usage](#usage) + * [Public-key authenticated encryption (box)](#public-key-authenticated-encryption-box) + * [Secret-key authenticated encryption (secretbox)](#secret-key-authenticated-encryption-secretbox) + * [Scalar multiplication](#scalar-multiplication) + * [Signatures](#signatures) + * [Hashing](#hashing) + * [Random bytes generation](#random-bytes-generation) + * [Constant-time comparison](#constant-time-comparison) +* [System requirements](#system-requirements) +* [Development and testing](#development-and-testing) +* [Benchmarks](#benchmarks) +* [Contributors](#contributors) +* [Who uses it](#who-uses-it) + + +Overview +-------- + +The primary goal of this project is to produce a translation of TweetNaCl to +JavaScript which is as close as possible to the original C implementation, plus +a thin layer of idiomatic high-level API on top of it. + +There are two versions, you can use either of them: + +* `nacl.js` is the port of TweetNaCl with minimum differences from the + original + high-level API. + +* `nacl-fast.js` is like `nacl.js`, but with some functions replaced with + faster versions. + + +Installation +------------ + +You can install TweetNaCl.js via a package manager: + +[Bower](http://bower.io): + + $ bower install tweetnacl + +[NPM](https://www.npmjs.org/): + + $ npm install tweetnacl + +or [download source code](https://github.com/dchest/tweetnacl-js/releases). + + +Usage +----- + +All API functions accept and return bytes as `Uint8Array`s. If you need to +encode or decode strings, use functions from + or one of the more robust codec +packages. + +In Node.js v4 and later `Buffer` objects are backed by `Uint8Array`s, so you +can freely pass them to TweetNaCl.js functions as arguments. The returned +objects are still `Uint8Array`s, so if you need `Buffer`s, you'll have to +convert them manually; make sure to convert using copying: `new Buffer(array)`, +instead of sharing: `new Buffer(array.buffer)`, because some functions return +subarrays of their buffers. + + +### Public-key authenticated encryption (box) + +Implements *curve25519-xsalsa20-poly1305*. + +#### nacl.box.keyPair() + +Generates a new random key pair for box and returns it as an object with +`publicKey` and `secretKey` members: + + { + publicKey: ..., // Uint8Array with 32-byte public key + secretKey: ... // Uint8Array with 32-byte secret key + } + + +#### nacl.box.keyPair.fromSecretKey(secretKey) + +Returns a key pair for box with public key corresponding to the given secret +key. + +#### nacl.box(message, nonce, theirPublicKey, mySecretKey) + +Encrypt and authenticates message using peer's public key, our secret key, and +the given nonce, which must be unique for each distinct message for a key pair. + +Returns an encrypted and authenticated message, which is +`nacl.box.overheadLength` longer than the original message. + +#### nacl.box.open(box, nonce, theirPublicKey, mySecretKey) + +Authenticates and decrypts the given box with peer's public key, our secret +key, and the given nonce. + +Returns the original message, or `false` if authentication fails. + +#### nacl.box.before(theirPublicKey, mySecretKey) + +Returns a precomputed shared key which can be used in `nacl.box.after` and +`nacl.box.open.after`. + +#### nacl.box.after(message, nonce, sharedKey) + +Same as `nacl.box`, but uses a shared key precomputed with `nacl.box.before`. + +#### nacl.box.open.after(box, nonce, sharedKey) + +Same as `nacl.box.open`, but uses a shared key precomputed with `nacl.box.before`. + +#### nacl.box.publicKeyLength = 32 + +Length of public key in bytes. + +#### nacl.box.secretKeyLength = 32 + +Length of secret key in bytes. + +#### nacl.box.sharedKeyLength = 32 + +Length of precomputed shared key in bytes. + +#### nacl.box.nonceLength = 24 + +Length of nonce in bytes. + +#### nacl.box.overheadLength = 16 + +Length of overhead added to box compared to original message. + + +### Secret-key authenticated encryption (secretbox) + +Implements *xsalsa20-poly1305*. + +#### nacl.secretbox(message, nonce, key) + +Encrypt and authenticates message using the key and the nonce. The nonce must +be unique for each distinct message for this key. + +Returns an encrypted and authenticated message, which is +`nacl.secretbox.overheadLength` longer than the original message. + +#### nacl.secretbox.open(box, nonce, key) + +Authenticates and decrypts the given secret box using the key and the nonce. + +Returns the original message, or `false` if authentication fails. + +#### nacl.secretbox.keyLength = 32 + +Length of key in bytes. + +#### nacl.secretbox.nonceLength = 24 + +Length of nonce in bytes. + +#### nacl.secretbox.overheadLength = 16 + +Length of overhead added to secret box compared to original message. + + +### Scalar multiplication + +Implements *curve25519*. + +#### nacl.scalarMult(n, p) + +Multiplies an integer `n` by a group element `p` and returns the resulting +group element. + +#### nacl.scalarMult.base(n) + +Multiplies an integer `n` by a standard group element and returns the resulting +group element. + +#### nacl.scalarMult.scalarLength = 32 + +Length of scalar in bytes. + +#### nacl.scalarMult.groupElementLength = 32 + +Length of group element in bytes. + + +### Signatures + +Implements [ed25519](http://ed25519.cr.yp.to). + +#### nacl.sign.keyPair() + +Generates new random key pair for signing and returns it as an object with +`publicKey` and `secretKey` members: + + { + publicKey: ..., // Uint8Array with 32-byte public key + secretKey: ... // Uint8Array with 64-byte secret key + } + +#### nacl.sign.keyPair.fromSecretKey(secretKey) + +Returns a signing key pair with public key corresponding to the given +64-byte secret key. The secret key must have been generated by +`nacl.sign.keyPair` or `nacl.sign.keyPair.fromSeed`. + +#### nacl.sign.keyPair.fromSeed(seed) + +Returns a new signing key pair generated deterministically from a 32-byte seed. +The seed must contain enough entropy to be secure. This method is not +recommended for general use: instead, use `nacl.sign.keyPair` to generate a new +key pair from a random seed. + +#### nacl.sign(message, secretKey) + +Signs the message using the secret key and returns a signed message. + +#### nacl.sign.open(signedMessage, publicKey) + +Verifies the signed message and returns the message without signature. + +Returns `null` if verification failed. + +#### nacl.sign.detached(message, secretKey) + +Signs the message using the secret key and returns a signature. + +#### nacl.sign.detached.verify(message, signature, publicKey) + +Verifies the signature for the message and returns `true` if verification +succeeded or `false` if it failed. + +#### nacl.sign.publicKeyLength = 32 + +Length of signing public key in bytes. + +#### nacl.sign.secretKeyLength = 64 + +Length of signing secret key in bytes. + +#### nacl.sign.seedLength = 32 + +Length of seed for `nacl.sign.keyPair.fromSeed` in bytes. + +#### nacl.sign.signatureLength = 64 + +Length of signature in bytes. + + +### Hashing + +Implements *SHA-512*. + +#### nacl.hash(message) + +Returns SHA-512 hash of the message. + +#### nacl.hash.hashLength = 64 + +Length of hash in bytes. + + +### Random bytes generation + +#### nacl.randomBytes(length) + +Returns a `Uint8Array` of the given length containing random bytes of +cryptographic quality. + +**Implementation note** + +TweetNaCl.js uses the following methods to generate random bytes, +depending on the platform it runs on: + +* `window.crypto.getRandomValues` (WebCrypto standard) +* `window.msCrypto.getRandomValues` (Internet Explorer 11) +* `crypto.randomBytes` (Node.js) + +If the platform doesn't provide a suitable PRNG, the following functions, +which require random numbers, will throw exception: + +* `nacl.randomBytes` +* `nacl.box.keyPair` +* `nacl.sign.keyPair` + +Other functions are deterministic and will continue working. + +If a platform you are targeting doesn't implement secure random number +generator, but you somehow have a cryptographically-strong source of entropy +(not `Math.random`!), and you know what you are doing, you can plug it into +TweetNaCl.js like this: + + nacl.setPRNG(function(x, n) { + // ... copy n random bytes into x ... + }); + +Note that `nacl.setPRNG` *completely replaces* internal random byte generator +with the one provided. + + +### Constant-time comparison + +#### nacl.verify(x, y) + +Compares `x` and `y` in constant time and returns `true` if their lengths are +non-zero and equal, and their contents are equal. + +Returns `false` if either of the arguments has zero length, or arguments have +different lengths, or their contents differ. + + +System requirements +------------------- + +TweetNaCl.js supports modern browsers that have a cryptographically secure +pseudorandom number generator and typed arrays, including the latest versions +of: + +* Chrome +* Firefox +* Safari (Mac, iOS) +* Internet Explorer 11 + +Other systems: + +* Node.js + + +Development and testing +------------------------ + +Install NPM modules needed for development: + + $ npm install + +To build minified versions: + + $ npm run build + +Tests use minified version, so make sure to rebuild it every time you change +`nacl.js` or `nacl-fast.js`. + +### Testing + +To run tests in Node.js: + + $ npm run test-node + +By default all tests described here work on `nacl.min.js`. To test other +versions, set environment variable `NACL_SRC` to the file name you want to test. +For example, the following command will test fast minified version: + + $ NACL_SRC=nacl-fast.min.js npm run test-node + +To run full suite of tests in Node.js, including comparing outputs of +JavaScript port to outputs of the original C version: + + $ npm run test-node-all + +To prepare tests for browsers: + + $ npm run build-test-browser + +and then open `test/browser/test.html` (or `test/browser/test-fast.html`) to +run them. + +To run headless browser tests with `tape-run` (powered by Electron): + + $ npm run test-browser + +(If you get `Error: spawn ENOENT`, install *xvfb*: `sudo apt-get install xvfb`.) + +To run tests in both Node and Electron: + + $ npm test + +### Benchmarking + +To run benchmarks in Node.js: + + $ npm run bench + $ NACL_SRC=nacl-fast.min.js npm run bench + +To run benchmarks in a browser, open `test/benchmark/bench.html` (or +`test/benchmark/bench-fast.html`). + + +Benchmarks +---------- + +For reference, here are benchmarks from MacBook Pro (Retina, 13-inch, Mid 2014) +laptop with 2.6 GHz Intel Core i5 CPU (Intel) in Chrome 53/OS X and Xiaomi Redmi +Note 3 smartphone with 1.8 GHz Qualcomm Snapdragon 650 64-bit CPU (ARM) in +Chrome 52/Android: + +| | nacl.js Intel | nacl-fast.js Intel | nacl.js ARM | nacl-fast.js ARM | +| ------------- |:-------------:|:-------------------:|:-------------:|:-----------------:| +| salsa20 | 1.3 MB/s | 128 MB/s | 0.4 MB/s | 43 MB/s | +| poly1305 | 13 MB/s | 171 MB/s | 4 MB/s | 52 MB/s | +| hash | 4 MB/s | 34 MB/s | 0.9 MB/s | 12 MB/s | +| secretbox 1K | 1113 op/s | 57583 op/s | 334 op/s | 14227 op/s | +| box 1K | 145 op/s | 718 op/s | 37 op/s | 368 op/s | +| scalarMult | 171 op/s | 733 op/s | 56 op/s | 380 op/s | +| sign | 77 op/s | 200 op/s | 20 op/s | 61 op/s | +| sign.open | 39 op/s | 102 op/s | 11 op/s | 31 op/s | + +(You can run benchmarks on your devices by clicking on the links at the bottom +of the [home page](https://tweetnacl.js.org)). + +In short, with *nacl-fast.js* and 1024-byte messages you can expect to encrypt and +authenticate more than 57000 messages per second on a typical laptop or more than +14000 messages per second on a $170 smartphone, sign about 200 and verify 100 +messages per second on a laptop or 60 and 30 messages per second on a smartphone, +per CPU core (with Web Workers you can do these operations in parallel), +which is good enough for most applications. + + +Contributors +------------ + +See AUTHORS.md file. + + +Third-party libraries based on TweetNaCl.js +------------------------------------------- + +* [forward-secrecy](https://github.com/alax/forward-secrecy) — Axolotl ratchet implementation +* [nacl-stream](https://github.com/dchest/nacl-stream-js) - streaming encryption +* [tweetnacl-auth-js](https://github.com/dchest/tweetnacl-auth-js) — implementation of [`crypto_auth`](http://nacl.cr.yp.to/auth.html) +* [chloride](https://github.com/dominictarr/chloride) - unified API for various NaCl modules + + +Who uses it +----------- + +Some notable users of TweetNaCl.js: + +* [miniLock](http://minilock.io/) +* [Stellar](https://www.stellar.org/) diff --git a/node_modules/tweetnacl/nacl-fast.js b/node_modules/tweetnacl/nacl-fast.js new file mode 100644 index 0000000..5e4562f --- /dev/null +++ b/node_modules/tweetnacl/nacl-fast.js @@ -0,0 +1,2388 @@ +(function(nacl) { +'use strict'; + +// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. +// Public domain. +// +// Implementation derived from TweetNaCl version 20140427. +// See for details: http://tweetnacl.cr.yp.to/ + +var gf = function(init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; + +// Pluggable, initialized in high-level API below. +var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + +var _0 = new Uint8Array(16); +var _9 = new Uint8Array(32); _9[0] = 9; + +var gf0 = gf(), + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + +function ts64(x, i, h, l) { + x[i] = (h >> 24) & 0xff; + x[i+1] = (h >> 16) & 0xff; + x[i+2] = (h >> 8) & 0xff; + x[i+3] = h & 0xff; + x[i+4] = (l >> 24) & 0xff; + x[i+5] = (l >> 16) & 0xff; + x[i+6] = (l >> 8) & 0xff; + x[i+7] = l & 0xff; +} + +function vn(x, xi, y, yi, n) { + var i,d = 0; + for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_16(x, xi, y, yi) { + return vn(x,xi,y,yi,16); +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x,xi,y,yi,32); +} + +function core_salsa20(o, p, k, c) { + var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, + j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, + j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, + j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, + j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, + j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, + j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, + j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, + j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, + j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, + j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, + j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, + j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, + j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, + j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, + j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u<<7 | u>>>(32-7); + u = x4 + x0 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x4 | 0; + x12 ^= u<<13 | u>>>(32-13); + u = x12 + x8 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x1 | 0; + x9 ^= u<<7 | u>>>(32-7); + u = x9 + x5 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x9 | 0; + x1 ^= u<<13 | u>>>(32-13); + u = x1 + x13 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x6 | 0; + x14 ^= u<<7 | u>>>(32-7); + u = x14 + x10 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x14 | 0; + x6 ^= u<<13 | u>>>(32-13); + u = x6 + x2 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x11 | 0; + x3 ^= u<<7 | u>>>(32-7); + u = x3 + x15 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x3 | 0; + x11 ^= u<<13 | u>>>(32-13); + u = x11 + x7 | 0; + x15 ^= u<<18 | u>>>(32-18); + + u = x0 + x3 | 0; + x1 ^= u<<7 | u>>>(32-7); + u = x1 + x0 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x1 | 0; + x3 ^= u<<13 | u>>>(32-13); + u = x3 + x2 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x4 | 0; + x6 ^= u<<7 | u>>>(32-7); + u = x6 + x5 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x6 | 0; + x4 ^= u<<13 | u>>>(32-13); + u = x4 + x7 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x9 | 0; + x11 ^= u<<7 | u>>>(32-7); + u = x11 + x10 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x11 | 0; + x9 ^= u<<13 | u>>>(32-13); + u = x9 + x8 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x14 | 0; + x12 ^= u<<7 | u>>>(32-7); + u = x12 + x15 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x12 | 0; + x14 ^= u<<13 | u>>>(32-13); + u = x14 + x13 | 0; + x15 ^= u<<18 | u>>>(32-18); + } + x0 = x0 + j0 | 0; + x1 = x1 + j1 | 0; + x2 = x2 + j2 | 0; + x3 = x3 + j3 | 0; + x4 = x4 + j4 | 0; + x5 = x5 + j5 | 0; + x6 = x6 + j6 | 0; + x7 = x7 + j7 | 0; + x8 = x8 + j8 | 0; + x9 = x9 + j9 | 0; + x10 = x10 + j10 | 0; + x11 = x11 + j11 | 0; + x12 = x12 + j12 | 0; + x13 = x13 + j13 | 0; + x14 = x14 + j14 | 0; + x15 = x15 + j15 | 0; + + o[ 0] = x0 >>> 0 & 0xff; + o[ 1] = x0 >>> 8 & 0xff; + o[ 2] = x0 >>> 16 & 0xff; + o[ 3] = x0 >>> 24 & 0xff; + + o[ 4] = x1 >>> 0 & 0xff; + o[ 5] = x1 >>> 8 & 0xff; + o[ 6] = x1 >>> 16 & 0xff; + o[ 7] = x1 >>> 24 & 0xff; + + o[ 8] = x2 >>> 0 & 0xff; + o[ 9] = x2 >>> 8 & 0xff; + o[10] = x2 >>> 16 & 0xff; + o[11] = x2 >>> 24 & 0xff; + + o[12] = x3 >>> 0 & 0xff; + o[13] = x3 >>> 8 & 0xff; + o[14] = x3 >>> 16 & 0xff; + o[15] = x3 >>> 24 & 0xff; + + o[16] = x4 >>> 0 & 0xff; + o[17] = x4 >>> 8 & 0xff; + o[18] = x4 >>> 16 & 0xff; + o[19] = x4 >>> 24 & 0xff; + + o[20] = x5 >>> 0 & 0xff; + o[21] = x5 >>> 8 & 0xff; + o[22] = x5 >>> 16 & 0xff; + o[23] = x5 >>> 24 & 0xff; + + o[24] = x6 >>> 0 & 0xff; + o[25] = x6 >>> 8 & 0xff; + o[26] = x6 >>> 16 & 0xff; + o[27] = x6 >>> 24 & 0xff; + + o[28] = x7 >>> 0 & 0xff; + o[29] = x7 >>> 8 & 0xff; + o[30] = x7 >>> 16 & 0xff; + o[31] = x7 >>> 24 & 0xff; + + o[32] = x8 >>> 0 & 0xff; + o[33] = x8 >>> 8 & 0xff; + o[34] = x8 >>> 16 & 0xff; + o[35] = x8 >>> 24 & 0xff; + + o[36] = x9 >>> 0 & 0xff; + o[37] = x9 >>> 8 & 0xff; + o[38] = x9 >>> 16 & 0xff; + o[39] = x9 >>> 24 & 0xff; + + o[40] = x10 >>> 0 & 0xff; + o[41] = x10 >>> 8 & 0xff; + o[42] = x10 >>> 16 & 0xff; + o[43] = x10 >>> 24 & 0xff; + + o[44] = x11 >>> 0 & 0xff; + o[45] = x11 >>> 8 & 0xff; + o[46] = x11 >>> 16 & 0xff; + o[47] = x11 >>> 24 & 0xff; + + o[48] = x12 >>> 0 & 0xff; + o[49] = x12 >>> 8 & 0xff; + o[50] = x12 >>> 16 & 0xff; + o[51] = x12 >>> 24 & 0xff; + + o[52] = x13 >>> 0 & 0xff; + o[53] = x13 >>> 8 & 0xff; + o[54] = x13 >>> 16 & 0xff; + o[55] = x13 >>> 24 & 0xff; + + o[56] = x14 >>> 0 & 0xff; + o[57] = x14 >>> 8 & 0xff; + o[58] = x14 >>> 16 & 0xff; + o[59] = x14 >>> 24 & 0xff; + + o[60] = x15 >>> 0 & 0xff; + o[61] = x15 >>> 8 & 0xff; + o[62] = x15 >>> 16 & 0xff; + o[63] = x15 >>> 24 & 0xff; +} + +function core_hsalsa20(o,p,k,c) { + var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, + j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, + j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, + j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, + j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, + j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, + j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, + j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, + j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, + j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, + j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, + j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, + j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, + j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, + j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, + j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u<<7 | u>>>(32-7); + u = x4 + x0 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x4 | 0; + x12 ^= u<<13 | u>>>(32-13); + u = x12 + x8 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x1 | 0; + x9 ^= u<<7 | u>>>(32-7); + u = x9 + x5 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x9 | 0; + x1 ^= u<<13 | u>>>(32-13); + u = x1 + x13 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x6 | 0; + x14 ^= u<<7 | u>>>(32-7); + u = x14 + x10 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x14 | 0; + x6 ^= u<<13 | u>>>(32-13); + u = x6 + x2 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x11 | 0; + x3 ^= u<<7 | u>>>(32-7); + u = x3 + x15 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x3 | 0; + x11 ^= u<<13 | u>>>(32-13); + u = x11 + x7 | 0; + x15 ^= u<<18 | u>>>(32-18); + + u = x0 + x3 | 0; + x1 ^= u<<7 | u>>>(32-7); + u = x1 + x0 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x1 | 0; + x3 ^= u<<13 | u>>>(32-13); + u = x3 + x2 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x4 | 0; + x6 ^= u<<7 | u>>>(32-7); + u = x6 + x5 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x6 | 0; + x4 ^= u<<13 | u>>>(32-13); + u = x4 + x7 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x9 | 0; + x11 ^= u<<7 | u>>>(32-7); + u = x11 + x10 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x11 | 0; + x9 ^= u<<13 | u>>>(32-13); + u = x9 + x8 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x14 | 0; + x12 ^= u<<7 | u>>>(32-7); + u = x12 + x15 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x12 | 0; + x14 ^= u<<13 | u>>>(32-13); + u = x14 + x13 | 0; + x15 ^= u<<18 | u>>>(32-18); + } + + o[ 0] = x0 >>> 0 & 0xff; + o[ 1] = x0 >>> 8 & 0xff; + o[ 2] = x0 >>> 16 & 0xff; + o[ 3] = x0 >>> 24 & 0xff; + + o[ 4] = x5 >>> 0 & 0xff; + o[ 5] = x5 >>> 8 & 0xff; + o[ 6] = x5 >>> 16 & 0xff; + o[ 7] = x5 >>> 24 & 0xff; + + o[ 8] = x10 >>> 0 & 0xff; + o[ 9] = x10 >>> 8 & 0xff; + o[10] = x10 >>> 16 & 0xff; + o[11] = x10 >>> 24 & 0xff; + + o[12] = x15 >>> 0 & 0xff; + o[13] = x15 >>> 8 & 0xff; + o[14] = x15 >>> 16 & 0xff; + o[15] = x15 >>> 24 & 0xff; + + o[16] = x6 >>> 0 & 0xff; + o[17] = x6 >>> 8 & 0xff; + o[18] = x6 >>> 16 & 0xff; + o[19] = x6 >>> 24 & 0xff; + + o[20] = x7 >>> 0 & 0xff; + o[21] = x7 >>> 8 & 0xff; + o[22] = x7 >>> 16 & 0xff; + o[23] = x7 >>> 24 & 0xff; + + o[24] = x8 >>> 0 & 0xff; + o[25] = x8 >>> 8 & 0xff; + o[26] = x8 >>> 16 & 0xff; + o[27] = x8 >>> 24 & 0xff; + + o[28] = x9 >>> 0 & 0xff; + o[29] = x9 >>> 8 & 0xff; + o[30] = x9 >>> 16 & 0xff; + o[31] = x9 >>> 24 & 0xff; +} + +function crypto_core_salsa20(out,inp,k,c) { + core_salsa20(out,inp,k,c); +} + +function crypto_core_hsalsa20(out,inp,k,c) { + core_hsalsa20(out,inp,k,c); +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + +function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i]; + } + return 0; +} + +function crypto_stream_salsa20(c,cpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = x[i]; + } + return 0; +} + +function crypto_stream(c,cpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i+16]; + return crypto_stream_salsa20(c,cpos,d,sn,s); +} + +function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i+16]; + return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s); +} + +/* +* Port of Andrew Moon's Poly1305-donna-16. Public domain. +* https://github.com/floodyberry/poly1305-donna +*/ + +var poly1305 = function(key) { + this.buffer = new Uint8Array(16); + this.r = new Uint16Array(10); + this.h = new Uint16Array(10); + this.pad = new Uint16Array(8); + this.leftover = 0; + this.fin = 0; + + var t0, t1, t2, t3, t4, t5, t6, t7; + + t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; + t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; + t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; + this.r[5] = ((t4 >>> 1)) & 0x1ffe; + t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; + t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + this.r[9] = ((t7 >>> 5)) & 0x007f; + + this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; + this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; + this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; + this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; + this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; + this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; + this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; + this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; +}; + +poly1305.prototype.blocks = function(m, mpos, bytes) { + var hibit = this.fin ? 0 : (1 << 11); + var t0, t1, t2, t3, t4, t5, t6, t7, c; + var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; + + var h0 = this.h[0], + h1 = this.h[1], + h2 = this.h[2], + h3 = this.h[3], + h4 = this.h[4], + h5 = this.h[5], + h6 = this.h[6], + h7 = this.h[7], + h8 = this.h[8], + h9 = this.h[9]; + + var r0 = this.r[0], + r1 = this.r[1], + r2 = this.r[2], + r3 = this.r[3], + r4 = this.r[4], + r5 = this.r[5], + r6 = this.r[6], + r7 = this.r[7], + r8 = this.r[8], + r9 = this.r[9]; + + while (bytes >= 16) { + t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; + t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; + t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; + h5 += ((t4 >>> 1)) & 0x1fff; + t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; + t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + h9 += ((t7 >>> 5)) | hibit; + + c = 0; + + d0 = c; + d0 += h0 * r0; + d0 += h1 * (5 * r9); + d0 += h2 * (5 * r8); + d0 += h3 * (5 * r7); + d0 += h4 * (5 * r6); + c = (d0 >>> 13); d0 &= 0x1fff; + d0 += h5 * (5 * r5); + d0 += h6 * (5 * r4); + d0 += h7 * (5 * r3); + d0 += h8 * (5 * r2); + d0 += h9 * (5 * r1); + c += (d0 >>> 13); d0 &= 0x1fff; + + d1 = c; + d1 += h0 * r1; + d1 += h1 * r0; + d1 += h2 * (5 * r9); + d1 += h3 * (5 * r8); + d1 += h4 * (5 * r7); + c = (d1 >>> 13); d1 &= 0x1fff; + d1 += h5 * (5 * r6); + d1 += h6 * (5 * r5); + d1 += h7 * (5 * r4); + d1 += h8 * (5 * r3); + d1 += h9 * (5 * r2); + c += (d1 >>> 13); d1 &= 0x1fff; + + d2 = c; + d2 += h0 * r2; + d2 += h1 * r1; + d2 += h2 * r0; + d2 += h3 * (5 * r9); + d2 += h4 * (5 * r8); + c = (d2 >>> 13); d2 &= 0x1fff; + d2 += h5 * (5 * r7); + d2 += h6 * (5 * r6); + d2 += h7 * (5 * r5); + d2 += h8 * (5 * r4); + d2 += h9 * (5 * r3); + c += (d2 >>> 13); d2 &= 0x1fff; + + d3 = c; + d3 += h0 * r3; + d3 += h1 * r2; + d3 += h2 * r1; + d3 += h3 * r0; + d3 += h4 * (5 * r9); + c = (d3 >>> 13); d3 &= 0x1fff; + d3 += h5 * (5 * r8); + d3 += h6 * (5 * r7); + d3 += h7 * (5 * r6); + d3 += h8 * (5 * r5); + d3 += h9 * (5 * r4); + c += (d3 >>> 13); d3 &= 0x1fff; + + d4 = c; + d4 += h0 * r4; + d4 += h1 * r3; + d4 += h2 * r2; + d4 += h3 * r1; + d4 += h4 * r0; + c = (d4 >>> 13); d4 &= 0x1fff; + d4 += h5 * (5 * r9); + d4 += h6 * (5 * r8); + d4 += h7 * (5 * r7); + d4 += h8 * (5 * r6); + d4 += h9 * (5 * r5); + c += (d4 >>> 13); d4 &= 0x1fff; + + d5 = c; + d5 += h0 * r5; + d5 += h1 * r4; + d5 += h2 * r3; + d5 += h3 * r2; + d5 += h4 * r1; + c = (d5 >>> 13); d5 &= 0x1fff; + d5 += h5 * r0; + d5 += h6 * (5 * r9); + d5 += h7 * (5 * r8); + d5 += h8 * (5 * r7); + d5 += h9 * (5 * r6); + c += (d5 >>> 13); d5 &= 0x1fff; + + d6 = c; + d6 += h0 * r6; + d6 += h1 * r5; + d6 += h2 * r4; + d6 += h3 * r3; + d6 += h4 * r2; + c = (d6 >>> 13); d6 &= 0x1fff; + d6 += h5 * r1; + d6 += h6 * r0; + d6 += h7 * (5 * r9); + d6 += h8 * (5 * r8); + d6 += h9 * (5 * r7); + c += (d6 >>> 13); d6 &= 0x1fff; + + d7 = c; + d7 += h0 * r7; + d7 += h1 * r6; + d7 += h2 * r5; + d7 += h3 * r4; + d7 += h4 * r3; + c = (d7 >>> 13); d7 &= 0x1fff; + d7 += h5 * r2; + d7 += h6 * r1; + d7 += h7 * r0; + d7 += h8 * (5 * r9); + d7 += h9 * (5 * r8); + c += (d7 >>> 13); d7 &= 0x1fff; + + d8 = c; + d8 += h0 * r8; + d8 += h1 * r7; + d8 += h2 * r6; + d8 += h3 * r5; + d8 += h4 * r4; + c = (d8 >>> 13); d8 &= 0x1fff; + d8 += h5 * r3; + d8 += h6 * r2; + d8 += h7 * r1; + d8 += h8 * r0; + d8 += h9 * (5 * r9); + c += (d8 >>> 13); d8 &= 0x1fff; + + d9 = c; + d9 += h0 * r9; + d9 += h1 * r8; + d9 += h2 * r7; + d9 += h3 * r6; + d9 += h4 * r5; + c = (d9 >>> 13); d9 &= 0x1fff; + d9 += h5 * r4; + d9 += h6 * r3; + d9 += h7 * r2; + d9 += h8 * r1; + d9 += h9 * r0; + c += (d9 >>> 13); d9 &= 0x1fff; + + c = (((c << 2) + c)) | 0; + c = (c + d0) | 0; + d0 = c & 0x1fff; + c = (c >>> 13); + d1 += c; + + h0 = d0; + h1 = d1; + h2 = d2; + h3 = d3; + h4 = d4; + h5 = d5; + h6 = d6; + h7 = d7; + h8 = d8; + h9 = d9; + + mpos += 16; + bytes -= 16; + } + this.h[0] = h0; + this.h[1] = h1; + this.h[2] = h2; + this.h[3] = h3; + this.h[4] = h4; + this.h[5] = h5; + this.h[6] = h6; + this.h[7] = h7; + this.h[8] = h8; + this.h[9] = h9; +}; + +poly1305.prototype.finish = function(mac, macpos) { + var g = new Uint16Array(10); + var c, mask, f, i; + + if (this.leftover) { + i = this.leftover; + this.buffer[i++] = 1; + for (; i < 16; i++) this.buffer[i] = 0; + this.fin = 1; + this.blocks(this.buffer, 0, 16); + } + + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + for (i = 2; i < 10; i++) { + this.h[i] += c; + c = this.h[i] >>> 13; + this.h[i] &= 0x1fff; + } + this.h[0] += (c * 5); + c = this.h[0] >>> 13; + this.h[0] &= 0x1fff; + this.h[1] += c; + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + this.h[2] += c; + + g[0] = this.h[0] + 5; + c = g[0] >>> 13; + g[0] &= 0x1fff; + for (i = 1; i < 10; i++) { + g[i] = this.h[i] + c; + c = g[i] >>> 13; + g[i] &= 0x1fff; + } + g[9] -= (1 << 13); + + mask = (c ^ 1) - 1; + for (i = 0; i < 10; i++) g[i] &= mask; + mask = ~mask; + for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; + + this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff; + this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; + this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; + this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; + this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; + this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; + this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; + this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; + + f = this.h[0] + this.pad[0]; + this.h[0] = f & 0xffff; + for (i = 1; i < 8; i++) { + f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; + this.h[i] = f & 0xffff; + } + + mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; + mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; + mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; + mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; + mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; + mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; + mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; + mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; + mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; + mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; + mac[macpos+10] = (this.h[5] >>> 0) & 0xff; + mac[macpos+11] = (this.h[5] >>> 8) & 0xff; + mac[macpos+12] = (this.h[6] >>> 0) & 0xff; + mac[macpos+13] = (this.h[6] >>> 8) & 0xff; + mac[macpos+14] = (this.h[7] >>> 0) & 0xff; + mac[macpos+15] = (this.h[7] >>> 8) & 0xff; +}; + +poly1305.prototype.update = function(m, mpos, bytes) { + var i, want; + + if (this.leftover) { + want = (16 - this.leftover); + if (want > bytes) + want = bytes; + for (i = 0; i < want; i++) + this.buffer[this.leftover + i] = m[mpos+i]; + bytes -= want; + mpos += want; + this.leftover += want; + if (this.leftover < 16) + return; + this.blocks(this.buffer, 0, 16); + this.leftover = 0; + } + + if (bytes >= 16) { + want = bytes - (bytes % 16); + this.blocks(m, mpos, want); + mpos += want; + bytes -= want; + } + + if (bytes) { + for (i = 0; i < bytes; i++) + this.buffer[this.leftover + i] = m[mpos+i]; + this.leftover += bytes; + } +}; + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s = new poly1305(k); + s.update(m, mpos, n); + s.finish(out, outpos); + return 0; +} + +function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x,0,m,mpos,n,k); + return crypto_verify_16(h,hpos,x,0); +} + +function crypto_secretbox(c,m,d,n,k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c,0,m,0,d,n,k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; +} + +function crypto_secretbox_open(m,c,d,n,k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x,0,32,n,k); + if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; + crypto_stream_xor(m,0,c,0,d,n,k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i]|0; +} + +function car25519(o) { + var i, v, c = 1; + for (i = 0; i < 16; i++) { + v = o[i] + c + 65535; + c = Math.floor(v / 65536); + o[i] = v - c * 65536; + } + o[0] += c-1 + 37 * (c-1); +} + +function sel25519(p, q, b) { + var t, c = ~(b-1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); + m[i-1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); + b = (m[15]>>16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1-b); + } + for (i = 0; i < 16; i++) { + o[2*i] = t[i] & 0xff; + o[2*i+1] = t[i]>>8; + } +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); + o[15] &= 0x7fff; +} + +function A(o, a, b) { + for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; +} + +function Z(o, a, b) { + for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; +} + +function M(o, a, b) { + var v, c, + t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, + t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, + t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, + t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, + b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7], + b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11], + b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + + v = a[0]; + t0 += v * b0; + t1 += v * b1; + t2 += v * b2; + t3 += v * b3; + t4 += v * b4; + t5 += v * b5; + t6 += v * b6; + t7 += v * b7; + t8 += v * b8; + t9 += v * b9; + t10 += v * b10; + t11 += v * b11; + t12 += v * b12; + t13 += v * b13; + t14 += v * b14; + t15 += v * b15; + v = a[1]; + t1 += v * b0; + t2 += v * b1; + t3 += v * b2; + t4 += v * b3; + t5 += v * b4; + t6 += v * b5; + t7 += v * b6; + t8 += v * b7; + t9 += v * b8; + t10 += v * b9; + t11 += v * b10; + t12 += v * b11; + t13 += v * b12; + t14 += v * b13; + t15 += v * b14; + t16 += v * b15; + v = a[2]; + t2 += v * b0; + t3 += v * b1; + t4 += v * b2; + t5 += v * b3; + t6 += v * b4; + t7 += v * b5; + t8 += v * b6; + t9 += v * b7; + t10 += v * b8; + t11 += v * b9; + t12 += v * b10; + t13 += v * b11; + t14 += v * b12; + t15 += v * b13; + t16 += v * b14; + t17 += v * b15; + v = a[3]; + t3 += v * b0; + t4 += v * b1; + t5 += v * b2; + t6 += v * b3; + t7 += v * b4; + t8 += v * b5; + t9 += v * b6; + t10 += v * b7; + t11 += v * b8; + t12 += v * b9; + t13 += v * b10; + t14 += v * b11; + t15 += v * b12; + t16 += v * b13; + t17 += v * b14; + t18 += v * b15; + v = a[4]; + t4 += v * b0; + t5 += v * b1; + t6 += v * b2; + t7 += v * b3; + t8 += v * b4; + t9 += v * b5; + t10 += v * b6; + t11 += v * b7; + t12 += v * b8; + t13 += v * b9; + t14 += v * b10; + t15 += v * b11; + t16 += v * b12; + t17 += v * b13; + t18 += v * b14; + t19 += v * b15; + v = a[5]; + t5 += v * b0; + t6 += v * b1; + t7 += v * b2; + t8 += v * b3; + t9 += v * b4; + t10 += v * b5; + t11 += v * b6; + t12 += v * b7; + t13 += v * b8; + t14 += v * b9; + t15 += v * b10; + t16 += v * b11; + t17 += v * b12; + t18 += v * b13; + t19 += v * b14; + t20 += v * b15; + v = a[6]; + t6 += v * b0; + t7 += v * b1; + t8 += v * b2; + t9 += v * b3; + t10 += v * b4; + t11 += v * b5; + t12 += v * b6; + t13 += v * b7; + t14 += v * b8; + t15 += v * b9; + t16 += v * b10; + t17 += v * b11; + t18 += v * b12; + t19 += v * b13; + t20 += v * b14; + t21 += v * b15; + v = a[7]; + t7 += v * b0; + t8 += v * b1; + t9 += v * b2; + t10 += v * b3; + t11 += v * b4; + t12 += v * b5; + t13 += v * b6; + t14 += v * b7; + t15 += v * b8; + t16 += v * b9; + t17 += v * b10; + t18 += v * b11; + t19 += v * b12; + t20 += v * b13; + t21 += v * b14; + t22 += v * b15; + v = a[8]; + t8 += v * b0; + t9 += v * b1; + t10 += v * b2; + t11 += v * b3; + t12 += v * b4; + t13 += v * b5; + t14 += v * b6; + t15 += v * b7; + t16 += v * b8; + t17 += v * b9; + t18 += v * b10; + t19 += v * b11; + t20 += v * b12; + t21 += v * b13; + t22 += v * b14; + t23 += v * b15; + v = a[9]; + t9 += v * b0; + t10 += v * b1; + t11 += v * b2; + t12 += v * b3; + t13 += v * b4; + t14 += v * b5; + t15 += v * b6; + t16 += v * b7; + t17 += v * b8; + t18 += v * b9; + t19 += v * b10; + t20 += v * b11; + t21 += v * b12; + t22 += v * b13; + t23 += v * b14; + t24 += v * b15; + v = a[10]; + t10 += v * b0; + t11 += v * b1; + t12 += v * b2; + t13 += v * b3; + t14 += v * b4; + t15 += v * b5; + t16 += v * b6; + t17 += v * b7; + t18 += v * b8; + t19 += v * b9; + t20 += v * b10; + t21 += v * b11; + t22 += v * b12; + t23 += v * b13; + t24 += v * b14; + t25 += v * b15; + v = a[11]; + t11 += v * b0; + t12 += v * b1; + t13 += v * b2; + t14 += v * b3; + t15 += v * b4; + t16 += v * b5; + t17 += v * b6; + t18 += v * b7; + t19 += v * b8; + t20 += v * b9; + t21 += v * b10; + t22 += v * b11; + t23 += v * b12; + t24 += v * b13; + t25 += v * b14; + t26 += v * b15; + v = a[12]; + t12 += v * b0; + t13 += v * b1; + t14 += v * b2; + t15 += v * b3; + t16 += v * b4; + t17 += v * b5; + t18 += v * b6; + t19 += v * b7; + t20 += v * b8; + t21 += v * b9; + t22 += v * b10; + t23 += v * b11; + t24 += v * b12; + t25 += v * b13; + t26 += v * b14; + t27 += v * b15; + v = a[13]; + t13 += v * b0; + t14 += v * b1; + t15 += v * b2; + t16 += v * b3; + t17 += v * b4; + t18 += v * b5; + t19 += v * b6; + t20 += v * b7; + t21 += v * b8; + t22 += v * b9; + t23 += v * b10; + t24 += v * b11; + t25 += v * b12; + t26 += v * b13; + t27 += v * b14; + t28 += v * b15; + v = a[14]; + t14 += v * b0; + t15 += v * b1; + t16 += v * b2; + t17 += v * b3; + t18 += v * b4; + t19 += v * b5; + t20 += v * b6; + t21 += v * b7; + t22 += v * b8; + t23 += v * b9; + t24 += v * b10; + t25 += v * b11; + t26 += v * b12; + t27 += v * b13; + t28 += v * b14; + t29 += v * b15; + v = a[15]; + t15 += v * b0; + t16 += v * b1; + t17 += v * b2; + t18 += v * b3; + t19 += v * b4; + t20 += v * b5; + t21 += v * b6; + t22 += v * b7; + t23 += v * b8; + t24 += v * b9; + t25 += v * b10; + t26 += v * b11; + t27 += v * b12; + t28 += v * b13; + t29 += v * b14; + t30 += v * b15; + + t0 += 38 * t16; + t1 += 38 * t17; + t2 += 38 * t18; + t3 += 38 * t19; + t4 += 38 * t20; + t5 += 38 * t21; + t6 += 38 * t22; + t7 += 38 * t23; + t8 += 38 * t24; + t9 += 38 * t25; + t10 += 38 * t26; + t11 += 38 * t27; + t12 += 38 * t28; + t13 += 38 * t29; + t14 += 38 * t30; + // t15 left as is + + // first car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c-1 + 37 * (c-1); + + // second car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c-1 + 37 * (c-1); + + o[ 0] = t0; + o[ 1] = t1; + o[ 2] = t2; + o[ 3] = t3; + o[ 4] = t4; + o[ 5] = t5; + o[ 6] = t6; + o[ 7] = t7; + o[ 8] = t8; + o[ 9] = t9; + o[10] = t10; + o[11] = t11; + o[12] = t12; + o[13] = t13; + o[14] = t14; + o[15] = t15; +} + +function S(o, a) { + M(o, a, a); +} + +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if(a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if(a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + for (i = 0; i < 16; i++) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for (i=254; i>=0; --i) { + r=(z[i>>>3]>>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + for (i = 0; i < 16; i++) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32,x32); + M(x16,x16,x32); + pack25519(q,x16); + return 0; +} + +function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); +} + +function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); +} + +function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); +} + +var crypto_box_afternm = crypto_secretbox; +var crypto_box_open_afternm = crypto_secretbox_open; + +function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); +} + +function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); +} + +var K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function crypto_hashblocks_hl(hh, hl, m, n) { + var wh = new Int32Array(16), wl = new Int32Array(16), + bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, + bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, + th, tl, i, j, h, l, a, b, c, d; + + var ah0 = hh[0], + ah1 = hh[1], + ah2 = hh[2], + ah3 = hh[3], + ah4 = hh[4], + ah5 = hh[5], + ah6 = hh[6], + ah7 = hh[7], + + al0 = hl[0], + al1 = hl[1], + al2 = hl[2], + al3 = hl[3], + al4 = hl[4], + al5 = hl[5], + al6 = hl[6], + al7 = hl[7]; + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) { + j = 8 * i + pos; + wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3]; + wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7]; + } + for (i = 0; i < 80; i++) { + bh0 = ah0; + bh1 = ah1; + bh2 = ah2; + bh3 = ah3; + bh4 = ah4; + bh5 = ah5; + bh6 = ah6; + bh7 = ah7; + + bl0 = al0; + bl1 = al1; + bl2 = al2; + bl3 = al3; + bl4 = al4; + bl5 = al5; + bl6 = al6; + bl7 = al7; + + // add + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma1 + h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32)))); + l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Ch + h = (ah4 & ah5) ^ (~ah4 & ah6); + l = (al4 & al5) ^ (~al4 & al6); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // K + h = K[i*2]; + l = K[i*2+1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // w + h = wh[i%16]; + l = wl[i%16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + th = c & 0xffff | d << 16; + tl = a & 0xffff | b << 16; + + // add + h = th; + l = tl; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma0 + h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32)))); + l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Maj + h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); + l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh7 = (c & 0xffff) | (d << 16); + bl7 = (a & 0xffff) | (b << 16); + + // add + h = bh3; + l = bl3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = th; + l = tl; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh3 = (c & 0xffff) | (d << 16); + bl3 = (a & 0xffff) | (b << 16); + + ah1 = bh0; + ah2 = bh1; + ah3 = bh2; + ah4 = bh3; + ah5 = bh4; + ah6 = bh5; + ah7 = bh6; + ah0 = bh7; + + al1 = bl0; + al2 = bl1; + al3 = bl2; + al4 = bl3; + al5 = bl4; + al6 = bl5; + al7 = bl6; + al0 = bl7; + + if (i%16 === 15) { + for (j = 0; j < 16; j++) { + // add + h = wh[j]; + l = wl[j]; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = wh[(j+9)%16]; + l = wl[(j+9)%16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // sigma0 + th = wh[(j+1)%16]; + tl = wl[(j+1)%16]; + h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7); + l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // sigma1 + th = wh[(j+14)%16]; + tl = wl[(j+14)%16]; + h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6); + l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + wh[j] = (c & 0xffff) | (d << 16); + wl[j] = (a & 0xffff) | (b << 16); + } + } + } + + // add + h = ah0; + l = al0; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[0]; + l = hl[0]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[0] = ah0 = (c & 0xffff) | (d << 16); + hl[0] = al0 = (a & 0xffff) | (b << 16); + + h = ah1; + l = al1; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[1]; + l = hl[1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[1] = ah1 = (c & 0xffff) | (d << 16); + hl[1] = al1 = (a & 0xffff) | (b << 16); + + h = ah2; + l = al2; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[2]; + l = hl[2]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[2] = ah2 = (c & 0xffff) | (d << 16); + hl[2] = al2 = (a & 0xffff) | (b << 16); + + h = ah3; + l = al3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[3]; + l = hl[3]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[3] = ah3 = (c & 0xffff) | (d << 16); + hl[3] = al3 = (a & 0xffff) | (b << 16); + + h = ah4; + l = al4; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[4]; + l = hl[4]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[4] = ah4 = (c & 0xffff) | (d << 16); + hl[4] = al4 = (a & 0xffff) | (b << 16); + + h = ah5; + l = al5; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[5]; + l = hl[5]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[5] = ah5 = (c & 0xffff) | (d << 16); + hl[5] = al5 = (a & 0xffff) | (b << 16); + + h = ah6; + l = al6; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[6]; + l = hl[6]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[6] = ah6 = (c & 0xffff) | (d << 16); + hl[6] = al6 = (a & 0xffff) | (b << 16); + + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[7]; + l = hl[7]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[7] = ah7 = (c & 0xffff) | (d << 16); + hl[7] = al7 = (a & 0xffff) | (b << 16); + + pos += 128; + n -= 128; + } + + return n; +} + +function crypto_hash(out, m, n) { + var hh = new Int32Array(8), + hl = new Int32Array(8), + x = new Uint8Array(256), + i, b = n; + + hh[0] = 0x6a09e667; + hh[1] = 0xbb67ae85; + hh[2] = 0x3c6ef372; + hh[3] = 0xa54ff53a; + hh[4] = 0x510e527f; + hh[5] = 0x9b05688c; + hh[6] = 0x1f83d9ab; + hh[7] = 0x5be0cd19; + + hl[0] = 0xf3bcc908; + hl[1] = 0x84caa73b; + hl[2] = 0xfe94f82b; + hl[3] = 0x5f1d36f1; + hl[4] = 0xade682d1; + hl[5] = 0x2b3e6c1f; + hl[6] = 0xfb41bd6b; + hl[7] = 0x137e2179; + + crypto_hashblocks_hl(hh, hl, m, n); + n %= 128; + + for (i = 0; i < n; i++) x[i] = m[b-n+i]; + x[n] = 128; + + n = 256-128*(n<112?1:0); + x[n-9] = 0; + ts64(x, n-8, (b / 0x20000000) | 0, b << 3); + crypto_hashblocks_hl(hh, hl, x, n); + + for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]); + + return 0; +} + +function add(p, q) { + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } +} + +function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i/8)|0] >> (i&7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } +} + +function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); +} + +function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; +} + +var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + +function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +function reduce(r) { + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); +} + +// Note: difference from C - smlen returned, not passed as argument. +function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n+32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i+j] += h[i] * d[j]; + } + } + + modL(sm.subarray(32), x); + return smlen; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; + + mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i+32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; +} + +var crypto_secretbox_KEYBYTES = 32, + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + +nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, + + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES +}; + +/* High-level API */ + +function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); +} + +function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); +} + +function checkArrayTypes() { + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } +} + +function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; +} + +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} + +nacl.randomBytes = function(n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; +}; + +nacl.secretbox = function(msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); +}; + +nacl.secretbox.open = function(box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); +}; + +nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; +nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; +nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + +nacl.scalarMult = function(n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; +}; + +nacl.scalarMult.base = function(n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; +}; + +nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; +nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + +nacl.box = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); +}; + +nacl.box.before = function(publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; +}; + +nacl.box.after = nacl.secretbox; + +nacl.box.open = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); +}; + +nacl.box.open.after = nacl.secretbox.open; + +nacl.box.keyPair = function() { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.box.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; +nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; +nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; +nacl.box.nonceLength = crypto_box_NONCEBYTES; +nacl.box.overheadLength = nacl.secretbox.overheadLength; + +nacl.sign = function(msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; +}; + +nacl.sign.open = function(signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; +}; + +nacl.sign.detached = function(msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; +}; + +nacl.sign.detached.verify = function(msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +}; + +nacl.sign.keyPair = function() { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.sign.keyPair.fromSeed = function(seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; +nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; +nacl.sign.seedLength = crypto_sign_SEEDBYTES; +nacl.sign.signatureLength = crypto_sign_BYTES; + +nacl.hash = function(msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; +}; + +nacl.hash.hashLength = crypto_hash_BYTES; + +nacl.verify = function(x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0) ? true : false; +}; + +nacl.setPRNG = function(fn) { + randombytes = fn; +}; + +(function() { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function(x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } +})(); + +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/node_modules/tweetnacl/nacl-fast.min.js b/node_modules/tweetnacl/nacl-fast.min.js new file mode 100644 index 0000000..8bc47da --- /dev/null +++ b/node_modules/tweetnacl/nacl-fast.min.js @@ -0,0 +1,2 @@ +!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;i>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;d=d+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+c|0,B=B+u|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+v|0,L=L+b|0,z=z+g|0,R=R+_|0,P=P+A|0,r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=z>>>0&255,r[53]=z>>>8&255,r[54]=z>>>16&255,r[55]=z>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=P>>>0&255,r[61]=P>>>8&255,r[62]=P>>>16&255,r[63]=P>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=P>>>0&255,r[13]=P>>>8&255,r[14]=P>>>16&255,r[15]=P>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,c=new Uint8Array(16),u=new Uint8Array(64);for(s=0;s<16;s++)c[s]=0;for(s=0;s<8;s++)c[s]=i[s];for(;o>=64;){for(a(u,c,h,ur),s=0;s<64;s++)r[t+s]=n[e+s]^u[s];for(f=1,s=8;s<16;s++)f=f+(255&c[s])|0,c[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(u,c,h,ur),s=0;s=64;){for(a(s,f,o,ur),h=0;h<64;h++)r[t+h]=s[h];for(i=1,h=8;h<16;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,ur),h=0;h>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,_(h,i,1-o)}for(n=0;n<16;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function d(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;n<16;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,c=0,u=0,y=0,l=0,w=0,p=0,v=0,b=0,g=0,_=0,A=0,d=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,z=0,R=0,P=n[0],O=n[1],N=n[2],C=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],q=n[9],V=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*P,h+=e*O,a+=e*N,f+=e*C,s+=e*F,c+=e*I,u+=e*G,y+=e*Z,l+=e*j,w+=e*q,p+=e*V,v+=e*X,b+=e*D,g+=e*H,_+=e*J,A+=e*Q,e=t[1],h+=e*P,a+=e*O,f+=e*N,s+=e*C,c+=e*F,u+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*q,v+=e*V,b+=e*X,g+=e*D,_+=e*H,A+=e*J,d+=e*Q,e=t[2],a+=e*P,f+=e*O,s+=e*N,c+=e*C,u+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,v+=e*q,b+=e*V,g+=e*X,_+=e*D,A+=e*H,d+=e*J,U+=e*Q,e=t[3],f+=e*P,s+=e*O,c+=e*N,u+=e*C,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,v+=e*j,b+=e*q,g+=e*V,_+=e*X,A+=e*D,d+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*P,c+=e*O,u+=e*N,y+=e*C,l+=e*F,w+=e*I,p+=e*G,v+=e*Z,b+=e*j,g+=e*q,_+=e*V,A+=e*X,d+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],c+=e*P,u+=e*O,y+=e*N,l+=e*C,w+=e*F,p+=e*I,v+=e*G,b+=e*Z,g+=e*j,_+=e*q,A+=e*V,d+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],u+=e*P,y+=e*O,l+=e*N,w+=e*C,p+=e*F,v+=e*I,b+=e*G,g+=e*Z,_+=e*j,A+=e*q,d+=e*V,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*P,l+=e*O,w+=e*N,p+=e*C,v+=e*F,b+=e*I,g+=e*G,_+=e*Z,A+=e*j,d+=e*q,U+=e*V,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*P,w+=e*O,p+=e*N,v+=e*C,b+=e*F,g+=e*I,_+=e*G,A+=e*Z,d+=e*j,U+=e*q,E+=e*V,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*P,p+=e*O,v+=e*N,b+=e*C,g+=e*F,_+=e*I,A+=e*G,d+=e*Z,U+=e*j,E+=e*q,x+=e*V,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*P,v+=e*O,b+=e*N,g+=e*C,_+=e*F,A+=e*I,d+=e*G,U+=e*Z,E+=e*j,x+=e*q,M+=e*V,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],v+=e*P,b+=e*O,g+=e*N,_+=e*C,A+=e*F,d+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*q,m+=e*V,B+=e*X;S+=e*D;K+=e*H,T+=e*J,Y+=e*Q,e=t[12],b+=e*P,g+=e*O,_+=e*N,A+=e*C,d+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*q,B+=e*V,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],g+=e*P,_+=e*O,A+=e*N,d+=e*C,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*q,S+=e*V,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],_+=e*P,A+=e*O,d+=e*N,U+=e*C,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*q,K+=e*V,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,z+=e*Q,e=t[15],A+=e*P,d+=e*O,U+=e*N,E+=e*C,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*q,T+=e*V,Y+=e*X,k+=e*D,L+=e*H,z+=e*J,R+=e*Q,i+=38*d,h+=38*U,a+=38*E,f+=38*x,s+=38*M,c+=38*m,u+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,v+=38*k,b+=38*L,g+=38*z,_+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=c,r[6]=u,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=v,r[12]=b,r[13]=g;r[14]=_;r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),c=$(),u=$(),y=$();for(o=0;o<31;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;o<16;o++)f[o]=h[o],c[o]=a[o]=s[o]=0;for(a[0]=c[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,_(a,f,e),_(s,c,e),x(u,a,s),M(a,a,s),x(s,f,c),M(f,f,c),B(c,u),B(y,a),m(a,s,a),m(s,f,u),x(u,a,s),M(a,a,s),B(f,a),M(s,c,y),m(a,s,ir),x(a,a,c),m(s,s,a),m(a,c,y),m(c,f,h),B(f,u),_(a,f,e),_(s,c,e);for(o=0;o<16;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=c[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,ur)}function z(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function P(r,t,n,e){for(var o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],z=r[2],R=r[3],P=r[4],O=r[5],N=r[6],C=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],q=t[5],V=t[6],X=t[7],D=0;e>=128;){for(U=0;U<16;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;U<80;U++)if(o=k,i=L,h=z,a=R,f=P,s=O,c=N,u=C,y=F,l=I,w=G,p=Z,v=j,b=q,g=V,_=X,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(P>>>14|j<<18)^(P>>>18|j<<14)^(j>>>9|P<<23),M=(j>>>14|P<<18)^(j>>>18|P<<14)^(P>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=P&O^~P&N,M=j&q^~j&V,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,d=65535&m|B<<16,x=A,M=d,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&z^L&z,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,u=65535&S|K<<16,_=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=d,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,z=i,R=h,P=a,O=f,N=s,C=c,k=u,I=y,G=l,Z=w,j=p,q=v,V=b,X=g,F=_,U%16===15)for(E=0;E<16;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],d=Y[(E+1)%16],x=(A>>>1|d<<31)^(A>>>8|d<<24)^A>>>7,M=(d>>>1|A<<31)^(d>>>8|A<<24)^(d>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],d=Y[(E+14)%16],x=(A>>>19|d<<13)^(d>>>29|A<<3)^A>>>6,M=(d>>>19|A<<13)^(A>>>29|d<<3)^(d>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=z,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=z=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=P,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=P=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=O=65535&S|K<<16,t[5]=q=65535&m|B<<16,x=N,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=V=65535&m|B<<16,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=C=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function O(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,P(i,h,n,e),e%=128,o=0;o=0;--o)e=n[o/8|0]>>(7&o)&1,C(r,t,e),N(t,r),N(r,r),C(r,t,e)}function G(r,t){var n=[$(),$(),$(),$()];b(n[0],fr),b(n[1],sr),b(n[2],or),m(n[3],fr,sr),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),O(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;e<32;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;o>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;o<32;o++)t[o]+=n-(t[31]>>4)*vr[o],n=t[o]>>8,t[o]&=255;for(o=0;o<32;o++)t[o]-=n*vr[o];for(e=0;e<32;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function q(r){var t,n=new Float64Array(64);for(t=0;t<64;t++)n[t]=r[t];for(t=0;t<64;t++)r[t]=0;j(r,n)}function V(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),c=[$(),$(),$(),$()];O(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var u=n+64;for(o=0;o>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],c=[$(),$(),$(),$()];if(h=-1,n<64)return-1;if(X(c,e))return-1;for(i=0;i>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],z=this.r[1],R=this.r[2],P=this.r[3],O=this.r[4],N=this.r[5],C=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),c=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|c<<8),k+=c>>>5|U,u=0,y=u,y+=E*L,y+=x*(5*G),y+=M*(5*I),y+=m*(5*F),y+=B*(5*C),u=y>>>13,y&=8191,y+=S*(5*N),y+=K*(5*O),y+=T*(5*P),y+=Y*(5*R),y+=k*(5*z),u+=y>>>13,y&=8191,l=u,l+=E*z,l+=x*L,l+=M*(5*G),l+=m*(5*I),l+=B*(5*F),u=l>>>13,l&=8191,l+=S*(5*C),l+=K*(5*N),l+=T*(5*O),l+=Y*(5*P),l+=k*(5*R),u+=l>>>13,l&=8191,w=u,w+=E*R,w+=x*z,w+=M*L,w+=m*(5*G),w+=B*(5*I),u=w>>>13,w&=8191,w+=S*(5*F),w+=K*(5*C),w+=T*(5*N),w+=Y*(5*O),w+=k*(5*P),u+=w>>>13,w&=8191,p=u,p+=E*P,p+=x*R,p+=M*z,p+=m*L,p+=B*(5*G),u=p>>>13,p&=8191,p+=S*(5*I),p+=K*(5*F),p+=T*(5*C),p+=Y*(5*N),p+=k*(5*O),u+=p>>>13,p&=8191,v=u,v+=E*O,v+=x*P,v+=M*R,v+=m*z,v+=B*L,u=v>>>13,v&=8191,v+=S*(5*G),v+=K*(5*I),v+=T*(5*F),v+=Y*(5*C),v+=k*(5*N),u+=v>>>13,v&=8191,b=u,b+=E*N,b+=x*O,b+=M*P,b+=m*R,b+=B*z,u=b>>>13,b&=8191,b+=S*L,b+=K*(5*G),b+=T*(5*I),b+=Y*(5*F),b+=k*(5*C),u+=b>>>13,b&=8191,g=u,g+=E*C,g+=x*N,g+=M*O,g+=m*P,g+=B*R,u=g>>>13,g&=8191,g+=S*z,g+=K*L,g+=T*(5*G),g+=Y*(5*I),g+=k*(5*F),u+=g>>>13,g&=8191,_=u,_+=E*F,_+=x*C,_+=M*N,_+=m*O,_+=B*P,u=_>>>13,_&=8191,_+=S*R,_+=K*z,_+=T*L,_+=Y*(5*G),_+=k*(5*I),u+=_>>>13,_&=8191,A=u,A+=E*I,A+=x*F,A+=M*C,A+=m*N,A+=B*O,u=A>>>13,A&=8191,A+=S*P,A+=K*R,A+=T*z,A+=Y*L,A+=k*(5*G),u+=A>>>13,A&=8191,d=u,d+=E*G,d+=x*I,d+=M*F,d+=m*C,d+=B*N,u=d>>>13,d&=8191,d+=S*O,d+=K*P,d+=T*R,d+=Y*z,d+=k*L,u+=d>>>13,d&=8191,u=(u<<2)+u|0,u=u+y|0,y=8191&u,u>>>=13,l+=u,E=y,x=l,M=w,m=p,B=v,S=b,K=g,T=_,Y=A,k=d,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;i<16;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;i<10;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;i<10;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(1^n)-1,i=0;i<10;i++)h[i]&=e;for(e=~e,i=0;i<10;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;i<8;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;e=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;e=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;n void): void; +} diff --git a/node_modules/tweetnacl/nacl.js b/node_modules/tweetnacl/nacl.js new file mode 100644 index 0000000..f72dd78 --- /dev/null +++ b/node_modules/tweetnacl/nacl.js @@ -0,0 +1,1175 @@ +(function(nacl) { +'use strict'; + +// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. +// Public domain. +// +// Implementation derived from TweetNaCl version 20140427. +// See for details: http://tweetnacl.cr.yp.to/ + +var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; +var gf = function(init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; + +// Pluggable, initialized in high-level API below. +var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + +var _0 = new Uint8Array(16); +var _9 = new Uint8Array(32); _9[0] = 9; + +var gf0 = gf(), + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + +function L32(x, c) { return (x << c) | (x >>> (32 - c)); } + +function ld32(x, i) { + var u = x[i+3] & 0xff; + u = (u<<8)|(x[i+2] & 0xff); + u = (u<<8)|(x[i+1] & 0xff); + return (u<<8)|(x[i+0] & 0xff); +} + +function dl64(x, i) { + var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; + var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; + return new u64(h, l); +} + +function st32(x, j, u) { + var i; + for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } +} + +function ts64(x, i, u) { + x[i] = (u.hi >> 24) & 0xff; + x[i+1] = (u.hi >> 16) & 0xff; + x[i+2] = (u.hi >> 8) & 0xff; + x[i+3] = u.hi & 0xff; + x[i+4] = (u.lo >> 24) & 0xff; + x[i+5] = (u.lo >> 16) & 0xff; + x[i+6] = (u.lo >> 8) & 0xff; + x[i+7] = u.lo & 0xff; +} + +function vn(x, xi, y, yi, n) { + var i,d = 0; + for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_16(x, xi, y, yi) { + return vn(x,xi,y,yi,16); +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x,xi,y,yi,32); +} + +function core(out,inp,k,c,h) { + var w = new Uint32Array(16), x = new Uint32Array(16), + y = new Uint32Array(16), t = new Uint32Array(4); + var i, j, m; + + for (i = 0; i < 4; i++) { + x[5*i] = ld32(c, 4*i); + x[1+i] = ld32(k, 4*i); + x[6+i] = ld32(inp, 4*i); + x[11+i] = ld32(k, 16+4*i); + } + + for (i = 0; i < 16; i++) y[i] = x[i]; + + for (i = 0; i < 20; i++) { + for (j = 0; j < 4; j++) { + for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; + t[1] ^= L32((t[0]+t[3])|0, 7); + t[2] ^= L32((t[1]+t[0])|0, 9); + t[3] ^= L32((t[2]+t[1])|0,13); + t[0] ^= L32((t[3]+t[2])|0,18); + for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; + } + for (m = 0; m < 16; m++) x[m] = w[m]; + } + + if (h) { + for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + for (i = 0; i < 4; i++) { + x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; + x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; + } + for (i = 0; i < 4; i++) { + st32(out,4*i,x[5*i]); + st32(out,16+4*i,x[6+i]); + } + } else { + for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); + } +} + +function crypto_core_salsa20(out,inp,k,c) { + core(out,inp,k,c,false); + return 0; +} + +function crypto_core_hsalsa20(out,inp,k,c) { + core(out,inp,k,c,true); + return 0; +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + +function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + if (!b) return 0; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + if (m) mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + } + return 0; +} + +function crypto_stream_salsa20(c,cpos,d,n,k) { + return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); +} + +function crypto_stream(c,cpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); +} + +function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); +} + +function add1305(h, c) { + var j, u = 0; + for (j = 0; j < 17; j++) { + u = (u + ((h[j] + c[j]) | 0)) | 0; + h[j] = u & 255; + u >>>= 8; + } +} + +var minusp = new Uint32Array([ + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 +]); + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s, i, j, u; + var x = new Uint32Array(17), r = new Uint32Array(17), + h = new Uint32Array(17), c = new Uint32Array(17), + g = new Uint32Array(17); + for (j = 0; j < 17; j++) r[j]=h[j]=0; + for (j = 0; j < 16; j++) r[j]=k[j]; + r[3]&=15; + r[4]&=252; + r[7]&=15; + r[8]&=252; + r[11]&=15; + r[12]&=252; + r[15]&=15; + + while (n > 0) { + for (j = 0; j < 17; j++) c[j] = 0; + for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j]; + c[j] = 1; + mpos += j; n -= j; + add1305(h,c); + for (i = 0; i < 17; i++) { + x[i] = 0; + for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; + } + for (i = 0; i < 17; i++) h[i] = x[i]; + u = 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; h[16] = u & 3; + u = (5 * (u >>> 2)) | 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; h[16] = u; + } + + for (j = 0; j < 17; j++) g[j] = h[j]; + add1305(h,minusp); + s = (-(h[16] >>> 7) | 0); + for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + + for (j = 0; j < 16; j++) c[j] = k[j + 16]; + c[16] = 0; + add1305(h,c); + for (j = 0; j < 16; j++) out[outpos+j] = h[j]; + return 0; +} + +function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x,0,m,mpos,n,k); + return crypto_verify_16(h,hpos,x,0); +} + +function crypto_secretbox(c,m,d,n,k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c,0,m,0,d,n,k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; +} + +function crypto_secretbox_open(m,c,d,n,k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x,0,32,n,k); + if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; + crypto_stream_xor(m,0,c,0,d,n,k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i]|0; +} + +function car25519(o) { + var c; + var i; + for (i = 0; i < 16; i++) { + o[i] += 65536; + c = Math.floor(o[i] / 65536); + o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); + o[i] -= (c * 65536); + } +} + +function sel25519(p, q, b) { + var t, c = ~(b-1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); + m[i-1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); + b = (m[15]>>16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1-b); + } + for (i = 0; i < 16; i++) { + o[2*i] = t[i] & 0xff; + o[2*i+1] = t[i]>>8; + } +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); + o[15] &= 0x7fff; +} + +function A(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; +} + +function Z(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; +} + +function M(o, a, b) { + var i, j, t = new Float64Array(31); + for (i = 0; i < 31; i++) t[i] = 0; + for (i = 0; i < 16; i++) { + for (j = 0; j < 16; j++) { + t[i+j] += a[i] * b[j]; + } + } + for (i = 0; i < 15; i++) { + t[i] += 38 * t[i+16]; + } + for (i = 0; i < 16; i++) o[i] = t[i]; + car25519(o); + car25519(o); +} + +function S(o, a) { + M(o, a, a); +} + +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if(a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if(a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + for (i = 0; i < 16; i++) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for (i=254; i>=0; --i) { + r=(z[i>>>3]>>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + for (i = 0; i < 16; i++) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32,x32); + M(x16,x16,x32); + pack25519(q,x16); + return 0; +} + +function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); +} + +function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); +} + +function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); +} + +var crypto_box_afternm = crypto_secretbox; +var crypto_box_open_afternm = crypto_secretbox_open; + +function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); +} + +function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); +} + +function add64() { + var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; + for (i = 0; i < arguments.length; i++) { + l = arguments[i].lo; + h = arguments[i].hi; + a += (l & m16); b += (l >>> 16); + c += (h & m16); d += (h >>> 16); + } + + b += (a >>> 16); + c += (b >>> 16); + d += (c >>> 16); + + return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); +} + +function shr64(x, c) { + return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); +} + +function xor64() { + var l = 0, h = 0, i; + for (i = 0; i < arguments.length; i++) { + l ^= arguments[i].lo; + h ^= arguments[i].hi; + } + return new u64(h, l); +} + +function R(x, c) { + var h, l, c1 = 32 - c; + if (c < 32) { + h = (x.hi >>> c) | (x.lo << c1); + l = (x.lo >>> c) | (x.hi << c1); + } else if (c < 64) { + h = (x.lo >>> c) | (x.hi << c1); + l = (x.hi >>> c) | (x.lo << c1); + } + return new u64(h, l); +} + +function Ch(x, y, z) { + var h = (x.hi & y.hi) ^ (~x.hi & z.hi), + l = (x.lo & y.lo) ^ (~x.lo & z.lo); + return new u64(h, l); +} + +function Maj(x, y, z) { + var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), + l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); + return new u64(h, l); +} + +function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } +function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } +function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } +function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } + +var K = [ + new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), + new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), + new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), + new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), + new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), + new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), + new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), + new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), + new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), + new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), + new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), + new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), + new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), + new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), + new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), + new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), + new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), + new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), + new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), + new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), + new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), + new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), + new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), + new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), + new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), + new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), + new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), + new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), + new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), + new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), + new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), + new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), + new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), + new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), + new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), + new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), + new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), + new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), + new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), + new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) +]; + +function crypto_hashblocks(x, m, n) { + var z = [], b = [], a = [], w = [], t, i, j; + + for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); + for (i = 0; i < 80; i++) { + for (j = 0; j < 8; j++) b[j] = a[j]; + t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); + b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); + b[3] = add64(b[3], t); + for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; + if (i%16 === 15) { + for (j = 0; j < 16; j++) { + w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); + } + } + } + + for (i = 0; i < 8; i++) { + a[i] = add64(a[i], z[i]); + z[i] = a[i]; + } + + pos += 128; + n -= 128; + } + + for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); + return n; +} + +var iv = new Uint8Array([ + 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, + 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, + 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, + 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, + 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, + 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, + 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, + 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 +]); + +function crypto_hash(out, m, n) { + var h = new Uint8Array(64), x = new Uint8Array(256); + var i, b = n; + + for (i = 0; i < 64; i++) h[i] = iv[i]; + + crypto_hashblocks(h, m, n); + n %= 128; + + for (i = 0; i < 256; i++) x[i] = 0; + for (i = 0; i < n; i++) x[i] = m[b-n+i]; + x[n] = 128; + + n = 256-128*(n<112?1:0); + x[n-9] = 0; + ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3)); + crypto_hashblocks(h, x, n); + + for (i = 0; i < 64; i++) out[i] = h[i]; + + return 0; +} + +function add(p, q) { + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } +} + +function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i/8)|0] >> (i&7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } +} + +function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); +} + +function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; +} + +var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + +function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +function reduce(r) { + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); +} + +// Note: difference from C - smlen returned, not passed as argument. +function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n+32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i+j] += h[i] * d[j]; + } + } + + modL(sm.subarray(32), x); + return smlen; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; + + mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i+32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; +} + +var crypto_secretbox_KEYBYTES = 32, + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + +nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, + + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES +}; + +/* High-level API */ + +function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); +} + +function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); +} + +function checkArrayTypes() { + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } +} + +function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; +} + +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} + +nacl.randomBytes = function(n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; +}; + +nacl.secretbox = function(msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); +}; + +nacl.secretbox.open = function(box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); +}; + +nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; +nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; +nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + +nacl.scalarMult = function(n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; +}; + +nacl.scalarMult.base = function(n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; +}; + +nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; +nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + +nacl.box = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); +}; + +nacl.box.before = function(publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; +}; + +nacl.box.after = nacl.secretbox; + +nacl.box.open = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); +}; + +nacl.box.open.after = nacl.secretbox.open; + +nacl.box.keyPair = function() { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.box.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; +nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; +nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; +nacl.box.nonceLength = crypto_box_NONCEBYTES; +nacl.box.overheadLength = nacl.secretbox.overheadLength; + +nacl.sign = function(msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; +}; + +nacl.sign.open = function(signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; +}; + +nacl.sign.detached = function(msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; +}; + +nacl.sign.detached.verify = function(msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +}; + +nacl.sign.keyPair = function() { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.sign.keyPair.fromSeed = function(seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; +nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; +nacl.sign.seedLength = crypto_sign_SEEDBYTES; +nacl.sign.signatureLength = crypto_sign_BYTES; + +nacl.hash = function(msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; +}; + +nacl.hash.hashLength = crypto_hash_BYTES; + +nacl.verify = function(x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0) ? true : false; +}; + +nacl.setPRNG = function(fn) { + randombytes = fn; +}; + +(function() { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function(x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } +})(); + +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/node_modules/tweetnacl/nacl.min.js b/node_modules/tweetnacl/nacl.min.js new file mode 100644 index 0000000..4484974 --- /dev/null +++ b/node_modules/tweetnacl/nacl.min.js @@ -0,0 +1 @@ +!function(r){"use strict";function n(r,n){return r<>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new sr(e,t)}function o(r,n,e){var t;for(t=0;t<4;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;i>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),l=new Uint32Array(16),s=new Uint32Array(16),h=new Uint32Array(4);for(u=0;u<4;u++)l[5*u]=e(a,4*u),l[1+u]=e(i,4*u),l[6+u]=e(t,4*u),l[11+u]=e(i,16+4*u);for(u=0;u<16;u++)s[u]=l[u];for(u=0;u<20;u++){for(c=0;c<4;c++){for(w=0;w<4;w++)h[w]=l[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;w<4;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;w<16;w++)l[w]=y[w]}if(f){for(u=0;u<16;u++)l[u]=l[u]+s[u]|0;for(u=0;u<4;u++)l[5*u]=l[5*u]-e(a,4*u)|0,l[6+u]=l[6+u]-e(t,4*u)|0;for(u=0;u<4;u++)o(r,4*u,l[5*u]),o(r,16+4*u,l[6+u])}else for(u=0;u<16;u++)o(r,4*u,l[u]+s[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function l(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;u<16;u++)c[u]=0;for(u=0;u<8;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;u<64;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;u<16;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;u>>=8}function b(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),l=new Uint32Array(17),s=new Uint32Array(17),h=new Uint32Array(17);for(u=0;u<17;u++)y[u]=l[u]=0;for(u=0;u<16;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;u<17;u++)s[u]=0;for(u=0;u<16&&u>>=8;for(c=c+l[16]|0,l[16]=3&c,c=5*(c>>>2)|0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;c=c+l[16]|0,l[16]=c}for(u=0;u<17;u++)h[u]=l[u];for(v(l,Sr),a=0|-(l[16]>>>7),u=0;u<17;u++)l[u]^=a&(h[u]^l[u]);for(u=0;u<16;u++)s[u]=i[u+16];for(s[16]=0,v(l,s),u=0;u<16;u++)r[n+u]=l[u];return 0}function p(r,n,e,t,o,i){var a=new Uint8Array(16);return b(a,0,e,t,o,i),f(r,n,a,0)}function _(r,n,e,t,o){var i;if(e<32)return-1;for(g(r,0,n,0,e,t,o),b(r,16,r,32,e-32,r),i=0;i<16;i++)r[i]=0;return 0}function A(r,n,e,t,o){var i,a=new Uint8Array(32);if(e<32)return-1;if(h(a,0,32,t,o),0!==p(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;i<32;i++)r[i]=0;return 0}function U(r,n){var e;for(e=0;e<16;e++)r[e]=0|n[e]}function E(r){var n,e;for(e=0;e<16;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(e<15?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function d(r,n,e){for(var t,o=~(e-1),i=0;i<16;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;e<16;e++)a[e]=n[e];for(E(a),E(a),E(a),t=0;t<2;t++){for(i[0]=a[0]-65517,e=1;e<15;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(a,i,1-o)}for(e=0;e<16;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;e<16;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;t<31;t++)i[t]=0;for(t=0;t<16;t++)for(o=0;o<16;o++)i[t+o]+=n[t]*e[o];for(t=0;t<15;t++)i[t]+=38*i[t+16];for(t=0;t<16;t++)r[t]=i[t];E(r),E(r)}function L(r,n){Y(r,n,n)}function k(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function z(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function R(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),l=hr();for(o=0;o<31;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;o<16;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,d(f,u,t),d(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(l,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,l),Y(f,c,Ar),K(f,f,w),Y(c,c,f),Y(f,w,l),Y(w,u,a),L(u,y),d(f,u,t),d(c,w,t);for(o=0;o<16;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var s=a.subarray(32),h=a.subarray(16);return k(s,s),Y(h,h,s),x(r,h),0}function P(r,n){return R(r,n,br)}function O(r,n){return gr(n,32),P(r,n)}function F(r,n,e){var t=new Uint8Array(32);return R(t,e,n),y(r,vr,t,Br)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kr(r,n,e,t,a)}function C(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new sr(i&f|a<<16,t&f|o<<16)}function G(r,n){return new sr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function Z(){var r,n=0,e=0;for(r=0;r>>n|r.lo<>>n|r.hi<>>n|r.hi<>>n|r.lo<=128;){for(a=0;a<16;a++)y[a]=t(n,8*a+l);for(a=0;a<80;a++){for(f=0;f<8;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),q(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,V(w[0]),I(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;f<8;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;f<16;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;a<8;a++)w[a]=M(w[a],u[a]),u[a]=w[a];l+=128,e-=128}for(a=0;a<8;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;t<64;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;t<256;t++)a[t]=0;for(t=0;t=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];U(e[0],dr),U(e[1],xr),U(e[2],_r),Y(e[3],dr,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;t<32;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;o>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;o<32;o++)n[o]+=e-(n[31]>>4)*kr[o],e=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=e*kr[o];for(t=0;t<32;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;n<64;n++)e[n]=r[n];for(n=0;n<64;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;o>7&&T(r[0],pr,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,e<64)return-1;if(fr(w,t))return-1;for(o=0;o=0},r.sign.keyPair=function(){var r=new Uint8Array(Vr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(Vr),e=0;e/dev/null && browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null", + "lint": "eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js", + "test": "npm run test-node-all && npm run test-browser", + "test-browser": "NACL_SRC=${NACL_SRC:='nacl.min.js'} && npm run build-test-browser && cat $NACL_SRC test/browser/_bundle.js | tape-run | faucet", + "test-node": "tape test/*.js | faucet", + "test-node-all": "make -C test/c && tape test/*.js test/c/*.js | faucet" + }, + "types": "nacl.d.ts", + "version": "0.14.5" +} diff --git a/node_modules/type-is/HISTORY.md b/node_modules/type-is/HISTORY.md new file mode 100644 index 0000000..8de21f7 --- /dev/null +++ b/node_modules/type-is/HISTORY.md @@ -0,0 +1,259 @@ +1.6.18 / 2019-04-26 +=================== + + * Fix regression passing request object to `typeis.is` + +1.6.17 / 2019-04-25 +=================== + + * deps: mime-types@~2.1.24 + - Add Apple file extensions from IANA + - Add extension `.csl` to `application/vnd.citationstyles.style+xml` + - Add extension `.es` to `application/ecmascript` + - Add extension `.nq` to `application/n-quads` + - Add extension `.nt` to `application/n-triples` + - Add extension `.owl` to `application/rdf+xml` + - Add extensions `.siv` and `.sieve` to `application/sieve` + - Add extensions from IANA for `image/*` types + - Add extensions from IANA for `model/*` types + - Add extensions to HEIC image types + - Add new mime types + - Add `text/mdx` with extension `.mdx` + * perf: prevent internal `throw` on invalid type + +1.6.16 / 2018-02-16 +=================== + + * deps: mime-types@~2.1.18 + - Add `application/raml+yaml` with extension `.raml` + - Add `application/wasm` with extension `.wasm` + - Add `text/shex` with extension `.shex` + - Add extensions for JPEG-2000 images + - Add extensions from IANA for `message/*` types + - Add extension `.mjs` to `application/javascript` + - Add extension `.wadl` to `application/vnd.sun.wadl+xml` + - Add extension `.gz` to `application/gzip` + - Add glTF types and extensions + - Add new mime types + - Update extensions `.md` and `.markdown` to be `text/markdown` + - Update font MIME types + - Update `text/hjson` to registered `application/hjson` + +1.6.15 / 2017-03-31 +=================== + + * deps: mime-types@~2.1.15 + - Add new mime types + +1.6.14 / 2016-11-18 +=================== + + * deps: mime-types@~2.1.13 + - Add new mime types + +1.6.13 / 2016-05-18 +=================== + + * deps: mime-types@~2.1.11 + - Add new mime types + +1.6.12 / 2016-02-28 +=================== + + * deps: mime-types@~2.1.10 + - Add new mime types + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + +1.6.11 / 2016-01-29 +=================== + + * deps: mime-types@~2.1.9 + - Add new mime types + +1.6.10 / 2015-12-01 +=================== + + * deps: mime-types@~2.1.8 + - Add new mime types + +1.6.9 / 2015-09-27 +================== + + * deps: mime-types@~2.1.7 + - Add new mime types + +1.6.8 / 2015-09-04 +================== + + * deps: mime-types@~2.1.6 + - Add new mime types + +1.6.7 / 2015-08-20 +================== + + * Fix type error when given invalid type to match against + * deps: mime-types@~2.1.5 + - Add new mime types + +1.6.6 / 2015-07-31 +================== + + * deps: mime-types@~2.1.4 + - Add new mime types + +1.6.5 / 2015-07-16 +================== + + * deps: mime-types@~2.1.3 + - Add new mime types + +1.6.4 / 2015-07-01 +================== + + * deps: mime-types@~2.1.2 + - Add new mime types + * perf: enable strict mode + * perf: remove argument reassignment + +1.6.3 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - Add new mime types + * perf: reduce try block size + * perf: remove bitwise operations + +1.6.2 / 2015-05-10 +================== + + * deps: mime-types@~2.0.11 + - Add new mime types + +1.6.1 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - Add new mime types + +1.6.0 / 2015-02-12 +================== + + * fix false-positives in `hasBody` `Transfer-Encoding` check + * support wildcard for both type and subtype (`*/*`) + +1.5.7 / 2015-02-09 +================== + + * fix argument reassignment + * deps: mime-types@~2.0.9 + - Add new mime types + +1.5.6 / 2015-01-29 +================== + + * deps: mime-types@~2.0.8 + - Add new mime types + +1.5.5 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - Add new mime types + - Fix missing extensions + - Fix various invalid MIME type entries + - Remove example template MIME types + - deps: mime-db@~1.5.0 + +1.5.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - Add new mime types + - deps: mime-db@~1.3.0 + +1.5.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - Add new mime types + - deps: mime-db@~1.2.0 + +1.5.2 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - Add new mime types + - deps: mime-db@~1.1.0 + +1.5.1 / 2014-09-07 +================== + + * Support Node.js 0.6 + * deps: media-typer@0.3.0 + * deps: mime-types@~2.0.1 + - Support Node.js 0.6 + +1.5.0 / 2014-09-05 +================== + + * fix `hasbody` to be true for `content-length: 0` + +1.4.0 / 2014-09-02 +================== + + * update mime-types + +1.3.2 / 2014-06-24 +================== + + * use `~` range on mime-types + +1.3.1 / 2014-06-19 +================== + + * fix global variable leak + +1.3.0 / 2014-06-19 +================== + + * improve type parsing + + - invalid media type never matches + - media type not case-sensitive + - extra LWS does not affect results + +1.2.2 / 2014-06-19 +================== + + * fix behavior on unknown type argument + +1.2.1 / 2014-06-03 +================== + + * switch dependency from `mime` to `mime-types@1.0.0` + +1.2.0 / 2014-05-11 +================== + + * support suffix matching: + + - `+json` matches `application/vnd+json` + - `*/vnd+json` matches `application/vnd+json` + - `application/*+json` matches `application/vnd+json` + +1.1.0 / 2014-04-12 +================== + + * add non-array values support + * expose internal utilities: + + - `.is()` + - `.hasBody()` + - `.normalize()` + - `.match()` + +1.0.1 / 2014-03-30 +================== + + * add `multipart` as a shorthand diff --git a/node_modules/type-is/LICENSE b/node_modules/type-is/LICENSE new file mode 100644 index 0000000..386b7b6 --- /dev/null +++ b/node_modules/type-is/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/type-is/README.md b/node_modules/type-is/README.md new file mode 100644 index 0000000..b85ef8f --- /dev/null +++ b/node_modules/type-is/README.md @@ -0,0 +1,170 @@ +# type-is + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Infer the content-type of a request. + +### Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install type-is +``` + +## API + +```js +var http = require('http') +var typeis = require('type-is') + +http.createServer(function (req, res) { + var istext = typeis(req, ['text/*']) + res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') +}) +``` + +### typeis(request, types) + +Checks if the `request` is one of the `types`. If the request has no body, +even if there is a `Content-Type` header, then `null` is returned. If the +`Content-Type` header is invalid or does not matches any of the `types`, then +`false` is returned. Otherwise, a string of the type that matched is returned. + +The `request` argument is expected to be a Node.js HTTP request. The `types` +argument is an array of type strings. + +Each type in the `types` array can be one of the following: + +- A file extension name such as `json`. This name will be returned if matched. +- A mime type such as `application/json`. +- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. + The full mime type will be returned if matched. +- A suffix such as `+json`. This can be combined with a wildcard such as + `*/vnd+json` or `application/*+json`. The full mime type will be returned + if matched. + +Some examples to illustrate the inputs and returned value: + + + +```js +// req.headers.content-type = 'application/json' + +typeis(req, ['json']) // => 'json' +typeis(req, ['html', 'json']) // => 'json' +typeis(req, ['application/*']) // => 'application/json' +typeis(req, ['application/json']) // => 'application/json' + +typeis(req, ['html']) // => false +``` + +### typeis.hasBody(request) + +Returns a Boolean if the given `request` has a body, regardless of the +`Content-Type` header. + +Having a body has no relation to how large the body is (it may be 0 bytes). +This is similar to how file existence works. If a body does exist, then this +indicates that there is data to read from the Node.js request stream. + + + +```js +if (typeis.hasBody(req)) { + // read the body, since there is one + + req.on('data', function (chunk) { + // ... + }) +} +``` + +### typeis.is(mediaType, types) + +Checks if the `mediaType` is one of the `types`. If the `mediaType` is invalid +or does not matches any of the `types`, then `false` is returned. Otherwise, a +string of the type that matched is returned. + +The `mediaType` argument is expected to be a +[media type](https://tools.ietf.org/html/rfc6838) string. The `types` argument +is an array of type strings. + +Each type in the `types` array can be one of the following: + +- A file extension name such as `json`. This name will be returned if matched. +- A mime type such as `application/json`. +- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. + The full mime type will be returned if matched. +- A suffix such as `+json`. This can be combined with a wildcard such as + `*/vnd+json` or `application/*+json`. The full mime type will be returned + if matched. + +Some examples to illustrate the inputs and returned value: + + + +```js +var mediaType = 'application/json' + +typeis.is(mediaType, ['json']) // => 'json' +typeis.is(mediaType, ['html', 'json']) // => 'json' +typeis.is(mediaType, ['application/*']) // => 'application/json' +typeis.is(mediaType, ['application/json']) // => 'application/json' + +typeis.is(mediaType, ['html']) // => false +``` + +## Examples + +### Example body parser + +```js +var express = require('express') +var typeis = require('type-is') + +var app = express() + +app.use(function bodyParser (req, res, next) { + if (!typeis.hasBody(req)) { + return next() + } + + switch (typeis(req, ['urlencoded', 'json', 'multipart'])) { + case 'urlencoded': + // parse urlencoded body + throw new Error('implement urlencoded body parsing') + case 'json': + // parse json body + throw new Error('implement json body parsing') + case 'multipart': + // parse multipart body + throw new Error('implement multipart body parsing') + default: + // 415 error code + res.statusCode = 415 + res.end() + break + } +}) +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/type-is/master +[coveralls-url]: https://coveralls.io/r/jshttp/type-is?branch=master +[node-version-image]: https://badgen.net/npm/node/type-is +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/type-is +[npm-url]: https://npmjs.org/package/type-is +[npm-version-image]: https://badgen.net/npm/v/type-is +[travis-image]: https://badgen.net/travis/jshttp/type-is/master +[travis-url]: https://travis-ci.org/jshttp/type-is diff --git a/node_modules/type-is/index.js b/node_modules/type-is/index.js new file mode 100644 index 0000000..890ad76 --- /dev/null +++ b/node_modules/type-is/index.js @@ -0,0 +1,266 @@ +/*! + * type-is + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var typer = require('media-typer') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = typeofrequest +module.exports.is = typeis +module.exports.hasBody = hasbody +module.exports.normalize = normalize +module.exports.match = mimeMatch + +/** + * Compare a `value` content-type with `types`. + * Each `type` can be an extension like `html`, + * a special shortcut like `multipart` or `urlencoded`, + * or a mime type. + * + * If no types match, `false` is returned. + * Otherwise, the first `type` that matches is returned. + * + * @param {String} value + * @param {Array} types + * @public + */ + +function typeis (value, types_) { + var i + var types = types_ + + // remove parameters and normalize + var val = tryNormalizeType(value) + + // no type or invalid + if (!val) { + return false + } + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length - 1) + for (i = 0; i < types.length; i++) { + types[i] = arguments[i + 1] + } + } + + // no types, return the content type + if (!types || !types.length) { + return val + } + + var type + for (i = 0; i < types.length; i++) { + if (mimeMatch(normalize(type = types[i]), val)) { + return type[0] === '+' || type.indexOf('*') !== -1 + ? val + : type + } + } + + // no matches + return false +} + +/** + * Check if a request has a request body. + * A request with a body __must__ either have `transfer-encoding` + * or `content-length` headers set. + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 + * + * @param {Object} request + * @return {Boolean} + * @public + */ + +function hasbody (req) { + return req.headers['transfer-encoding'] !== undefined || + !isNaN(req.headers['content-length']) +} + +/** + * Check if the incoming request contains the "Content-Type" + * header field, and it contains any of the give mime `type`s. + * If there is no request body, `null` is returned. + * If there is no content type, `false` is returned. + * Otherwise, it returns the first `type` that matches. + * + * Examples: + * + * // With Content-Type: text/html; charset=utf-8 + * this.is('html'); // => 'html' + * this.is('text/html'); // => 'text/html' + * this.is('text/*', 'application/json'); // => 'text/html' + * + * // When Content-Type is application/json + * this.is('json', 'urlencoded'); // => 'json' + * this.is('application/json'); // => 'application/json' + * this.is('html', 'application/*'); // => 'application/json' + * + * this.is('html'); // => false + * + * @param {String|Array} types... + * @return {String|false|null} + * @public + */ + +function typeofrequest (req, types_) { + var types = types_ + + // no body + if (!hasbody(req)) { + return null + } + + // support flattened arguments + if (arguments.length > 2) { + types = new Array(arguments.length - 1) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i + 1] + } + } + + // request content type + var value = req.headers['content-type'] + + return typeis(value, types) +} + +/** + * Normalize a mime type. + * If it's a shorthand, expand it to a valid mime type. + * + * In general, you probably want: + * + * var type = is(req, ['urlencoded', 'json', 'multipart']); + * + * Then use the appropriate body parsers. + * These three are the most common request body types + * and are thus ensured to work. + * + * @param {String} type + * @private + */ + +function normalize (type) { + if (typeof type !== 'string') { + // invalid type + return false + } + + switch (type) { + case 'urlencoded': + return 'application/x-www-form-urlencoded' + case 'multipart': + return 'multipart/*' + } + + if (type[0] === '+') { + // "+json" -> "*/*+json" expando + return '*/*' + type + } + + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if `expected` mime type + * matches `actual` mime type with + * wildcard and +suffix support. + * + * @param {String} expected + * @param {String} actual + * @return {Boolean} + * @private + */ + +function mimeMatch (expected, actual) { + // invalid type + if (expected === false) { + return false + } + + // split types + var actualParts = actual.split('/') + var expectedParts = expected.split('/') + + // invalid format + if (actualParts.length !== 2 || expectedParts.length !== 2) { + return false + } + + // validate type + if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { + return false + } + + // validate suffix wildcard + if (expectedParts[1].substr(0, 2) === '*+') { + return expectedParts[1].length <= actualParts[1].length + 1 && + expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) + } + + // validate subtype + if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { + return false + } + + return true +} + +/** + * Normalize a type and remove parameters. + * + * @param {string} value + * @return {string} + * @private + */ + +function normalizeType (value) { + // parse the type + var type = typer.parse(value) + + // remove the parameters + type.parameters = undefined + + // reformat it + return typer.format(type) +} + +/** + * Try to normalize a type and remove parameters. + * + * @param {string} value + * @return {string} + * @private + */ + +function tryNormalizeType (value) { + if (!value) { + return null + } + + try { + return normalizeType(value) + } catch (err) { + return null + } +} diff --git a/node_modules/type-is/package.json b/node_modules/type-is/package.json new file mode 100644 index 0000000..6678ee5 --- /dev/null +++ b/node_modules/type-is/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "type-is@1.6.18", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "type-is@1.6.18", + "_id": "type-is@1.6.18", + "_inBundle": false, + "_integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "_location": "/type-is", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "type-is@1.6.18", + "name": "type-is", + "escapedName": "type-is", + "rawSpec": "1.6.18", + "saveSpec": null, + "fetchSpec": "1.6.18" + }, + "_requiredBy": [ + "/body-parser", + "/express" + ], + "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "_spec": "1.6.18", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/jshttp/type-is/issues" + }, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "description": "Infer the content-type of a request.", + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.0.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/type-is#readme", + "keywords": [ + "content", + "type", + "checking" + ], + "license": "MIT", + "name": "type-is", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/type-is.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "version": "1.6.18" +} diff --git a/node_modules/unc-path-regex/LICENSE b/node_modules/unc-path-regex/LICENSE new file mode 100644 index 0000000..65f90ac --- /dev/null +++ b/node_modules/unc-path-regex/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, Jon Schlinkert. + +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/unc-path-regex/README.md b/node_modules/unc-path-regex/README.md new file mode 100644 index 0000000..e0eddda --- /dev/null +++ b/node_modules/unc-path-regex/README.md @@ -0,0 +1,88 @@ +# unc-path-regex [![NPM version](https://badge.fury.io/js/unc-path-regex.svg)](http://badge.fury.io/js/unc-path-regex) [![Build Status](https://travis-ci.org/jonschlinkert/unc-path-regex.svg)](https://travis-ci.org/jonschlinkert/unc-path-regex) + +> Regular expression for testing if a file path is a windows UNC file path. Can also be used as a component of another regexp via the `.source` property. + +Visit the MSDN reference for [Common Data Types 2.2.57 UNC](https://msdn.microsoft.com/en-us/library/gg465305.aspx) for more information about UNC paths. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i unc-path-regex --save +``` + +## Usage + +```js +// unc-path-regex returns a function +var regex = require('unc-path-regex')(); +``` + +**true** + +Returns true for windows UNC paths: + +```js +regex.test('\\/foo/bar'); +regex.test('\\\\foo/bar'); +regex.test('\\\\foo\\admin$'); +regex.test('\\\\foo\\admin$\\system32'); +regex.test('\\\\foo\\temp'); +regex.test('\\\\/foo/bar'); +regex.test('\\\\\\/foo/bar'); +``` + +**false** + +Returns false for non-UNC paths: + +```js +regex.test('/foo/bar'); +regex.test('/'); +regex.test('/foo'); +regex.test('/foo/'); +regex.test('c:'); +regex.test('c:.'); +regex.test('c:./'); +regex.test('c:./file'); +regex.test('c:/'); +regex.test('c:/file'); +``` + +## Related projects + +* [dotfile-regex](https://github.com/regexps/dotfile-regex): Regular expresson for matching dotfiles. +* [dotdir-regex](https://github.com/regexps/dotdir-regex): Regex for matching dot-directories, like `.git/` +* [dirname-regex](https://github.com/regexps/dirname-regex): Regular expression for matching the directory part of a file path. +* [is-unc-path](https://github.com/jonschlinkert/is-unc-path): Returns true if a filepath is a windows UNC file path. +* [is-glob](https://github.com/jonschlinkert/is-glob): Returns `true` if the given string looks like a glob pattern. +* [path-regex](https://github.com/regexps/path-regex): Regular expression for matching the parts of a file path. + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/unc-path-regex/issues/new) + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on July 07, 2015._ \ No newline at end of file diff --git a/node_modules/unc-path-regex/index.js b/node_modules/unc-path-regex/index.js new file mode 100644 index 0000000..c268404 --- /dev/null +++ b/node_modules/unc-path-regex/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function uncPathRegex() { + return /^[\\\/]{2,}[^\\\/]+[\\\/]+[^\\\/]+/; +}; diff --git a/node_modules/unc-path-regex/package.json b/node_modules/unc-path-regex/package.json new file mode 100644 index 0000000..e2b9a87 --- /dev/null +++ b/node_modules/unc-path-regex/package.json @@ -0,0 +1,87 @@ +{ + "_args": [ + [ + "unc-path-regex@0.1.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "unc-path-regex@0.1.2", + "_id": "unc-path-regex@0.1.2", + "_inBundle": false, + "_integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "_location": "/unc-path-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "unc-path-regex@0.1.2", + "name": "unc-path-regex", + "escapedName": "unc-path-regex", + "rawSpec": "0.1.2", + "saveSpec": null, + "fetchSpec": "0.1.2" + }, + "_requiredBy": [ + "/is-unc-path" + ], + "_resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "_spec": "0.1.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/regexhq/unc-path-regex/issues" + }, + "description": "Regular expression for testing if a file path is a windows UNC file path. Can also be used as a component of another regexp via the `.source` property.", + "devDependencies": { + "mocha": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/regexhq/unc-path-regex", + "keywords": [ + "absolute", + "expression", + "file", + "filepath", + "match", + "matching", + "path", + "regex", + "regexp", + "regular", + "unc", + "win", + "windows" + ], + "license": "MIT", + "main": "index.js", + "name": "unc-path-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/regexhq/unc-path-regex.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "dotfile-regex", + "is-unc-path", + "unc-path-regex", + "dotdir-regex", + "path-regex", + "dirname-regex", + "is-glob" + ] + } + }, + "version": "0.1.2" +} diff --git a/node_modules/undefsafe/.jscsrc b/node_modules/undefsafe/.jscsrc new file mode 100644 index 0000000..9e01c9b --- /dev/null +++ b/node_modules/undefsafe/.jscsrc @@ -0,0 +1,13 @@ +{ + "preset": "node-style-guide", + "requireCapitalizedComments": null, + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningCurlyBrace": true, + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "excludeFiles": ["node_modules/**"], + "disallowSpacesInFunction": null +} diff --git a/node_modules/undefsafe/.jshintrc b/node_modules/undefsafe/.jshintrc new file mode 100644 index 0000000..b47f672 --- /dev/null +++ b/node_modules/undefsafe/.jshintrc @@ -0,0 +1,16 @@ +{ + "browser": false, + "camelcase": true, + "curly": true, + "devel": true, + "eqeqeq": true, + "forin": true, + "indent": 2, + "noarg": true, + "node": true, + "quotmark": "single", + "undef": true, + "strict": false, + "unused": true +} + diff --git a/node_modules/undefsafe/.npmignore b/node_modules/undefsafe/.npmignore new file mode 100644 index 0000000..5f6a848 --- /dev/null +++ b/node_modules/undefsafe/.npmignore @@ -0,0 +1,2 @@ +# .npmignore file +test/ diff --git a/node_modules/undefsafe/.travis.yml b/node_modules/undefsafe/.travis.yml new file mode 100644 index 0000000..a1ace24 --- /dev/null +++ b/node_modules/undefsafe/.travis.yml @@ -0,0 +1,18 @@ +sudo: false +language: node_js +cache: + directories: + - node_modules +notifications: + email: false +node_js: + - '4' +before_install: + - npm i -g npm@^2.0.0 +before_script: + - npm prune +after_success: + - npm run semantic-release +branches: + except: + - "/^v\\d+\\.\\d+\\.\\d+$/" diff --git a/node_modules/undefsafe/LICENSE b/node_modules/undefsafe/LICENSE new file mode 100644 index 0000000..caaf03a --- /dev/null +++ b/node_modules/undefsafe/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright © 2016 Remy Sharp, http://remysharp.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/undefsafe/README.md b/node_modules/undefsafe/README.md new file mode 100644 index 0000000..46a706b --- /dev/null +++ b/node_modules/undefsafe/README.md @@ -0,0 +1,63 @@ +# undefsafe + +Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined" + +Can also be used to safely set deep values. + +## Usage + +```js +var object = { + a: { + b: { + c: 1, + d: [1,2,3], + e: 'remy' + } + } +}; + +console.log(undefsafe(object, 'a.b.e')); // "remy" +console.log(undefsafe(object, 'a.b.not.found')); // undefined +``` + +Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console) + +## Setting + +```js +var object = { + a: { + b: [1,2,3] + } +}; + +// modified object +var res = undefsafe(object, 'a.b.0', 10); + +console.log(object); // { a: { b: [10, 2, 3] } } +console.log(res); // 1 - previous value +``` + +## Star rules in paths + +As of 1.2.0, `undefsafe` supports a `*` in the path if you want to search all of the properties (or array elements) for a particular element. + +The function will only return a single result, either the 3rd argument validation value, or the first positive match. For example, the following github data: + +```js +const githubData = { + commits: [{ + modified: [ + "one", + "two" + ] + }, /* ... */ ] + }; + +// first modified file found in the first commit +console.log(undefsafe(githubData, 'commits.*.modified.0')); + +// returns `two` or undefined if not found +console.log(undefsafe(githubData, 'commits.*.modified.*', 'two')); +``` diff --git a/node_modules/undefsafe/example.js b/node_modules/undefsafe/example.js new file mode 100644 index 0000000..922d8b9 --- /dev/null +++ b/node_modules/undefsafe/example.js @@ -0,0 +1,14 @@ +var undefsafe = require('undefsafe'); + +var object = { + a: { + b: { + c: 1, + d: [1,2,3], + e: 'remy' + } + } +}; + +console.log(undefsafe(object, 'a.b.e')); // "remy" +console.log(undefsafe(object, 'a.b.not.found')); // undefined diff --git a/node_modules/undefsafe/lib/undefsafe.js b/node_modules/undefsafe/lib/undefsafe.js new file mode 100644 index 0000000..0cfb5fd --- /dev/null +++ b/node_modules/undefsafe/lib/undefsafe.js @@ -0,0 +1,113 @@ +'use strict'; + +function undefsafe(obj, path, value, __res) { + + // I'm not super keen on this private function, but it's because + // it'll also be use in the browser and I wont *one* function exposed + function split(path) { + var res = []; + var level = 0; + var key = ''; + + for (var i = 0; i < path.length; i++) { + var c = path.substr(i, 1); + + if (level === 0 && (c === '.' || c === '[')) { + if (c === '[') { + level++; + i++; + c = path.substr(i, 1); + } + + if (key) { // the first value could be a string + res.push(key); + } + key = ''; + continue; + } + + if (c === ']') { + level--; + key = key.slice(0, -1); + continue; + } + + key += c; + } + + res.push(key); + + return res; + } + + // bail if there's nothing + if (obj === undefined || obj === null) { + return undefined; + } + + var parts = split(path); + var key = null; + var type = typeof obj; + var root = obj; + var parent = obj; + + var star = parts.filter(function (_) { return _ === '*' }).length > 0; + + // we're dealing with a primative + if (type !== 'object' && type !== 'function') { + return obj; + } else if (path.trim() === '') { + return obj; + } + + key = parts[0]; + var i = 0; + for (; i < parts.length; i++) { + key = parts[i]; + parent = obj; + + if (key === '*') { + // loop through each property + var prop = ''; + var res = __res || []; + + for (prop in parent) { + var shallowObj = undefsafe(obj[prop], parts.slice(i + 1).join('.'), value, res); + if (shallowObj && shallowObj !== res) { + if ((value && shallowObj === value) || (value === undefined)) { + if (value !== undefined) { + return shallowObj; + } + + res.push(shallowObj); + } + } + } + + if (res.length === 0) { + return undefined; + } + + return res; + } + + obj = obj[key]; + if (obj === undefined || obj === null) { + break; + } + } + + // if we have a null object, make sure it's the one the user was after, + // if it's not (i.e. parts has a length) then give undefined back. + if (obj === null && i !== parts.length - 1) { + obj = undefined; + } else if (!star && value) { + key = path.split('.').pop(); + parent[key] = value; + } + return obj; +} + +if (typeof module !== 'undefined') { + module.exports = undefsafe; +} diff --git a/node_modules/undefsafe/package.json b/node_modules/undefsafe/package.json new file mode 100644 index 0000000..997ad78 --- /dev/null +++ b/node_modules/undefsafe/package.json @@ -0,0 +1,67 @@ +{ + "_args": [ + [ + "undefsafe@2.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "undefsafe@2.0.2", + "_id": "undefsafe@2.0.2", + "_inBundle": false, + "_integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "_location": "/undefsafe", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "undefsafe@2.0.2", + "name": "undefsafe", + "escapedName": "undefsafe", + "rawSpec": "2.0.2", + "saveSpec": null, + "fetchSpec": "2.0.2" + }, + "_requiredBy": [ + "/nodemon" + ], + "_resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "_spec": "2.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Remy Sharp" + }, + "bugs": { + "url": "https://github.com/remy/undefsafe/issues" + }, + "dependencies": { + "debug": "^2.2.0" + }, + "description": "Undefined safe way of extracting object properties", + "devDependencies": { + "semantic-release": "^4.3.5", + "tap": "^5.7.1", + "tap-only": "0.0.5" + }, + "directories": { + "test": "test" + }, + "homepage": "https://github.com/remy/undefsafe#readme", + "keywords": [ + "undefined" + ], + "license": "MIT", + "main": "lib/undefsafe.js", + "name": "undefsafe", + "repository": { + "type": "git", + "url": "git+https://github.com/remy/undefsafe.git" + }, + "scripts": { + "cover": "tap test/*.test.js --cov --coverage-report=lcov", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "test": "tap test/**/*.test.js -R spec" + }, + "tonicExampleFilename": "example.js", + "version": "2.0.2" +} diff --git a/node_modules/union-value/LICENSE b/node_modules/union-value/LICENSE new file mode 100644 index 0000000..83b56e7 --- /dev/null +++ b/node_modules/union-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert + +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/union-value/README.md b/node_modules/union-value/README.md new file mode 100644 index 0000000..1a90ffb --- /dev/null +++ b/node_modules/union-value/README.md @@ -0,0 +1,73 @@ +# union-value [![NPM version](https://img.shields.io/npm/v/union-value.svg?style=flat)](https://www.npmjs.com/package/union-value) [![NPM monthly downloads](https://img.shields.io/npm/dm/union-value.svg?style=flat)](https://npmjs.org/package/union-value) [![NPM total downloads](https://img.shields.io/npm/dt/union-value.svg?style=flat)](https://npmjs.org/package/union-value) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/union-value.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/union-value) + +> Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save union-value +``` + +## Usage + +```js +var union = require('union-value'); + +var obj = {}; + +union(obj, 'a.b.c', ['one', 'two']); +union(obj, 'a.b.c', ['three']); + +console.log(obj); +//=> {a: {b: {c: [ 'one', 'two', 'three' ] }}} +``` + +## About + +### Related projects + +* [assign-value](https://www.npmjs.com/package/assign-value): Assign a value or extend a deeply nested property of an object using object path… [more](https://github.com/jonschlinkert/assign-value) | [homepage](https://github.com/jonschlinkert/assign-value "Assign a value or extend a deeply nested property of an object using object path notation.") +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://github.com/jonschlinkert/has-value) | [homepage](https://github.com/jonschlinkert/has-value "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [unset-value](https://www.npmjs.com/package/unset-value): Delete nested properties from an object using dot notation. | [homepage](https://github.com/jonschlinkert/unset-value "Delete nested properties from an object using dot notation.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.2, on February 25, 2017._ \ No newline at end of file diff --git a/node_modules/union-value/index.js b/node_modules/union-value/index.js new file mode 100644 index 0000000..9c5d8db --- /dev/null +++ b/node_modules/union-value/index.js @@ -0,0 +1,30 @@ +'use strict'; + +var isObject = require('is-extendable'); +var union = require('arr-union'); +var get = require('get-value'); +var set = require('set-value'); + +module.exports = function unionValue(obj, prop, value) { + if (!isObject(obj)) { + throw new TypeError('union-value expects the first argument to be an object.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('union-value expects `prop` to be a string.'); + } + + var arr = arrayify(get(obj, prop)); + set(obj, prop, union(arr, arrayify(value))); + return obj; +}; + +function arrayify(val) { + if (val === null || typeof val === 'undefined') { + return []; + } + if (Array.isArray(val)) { + return val; + } + return [val]; +} diff --git a/node_modules/union-value/package.json b/node_modules/union-value/package.json new file mode 100644 index 0000000..b389e8e --- /dev/null +++ b/node_modules/union-value/package.json @@ -0,0 +1,104 @@ +{ + "_args": [ + [ + "union-value@1.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "union-value@1.0.1", + "_id": "union-value@1.0.1", + "_inBundle": false, + "_integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "_location": "/union-value", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "union-value@1.0.1", + "name": "union-value", + "escapedName": "union-value", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/cache-base" + ], + "_resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "_spec": "1.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/union-value/issues" + }, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "description": "Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation.", + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.2.0", + "should": "^11.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/union-value", + "keywords": [ + "array", + "dot", + "get", + "has", + "nested", + "notation", + "object", + "path", + "prop", + "property", + "set", + "union", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "union-value", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/union-value.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assign-value", + "get-value", + "has-value", + "set-value", + "unset-value" + ] + }, + "lint": { + "reflinks": true + } + }, + "version": "1.0.1" +} diff --git a/node_modules/unique-string/index.js b/node_modules/unique-string/index.js new file mode 100644 index 0000000..5bc7787 --- /dev/null +++ b/node_modules/unique-string/index.js @@ -0,0 +1,4 @@ +'use strict'; +const cryptoRandomString = require('crypto-random-string'); + +module.exports = () => cryptoRandomString(32); diff --git a/node_modules/unique-string/license b/node_modules/unique-string/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/unique-string/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/unique-string/package.json b/node_modules/unique-string/package.json new file mode 100644 index 0000000..142e2de --- /dev/null +++ b/node_modules/unique-string/package.json @@ -0,0 +1,80 @@ +{ + "_args": [ + [ + "unique-string@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "unique-string@1.0.0", + "_id": "unique-string@1.0.0", + "_inBundle": false, + "_integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "_location": "/unique-string", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "unique-string@1.0.0", + "name": "unique-string", + "escapedName": "unique-string", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/configstore" + ], + "_resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/unique-string/issues" + }, + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "description": "Generate a unique random string", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/unique-string#readme", + "keywords": [ + "unique", + "string", + "random", + "uniq", + "str", + "rand", + "text", + "id", + "identifier", + "slug", + "hex" + ], + "license": "MIT", + "name": "unique-string", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/unique-string.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.0", + "xo": { + "esnext": true + } +} diff --git a/node_modules/unique-string/readme.md b/node_modules/unique-string/readme.md new file mode 100644 index 0000000..5d5ac97 --- /dev/null +++ b/node_modules/unique-string/readme.md @@ -0,0 +1,32 @@ +# unique-string [![Build Status](https://travis-ci.org/sindresorhus/unique-string.svg?branch=master)](https://travis-ci.org/sindresorhus/unique-string) + +> Generate a unique random string + + +## Install + +``` +$ npm install --save unique-string +``` + + +## Usage + +```js +const uniqueString = require('unique-string'); + +uniqueString(); +//=> 'b4de2a49c8ffa3fbee04446f045483b2' +``` + + +## API + +### uniqueString() + +Returns a 32 character unique string. Matches the length of MD5, which is [unique enough](http://stackoverflow.com/a/2444336/64949) for non-crypto purposes. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/unpipe/HISTORY.md b/node_modules/unpipe/HISTORY.md new file mode 100644 index 0000000..85e0f8d --- /dev/null +++ b/node_modules/unpipe/HISTORY.md @@ -0,0 +1,4 @@ +1.0.0 / 2015-06-14 +================== + + * Initial release diff --git a/node_modules/unpipe/LICENSE b/node_modules/unpipe/LICENSE new file mode 100644 index 0000000..aed0138 --- /dev/null +++ b/node_modules/unpipe/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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/unpipe/README.md b/node_modules/unpipe/README.md new file mode 100644 index 0000000..e536ad2 --- /dev/null +++ b/node_modules/unpipe/README.md @@ -0,0 +1,43 @@ +# unpipe + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Unpipe a stream from all destinations. + +## Installation + +```sh +$ npm install unpipe +``` + +## API + +```js +var unpipe = require('unpipe') +``` + +### unpipe(stream) + +Unpipes all destinations from a given stream. With stream 2+, this is +equivalent to `stream.unpipe()`. When used with streams 1 style streams +(typically Node.js 0.8 and below), this module attempts to undo the +actions done in `stream.pipe(dest)`. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/unpipe.svg +[npm-url]: https://npmjs.org/package/unpipe +[node-image]: https://img.shields.io/node/v/unpipe.svg +[node-url]: http://nodejs.org/download/ +[travis-image]: https://img.shields.io/travis/stream-utils/unpipe.svg +[travis-url]: https://travis-ci.org/stream-utils/unpipe +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/unpipe.svg +[coveralls-url]: https://coveralls.io/r/stream-utils/unpipe?branch=master +[downloads-image]: https://img.shields.io/npm/dm/unpipe.svg +[downloads-url]: https://npmjs.org/package/unpipe diff --git a/node_modules/unpipe/index.js b/node_modules/unpipe/index.js new file mode 100644 index 0000000..15c3d97 --- /dev/null +++ b/node_modules/unpipe/index.js @@ -0,0 +1,69 @@ +/*! + * unpipe + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = unpipe + +/** + * Determine if there are Node.js pipe-like data listeners. + * @private + */ + +function hasPipeDataListeners(stream) { + var listeners = stream.listeners('data') + + for (var i = 0; i < listeners.length; i++) { + if (listeners[i].name === 'ondata') { + return true + } + } + + return false +} + +/** + * Unpipe a stream from all destinations. + * + * @param {object} stream + * @public + */ + +function unpipe(stream) { + if (!stream) { + throw new TypeError('argument stream is required') + } + + if (typeof stream.unpipe === 'function') { + // new-style + stream.unpipe() + return + } + + // Node.js 0.8 hack + if (!hasPipeDataListeners(stream)) { + return + } + + var listener + var listeners = stream.listeners('close') + + for (var i = 0; i < listeners.length; i++) { + listener = listeners[i] + + if (listener.name !== 'cleanup' && listener.name !== 'onclose') { + continue + } + + // invoke the listener + listener.call(stream) + } +} diff --git a/node_modules/unpipe/package.json b/node_modules/unpipe/package.json new file mode 100644 index 0000000..962331d --- /dev/null +++ b/node_modules/unpipe/package.json @@ -0,0 +1,66 @@ +{ + "_args": [ + [ + "unpipe@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "unpipe@1.0.0", + "_id": "unpipe@1.0.0", + "_inBundle": false, + "_integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "_location": "/unpipe", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "unpipe@1.0.0", + "name": "unpipe", + "escapedName": "unpipe", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/finalhandler", + "/raw-body" + ], + "_resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/stream-utils/unpipe/issues" + }, + "description": "Unpipe a stream from all destinations", + "devDependencies": { + "istanbul": "0.3.15", + "mocha": "2.2.5", + "readable-stream": "1.1.13" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/stream-utils/unpipe#readme", + "license": "MIT", + "name": "unpipe", + "repository": { + "type": "git", + "url": "git+https://github.com/stream-utils/unpipe.git" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.0.0" +} diff --git a/node_modules/unset-value/LICENSE b/node_modules/unset-value/LICENSE new file mode 100644 index 0000000..ec85897 --- /dev/null +++ b/node_modules/unset-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 2017, Jon Schlinkert + +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/unset-value/README.md b/node_modules/unset-value/README.md new file mode 100644 index 0000000..f0fec3d --- /dev/null +++ b/node_modules/unset-value/README.md @@ -0,0 +1,131 @@ +# unset-value [![NPM version](https://img.shields.io/npm/v/unset-value.svg?style=flat)](https://www.npmjs.com/package/unset-value) [![NPM monthly downloads](https://img.shields.io/npm/dm/unset-value.svg?style=flat)](https://npmjs.org/package/unset-value) [![NPM total downloads](https://img.shields.io/npm/dt/unset-value.svg?style=flat)](https://npmjs.org/package/unset-value) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/unset-value.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/unset-value) + +> Delete nested properties from an object using dot notation. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save unset-value +``` + +## Usage + +```js +var unset = require('unset-value'); + +var obj = {a: {b: {c: 'd', e: 'f'}}}; +unset(obj, 'a.b.c'); +console.log(obj); +//=> {a: {b: {e: 'f'}}}; +``` + +## Examples + +### Updates the object when a property is deleted + +```js +var obj = {a: 'b'}; +unset(obj, 'a'); +console.log(obj); +//=> {} +``` + +### Returns true when a property is deleted + +```js +unset({a: 'b'}, 'a') // true +``` + +### Returns `true` when a property does not exist + +This is consistent with `delete` behavior in that it does not +throw when a property does not exist. + +```js +unset({a: {b: {c: 'd'}}}, 'd') // true +``` + +### delete nested values + +```js +var one = {a: {b: {c: 'd'}}}; +unset(one, 'a.b'); +console.log(one); +//=> {a: {}} + +var two = {a: {b: {c: 'd'}}}; +unset(two, 'a.b.c'); +console.log(two); +//=> {a: {b: {}}} + +var three = {a: {b: {c: 'd', e: 'f'}}}; +unset(three, 'a.b.c'); +console.log(three); +//=> {a: {b: {e: 'f'}}} +``` + +### throws on invalid args + +```js +unset(); +// 'expected an object.' +``` + +## About + +### Related projects + +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value "Use property paths (`a.b.c`) to get a nested value from an object.") +* [get-values](https://www.npmjs.com/package/get-values): Return an array of all values from the given object. | [homepage](https://github.com/jonschlinkert/get-values "Return an array of all values from the given object.") +* [omit-value](https://www.npmjs.com/package/omit-value): Omit properties from an object or deeply nested property of an object using object path… [more](https://github.com/jonschlinkert/omit-value) | [homepage](https://github.com/jonschlinkert/omit-value "Omit properties from an object or deeply nested property of an object using object path notation.") +* [put-value](https://www.npmjs.com/package/put-value): Update only existing values from an object, works with dot notation paths like `a.b.c` and… [more](https://github.com/tunnckocore/put-value#readme) | [homepage](https://github.com/tunnckocore/put-value#readme "Update only existing values from an object, works with dot notation paths like `a.b.c` and support deep nesting.") +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value "Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths.") +* [union-value](https://www.npmjs.com/package/union-value): Set an array of unique values as the property of an object. Supports setting deeply… [more](https://github.com/jonschlinkert/union-value) | [homepage](https://github.com/jonschlinkert/union-value "Set an array of unique values as the property of an object. Supports setting deeply nested properties using using object-paths/dot notation.") +* [upsert-value](https://www.npmjs.com/package/upsert-value): Update or set nested values and any intermediaries with dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/doowb/upsert-value "Update or set nested values and any intermediaries with dot notation (`'a.b.c'`) paths.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 6 | [jonschlinkert](https://github.com/jonschlinkert) | +| 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.2, on February 25, 2017._ \ No newline at end of file diff --git a/node_modules/unset-value/index.js b/node_modules/unset-value/index.js new file mode 100644 index 0000000..a919010 --- /dev/null +++ b/node_modules/unset-value/index.js @@ -0,0 +1,32 @@ +/*! + * unset-value + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isObject = require('isobject'); +var has = require('has-value'); + +module.exports = function unset(obj, prop) { + if (!isObject(obj)) { + throw new TypeError('expected an object.'); + } + if (obj.hasOwnProperty(prop)) { + delete obj[prop]; + return true; + } + + if (has(obj, prop)) { + var segs = prop.split('.'); + var last = segs.pop(); + while (segs.length && segs[segs.length - 1].slice(-1) === '\\') { + last = segs.pop().slice(0, -1) + '.' + last; + } + while (segs.length) obj = obj[prop = segs.shift()]; + return (delete obj[last]); + } + return true; +}; diff --git a/node_modules/unset-value/node_modules/has-value/LICENSE b/node_modules/unset-value/node_modules/has-value/LICENSE new file mode 100644 index 0000000..39245ac --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +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/unset-value/node_modules/has-value/README.md b/node_modules/unset-value/node_modules/has-value/README.md new file mode 100644 index 0000000..a927633 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/README.md @@ -0,0 +1,130 @@ +# has-value [![NPM version](https://img.shields.io/npm/v/has-value.svg?style=flat)](https://www.npmjs.com/package/has-value) [![NPM downloads](https://img.shields.io/npm/dm/has-value.svg?style=flat)](https://npmjs.org/package/has-value) [![Build Status](https://img.shields.io/travis/jonschlinkert/has-value.svg?style=flat)](https://travis-ci.org/jonschlinkert/has-value) + +> Returns true if a value exists, false if empty. Works with deeply nested values using object paths. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install has-value --save +``` + +**Works for:** + +* booleans +* functions +* numbers (pass `true` as the last arg to treat zero as a value instead of falsey) +* strings +* nulls +* object +* arrays + +## Usage + +Works with nested object paths or a single value: + +```js +var hasValue = require('has-value'); + +hasValue({a: {b: {c: 'foo'}}} 'a.b.c'); +//=> true + +hasValue('a'); +//=> true + +hasValue(''); +//=> false + +hasValue(1); +//=> true + +hasValue(0); +//=> false + +hasValue(0, true); // pass `true` as the last arg to treat zero as a value +//=> true + +hasValue({a: 'a'}}); +//=> true + +hasValue({}}); +//=> false + +hasValue(['a']); +//=> true + +hasValue([]); +//=> false + +hasValue(function(foo) {}); // function length/arity +//=> true + +hasValue(function() {}); +//=> false + +hasValue(true); +hasValue(false); +//=> true +``` + +## isEmpty + +To do the opposite and test for empty values, do: + +```js +function isEmpty(o, isZero) { + return !hasValue.apply(hasValue, arguments); +} +``` + +## Related projects + +You might also be interested in these projects: + +* [get-object](https://www.npmjs.com/package/get-object): Get a property from an object using dot (object path) notation. | [homepage](https://github.com/jonschlinkert/get-object) +* [get-property](https://www.npmjs.com/package/get-property): Get a nested property or its value from an object using simple `a.b.c` paths. | [homepage](https://github.com/jonschlinkert/get-property) +* [get-value](https://www.npmjs.com/package/get-value): Use property paths (`a.b.c`) to get a nested value from an object. | [homepage](https://github.com/jonschlinkert/get-value) +* [set-value](https://www.npmjs.com/package/set-value): Create nested values and any intermediaries using dot notation (`'a.b.c'`) paths. | [homepage](https://github.com/jonschlinkert/set-value) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/has-value/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/has-value/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v, on March 27, 2016._ \ No newline at end of file diff --git a/node_modules/unset-value/node_modules/has-value/index.js b/node_modules/unset-value/node_modules/has-value/index.js new file mode 100644 index 0000000..90687c8 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/index.js @@ -0,0 +1,19 @@ +/*! + * has-value + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var isObject = require('isobject'); +var hasValues = require('has-values'); +var get = require('get-value'); + +module.exports = function(obj, prop, noZero) { + if (isObject(obj)) { + return hasValues(get(obj, prop), noZero); + } + return hasValues(obj, prop); +}; diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE new file mode 100644 index 0000000..39245ac --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +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/unset-value/node_modules/has-value/node_modules/isobject/README.md b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md new file mode 100644 index 0000000..9dd897a --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/README.md @@ -0,0 +1,112 @@ +# isobject [![NPM version](https://img.shields.io/npm/v/isobject.svg?style=flat)](https://www.npmjs.com/package/isobject) [![NPM downloads](https://img.shields.io/npm/dm/isobject.svg?style=flat)](https://npmjs.org/package/isobject) [![Build Status](https://img.shields.io/travis/jonschlinkert/isobject.svg?style=flat)](https://travis-ci.org/jonschlinkert/isobject) + +Returns true if the value is an object and not an array or null. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install isobject --save +``` + +Use [is-plain-object](https://github.com/jonschlinkert/is-plain-object) if you want only objects that are created by the `Object` constructor. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install isobject +``` + +Install with [bower](http://bower.io/) + +```sh +$ bower install isobject +``` + +## Usage + +```js +var isObject = require('isobject'); +``` + +**True** + +All of the following return `true`: + +```js +isObject({}); +isObject(Object.create({})); +isObject(Object.create(Object.prototype)); +isObject(Object.create(null)); +isObject({}); +isObject(new Foo); +isObject(/foo/); +``` + +**False** + +All of the following return `false`: + +```js +isObject(); +isObject(function () {}); +isObject(1); +isObject([]); +isObject(undefined); +isObject(null); +``` + +## Related projects + +You might also be interested in these projects: + +[merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep) + +* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow) +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object) +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/isobject/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/isobject/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on April 25, 2016._ \ No newline at end of file diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js new file mode 100644 index 0000000..aa0dce0 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js @@ -0,0 +1,14 @@ +/*! + * isobject + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +var isArray = require('isarray'); + +module.exports = function isObject(val) { + return val != null && typeof val === 'object' && isArray(val) === false; +}; diff --git a/node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json new file mode 100644 index 0000000..408c277 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/node_modules/isobject/package.json @@ -0,0 +1,101 @@ +{ + "_args": [ + [ + "isobject@2.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "isobject@2.1.0", + "_id": "isobject@2.1.0", + "_inBundle": false, + "_integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "_location": "/unset-value/has-value/isobject", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "isobject@2.1.0", + "name": "isobject", + "escapedName": "isobject", + "rawSpec": "2.1.0", + "saveSpec": null, + "fetchSpec": "2.1.0" + }, + "_requiredBy": [ + "/unset-value/has-value" + ], + "_resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "_spec": "2.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/isobject/issues" + }, + "dependencies": { + "isarray": "1.0.0" + }, + "description": "Returns true if the value is an object and not an array or null.", + "devDependencies": { + "gulp-format-md": "^0.1.9", + "mocha": "^2.4.5" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/isobject", + "keywords": [ + "check", + "is", + "is-object", + "isobject", + "kind", + "kind-of", + "kindof", + "native", + "object", + "type", + "typeof", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "isobject", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/isobject.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "merge-deep", + "extend-shallow", + "is-plain-object", + "kind-of" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "reflinks": [ + "verb" + ] + }, + "version": "2.1.0" +} diff --git a/node_modules/unset-value/node_modules/has-value/package.json b/node_modules/unset-value/node_modules/has-value/package.json new file mode 100644 index 0000000..d494a34 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-value/package.json @@ -0,0 +1,117 @@ +{ + "_args": [ + [ + "has-value@0.3.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "has-value@0.3.1", + "_id": "has-value@0.3.1", + "_inBundle": false, + "_integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "_location": "/unset-value/has-value", + "_phantomChildren": { + "isarray": "1.0.0" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "has-value@0.3.1", + "name": "has-value", + "escapedName": "has-value", + "rawSpec": "0.3.1", + "saveSpec": null, + "fetchSpec": "0.3.1" + }, + "_requiredBy": [ + "/unset-value" + ], + "_resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "_spec": "0.3.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/has-value/issues" + }, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "description": "Returns true if a value exists, false if empty. Works with deeply nested values using object paths.", + "devDependencies": { + "gulp-format-md": "^0.1.7", + "mocha": "^2.4.5" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/has-value", + "keywords": [ + "array", + "boolean", + "empty", + "find", + "function", + "has", + "hasOwn", + "javascript", + "js", + "key", + "keys", + "node.js", + "null", + "number", + "object", + "properties", + "property", + "string", + "type", + "util", + "utilities", + "utility", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "has-value", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/has-value.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "get-object", + "get-property", + "get-value", + "set-value" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + }, + "version": "0.3.1" +} diff --git a/node_modules/unset-value/node_modules/has-values/LICENSE b/node_modules/unset-value/node_modules/has-values/LICENSE new file mode 100644 index 0000000..39245ac --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +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/unset-value/node_modules/has-values/README.md b/node_modules/unset-value/node_modules/has-values/README.md new file mode 100644 index 0000000..13319c5 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/README.md @@ -0,0 +1,114 @@ +# has-values [![NPM version](https://img.shields.io/npm/v/has-values.svg?style=flat)](https://www.npmjs.com/package/has-values) [![NPM downloads](https://img.shields.io/npm/dm/has-values.svg?style=flat)](https://npmjs.org/package/has-values) [![Build Status](https://img.shields.io/travis/jonschlinkert/has-values.svg?style=flat)](https://travis-ci.org/jonschlinkert/has-values) + +> Returns true if any values exist, false if empty. Works for booleans, functions, numbers, strings, nulls, objects and arrays. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install has-values --save +``` + +## Usage + +```js +var hasValue = require('has-values'); + +hasValue('a'); +//=> true + +hasValue(''); +//=> false + +hasValue(1); +//=> true + +hasValue(0); +//=> false + +hasValue(0, true); // treat zero as a value +//=> true + +hasValue({a: 'a'}}); +//=> true + +hasValue({}}); +//=> false + +hasValue(['a']); +//=> true + +hasValue([]); +//=> false + +hasValue(function(foo) {}); // function length/arity +//=> true + +hasValue(function() {}); +//=> false + +hasValue(true); +hasValue(false); +//=> true +``` + +## isEmpty + +To test for empty values, do: + +```js +function isEmpty(o, isZero) { + return !hasValue(o, isZero); +} +``` + +## Related projects + +You might also be interested in these projects: + +* [has-value](https://www.npmjs.com/package/has-value): Returns true if a value exists, false if empty. Works with deeply nested values using… [more](https://www.npmjs.com/package/has-value) | [homepage](https://github.com/jonschlinkert/has-value) +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object) +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject) + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/has-values/issues/new). + +## Building docs + +Generate readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install verb && npm run docs +``` + +Or, if [verb](https://github.com/verbose/verb) is installed globally: + +```sh +$ verb +``` + +## Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +## Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/has-values/blob/master/LICENSE). + +*** + +_This file was generated by [verb](https://github.com/verbose/verb), v, on March 27, 2016._ \ No newline at end of file diff --git a/node_modules/unset-value/node_modules/has-values/index.js b/node_modules/unset-value/node_modules/has-values/index.js new file mode 100644 index 0000000..6d04ba1 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/index.js @@ -0,0 +1,36 @@ +/*! + * has-values + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +module.exports = function hasValue(o, noZero) { + if (o === null || o === undefined) { + return false; + } + + if (typeof o === 'boolean') { + return true; + } + + if (typeof o === 'number') { + if (o === 0 && noZero === true) { + return false; + } + return true; + } + + if (o.length !== undefined) { + return o.length !== 0; + } + + for (var key in o) { + if (o.hasOwnProperty(key)) { + return true; + } + } + return false; +}; diff --git a/node_modules/unset-value/node_modules/has-values/package.json b/node_modules/unset-value/node_modules/has-values/package.json new file mode 100644 index 0000000..637e076 --- /dev/null +++ b/node_modules/unset-value/node_modules/has-values/package.json @@ -0,0 +1,109 @@ +{ + "_args": [ + [ + "has-values@0.1.4", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "has-values@0.1.4", + "_id": "has-values@0.1.4", + "_inBundle": false, + "_integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "_location": "/unset-value/has-values", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "has-values@0.1.4", + "name": "has-values", + "escapedName": "has-values", + "rawSpec": "0.1.4", + "saveSpec": null, + "fetchSpec": "0.1.4" + }, + "_requiredBy": [ + "/unset-value/has-value" + ], + "_resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "_spec": "0.1.4", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/has-values/issues" + }, + "description": "Returns true if any values exist, false if empty. Works for booleans, functions, numbers, strings, nulls, objects and arrays. ", + "devDependencies": { + "gulp-format-md": "^0.1.7", + "mocha": "^2.4.5" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/has-values", + "keywords": [ + "array", + "boolean", + "empty", + "find", + "function", + "has", + "hasOwn", + "javascript", + "js", + "key", + "keys", + "node.js", + "null", + "number", + "object", + "properties", + "property", + "string", + "type", + "util", + "utilities", + "utility", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "has-values", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/has-values.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "run": true, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "has-value", + "isobject", + "is-plain-object" + ] + }, + "reflinks": [ + "verb" + ], + "lint": { + "reflinks": true + } + }, + "version": "0.1.4" +} diff --git a/node_modules/unset-value/package.json b/node_modules/unset-value/package.json new file mode 100644 index 0000000..c109955 --- /dev/null +++ b/node_modules/unset-value/package.json @@ -0,0 +1,115 @@ +{ + "_args": [ + [ + "unset-value@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "unset-value@1.0.0", + "_id": "unset-value@1.0.0", + "_inBundle": false, + "_integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "_location": "/unset-value", + "_phantomChildren": { + "get-value": "2.0.6", + "isarray": "1.0.0" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "unset-value@1.0.0", + "name": "unset-value", + "escapedName": "unset-value", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/cache-base" + ], + "_resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/unset-value/issues" + }, + "contributors": [ + { + "email": "wtgtybhertgeghgtwtg@gmail.com", + "url": "https://github.com/wtgtybhertgeghgtwtg" + }, + { + "name": "Jon Schlinkert", + "email": "jon.schlinkert@sellside.com", + "url": "http://twitter.com/jonschlinkert" + } + ], + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "description": "Delete nested properties from an object using dot notation.", + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "*", + "should": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/unset-value", + "keywords": [ + "del", + "delete", + "key", + "object", + "omit", + "prop", + "property", + "remove", + "unset", + "value" + ], + "license": "MIT", + "main": "index.js", + "name": "unset-value", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/unset-value.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "get-value", + "get-values", + "omit-value", + "put-value", + "set-value", + "union-value", + "upsert-value" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + }, + "version": "1.0.0" +} diff --git a/node_modules/unzip-response/index.js b/node_modules/unzip-response/index.js new file mode 100644 index 0000000..e97b993 --- /dev/null +++ b/node_modules/unzip-response/index.js @@ -0,0 +1,36 @@ +'use strict'; +const PassThrough = require('stream').PassThrough; +const zlib = require('zlib'); + +module.exports = res => { + // TODO: use Array#includes when targeting Node.js 6 + if (['gzip', 'deflate'].indexOf(res.headers['content-encoding']) === -1) { + return res; + } + + const unzip = zlib.createUnzip(); + const stream = new PassThrough(); + + stream.httpVersion = res.httpVersion; + stream.headers = res.headers; + stream.rawHeaders = res.rawHeaders; + stream.trailers = res.trailers; + stream.rawTrailers = res.rawTrailers; + stream.setTimeout = res.setTimeout.bind(res); + stream.statusCode = res.statusCode; + stream.statusMessage = res.statusMessage; + stream.socket = res.socket; + + unzip.on('error', err => { + if (err.code === 'Z_BUF_ERROR') { + stream.end(); + return; + } + + stream.emit('error', err); + }); + + res.pipe(unzip).pipe(stream); + + return stream; +}; diff --git a/node_modules/unzip-response/license b/node_modules/unzip-response/license new file mode 100644 index 0000000..32a16ce --- /dev/null +++ b/node_modules/unzip-response/license @@ -0,0 +1,21 @@ +`The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/unzip-response/package.json b/node_modules/unzip-response/package.json new file mode 100644 index 0000000..778d330 --- /dev/null +++ b/node_modules/unzip-response/package.json @@ -0,0 +1,85 @@ +{ + "_args": [ + [ + "unzip-response@2.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "unzip-response@2.0.1", + "_id": "unzip-response@2.0.1", + "_inBundle": false, + "_integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "_location": "/unzip-response", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "unzip-response@2.0.1", + "name": "unzip-response", + "escapedName": "unzip-response", + "rawSpec": "2.0.1", + "saveSpec": null, + "fetchSpec": "2.0.1" + }, + "_requiredBy": [ + "/got" + ], + "_resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "_spec": "2.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/sindresorhus/unzip-response/issues" + }, + "description": "Unzip a HTTP response if needed", + "devDependencies": { + "ava": "*", + "get-stream": "^2.3.0", + "pify": "^2.3.0", + "rfpify": "^1.0.0", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/unzip-response#readme", + "keywords": [ + "http", + "unzip", + "zlib", + "gzip", + "deflate", + "incoming", + "message", + "response", + "stream" + ], + "license": "MIT", + "maintainers": [ + { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + { + "name": "Vsevolod Strukchinsky", + "email": "floatdrop@gmail.com", + "url": "github.com/floatdrop" + } + ], + "name": "unzip-response", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/unzip-response.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.1", + "xo": { + "esnext": true + } +} diff --git a/node_modules/unzip-response/readme.md b/node_modules/unzip-response/readme.md new file mode 100644 index 0000000..87a62c4 --- /dev/null +++ b/node_modules/unzip-response/readme.md @@ -0,0 +1,29 @@ +# unzip-response [![Build Status](https://travis-ci.org/sindresorhus/unzip-response.svg?branch=master)](https://travis-ci.org/sindresorhus/unzip-response) + +> Unzip a HTTP response if needed + +Unzips the response from [`http.request`](https://nodejs.org/api/http.html#http_http_request_options_callback) if it's gzipped/deflated, otherwise just passes it through. + + +## Install + +``` +$ npm install --save unzip-response +``` + + +## Usage + +```js +const http = require('http'); +const unzipResponse = require('unzip-response'); + +http.get('http://sindresorhus.com', res => { + res = unzipResponse(res); +}); +``` + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/update-notifier/check.js b/node_modules/update-notifier/check.js new file mode 100644 index 0000000..521f84a --- /dev/null +++ b/node_modules/update-notifier/check.js @@ -0,0 +1,22 @@ +/* eslint-disable unicorn/no-process-exit */ +'use strict'; +let updateNotifier = require('.'); + +const options = JSON.parse(process.argv[2]); + +updateNotifier = new updateNotifier.UpdateNotifier(options); + +updateNotifier.checkNpm().then(update => { + // Only update the last update check time on success + updateNotifier.config.set('lastUpdateCheck', Date.now()); + + if (update.type && update.type !== 'latest') { + updateNotifier.config.set('update', update); + } + + // Call process exit explicitly to terminate the child process + // Otherwise the child process will run forever, according to the Node.js docs + process.exit(); +}).catch(() => { + process.exit(1); +}); diff --git a/node_modules/update-notifier/index.js b/node_modules/update-notifier/index.js new file mode 100644 index 0000000..38ff01e --- /dev/null +++ b/node_modules/update-notifier/index.js @@ -0,0 +1,155 @@ +'use strict'; +const spawn = require('child_process').spawn; +const path = require('path'); +const format = require('util').format; +const importLazy = require('import-lazy')(require); + +const configstore = importLazy('configstore'); +const chalk = importLazy('chalk'); +const semverDiff = importLazy('semver-diff'); +const latestVersion = importLazy('latest-version'); +const isNpm = importLazy('is-npm'); +const isInstalledGlobally = importLazy('is-installed-globally'); +const boxen = importLazy('boxen'); +const xdgBasedir = importLazy('xdg-basedir'); +const isCi = importLazy('is-ci'); +const ONE_DAY = 1000 * 60 * 60 * 24; + +class UpdateNotifier { + constructor(options) { + options = options || {}; + this.options = options; + options.pkg = options.pkg || {}; + + // Reduce pkg to the essential keys. with fallback to deprecated options + // TODO: Remove deprecated options at some point far into the future + options.pkg = { + name: options.pkg.name || options.packageName, + version: options.pkg.version || options.packageVersion + }; + + if (!options.pkg.name || !options.pkg.version) { + throw new Error('pkg.name and pkg.version required'); + } + + this.packageName = options.pkg.name; + this.packageVersion = options.pkg.version; + this.updateCheckInterval = typeof options.updateCheckInterval === 'number' ? options.updateCheckInterval : ONE_DAY; + this.hasCallback = typeof options.callback === 'function'; + this.callback = options.callback || (() => {}); + this.disabled = 'NO_UPDATE_NOTIFIER' in process.env || + process.argv.indexOf('--no-update-notifier') !== -1 || + isCi(); + this.shouldNotifyInNpmScript = options.shouldNotifyInNpmScript; + + if (!this.disabled && !this.hasCallback) { + try { + const ConfigStore = configstore(); + this.config = new ConfigStore(`update-notifier-${this.packageName}`, { + optOut: false, + // Init with the current time so the first check is only + // after the set interval, so not to bother users right away + lastUpdateCheck: Date.now() + }); + } catch (err) { + // Expecting error code EACCES or EPERM + const msg = + chalk().yellow(format(' %s update check failed ', options.pkg.name)) + + format('\n Try running with %s or get access ', chalk().cyan('sudo')) + + '\n to the local update config store via \n' + + chalk().cyan(format(' sudo chown -R $USER:$(id -gn $USER) %s ', xdgBasedir().config)); + + process.on('exit', () => { + console.error('\n' + boxen()(msg, {align: 'center'})); + }); + } + } + } + check() { + if (this.hasCallback) { + this.checkNpm() + .then(update => this.callback(null, update)) + .catch(err => this.callback(err)); + return; + } + + if ( + !this.config || + this.config.get('optOut') || + this.disabled + ) { + return; + } + + this.update = this.config.get('update'); + + if (this.update) { + this.config.delete('update'); + } + + // Only check for updates on a set interval + if (Date.now() - this.config.get('lastUpdateCheck') < this.updateCheckInterval) { + return; + } + + // Spawn a detached process, passing the options as an environment property + spawn(process.execPath, [path.join(__dirname, 'check.js'), JSON.stringify(this.options)], { + detached: true, + stdio: 'ignore' + }).unref(); + } + checkNpm() { + return latestVersion()(this.packageName).then(latestVersion => { + return { + latest: latestVersion, + current: this.packageVersion, + type: semverDiff()(this.packageVersion, latestVersion) || 'latest', + name: this.packageName + }; + }); + } + notify(opts) { + const suppressForNpm = !this.shouldNotifyInNpmScript && isNpm(); + if (!process.stdout.isTTY || suppressForNpm || !this.update) { + return this; + } + + opts = Object.assign({isGlobal: isInstalledGlobally()}, opts); + + opts.message = opts.message || 'Update available ' + chalk().dim(this.update.current) + chalk().reset(' → ') + + chalk().green(this.update.latest) + ' \nRun ' + chalk().cyan('npm i ' + (opts.isGlobal ? '-g ' : '') + this.packageName) + ' to update'; + + opts.boxenOpts = opts.boxenOpts || { + padding: 1, + margin: 1, + align: 'center', + borderColor: 'yellow', + borderStyle: 'round' + }; + + const message = '\n' + boxen()(opts.message, opts.boxenOpts); + + if (opts.defer === false) { + console.error(message); + } else { + process.on('exit', () => { + console.error(message); + }); + + process.on('SIGINT', () => { + console.error(''); + process.exit(); + }); + } + + return this; + } +} + +module.exports = options => { + const updateNotifier = new UpdateNotifier(options); + updateNotifier.check(); + return updateNotifier; +}; + +module.exports.UpdateNotifier = UpdateNotifier; diff --git a/node_modules/update-notifier/license b/node_modules/update-notifier/license new file mode 100644 index 0000000..cea5a35 --- /dev/null +++ b/node_modules/update-notifier/license @@ -0,0 +1,9 @@ +Copyright Google + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/update-notifier/package.json b/node_modules/update-notifier/package.json new file mode 100644 index 0000000..9a98c5d --- /dev/null +++ b/node_modules/update-notifier/package.json @@ -0,0 +1,91 @@ +{ + "_args": [ + [ + "update-notifier@2.5.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "update-notifier@2.5.0", + "_id": "update-notifier@2.5.0", + "_inBundle": false, + "_integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "_location": "/update-notifier", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "update-notifier@2.5.0", + "name": "update-notifier", + "escapedName": "update-notifier", + "rawSpec": "2.5.0", + "saveSpec": null, + "fetchSpec": "2.5.0" + }, + "_requiredBy": [ + "/nodemon" + ], + "_resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "_spec": "2.5.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/yeoman/update-notifier/issues" + }, + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "description": "Update notifications for your CLI app", + "devDependencies": { + "ava": "*", + "clear-module": "^2.1.0", + "fixture-stdout": "^0.2.1", + "mock-require": "^2.0.2", + "strip-ansi": "^4.0.0", + "xo": "^0.18.2" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js", + "check.js" + ], + "homepage": "https://github.com/yeoman/update-notifier#readme", + "keywords": [ + "npm", + "update", + "updater", + "notify", + "notifier", + "check", + "checker", + "cli", + "module", + "package", + "version" + ], + "license": "BSD-2-Clause", + "name": "update-notifier", + "repository": { + "type": "git", + "url": "git+https://github.com/yeoman/update-notifier.git" + }, + "scripts": { + "test": "xo && ava --timeout=20s" + }, + "version": "2.5.0" +} diff --git a/node_modules/update-notifier/readme.md b/node_modules/update-notifier/readme.md new file mode 100644 index 0000000..ef6a1a8 --- /dev/null +++ b/node_modules/update-notifier/readme.md @@ -0,0 +1,193 @@ +# update-notifier [![Build Status](https://travis-ci.org/yeoman/update-notifier.svg?branch=master)](https://travis-ci.org/yeoman/update-notifier) + +> Update notifications for your CLI app + +![](screenshot.png) + +Inform users of your package of updates in a non-intrusive way. + +#### Contents + +- [Install](#install) +- [Usage](#usage) +- [How](#how) +- [API](#api) +- [About](#about) +- [Users](#users) + + +## Install + +``` +$ npm install update-notifier +``` + + +## Usage + +### Simple + +```js +const updateNotifier = require('update-notifier'); +const pkg = require('./package.json'); + +updateNotifier({pkg}).notify(); +``` + +### Comprehensive + +```js +const updateNotifier = require('update-notifier'); +const pkg = require('./package.json'); + +// Checks for available update and returns an instance +const notifier = updateNotifier({pkg}); + +// Notify using the built-in convenience method +notifier.notify(); + +// `notifier.update` contains some useful info about the update +console.log(notifier.update); +/* +{ + latest: '1.0.1', + current: '1.0.0', + type: 'patch', // Possible values: latest, major, minor, patch, prerelease, build + name: 'pageres' +} +*/ +``` + +### Options and custom message + +```js +const notifier = updateNotifier({ + pkg, + updateCheckInterval: 1000 * 60 * 60 * 24 * 7 // 1 week +}); + +if (notifier.update) { + console.log(`Update available: ${notifier.update.latest}`); +} +``` + + +## How + +Whenever you initiate the update notifier and it's not within the interval threshold, it will asynchronously check with npm in the background for available updates, then persist the result. The next time the notifier is initiated, the result will be loaded into the `.update` property. This prevents any impact on your package startup performance. +The update check is done in a unref'ed [child process](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options). This means that if you call `process.exit`, the check will still be performed in its own process. + +The first time the user runs your app, it will check for an update, and even if an update is available, it will wait the specified `updateCheckInterval` before notifying the user. This is done to not be annoying to the user, but might surprise you as an implementer if you're testing whether it works. Check out [`example.js`](example.js) to quickly test out `update-notifier` and see how you can test that it works in your app. + + +## API + +### notifier = updateNotifier(options) + +Checks if there is an available update. Accepts options defined below. Returns an instance with an `.update` property there is an available update, otherwise `undefined`. + +### options + +#### pkg + +Type: `Object` + +##### name + +*Required*
    +Type: `string` + +##### version + +*Required*
    +Type: `string` + +#### updateCheckInterval + +Type: `number`
    +Default: `1000 * 60 * 60 * 24` *(1 day)* + +How often to check for updates. + +#### callback(error, update) + +Type: `Function` + +Passing a callback here will make it check for an update directly and report right away. Not recommended as you won't get the benefits explained in [`How`](#how). `update` is equal to `notifier.update`. + +### notifier.notify([options]) + +Convenience method to display a notification message. *(See screenshot)* + +Only notifies if there is an update and the process is [TTY](https://nodejs.org/api/process.html#process_tty_terminals_and_process_stdout). + +#### options + +Type: `Object` + +##### defer + +Type: `boolean`
    +Default: `true` + +Defer showing the notification to after the process has exited. + +##### message + +Type: `string`
    +Default: [See above screenshot](https://github.com/yeoman/update-notifier#update-notifier-) + +Message that will be shown when an update is available. + +##### isGlobal + +Type: `boolean`
    +Default: `true` + +Include the `-g` argument in the default message's `npm i` recommendation. You may want to change this if your CLI package can be installed as a dependency of another project, and don't want to recommend a global installation. This option is ignored if you supply your own `message` (see above). + +##### boxenOpts + +Type: `Object`
    +Default: `{padding: 1, margin: 1, align: 'center', borderColor: 'yellow', borderStyle: 'round'}` *(See screenshot)* + +Options object that will be passed to [`boxen`](https://github.com/sindresorhus/boxen). + +##### shouldNotifyInNpmScript + +Type: `boolean`
    +Default: `false` + +Allows notification to be shown when running as an npm script. + +### User settings + +Users of your module have the ability to opt-out of the update notifier by changing the `optOut` property to `true` in `~/.config/configstore/update-notifier-[your-module-name].json`. The path is available in `notifier.config.path`. + +Users can also opt-out by [setting the environment variable](https://github.com/sindresorhus/guides/blob/master/set-environment-variables.md) `NO_UPDATE_NOTIFIER` with any value or by using the `--no-update-notifier` flag on a per run basis. + +The check is also skipped on CI automatically. + + +## About + +The idea for this module came from the desire to apply the browser update strategy to CLI tools, where everyone is always on the latest version. We first tried automatic updating, which we discovered wasn't popular. This is the second iteration of that idea, but limited to just update notifications. + + +## Users + +There are a bunch projects using it: + +- [npm](https://github.com/npm/npm) - Package manager for JavaScript +- [Yeoman](http://yeoman.io) - Modern workflows for modern webapps +- [AVA](https://ava.li) - Simple concurrent test runner +- [XO](https://github.com/xojs/xo) - JavaScript happiness style linter +- [Pageres](https://github.com/sindresorhus/pageres) - Capture website screenshots +- [Node GH](http://nodegh.io) - GitHub command line tool + +[And 1600+ more…](https://www.npmjs.org/browse/depended/update-notifier) + + +## License + +BSD-2-Clause © Google diff --git a/node_modules/uri-js/README.md b/node_modules/uri-js/README.md new file mode 100644 index 0000000..3f225e7 --- /dev/null +++ b/node_modules/uri-js/README.md @@ -0,0 +1,199 @@ +# URI.js + +URI.js is an [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt) compliant, scheme extendable URI parsing/validating/resolving library for all JavaScript environments (browsers, Node.js, etc). +It is also compliant with the IRI ([RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)), IDNA ([RFC 5890](http://www.ietf.org/rfc/rfc5890.txt)), IPv6 Address ([RFC 5952](http://www.ietf.org/rfc/rfc5952.txt)), IPv6 Zone Identifier ([RFC 6874](http://www.ietf.org/rfc/rfc6874.txt)) specifications. + +URI.js has an extensive test suite, and works in all (Node.js, web) environments. It weighs in at 6.2kb (gzipped, 16kb deflated). + +## API + +### Parsing + + URI.parse("uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body"); + //returns: + //{ + // scheme : "uri", + // userinfo : "user:pass", + // host : "example.com", + // port : 123, + // path : "/one/two.three", + // query : "q1=a1&q2=a2", + // fragment : "body" + //} + +### Serializing + + URI.serialize({scheme : "http", host : "example.com", fragment : "footer"}) === "http://example.com/#footer" + +### Resolving + + URI.resolve("uri://a/b/c/d?q", "../../g") === "uri://a/g" + +### Normalizing + + URI.normalize("HTTP://ABC.com:80/%7Esmith/home.html") === "http://abc.com/~smith/home.html" + +### Comparison + + URI.equal("example://a/b/c/%7Bfoo%7D", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d") === true + +### IP Support + + //IPv4 normalization + URI.normalize("//192.068.001.000") === "//192.68.1.0" + + //IPv6 normalization + URI.normalize("//[2001:0:0DB8::0:0001]") === "//[2001:0:db8::1]" + + //IPv6 zone identifier support + URI.parse("//[2001:db8::7%25en1]"); + //returns: + //{ + // host : "2001:db8::7%en1" + //} + +### IRI Support + + //convert IRI to URI + URI.serialize(URI.parse("http://examplé.org/rosé")) === "http://xn--exampl-gva.org/ros%C3%A9" + //convert URI to IRI + URI.serialize(URI.parse("http://xn--exampl-gva.org/ros%C3%A9"), {iri:true}) === "http://examplé.org/rosé" + +### Options + +All of the above functions can accept an additional options argument that is an object that can contain one or more of the following properties: + +* `scheme` (string) + + Indicates the scheme that the URI should be treated as, overriding the URI's normal scheme parsing behavior. + +* `reference` (string) + + If set to `"suffix"`, it indicates that the URI is in the suffix format, and the validator will use the option's `scheme` property to determine the URI's scheme. + +* `tolerant` (boolean, false) + + If set to `true`, the parser will relax URI resolving rules. + +* `absolutePath` (boolean, false) + + If set to `true`, the serializer will not resolve a relative `path` component. + +* `iri` (boolean, false) + + If set to `true`, the serializer will unescape non-ASCII characters as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt). + +* `unicodeSupport` (boolean, false) + + If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt). + +* `domainHost` (boolean, false) + + If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt). + +## Scheme Extendable + +URI.js supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme) dependent processing rules. Currently, URI.js has built in support for the following schemes: + +* http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\] +* https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\] +* mailto \[[RFC 6068](http://www.ietf.org/rfc/rfc6068.txt)\] +* urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\] +* urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\] + +### HTTP Support + + URI.equal("HTTP://ABC.COM:80", "http://abc.com/") === true + +### Mailto Support + + URI.parse("mailto:alpha@example.com,bravo@example.com?subject=SUBSCRIBE&body=Sign%20me%20up!"); + //returns: + //{ + // scheme : "mailto", + // to : ["alpha@example.com", "bravo@example.com"], + // subject : "SUBSCRIBE", + // body : "Sign me up!" + //} + + URI.serialize({ + scheme : "mailto", + to : ["alpha@example.com"], + subject : "REMOVE", + body : "Please remove me", + headers : { + cc : "charlie@example.com" + } + }) === "mailto:alpha@example.com?cc=charlie@example.com&subject=REMOVE&body=Please%20remove%20me" + +### URN Support + + URI.parse("urn:example:foo"); + //returns: + //{ + // scheme : "urn", + // nid : "example", + // nss : "foo", + //} + +#### URN UUID Support + + URI.parse("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + //returns: + //{ + // scheme : "urn", + // nid : "example", + // uuid : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6", + //} + +## Usage + +To load in a browser, use the following tag: + + + +To load in a CommonJS (Node.js) environment, first install with npm by running on the command line: + + npm install uri-js + +Then, in your code, load it using: + + const URI = require("uri-js"); + +If you are writing your code in ES6+ (ESNEXT) or TypeScript, you would load it using: + + import * as URI from "uri-js"; + +Or you can load just what you need using named exports: + + import { parse, serialize, resolve, resolveComponents, normalize, equal, removeDotSegments, pctEncChar, pctDecChars, escapeComponent, unescapeComponent } from "uri-js"; + +## Breaking changes + +### Breaking changes from 3.x + +URN parsing has been completely changed to better align with the specification. Scheme is now always `urn`, but has two new properties: `nid` which contains the Namspace Identifier, and `nss` which contains the Namespace Specific String. The `nss` property will be removed by higher order scheme handlers, such as the UUID URN scheme handler. + +The UUID of a URN can now be found in the `uuid` property. + +### Breaking changes from 2.x + +URI validation has been removed as it was slow, exposed a vulnerabilty, and was generally not useful. + +### Breaking changes from 1.x + +The `errors` array on parsed components is now an `error` string. + +## License ([Simplified BSD](http://en.wikipedia.org/wiki/BSD_licenses#2-clause)) + +Copyright 2011 Gary Court. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY GARY COURT "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 GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. diff --git a/node_modules/uri-js/bower.json b/node_modules/uri-js/bower.json new file mode 100644 index 0000000..7a40440 --- /dev/null +++ b/node_modules/uri-js/bower.json @@ -0,0 +1,47 @@ +{ + "name": "uri-js", + "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.", + "main": "dist/es5/uri.all.js", + "moduleType": [ + "globals", + "amd", + "node", + "es6" + ], + "authors": [ + "Gary Court " + ], + "license": "BSD-2-Clause", + "keywords": [ + "URI", + "IRI", + "IDN", + "URN", + "HTTP", + "HTTPS", + "MAILTO", + "RFC3986", + "RFC3987", + "RFC5891", + "RFC2616", + "RFC2818", + "RFC2141", + "RFC4122", + "RFC6068" + ], + "homepage": "https://github.com/garycourt/uri-js", + "repository": { + "type": "git", + "url": "http://github.com/garycourt/uri-js" + }, + "dependencies": { + "punycode": "^2.1.0" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/node_modules/uri-js/dist/es5/uri.all.d.ts b/node_modules/uri-js/dist/es5/uri.all.d.ts new file mode 100644 index 0000000..320f534 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/node_modules/uri-js/dist/es5/uri.all.js b/node_modules/uri-js/dist/es5/uri.all.js new file mode 100644 index 0000000..2df0609 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.js @@ -0,0 +1,1389 @@ +/** @license URI.js v4.2.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.URI = global.URI || {}))); +}(this, (function (exports) { 'use strict'; + +function merge() { + for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) { + sets[_key] = arguments[_key]; + } + + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } else { + return sets[0]; + } +} +function subexp(str) { + return "(?:" + str + ")"; +} +function typeOf(o) { + return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase(); +} +function toUpperCase(str) { + return str.toUpperCase(); +} +function toArray(obj) { + return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : []; +} +function assign(target, source) { + var obj = target; + if (source) { + for (var key in source) { + obj[key] = source[key]; + } + } + return obj; +} + +function buildExps(isIRI) { + var ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), + //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), + //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), + UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", + //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", + //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), + SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), + //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), + // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), + // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), + //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), + //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), + //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), + //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), + //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), + //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), + //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), + ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), + //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), + //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), + //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), + //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), + PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), + PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), + //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), + //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), + //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), + FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), + RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", + SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +var URI_PROTOCOL = buildExps(false); + +var IRI_PROTOCOL = buildExps(true); + +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); + + + + + + + + + + + + + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** Highest positive signed 32-bit float value */ + +var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +var base = 36; +var tMin = 1; +var tMax = 26; +var skew = 38; +var damp = 700; +var initialBias = 72; +var initialN = 128; // 0x80 +var delimiter = '-'; // '\x2D' + +/** Regular expressions */ +var regexPunycode = /^xn--/; +var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +var errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +var baseMinusTMin = base - tMin; +var floor = Math.floor; +var stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error$1(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + var result = []; + var length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + var output = []; + var counter = 0; + var length = string.length; + while (counter < length) { + var value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + var extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +var ucs2encode = function ucs2encode(array) { + return String.fromCodePoint.apply(String, toConsumableArray(array)); +}; + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +var basicToDigit = function basicToDigit(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +var digitToBasic = function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +var adapt = function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +var decode = function decode(input) { + // Don't use UCS-2. + var output = []; + var inputLength = input.length; + var i = 0; + var n = initialN; + var bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + var basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (var j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error$1('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{ + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + var oldi = i; + for (var w = 1, k = base;; /* no condition */k += base) { + + if (index >= inputLength) { + error$1('invalid-input'); + } + + var digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error$1('overflow'); + } + + i += digit * w; + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (digit < t) { + break; + } + + var baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error$1('overflow'); + } + + w *= baseMinusT; + } + + var out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error$1('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + } + + return String.fromCodePoint.apply(String, output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +var encode = function encode(input) { + var output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + var inputLength = input.length; + + // Initialize the state. + var n = initialN; + var delta = 0; + var bias = initialBias; + + // Handle the basic code points. + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _currentValue2 = _step.value; + + if (_currentValue2 < 0x80) { + output.push(stringFromCharCode(_currentValue2)); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var basicLength = output.length; + var handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + var m = maxInt; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var currentValue = _step2.value; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + var handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error$1('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _currentValue = _step3.value; + + if (_currentValue < n && ++delta > maxInt) { + error$1('overflow'); + } + if (_currentValue == n) { + // Represent delta as a generalized variable-length integer. + var q = delta; + for (var k = base;; /* no condition */k += base) { + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + var qMinusT = q - t; + var baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + ++delta; + ++n; + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +var toUnicode = function toUnicode(input) { + return mapDomain(input, function (string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +var toASCII = function toASCII(input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +var punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``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 GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +var SCHEMES = {}; +function pctEncChar(chr) { + var c = chr.charCodeAt(0); + var e = void 0; + if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); + return e; +} +function pctDecChars(str) { + var newStr = ""; + var i = 0; + var il = str.length; + while (i < il) { + var c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } else if (c >= 194 && c < 224) { + if (il - i >= 6) { + var c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode((c & 31) << 6 | c2 & 63); + } else { + newStr += str.substr(i, 6); + } + i += 6; + } else if (c >= 224) { + if (il - i >= 9) { + var _c = parseInt(str.substr(i + 4, 2), 16); + var c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63); + } else { + newStr += str.substr(i, 9); + } + i += 9; + } else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(protocol.UNRESERVED) ? str : decStr; + } + if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} + +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + var matches = host.match(protocol.IPV4ADDRESS) || []; + + var _matches = slicedToArray(matches, 2), + address = _matches[1]; + + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + var matches = host.match(protocol.IPV6ADDRESS) || []; + + var _matches2 = slicedToArray(matches, 3), + address = _matches2[1], + zone = _matches2[2]; + + if (address) { + var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(), + _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), + last = _address$toLowerCase$2[0], + first = _address$toLowerCase$2[1]; + + var firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + var lastFields = last.split(":").map(_stripLeadingZeros); + var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + var fieldCount = isLastFieldIPv4Address ? 7 : 8; + var lastFieldsStart = lastFields.length - fieldCount; + var fields = Array(fieldCount); + for (var x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + var allZeroFields = fields.reduce(function (acc, field, index) { + if (!field || field === "0") { + var lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } else { + acc.push({ index: index, length: 1 }); + } + } + return acc; + }, []); + var longestZeroFields = allZeroFields.sort(function (a, b) { + return b.length - a.length; + })[0]; + var newHost = void 0; + if (longestZeroFields && longestZeroFields.length > 1) { + var newFirst = fields.slice(0, longestZeroFields.index); + var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } else { + return host; + } +} +var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined; +function parse(uriString) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var components = {}; + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + var matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } else { + //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined; + components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined; + components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined; + //fix port number + if (isNaN(components.port)) { + components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined; + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } else if (components.scheme === undefined) { + components.reference = "relative"; + } else if (components.fragment === undefined) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} + +function _recomposeAuthority(components, options) { + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) { + return "[" + $1 + ($2 ? "%25" + $2 : "") + "]"; + })); + } + if (typeof components.port === "number") { + uriTokens.push(":"); + uriTokens.push(components.port.toString(10)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} + +var RDS1 = /^\.\.?\//; +var RDS2 = /^\/\.(\/|$)/; +var RDS3 = /^\/\.\.(\/|$)/; +var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +function removeDotSegments(input) { + var output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } else if (input === "." || input === "..") { + input = ""; + } else { + var im = input.match(RDS5); + if (im) { + var s = im[0]; + input = input.slice(s.length); + output.push(s); + } else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} + +function serialize(components) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) {} + //TODO: normalize IPv6 address as per RFC 5952 + + //if host component is a domain name + else if (options.domainHost || schemeHandler && schemeHandler.domainHost) { + //convert IDN via punycode + try { + components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + var authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + var s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} + +function resolveComponents(base, relative) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var skipNormalization = arguments[3]; + + var target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} + +function resolve(baseURI, relativeURI, options) { + var schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} + +function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} + +function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} + +function escapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar); +} + +function unescapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars); +} + +var handler = { + scheme: "http", + domainHost: true, + parse: function parse(components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function serialize(components, options) { + //normalize the default port + if (components.port === (String(components.scheme).toLowerCase() !== "https" ? 80 : 443) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; + +var handler$1 = { + scheme: "https", + domainHost: handler.domainHost, + parse: handler.parse, + serialize: handler.serialize +}; + +var O = {}; +var isIRI = true; +//RFC 3986 +var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +var UNRESERVED = new RegExp(UNRESERVED$$, "g"); +var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +var NOT_HFVALUE = NOT_HFNAME; +function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(UNRESERVED) ? str : decStr; +} +var handler$2 = { + scheme: "mailto", + parse: function parse$$1(components, options) { + var mailtoComponents = components; + var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : []; + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + var unknownHeaders = false; + var headers = {}; + var hfields = mailtoComponents.query.split("&"); + for (var x = 0, xl = hfields.length; x < xl; ++x) { + var hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + var toAddrs = hfield[1].split(","); + for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) { + to.push(toAddrs[_x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) { + var addr = to[_x2].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[_x2] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function serialize$$1(mailtoComponents, options) { + var components = mailtoComponents; + var to = toArray(mailtoComponents.to); + if (to) { + for (var x = 0, xl = to.length; x < xl; ++x) { + var toAddr = String(to[x]); + var atIdx = toAddr.lastIndexOf("@"); + var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + var domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain); + } catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + var headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) headers["body"] = mailtoComponents.body; + var fields = []; + for (var name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; + +var URN_PARSE = /^([^\:]+)\:(.*)/; +//RFC 2141 +var handler$3 = { + scheme: "urn", + parse: function parse$$1(components, options) { + var matches = components.path && components.path.match(URN_PARSE); + var urnComponents = components; + if (matches) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = matches[1].toLowerCase(); + var nss = matches[2]; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function serialize$$1(urnComponents, options) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = urnComponents.nid; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + var uriComponents = urnComponents; + var nss = urnComponents.nss; + uriComponents.path = (nid || options.nid) + ":" + nss; + return uriComponents; + } +}; + +var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +//RFC 4122 +var handler$4 = { + scheme: "urn:uuid", + parse: function parse(urnComponents, options) { + var uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function serialize(uuidComponents, options) { + var urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + } +}; + +SCHEMES[handler.scheme] = handler; +SCHEMES[handler$1.scheme] = handler$1; +SCHEMES[handler$2.scheme] = handler$2; +SCHEMES[handler$3.scheme] = handler$3; +SCHEMES[handler$4.scheme] = handler$4; + +exports.SCHEMES = SCHEMES; +exports.pctEncChar = pctEncChar; +exports.pctDecChars = pctDecChars; +exports.parse = parse; +exports.removeDotSegments = removeDotSegments; +exports.serialize = serialize; +exports.resolveComponents = resolveComponents; +exports.resolve = resolve; +exports.normalize = normalize; +exports.equal = equal; +exports.escapeComponent = escapeComponent; +exports.unescapeComponent = unescapeComponent; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=uri.all.js.map diff --git a/node_modules/uri-js/dist/es5/uri.all.js.map b/node_modules/uri-js/dist/es5/uri.all.js.map new file mode 100644 index 0000000..536ffa8 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uri.all.js","sources":["../../src/index.ts","../../src/schemes/urn-uuid.ts","../../src/schemes/urn.ts","../../src/schemes/mailto.ts","../../src/schemes/https.ts","../../src/schemes/http.ts","../../src/uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/regexps-iri.ts","../../src/regexps-uri.ts","../../src/util.ts"],"sourcesContent":["import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\"; //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler = {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (components.port === (String(components.scheme).toLowerCase() !== \"https\" ? 80 : 443) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = ((\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else { //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(components.port.toString(10));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\"); //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options); //normalize base components\n\t\trelative = parse(serialize(relative, options), options); //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$), //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp( subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), // 6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp( \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), // \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp( H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\" h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\" ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"), //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$), //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$), //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","export function merge(...sets:Array):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}"],"names":["SCHEMES","uuid","scheme","urn","mailto","https","http","urnComponents","nss","uuidComponents","toLowerCase","options","error","tolerant","match","UUID","undefined","handler","uriComponents","path","nid","schemeHandler","serialize","urnScheme","parse","matches","components","URN_PARSE","query","fields","join","length","push","name","replace","PCT_ENCODED","decodeUnreserved","toUpperCase","NOT_HFNAME","pctEncChar","headers","NOT_HFVALUE","O","mailtoComponents","body","subject","to","x","localPart","domain","iri","e","punycode","toASCII","unescapeComponent","toUnicode","toAddr","slice","atIdx","NOT_LOCAL_PART","lastIndexOf","String","xl","toArray","addr","unicodeSupport","split","unknownHeaders","hfield","toAddrs","hfields","decStr","UNRESERVED","str","pctDecChars","RegExp","merge","UNRESERVED$$","SOME_DELIMS$$","ATEXT$$","VCHAR$$","PCT_ENCODED$","QTEXT$$","subexp","HEXDIG$$","isIRI","domainHost","port","host","toString","URI_PROTOCOL","IRI_PROTOCOL","ESCAPE","escapeComponent","uriA","uriB","typeOf","equal","uri","normalize","resolveComponents","baseURI","schemelessOptions","relativeURI","assign","resolve","target","fragment","relative","base","userinfo","removeDotSegments","charAt","skipNormalization","uriTokens","s","authority","absolutePath","reference","_recomposeAuthority","protocol","IPV6ADDRESS","test","output","Error","input","im","RDS5","pop","RDS3","RDS2","RDS1","$1","$2","_normalizeIPv6","_normalizeIPv4","_","uriString","isNaN","indexOf","parseInt","NO_MATCH_IS_UNDEFINED","URI_PARSE","newHost","zone","newFirst","newLast","longestZeroFields","index","b","a","allZeroFields","sort","acc","lastLongest","field","reduce","fieldCount","isLastFieldIPv4Address","firstFields","lastFields","lastFieldsStart","Array","IPV4ADDRESS","last","map","_stripLeadingZeros","first","address","reverse","NOT_FRAGMENT","NOT_QUERY","NOT_PATH","NOT_PATH_NOSCHEME","NOT_HOST","NOT_USERINFO","NOT_SCHEME","_normalizeComponentEncoding","newStr","substr","i","fromCharCode","c","c2","c3","il","chr","charCodeAt","encode","decode","ucs2encode","ucs2decode","regexNonASCII","string","mapDomain","regexPunycode","n","delta","handledCPCount","adapt","handledCPCountPlusOne","basicLength","stringFromCharCode","digitToBasic","q","floor","qMinusT","baseMinusT","t","k","bias","tMin","tMax","currentValue","maxInt","m","inputLength","delimiter","initialBias","initialN","fromCodePoint","splice","out","oldi","w","digit","basicToDigit","basic","j","baseMinusTMin","skew","numPoints","firstTime","damp","flag","codePoint","array","value","extra","counter","result","encoded","labels","fn","regexSeparators","parts","RangeError","errors","type","Math","buildExps","IPV6ADDRESS$","ZONEID$","IPV4ADDRESS$","RESERVED$$","SUB_DELIMS$$","IPRIVATE$$","ALPHA$$","DIGIT$$","AUTHORITY_REF$","USERINFO$","HOST$","PORT$","SAMEDOC_REF$","FRAGMENT$","ABSOLUTE_REF$","SCHEME$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","RELATIVE_REF$","PATH_NOSCHEME$","GENERIC_REF$","ABSOLUTE_URI$","HIER_PART$","URI_REFERENCE$","URI$","RELATIVE$","RELATIVE_PART$","AUTHORITY$","PCHAR$","PATH$","SEGMENT_NZ$","SEGMENT_NZ_NC$","SEGMENT$","IP_LITERAL$","REG_NAME$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","H16$","LS32$","DEC_OCTET_RELAXED$","DEC_OCTET$","UCSCHAR$$","GEN_DELIMS$$","SP$$","DQUOTE$$","CR$","obj","key","source","setInterval","call","prototype","o","Object","shift","sets"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/es5/uri.all.min.d.ts b/node_modules/uri-js/dist/es5/uri.all.min.d.ts new file mode 100644 index 0000000..320f534 --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.min.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/node_modules/uri-js/dist/es5/uri.all.min.js b/node_modules/uri-js/dist/es5/uri.all.min.js new file mode 100644 index 0000000..1b791ef --- /dev/null +++ b/node_modules/uri-js/dist/es5/uri.all.min.js @@ -0,0 +1,3 @@ +/** @license URI.js v4.2.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.URI=e.URI||{})}(this,function(e){"use strict";function r(){for(var e=arguments.length,r=Array(e),n=0;n1){r[0]=r[0].slice(0,-1);for(var t=r.length-1,o=1;o1&&(t=n[0]+"@",e=n[1]),e=e.replace(j,"."),t+f(e.split("."),r).join(".")}function p(e){for(var r=[],n=0,t=e.length;n=55296&&o<=56319&&n>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function d(e){for(var r="",n=0,t=e.length;n=194&&o<224){if(t-n>=6){var a=parseInt(e.substr(n+4,2),16);r+=String.fromCharCode((31&o)<<6|63&a)}else r+=e.substr(n,6);n+=6}else if(o>=224){if(t-n>=9){var i=parseInt(e.substr(n+4,2),16),u=parseInt(e.substr(n+7,2),16);r+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&u)}else r+=e.substr(n,9);n+=9}else r+=e.substr(n,3),n+=3}return r}function l(e,r){function n(e){var n=d(e);return n.match(r.UNRESERVED)?n:e}return e.scheme&&(e.scheme=String(e.scheme).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_SCHEME,"")),e.userinfo!==undefined&&(e.userinfo=String(e.userinfo).replace(r.PCT_ENCODED,n).replace(r.NOT_USERINFO,h).replace(r.PCT_ENCODED,o)),e.host!==undefined&&(e.host=String(e.host).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_HOST,h).replace(r.PCT_ENCODED,o)),e.path!==undefined&&(e.path=String(e.path).replace(r.PCT_ENCODED,n).replace(e.scheme?r.NOT_PATH:r.NOT_PATH_NOSCHEME,h).replace(r.PCT_ENCODED,o)),e.query!==undefined&&(e.query=String(e.query).replace(r.PCT_ENCODED,n).replace(r.NOT_QUERY,h).replace(r.PCT_ENCODED,o)),e.fragment!==undefined&&(e.fragment=String(e.fragment).replace(r.PCT_ENCODED,n).replace(r.NOT_FRAGMENT,h).replace(r.PCT_ENCODED,o)),e}function g(e){return e.replace(/^0*(.*)/,"$1")||"0"}function v(e,r){var n=e.match(r.IPV4ADDRESS)||[],t=R(n,2),o=t[1];return o?o.split(".").map(g).join("."):e}function m(e,r){var n=e.match(r.IPV6ADDRESS)||[],t=R(n,3),o=t[1],a=t[2];if(o){for(var i=o.toLowerCase().split("::").reverse(),u=R(i,2),s=u[0],f=u[1],c=f?f.split(":").map(g):[],p=s.split(":").map(g),h=r.IPV4ADDRESS.test(p[p.length-1]),d=h?7:8,l=p.length-d,m=Array(d),E=0;E1){var A=m.slice(0,y.index),D=m.slice(y.index+y.length);S=A.join(":")+"::"+D.join(":")}else S=m.join(":");return a&&(S+="%"+a),S}return e}function E(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n={},t=!1!==r.iri?N:F;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var o=e.match(J);if(o){K?(n.scheme=o[1],n.userinfo=o[3],n.host=o[4],n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=o[7],n.fragment=o[8],isNaN(n.port)&&(n.port=o[5])):(n.scheme=o[1]||undefined,n.userinfo=-1!==e.indexOf("@")?o[3]:undefined,n.host=-1!==e.indexOf("//")?o[4]:undefined,n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=-1!==e.indexOf("?")?o[7]:undefined,n.fragment=-1!==e.indexOf("#")?o[8]:undefined,isNaN(n.port)&&(n.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?o[4]:undefined)),n.host&&(n.host=m(v(n.host,t),t)),n.scheme!==undefined||n.userinfo!==undefined||n.host!==undefined||n.port!==undefined||n.path||n.query!==undefined?n.scheme===undefined?n.reference="relative":n.fragment===undefined?n.reference="absolute":n.reference="uri":n.reference="same-document",r.reference&&"suffix"!==r.reference&&r.reference!==n.reference&&(n.error=n.error||"URI is not a "+r.reference+" reference.");var a=B[(r.scheme||n.scheme||"").toLowerCase()];if(r.unicodeSupport||a&&a.unicodeSupport)l(n,t);else{if(n.host&&(r.domainHost||a&&a.domainHost))try{n.host=Y.toASCII(n.host.replace(t.PCT_ENCODED,d).toLowerCase())}catch(i){n.error=n.error||"Host's domain name can not be converted to ASCII via punycode: "+i}l(n,F)}a&&a.parse&&a.parse(n,r)}else n.error=n.error||"URI can not be parsed.";return n}function C(e,r){var n=!1!==r.iri?N:F,t=[];return e.userinfo!==undefined&&(t.push(e.userinfo),t.push("@")),e.host!==undefined&&t.push(m(v(String(e.host),n),n).replace(n.IPV6ADDRESS,function(e,r,n){return"["+r+(n?"%25"+n:"")+"]"})),"number"==typeof e.port&&(t.push(":"),t.push(e.port.toString(10))),t.length?t.join(""):undefined}function y(e){for(var r=[];e.length;)if(e.match(W))e=e.replace(W,"");else if(e.match(X))e=e.replace(X,"/");else if(e.match(ee))e=e.replace(ee,"/"),r.pop();else if("."===e||".."===e)e="";else{var n=e.match(re);if(!n)throw new Error("Unexpected dot segment condition");var t=n[0];e=e.slice(t.length),r.push(t)}return r.join("")}function S(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=r.iri?N:F,t=[],o=B[(r.scheme||e.scheme||"").toLowerCase()];if(o&&o.serialize&&o.serialize(e,r),e.host)if(n.IPV6ADDRESS.test(e.host));else if(r.domainHost||o&&o.domainHost)try{e.host=r.iri?Y.toUnicode(e.host):Y.toASCII(e.host.replace(n.PCT_ENCODED,d).toLowerCase())}catch(u){e.error=e.error||"Host's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+u}l(e,n),"suffix"!==r.reference&&e.scheme&&(t.push(e.scheme),t.push(":"));var a=C(e,r);if(a!==undefined&&("suffix"!==r.reference&&t.push("//"),t.push(a),e.path&&"/"!==e.path.charAt(0)&&t.push("/")),e.path!==undefined){var i=e.path;r.absolutePath||o&&o.absolutePath||(i=y(i)),a===undefined&&(i=i.replace(/^\/\//,"/%2F")),t.push(i)}return e.query!==undefined&&(t.push("?"),t.push(e.query)),e.fragment!==undefined&&(t.push("#"),t.push(e.fragment)),t.join("")}function A(e,r){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{},t=arguments[3],o={};return t||(e=E(S(e,n),n),r=E(S(r,n),n)),n=n||{},!n.tolerant&&r.scheme?(o.scheme=r.scheme,o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.userinfo!==undefined||r.host!==undefined||r.port!==undefined?(o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.path?("/"===r.path.charAt(0)?o.path=y(r.path):(e.userinfo===undefined&&e.host===undefined&&e.port===undefined||e.path?e.path?o.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:o.path=r.path:o.path="/"+r.path,o.path=y(o.path)),o.query=r.query):(o.path=e.path,r.query!==undefined?o.query=r.query:o.query=e.query),o.userinfo=e.userinfo,o.host=e.host,o.port=e.port),o.scheme=e.scheme),o.fragment=r.fragment,o}function D(e,r,n){var t=i({scheme:"null"},n);return S(A(E(e,t),E(r,t),t,!0),t)}function w(e,r){return"string"==typeof e?e=S(E(e,r),r):"object"===t(e)&&(e=E(S(e,r),r)),e}function b(e,r,n){return"string"==typeof e?e=S(E(e,n),n):"object"===t(e)&&(e=S(e,n)),"string"==typeof r?r=S(E(r,n),n):"object"===t(r)&&(r=S(r,n)),e===r}function x(e,r){return e&&e.toString().replace(r&&r.iri?N.ESCAPE:F.ESCAPE,h)}function O(e,r){return e&&e.toString().replace(r&&r.iri?N.PCT_ENCODED:F.PCT_ENCODED,d)}function I(e){var r=d(e);return r.match(fe)?r:e}var F=u(!1),N=u(!0),R=function(){function e(e,r){var n=[],t=!0,o=!1,a=undefined;try{for(var i,u=e[Symbol.iterator]();!(t=(i=u.next()).done)&&(n.push(i.value),!r||n.length!==r);t=!0);}catch(s){o=!0,a=s}finally{try{!t&&u["return"]&&u["return"]()}finally{if(o)throw a}}return n}return function(r,n){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),T=function(e){if(Array.isArray(e)){for(var r=0,n=Array(e.length);r= 0x80 (not a basic code point)","invalid-input":"Invalid input"},H=Math.floor,z=String.fromCharCode,L=function(e){return String.fromCodePoint.apply(String,T(e))},$=function(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:36},M=function(e,r){return e+22+75*(e<26)-((0!=r)<<5)},V=function(e,r,n){var t=0;for(e=n?H(e/700):e>>1,e+=H(e/r);e>455;t+=36)e=H(e/35);return H(t+36*e/(e+38))},k=function(e){var r=[],n=e.length,t=0,o=128,a=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var u=0;u=128&&s("not-basic"),r.push(e.charCodeAt(u));for(var f=i>0?i+1:0;f=n&&s("invalid-input");var d=$(e.charCodeAt(f++));(d>=36||d>H((_-t)/p))&&s("overflow"),t+=d*p;var l=h<=a?1:h>=a+26?26:h-a;if(dH(_/g)&&s("overflow"),p*=g}var v=r.length+1;a=V(t-c,v,0==c),H(t/v)>_-o&&s("overflow"),o+=H(t/v),t%=v,r.splice(t++,0,o)}return String.fromCodePoint.apply(String,r)},Z=function(e){var r=[];e=p(e);var n=e.length,t=128,o=0,a=72,i=!0,u=!1,f=undefined;try{for(var c,h=e[Symbol.iterator]();!(i=(c=h.next()).done);i=!0){var d=c.value;d<128&&r.push(z(d))}}catch(j){u=!0,f=j}finally{try{!i&&h["return"]&&h["return"]()}finally{if(u)throw f}}var l=r.length,g=l;for(l&&r.push("-");g=t&&AH((_-o)/D)&&s("overflow"),o+=(v-t)*D,t=v;var w=!0,b=!1,x=undefined;try{for(var O,I=e[Symbol.iterator]();!(w=(O=I.next()).done);w=!0){var F=O.value;if(F_&&s("overflow"),F==t){for(var N=o,R=36;;R+=36){var T=R<=a?1:R>=a+26?26:R-a;if(NA-Z\\x5E-\\x7E]",'[\\"\\\\]'),fe=new RegExp(ae,"g"),ce=new RegExp(ue,"g"),pe=new RegExp(r("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',se),"g"),he=new RegExp(r("[^]",ae,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),de=he,le={scheme:"mailto",parse:function(e,r){var n=e,t=n.to=n.path?n.path.split(","):[];if(n.path=undefined,n.query){for(var o=!1,a={},i=n.query.split("&"),u=0,s=i.length;u):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$), //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp( subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), // 6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp( \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), // \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp( H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\" h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\" ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"), //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$), //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$), //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = ((\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else { //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(components.port.toString(10));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\"); //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options); //normalize base components\n\t\trelative = parse(serialize(relative, options), options); //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\"; //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler = {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (components.port === (String(components.scheme).toLowerCase() !== \"https\" ? 80 : 443) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n"]} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/index.d.ts b/node_modules/uri-js/dist/esnext/index.d.ts new file mode 100644 index 0000000..be95efb --- /dev/null +++ b/node_modules/uri-js/dist/esnext/index.d.ts @@ -0,0 +1 @@ +export * from "./uri"; diff --git a/node_modules/uri-js/dist/esnext/index.js b/node_modules/uri-js/dist/esnext/index.js new file mode 100644 index 0000000..de8868f --- /dev/null +++ b/node_modules/uri-js/dist/esnext/index.js @@ -0,0 +1,13 @@ +import { SCHEMES } from "./uri"; +import http from "./schemes/http"; +SCHEMES[http.scheme] = http; +import https from "./schemes/https"; +SCHEMES[https.scheme] = https; +import mailto from "./schemes/mailto"; +SCHEMES[mailto.scheme] = mailto; +import urn from "./schemes/urn"; +SCHEMES[urn.scheme] = urn; +import uuid from "./schemes/urn-uuid"; +SCHEMES[uuid.scheme] = uuid; +export * from "./uri"; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/index.js.map b/node_modules/uri-js/dist/esnext/index.js.map new file mode 100644 index 0000000..e9e4008 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,IAAI,MAAM,gBAAgB,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE9B,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEhC,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,cAAc,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-iri.d.ts b/node_modules/uri-js/dist/esnext/regexps-iri.d.ts new file mode 100644 index 0000000..6fc0f5d --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-iri.d.ts @@ -0,0 +1,3 @@ +import { URIRegExps } from "./uri"; +declare const _default: URIRegExps; +export default _default; diff --git a/node_modules/uri-js/dist/esnext/regexps-iri.js b/node_modules/uri-js/dist/esnext/regexps-iri.js new file mode 100644 index 0000000..86239cf --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-iri.js @@ -0,0 +1,3 @@ +import { buildExps } from "./regexps-uri"; +export default buildExps(true); +//# sourceMappingURL=regexps-iri.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-iri.js.map b/node_modules/uri-js/dist/esnext/regexps-iri.js.map new file mode 100644 index 0000000..2269c58 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-iri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regexps-iri.js","sourceRoot":"","sources":["../../src/regexps-iri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,eAAe,SAAS,CAAC,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-uri.d.ts b/node_modules/uri-js/dist/esnext/regexps-uri.d.ts new file mode 100644 index 0000000..10ec87b --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-uri.d.ts @@ -0,0 +1,4 @@ +import { URIRegExps } from "./uri"; +export declare function buildExps(isIRI: boolean): URIRegExps; +declare const _default: URIRegExps; +export default _default; diff --git a/node_modules/uri-js/dist/esnext/regexps-uri.js b/node_modules/uri-js/dist/esnext/regexps-uri.js new file mode 100644 index 0000000..6e7e9a0 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-uri.js @@ -0,0 +1,42 @@ +import { merge, subexp } from "./util"; +export function buildExps(isIRI) { + const ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), //case-insensitive + LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$ + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +export default buildExps(false); +//# sourceMappingURL=regexps-uri.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/regexps-uri.js.map b/node_modules/uri-js/dist/esnext/regexps-uri.js.map new file mode 100644 index 0000000..cb028b8 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/regexps-uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regexps-uri.js","sourceRoot":"","sources":["../../src/regexps-uri.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/http.d.ts b/node_modules/uri-js/dist/esnext/schemes/http.d.ts new file mode 100644 index 0000000..3899956 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/http.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/http.js b/node_modules/uri-js/dist/esnext/schemes/http.js new file mode 100644 index 0000000..a280369 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/http.js @@ -0,0 +1,27 @@ +const handler = { + scheme: "http", + domainHost: true, + parse: function (components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function (components, options) { + //normalize the default port + if (components.port === (String(components.scheme).toLowerCase() !== "https" ? 80 : 443) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; +export default handler; +//# sourceMappingURL=http.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/http.js.map b/node_modules/uri-js/dist/esnext/schemes/http.js.map new file mode 100644 index 0000000..83e2ad5 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/http.js.map @@ -0,0 +1 @@ +{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/schemes/http.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,MAAM;IAEf,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,6BAA6B,CAAC;SACrE;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,SAAS,EAAG,UAAU,UAAwB,EAAE,OAAkB;QACjE,4BAA4B;QAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,EAAE,EAAE;YACnH,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;SAC5B;QAED,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;SACtB;QAED,mDAAmD;QACnD,oEAAoE;QACpE,wBAAwB;QAExB,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/https.d.ts b/node_modules/uri-js/dist/esnext/schemes/https.d.ts new file mode 100644 index 0000000..3899956 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/https.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/https.js b/node_modules/uri-js/dist/esnext/schemes/https.js new file mode 100644 index 0000000..fc3c71a --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/https.js @@ -0,0 +1,9 @@ +import http from "./http"; +const handler = { + scheme: "https", + domainHost: http.domainHost, + parse: http.parse, + serialize: http.serialize +}; +export default handler; +//# sourceMappingURL=https.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/https.js.map b/node_modules/uri-js/dist/esnext/schemes/https.js.map new file mode 100644 index 0000000..385b8ef --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/https.js.map @@ -0,0 +1 @@ +{"version":3,"file":"https.js","sourceRoot":"","sources":["../../../src/schemes/https.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,OAAO;IAChB,UAAU,EAAG,IAAI,CAAC,UAAU;IAC5B,KAAK,EAAG,IAAI,CAAC,KAAK;IAClB,SAAS,EAAG,IAAI,CAAC,SAAS;CAC1B,CAAA;AAED,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts b/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts new file mode 100644 index 0000000..b0db4bf --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts @@ -0,0 +1,12 @@ +import { URISchemeHandler, URIComponents } from "../uri"; +export interface MailtoHeaders { + [hfname: string]: string; +} +export interface MailtoComponents extends URIComponents { + to: Array; + headers?: MailtoHeaders; + subject?: string; + body?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/mailto.js b/node_modules/uri-js/dist/esnext/schemes/mailto.js new file mode 100644 index 0000000..2553713 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/mailto.js @@ -0,0 +1,148 @@ +import { pctEncChar, pctDecChars, unescapeComponent } from "../uri"; +import punycode from "punycode"; +import { merge, subexp, toUpperCase, toArray } from "../util"; +const O = {}; +const isIRI = true; +//RFC 3986 +const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*"); +const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$); +const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$); +const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"'); +//RFC 6068 +const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126 +const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$); +const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]"); +const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$); +const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$); +const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*"); +const HFNAME$ = subexp(QCHAR$ + "*"); +const HFVALUE$ = HFNAME$; +const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$); +const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*"); +const HFIELDS$ = subexp("\\?" + HFIELDS2$); +const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$"); +const UNRESERVED = new RegExp(UNRESERVED$$, "g"); +const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g"); +const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +const NOT_HFVALUE = NOT_HFNAME; +const TO = new RegExp("^" + TO$ + "$"); +const HFIELDS = new RegExp("^" + HFIELDS2$ + "$"); +function decodeUnreserved(str) { + const decStr = pctDecChars(str); + return (!decStr.match(UNRESERVED) ? str : decStr); +} +const handler = { + scheme: "mailto", + parse: function (components, options) { + const mailtoComponents = components; + const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []); + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + let unknownHeaders = false; + const headers = {}; + const hfields = mailtoComponents.query.split("&"); + for (let x = 0, xl = hfields.length; x < xl; ++x) { + const hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + const toAddrs = hfield[1].split(","); + for (let x = 0, xl = toAddrs.length; x < xl; ++x) { + to.push(toAddrs[x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) + mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (let x = 0, xl = to.length; x < xl; ++x) { + const addr = to[x].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } + catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } + else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[x] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function (mailtoComponents, options) { + const components = mailtoComponents; + const to = toArray(mailtoComponents.to); + if (to) { + for (let x = 0, xl = to.length; x < xl; ++x) { + const toAddr = String(to[x]); + const atIdx = toAddr.lastIndexOf("@"); + const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + let domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain)); + } + catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + const headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) + headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) + headers["body"] = mailtoComponents.body; + const fields = []; + for (const name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + + "=" + + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; +export default handler; +//# sourceMappingURL=mailto.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/mailto.js.map b/node_modules/uri-js/dist/esnext/schemes/mailto.js.map new file mode 100644 index 0000000..82dba9a --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/mailto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mailto.js","sourceRoot":"","sources":["../../../src/schemes/mailto.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts new file mode 100644 index 0000000..261ddce --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts @@ -0,0 +1,7 @@ +import { URISchemeHandler, URIOptions } from "../uri"; +import { URNComponents } from "./urn"; +export interface UUIDComponents extends URNComponents { + uuid?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js new file mode 100644 index 0000000..044c8a8 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js @@ -0,0 +1,23 @@ +const UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +const UUID_PARSE = /^[0-9A-Fa-f\-]{36}/; +//RFC 4122 +const handler = { + scheme: "urn:uuid", + parse: function (urnComponents, options) { + const uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function (uuidComponents, options) { + const urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + }, +}; +export default handler; +//# sourceMappingURL=urn-uuid.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map new file mode 100644 index 0000000..3b7a8b3 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map @@ -0,0 +1 @@ +{"version":3,"file":"urn-uuid.js","sourceRoot":"","sources":["../../../src/schemes/urn-uuid.ts"],"names":[],"mappings":"AAQA,MAAM,IAAI,GAAG,0DAA0D,CAAC;AACxE,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,UAAU;AACV,MAAM,OAAO,GAA+D;IAC3E,MAAM,EAAG,UAAU;IAEnB,KAAK,EAAG,UAAU,aAA2B,EAAE,OAAkB;QAChE,MAAM,cAAc,GAAG,aAA+B,CAAC;QACvD,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;QACzC,cAAc,CAAC,GAAG,GAAG,SAAS,CAAC;QAE/B,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;YACpF,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,IAAI,oBAAoB,CAAC;SACpE;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,SAAS,EAAG,UAAU,cAA6B,EAAE,OAAkB;QACtE,MAAM,aAAa,GAAG,cAA+B,CAAC;QACtD,gBAAgB;QAChB,aAAa,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn.d.ts b/node_modules/uri-js/dist/esnext/schemes/urn.d.ts new file mode 100644 index 0000000..4948105 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn.d.ts @@ -0,0 +1,10 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +export interface URNComponents extends URIComponents { + nid?: string; + nss?: string; +} +export interface URNOptions extends URIOptions { + nid?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/node_modules/uri-js/dist/esnext/schemes/urn.js b/node_modules/uri-js/dist/esnext/schemes/urn.js new file mode 100644 index 0000000..b53161c --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn.js @@ -0,0 +1,49 @@ +import { SCHEMES } from "../uri"; +const NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})"; +const PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})"; +const TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]"; +const NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)"; +const URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"); +const URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"); +const URN_PARSE = /^([^\:]+)\:(.*)/; +const URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g; +//RFC 2141 +const handler = { + scheme: "urn", + parse: function (components, options) { + const matches = components.path && components.path.match(URN_PARSE); + let urnComponents = components; + if (matches) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = matches[1].toLowerCase(); + const nss = matches[2]; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } + else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function (urnComponents, options) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = urnComponents.nid; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + const uriComponents = urnComponents; + const nss = urnComponents.nss; + uriComponents.path = `${nid || options.nid}:${nss}`; + return uriComponents; + }, +}; +export default handler; +//# sourceMappingURL=urn.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/schemes/urn.js.map b/node_modules/uri-js/dist/esnext/schemes/urn.js.map new file mode 100644 index 0000000..ea43b0b --- /dev/null +++ b/node_modules/uri-js/dist/esnext/schemes/urn.js.map @@ -0,0 +1 @@ +{"version":3,"file":"urn.js","sourceRoot":"","sources":["../../../src/schemes/urn.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,OAAO,EAAE,MAAM,QAAQ,CAAC;AAW7C,MAAM,IAAI,GAAG,qCAAqC,CAAC;AACnD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,OAAO,GAAG,mEAAmE,CAAC;AACpF,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAEvE,UAAU;AACV,MAAM,OAAO,GAA8C;IAC1D,MAAM,EAAG,KAAK;IAEd,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,aAAa,GAAG,UAA2B,CAAC;QAEhD,IAAI,OAAO,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;YAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAEzC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC;YAE/B,IAAI,aAAa,EAAE;gBAClB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;aAC7E;SACD;aAAM;YACN,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,wBAAwB,CAAC;SACtE;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,SAAS,EAAG,UAAU,aAA2B,EAAE,OAAkB;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;QAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,aAAa,EAAE;YAClB,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;SACjF;QAED,MAAM,aAAa,GAAG,aAA8B,CAAC;QACrD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,aAAa,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEpD,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/uri.d.ts b/node_modules/uri-js/dist/esnext/uri.d.ts new file mode 100644 index 0000000..320f534 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/uri.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/node_modules/uri-js/dist/esnext/uri.js b/node_modules/uri-js/dist/esnext/uri.js new file mode 100644 index 0000000..2fb6d71 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/uri.js @@ -0,0 +1,480 @@ +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``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 GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +import URI_PROTOCOL from "./regexps-uri"; +import IRI_PROTOCOL from "./regexps-iri"; +import punycode from "punycode"; +import { toUpperCase, typeOf, assign } from "./util"; +export const SCHEMES = {}; +export function pctEncChar(chr) { + const c = chr.charCodeAt(0); + let e; + if (c < 16) + e = "%0" + c.toString(16).toUpperCase(); + else if (c < 128) + e = "%" + c.toString(16).toUpperCase(); + else if (c < 2048) + e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + else + e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + return e; +} +export function pctDecChars(str) { + let newStr = ""; + let i = 0; + const il = str.length; + while (i < il) { + const c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } + else if (c >= 194 && c < 224) { + if ((il - i) >= 6) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + } + else { + newStr += str.substr(i, 6); + } + i += 6; + } + else if (c >= 224) { + if ((il - i) >= 9) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + const c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + } + else { + newStr += str.substr(i, 9); + } + i += 9; + } + else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + const decStr = pctDecChars(str); + return (!decStr.match(protocol.UNRESERVED) ? str : decStr); + } + if (components.scheme) + components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) + components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) + components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) + components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) + components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) + components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} +; +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + const matches = host.match(protocol.IPV4ADDRESS) || []; + const [, address] = matches; + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } + else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + const matches = host.match(protocol.IPV6ADDRESS) || []; + const [, address, zone] = matches; + if (address) { + const [last, first] = address.toLowerCase().split('::').reverse(); + const firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + const lastFields = last.split(":").map(_stripLeadingZeros); + const isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + const fieldCount = isLastFieldIPv4Address ? 7 : 8; + const lastFieldsStart = lastFields.length - fieldCount; + const fields = Array(fieldCount); + for (let x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + const allZeroFields = fields.reduce((acc, field, index) => { + if (!field || field === "0") { + const lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } + else { + acc.push({ index, length: 1 }); + } + } + return acc; + }, []); + const longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0]; + let newHost; + if (longestZeroFields && longestZeroFields.length > 1) { + const newFirst = fields.slice(0, longestZeroFields.index); + const newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } + else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } + else { + return host; + } +} +const URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +const NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined; +export function parse(uriString, options = {}) { + const components = {}; + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + if (options.reference === "suffix") + uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + const matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } + else { //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined); + components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined); + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined); + components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined); + //fix port number + if (isNaN(components.port)) { + components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined); + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } + else if (components.scheme === undefined) { + components.reference = "relative"; + } + else if (components.fragment === undefined) { + components.reference = "absolute"; + } + else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } + else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } + else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} +; +function _recomposeAuthority(components, options) { + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => "[" + $1 + ($2 ? "%25" + $2 : "") + "]")); + } + if (typeof components.port === "number") { + uriTokens.push(":"); + uriTokens.push(components.port.toString(10)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} +; +const RDS1 = /^\.\.?\//; +const RDS2 = /^\/\.(\/|$)/; +const RDS3 = /^\/\.\.(\/|$)/; +const RDS4 = /^\.\.?$/; +const RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +export function removeDotSegments(input) { + const output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } + else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } + else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } + else if (input === "." || input === "..") { + input = ""; + } + else { + const im = input.match(RDS5); + if (im) { + const s = im[0]; + input = input.slice(s.length); + output.push(s); + } + else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} +; +export function serialize(components, options = {}) { + const protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens = []; + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) + schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) { + //TODO: normalize IPv6 address as per RFC 5952 + } + //if host component is a domain name + else if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) { + //convert IDN via punycode + try { + components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host)); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + const authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + let s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} +; +export function resolveComponents(base, relative, options = {}, skipNormalization) { + const target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } + else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } + else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } + else { + target.query = base.query; + } + } + else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } + else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } + else if (!base.path) { + target.path = relative.path; + } + else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} +; +export function resolve(baseURI, relativeURI, options) { + const schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} +; +export function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } + else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} +; +export function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } + else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } + else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} +; +export function escapeComponent(str, options) { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar); +} +; +export function unescapeComponent(str, options) { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars); +} +; +//# sourceMappingURL=uri.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/uri.js.map b/node_modules/uri-js/dist/esnext/uri.js.map new file mode 100644 index 0000000..e1d831c --- /dev/null +++ b/node_modules/uri-js/dist/esnext/uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/uri.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/util.d.ts b/node_modules/uri-js/dist/esnext/util.d.ts new file mode 100644 index 0000000..8b484cd --- /dev/null +++ b/node_modules/uri-js/dist/esnext/util.d.ts @@ -0,0 +1,6 @@ +export declare function merge(...sets: Array): string; +export declare function subexp(str: string): string; +export declare function typeOf(o: any): string; +export declare function toUpperCase(str: string): string; +export declare function toArray(obj: any): Array; +export declare function assign(target: object, source: any): any; diff --git a/node_modules/uri-js/dist/esnext/util.js b/node_modules/uri-js/dist/esnext/util.js new file mode 100644 index 0000000..45af46f --- /dev/null +++ b/node_modules/uri-js/dist/esnext/util.js @@ -0,0 +1,36 @@ +export function merge(...sets) { + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + const xl = sets.length - 1; + for (let x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } + else { + return sets[0]; + } +} +export function subexp(str) { + return "(?:" + str + ")"; +} +export function typeOf(o) { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); +} +export function toUpperCase(str) { + return str.toUpperCase(); +} +export function toArray(obj) { + return obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : []; +} +export function assign(target, source) { + const obj = target; + if (source) { + for (const key in source) { + obj[key] = source[key]; + } + } + return obj; +} +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/node_modules/uri-js/dist/esnext/util.js.map b/node_modules/uri-js/dist/esnext/util.js.map new file mode 100644 index 0000000..05d9df0 --- /dev/null +++ b/node_modules/uri-js/dist/esnext/util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAkB;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACrB;SAAM;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;KACf;AACF,CAAC;AAED,MAAM,iBAAiB,GAAU;IAChC,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1B,CAAC;AAED,MAAM,iBAAiB,CAAK;IAC3B,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,sBAAsB,GAAU;IACrC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,kBAAkB,GAAO;IAC9B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvM,CAAC;AAGD,MAAM,iBAAiB,MAAc,EAAE,MAAW;IACjD,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,MAAM,EAAE;QACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACvB;KACD;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"} \ No newline at end of file diff --git a/node_modules/uri-js/package.json b/node_modules/uri-js/package.json new file mode 100644 index 0000000..78d067a --- /dev/null +++ b/node_modules/uri-js/package.json @@ -0,0 +1,96 @@ +{ + "_args": [ + [ + "uri-js@4.2.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "uri-js@4.2.2", + "_id": "uri-js@4.2.2", + "_inBundle": false, + "_integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "_location": "/uri-js", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "uri-js@4.2.2", + "name": "uri-js", + "escapedName": "uri-js", + "rawSpec": "4.2.2", + "saveSpec": null, + "fetchSpec": "4.2.2" + }, + "_requiredBy": [ + "/ajv" + ], + "_resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "_spec": "4.2.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Gary Court", + "email": "gary.court@gmail.com" + }, + "bugs": { + "url": "https://github.com/garycourt/uri-js/issues" + }, + "dependencies": { + "punycode": "^2.1.0" + }, + "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.", + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-plugin-external-helpers": "^6.22.0", + "babel-preset-latest": "^6.24.1", + "mocha": "^3.2.0", + "mocha-qunit-ui": "^0.1.3", + "rollup": "^0.41.6", + "rollup-plugin-babel": "^2.7.1", + "rollup-plugin-node-resolve": "^2.0.0", + "sorcery": "^0.10.0", + "typescript": "^2.8.1", + "uglify-js": "^2.8.14" + }, + "directories": { + "test": "tests" + }, + "homepage": "https://github.com/garycourt/uri-js", + "keywords": [ + "URI", + "IRI", + "IDN", + "URN", + "UUID", + "HTTP", + "HTTPS", + "MAILTO", + "RFC3986", + "RFC3987", + "RFC5891", + "RFC2616", + "RFC2818", + "RFC2141", + "RFC4122", + "RFC4291", + "RFC5952", + "RFC6068", + "RFC6874" + ], + "license": "BSD-2-Clause", + "main": "dist/es5/uri.all.js", + "name": "uri-js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/garycourt/uri-js.git" + }, + "scripts": { + "build": "npm run build:esnext && npm run build:es5 && npm run build:es5:min", + "build:es5": "rollup -c && cp dist/esnext/uri.d.ts dist/es5/uri.all.d.ts && npm run build:es5:fix-sourcemap", + "build:es5:fix-sourcemap": "sorcery -i dist/es5/uri.all.js", + "build:es5:min": "uglifyjs dist/es5/uri.all.js --support-ie8 --output dist/es5/uri.all.min.js --in-source-map dist/es5/uri.all.js.map --source-map uri.all.min.js.map --comments --compress --mangle --pure-funcs merge subexp && mv uri.all.min.js.map dist/es5/ && cp dist/es5/uri.all.d.ts dist/es5/uri.all.min.d.ts", + "build:esnext": "tsc", + "test": "mocha -u mocha-qunit-ui dist/es5/uri.all.js tests/tests.js" + }, + "types": "dist/es5/uri.all.d.ts", + "version": "4.2.2" +} diff --git a/node_modules/uri-js/rollup.config.js b/node_modules/uri-js/rollup.config.js new file mode 100644 index 0000000..5bb8b05 --- /dev/null +++ b/node_modules/uri-js/rollup.config.js @@ -0,0 +1,32 @@ +import resolve from 'rollup-plugin-node-resolve'; +import babel from 'rollup-plugin-babel'; +const packageJson = require('./package.json'); + +export default { + entry : "dist/esnext/index.js", + format : "umd", + moduleName : "URI", + plugins: [ + resolve({ + module: true, + jsnext: true, + preferBuiltins: false + }), + + babel({ + "presets": [ + ["latest", { + "es2015": { + "modules": false + } + }] + ], + "plugins": ["external-helpers"], + "externalHelpers": false + } +) + ], + dest : "dist/es5/uri.all.js", + sourceMap: true, + banner: "/** @license URI.js v" + packageJson.version + " (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */" +} diff --git a/node_modules/uri-js/src/index.ts b/node_modules/uri-js/src/index.ts new file mode 100644 index 0000000..6532a1b --- /dev/null +++ b/node_modules/uri-js/src/index.ts @@ -0,0 +1,18 @@ +import { SCHEMES } from "./uri"; + +import http from "./schemes/http"; +SCHEMES[http.scheme] = http; + +import https from "./schemes/https"; +SCHEMES[https.scheme] = https; + +import mailto from "./schemes/mailto"; +SCHEMES[mailto.scheme] = mailto; + +import urn from "./schemes/urn"; +SCHEMES[urn.scheme] = urn; + +import uuid from "./schemes/urn-uuid"; +SCHEMES[uuid.scheme] = uuid; + +export * from "./uri"; diff --git a/node_modules/uri-js/src/punycode.d.ts b/node_modules/uri-js/src/punycode.d.ts new file mode 100644 index 0000000..4ecbd34 --- /dev/null +++ b/node_modules/uri-js/src/punycode.d.ts @@ -0,0 +1,24 @@ +declare module 'punycode' { + function ucs2decode(string:string):Array; + function ucs2encode(array:Array):string; + function decode(string:string):string; + function encode(string:string):string; + function toASCII(string:string):string; + function toUnicode(string:string):string; + + interface Punycode { + 'version': '2.2.0'; + 'ucs2': { + 'decode': typeof ucs2decode; + 'encode': typeof ucs2encode; + }, + 'decode': typeof decode; + 'encode': typeof encode; + 'toASCII': typeof toASCII; + 'toUnicode': typeof toUnicode; + } + + const punycode:Punycode; + + export default punycode; +} diff --git a/node_modules/uri-js/src/regexps-iri.ts b/node_modules/uri-js/src/regexps-iri.ts new file mode 100644 index 0000000..8bd605b --- /dev/null +++ b/node_modules/uri-js/src/regexps-iri.ts @@ -0,0 +1,4 @@ +import { URIRegExps } from "./uri"; +import { buildExps } from "./regexps-uri"; + +export default buildExps(true); diff --git a/node_modules/uri-js/src/regexps-uri.ts b/node_modules/uri-js/src/regexps-uri.ts new file mode 100644 index 0000000..8d6b547 --- /dev/null +++ b/node_modules/uri-js/src/regexps-uri.ts @@ -0,0 +1,89 @@ +import { URIRegExps } from "./uri"; +import { merge, subexp } from "./util"; + +export function buildExps(isIRI:boolean):URIRegExps { + const + ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), + UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), + SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS1$ = subexp( subexp(H16$ + "\\:") + "{6}" + LS32$), // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp( "\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp( H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$ ), //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:" ), //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), + ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), + PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), + PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), + FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), + RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + + GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", + SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$" + ; + + return { + NOT_SCHEME : new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO : new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST : new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH : new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME : new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY : new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT : new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE : new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED : new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS : new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED : new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS : new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS : new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} + +export default buildExps(false); diff --git a/node_modules/uri-js/src/schemes/http.ts b/node_modules/uri-js/src/schemes/http.ts new file mode 100644 index 0000000..3e53145 --- /dev/null +++ b/node_modules/uri-js/src/schemes/http.ts @@ -0,0 +1,36 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; + +const handler:URISchemeHandler = { + scheme : "http", + + domainHost : true, + + parse : function (components:URIComponents, options:URIOptions):URIComponents { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + + return components; + }, + + serialize : function (components:URIComponents, options:URIOptions):URIComponents { + //normalize the default port + if (components.port === (String(components.scheme).toLowerCase() !== "https" ? 80 : 443) || components.port === "") { + components.port = undefined; + } + + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + + return components; + } +}; + +export default handler; \ No newline at end of file diff --git a/node_modules/uri-js/src/schemes/https.ts b/node_modules/uri-js/src/schemes/https.ts new file mode 100644 index 0000000..a19a494 --- /dev/null +++ b/node_modules/uri-js/src/schemes/https.ts @@ -0,0 +1,11 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +import http from "./http"; + +const handler:URISchemeHandler = { + scheme : "https", + domainHost : http.domainHost, + parse : http.parse, + serialize : http.serialize +} + +export default handler; \ No newline at end of file diff --git a/node_modules/uri-js/src/schemes/mailto.ts b/node_modules/uri-js/src/schemes/mailto.ts new file mode 100644 index 0000000..3faf320 --- /dev/null +++ b/node_modules/uri-js/src/schemes/mailto.ts @@ -0,0 +1,182 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +import { pctEncChar, pctDecChars, unescapeComponent } from "../uri"; +import punycode from "punycode"; +import { merge, subexp, toUpperCase, toArray } from "../util"; + +export interface MailtoHeaders { + [hfname:string]:string +} + +export interface MailtoComponents extends URIComponents { + to:Array, + headers?:MailtoHeaders, + subject?:string, + body?:string +} + +const O:MailtoHeaders = {}; +const isIRI = true; + +//RFC 3986 +const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded + +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*"); +const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$); +const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$); +const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"'); + +//RFC 6068 +const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126 +const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$); +const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]"); +const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$); +const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$); +const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*"); +const HFNAME$ = subexp(QCHAR$ + "*"); +const HFVALUE$ = HFNAME$; +const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$); +const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*"); +const HFIELDS$ = subexp("\\?" + HFIELDS2$); +const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$"); + +const UNRESERVED = new RegExp(UNRESERVED$$, "g"); +const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g"); +const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +const NOT_HFVALUE = NOT_HFNAME; +const TO = new RegExp("^" + TO$ + "$"); +const HFIELDS = new RegExp("^" + HFIELDS2$ + "$"); + +function decodeUnreserved(str:string):string { + const decStr = pctDecChars(str); + return (!decStr.match(UNRESERVED) ? str : decStr); +} + +const handler:URISchemeHandler = { + scheme : "mailto", + + parse : function (components:URIComponents, options:URIOptions):MailtoComponents { + const mailtoComponents = components as MailtoComponents; + const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []); + mailtoComponents.path = undefined; + + if (mailtoComponents.query) { + let unknownHeaders = false + const headers:MailtoHeaders = {}; + const hfields = mailtoComponents.query.split("&"); + + for (let x = 0, xl = hfields.length; x < xl; ++x) { + const hfield = hfields[x].split("="); + + switch (hfield[0]) { + case "to": + const toAddrs = hfield[1].split(","); + for (let x = 0, xl = toAddrs.length; x < xl; ++x) { + to.push(toAddrs[x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + + if (unknownHeaders) mailtoComponents.headers = headers; + } + + mailtoComponents.query = undefined; + + for (let x = 0, xl = to.length; x < xl; ++x) { + const addr = to[x].split("@"); + + addr[0] = unescapeComponent(addr[0]); + + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + + to[x] = addr.join("@"); + } + + return mailtoComponents; + }, + + serialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents { + const components = mailtoComponents as URIComponents; + const to = toArray(mailtoComponents.to); + if (to) { + for (let x = 0, xl = to.length; x < xl; ++x) { + const toAddr = String(to[x]); + const atIdx = toAddr.lastIndexOf("@"); + const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + let domain = toAddr.slice(atIdx + 1); + + //convert IDN via punycode + try { + domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain)); + } catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + + to[x] = localPart + "@" + domain; + } + + components.path = to.join(","); + } + + const headers = mailtoComponents.headers = mailtoComponents.headers || {}; + + if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) headers["body"] = mailtoComponents.body; + + const fields = []; + for (const name in headers) { + if (headers[name] !== O[name]) { + fields.push( + name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + + "=" + + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar) + ); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + + return components; + } +} + +export default handler; \ No newline at end of file diff --git a/node_modules/uri-js/src/schemes/urn-uuid.ts b/node_modules/uri-js/src/schemes/urn-uuid.ts new file mode 100644 index 0000000..5665329 --- /dev/null +++ b/node_modules/uri-js/src/schemes/urn-uuid.ts @@ -0,0 +1,36 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +import { URNComponents } from "./urn"; +import { SCHEMES } from "../uri"; + +export interface UUIDComponents extends URNComponents { + uuid?: string; +} + +const UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +const UUID_PARSE = /^[0-9A-Fa-f\-]{36}/; + +//RFC 4122 +const handler:URISchemeHandler = { + scheme : "urn:uuid", + + parse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents { + const uuidComponents = urnComponents as UUIDComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + + return uuidComponents; + }, + + serialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents { + const urnComponents = uuidComponents as URNComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + }, +}; + +export default handler; \ No newline at end of file diff --git a/node_modules/uri-js/src/schemes/urn.ts b/node_modules/uri-js/src/schemes/urn.ts new file mode 100644 index 0000000..590f9cc --- /dev/null +++ b/node_modules/uri-js/src/schemes/urn.ts @@ -0,0 +1,69 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +import { pctEncChar, SCHEMES } from "../uri"; + +export interface URNComponents extends URIComponents { + nid?:string; + nss?:string; +} + +export interface URNOptions extends URIOptions { + nid?:string; +} + +const NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})"; +const PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})"; +const TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]"; +const NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)"; +const URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"); +const URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"); +const URN_PARSE = /^([^\:]+)\:(.*)/; +const URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g; + +//RFC 2141 +const handler:URISchemeHandler = { + scheme : "urn", + + parse : function (components:URIComponents, options:URNOptions):URNComponents { + const matches = components.path && components.path.match(URN_PARSE); + let urnComponents = components as URNComponents; + + if (matches) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = matches[1].toLowerCase(); + const nss = matches[2]; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options) as URNComponents; + } + } else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + + return urnComponents; + }, + + serialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = urnComponents.nid; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents; + } + + const uriComponents = urnComponents as URIComponents; + const nss = urnComponents.nss; + uriComponents.path = `${nid || options.nid}:${nss}`; + + return uriComponents; + }, +}; + +export default handler; \ No newline at end of file diff --git a/node_modules/uri-js/src/uri.ts b/node_modules/uri-js/src/uri.ts new file mode 100644 index 0000000..c282c37 --- /dev/null +++ b/node_modules/uri-js/src/uri.ts @@ -0,0 +1,556 @@ +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ + +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``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 GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ + +import URI_PROTOCOL from "./regexps-uri"; +import IRI_PROTOCOL from "./regexps-iri"; +import punycode from "punycode"; +import { toUpperCase, typeOf, assign } from "./util"; + +export interface URIComponents { + scheme?:string; + userinfo?:string; + host?:string; + port?:number|string; + path?:string; + query?:string; + fragment?:string; + reference?:string; + error?:string; +} + +export interface URIOptions { + scheme?:string; + reference?:string; + tolerant?:boolean; + absolutePath?:boolean; + iri?:boolean; + unicodeSupport?:boolean; + domainHost?:boolean; +} + +export interface URISchemeHandler { + scheme:string; + parse(components:ParentComponents, options:Options):Components; + serialize(components:Components, options:Options):ParentComponents; + unicodeSupport?:boolean; + domainHost?:boolean; + absolutePath?:boolean; +} + +export interface URIRegExps { + NOT_SCHEME : RegExp, + NOT_USERINFO : RegExp, + NOT_HOST : RegExp, + NOT_PATH : RegExp, + NOT_PATH_NOSCHEME : RegExp, + NOT_QUERY : RegExp, + NOT_FRAGMENT : RegExp, + ESCAPE : RegExp, + UNRESERVED : RegExp, + OTHER_CHARS : RegExp, + PCT_ENCODED : RegExp, + IPV4ADDRESS : RegExp, + IPV6ADDRESS : RegExp, +} + +export const SCHEMES:{[scheme:string]:URISchemeHandler} = {}; + +export function pctEncChar(chr:string):string { + const c = chr.charCodeAt(0); + let e:string; + + if (c < 16) e = "%0" + c.toString(16).toUpperCase(); + else if (c < 128) e = "%" + c.toString(16).toUpperCase(); + else if (c < 2048) e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + else e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + + return e; +} + +export function pctDecChars(str:string):string { + let newStr = ""; + let i = 0; + const il = str.length; + + while (i < il) { + const c = parseInt(str.substr(i + 1, 2), 16); + + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } + else if (c >= 194 && c < 224) { + if ((il - i) >= 6) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + } else { + newStr += str.substr(i, 6); + } + i += 6; + } + else if (c >= 224) { + if ((il - i) >= 9) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + const c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + } else { + newStr += str.substr(i, 9); + } + i += 9; + } + else { + newStr += str.substr(i, 3); + i += 3; + } + } + + return newStr; +} + +function _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) { + function decodeUnreserved(str:string):string { + const decStr = pctDecChars(str); + return (!decStr.match(protocol.UNRESERVED) ? str : decStr); + } + + if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + + return components; +}; + +function _stripLeadingZeros(str:string):string { + return str.replace(/^0*(.*)/, "$1") || "0"; +} + +function _normalizeIPv4(host:string, protocol:URIRegExps):string { + const matches = host.match(protocol.IPV4ADDRESS) || []; + const [, address] = matches; + + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } else { + return host; + } +} + +function _normalizeIPv6(host:string, protocol:URIRegExps):string { + const matches = host.match(protocol.IPV6ADDRESS) || []; + const [, address, zone] = matches; + + if (address) { + const [last, first] = address.toLowerCase().split('::').reverse(); + const firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + const lastFields = last.split(":").map(_stripLeadingZeros); + const isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + const fieldCount = isLastFieldIPv4Address ? 7 : 8; + const lastFieldsStart = lastFields.length - fieldCount; + const fields = Array(fieldCount); + + for (let x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + + const allZeroFields = fields.reduce>((acc, field, index) => { + if (!field || field === "0") { + const lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } else { + acc.push({ index, length : 1 }); + } + } + return acc; + }, []); + + const longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0]; + + let newHost:string; + if (longestZeroFields && longestZeroFields.length > 1) { + const newFirst = fields.slice(0, longestZeroFields.index) ; + const newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } else { + newHost = fields.join(":"); + } + + if (zone) { + newHost += "%" + zone; + } + + return newHost; + } else { + return host; + } +} + +const URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +const NO_MATCH_IS_UNDEFINED = (("").match(/(){0}/))[1] === undefined; + +export function parse(uriString:string, options:URIOptions = {}):URIComponents { + const components:URIComponents = {}; + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + + if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + + const matches = uriString.match(URI_PARSE); + + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } else { //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined); + components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined); + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined); + components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined); + + //fix port number + if (isNaN(components.port)) { + components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined); + } + } + + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } else if (components.scheme === undefined) { + components.reference = "relative"; + } else if (components.fragment === undefined) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.error = components.error || "URI can not be parsed."; + } + + return components; +}; + +function _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined { + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens:Array = []; + + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => "[" + $1 + ($2 ? "%25" + $2 : "") + "]")); + } + + if (typeof components.port === "number") { + uriTokens.push(":"); + uriTokens.push(components.port.toString(10)); + } + + return uriTokens.length ? uriTokens.join("") : undefined; +}; + +const RDS1 = /^\.\.?\//; +const RDS2 = /^\/\.(\/|$)/; +const RDS3 = /^\/\.\.(\/|$)/; +const RDS4 = /^\.\.?$/; +const RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; + +export function removeDotSegments(input:string):string { + const output:Array = []; + + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } else if (input === "." || input === "..") { + input = ""; + } else { + const im = input.match(RDS5); + if (im) { + const s = im[0]; + input = input.slice(s.length); + output.push(s); + } else { + throw new Error("Unexpected dot segment condition"); + } + } + } + + return output.join(""); +}; + +export function serialize(components:URIComponents, options:URIOptions = {}):string { + const protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens:Array = []; + + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); + + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) { + //TODO: normalize IPv6 address as per RFC 5952 + } + + //if host component is a domain name + else if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) { + //convert IDN via punycode + try { + components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host)); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + + //normalize encoding + _normalizeComponentEncoding(components, protocol); + + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + + const authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + + uriTokens.push(authority); + + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + + if (components.path !== undefined) { + let s = components.path; + + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + + uriTokens.push(s); + } + + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + + return uriTokens.join(""); //merge tokens into a string +}; + +export function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents { + const target:URIComponents = {}; + + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + + target.fragment = relative.fragment; + + return target; +}; + +export function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string { + const schemelessOptions = assign({ scheme : 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +}; + +export function normalize(uri:string, options?:URIOptions):string; +export function normalize(uri:URIComponents, options?:URIOptions):URIComponents; +export function normalize(uri:any, options?:URIOptions):any { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + + return uri; +}; + +export function equal(uriA:string, uriB:string, options?: URIOptions):boolean; +export function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean; +export function equal(uriA:any, uriB:any, options?:URIOptions):boolean { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + + return uriA === uriB; +}; + +export function escapeComponent(str:string, options?:URIOptions):string { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar); +}; + +export function unescapeComponent(str:string, options?:URIOptions):string { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars); +}; diff --git a/node_modules/uri-js/src/util.ts b/node_modules/uri-js/src/util.ts new file mode 100644 index 0000000..29c6d5d --- /dev/null +++ b/node_modules/uri-js/src/util.ts @@ -0,0 +1,40 @@ +export function merge(...sets:Array):string { + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + const xl = sets.length - 1; + for (let x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } else { + return sets[0]; + } +} + +export function subexp(str:string):string { + return "(?:" + str + ")"; +} + +export function typeOf(o:any):string { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); +} + +export function toUpperCase(str:string):string { + return str.toUpperCase(); +} + +export function toArray(obj:any):Array { + return obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : []; +} + + +export function assign(target: object, source: any): any { + const obj = target as any; + if (source) { + for (const key in source) { + obj[key] = source[key]; + } + } + return obj; +} \ No newline at end of file diff --git a/node_modules/uri-js/tests/qunit.css b/node_modules/uri-js/tests/qunit.css new file mode 100644 index 0000000..a2e183d --- /dev/null +++ b/node_modules/uri-js/tests/qunit.css @@ -0,0 +1,118 @@ +ol#qunit-tests { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + padding:0; + list-style-position:inside; + + font-size: smaller; +} +ol#qunit-tests li{ + padding:0.4em 0.5em 0.4em 2.5em; + border-bottom:1px solid #fff; + font-size:small; + list-style-position:inside; +} +ol#qunit-tests li ol{ + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; + margin-top:0.5em; + margin-left:0; + padding:0.5em; + background-color:#fff; + border-radius:15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; +} +ol#qunit-tests li li{ + border-bottom:none; + margin:0.5em; + background-color:#fff; + list-style-position: inside; + padding:0.4em 0.5em 0.4em 0.5em; +} + +ol#qunit-tests li li.pass{ + border-left:26px solid #C6E746; + background-color:#fff; + color:#5E740B; + } +ol#qunit-tests li li.fail{ + border-left:26px solid #EE5757; + background-color:#fff; + color:#710909; +} +ol#qunit-tests li.pass{ + background-color:#D2E0E6; + color:#528CE0; +} +ol#qunit-tests li.fail{ + background-color:#EE5757; + color:#000; +} +ol#qunit-tests li strong { + cursor:pointer; +} +h1#qunit-header{ + background-color:#0d3349; + margin:0; + padding:0.5em 0 0.5em 1em; + color:#fff; + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + border-top-right-radius:15px; + border-top-left-radius:15px; + -moz-border-radius-topright:15px; + -moz-border-radius-topleft:15px; + -webkit-border-top-right-radius:15px; + -webkit-border-top-left-radius:15px; + text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px; +} +h2#qunit-banner{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + height:5px; + margin:0; + padding:0; +} +h2#qunit-banner.qunit-pass{ + background-color:#C6E746; +} +h2#qunit-banner.qunit-fail, #qunit-testrunner-toolbar { + background-color:#EE5757; +} +#qunit-testrunner-toolbar { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + padding:0; + /*width:80%;*/ + padding:0em 0 0.5em 2em; + font-size: small; +} +h2#qunit-userAgent { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + background-color:#2b81af; + margin:0; + padding:0; + color:#fff; + font-size: small; + padding:0.5em 0 0.5em 2.5em; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} +p#qunit-testresult{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + font-size: small; + color:#2b81af; + border-bottom-right-radius:15px; + border-bottom-left-radius:15px; + -moz-border-radius-bottomright:15px; + -moz-border-radius-bottomleft:15px; + -webkit-border-bottom-right-radius:15px; + -webkit-border-bottom-left-radius:15px; + background-color:#D2E0E6; + padding:0.5em 0.5em 0.5em 2.5em; +} +strong b.fail{ + color:#710909; + } +strong b.pass{ + color:#5E740B; + } \ No newline at end of file diff --git a/node_modules/uri-js/tests/qunit.js b/node_modules/uri-js/tests/qunit.js new file mode 100644 index 0000000..e449fdf --- /dev/null +++ b/node_modules/uri-js/tests/qunit.js @@ -0,0 +1,1042 @@ +/* + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2009 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + */ + +(function(window) { + +var QUnit = { + + // Initialize the configuration options + init: function() { + config = { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date, + blocking: false, + autorun: false, + assertions: [], + filters: [], + queue: [] + }; + + var tests = id("qunit-tests"), + banner = id("qunit-banner"), + result = id("qunit-testresult"); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + }, + + // call on start of module test to prepend name to all tests + module: function(name, testEnvironment) { + config.currentModule = name; + + synchronize(function() { + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + config.currentModule = name; + config.moduleTestEnvironment = testEnvironment; + config.moduleStats = { all: 0, bad: 0 }; + + QUnit.moduleStart( name, testEnvironment ); + }); + }, + + asyncTest: function(testName, expected, callback) { + if ( arguments.length === 2 ) { + callback = expected; + expected = 0; + } + + QUnit.test(testName, expected, callback, true); + }, + + test: function(testName, expected, callback, async) { + var name = testName, testEnvironment, testEnvironmentArg; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + // is 2nd argument a testEnvironment? + if ( expected && typeof expected === 'object') { + testEnvironmentArg = expected; + expected = null; + } + + if ( config.currentModule ) { + name = config.currentModule + " module: " + name; + } + + if ( !validTest(name) ) { + return; + } + + synchronize(function() { + QUnit.testStart( testName ); + + testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, config.moduleTestEnvironment); + if (testEnvironmentArg) { + extend(testEnvironment,testEnvironmentArg); + } + + // allow utility functions to access the current test environment + QUnit.current_testEnvironment = testEnvironment; + + config.assertions = []; + config.expected = expected; + + try { + if ( !config.pollution ) { + saveGlobal(); + } + + testEnvironment.setup.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Setup failed on " + name + ": " + e.message ); + } + + if ( async ) { + QUnit.stop(); + } + + try { + callback.call(testEnvironment); + } catch(e) { + fail("Test " + name + " died, exception and test follows", e, callback); + QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + start(); + } + } + }); + + synchronize(function() { + try { + checkPollution(); + testEnvironment.teardown.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Teardown failed on " + name + ": " + e.message ); + } + + try { + QUnit.reset(); + } catch(e) { + fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset); + } + + if ( config.expected && config.expected != config.assertions.length ) { + QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" ); + } + + var good = 0, bad = 0, + tests = id("qunit-tests"); + + config.stats.all += config.assertions.length; + config.moduleStats.all += config.assertions.length; + + if ( tests ) { + var ol = document.createElement("ol"); + ol.style.display = "none"; + + for ( var i = 0; i < config.assertions.length; i++ ) { + var assertion = config.assertions[i]; + + var li = document.createElement("li"); + li.className = assertion.result ? "pass" : "fail"; + li.appendChild(document.createTextNode(assertion.message || "(no message)")); + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + var b = document.createElement("strong"); + b.innerHTML = name + " (" + bad + ", " + good + ", " + config.assertions.length + ")"; + + addEvent(b, "click", function() { + var next = b.nextSibling, display = next.style.display; + next.style.display = display === "none" ? "block" : "none"; + }); + + addEvent(b, "dblclick", function(e) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() === "strong" ) { + var text = "", node = target.firstChild; + + while ( node.nodeType === 3 ) { + text += node.nodeValue; + node = node.nextSibling; + } + + text = text.replace(/(^\s*|\s*$)/g, ""); + + if ( window.location ) { + window.location.href = window.location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent(text); + } + } + }); + + var li = document.createElement("li"); + li.className = bad ? "fail" : "pass"; + li.appendChild( b ); + li.appendChild( ol ); + tests.appendChild( li ); + + if ( bad ) { + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "block"; + id("qunit-filter-pass").disabled = null; + id("qunit-filter-missing").disabled = null; + } + } + + } else { + for ( var i = 0; i < config.assertions.length; i++ ) { + if ( !config.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + QUnit.testDone( testName, bad, config.assertions.length ); + + if ( !window.setTimeout && !config.queue.length ) { + done(); + } + }); + + if ( window.setTimeout && !config.doneTimer ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + } + }, + + /** + * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + */ + expect: function(asserts) { + config.expected = asserts; + }, + + /** + * Asserts true. + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function(a, msg) { + QUnit.log(a, msg); + + config.assertions.push({ + result: !!a, + message: msg + }); + }, + + /** + * Checks that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * + * Prefered to ok( actual == expected, message ) + * + * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); + * + * @param Object actual + * @param Object expected + * @param String message (optional) + */ + equal: function(actual, expected, message) { + push(expected == actual, actual, expected, message); + }, + + notEqual: function(actual, expected, message) { + push(expected != actual, actual, expected, message); + }, + + deepEqual: function(a, b, message) { + push(QUnit.equiv(a, b), a, b, message); + }, + + notDeepEqual: function(a, b, message) { + push(!QUnit.equiv(a, b), a, b, message); + }, + + strictEqual: function(actual, expected, message) { + push(expected === actual, actual, expected, message); + }, + + notStrictEqual: function(actual, expected, message) { + push(expected !== actual, actual, expected, message); + }, + + start: function() { + // A slight delay, to avoid any current callbacks + if ( window.setTimeout ) { + window.setTimeout(function() { + if ( config.timeout ) { + clearTimeout(config.timeout); + } + + config.blocking = false; + process(); + }, 13); + } else { + config.blocking = false; + process(); + } + }, + + stop: function(timeout) { + config.blocking = true; + + if ( timeout && window.setTimeout ) { + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + QUnit.start(); + }, timeout); + } + }, + + /** + * Resets the test setup. Useful for tests that modify the DOM. + */ + reset: function() { + if ( window.jQuery ) { + jQuery("#main").html( config.fixture ); + jQuery.event.global = {}; + jQuery.ajaxSettings = extend({}, config.ajaxSettings); + } + }, + + /** + * Trigger an event on an element. + * + * @example triggerEvent( document.body, "click" ); + * + * @param DOMElement elem + * @param String type + */ + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent("MouseEvents"); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent( event ); + + } else if ( elem.fireEvent ) { + elem.fireEvent("on"+type); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return Object.prototype.toString.call( obj ) === "[object "+ type +"]"; + }, + + // Logging callbacks + done: function(failures, total) {}, + log: function(result, message) {}, + testStart: function(name) {}, + testDone: function(name, failures, total) {}, + moduleStart: function(name, testEnvironment) {}, + moduleDone: function(name, failures, total) {} +}; + +// Backwards compatibility, deprecated +QUnit.equals = QUnit.equal; +QUnit.same = QUnit.deepEqual; + +// Maintain internal state +var config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true +}; + +// Load paramaters +(function() { + var location = window.location || { search: "", protocol: "file:" }, + GETParams = location.search.slice(1).split('&'); + + for ( var i = 0; i < GETParams.length; i++ ) { + GETParams[i] = decodeURIComponent( GETParams[i] ); + if ( GETParams[i] === "noglobals" ) { + GETParams.splice( i, 1 ); + i--; + config.noglobals = true; + } else if ( GETParams[i].search('=') > -1 ) { + GETParams.splice( i, 1 ); + i--; + } + } + + // restrict modules/tests by get parameters + config.filters = GETParams; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !!(location.protocol === 'file:'); +})(); + +// Expose the API as global variables, unless an 'exports' +// object exists, in that case we assume we're in CommonJS +if ( typeof exports === "undefined" || typeof require === "undefined" ) { + extend(window, QUnit); + window.QUnit = QUnit; +} else { + extend(exports, QUnit); + exports.QUnit = QUnit; +} + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +addEvent(window, "load", function() { + // Initialize the config, saving the execution queue + var oldconfig = extend({}, config); + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + var userAgent = id("qunit-userAgent"); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "none"; + + var filter = document.createElement("input"); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + filter.disabled = true; + addEvent( filter, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("pass") > -1 ) { + li[i].style.display = filter.checked ? "none" : ""; + } + } + }); + toolbar.appendChild( filter ); + + var label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-pass"); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + + var missing = document.createElement("input"); + missing.type = "checkbox"; + missing.id = "qunit-filter-missing"; + missing.disabled = true; + addEvent( missing, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) { + li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block"; + } + } + }); + toolbar.appendChild( missing ); + + label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-missing"); + label.innerHTML = "Hide missing tests (untested code is broken code)"; + toolbar.appendChild( label ); + } + + var main = id('main'); + if ( main ) { + config.fixture = main.innerHTML; + } + + if ( window.jQuery ) { + config.ajaxSettings = window.jQuery.ajaxSettings; + } + + QUnit.start(); +}); + +function done() { + if ( config.doneTimer && window.clearTimeout ) { + window.clearTimeout( config.doneTimer ); + config.doneTimer = null; + } + + if ( config.queue.length ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + + return; + } + + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + html = ['Tests completed in ', + +new Date - config.started, ' milliseconds.
    ', + '', config.stats.all - config.stats.bad, ' tests of ', config.stats.all, ' passed, ', config.stats.bad,' failed.'].join(''); + + if ( banner ) { + banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); + } + + if ( tests ) { + var result = id("qunit-testresult"); + + if ( !result ) { + result = document.createElement("p"); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests.nextSibling ); + } + + result.innerHTML = html; + } + + QUnit.done( config.stats.bad, config.stats.all ); +} + +function validTest( name ) { + var i = config.filters.length, + run = false; + + if ( !i ) { + return true; + } + + while ( i-- ) { + var filter = config.filters[i], + not = filter.charAt(0) == '!'; + + if ( not ) { + filter = filter.slice(1); + } + + if ( name.indexOf(filter) !== -1 ) { + return !not; + } + + if ( not ) { + run = true; + } + } + + return run; +} + +function push(result, actual, expected, message) { + message = message || (result ? "okay" : "failed"); + QUnit.ok( result, result ? message + ": " + expected : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) ); +} + +function synchronize( callback ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process(); + } +} + +function process() { + while ( config.queue.length && !config.blocking ) { + config.queue.shift()(); + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + config.pollution.push( key ); + } + } +} + +function checkPollution( name ) { + var old = config.pollution; + saveGlobal(); + + var newGlobals = diff( old, config.pollution ); + if ( newGlobals.length > 0 ) { + ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); + config.expected++; + } + + var deletedGlobals = diff( config.pollution, old ); + if ( deletedGlobals.length > 0 ) { + ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); + config.expected++; + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var result = a.slice(); + for ( var i = 0; i < result.length; i++ ) { + for ( var j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; +} + +function fail(message, exception, callback) { + if ( typeof console !== "undefined" && console.error && console.warn ) { + console.error(message); + console.error(exception); + console.warn(callback.toString()); + + } else if ( window.opera && opera.postError ) { + opera.postError(message, exception, callback.toString); + } +} + +function extend(a, b) { + for ( var prop in b ) { + a[prop] = b[prop]; + } + + return a; +} + +function addEvent(elem, type, fn) { + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, fn ); + } else { + fn(); + } +} + +function id(name) { + return !!(typeof document !== "undefined" && document && document.getElementById) && + document.getElementById( name ); +} + +// Test for equality any JavaScript type. +// Discussions and reference: http://philrathe.com/articles/equiv +// Test suites: http://philrathe.com/tests/equiv +// Author: Philippe Rathé +QUnit.equiv = function () { + + var innerEquiv; // the real equiv function + var callers = []; // stack to decide between skip/abort functions + + + // Determine what is o. + function hoozit(o) { + if (QUnit.is("String", o)) { + return "string"; + + } else if (QUnit.is("Boolean", o)) { + return "boolean"; + + } else if (QUnit.is("Number", o)) { + + if (isNaN(o)) { + return "nan"; + } else { + return "number"; + } + + } else if (typeof o === "undefined") { + return "undefined"; + + // consider: typeof null === object + } else if (o === null) { + return "null"; + + // consider: typeof [] === object + } else if (QUnit.is( "Array", o)) { + return "array"; + + // consider: typeof new Date() === object + } else if (QUnit.is( "Date", o)) { + return "date"; + + // consider: /./ instanceof Object; + // /./ instanceof RegExp; + // typeof /./ === "function"; // => false in IE and Opera, + // true in FF and Safari + } else if (QUnit.is( "RegExp", o)) { + return "regexp"; + + } else if (typeof o === "object") { + return "object"; + + } else if (QUnit.is( "Function", o)) { + return "function"; + } else { + return undefined; + } + } + + // Call the o related callback with the given arguments. + function bindCallbacks(o, callbacks, args) { + var prop = hoozit(o); + if (prop) { + if (hoozit(callbacks[prop]) === "function") { + return callbacks[prop].apply(callbacks, args); + } else { + return callbacks[prop]; // or undefined + } + } + } + + var callbacks = function () { + + // for string, boolean, number and null + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + // to catch short annotaion VS 'new' annotation of a declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function (b) { + return isNaN(b); + }, + + "date": function (b, a) { + return hoozit(b) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function (b, a) { + return hoozit(b) === "regexp" && + a.source === b.source && // the regex itself + a.global === b.global && // and its modifers (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function () { + var caller = callers[callers.length - 1]; + return caller !== Object && + typeof caller !== "undefined"; + }, + + "array": function (b, a) { + var i; + var len; + + // b could be an object literal here + if ( ! (hoozit(b) === "array")) { + return false; + } + + len = a.length; + if (len !== b.length) { // safe and faster + return false; + } + for (i = 0; i < len; i++) { + if ( ! innerEquiv(a[i], b[i])) { + return false; + } + } + return true; + }, + + "object": function (b, a) { + var i; + var eq = true; // unless we can proove it + var aProperties = [], bProperties = []; // collection of strings + + // comparing constructors is more strict than using instanceof + if ( a.constructor !== b.constructor) { + return false; + } + + // stack constructor before traversing properties + callers.push(a.constructor); + + for (i in a) { // be strict: don't ensures hasOwnProperty and go deep + + aProperties.push(i); // collect a's properties + + if ( ! innerEquiv(a[i], b[i])) { + eq = false; + } + } + + callers.pop(); // unstack, we are done + + for (i in b) { + bProperties.push(i); // collect b's properties + } + + // Ensures identical properties name + return eq && innerEquiv(aProperties.sort(), bProperties.sort()); + } + }; + }(); + + innerEquiv = function () { // can take multiple arguments + var args = Array.prototype.slice.apply(arguments); + if (args.length < 2) { + return true; // end transition + } + + return (function (a, b) { + if (a === b) { + return true; // catch the most you can + } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || hoozit(a) !== hoozit(b)) { + return false; // don't lose time with error prone cases + } else { + return bindCallbacks(a, callbacks, [b, a]); + } + + // apply transition with (1..n) arguments + })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); + }; + + return innerEquiv; + +}(); + +/** + * jsDump + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php) + * Date: 5/15/2008 + * @projectDescription Advanced and extensible data dumping for Javascript. + * @version 1.0.0 + * @author Ariel Flesler + * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + */ +QUnit.jsDump = (function() { + function quote( str ) { + return '"' + str.toString().replace(/"/g, '\\"') + '"'; + }; + function literal( o ) { + return o + ''; + }; + function join( pre, arr, post ) { + var s = jsDump.separator(), + base = jsDump.indent(), + inner = jsDump.indent(1); + if ( arr.join ) + arr = arr.join( ',' + s + inner ); + if ( !arr ) + return pre + post; + return [ pre, inner + arr, base + post ].join(s); + }; + function array( arr ) { + var i = arr.length, ret = Array(i); + this.up(); + while ( i-- ) + ret[i] = this.parse( arr[i] ); + this.down(); + return join( '[', ret, ']' ); + }; + + var reName = /^function (\w+)/; + + var jsDump = { + parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance + var parser = this.parsers[ type || this.typeOf(obj) ]; + type = typeof parser; + + return type == 'function' ? parser.call( this, obj ) : + type == 'string' ? parser : + this.parsers.error; + }, + typeOf:function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if (typeof obj === "undefined") { + type = "undefined"; + } else if (QUnit.is("RegExp", obj)) { + type = "regexp"; + } else if (QUnit.is("Date", obj)) { + type = "date"; + } else if (QUnit.is("Function", obj)) { + type = "function"; + } else if (QUnit.is("Array", obj)) { + type = "array"; + } else if (QUnit.is("Window", obj) || QUnit.is("global", obj)) { + type = "window"; + } else if (QUnit.is("HTMLDocument", obj)) { + type = "document"; + } else if (QUnit.is("HTMLCollection", obj) || QUnit.is("NodeList", obj)) { + type = "nodelist"; + } else if (/^\[object HTML/.test(Object.prototype.toString.call( obj ))) { + type = "node"; + } else { + type = typeof obj; + } + return type; + }, + separator:function() { + return this.multiline ? this.HTML ? '
    ' : '\n' : this.HTML ? ' ' : ' '; + }, + indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + if ( !this.multiline ) + return ''; + var chr = this.indentChar; + if ( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,' '); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ) { + this._depth_ += a || 1; + }, + down:function( a ) { + this._depth_ -= a || 1; + }, + setParser:function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + undefined:'undefined', + 'function':function( fn ) { + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if ( name ) + ret += ' ' + name; + ret += '('; + + ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, this.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + object:function( map ) { + var ret = [ ]; + this.up(); + for ( var key in map ) + ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); + this.down(); + return join( '{', ret, '}' ); + }, + node:function( node ) { + var open = this.HTML ? '<' : '<', + close = this.HTML ? '>' : '>'; + + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + + for ( var a in this.DOMAttrs ) { + var val = node[this.DOMAttrs[a]]; + if ( val ) + ret += ' ' + a + '=' + this.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function + var l = fn.length; + if ( !l ) return ''; + + var args = Array(l); + while ( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:true,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:true //if true, items in a collection, are separated by a \n, else just a space. + }; + + return jsDump; +})(); + +})(this); diff --git a/node_modules/uri-js/tests/test-es5-min.html b/node_modules/uri-js/tests/test-es5-min.html new file mode 100644 index 0000000..b841c75 --- /dev/null +++ b/node_modules/uri-js/tests/test-es5-min.html @@ -0,0 +1,17 @@ + + + + + + + + + +

    URI.js Test Suite

    +

    +
    +

    +
      + + diff --git a/node_modules/uri-js/tests/test-es5.html b/node_modules/uri-js/tests/test-es5.html new file mode 100644 index 0000000..2d89c66 --- /dev/null +++ b/node_modules/uri-js/tests/test-es5.html @@ -0,0 +1,17 @@ + + + + + + + + + +

      URI.js Test Suite

      +

      +
      +

      +
        + + diff --git a/node_modules/uri-js/tests/tests.js b/node_modules/uri-js/tests/tests.js new file mode 100644 index 0000000..624191c --- /dev/null +++ b/node_modules/uri-js/tests/tests.js @@ -0,0 +1,774 @@ +// +// +// Tests +// +// + +if (typeof URI === "undefined") { + var URI = require("../dist/es5/uri.all"); +} + +test("Acquire URI", function () { + //URI = require("./uri").URI; + ok(URI); +}); + +test("URI Parsing", function () { + var components; + + //scheme + components = URI.parse("uri:"); + strictEqual(components.error, undefined, "scheme errors"); + strictEqual(components.scheme, "uri", "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //userinfo + components = URI.parse("//@"); + strictEqual(components.error, undefined, "userinfo errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, "@", "authority"); + strictEqual(components.userinfo, "", "userinfo"); + strictEqual(components.host, "", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //host + components = URI.parse("//"); + strictEqual(components.error, undefined, "host errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, "", "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //port + components = URI.parse("//:"); + strictEqual(components.error, undefined, "port errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, ":", "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "", "host"); + strictEqual(components.port, "", "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //path + components = URI.parse(""); + strictEqual(components.error, undefined, "path errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //query + components = URI.parse("?"); + strictEqual(components.error, undefined, "query errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, "", "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //fragment + components = URI.parse("#"); + strictEqual(components.error, undefined, "fragment errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, "", "fragment"); + + //fragment with character tabulation + components = URI.parse("#\t"); + strictEqual(components.error, undefined, "path errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, "%09", "fragment"); + + //fragment with line feed + components = URI.parse("#\n"); + strictEqual(components.error, undefined, "path errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, "%0A", "fragment"); + + //fragment with line tabulation + components = URI.parse("#\v"); + strictEqual(components.error, undefined, "path errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, "%0B", "fragment"); + + //fragment with form feed + components = URI.parse("#\f"); + strictEqual(components.error, undefined, "path errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, "%0C", "fragment"); + + //fragment with carriage return + components = URI.parse("#\r"); + strictEqual(components.error, undefined, "path errors"); + strictEqual(components.scheme, undefined, "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, "%0D", "fragment"); + + //all + components = URI.parse("uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body"); + strictEqual(components.error, undefined, "all errors"); + strictEqual(components.scheme, "uri", "scheme"); + //strictEqual(components.authority, "user:pass@example.com:123", "authority"); + strictEqual(components.userinfo, "user:pass", "userinfo"); + strictEqual(components.host, "example.com", "host"); + strictEqual(components.port, 123, "port"); + strictEqual(components.path, "/one/two.three", "path"); + strictEqual(components.query, "q1=a1&q2=a2", "query"); + strictEqual(components.fragment, "body", "fragment"); + + //IPv4address + components = URI.parse("//10.10.10.10"); + strictEqual(components.error, undefined, "IPv4address errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "10.10.10.10", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //IPv6address + components = URI.parse("//[2001:db8::7]"); + strictEqual(components.error, undefined, "IPv4address errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "2001:db8::7", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //mixed IPv4address & IPv6address + components = URI.parse("//[::ffff:129.144.52.38]"); + strictEqual(components.error, undefined, "IPv4address errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "::ffff:129.144.52.38", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //mixed IPv4address & reg-name, example from terion-name (https://github.com/garycourt/uri-js/issues/4) + components = URI.parse("uri://10.10.10.10.example.com/en/process"); + strictEqual(components.error, undefined, "mixed errors"); + strictEqual(components.scheme, "uri", "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "10.10.10.10.example.com", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "/en/process", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //IPv6address, example from bkw (https://github.com/garycourt/uri-js/pull/16) + components = URI.parse("//[2606:2800:220:1:248:1893:25c8:1946]/test"); + strictEqual(components.error, undefined, "IPv6address errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "2606:2800:220:1:248:1893:25c8:1946", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "/test", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //IPv6address, example from RFC 5952 + components = URI.parse("//[2001:db8::1]:80"); + strictEqual(components.error, undefined, "IPv6address errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "2001:db8::1", "host"); + strictEqual(components.port, 80, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //IPv6address with zone identifier, RFC 6874 + components = URI.parse("//[fe80::a%25en1]"); + strictEqual(components.error, undefined, "IPv4address errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "fe80::a%en1", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + + //IPv6address with an unescaped interface specifier, example from pekkanikander (https://github.com/garycourt/uri-js/pull/22) + components = URI.parse("//[2001:db8::7%en0]"); + strictEqual(components.error, undefined, "IPv6address interface errors"); + strictEqual(components.scheme, undefined, "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, "2001:db8::7%en0", "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, "", "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); +}); + +test("URI Serialization", function () { + var components = { + scheme : undefined, + userinfo : undefined, + host : undefined, + port : undefined, + path : undefined, + query : undefined, + fragment : undefined + }; + strictEqual(URI.serialize(components), "", "Undefined Components"); + + components = { + scheme : "", + userinfo : "", + host : "", + port : 0, + path : "", + query : "", + fragment : "" + }; + strictEqual(URI.serialize(components), "//@:0?#", "Empty Components"); + + components = { + scheme : "uri", + userinfo : "foo:bar", + host : "example.com", + port : 1, + path : "path", + query : "query", + fragment : "fragment" + }; + strictEqual(URI.serialize(components), "uri://foo:bar@example.com:1/path?query#fragment", "All Components"); + + strictEqual(URI.serialize({path:"//path"}), "/%2Fpath", "Double slash path"); + strictEqual(URI.serialize({path:"foo:bar"}), "foo%3Abar", "Colon path"); + strictEqual(URI.serialize({path:"?query"}), "%3Fquery", "Query path"); + + //mixed IPv4address & reg-name, example from terion-name (https://github.com/garycourt/uri-js/issues/4) + strictEqual(URI.serialize({host:"10.10.10.10.example.com"}), "//10.10.10.10.example.com", "Mixed IPv4address & reg-name"); + + //IPv6address + strictEqual(URI.serialize({host:"2001:db8::7"}), "//[2001:db8::7]", "IPv6 Host"); + strictEqual(URI.serialize({host:"::ffff:129.144.52.38"}), "//[::ffff:129.144.52.38]", "IPv6 Mixed Host"); + strictEqual(URI.serialize({host:"2606:2800:220:1:248:1893:25c8:1946"}), "//[2606:2800:220:1:248:1893:25c8:1946]", "IPv6 Full Host"); + + //IPv6address with zone identifier, RFC 6874 + strictEqual(URI.serialize({host:"fe80::a%en1"}), "//[fe80::a%25en1]", "IPv6 Zone Unescaped Host"); + strictEqual(URI.serialize({host:"fe80::a%25en1"}), "//[fe80::a%25en1]", "IPv6 Zone Escaped Host"); +}); + +test("URI Resolving", function () { + //normal examples from RFC 3986 + var base = "uri://a/b/c/d;p?q"; + strictEqual(URI.resolve(base, "g:h"), "g:h", "g:h"); + strictEqual(URI.resolve(base, "g:h"), "g:h", "g:h"); + strictEqual(URI.resolve(base, "g"), "uri://a/b/c/g", "g"); + strictEqual(URI.resolve(base, "./g"), "uri://a/b/c/g", "./g"); + strictEqual(URI.resolve(base, "g/"), "uri://a/b/c/g/", "g/"); + strictEqual(URI.resolve(base, "/g"), "uri://a/g", "/g"); + strictEqual(URI.resolve(base, "//g"), "uri://g", "//g"); + strictEqual(URI.resolve(base, "?y"), "uri://a/b/c/d;p?y", "?y"); + strictEqual(URI.resolve(base, "g?y"), "uri://a/b/c/g?y", "g?y"); + strictEqual(URI.resolve(base, "#s"), "uri://a/b/c/d;p?q#s", "#s"); + strictEqual(URI.resolve(base, "g#s"), "uri://a/b/c/g#s", "g#s"); + strictEqual(URI.resolve(base, "g?y#s"), "uri://a/b/c/g?y#s", "g?y#s"); + strictEqual(URI.resolve(base, ";x"), "uri://a/b/c/;x", ";x"); + strictEqual(URI.resolve(base, "g;x"), "uri://a/b/c/g;x", "g;x"); + strictEqual(URI.resolve(base, "g;x?y#s"), "uri://a/b/c/g;x?y#s", "g;x?y#s"); + strictEqual(URI.resolve(base, ""), "uri://a/b/c/d;p?q", ""); + strictEqual(URI.resolve(base, "."), "uri://a/b/c/", "."); + strictEqual(URI.resolve(base, "./"), "uri://a/b/c/", "./"); + strictEqual(URI.resolve(base, ".."), "uri://a/b/", ".."); + strictEqual(URI.resolve(base, "../"), "uri://a/b/", "../"); + strictEqual(URI.resolve(base, "../g"), "uri://a/b/g", "../g"); + strictEqual(URI.resolve(base, "../.."), "uri://a/", "../.."); + strictEqual(URI.resolve(base, "../../"), "uri://a/", "../../"); + strictEqual(URI.resolve(base, "../../g"), "uri://a/g", "../../g"); + + //abnormal examples from RFC 3986 + strictEqual(URI.resolve(base, "../../../g"), "uri://a/g", "../../../g"); + strictEqual(URI.resolve(base, "../../../../g"), "uri://a/g", "../../../../g"); + + strictEqual(URI.resolve(base, "/./g"), "uri://a/g", "/./g"); + strictEqual(URI.resolve(base, "/../g"), "uri://a/g", "/../g"); + strictEqual(URI.resolve(base, "g."), "uri://a/b/c/g.", "g."); + strictEqual(URI.resolve(base, ".g"), "uri://a/b/c/.g", ".g"); + strictEqual(URI.resolve(base, "g.."), "uri://a/b/c/g..", "g.."); + strictEqual(URI.resolve(base, "..g"), "uri://a/b/c/..g", "..g"); + + strictEqual(URI.resolve(base, "./../g"), "uri://a/b/g", "./../g"); + strictEqual(URI.resolve(base, "./g/."), "uri://a/b/c/g/", "./g/."); + strictEqual(URI.resolve(base, "g/./h"), "uri://a/b/c/g/h", "g/./h"); + strictEqual(URI.resolve(base, "g/../h"), "uri://a/b/c/h", "g/../h"); + strictEqual(URI.resolve(base, "g;x=1/./y"), "uri://a/b/c/g;x=1/y", "g;x=1/./y"); + strictEqual(URI.resolve(base, "g;x=1/../y"), "uri://a/b/c/y", "g;x=1/../y"); + + strictEqual(URI.resolve(base, "g?y/./x"), "uri://a/b/c/g?y/./x", "g?y/./x"); + strictEqual(URI.resolve(base, "g?y/../x"), "uri://a/b/c/g?y/../x", "g?y/../x"); + strictEqual(URI.resolve(base, "g#s/./x"), "uri://a/b/c/g#s/./x", "g#s/./x"); + strictEqual(URI.resolve(base, "g#s/../x"), "uri://a/b/c/g#s/../x", "g#s/../x"); + + strictEqual(URI.resolve(base, "uri:g"), "uri:g", "uri:g"); + strictEqual(URI.resolve(base, "uri:g", {tolerant:true}), "uri://a/b/c/g", "uri:g"); + + //examples by PAEz + strictEqual(URI.resolve("//www.g.com/","/adf\ngf"), "//www.g.com/adf%0Agf", "/adf\\ngf"); + strictEqual(URI.resolve("//www.g.com/error\n/bleh/bleh",".."), "//www.g.com/error%0A/", "//www.g.com/error\\n/bleh/bleh"); +}); + +test("URI Normalizing", function () { + //test from RFC 3987 + strictEqual(URI.normalize("uri://www.example.org/red%09ros\xE9#red"), "uri://www.example.org/red%09ros%C3%A9#red"); + + //IPv4address + strictEqual(URI.normalize("//192.068.001.000"), "//192.68.1.0"); + + //IPv6address, example from RFC 3513 + strictEqual(URI.normalize("http://[1080::8:800:200C:417A]/"), "http://[1080::8:800:200c:417a]/"); + + //IPv6address, examples from RFC 5952 + strictEqual(URI.normalize("//[2001:0db8::0001]/"), "//[2001:db8::1]/"); + strictEqual(URI.normalize("//[2001:db8::1:0000:1]/"), "//[2001:db8::1:0:1]/"); + strictEqual(URI.normalize("//[2001:db8:0:0:0:0:2:1]/"), "//[2001:db8::2:1]/"); + strictEqual(URI.normalize("//[2001:db8:0:1:1:1:1:1]/"), "//[2001:db8:0:1:1:1:1:1]/"); + strictEqual(URI.normalize("//[2001:0:0:1:0:0:0:1]/"), "//[2001:0:0:1::1]/"); + strictEqual(URI.normalize("//[2001:db8:0:0:1:0:0:1]/"), "//[2001:db8::1:0:0:1]/"); + strictEqual(URI.normalize("//[2001:DB8::1]/"), "//[2001:db8::1]/"); + strictEqual(URI.normalize("//[0:0:0:0:0:ffff:192.0.2.1]/"), "//[::ffff:192.0.2.1]/"); + + //Mixed IPv4 and IPv6 address + strictEqual(URI.normalize("//[1:2:3:4:5:6:192.0.2.1]/"), "//[1:2:3:4:5:6:192.0.2.1]/"); + strictEqual(URI.normalize("//[1:2:3:4:5:6:192.068.001.000]/"), "//[1:2:3:4:5:6:192.68.1.0]/"); +}); + +test("URI Equals", function () { + //test from RFC 3986 + strictEqual(URI.equal("example://a/b/c/%7Bfoo%7D", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d"), true); + + //test from RFC 3987 + strictEqual(URI.equal("http://example.org/~user", "http://example.org/%7euser"), true); +}); + +test("Escape Component", function () { + var chr; + for (var d = 0; d <= 129; ++d) { + chr = String.fromCharCode(d); + if (!chr.match(/[\$\&\+\,\;\=]/)) { + strictEqual(URI.escapeComponent(chr), encodeURIComponent(chr)); + } else { + strictEqual(URI.escapeComponent(chr), chr); + } + } + strictEqual(URI.escapeComponent("\u00c0"), encodeURIComponent("\u00c0")); + strictEqual(URI.escapeComponent("\u07ff"), encodeURIComponent("\u07ff")); + strictEqual(URI.escapeComponent("\u0800"), encodeURIComponent("\u0800")); + strictEqual(URI.escapeComponent("\u30a2"), encodeURIComponent("\u30a2")); +}); + +test("Unescape Component", function () { + var chr; + for (var d = 0; d <= 129; ++d) { + chr = String.fromCharCode(d); + strictEqual(URI.unescapeComponent(encodeURIComponent(chr)), chr); + } + strictEqual(URI.unescapeComponent(encodeURIComponent("\u00c0")), "\u00c0"); + strictEqual(URI.unescapeComponent(encodeURIComponent("\u07ff")), "\u07ff"); + strictEqual(URI.unescapeComponent(encodeURIComponent("\u0800")), "\u0800"); + strictEqual(URI.unescapeComponent(encodeURIComponent("\u30a2")), "\u30a2"); +}); + +// +// IRI +// + + + +var IRI_OPTION = { iri : true, unicodeSupport : true }; + +test("IRI Parsing", function () { + var components = URI.parse("uri://us\xA0er:pa\uD7FFss@example.com:123/o\uF900ne/t\uFDCFwo.t\uFDF0hree?q1=a1\uF8FF\uE000&q2=a2#bo\uFFEFdy", IRI_OPTION); + strictEqual(components.error, undefined, "all errors"); + strictEqual(components.scheme, "uri", "scheme"); + //strictEqual(components.authority, "us\xA0er:pa\uD7FFss@example.com:123", "authority"); + strictEqual(components.userinfo, "us\xA0er:pa\uD7FFss", "userinfo"); + strictEqual(components.host, "example.com", "host"); + strictEqual(components.port, 123, "port"); + strictEqual(components.path, "/o\uF900ne/t\uFDCFwo.t\uFDF0hree", "path"); + strictEqual(components.query, "q1=a1\uF8FF\uE000&q2=a2", "query"); + strictEqual(components.fragment, "bo\uFFEFdy", "fragment"); +}); + +test("IRI Serialization", function () { + var components = { + scheme : "uri", + userinfo : "us\xA0er:pa\uD7FFss", + host : "example.com", + port : 123, + path : "/o\uF900ne/t\uFDCFwo.t\uFDF0hree", + query : "q1=a1\uF8FF\uE000&q2=a2", + fragment : "bo\uFFEFdy\uE001" + }; + strictEqual(URI.serialize(components, IRI_OPTION), "uri://us\xA0er:pa\uD7FFss@example.com:123/o\uF900ne/t\uFDCFwo.t\uFDF0hree?q1=a1\uF8FF\uE000&q2=a2#bo\uFFEFdy%EE%80%81"); +}); + +test("IRI Normalizing", function () { + strictEqual(URI.normalize("uri://www.example.org/red%09ros\xE9#red", IRI_OPTION), "uri://www.example.org/red%09ros\xE9#red"); +}); + +test("IRI Equals", function () { + //example from RFC 3987 + strictEqual(URI.equal("example://a/b/c/%7Bfoo%7D/ros\xE9", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d/ros%C3%A9", IRI_OPTION), true); +}); + +test("Convert IRI to URI", function () { + //example from RFC 3987 + strictEqual(URI.serialize(URI.parse("uri://www.example.org/red%09ros\xE9#red", IRI_OPTION)), "uri://www.example.org/red%09ros%C3%A9#red"); + + //Internationalized Domain Name conversion via punycode example from RFC 3987 + strictEqual(URI.serialize(URI.parse("uri://r\xE9sum\xE9.example.org", {iri:true, domainHost:true}), {domainHost:true}), "uri://xn--rsum-bpad.example.org"); +}); + +test("Convert URI to IRI", function () { + //examples from RFC 3987 + strictEqual(URI.serialize(URI.parse("uri://www.example.org/D%C3%BCrst"), IRI_OPTION), "uri://www.example.org/D\xFCrst"); + strictEqual(URI.serialize(URI.parse("uri://www.example.org/D%FCrst"), IRI_OPTION), "uri://www.example.org/D%FCrst"); + strictEqual(URI.serialize(URI.parse("uri://xn--99zt52a.example.org/%e2%80%ae"), IRI_OPTION), "uri://xn--99zt52a.example.org/%E2%80%AE"); //or uri://\u7D0D\u8C46.example.org/%E2%80%AE + + //Internationalized Domain Name conversion via punycode example from RFC 3987 + strictEqual(URI.serialize(URI.parse("uri://xn--rsum-bpad.example.org", {domainHost:true}), {iri:true, domainHost:true}), "uri://r\xE9sum\xE9.example.org"); +}); + +// +// HTTP +// + +if (URI.SCHEMES["http"]) { + + //module("HTTP"); + + test("HTTP Equals", function () { + //test from RFC 2616 + strictEqual(URI.equal("http://abc.com:80/~smith/home.html", "http://abc.com/~smith/home.html"), true); + strictEqual(URI.equal("http://ABC.com/%7Esmith/home.html", "http://abc.com/~smith/home.html"), true); + strictEqual(URI.equal("http://ABC.com:/%7esmith/home.html", "http://abc.com/~smith/home.html"), true); + strictEqual(URI.equal("HTTP://ABC.COM", "http://abc.com/"), true); + //test from RFC 3986 + strictEqual(URI.equal("http://example.com:/", "http://example.com:80/"), true); + }); + +} + +if (URI.SCHEMES["https"]) { + + //module("HTTPS"); + + test("HTTPS Equals", function () { + strictEqual(URI.equal("https://example.com", "https://example.com:443/"), true); + strictEqual(URI.equal("https://example.com:/", "https://example.com:443/"), true); + }); + +} + +// +// URN +// + +if (URI.SCHEMES["urn"]) { + + //module("URN"); + + test("URN Parsing", function () { + //example from RFC 2141 + var components = URI.parse("urn:foo:a123,456"); + strictEqual(components.error, undefined, "errors"); + strictEqual(components.scheme, "urn", "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, undefined, "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + strictEqual(components.nid, "foo", "nid"); + strictEqual(components.nss, "a123,456", "nss"); + }); + + test("URN Serialization", function () { + //example from RFC 2141 + var components = { + scheme : "urn", + nid : "foo", + nss : "a123,456" + }; + strictEqual(URI.serialize(components), "urn:foo:a123,456"); + }); + + test("URN Equals", function () { + //test from RFC 2141 + strictEqual(URI.equal("urn:foo:a123,456", "urn:foo:a123,456"), true); + strictEqual(URI.equal("urn:foo:a123,456", "URN:foo:a123,456"), true); + strictEqual(URI.equal("urn:foo:a123,456", "urn:FOO:a123,456"), true); + strictEqual(URI.equal("urn:foo:a123,456", "urn:foo:A123,456"), false); + strictEqual(URI.equal("urn:foo:a123%2C456", "URN:FOO:a123%2c456"), true); + }); + + test("URN Resolving", function () { + //example from epoberezkin + strictEqual(URI.resolve('', 'urn:some:ip:prop'), 'urn:some:ip:prop'); + strictEqual(URI.resolve('#', 'urn:some:ip:prop'), 'urn:some:ip:prop'); + strictEqual(URI.resolve('urn:some:ip:prop', 'urn:some:ip:prop'), 'urn:some:ip:prop'); + strictEqual(URI.resolve('urn:some:other:prop', 'urn:some:ip:prop'), 'urn:some:ip:prop'); + }); + + // + // URN UUID + // + + test("UUID Parsing", function () { + //example from RFC 4122 + var components = URI.parse("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + strictEqual(components.error, undefined, "errors"); + strictEqual(components.scheme, "urn", "scheme"); + //strictEqual(components.authority, undefined, "authority"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, undefined, "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + strictEqual(components.nid, "uuid", "nid"); + strictEqual(components.nss, undefined, "nss"); + strictEqual(components.uuid, "f81d4fae-7dec-11d0-a765-00a0c91e6bf6", "uuid"); + + components = URI.parse("urn:uuid:notauuid-7dec-11d0-a765-00a0c91e6bf6"); + notStrictEqual(components.error, undefined, "errors"); + }); + + test("UUID Serialization", function () { + //example from RFC 4122 + var components = { + scheme : "urn", + nid : "uuid", + uuid : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6" + }; + strictEqual(URI.serialize(components), "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + + components = { + scheme : "urn", + nid : "uuid", + uuid : "notauuid-7dec-11d0-a765-00a0c91e6bf6" + }; + strictEqual(URI.serialize(components), "urn:uuid:notauuid-7dec-11d0-a765-00a0c91e6bf6"); + }); + + test("UUID Equals", function () { + strictEqual(URI.equal("URN:UUID:F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6", "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"), true); + }); + + test("URN NID Override", function () { + var components = URI.parse("urn:foo:f81d4fae-7dec-11d0-a765-00a0c91e6bf6", {nid:"uuid"}); + strictEqual(components.error, undefined, "errors"); + strictEqual(components.scheme, "urn", "scheme"); + strictEqual(components.path, undefined, "path"); + strictEqual(components.nid, "foo", "nid"); + strictEqual(components.nss, undefined, "nss"); + strictEqual(components.uuid, "f81d4fae-7dec-11d0-a765-00a0c91e6bf6", "uuid"); + + var components = { + scheme : "urn", + nid : "foo", + uuid : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6" + }; + strictEqual(URI.serialize(components, {nid:"uuid"}), "urn:foo:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + }); +} + +// +// Mailto +// + +if (URI.SCHEMES["mailto"]) { + + //module("Mailto"); + + test("Mailto Parse", function () { + var components; + + //tests from RFC 6068 + + components = URI.parse("mailto:chris@example.com"); + strictEqual(components.error, undefined, "error"); + strictEqual(components.scheme, "mailto", "scheme"); + strictEqual(components.userinfo, undefined, "userinfo"); + strictEqual(components.host, undefined, "host"); + strictEqual(components.port, undefined, "port"); + strictEqual(components.path, undefined, "path"); + strictEqual(components.query, undefined, "query"); + strictEqual(components.fragment, undefined, "fragment"); + deepEqual(components.to, ["chris@example.com"], "to"); + strictEqual(components.subject, undefined, "subject"); + strictEqual(components.body, undefined, "body"); + strictEqual(components.headers, undefined, "headers"); + + components = URI.parse("mailto:infobot@example.com?subject=current-issue"); + deepEqual(components.to, ["infobot@example.com"], "to"); + strictEqual(components.subject, "current-issue", "subject"); + + components = URI.parse("mailto:infobot@example.com?body=send%20current-issue"); + deepEqual(components.to, ["infobot@example.com"], "to"); + strictEqual(components.body, "send current-issue", "body"); + + components = URI.parse("mailto:infobot@example.com?body=send%20current-issue%0D%0Asend%20index"); + deepEqual(components.to, ["infobot@example.com"], "to"); + strictEqual(components.body, "send current-issue\x0D\x0Asend index", "body"); + + components = URI.parse("mailto:list@example.org?In-Reply-To=%3C3469A91.D10AF4C@example.com%3E"); + deepEqual(components.to, ["list@example.org"], "to"); + deepEqual(components.headers, {"In-Reply-To":"<3469A91.D10AF4C@example.com>"}, "headers"); + + components = URI.parse("mailto:majordomo@example.com?body=subscribe%20bamboo-l"); + deepEqual(components.to, ["majordomo@example.com"], "to"); + strictEqual(components.body, "subscribe bamboo-l", "body"); + + components = URI.parse("mailto:joe@example.com?cc=bob@example.com&body=hello"); + deepEqual(components.to, ["joe@example.com"], "to"); + strictEqual(components.body, "hello", "body"); + deepEqual(components.headers, {"cc":"bob@example.com"}, "headers"); + + components = URI.parse("mailto:joe@example.com?cc=bob@example.com?body=hello"); + if (URI.VALIDATE_SUPPORT) ok(components.error, "invalid header fields"); + + components = URI.parse("mailto:gorby%25kremvax@example.com"); + deepEqual(components.to, ["gorby%kremvax@example.com"], "to gorby%kremvax@example.com"); + + components = URI.parse("mailto:unlikely%3Faddress@example.com?blat=foop"); + deepEqual(components.to, ["unlikely?address@example.com"], "to unlikely?address@example.com"); + deepEqual(components.headers, {"blat":"foop"}, "headers"); + + components = URI.parse("mailto:Mike%26family@example.org"); + deepEqual(components.to, ["Mike&family@example.org"], "to Mike&family@example.org"); + + components = URI.parse("mailto:%22not%40me%22@example.org"); + deepEqual(components.to, ['"not@me"@example.org'], "to " + '"not@me"@example.org'); + + components = URI.parse("mailto:%22oh%5C%5Cno%22@example.org"); + deepEqual(components.to, ['"oh\\\\no"@example.org'], "to " + '"oh\\\\no"@example.org'); + + components = URI.parse("mailto:%22%5C%5C%5C%22it's%5C%20ugly%5C%5C%5C%22%22@example.org"); + deepEqual(components.to, ['"\\\\\\"it\'s\\ ugly\\\\\\""@example.org'], "to " + '"\\\\\\"it\'s\\ ugly\\\\\\""@example.org'); + + components = URI.parse("mailto:user@example.org?subject=caf%C3%A9"); + deepEqual(components.to, ["user@example.org"], "to"); + strictEqual(components.subject, "caf\xE9", "subject"); + + components = URI.parse("mailto:user@example.org?subject=%3D%3Futf-8%3FQ%3Fcaf%3DC3%3DA9%3F%3D"); + deepEqual(components.to, ["user@example.org"], "to"); + strictEqual(components.subject, "=?utf-8?Q?caf=C3=A9?=", "subject"); //TODO: Verify this + + components = URI.parse("mailto:user@example.org?subject=%3D%3Fiso-8859-1%3FQ%3Fcaf%3DE9%3F%3D"); + deepEqual(components.to, ["user@example.org"], "to"); + strictEqual(components.subject, "=?iso-8859-1?Q?caf=E9?=", "subject"); //TODO: Verify this + + components = URI.parse("mailto:user@example.org?subject=caf%C3%A9&body=caf%C3%A9"); + deepEqual(components.to, ["user@example.org"], "to"); + strictEqual(components.subject, "caf\xE9", "subject"); + strictEqual(components.body, "caf\xE9", "body"); + + if (URI.IRI_SUPPORT) { + components = URI.parse("mailto:user@%E7%B4%8D%E8%B1%86.example.org?subject=Test&body=NATTO"); + deepEqual(components.to, ["user@xn--99zt52a.example.org"], "to"); + strictEqual(components.subject, "Test", "subject"); + strictEqual(components.body, "NATTO", "body"); + } + + }); + + test("Mailto Serialize", function () { + var components; + + //tests from RFC 6068 + strictEqual(URI.serialize({scheme : "mailto", to : ["chris@example.com"]}), "mailto:chris@example.com"); + strictEqual(URI.serialize({scheme : "mailto", to : ["infobot@example.com"], body : "current-issue"}), "mailto:infobot@example.com?body=current-issue"); + strictEqual(URI.serialize({scheme : "mailto", to : ["infobot@example.com"], body : "send current-issue"}), "mailto:infobot@example.com?body=send%20current-issue"); + strictEqual(URI.serialize({scheme : "mailto", to : ["infobot@example.com"], body : "send current-issue\x0D\x0Asend index"}), "mailto:infobot@example.com?body=send%20current-issue%0D%0Asend%20index"); + strictEqual(URI.serialize({scheme : "mailto", to : ["list@example.org"], headers : {"In-Reply-To" : "<3469A91.D10AF4C@example.com>"}}), "mailto:list@example.org?In-Reply-To=%3C3469A91.D10AF4C@example.com%3E"); + strictEqual(URI.serialize({scheme : "mailto", to : ["majordomo@example.com"], body : "subscribe bamboo-l"}), "mailto:majordomo@example.com?body=subscribe%20bamboo-l"); + strictEqual(URI.serialize({scheme : "mailto", to : ["joe@example.com"], headers : {"cc" : "bob@example.com", "body" : "hello"}}), "mailto:joe@example.com?cc=bob@example.com&body=hello"); + strictEqual(URI.serialize({scheme : "mailto", to : ["gorby%25kremvax@example.com"]}), "mailto:gorby%25kremvax@example.com"); + strictEqual(URI.serialize({scheme : "mailto", to : ["unlikely%3Faddress@example.com"], headers : {"blat" : "foop"}}), "mailto:unlikely%3Faddress@example.com?blat=foop"); + strictEqual(URI.serialize({scheme : "mailto", to : ["Mike&family@example.org"]}), "mailto:Mike%26family@example.org"); + strictEqual(URI.serialize({scheme : "mailto", to : ['"not@me"@example.org']}), "mailto:%22not%40me%22@example.org"); + strictEqual(URI.serialize({scheme : "mailto", to : ['"oh\\\\no"@example.org']}), "mailto:%22oh%5C%5Cno%22@example.org"); + strictEqual(URI.serialize({scheme : "mailto", to : ['"\\\\\\"it\'s\\ ugly\\\\\\""@example.org']}), "mailto:%22%5C%5C%5C%22it's%5C%20ugly%5C%5C%5C%22%22@example.org"); + strictEqual(URI.serialize({scheme : "mailto", to : ["user@example.org"], subject : "caf\xE9"}), "mailto:user@example.org?subject=caf%C3%A9"); + strictEqual(URI.serialize({scheme : "mailto", to : ["user@example.org"], subject : "=?utf-8?Q?caf=C3=A9?="}), "mailto:user@example.org?subject=%3D%3Futf-8%3FQ%3Fcaf%3DC3%3DA9%3F%3D"); + strictEqual(URI.serialize({scheme : "mailto", to : ["user@example.org"], subject : "=?iso-8859-1?Q?caf=E9?="}), "mailto:user@example.org?subject=%3D%3Fiso-8859-1%3FQ%3Fcaf%3DE9%3F%3D"); + strictEqual(URI.serialize({scheme : "mailto", to : ["user@example.org"], subject : "caf\xE9", body : "caf\xE9"}), "mailto:user@example.org?subject=caf%C3%A9&body=caf%C3%A9"); + if (URI.IRI_SUPPORT) { + strictEqual(URI.serialize({scheme : "mailto", to : ["us\xE9r@\u7d0d\u8c46.example.org"], subject : "Test", body : "NATTO"}), "mailto:us%C3%A9r@xn--99zt52a.example.org?subject=Test&body=NATTO"); + } + + }); + + test("Mailto Equals", function () { + //tests from RFC 6068 + strictEqual(URI.equal("mailto:addr1@an.example,addr2@an.example", "mailto:?to=addr1@an.example,addr2@an.example"), true); + strictEqual(URI.equal("mailto:?to=addr1@an.example,addr2@an.example", "mailto:addr1@an.example?to=addr2@an.example"), true); + }); + +} diff --git a/node_modules/uri-js/tsconfig.json b/node_modules/uri-js/tsconfig.json new file mode 100644 index 0000000..e289985 --- /dev/null +++ b/node_modules/uri-js/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es2015", + "target": "esnext", + "noImplicitAny": true, + "sourceMap": true, + "alwaysStrict": true, + "declaration": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "importHelpers": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "outDir": "dist/esnext", + "strictNullChecks": true + }, + "include": [ + "src/**/*" + ] +} diff --git a/node_modules/uri-js/yarn.lock b/node_modules/uri-js/yarn.lock new file mode 100644 index 0000000..569687d --- /dev/null +++ b/node_modules/uri-js/yarn.lock @@ -0,0 +1,1902 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-es2016@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" + dependencies: + babel-plugin-transform-exponentiation-operator "^6.24.1" + +babel-preset-es2017@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.24.1" + +babel-preset-latest@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz#677de069154a7485c2d25c577c02f624b85b85e8" + dependencies: + babel-preset-es2015 "^6.24.1" + babel-preset-es2016 "^6.24.1" + babel-preset-es2017 "^6.24.1" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +builtin-modules@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.11.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.4.tgz#f2c8bf181f2a80b92f360121429ce63a2f0aeae0" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash@^4.17.4: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha-qunit-ui@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mocha-qunit-ui/-/mocha-qunit-ui-0.1.3.tgz#e3e1ff1dac33222b10cef681efd7f82664141ea9" + +mocha@^3.2.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +nan@^2.3.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +rc@^1.1.7: + version "1.2.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + dependencies: + path-parse "^1.0.5" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rollup-plugin-babel@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" + dependencies: + babel-core "6" + babel-plugin-transform-es2015-classes "^6.9.0" + object-assign "^4.1.0" + rollup-pluginutils "^1.5.0" + +rollup-plugin-node-resolve@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz#cbb783b0d15b02794d58915350b2f0d902b8ddc8" + dependencies: + browser-resolve "^1.11.0" + builtin-modules "^1.1.0" + resolve "^1.1.6" + +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup@^0.41.6: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +semver@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + +source-map-support@^0.4.0, source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +sourcemap-codec@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" + +sshpk@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@~2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +typescript@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" + +uglify-js@^2.8.14: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/node_modules/urix/.jshintrc b/node_modules/urix/.jshintrc new file mode 100644 index 0000000..9d1a618 --- /dev/null +++ b/node_modules/urix/.jshintrc @@ -0,0 +1,42 @@ +{ + "bitwise": true, + "camelcase": true, + "curly": false, + "eqeqeq": true, + "es3": false, + "forin": true, + "immed": false, + "indent": false, + "latedef": "nofunc", + "newcap": false, + "noarg": true, + "noempty": true, + "nonew": false, + "plusplus": false, + "quotmark": true, + "undef": true, + "unused": "vars", + "strict": false, + "trailing": true, + "maxparams": 5, + "maxdepth": false, + "maxstatements": false, + "maxcomplexity": false, + "maxlen": 100, + + "asi": true, + "expr": true, + "globalstrict": true, + "smarttabs": true, + "sub": true, + + "node": true, + "globals": { + "describe": false, + "it": false, + "before": false, + "beforeEach": false, + "after": false, + "afterEach": false + } +} diff --git a/node_modules/urix/LICENSE b/node_modules/urix/LICENSE new file mode 100644 index 0000000..0595be3 --- /dev/null +++ b/node_modules/urix/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Simon Lydell + +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/urix/index.js b/node_modules/urix/index.js new file mode 100644 index 0000000..dc6ef27 --- /dev/null +++ b/node_modules/urix/index.js @@ -0,0 +1,17 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var path = require("path") + +"use strict" + +function urix(aPath) { + if (path.sep === "\\") { + return aPath + .replace(/\\/g, "/") + .replace(/^[a-z]:\/?/i, "/") + } + return aPath +} + +module.exports = urix diff --git a/node_modules/urix/package.json b/node_modules/urix/package.json new file mode 100644 index 0000000..37baac7 --- /dev/null +++ b/node_modules/urix/package.json @@ -0,0 +1,62 @@ +{ + "_args": [ + [ + "urix@0.1.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "urix@0.1.0", + "_id": "urix@0.1.0", + "_inBundle": false, + "_integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "_location": "/urix", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "urix@0.1.0", + "name": "urix", + "escapedName": "urix", + "rawSpec": "0.1.0", + "saveSpec": null, + "fetchSpec": "0.1.0" + }, + "_requiredBy": [ + "/source-map-resolve" + ], + "_resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "_spec": "0.1.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Simon Lydell" + }, + "bugs": { + "url": "https://github.com/lydell/urix/issues" + }, + "description": "Makes Windows-style paths more unix and URI friendly.", + "devDependencies": { + "jshint": "^2.4.4", + "mocha": "^1.17.1" + }, + "homepage": "https://github.com/lydell/urix#readme", + "keywords": [ + "path", + "url", + "uri", + "unix", + "windows", + "backslash", + "slash" + ], + "license": "MIT", + "main": "index.js", + "name": "urix", + "repository": { + "type": "git", + "url": "git+https://github.com/lydell/urix.git" + }, + "scripts": { + "test": "jshint index.js test/ && mocha" + }, + "version": "0.1.0" +} diff --git a/node_modules/urix/readme.md b/node_modules/urix/readme.md new file mode 100644 index 0000000..b258b98 --- /dev/null +++ b/node_modules/urix/readme.md @@ -0,0 +1,46 @@ +[![Build Status](https://travis-ci.org/lydell/urix.png?branch=master)](https://travis-ci.org/lydell/urix) + +Overview +======== + +Makes Windows-style paths more unix and URI friendly. Useful if you work with +paths that eventually will be used in URLs. + +```js +var urix = require("urix") + +// On Windows: +urix("c:\\users\\you\\foo") +// /users/you/foo + +// On unix-like systems: +urix("c:\\users\\you\\foo") +// c:\users\you\foo +``` + + +Installation +============ + +`npm install urix` + +```js +var urix = require("urix") +``` + + +Usage +===== + +### `urix(path)` ### + +On Windows, replaces all backslashes with slashes and uses a slash instead of a +drive letter and a colon for absolute paths. + +On unix-like systems it is a no-op. + + +License +======= + +[The X11 (“MIT”) License](LICENSE). diff --git a/node_modules/urix/test/index.js b/node_modules/urix/test/index.js new file mode 100644 index 0000000..5333f24 --- /dev/null +++ b/node_modules/urix/test/index.js @@ -0,0 +1,43 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var path = require("path") +var assert = require("assert") +var urix = require("../") + +"use stict" + +function test(testPath, expected) { + path.sep = "\\" + assert.equal(urix(testPath), expected) + path.sep = "/" + assert.equal(urix(testPath), testPath) +} + +describe("urix", function() { + + it("is a function", function() { + assert.equal(typeof urix, "function") + }) + + + it("converts backslashes to slashes", function() { + test("a\\b\\c", "a/b/c") + test("\\a\\b\\c", "/a/b/c") + test("a/b\\c", "a/b/c") + test("\\\\a\\\\\\b///c", "//a///b///c") + }) + + + it("changes the drive letter to a slash", function() { + test("c:\\a", "/a") + test("C:\\a", "/a") + test("z:\\a", "/a") + test("c:a", "/a") + test("c:/a", "/a") + test("c:\\\\a", "//a") + test("c://a", "//a") + test("c:\\//a", "///a") + }) + +}) diff --git a/node_modules/url-parse-lax/index.js b/node_modules/url-parse-lax/index.js new file mode 100644 index 0000000..f9c0c65 --- /dev/null +++ b/node_modules/url-parse-lax/index.js @@ -0,0 +1,14 @@ +'use strict'; +var url = require('url'); +var prependHttp = require('prepend-http'); + +module.exports = function (x) { + var withProtocol = prependHttp(x); + var parsed = url.parse(withProtocol); + + if (withProtocol !== x) { + parsed.protocol = null; + } + + return parsed; +}; diff --git a/node_modules/url-parse-lax/license b/node_modules/url-parse-lax/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/url-parse-lax/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/url-parse-lax/package.json b/node_modules/url-parse-lax/package.json new file mode 100644 index 0000000..7eaf28c --- /dev/null +++ b/node_modules/url-parse-lax/package.json @@ -0,0 +1,77 @@ +{ + "_args": [ + [ + "url-parse-lax@1.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "url-parse-lax@1.0.0", + "_id": "url-parse-lax@1.0.0", + "_inBundle": false, + "_integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "_location": "/url-parse-lax", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "url-parse-lax@1.0.0", + "name": "url-parse-lax", + "escapedName": "url-parse-lax", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/got" + ], + "_resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "_spec": "1.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/url-parse-lax/issues" + }, + "dependencies": { + "prepend-http": "^1.0.1" + }, + "description": "url.parse() with support for protocol-less URLs & IPs", + "devDependencies": { + "ava": "0.0.4" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/url-parse-lax#readme", + "keywords": [ + "url", + "uri", + "parse", + "parser", + "loose", + "lax", + "protocol", + "less", + "protocol-less", + "ip", + "ipv4", + "ipv6" + ], + "license": "MIT", + "name": "url-parse-lax", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/url-parse-lax.git" + }, + "scripts": { + "test": "node test.js" + }, + "version": "1.0.0" +} diff --git a/node_modules/url-parse-lax/readme.md b/node_modules/url-parse-lax/readme.md new file mode 100644 index 0000000..f263944 --- /dev/null +++ b/node_modules/url-parse-lax/readme.md @@ -0,0 +1,100 @@ +# url-parse-lax [![Build Status](https://travis-ci.org/sindresorhus/url-parse-lax.svg?branch=master)](https://travis-ci.org/sindresorhus/url-parse-lax) + +> [`url.parse()`](https://nodejs.org/docs/latest/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost) with support for protocol-less URLs & IPs + + +## Install + +``` +$ npm install --save url-parse-lax +``` + + +## Usage + +```js +var urlParseLax = require('url-parse-lax'); + +urlParseLax('sindresorhus.com'); +/* +{ + protocol: null, + slashes: true, + auth: null, + host: 'sindresorhus.com', + port: null, + hostname: 'sindresorhus.com', + hash: null, + search: null, + query: null, + pathname: '/', + path: '/', + href: 'http://sindresorhus.com/' +} +*/ + +urlParseLax('[2001:db8::]:8000'); +/* +{ + protocol: null, + slashes: true, + auth: null, + host: '[2001:db8::]:8000', + port: '8000', + hostname: '2001:db8::', + hash: null, + search: null, + query: null, + pathname: '/', + path: '/', + href: 'http://[2001:db8::]:8000/' +} +*/ +``` + +And with the built-in `url.parse()`: + +```js +var url = require('url'); + +url.parse('sindresorhus.com'); +/* +{ + protocol: null, + slashes: null, + auth: null, + host: null, + port: null, + hostname: null, + hash: null, + search: null, + query: null, + pathname: 'sindresorhus', + path: 'sindresorhus', + href: 'sindresorhus' +} +*/ + +url.parse('[2001:db8::]:8000'); +/* +{ + protocol: null, + slashes: null, + auth: null, + host: null, + port: null, + hostname: null, + hash: null, + search: null, + query: null, + pathname: '[2001:db8::]:8000', + path: '[2001:db8::]:8000', + href: '[2001:db8::]:8000' +} +*/ +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/use/LICENSE b/node_modules/use/LICENSE new file mode 100644 index 0000000..7cccaf9 --- /dev/null +++ b/node_modules/use/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present, Jon Schlinkert. + +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/use/README.md b/node_modules/use/README.md new file mode 100644 index 0000000..59b1dbd --- /dev/null +++ b/node_modules/use/README.md @@ -0,0 +1,90 @@ +# use [![NPM version](https://img.shields.io/npm/v/use.svg?style=flat)](https://www.npmjs.com/package/use) [![NPM monthly downloads](https://img.shields.io/npm/dm/use.svg?style=flat)](https://npmjs.org/package/use) [![NPM total downloads](https://img.shields.io/npm/dt/use.svg?style=flat)](https://npmjs.org/package/use) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/use.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/use) + +> Easily add plugin support to your node.js application. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save use +``` + +A different take on plugin handling! This is not a middleware system, if you need something that handles async middleware, [ware](https://github.com/segmentio/ware) is great for that. + +## Usage + +```js +const use = require('use'); +``` + +See the [examples folder](./examples) for usage examples. + +## About + +
        +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
        + +
        +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
        + +
        +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
        + +### Related projects + +You might also be interested in these projects: + +* [base-plugins](https://www.npmjs.com/package/base-plugins): Adds 'smart plugin' support to your base application. | [homepage](https://github.com/node-base/base-plugins "Adds 'smart plugin' support to your base application.") +* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks") +* [ware](https://www.npmjs.com/package/ware): Easily create your own middleware layer. | [homepage](https://github.com/segmentio/ware "Easily create your own middleware layer.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 37 | [jonschlinkert](https://github.com/jonschlinkert) | +| 7 | [charlike-old](https://github.com/charlike-old) | +| 2 | [doowb](https://github.com/doowb) | +| 2 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 12, 2018._ \ No newline at end of file diff --git a/node_modules/use/index.js b/node_modules/use/index.js new file mode 100644 index 0000000..9a1eb4e --- /dev/null +++ b/node_modules/use/index.js @@ -0,0 +1,155 @@ +/*! + * use + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function base(app, options) { + if (!isObject(app) && typeof app !== 'function') { + throw new TypeError('expected an object or function'); + } + + var opts = isObject(options) ? options : {}; + var prop = typeof opts.prop === 'string' ? opts.prop : 'fns'; + if (!Array.isArray(app[prop])) { + define(app, prop, []); + } + + /** + * Define a plugin function to be passed to use. The only + * parameter exposed to the plugin is `app`, the object or function. + * passed to `use(app)`. `app` is also exposed as `this` in plugins. + * + * Additionally, **if a plugin returns a function, the function will + * be pushed onto the `fns` array**, allowing the plugin to be + * called at a later point by the `run` method. + * + * ```js + * var use = require('use'); + * + * // define a plugin + * function foo(app) { + * // do stuff + * } + * + * var app = function(){}; + * use(app); + * + * // register plugins + * app.use(foo); + * app.use(bar); + * app.use(baz); + * ``` + * @name .use + * @param {Function} `fn` plugin function to call + * @api public + */ + + define(app, 'use', use); + + /** + * Run all plugins on `fns`. Any plugin that returns a function + * when called by `use` is pushed onto the `fns` array. + * + * ```js + * var config = {}; + * app.run(config); + * ``` + * @name .run + * @param {Object} `value` Object to be modified by plugins. + * @return {Object} Returns the object passed to `run` + * @api public + */ + + define(app, 'run', function(val) { + if (!isObject(val)) return; + + if (!val.use || !val.run) { + define(val, prop, val[prop] || []); + define(val, 'use', use); + } + + if (!val[prop] || val[prop].indexOf(base) === -1) { + val.use(base); + } + + var self = this || app; + var fns = self[prop]; + var len = fns.length; + var idx = -1; + + while (++idx < len) { + val.use(fns[idx]); + } + return val; + }); + + /** + * Call plugin `fn`. If a function is returned push it into the + * `fns` array to be called by the `run` method. + */ + + function use(type, fn, options) { + var offset = 1; + + if (typeof type === 'string' || Array.isArray(type)) { + fn = wrap(type, fn); + offset++; + } else { + options = fn; + fn = type; + } + + if (typeof fn !== 'function') { + throw new TypeError('expected a function'); + } + + var self = this || app; + var fns = self[prop]; + + var args = [].slice.call(arguments, offset); + args.unshift(self); + + if (typeof opts.hook === 'function') { + opts.hook.apply(self, args); + } + + var val = fn.apply(self, args); + if (typeof val === 'function' && fns.indexOf(val) === -1) { + fns.push(val); + } + return self; + } + + /** + * Wrap a named plugin function so that it's only called on objects of the + * given `type` + * + * @param {String} `type` + * @param {Function} `fn` Plugin function + * @return {Function} + */ + + function wrap(type, fn) { + return function plugin() { + return this.type === type ? fn.apply(this, arguments) : plugin; + }; + } + + return app; +}; + +function isObject(val) { + return val && typeof val === 'object' && !Array.isArray(val); +} + +function define(obj, key, val) { + Object.defineProperty(obj, key, { + configurable: true, + writable: true, + value: val + }); +} diff --git a/node_modules/use/package.json b/node_modules/use/package.json new file mode 100644 index 0000000..f2cc287 --- /dev/null +++ b/node_modules/use/package.json @@ -0,0 +1,111 @@ +{ + "_args": [ + [ + "use@3.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "use@3.1.1", + "_id": "use@3.1.1", + "_inBundle": false, + "_integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "_location": "/use", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "use@3.1.1", + "name": "use", + "escapedName": "use", + "rawSpec": "3.1.1", + "saveSpec": null, + "fetchSpec": "3.1.1" + }, + "_requiredBy": [ + "/snapdragon" + ], + "_resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "_spec": "3.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/use/issues" + }, + "contributors": [ + { + "name": "Brian Woodward", + "url": "https://twitter.com/doowb" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + }, + { + "name": "Olsten Larck", + "url": "https://i.am.charlike.online" + }, + { + "url": "https://github.com/wtgtybhertgeghgtwtg" + } + ], + "description": "Easily add plugin support to your node.js application.", + "devDependencies": { + "base-plugins": "^1.0.0", + "define-property": "^2.0.0", + "extend-shallow": "^3.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^4.0.0", + "gulp-format-md": "^1.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^3.0.1", + "mocha": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/use", + "keywords": [ + "use" + ], + "license": "MIT", + "main": "index.js", + "name": "use", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/use.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "base", + "base-plugins", + "ware" + ] + }, + "reflinks": [ + "verb", + "ware" + ], + "lint": { + "reflinks": true + } + }, + "version": "3.1.1" +} diff --git a/node_modules/util-deprecate/History.md b/node_modules/util-deprecate/History.md new file mode 100644 index 0000000..acc8675 --- /dev/null +++ b/node_modules/util-deprecate/History.md @@ -0,0 +1,16 @@ + +1.0.2 / 2015-10-07 +================== + + * use try/catch when checking `localStorage` (#3, @kumavis) + +1.0.1 / 2014-11-25 +================== + + * browser: use `console.warn()` for deprecation calls + * browser: more jsdocs + +1.0.0 / 2014-04-30 +================== + + * initial commit diff --git a/node_modules/util-deprecate/LICENSE b/node_modules/util-deprecate/LICENSE new file mode 100644 index 0000000..6a60e8c --- /dev/null +++ b/node_modules/util-deprecate/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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/util-deprecate/README.md b/node_modules/util-deprecate/README.md new file mode 100644 index 0000000..75622fa --- /dev/null +++ b/node_modules/util-deprecate/README.md @@ -0,0 +1,53 @@ +util-deprecate +============== +### The Node.js `util.deprecate()` function with browser support + +In Node.js, this module simply re-exports the `util.deprecate()` function. + +In the web browser (i.e. via browserify), a browser-specific implementation +of the `util.deprecate()` function is used. + + +## API + +A `deprecate()` function is the only thing exposed by this module. + +``` javascript +// setup: +exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead'); + + +// users see: +foo(); +// foo() is deprecated, use bar() instead +foo(); +foo(); +``` + + +## License + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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/util-deprecate/browser.js b/node_modules/util-deprecate/browser.js new file mode 100644 index 0000000..549ae2f --- /dev/null +++ b/node_modules/util-deprecate/browser.js @@ -0,0 +1,67 @@ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} diff --git a/node_modules/util-deprecate/node.js b/node_modules/util-deprecate/node.js new file mode 100644 index 0000000..5e6fcff --- /dev/null +++ b/node_modules/util-deprecate/node.js @@ -0,0 +1,6 @@ + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = require('util').deprecate; diff --git a/node_modules/util-deprecate/package.json b/node_modules/util-deprecate/package.json new file mode 100644 index 0000000..2f27f55 --- /dev/null +++ b/node_modules/util-deprecate/package.json @@ -0,0 +1,59 @@ +{ + "_args": [ + [ + "util-deprecate@1.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "util-deprecate@1.0.2", + "_id": "util-deprecate@1.0.2", + "_inBundle": false, + "_integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "_location": "/util-deprecate", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "util-deprecate@1.0.2", + "name": "util-deprecate", + "escapedName": "util-deprecate", + "rawSpec": "1.0.2", + "saveSpec": null, + "fetchSpec": "1.0.2" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "_spec": "1.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/" + }, + "browser": "browser.js", + "bugs": { + "url": "https://github.com/TooTallNate/util-deprecate/issues" + }, + "description": "The Node.js `util.deprecate()` function with browser support", + "homepage": "https://github.com/TooTallNate/util-deprecate", + "keywords": [ + "util", + "deprecate", + "browserify", + "browser", + "node" + ], + "license": "MIT", + "main": "node.js", + "name": "util-deprecate", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/util-deprecate.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "1.0.2" +} diff --git a/node_modules/utils-merge/.npmignore b/node_modules/utils-merge/.npmignore new file mode 100644 index 0000000..3e53844 --- /dev/null +++ b/node_modules/utils-merge/.npmignore @@ -0,0 +1,9 @@ +CONTRIBUTING.md +Makefile +docs/ +examples/ +reports/ +test/ + +.jshintrc +.travis.yml diff --git a/node_modules/utils-merge/LICENSE b/node_modules/utils-merge/LICENSE new file mode 100644 index 0000000..76f6d08 --- /dev/null +++ b/node_modules/utils-merge/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 Jared Hanson + +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/utils-merge/README.md b/node_modules/utils-merge/README.md new file mode 100644 index 0000000..0cb7117 --- /dev/null +++ b/node_modules/utils-merge/README.md @@ -0,0 +1,34 @@ +# utils-merge + +[![Version](https://img.shields.io/npm/v/utils-merge.svg?label=version)](https://www.npmjs.com/package/utils-merge) +[![Build](https://img.shields.io/travis/jaredhanson/utils-merge.svg)](https://travis-ci.org/jaredhanson/utils-merge) +[![Quality](https://img.shields.io/codeclimate/github/jaredhanson/utils-merge.svg?label=quality)](https://codeclimate.com/github/jaredhanson/utils-merge) +[![Coverage](https://img.shields.io/coveralls/jaredhanson/utils-merge.svg)](https://coveralls.io/r/jaredhanson/utils-merge) +[![Dependencies](https://img.shields.io/david/jaredhanson/utils-merge.svg)](https://david-dm.org/jaredhanson/utils-merge) + + +Merges the properties from a source object into a destination object. + +## Install + +```bash +$ npm install utils-merge +``` + +## Usage + +```javascript +var a = { foo: 'bar' } + , b = { bar: 'baz' }; + +merge(a, b); +// => { foo: 'bar', bar: 'baz' } +``` + +## License + +[The MIT License](http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2017 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> + + Sponsor diff --git a/node_modules/utils-merge/index.js b/node_modules/utils-merge/index.js new file mode 100644 index 0000000..4265c69 --- /dev/null +++ b/node_modules/utils-merge/index.js @@ -0,0 +1,23 @@ +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api public + */ + +exports = module.exports = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; diff --git a/node_modules/utils-merge/package.json b/node_modules/utils-merge/package.json new file mode 100644 index 0000000..43a1a3f --- /dev/null +++ b/node_modules/utils-merge/package.json @@ -0,0 +1,69 @@ +{ + "_args": [ + [ + "utils-merge@1.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "utils-merge@1.0.1", + "_id": "utils-merge@1.0.1", + "_inBundle": false, + "_integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "_location": "/utils-merge", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "utils-merge@1.0.1", + "name": "utils-merge", + "escapedName": "utils-merge", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "_spec": "1.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Jared Hanson", + "email": "jaredhanson@gmail.com", + "url": "http://www.jaredhanson.net/" + }, + "bugs": { + "url": "http://github.com/jaredhanson/utils-merge/issues" + }, + "dependencies": {}, + "description": "merge() utility function", + "devDependencies": { + "chai": "1.x.x", + "make-node": "0.3.x", + "mocha": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/jaredhanson/utils-merge#readme", + "keywords": [ + "util" + ], + "license": "MIT", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "main": "./index", + "name": "utils-merge", + "repository": { + "type": "git", + "url": "git://github.com/jaredhanson/utils-merge.git" + }, + "scripts": { + "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" + }, + "version": "1.0.1" +} diff --git a/node_modules/uuid/AUTHORS b/node_modules/uuid/AUTHORS new file mode 100644 index 0000000..5a10523 --- /dev/null +++ b/node_modules/uuid/AUTHORS @@ -0,0 +1,5 @@ +Robert Kieffer +Christoph Tavan +AJ ONeal +Vincent Voyer +Roman Shtylman diff --git a/node_modules/uuid/CHANGELOG.md b/node_modules/uuid/CHANGELOG.md new file mode 100644 index 0000000..f811b8a --- /dev/null +++ b/node_modules/uuid/CHANGELOG.md @@ -0,0 +1,119 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [3.4.0](https://github.com/uuidjs/uuid/compare/v3.3.3...v3.4.0) (2020-01-16) + + +### Features + +* rename repository to github:uuidjs/uuid ([#351](https://github.com/uuidjs/uuid/issues/351)) ([e2d7314](https://github.com/uuidjs/uuid/commit/e2d7314)), closes [#338](https://github.com/uuidjs/uuid/issues/338) + +### [3.3.3](https://github.com/uuidjs/uuid/compare/v3.3.2...v3.3.3) (2019-08-19) + + +## [3.3.2](https://github.com/uuidjs/uuid/compare/v3.3.1...v3.3.2) (2018-06-28) + + +### Bug Fixes + +* typo ([305d877](https://github.com/uuidjs/uuid/commit/305d877)) + + + + +## [3.3.1](https://github.com/uuidjs/uuid/compare/v3.3.0...v3.3.1) (2018-06-28) + + +### Bug Fixes + +* fix [#284](https://github.com/uuidjs/uuid/issues/284) by setting function name in try-catch ([f2a60f2](https://github.com/uuidjs/uuid/commit/f2a60f2)) + + + + +# [3.3.0](https://github.com/uuidjs/uuid/compare/v3.2.1...v3.3.0) (2018-06-22) + + +### Bug Fixes + +* assignment to readonly property to allow running in strict mode ([#270](https://github.com/uuidjs/uuid/issues/270)) ([d062fdc](https://github.com/uuidjs/uuid/commit/d062fdc)) +* fix [#229](https://github.com/uuidjs/uuid/issues/229) ([c9684d4](https://github.com/uuidjs/uuid/commit/c9684d4)) +* Get correct version of IE11 crypto ([#274](https://github.com/uuidjs/uuid/issues/274)) ([153d331](https://github.com/uuidjs/uuid/commit/153d331)) +* mem issue when generating uuid ([#267](https://github.com/uuidjs/uuid/issues/267)) ([c47702c](https://github.com/uuidjs/uuid/commit/c47702c)) + +### Features + +* enforce Conventional Commit style commit messages ([#282](https://github.com/uuidjs/uuid/issues/282)) ([cc9a182](https://github.com/uuidjs/uuid/commit/cc9a182)) + + + +## [3.2.1](https://github.com/uuidjs/uuid/compare/v3.2.0...v3.2.1) (2018-01-16) + + +### Bug Fixes + +* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b)) + + + + +# [3.2.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.2.0) (2018-01-16) + + +### Bug Fixes + +* remove mistakenly added typescript dependency, rollback version (standard-version will auto-increment) ([09fa824](https://github.com/uuidjs/uuid/commit/09fa824)) +* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b)) + + +### Features + +* Add v3 Support ([#217](https://github.com/uuidjs/uuid/issues/217)) ([d94f726](https://github.com/uuidjs/uuid/commit/d94f726)) + + +# [3.1.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.0.1) (2017-06-17) + +### Bug Fixes + +* (fix) Add .npmignore file to exclude test/ and other non-essential files from packing. (#183) +* Fix typo (#178) +* Simple typo fix (#165) + +### Features +* v5 support in CLI (#197) +* V5 support (#188) + + +# 3.0.1 (2016-11-28) + +* split uuid versions into separate files + + +# 3.0.0 (2016-11-17) + +* remove .parse and .unparse + + +# 2.0.0 + +* Removed uuid.BufferClass + + +# 1.4.0 + +* Improved module context detection +* Removed public RNG functions + + +# 1.3.2 + +* Improve tests and handling of v1() options (Issue #24) +* Expose RNG option to allow for perf testing with different generators + + +# 1.3.0 + +* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)! +* Support for node.js crypto API +* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code diff --git a/node_modules/uuid/LICENSE.md b/node_modules/uuid/LICENSE.md new file mode 100644 index 0000000..8c84e39 --- /dev/null +++ b/node_modules/uuid/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other 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. diff --git a/node_modules/uuid/README.md b/node_modules/uuid/README.md new file mode 100644 index 0000000..1752e47 --- /dev/null +++ b/node_modules/uuid/README.md @@ -0,0 +1,276 @@ + + +# uuid [![Build Status](https://secure.travis-ci.org/kelektiv/node-uuid.svg?branch=master)](http://travis-ci.org/kelektiv/node-uuid) # + +Simple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS. + +Features: + +* Support for version 1, 3, 4 and 5 UUIDs +* Cross-platform +* Uses cryptographically-strong random number APIs (when available) +* Zero-dependency, small footprint (... but not [this small](https://gist.github.com/982883)) + +[**Deprecation warning**: The use of `require('uuid')` is deprecated and will not be +supported after version 3.x of this module. Instead, use `require('uuid/[v1|v3|v4|v5]')` as shown in the examples below.] + +## Quickstart - CommonJS (Recommended) + +```shell +npm install uuid +``` + +Then generate your uuid version of choice ... + +Version 1 (timestamp): + +```javascript +const uuidv1 = require('uuid/v1'); +uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-8bad-9b1deb4d3b7d' + +``` + +Version 3 (namespace): + +```javascript +const uuidv3 = require('uuid/v3'); + +// ... using predefined DNS namespace (for domain names) +uuidv3('hello.example.com', uuidv3.DNS); // ⇨ '9125a8dc-52ee-365b-a5aa-81b0b3681cf6' + +// ... using predefined URL namespace (for, well, URLs) +uuidv3('http://example.com/hello', uuidv3.URL); // ⇨ 'c6235813-3ba4-3801-ae84-e0a6ebb7d138' + +// ... using a custom namespace +// +// Note: Custom namespaces should be a UUID string specific to your application! +// E.g. the one here was generated using this modules `uuid` CLI. +const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; +uuidv3('Hello, World!', MY_NAMESPACE); // ⇨ 'e8b5a51d-11c8-3310-a6ab-367563f20686' + +``` + +Version 4 (random): + +```javascript +const uuidv4 = require('uuid/v4'); +uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' + +``` + +Version 5 (namespace): + +```javascript +const uuidv5 = require('uuid/v5'); + +// ... using predefined DNS namespace (for domain names) +uuidv5('hello.example.com', uuidv5.DNS); // ⇨ 'fdda765f-fc57-5604-a269-52a7df8164ec' + +// ... using predefined URL namespace (for, well, URLs) +uuidv5('http://example.com/hello', uuidv5.URL); // ⇨ '3bbcee75-cecc-5b56-8031-b6641c1ed1f1' + +// ... using a custom namespace +// +// Note: Custom namespaces should be a UUID string specific to your application! +// E.g. the one here was generated using this modules `uuid` CLI. +const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; +uuidv5('Hello, World!', MY_NAMESPACE); // ⇨ '630eb68f-e0fa-5ecc-887a-7c7a62614681' + +``` + +## API + +### Version 1 + +```javascript +const uuidv1 = require('uuid/v1'); + +// Incantations +uuidv1(); +uuidv1(options); +uuidv1(options, buffer, offset); +``` + +Generate and return a RFC4122 v1 (timestamp-based) UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1. + * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used. + * `msecs` - (Number) Time in milliseconds since unix Epoch. Default: The current time is used. + * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Note: The default [node id](https://tools.ietf.org/html/rfc4122#section-4.1.6) (the last 12 digits in the UUID) is generated once, randomly, on process startup, and then remains unchanged for the duration of the process. + +Example: Generate string UUID with fully-specified options + +```javascript +const v1options = { + node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], + clockseq: 0x1234, + msecs: new Date('2011-11-01').getTime(), + nsecs: 5678 +}; +uuidv1(v1options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab' + +``` + +Example: In-place generation of two binary IDs + +```javascript +// Generate two ids in an array +const arr = new Array(); +uuidv1(null, arr, 0); // ⇨ + // [ + // 44, 94, 164, 192, 64, 103, + // 17, 233, 146, 52, 155, 29, + // 235, 77, 59, 125 + // ] +uuidv1(null, arr, 16); // ⇨ + // [ + // 44, 94, 164, 192, 64, 103, 17, 233, + // 146, 52, 155, 29, 235, 77, 59, 125, + // 44, 94, 164, 193, 64, 103, 17, 233, + // 146, 52, 155, 29, 235, 77, 59, 125 + // ] + +``` + +### Version 3 + +```javascript +const uuidv3 = require('uuid/v3'); + +// Incantations +uuidv3(name, namespace); +uuidv3(name, namespace, buffer); +uuidv3(name, namespace, buffer, offset); +``` + +Generate and return a RFC4122 v3 UUID. + +* `name` - (String | Array[]) "name" to create UUID with +* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0 + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: + +```javascript +uuidv3('hello world', MY_NAMESPACE); // ⇨ '042ffd34-d989-321c-ad06-f60826172424' + +``` + +### Version 4 + +```javascript +const uuidv4 = require('uuid/v4') + +// Incantations +uuidv4(); +uuidv4(options); +uuidv4(options, buffer, offset); +``` + +Generate and return a RFC4122 v4 UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values + * `rng` - (Function) Random # generator function that returns an Array[16] of byte values (0-255) +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: Generate string UUID with predefined `random` values + +```javascript +const v4options = { + random: [ + 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, + 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36 + ] +}; +uuidv4(v4options); // ⇨ '109156be-c4fb-41ea-b1b4-efe1671c5836' + +``` + +Example: Generate two IDs in a single buffer + +```javascript +const buffer = new Array(); +uuidv4(null, buffer, 0); // ⇨ + // [ + // 155, 29, 235, 77, 59, + // 125, 75, 173, 155, 221, + // 43, 13, 123, 61, 203, + // 109 + // ] +uuidv4(null, buffer, 16); // ⇨ + // [ + // 155, 29, 235, 77, 59, 125, 75, 173, + // 155, 221, 43, 13, 123, 61, 203, 109, + // 27, 157, 107, 205, 187, 253, 75, 45, + // 155, 93, 171, 141, 251, 189, 75, 237 + // ] + +``` + +### Version 5 + +```javascript +const uuidv5 = require('uuid/v5'); + +// Incantations +uuidv5(name, namespace); +uuidv5(name, namespace, buffer); +uuidv5(name, namespace, buffer, offset); +``` + +Generate and return a RFC4122 v5 UUID. + +* `name` - (String | Array[]) "name" to create UUID with +* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0 + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: + +```javascript +uuidv5('hello world', MY_NAMESPACE); // ⇨ '9f282611-e0fd-5650-8953-89c8e342da0b' + +``` + +## Command Line + +UUIDs can be generated from the command line with the `uuid` command. + +```shell +$ uuid +ddeb27fb-d9a0-4624-be4d-4615062daed4 + +$ uuid v1 +02d37060-d446-11e7-a9fa-7bdae751ebe1 +``` + +Type `uuid --help` for usage details + +## Testing + +```shell +npm test +``` + +---- +Markdown generated from [README_js.md](README_js.md) by [![RunMD Logo](http://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file diff --git a/node_modules/uuid/bin/uuid b/node_modules/uuid/bin/uuid new file mode 100755 index 0000000..502626e --- /dev/null +++ b/node_modules/uuid/bin/uuid @@ -0,0 +1,65 @@ +#!/usr/bin/env node +var assert = require('assert'); + +function usage() { + console.log('Usage:'); + console.log(' uuid'); + console.log(' uuid v1'); + console.log(' uuid v3 '); + console.log(' uuid v4'); + console.log(' uuid v5 '); + console.log(' uuid --help'); + console.log('\nNote: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122'); +} + +var args = process.argv.slice(2); + +if (args.indexOf('--help') >= 0) { + usage(); + process.exit(0); +} +var version = args.shift() || 'v4'; + +switch (version) { + case 'v1': + var uuidV1 = require('../v1'); + console.log(uuidV1()); + break; + + case 'v3': + var uuidV3 = require('../v3'); + + var name = args.shift(); + var namespace = args.shift(); + assert(name != null, 'v3 name not specified'); + assert(namespace != null, 'v3 namespace not specified'); + + if (namespace == 'URL') namespace = uuidV3.URL; + if (namespace == 'DNS') namespace = uuidV3.DNS; + + console.log(uuidV3(name, namespace)); + break; + + case 'v4': + var uuidV4 = require('../v4'); + console.log(uuidV4()); + break; + + case 'v5': + var uuidV5 = require('../v5'); + + var name = args.shift(); + var namespace = args.shift(); + assert(name != null, 'v5 name not specified'); + assert(namespace != null, 'v5 namespace not specified'); + + if (namespace == 'URL') namespace = uuidV5.URL; + if (namespace == 'DNS') namespace = uuidV5.DNS; + + console.log(uuidV5(name, namespace)); + break; + + default: + usage(); + process.exit(1); +} diff --git a/node_modules/uuid/index.js b/node_modules/uuid/index.js new file mode 100644 index 0000000..e96791a --- /dev/null +++ b/node_modules/uuid/index.js @@ -0,0 +1,8 @@ +var v1 = require('./v1'); +var v4 = require('./v4'); + +var uuid = v4; +uuid.v1 = v1; +uuid.v4 = v4; + +module.exports = uuid; diff --git a/node_modules/uuid/lib/bytesToUuid.js b/node_modules/uuid/lib/bytesToUuid.js new file mode 100644 index 0000000..24b6041 --- /dev/null +++ b/node_modules/uuid/lib/bytesToUuid.js @@ -0,0 +1,26 @@ +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +var byteToHex = []; +for (var i = 0; i < 256; ++i) { + byteToHex[i] = (i + 0x100).toString(16).substr(1); +} + +function bytesToUuid(buf, offset) { + var i = offset || 0; + var bth = byteToHex; + // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4 + return ([ + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]] + ]).join(''); +} + +module.exports = bytesToUuid; diff --git a/node_modules/uuid/lib/md5-browser.js b/node_modules/uuid/lib/md5-browser.js new file mode 100644 index 0000000..9b3b6c7 --- /dev/null +++ b/node_modules/uuid/lib/md5-browser.js @@ -0,0 +1,216 @@ +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +'use strict'; + +function md5(bytes) { + if (typeof(bytes) == 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + bytes = new Array(msg.length); + for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); + } + + return md5ToHexEncodedArray( + wordsToMd5( + bytesToWords(bytes) + , bytes.length * 8) + ); +} + + +/* +* Convert an array of little-endian words to an array of bytes +*/ +function md5ToHexEncodedArray(input) { + var i; + var x; + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + var hex; + + for (i = 0; i < length32; i += 8) { + x = (input[i >> 5] >>> (i % 32)) & 0xFF; + + hex = parseInt(hexTab.charAt((x >>> 4) & 0x0F) + hexTab.charAt(x & 0x0F), 16); + + output.push(hex); + } + return output; +} + +/* +* Calculate the MD5 of an array of little-endian words, and a bit length. +*/ +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + return [a, b, c, d]; +} + +/* +* Convert an array bytes to an array of little-endian words +* Characters >255 have their high-byte silently ignored. +*/ +function bytesToWords(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[(i / 8)] & 0xFF) << (i % 32); + } + + return output; +} + +/* +* Add integers, wrapping at 2^32. This uses 16-bit operations internally +* to work around bugs in some JS interpreters. +*/ +function safeAdd(x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* +* Bitwise rotate a 32-bit number to the left. +*/ +function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* +* These functions implement the four basic operations the algorithm uses. +*/ +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} +function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +module.exports = md5; diff --git a/node_modules/uuid/lib/md5.js b/node_modules/uuid/lib/md5.js new file mode 100644 index 0000000..7044b87 --- /dev/null +++ b/node_modules/uuid/lib/md5.js @@ -0,0 +1,25 @@ +'use strict'; + +var crypto = require('crypto'); + +function md5(bytes) { + if (typeof Buffer.from === 'function') { + // Modern Buffer API + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + } else { + // Pre-v4 Buffer API + if (Array.isArray(bytes)) { + bytes = new Buffer(bytes); + } else if (typeof bytes === 'string') { + bytes = new Buffer(bytes, 'utf8'); + } + } + + return crypto.createHash('md5').update(bytes).digest(); +} + +module.exports = md5; diff --git a/node_modules/uuid/lib/rng-browser.js b/node_modules/uuid/lib/rng-browser.js new file mode 100644 index 0000000..6361fb8 --- /dev/null +++ b/node_modules/uuid/lib/rng-browser.js @@ -0,0 +1,34 @@ +// Unique ID creation requires a high quality random # generator. In the +// browser this is a little complicated due to unknown quality of Math.random() +// and inconsistent support for the `crypto` API. We do the best we can via +// feature-detection + +// getRandomValues needs to be invoked in a context where "this" is a Crypto +// implementation. Also, find the complete implementation of crypto on IE11. +var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) || + (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto)); + +if (getRandomValues) { + // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto + var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef + + module.exports = function whatwgRNG() { + getRandomValues(rnds8); + return rnds8; + }; +} else { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var rnds = new Array(16); + + module.exports = function mathRNG() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return rnds; + }; +} diff --git a/node_modules/uuid/lib/rng.js b/node_modules/uuid/lib/rng.js new file mode 100644 index 0000000..58f0dc9 --- /dev/null +++ b/node_modules/uuid/lib/rng.js @@ -0,0 +1,8 @@ +// Unique ID creation requires a high quality random # generator. In node.js +// this is pretty straight-forward - we use the crypto API. + +var crypto = require('crypto'); + +module.exports = function nodeRNG() { + return crypto.randomBytes(16); +}; diff --git a/node_modules/uuid/lib/sha1-browser.js b/node_modules/uuid/lib/sha1-browser.js new file mode 100644 index 0000000..5758ed7 --- /dev/null +++ b/node_modules/uuid/lib/sha1-browser.js @@ -0,0 +1,89 @@ +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +'use strict'; + +function f(s, x, y, z) { + switch (s) { + case 0: return (x & y) ^ (~x & z); + case 1: return x ^ y ^ z; + case 2: return (x & y) ^ (x & z) ^ (y & z); + case 3: return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return (x << n) | (x>>> (32 - n)); +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof(bytes) == 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + bytes = new Array(msg.length); + for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); + } + + bytes.push(0x80); + + var l = bytes.length/4 + 2; + var N = Math.ceil(l/16); + var M = new Array(N); + + for (var i=0; i>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = (H[0] + a) >>> 0; + H[1] = (H[1] + b) >>> 0; + H[2] = (H[2] + c) >>> 0; + H[3] = (H[3] + d) >>> 0; + H[4] = (H[4] + e) >>> 0; + } + + return [ + H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, + H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, + H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, + H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, + H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff + ]; +} + +module.exports = sha1; diff --git a/node_modules/uuid/lib/sha1.js b/node_modules/uuid/lib/sha1.js new file mode 100644 index 0000000..0b54b25 --- /dev/null +++ b/node_modules/uuid/lib/sha1.js @@ -0,0 +1,25 @@ +'use strict'; + +var crypto = require('crypto'); + +function sha1(bytes) { + if (typeof Buffer.from === 'function') { + // Modern Buffer API + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + } else { + // Pre-v4 Buffer API + if (Array.isArray(bytes)) { + bytes = new Buffer(bytes); + } else if (typeof bytes === 'string') { + bytes = new Buffer(bytes, 'utf8'); + } + } + + return crypto.createHash('sha1').update(bytes).digest(); +} + +module.exports = sha1; diff --git a/node_modules/uuid/lib/v35.js b/node_modules/uuid/lib/v35.js new file mode 100644 index 0000000..8b066cc --- /dev/null +++ b/node_modules/uuid/lib/v35.js @@ -0,0 +1,57 @@ +var bytesToUuid = require('./bytesToUuid'); + +function uuidToBytes(uuid) { + // Note: We assume we're being passed a valid uuid string + var bytes = []; + uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) { + bytes.push(parseInt(hex, 16)); + }); + + return bytes; +} + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + var bytes = new Array(str.length); + for (var i = 0; i < str.length; i++) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} + +module.exports = function(name, version, hashfunc) { + var generateUUID = function(value, namespace, buf, offset) { + var off = buf && offset || 0; + + if (typeof(value) == 'string') value = stringToBytes(value); + if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace); + + if (!Array.isArray(value)) throw TypeError('value must be an array of bytes'); + if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values'); + + // Per 4.3 + var bytes = hashfunc(namespace.concat(value)); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + + if (buf) { + for (var idx = 0; idx < 16; ++idx) { + buf[off+idx] = bytes[idx]; + } + } + + return buf || bytesToUuid(bytes); + }; + + // Function#name is not settable on some platforms (#270) + try { + generateUUID.name = name; + } catch (err) { + } + + // Pre-defined namespaces, per Appendix C + generateUUID.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; + generateUUID.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; + + return generateUUID; +}; diff --git a/node_modules/uuid/package.json b/node_modules/uuid/package.json new file mode 100644 index 0000000..5c1d6d8 --- /dev/null +++ b/node_modules/uuid/package.json @@ -0,0 +1,104 @@ +{ + "_args": [ + [ + "uuid@3.4.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "uuid@3.4.0", + "_id": "uuid@3.4.0", + "_inBundle": false, + "_integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "_location": "/uuid", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "uuid@3.4.0", + "name": "uuid", + "escapedName": "uuid", + "rawSpec": "3.4.0", + "saveSpec": null, + "fetchSpec": "3.4.0" + }, + "_requiredBy": [ + "/knex", + "/request" + ], + "_resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "_spec": "3.4.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bin": { + "uuid": "bin/uuid" + }, + "browser": { + "./lib/rng.js": "./lib/rng-browser.js", + "./lib/sha1.js": "./lib/sha1-browser.js", + "./lib/md5.js": "./lib/md5-browser.js" + }, + "bugs": { + "url": "https://github.com/uuidjs/uuid/issues" + }, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "contributors": [ + { + "name": "Robert Kieffer", + "email": "robert@broofa.com" + }, + { + "name": "Christoph Tavan", + "email": "dev@tavan.de" + }, + { + "name": "AJ ONeal", + "email": "coolaj86@gmail.com" + }, + { + "name": "Vincent Voyer", + "email": "vincent@zeroload.net" + }, + { + "name": "Roman Shtylman", + "email": "shtylman@gmail.com" + } + ], + "description": "RFC4122 (v1, v4, and v5) UUIDs", + "devDependencies": { + "@commitlint/cli": "~8.2.0", + "@commitlint/config-conventional": "~8.2.0", + "eslint": "~6.4.0", + "husky": "~3.0.5", + "mocha": "6.2.0", + "runmd": "1.2.1", + "standard-version": "7.0.0" + }, + "homepage": "https://github.com/uuidjs/uuid#readme", + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + }, + "keywords": [ + "uuid", + "guid", + "rfc4122" + ], + "license": "MIT", + "name": "uuid", + "repository": { + "type": "git", + "url": "git+https://github.com/uuidjs/uuid.git" + }, + "scripts": { + "lint": "eslint .", + "md": "runmd --watch --output=README.md README_js.md", + "prepare": "runmd --output=README.md README_js.md", + "release": "standard-version", + "test": "npm run lint && mocha test/test.js" + }, + "version": "3.4.0" +} diff --git a/node_modules/uuid/v1.js b/node_modules/uuid/v1.js new file mode 100644 index 0000000..8c245de --- /dev/null +++ b/node_modules/uuid/v1.js @@ -0,0 +1,109 @@ +var rng = require('./lib/rng'); +var bytesToUuid = require('./lib/bytesToUuid'); + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; +var _clockseq; + +// Previous uuid creation time +var _lastMSecs = 0; +var _lastNSecs = 0; + +// See https://github.com/uuidjs/uuid for API details +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; + + // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + if (node == null || clockseq == null) { + var seedBytes = rng(); + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [ + seedBytes[0] | 0x01, + seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5] + ]; + } + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf ? buf : bytesToUuid(b); +} + +module.exports = v1; diff --git a/node_modules/uuid/v3.js b/node_modules/uuid/v3.js new file mode 100644 index 0000000..ee7e14c --- /dev/null +++ b/node_modules/uuid/v3.js @@ -0,0 +1,4 @@ +var v35 = require('./lib/v35.js'); +var md5 = require('./lib/md5'); + +module.exports = v35('v3', 0x30, md5); \ No newline at end of file diff --git a/node_modules/uuid/v4.js b/node_modules/uuid/v4.js new file mode 100644 index 0000000..1f07be1 --- /dev/null +++ b/node_modules/uuid/v4.js @@ -0,0 +1,29 @@ +var rng = require('./lib/rng'); +var bytesToUuid = require('./lib/bytesToUuid'); + +function v4(options, buf, offset) { + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options === 'binary' ? new Array(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ++ii) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || bytesToUuid(rnds); +} + +module.exports = v4; diff --git a/node_modules/uuid/v5.js b/node_modules/uuid/v5.js new file mode 100644 index 0000000..4945baf --- /dev/null +++ b/node_modules/uuid/v5.js @@ -0,0 +1,3 @@ +var v35 = require('./lib/v35.js'); +var sha1 = require('./lib/sha1'); +module.exports = v35('v5', 0x50, sha1); diff --git a/node_modules/v8flags/LICENSE b/node_modules/v8flags/LICENSE new file mode 100644 index 0000000..ca63f90 --- /dev/null +++ b/node_modules/v8flags/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Kellen , Blaine Bublitz , and Eric Schoffstall + +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/v8flags/README.md b/node_modules/v8flags/README.md new file mode 100644 index 0000000..2760f8e --- /dev/null +++ b/node_modules/v8flags/README.md @@ -0,0 +1,64 @@ +

        + + + +

        + +# v8flags + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Get available v8 flags. + +## Usage +```js +const v8flags = require('v8flags'); + +v8flags(function(err, results) { + console.log(results); + // [ '--use_strict', + // '--es5_readonly', + // '--es52_globals', + // '--harmony_typeof', + // '--harmony_scoping', + // '--harmony_modules', + // '--harmony_proxies', + // '--harmony_collections', + // '--harmony', + // ... +}); +``` + +## API + +### `v8flags(cb)` + +Finds the available flags and calls the passed callback with any errors and an array of flag results. + +### `v8flags.configfile` + +The name of the cache file for flags. + +### `v8flags.configPath` + +The filepath location of the `configfile` above. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/v8flags.svg +[npm-url]: https://www.npmjs.com/package/v8flags +[npm-image]: http://img.shields.io/npm/v/v8flags.svg + +[travis-url]: https://travis-ci.org/gulpjs/v8flags +[travis-image]: http://img.shields.io/travis/gulpjs/v8flags.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/v8flags +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/v8flags.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/v8flags +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/v8flags/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/v8flags/config-path.js b/node_modules/v8flags/config-path.js new file mode 100644 index 0000000..1acbe45 --- /dev/null +++ b/node_modules/v8flags/config-path.js @@ -0,0 +1,38 @@ +var os = require('os'); +var path = require('path'); +var userHome = require('homedir-polyfill')(); + +var env = process.env; +var name = 'js-v8flags'; + +function macos() { + var library = path.join(userHome, 'Library'); + return path.join(library, 'Caches', name); +} + +function windows() { + var appData = env.LOCALAPPDATA || path.join(userHome, 'AppData', 'Local'); + return path.join(appData, name); +} + +// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html +function linux() { + var username = path.basename(userHome); + return path.join(env.XDG_CACHE_HOME || path.join(userHome, '.cache'), name); +} + +module.exports = function(platform) { + if (!userHome) { + return os.tmpdir(); + } + + if (platform === 'darwin') { + return macos(); + } + + if (platform === 'win32') { + return windows(); + } + + return linux(); +}; diff --git a/node_modules/v8flags/index.js b/node_modules/v8flags/index.js new file mode 100644 index 0000000..f8ebcc1 --- /dev/null +++ b/node_modules/v8flags/index.js @@ -0,0 +1,162 @@ +// this entire module is depressing. i should have spent my time learning +// how to patch v8 so that these options would just be available on the +// process object. + +var os = require('os'); +var fs = require('fs'); +var path = require('path'); +var crypto = require('crypto'); +var execFile = require('child_process').execFile; +var configPath = require('./config-path.js')(process.platform); +var version = require('./package.json').version; +var env = process.env; +var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME || ''; +var exclusions = ['--help']; + +// This number must be incremented whenever the generated cache file changes. +var CACHE_VERSION = 1; + +var configfile = '.v8flags-' + CACHE_VERSION + '-' + process.versions.v8 + '.' + crypto.createHash('md5').update(user).digest('hex') + '.json'; + +var failureMessage = [ + 'Unable to cache a config file for v8flags to your home directory', + 'or a temporary folder. To fix this problem, please correct your', + 'environment by setting HOME=/path/to/home or TEMP=/path/to/temp.', + 'NOTE: the user running this must be able to access provided path.', + 'If all else fails, please open an issue here:', + 'http://github.com/tkellen/js-v8flags', +].join('\n'); + +function fail(err) { + err.message += '\n\n' + failureMessage; + return err; +} + +function openConfig(cb) { + fs.mkdir(configPath, function() { + tryOpenConfig(path.join(configPath, configfile), function(err, fd) { + if (err) { + return tryOpenConfig(path.join(os.tmpdir(), configfile), cb); + } + return cb(null, fd); + }); + }); +} + +function tryOpenConfig(configpath, cb) { + try { + // if the config file is valid, it should be json and therefore + // node should be able to require it directly. if this doesn't + // throw, we're done! + var content = require(configpath); + process.nextTick(function() { + cb(null, content); + }); + } catch (e) { + // if requiring the config file failed, maybe it doesn't exist, or + // perhaps it has become corrupted. instead of calling back with the + // content of the file, call back with a file descriptor that we can + // write the cached data to + fs.open(configpath, 'w+', function(err, fd) { + if (err) { + return cb(err); + } + return cb(null, fd); + }); + } +} + +// Node <= 9 outputs _ in flags with multiple words, while node 10 +// uses -. Both ways are accepted anyway, so always use `_` for better +// compatibility. +// We must not replace the first two --. +function normalizeFlagName(flag) { + return '--' + flag.slice(4).replace(/-/g, '_'); +} + +// i can't wait for the day this whole module is obsolete because these +// options are available on the process object. this executes node with +// `--v8-options` and parses the result, returning an array of command +// line flags. +function getFlags(cb) { + execFile(process.execPath, ['--v8-options'], function(execErr, result) { + if (execErr) { + return cb(execErr); + } + // If the binary doesn't return flags in the way we expect, default to an empty array + // Reference https://github.com/gulpjs/v8flags/issues/53 + var matchedFlags = result.match(/\s\s--[\w-]+/gm) || []; + var flags = matchedFlags + .map(normalizeFlagName) + .filter(function(name) { + return exclusions.indexOf(name) === -1; + }); + return cb(null, flags); + }); +} + +// write some json to a file descriptor. if this fails, call back +// with both the error and the data that was meant to be written. +function writeConfig(fd, flags, cb) { + var json = JSON.stringify(flags); + var buf; + if (Buffer.from && Buffer.from !== Uint8Array.from) { + // Node.js 4.5.0 or newer + buf = Buffer.from(json); + } else { + // Old Node.js versions + // The typeof safeguard below is mostly against accidental copy-pasting + // and code rewrite, it never happens as json is always a string here. + if (typeof json === 'number') { + throw new Error('Unexpected type number'); + } + buf = new Buffer(json); + } + return fs.write(fd, buf, 0, buf.length, 0 , function(writeErr) { + fs.close(fd, function(closeErr) { + var err = writeErr || closeErr; + if (err) { + return cb(fail(err), flags); + } + return cb(null, flags); + }); + }); +} + +module.exports = function(cb) { + // bail early if this is not node + var isElectron = process.versions && process.versions.electron; + if (isElectron) { + return process.nextTick(function() { + cb(null, []); + }); + } + + // attempt to open/read cache file + openConfig(function(openErr, result) { + if (!openErr && typeof result !== 'number') { + return cb(null, result); + } + // if the result is not an array, we need to go fetch + // the flags by invoking node with `--v8-options` + getFlags(function(flagsErr, flags) { + // if there was an error fetching the flags, bail immediately + if (flagsErr) { + return cb(flagsErr); + } + // if there was a problem opening the config file for writing + // throw an error but include the flags anyway so that users + // can continue to execute (at the expense of having to fetch + // flags on every run until they fix the underyling problem). + if (openErr) { + return cb(fail(openErr), flags); + } + // write the config file to disk so subsequent runs can read + // flags out of a cache file. + return writeConfig(result, flags, cb); + }); + }); +}; + +module.exports.configfile = configfile; +module.exports.configPath = configPath; diff --git a/node_modules/v8flags/package.json b/node_modules/v8flags/package.json new file mode 100644 index 0000000..e4c00a6 --- /dev/null +++ b/node_modules/v8flags/package.json @@ -0,0 +1,102 @@ +{ + "_args": [ + [ + "v8flags@3.1.3", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "v8flags@3.1.3", + "_id": "v8flags@3.1.3", + "_inBundle": false, + "_integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "_location": "/v8flags", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "v8flags@3.1.3", + "name": "v8flags", + "escapedName": "v8flags", + "rawSpec": "3.1.3", + "saveSpec": null, + "fetchSpec": "3.1.3" + }, + "_requiredBy": [ + "/knex" + ], + "_resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "_spec": "3.1.3", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/v8flags/issues" + }, + "contributors": [ + { + "name": "Tyler Kellen", + "email": "tyler@sleekcode.net" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + }, + { + "name": "Nicolò Ribaudo", + "email": "nicolo.ribaudo@gmail.com" + }, + { + "name": "Selwyn", + "email": "talk@selwyn.cc" + }, + { + "name": "Leo Zhang", + "email": "leo@leozhang.me" + } + ], + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "description": "Get available v8 flags.", + "devDependencies": { + "async": "^2.5.0", + "eslint": "^2.13.0", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "mocha": "^3.5.3", + "proxyquire": "^1.8.0" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "index.js", + "config-path.js", + "LICENSE" + ], + "homepage": "https://github.com/gulpjs/v8flags#readme", + "keywords": [ + "v8 flags", + "harmony flags" + ], + "license": "MIT", + "main": "index.js", + "name": "v8flags", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/v8flags.git" + }, + "scripts": { + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint .", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "3.1.3" +} diff --git a/node_modules/vary/HISTORY.md b/node_modules/vary/HISTORY.md new file mode 100644 index 0000000..f6cbcf7 --- /dev/null +++ b/node_modules/vary/HISTORY.md @@ -0,0 +1,39 @@ +1.1.2 / 2017-09-23 +================== + + * perf: improve header token parsing speed + +1.1.1 / 2017-03-20 +================== + + * perf: hoist regular expression + +1.1.0 / 2015-09-29 +================== + + * Only accept valid field names in the `field` argument + - Ensures the resulting string is a valid HTTP header value + +1.0.1 / 2015-07-08 +================== + + * Fix setting empty header from empty `field` + * perf: enable strict mode + * perf: remove argument reassignments + +1.0.0 / 2014-08-10 +================== + + * Accept valid `Vary` header string as `field` + * Add `vary.append` for low-level string manipulation + * Move to `jshttp` orgainzation + +0.1.0 / 2014-06-05 +================== + + * Support array of fields to set + +0.0.0 / 2014-06-04 +================== + + * Initial release diff --git a/node_modules/vary/LICENSE b/node_modules/vary/LICENSE new file mode 100644 index 0000000..84441fb --- /dev/null +++ b/node_modules/vary/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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/vary/README.md b/node_modules/vary/README.md new file mode 100644 index 0000000..cc000b3 --- /dev/null +++ b/node_modules/vary/README.md @@ -0,0 +1,101 @@ +# vary + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Manipulate the HTTP Vary header + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install vary +``` + +## API + + + +```js +var vary = require('vary') +``` + +### vary(res, field) + +Adds the given header `field` to the `Vary` response header of `res`. +This can be a string of a single field, a string of a valid `Vary` +header, or an array of multiple fields. + +This will append the header if not already listed, otherwise leaves +it listed in the current location. + + + +```js +// Append "Origin" to the Vary header of the response +vary(res, 'Origin') +``` + +### vary.append(header, field) + +Adds the given header `field` to the `Vary` response header string `header`. +This can be a string of a single field, a string of a valid `Vary` header, +or an array of multiple fields. + +This will append the header if not already listed, otherwise leaves +it listed in the current location. The new header string is returned. + + + +```js +// Get header string appending "Origin" to "Accept, User-Agent" +vary.append('Accept, User-Agent', 'Origin') +``` + +## Examples + +### Updating the Vary header when content is based on it + +```js +var http = require('http') +var vary = require('vary') + +http.createServer(function onRequest (req, res) { + // about to user-agent sniff + vary(res, 'User-Agent') + + var ua = req.headers['user-agent'] || '' + var isMobile = /mobi|android|touch|mini/i.test(ua) + + // serve site, depending on isMobile + res.setHeader('Content-Type', 'text/html') + res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') +}) +``` + +## Testing + +```sh +$ npm test +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/vary.svg +[npm-url]: https://npmjs.org/package/vary +[node-version-image]: https://img.shields.io/node/v/vary.svg +[node-version-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg +[travis-url]: https://travis-ci.org/jshttp/vary +[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/vary +[downloads-image]: https://img.shields.io/npm/dm/vary.svg +[downloads-url]: https://npmjs.org/package/vary diff --git a/node_modules/vary/index.js b/node_modules/vary/index.js new file mode 100644 index 0000000..5b5e741 --- /dev/null +++ b/node_modules/vary/index.js @@ -0,0 +1,149 @@ +/*! + * vary + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + */ + +module.exports = vary +module.exports.append = append + +/** + * RegExp to match field-name in RFC 7230 sec 3.2 + * + * field-name = token + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + * / DIGIT / ALPHA + * ; any VCHAR, except delimiters + */ + +var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ + +/** + * Append a field to a vary header. + * + * @param {String} header + * @param {String|Array} field + * @return {String} + * @public + */ + +function append (header, field) { + if (typeof header !== 'string') { + throw new TypeError('header argument is required') + } + + if (!field) { + throw new TypeError('field argument is required') + } + + // get fields array + var fields = !Array.isArray(field) + ? parse(String(field)) + : field + + // assert on invalid field names + for (var j = 0; j < fields.length; j++) { + if (!FIELD_NAME_REGEXP.test(fields[j])) { + throw new TypeError('field argument contains an invalid header name') + } + } + + // existing, unspecified vary + if (header === '*') { + return header + } + + // enumerate current values + var val = header + var vals = parse(header.toLowerCase()) + + // unspecified vary + if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { + return '*' + } + + for (var i = 0; i < fields.length; i++) { + var fld = fields[i].toLowerCase() + + // append value (case-preserving) + if (vals.indexOf(fld) === -1) { + vals.push(fld) + val = val + ? val + ', ' + fields[i] + : fields[i] + } + } + + return val +} + +/** + * Parse a vary header into an array. + * + * @param {String} header + * @return {Array} + * @private + */ + +function parse (header) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = header.length; i < len; i++) { + switch (header.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + list.push(header.substring(start, end)) + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + list.push(header.substring(start, end)) + + return list +} + +/** + * Mark that a request is varied on a header field. + * + * @param {Object} res + * @param {String|Array} field + * @public + */ + +function vary (res, field) { + if (!res || !res.getHeader || !res.setHeader) { + // quack quack + throw new TypeError('res argument is required') + } + + // get existing header + var val = res.getHeader('Vary') || '' + var header = Array.isArray(val) + ? val.join(', ') + : String(val) + + // set new header + if ((val = append(header, field))) { + res.setHeader('Vary', val) + } +} diff --git a/node_modules/vary/package.json b/node_modules/vary/package.json new file mode 100644 index 0000000..a1ef7c3 --- /dev/null +++ b/node_modules/vary/package.json @@ -0,0 +1,82 @@ +{ + "_args": [ + [ + "vary@1.1.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "vary@1.1.2", + "_id": "vary@1.1.2", + "_inBundle": false, + "_integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "_location": "/vary", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "vary@1.1.2", + "name": "vary", + "escapedName": "vary", + "rawSpec": "1.1.2", + "saveSpec": null, + "fetchSpec": "1.1.2" + }, + "_requiredBy": [ + "/cors", + "/express" + ], + "_resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "_spec": "1.1.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/jshttp/vary/issues" + }, + "description": "Manipulate the HTTP Vary header", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "2.5.3", + "supertest": "1.1.0" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/vary#readme", + "keywords": [ + "http", + "res", + "vary" + ], + "license": "MIT", + "name": "vary", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/vary.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.1.2" +} diff --git a/node_modules/verror/.npmignore b/node_modules/verror/.npmignore new file mode 100644 index 0000000..f14aec8 --- /dev/null +++ b/node_modules/verror/.npmignore @@ -0,0 +1,9 @@ +.gitignore +.gitmodules +deps +examples +experiments +jsl.node.conf +Makefile +Makefile.targ +test diff --git a/node_modules/verror/CHANGES.md b/node_modules/verror/CHANGES.md new file mode 100644 index 0000000..bbb745a --- /dev/null +++ b/node_modules/verror/CHANGES.md @@ -0,0 +1,28 @@ +# Changelog + +## Not yet released + +None yet. + +## v1.10.0 + +* #49 want convenience functions for MultiErrors + +## v1.9.0 + +* #47 could use VError.hasCauseWithName() + +## v1.8.1 + +* #39 captureStackTrace lost when inheriting from WError + +## v1.8.0 + +* #23 Preserve original stack trace(s) + +## v1.7.0 + +* #10 better support for extra properties on Errors +* #11 make it easy to find causes of a particular kind +* #29 No documentation on how to Install this package +* #36 elide development-only files from npm package diff --git a/node_modules/verror/CONTRIBUTING.md b/node_modules/verror/CONTRIBUTING.md new file mode 100644 index 0000000..750cef8 --- /dev/null +++ b/node_modules/verror/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +Contributions should be "make prepush" clean. The "prepush" target runs the +"check" target, which requires these separate tools: + +* https://github.com/davepacheco/jsstyle +* https://github.com/davepacheco/javascriptlint + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/node_modules/verror/LICENSE b/node_modules/verror/LICENSE new file mode 100644 index 0000000..82a5cb8 --- /dev/null +++ b/node_modules/verror/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016, Joyent, Inc. 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/verror/README.md b/node_modules/verror/README.md new file mode 100644 index 0000000..c1f0635 --- /dev/null +++ b/node_modules/verror/README.md @@ -0,0 +1,528 @@ +# verror: rich JavaScript errors + +This module provides several classes in support of Joyent's [Best Practices for +Error Handling in Node.js](http://www.joyent.com/developers/node/design/errors). +If you find any of the behavior here confusing or surprising, check out that +document first. + +The error classes here support: + +* printf-style arguments for the message +* chains of causes +* properties to provide extra information about the error +* creating your own subclasses that support all of these + +The classes here are: + +* **VError**, for chaining errors while preserving each one's error message. + This is useful in servers and command-line utilities when you want to + propagate an error up a call stack, but allow various levels to add their own + context. See examples below. +* **WError**, for wrapping errors while hiding the lower-level messages from the + top-level error. This is useful for API endpoints where you don't want to + expose internal error messages, but you still want to preserve the error chain + for logging and debugging. +* **SError**, which is just like VError but interprets printf-style arguments + more strictly. +* **MultiError**, which is just an Error that encapsulates one or more other + errors. (This is used for parallel operations that return several errors.) + + +# Quick start + +First, install the package: + + npm install verror + +If nothing else, you can use VError as a drop-in replacement for the built-in +JavaScript Error class, with the addition of printf-style messages: + +```javascript +var err = new VError('missing file: "%s"', '/etc/passwd'); +console.log(err.message); +``` + +This prints: + + missing file: "/etc/passwd" + +You can also pass a `cause` argument, which is any other Error object: + +```javascript +var fs = require('fs'); +var filename = '/nonexistent'; +fs.stat(filename, function (err1) { + var err2 = new VError(err1, 'stat "%s"', filename); + console.error(err2.message); +}); +``` + +This prints out: + + stat "/nonexistent": ENOENT, stat '/nonexistent' + +which resembles how Unix programs typically report errors: + + $ sort /nonexistent + sort: open failed: /nonexistent: No such file or directory + +To match the Unixy feel, when you print out the error, just prepend the +program's name to the VError's `message`. Or just call +[node-cmdutil.fail(your_verror)](https://github.com/joyent/node-cmdutil), which +does this for you. + +You can get the next-level Error using `err.cause()`: + +```javascript +console.error(err2.cause().message); +``` + +prints: + + ENOENT, stat '/nonexistent' + +Of course, you can chain these as many times as you want, and it works with any +kind of Error: + +```javascript +var err1 = new Error('No such file or directory'); +var err2 = new VError(err1, 'failed to stat "%s"', '/junk'); +var err3 = new VError(err2, 'request failed'); +console.error(err3.message); +``` + +This prints: + + request failed: failed to stat "/junk": No such file or directory + +The idea is that each layer in the stack annotates the error with a description +of what it was doing. The end result is a message that explains what happened +at each level. + +You can also decorate Error objects with additional information so that callers +can not only handle each kind of error differently, but also construct their own +error messages (e.g., to localize them, format them, group them by type, and so +on). See the example below. + + +# Deeper dive + +The two main goals for VError are: + +* **Make it easy to construct clear, complete error messages intended for + people.** Clear error messages greatly improve both user experience and + debuggability, so we wanted to make it easy to build them. That's why the + constructor takes printf-style arguments. +* **Make it easy to construct objects with programmatically-accessible + metadata** (which we call _informational properties_). Instead of just saying + "connection refused while connecting to 192.168.1.2:80", you can add + properties like `"ip": "192.168.1.2"` and `"tcpPort": 80`. This can be used + for feeding into monitoring systems, analyzing large numbers of Errors (as + from a log file), or localizing error messages. + +To really make this useful, it also needs to be easy to compose Errors: +higher-level code should be able to augment the Errors reported by lower-level +code to provide a more complete description of what happened. Instead of saying +"connection refused", you can say "operation X failed: connection refused". +That's why VError supports `causes`. + +In order for all this to work, programmers need to know that it's generally safe +to wrap lower-level Errors with higher-level ones. If you have existing code +that handles Errors produced by a library, you should be able to wrap those +Errors with a VError to add information without breaking the error handling +code. There are two obvious ways that this could break such consumers: + +* The error's name might change. People typically use `name` to determine what + kind of Error they've got. To ensure compatibility, you can create VErrors + with custom names, but this approach isn't great because it prevents you from + representing complex failures. For this reason, VError provides + `findCauseByName`, which essentially asks: does this Error _or any of its + causes_ have this specific type? If error handling code uses + `findCauseByName`, then subsystems can construct very specific causal chains + for debuggability and still let people handle simple cases easily. There's an + example below. +* The error's properties might change. People often hang additional properties + off of Error objects. If we wrap an existing Error in a new Error, those + properties would be lost unless we copied them. But there are a variety of + both standard and non-standard Error properties that should _not_ be copied in + this way: most obviously `name`, `message`, and `stack`, but also `fileName`, + `lineNumber`, and a few others. Plus, it's useful for some Error subclasses + to have their own private properties -- and there'd be no way to know whether + these should be copied. For these reasons, VError first-classes these + information properties. You have to provide them in the constructor, you can + only fetch them with the `info()` function, and VError takes care of making + sure properties from causes wind up in the `info()` output. + +Let's put this all together with an example from the node-fast RPC library. +node-fast implements a simple RPC protocol for Node programs. There's a server +and client interface, and clients make RPC requests to servers. Let's say the +server fails with an UnauthorizedError with message "user 'bob' is not +authorized". The client wraps all server errors with a FastServerError. The +client also wraps all request errors with a FastRequestError that includes the +name of the RPC call being made. The result of this failed RPC might look like +this: + + name: FastRequestError + message: "request failed: server error: user 'bob' is not authorized" + rpcMsgid: + rpcMethod: GetObject + cause: + name: FastServerError + message: "server error: user 'bob' is not authorized" + cause: + name: UnauthorizedError + message: "user 'bob' is not authorized" + rpcUser: "bob" + +When the caller uses `VError.info()`, the information properties are collapsed +so that it looks like this: + + message: "request failed: server error: user 'bob' is not authorized" + rpcMsgid: + rpcMethod: GetObject + rpcUser: "bob" + +Taking this apart: + +* The error's message is a complete description of the problem. The caller can + report this directly to its caller, which can potentially make its way back to + an end user (if appropriate). It can also be logged. +* The caller can tell that the request failed on the server, rather than as a + result of a client problem (e.g., failure to serialize the request), a + transport problem (e.g., failure to connect to the server), or something else + (e.g., a timeout). They do this using `findCauseByName('FastServerError')` + rather than checking the `name` field directly. +* If the caller logs this error, the logs can be analyzed to aggregate + errors by cause, by RPC method name, by user, or whatever. Or the + error can be correlated with other events for the same rpcMsgid. +* It wasn't very hard for any part of the code to contribute to this Error. + Each part of the stack has just a few lines to provide exactly what it knows, + with very little boilerplate. + +It's not expected that you'd use these complex forms all the time. Despite +supporting the complex case above, you can still just do: + + new VError("my service isn't working"); + +for the simple cases. + + +# Reference: VError, WError, SError + +VError, WError, and SError are convenient drop-in replacements for `Error` that +support printf-style arguments, first-class causes, informational properties, +and other useful features. + + +## Constructors + +The VError constructor has several forms: + +```javascript +/* + * This is the most general form. You can specify any supported options + * (including "cause" and "info") this way. + */ +new VError(options, sprintf_args...) + +/* + * This is a useful shorthand when the only option you need is "cause". + */ +new VError(cause, sprintf_args...) + +/* + * This is a useful shorthand when you don't need any options at all. + */ +new VError(sprintf_args...) +``` + +All of these forms construct a new VError that behaves just like the built-in +JavaScript `Error` class, with some additional methods described below. + +In the first form, `options` is a plain object with any of the following +optional properties: + +Option name | Type | Meaning +---------------- | ---------------- | ------- +`name` | string | Describes what kind of error this is. This is intended for programmatic use to distinguish between different kinds of errors. Note that in modern versions of Node.js, this name is ignored in the `stack` property value, but callers can still use the `name` property to get at it. +`cause` | any Error object | Indicates that the new error was caused by `cause`. See `cause()` below. If unspecified, the cause will be `null`. +`strict` | boolean | If true, then `null` and `undefined` values in `sprintf_args` are passed through to `sprintf()`. Otherwise, these are replaced with the strings `'null'`, and '`undefined`', respectively. +`constructorOpt` | function | If specified, then the stack trace for this error ends at function `constructorOpt`. Functions called by `constructorOpt` will not show up in the stack. This is useful when this class is subclassed. +`info` | object | Specifies arbitrary informational properties that are available through the `VError.info(err)` static class method. See that method for details. + +The second form is equivalent to using the first form with the specified `cause` +as the error's cause. This form is distinguished from the first form because +the first argument is an Error. + +The third form is equivalent to using the first form with all default option +values. This form is distinguished from the other forms because the first +argument is not an object or an Error. + +The `WError` constructor is used exactly the same way as the `VError` +constructor. The `SError` constructor is also used the same way as the +`VError` constructor except that in all cases, the `strict` property is +overriden to `true. + + +## Public properties + +`VError`, `WError`, and `SError` all provide the same public properties as +JavaScript's built-in Error objects. + +Property name | Type | Meaning +------------- | ------ | ------- +`name` | string | Programmatically-usable name of the error. +`message` | string | Human-readable summary of the failure. Programmatically-accessible details are provided through `VError.info(err)` class method. +`stack` | string | Human-readable stack trace where the Error was constructed. + +For all of these classes, the printf-style arguments passed to the constructor +are processed with `sprintf()` to form a message. For `WError`, this becomes +the complete `message` property. For `SError` and `VError`, this message is +prepended to the message of the cause, if any (with a suitable separator), and +the result becomes the `message` property. + +The `stack` property is managed entirely by the underlying JavaScript +implementation. It's generally implemented using a getter function because +constructing the human-readable stack trace is somewhat expensive. + +## Class methods + +The following methods are defined on the `VError` class and as exported +functions on the `verror` module. They're defined this way rather than using +methods on VError instances so that they can be used on Errors not created with +`VError`. + +### `VError.cause(err)` + +The `cause()` function returns the next Error in the cause chain for `err`, or +`null` if there is no next error. See the `cause` argument to the constructor. +Errors can have arbitrarily long cause chains. You can walk the `cause` chain +by invoking `VError.cause(err)` on each subsequent return value. If `err` is +not a `VError`, the cause is `null`. + +### `VError.info(err)` + +Returns an object with all of the extra error information that's been associated +with this Error and all of its causes. These are the properties passed in using +the `info` option to the constructor. Properties not specified in the +constructor for this Error are implicitly inherited from this error's cause. + +These properties are intended to provide programmatically-accessible metadata +about the error. For an error that indicates a failure to resolve a DNS name, +informational properties might include the DNS name to be resolved, or even the +list of resolvers used to resolve it. The values of these properties should +generally be plain objects (i.e., consisting only of null, undefined, numbers, +booleans, strings, and objects and arrays containing only other plain objects). + +### `VError.fullStack(err)` + +Returns a string containing the full stack trace, with all nested errors recursively +reported as `'caused by:' + err.stack`. + +### `VError.findCauseByName(err, name)` + +The `findCauseByName()` function traverses the cause chain for `err`, looking +for an error whose `name` property matches the passed in `name` value. If no +match is found, `null` is returned. + +If all you want is to know _whether_ there's a cause (and you don't care what it +is), you can use `VError.hasCauseWithName(err, name)`. + +If a vanilla error or a non-VError error is passed in, then there is no cause +chain to traverse. In this scenario, the function will check the `name` +property of only `err`. + +### `VError.hasCauseWithName(err, name)` + +Returns true if and only if `VError.findCauseByName(err, name)` would return +a non-null value. This essentially determines whether `err` has any cause in +its cause chain that has name `name`. + +### `VError.errorFromList(errors)` + +Given an array of Error objects (possibly empty), return a single error +representing the whole collection of errors. If the list has: + +* 0 elements, returns `null` +* 1 element, returns the sole error +* more than 1 element, returns a MultiError referencing the whole list + +This is useful for cases where an operation may produce any number of errors, +and you ultimately want to implement the usual `callback(err)` pattern. You can +accumulate the errors in an array and then invoke +`callback(VError.errorFromList(errors))` when the operation is complete. + + +### `VError.errorForEach(err, func)` + +Convenience function for iterating an error that may itself be a MultiError. + +In all cases, `err` must be an Error. If `err` is a MultiError, then `func` is +invoked as `func(errorN)` for each of the underlying errors of the MultiError. +If `err` is any other kind of error, `func` is invoked once as `func(err)`. In +all cases, `func` is invoked synchronously. + +This is useful for cases where an operation may produce any number of warnings +that may be encapsulated with a MultiError -- but may not be. + +This function does not iterate an error's cause chain. + + +## Examples + +The "Demo" section above covers several basic cases. Here's a more advanced +case: + +```javascript +var err1 = new VError('something bad happened'); +/* ... */ +var err2 = new VError({ + 'name': 'ConnectionError', + 'cause': err1, + 'info': { + 'errno': 'ECONNREFUSED', + 'remote_ip': '127.0.0.1', + 'port': 215 + } +}, 'failed to connect to "%s:%d"', '127.0.0.1', 215); + +console.log(err2.message); +console.log(err2.name); +console.log(VError.info(err2)); +console.log(err2.stack); +``` + +This outputs: + + failed to connect to "127.0.0.1:215": something bad happened + ConnectionError + { errno: 'ECONNREFUSED', remote_ip: '127.0.0.1', port: 215 } + ConnectionError: failed to connect to "127.0.0.1:215": something bad happened + at Object. (/home/dap/node-verror/examples/info.js:5:12) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:935:3 + +Information properties are inherited up the cause chain, with values at the top +of the chain overriding same-named values lower in the chain. To continue that +example: + +```javascript +var err3 = new VError({ + 'name': 'RequestError', + 'cause': err2, + 'info': { + 'errno': 'EBADREQUEST' + } +}, 'request failed'); + +console.log(err3.message); +console.log(err3.name); +console.log(VError.info(err3)); +console.log(err3.stack); +``` + +This outputs: + + request failed: failed to connect to "127.0.0.1:215": something bad happened + RequestError + { errno: 'EBADREQUEST', remote_ip: '127.0.0.1', port: 215 } + RequestError: request failed: failed to connect to "127.0.0.1:215": something bad happened + at Object. (/home/dap/node-verror/examples/info.js:20:12) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:935:3 + +You can also print the complete stack trace of combined `Error`s by using +`VError.fullStack(err).` + +```javascript +var err1 = new VError('something bad happened'); +/* ... */ +var err2 = new VError(err1, 'something really bad happened here'); + +console.log(VError.fullStack(err2)); +``` + +This outputs: + + VError: something really bad happened here: something bad happened + at Object. (/home/dap/node-verror/examples/fullStack.js:5:12) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + at Function.Module._load (module.js:300:12) + at Function.Module.runMain (module.js:441:10) + at startup (node.js:139:18) + at node.js:968:3 + caused by: VError: something bad happened + at Object. (/home/dap/node-verror/examples/fullStack.js:3:12) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + at Function.Module._load (module.js:300:12) + at Function.Module.runMain (module.js:441:10) + at startup (node.js:139:18) + at node.js:968:3 + +`VError.fullStack` is also safe to use on regular `Error`s, so feel free to use +it whenever you need to extract the stack trace from an `Error`, regardless if +it's a `VError` or not. + +# Reference: MultiError + +MultiError is an Error class that represents a group of Errors. This is used +when you logically need to provide a single Error, but you want to preserve +information about multiple underying Errors. A common case is when you execute +several operations in parallel and some of them fail. + +MultiErrors are constructed as: + +```javascript +new MultiError(error_list) +``` + +`error_list` is an array of at least one `Error` object. + +The cause of the MultiError is the first error provided. None of the other +`VError` options are supported. The `message` for a MultiError consists the +`message` from the first error, prepended with a message indicating that there +were other errors. + +For example: + +```javascript +err = new MultiError([ + new Error('failed to resolve DNS name "abc.example.com"'), + new Error('failed to resolve DNS name "def.example.com"'), +]); + +console.error(err.message); +``` + +outputs: + + first of 2 errors: failed to resolve DNS name "abc.example.com" + +See the convenience function `VError.errorFromList`, which is sometimes simpler +to use than this constructor. + +## Public methods + + +### `errors()` + +Returns an array of the errors used to construct this MultiError. + + +# Contributing + +See separate [contribution guidelines](CONTRIBUTING.md). diff --git a/node_modules/verror/lib/verror.js b/node_modules/verror/lib/verror.js new file mode 100644 index 0000000..8663dde --- /dev/null +++ b/node_modules/verror/lib/verror.js @@ -0,0 +1,451 @@ +/* + * verror.js: richer JavaScript errors + */ + +var mod_assertplus = require('assert-plus'); +var mod_util = require('util'); + +var mod_extsprintf = require('extsprintf'); +var mod_isError = require('core-util-is').isError; +var sprintf = mod_extsprintf.sprintf; + +/* + * Public interface + */ + +/* So you can 'var VError = require('verror')' */ +module.exports = VError; +/* For compatibility */ +VError.VError = VError; +/* Other exported classes */ +VError.SError = SError; +VError.WError = WError; +VError.MultiError = MultiError; + +/* + * Common function used to parse constructor arguments for VError, WError, and + * SError. Named arguments to this function: + * + * strict force strict interpretation of sprintf arguments, even + * if the options in "argv" don't say so + * + * argv error's constructor arguments, which are to be + * interpreted as described in README.md. For quick + * reference, "argv" has one of the following forms: + * + * [ sprintf_args... ] (argv[0] is a string) + * [ cause, sprintf_args... ] (argv[0] is an Error) + * [ options, sprintf_args... ] (argv[0] is an object) + * + * This function normalizes these forms, producing an object with the following + * properties: + * + * options equivalent to "options" in third form. This will never + * be a direct reference to what the caller passed in + * (i.e., it may be a shallow copy), so it can be freely + * modified. + * + * shortmessage result of sprintf(sprintf_args), taking options.strict + * into account as described in README.md. + */ +function parseConstructorArguments(args) +{ + var argv, options, sprintf_args, shortmessage, k; + + mod_assertplus.object(args, 'args'); + mod_assertplus.bool(args.strict, 'args.strict'); + mod_assertplus.array(args.argv, 'args.argv'); + argv = args.argv; + + /* + * First, figure out which form of invocation we've been given. + */ + if (argv.length === 0) { + options = {}; + sprintf_args = []; + } else if (mod_isError(argv[0])) { + options = { 'cause': argv[0] }; + sprintf_args = argv.slice(1); + } else if (typeof (argv[0]) === 'object') { + options = {}; + for (k in argv[0]) { + options[k] = argv[0][k]; + } + sprintf_args = argv.slice(1); + } else { + mod_assertplus.string(argv[0], + 'first argument to VError, SError, or WError ' + + 'constructor must be a string, object, or Error'); + options = {}; + sprintf_args = argv; + } + + /* + * Now construct the error's message. + * + * extsprintf (which we invoke here with our caller's arguments in order + * to construct this Error's message) is strict in its interpretation of + * values to be processed by the "%s" specifier. The value passed to + * extsprintf must actually be a string or something convertible to a + * String using .toString(). Passing other values (notably "null" and + * "undefined") is considered a programmer error. The assumption is + * that if you actually want to print the string "null" or "undefined", + * then that's easy to do that when you're calling extsprintf; on the + * other hand, if you did NOT want that (i.e., there's actually a bug + * where the program assumes some variable is non-null and tries to + * print it, which might happen when constructing a packet or file in + * some specific format), then it's better to stop immediately than + * produce bogus output. + * + * However, sometimes the bug is only in the code calling VError, and a + * programmer might prefer to have the error message contain "null" or + * "undefined" rather than have the bug in the error path crash the + * program (making the first bug harder to identify). For that reason, + * by default VError converts "null" or "undefined" arguments to their + * string representations and passes those to extsprintf. Programmers + * desiring the strict behavior can use the SError class or pass the + * "strict" option to the VError constructor. + */ + mod_assertplus.object(options); + if (!options.strict && !args.strict) { + sprintf_args = sprintf_args.map(function (a) { + return (a === null ? 'null' : + a === undefined ? 'undefined' : a); + }); + } + + if (sprintf_args.length === 0) { + shortmessage = ''; + } else { + shortmessage = sprintf.apply(null, sprintf_args); + } + + return ({ + 'options': options, + 'shortmessage': shortmessage + }); +} + +/* + * See README.md for reference documentation. + */ +function VError() +{ + var args, obj, parsed, cause, ctor, message, k; + + args = Array.prototype.slice.call(arguments, 0); + + /* + * This is a regrettable pattern, but JavaScript's built-in Error class + * is defined to work this way, so we allow the constructor to be called + * without "new". + */ + if (!(this instanceof VError)) { + obj = Object.create(VError.prototype); + VError.apply(obj, arguments); + return (obj); + } + + /* + * For convenience and backwards compatibility, we support several + * different calling forms. Normalize them here. + */ + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': false + }); + + /* + * If we've been given a name, apply it now. + */ + if (parsed.options.name) { + mod_assertplus.string(parsed.options.name, + 'error\'s "name" must be a string'); + this.name = parsed.options.name; + } + + /* + * For debugging, we keep track of the original short message (attached + * this Error particularly) separately from the complete message (which + * includes the messages of our cause chain). + */ + this.jse_shortmsg = parsed.shortmessage; + message = parsed.shortmessage; + + /* + * If we've been given a cause, record a reference to it and update our + * message appropriately. + */ + cause = parsed.options.cause; + if (cause) { + mod_assertplus.ok(mod_isError(cause), 'cause is not an Error'); + this.jse_cause = cause; + + if (!parsed.options.skipCauseMessage) { + message += ': ' + cause.message; + } + } + + /* + * If we've been given an object with properties, shallow-copy that + * here. We don't want to use a deep copy in case there are non-plain + * objects here, but we don't want to use the original object in case + * the caller modifies it later. + */ + this.jse_info = {}; + if (parsed.options.info) { + for (k in parsed.options.info) { + this.jse_info[k] = parsed.options.info[k]; + } + } + + this.message = message; + Error.call(this, message); + + if (Error.captureStackTrace) { + ctor = parsed.options.constructorOpt || this.constructor; + Error.captureStackTrace(this, ctor); + } + + return (this); +} + +mod_util.inherits(VError, Error); +VError.prototype.name = 'VError'; + +VError.prototype.toString = function ve_toString() +{ + var str = (this.hasOwnProperty('name') && this.name || + this.constructor.name || this.constructor.prototype.name); + if (this.message) + str += ': ' + this.message; + + return (str); +}; + +/* + * This method is provided for compatibility. New callers should use + * VError.cause() instead. That method also uses the saner `null` return value + * when there is no cause. + */ +VError.prototype.cause = function ve_cause() +{ + var cause = VError.cause(this); + return (cause === null ? undefined : cause); +}; + +/* + * Static methods + * + * These class-level methods are provided so that callers can use them on + * instances of Errors that are not VErrors. New interfaces should be provided + * only using static methods to eliminate the class of programming mistake where + * people fail to check whether the Error object has the corresponding methods. + */ + +VError.cause = function (err) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + return (mod_isError(err.jse_cause) ? err.jse_cause : null); +}; + +VError.info = function (err) +{ + var rv, cause, k; + + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + cause = VError.cause(err); + if (cause !== null) { + rv = VError.info(cause); + } else { + rv = {}; + } + + if (typeof (err.jse_info) == 'object' && err.jse_info !== null) { + for (k in err.jse_info) { + rv[k] = err.jse_info[k]; + } + } + + return (rv); +}; + +VError.findCauseByName = function (err, name) +{ + var cause; + + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + mod_assertplus.string(name, 'name'); + mod_assertplus.ok(name.length > 0, 'name cannot be empty'); + + for (cause = err; cause !== null; cause = VError.cause(cause)) { + mod_assertplus.ok(mod_isError(cause)); + if (cause.name == name) { + return (cause); + } + } + + return (null); +}; + +VError.hasCauseWithName = function (err, name) +{ + return (VError.findCauseByName(err, name) !== null); +}; + +VError.fullStack = function (err) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + + var cause = VError.cause(err); + + if (cause) { + return (err.stack + '\ncaused by: ' + VError.fullStack(cause)); + } + + return (err.stack); +}; + +VError.errorFromList = function (errors) +{ + mod_assertplus.arrayOfObject(errors, 'errors'); + + if (errors.length === 0) { + return (null); + } + + errors.forEach(function (e) { + mod_assertplus.ok(mod_isError(e)); + }); + + if (errors.length == 1) { + return (errors[0]); + } + + return (new MultiError(errors)); +}; + +VError.errorForEach = function (err, func) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + mod_assertplus.func(func, 'func'); + + if (err instanceof MultiError) { + err.errors().forEach(function iterError(e) { func(e); }); + } else { + func(err); + } +}; + + +/* + * SError is like VError, but stricter about types. You cannot pass "null" or + * "undefined" as string arguments to the formatter. + */ +function SError() +{ + var args, obj, parsed, options; + + args = Array.prototype.slice.call(arguments, 0); + if (!(this instanceof SError)) { + obj = Object.create(SError.prototype); + SError.apply(obj, arguments); + return (obj); + } + + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': true + }); + + options = parsed.options; + VError.call(this, options, '%s', parsed.shortmessage); + + return (this); +} + +/* + * We don't bother setting SError.prototype.name because once constructed, + * SErrors are just like VErrors. + */ +mod_util.inherits(SError, VError); + + +/* + * Represents a collection of errors for the purpose of consumers that generally + * only deal with one error. Callers can extract the individual errors + * contained in this object, but may also just treat it as a normal single + * error, in which case a summary message will be printed. + */ +function MultiError(errors) +{ + mod_assertplus.array(errors, 'list of errors'); + mod_assertplus.ok(errors.length > 0, 'must be at least one error'); + this.ase_errors = errors; + + VError.call(this, { + 'cause': errors[0] + }, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's'); +} + +mod_util.inherits(MultiError, VError); +MultiError.prototype.name = 'MultiError'; + +MultiError.prototype.errors = function me_errors() +{ + return (this.ase_errors.slice(0)); +}; + + +/* + * See README.md for reference details. + */ +function WError() +{ + var args, obj, parsed, options; + + args = Array.prototype.slice.call(arguments, 0); + if (!(this instanceof WError)) { + obj = Object.create(WError.prototype); + WError.apply(obj, args); + return (obj); + } + + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': false + }); + + options = parsed.options; + options['skipCauseMessage'] = true; + VError.call(this, options, '%s', parsed.shortmessage); + + return (this); +} + +mod_util.inherits(WError, VError); +WError.prototype.name = 'WError'; + +WError.prototype.toString = function we_toString() +{ + var str = (this.hasOwnProperty('name') && this.name || + this.constructor.name || this.constructor.prototype.name); + if (this.message) + str += ': ' + this.message; + if (this.jse_cause && this.jse_cause.message) + str += '; caused by ' + this.jse_cause.toString(); + + return (str); +}; + +/* + * For purely historical reasons, WError's cause() function allows you to set + * the cause. + */ +WError.prototype.cause = function we_cause(c) +{ + if (mod_isError(c)) + this.jse_cause = c; + + return (this.jse_cause); +}; diff --git a/node_modules/verror/package.json b/node_modules/verror/package.json new file mode 100644 index 0000000..9ae147f --- /dev/null +++ b/node_modules/verror/package.json @@ -0,0 +1,54 @@ +{ + "_args": [ + [ + "verror@1.10.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "verror@1.10.0", + "_id": "verror@1.10.0", + "_inBundle": false, + "_integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "_location": "/verror", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "verror@1.10.0", + "name": "verror", + "escapedName": "verror", + "rawSpec": "1.10.0", + "saveSpec": null, + "fetchSpec": "1.10.0" + }, + "_requiredBy": [ + "/jsprim" + ], + "_resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "_spec": "1.10.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "bugs": { + "url": "https://github.com/davepacheco/node-verror/issues" + }, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "description": "richer JavaScript errors", + "engines": [ + "node >=0.6.0" + ], + "homepage": "https://github.com/davepacheco/node-verror#readme", + "license": "MIT", + "main": "./lib/verror.js", + "name": "verror", + "repository": { + "type": "git", + "url": "git://github.com/davepacheco/node-verror.git" + }, + "scripts": { + "test": "make test" + }, + "version": "1.10.0" +} diff --git a/node_modules/which/CHANGELOG.md b/node_modules/which/CHANGELOG.md new file mode 100644 index 0000000..3d83d26 --- /dev/null +++ b/node_modules/which/CHANGELOG.md @@ -0,0 +1,152 @@ +# Changes + + +## 1.3.1 + +* update deps +* update travis + +## v1.3.0 + +* Add nothrow option to which.sync +* update tap + +## v1.2.14 + +* appveyor: drop node 5 and 0.x +* travis-ci: add node 6, drop 0.x + +## v1.2.13 + +* test: Pass missing option to pass on windows +* update tap +* update isexe to 2.0.0 +* neveragain.tech pledge request + +## v1.2.12 + +* Removed unused require + +## v1.2.11 + +* Prevent changelog script from being included in package + +## v1.2.10 + +* Use env.PATH only, not env.Path + +## v1.2.9 + +* fix for paths starting with ../ +* Remove unused `is-absolute` module + +## v1.2.8 + +* bullet items in changelog that contain (but don't start with) # + +## v1.2.7 + +* strip 'update changelog' changelog entries out of changelog + +## v1.2.6 + +* make the changelog bulleted + +## v1.2.5 + +* make a changelog, and keep it up to date +* don't include tests in package +* Properly handle relative-path executables +* appveyor +* Attach error code to Not Found error +* Make tests pass on Windows + +## v1.2.4 + +* Fix typo + +## v1.2.3 + +* update isexe, fix regression in pathExt handling + +## v1.2.2 + +* update deps, use isexe module, test windows + +## v1.2.1 + +* Sometimes windows PATH entries are quoted +* Fixed a bug in the check for group and user mode bits. This bug was introduced during refactoring for supporting strict mode. +* doc cli + +## v1.2.0 + +* Add support for opt.all and -as cli flags +* test the bin +* update travis +* Allow checking for multiple programs in bin/which +* tap 2 + +## v1.1.2 + +* travis +* Refactored and fixed undefined error on Windows +* Support strict mode + +## v1.1.1 + +* test +g exes against secondary groups, if available +* Use windows exe semantics on cygwin & msys +* cwd should be first in path on win32, not last +* Handle lower-case 'env.Path' on Windows +* Update docs +* use single-quotes + +## v1.1.0 + +* Add tests, depend on is-absolute + +## v1.0.9 + +* which.js: root is allowed to execute files owned by anyone + +## v1.0.8 + +* don't use graceful-fs + +## v1.0.7 + +* add license to package.json + +## v1.0.6 + +* isc license + +## 1.0.5 + +* Awful typo + +## 1.0.4 + +* Test for path absoluteness properly +* win: Allow '' as a pathext if cmd has a . in it + +## 1.0.3 + +* Remove references to execPath +* Make `which.sync()` work on Windows by honoring the PATHEXT variable. +* Make `isExe()` always return true on Windows. +* MIT + +## 1.0.2 + +* Only files can be exes + +## 1.0.1 + +* Respect the PATHEXT env for win32 support +* should 0755 the bin +* binary +* guts +* package +* 1st diff --git a/node_modules/which/LICENSE b/node_modules/which/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/which/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/which/README.md b/node_modules/which/README.md new file mode 100644 index 0000000..8c0b0cb --- /dev/null +++ b/node_modules/which/README.md @@ -0,0 +1,51 @@ +# which + +Like the unix `which` utility. + +Finds the first instance of a specified executable in the PATH +environment variable. Does not cache the results, so `hash -r` is not +needed when the PATH changes. + +## USAGE + +```javascript +var which = require('which') + +// async usage +which('node', function (er, resolvedPath) { + // er is returned if no "node" is found on the PATH + // if it is found, then the absolute path to the exec is returned +}) + +// sync usage +// throws if not found +var resolved = which.sync('node') + +// if nothrow option is used, returns null if not found +resolved = which.sync('node', {nothrow: true}) + +// Pass options to override the PATH and PATHEXT environment vars. +which('node', { path: someOtherPath }, function (er, resolved) { + if (er) + throw er + console.log('found at %j', resolved) +}) +``` + +## CLI USAGE + +Same as the BSD `which(1)` binary. + +``` +usage: which [-as] program ... +``` + +## OPTIONS + +You may pass an options object as the second argument. + +- `path`: Use instead of the `PATH` environment variable. +- `pathExt`: Use instead of the `PATHEXT` environment variable. +- `all`: Return all matches, instead of just the first one. Note that + this means the function returns an array of strings instead of a + single string. diff --git a/node_modules/which/bin/which b/node_modules/which/bin/which new file mode 100755 index 0000000..7cee372 --- /dev/null +++ b/node_modules/which/bin/which @@ -0,0 +1,52 @@ +#!/usr/bin/env node +var which = require("../") +if (process.argv.length < 3) + usage() + +function usage () { + console.error('usage: which [-as] program ...') + process.exit(1) +} + +var all = false +var silent = false +var dashdash = false +var args = process.argv.slice(2).filter(function (arg) { + if (dashdash || !/^-/.test(arg)) + return true + + if (arg === '--') { + dashdash = true + return false + } + + var flags = arg.substr(1).split('') + for (var f = 0; f < flags.length; f++) { + var flag = flags[f] + switch (flag) { + case 's': + silent = true + break + case 'a': + all = true + break + default: + console.error('which: illegal option -- ' + flag) + usage() + } + } + return false +}) + +process.exit(args.reduce(function (pv, current) { + try { + var f = which.sync(current, { all: all }) + if (all) + f = f.join('\n') + if (!silent) + console.log(f) + return pv; + } catch (e) { + return 1; + } +}, 0)) diff --git a/node_modules/which/package.json b/node_modules/which/package.json new file mode 100644 index 0000000..6d88ed7 --- /dev/null +++ b/node_modules/which/package.json @@ -0,0 +1,69 @@ +{ + "_args": [ + [ + "which@1.3.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "which@1.3.1", + "_id": "which@1.3.1", + "_inBundle": false, + "_integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "_location": "/which", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "which@1.3.1", + "name": "which", + "escapedName": "which", + "rawSpec": "1.3.1", + "saveSpec": null, + "fetchSpec": "1.3.1" + }, + "_requiredBy": [ + "/cross-spawn", + "/global-prefix" + ], + "_resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "_spec": "1.3.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "bin": { + "which": "bin/which" + }, + "bugs": { + "url": "https://github.com/isaacs/node-which/issues" + }, + "dependencies": { + "isexe": "^2.0.0" + }, + "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", + "devDependencies": { + "mkdirp": "^0.5.0", + "rimraf": "^2.6.2", + "tap": "^12.0.1" + }, + "files": [ + "which.js", + "bin/which" + ], + "homepage": "https://github.com/isaacs/node-which#readme", + "license": "ISC", + "main": "which.js", + "name": "which", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-which.git" + }, + "scripts": { + "changelog": "bash gen-changelog.sh", + "postversion": "npm run changelog && git add CHANGELOG.md && git commit -m 'update changelog - '${npm_package_version}", + "test": "tap test/*.js --cov" + }, + "version": "1.3.1" +} diff --git a/node_modules/which/which.js b/node_modules/which/which.js new file mode 100644 index 0000000..4347f91 --- /dev/null +++ b/node_modules/which/which.js @@ -0,0 +1,135 @@ +module.exports = which +which.sync = whichSync + +var isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' + +var path = require('path') +var COLON = isWindows ? ';' : ':' +var isexe = require('isexe') + +function getNotFoundError (cmd) { + var er = new Error('not found: ' + cmd) + er.code = 'ENOENT' + + return er +} + +function getPathInfo (cmd, opt) { + var colon = opt.colon || COLON + var pathEnv = opt.path || process.env.PATH || '' + var pathExt = [''] + + pathEnv = pathEnv.split(colon) + + var pathExtExe = '' + if (isWindows) { + pathEnv.unshift(process.cwd()) + pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM') + pathExt = pathExtExe.split(colon) + + + // Always test the cmd itself first. isexe will check to make sure + // it's found in the pathExt set. + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + if (cmd.match(/\//) || isWindows && cmd.match(/\\/)) + pathEnv = [''] + + return { + env: pathEnv, + ext: pathExt, + extExe: pathExtExe + } +} + +function which (cmd, opt, cb) { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + + var info = getPathInfo(cmd, opt) + var pathEnv = info.env + var pathExt = info.ext + var pathExtExe = info.extExe + var found = [] + + ;(function F (i, l) { + if (i === l) { + if (opt.all && found.length) + return cb(null, found) + else + return cb(getNotFoundError(cmd)) + } + + var pathPart = pathEnv[i] + if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') + pathPart = pathPart.slice(1, -1) + + var p = path.join(pathPart, cmd) + if (!pathPart && (/^\.[\\\/]/).test(cmd)) { + p = cmd.slice(0, 2) + p + } + ;(function E (ii, ll) { + if (ii === ll) return F(i + 1, l) + var ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, function (er, is) { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return cb(null, p + ext) + } + return E(ii + 1, ll) + }) + })(0, pathExt.length) + })(0, pathEnv.length) +} + +function whichSync (cmd, opt) { + opt = opt || {} + + var info = getPathInfo(cmd, opt) + var pathEnv = info.env + var pathExt = info.ext + var pathExtExe = info.extExe + var found = [] + + for (var i = 0, l = pathEnv.length; i < l; i ++) { + var pathPart = pathEnv[i] + if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') + pathPart = pathPart.slice(1, -1) + + var p = path.join(pathPart, cmd) + if (!pathPart && /^\.[\\\/]/.test(cmd)) { + p = cmd.slice(0, 2) + p + } + for (var j = 0, ll = pathExt.length; j < ll; j ++) { + var cur = p + pathExt[j] + var is + try { + is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} + } + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) +} diff --git a/node_modules/wide-align/LICENSE b/node_modules/wide-align/LICENSE new file mode 100644 index 0000000..f4be44d --- /dev/null +++ b/node_modules/wide-align/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +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/wide-align/README.md b/node_modules/wide-align/README.md new file mode 100644 index 0000000..32f1be0 --- /dev/null +++ b/node_modules/wide-align/README.md @@ -0,0 +1,47 @@ +wide-align +---------- + +A wide-character aware text alignment function for use in terminals / on the +console. + +### Usage + +``` +var align = require('wide-align') + +// Note that if you view this on a unicode console, all of the slashes are +// aligned. This is because on a console, all narrow characters are +// an en wide and all wide characters are an em. In browsers, this isn't +// held to and wide characters like "古" can be less than two narrow +// characters even with a fixed width font. + +console.log(align.center('abc', 10)) // ' abc ' +console.log(align.center('古古古', 10)) // ' 古古古 ' +console.log(align.left('abc', 10)) // 'abc ' +console.log(align.left('古古古', 10)) // '古古古 ' +console.log(align.right('abc', 10)) // ' abc' +console.log(align.right('古古古', 10)) // ' 古古古' +``` + +### Functions + +#### `align.center(str, length)` → `str` + +Returns *str* with spaces added to both sides such that that it is *length* +chars long and centered in the spaces. + +#### `align.left(str, length)` → `str` + +Returns *str* with spaces to the right such that it is *length* chars long. + +### `align.right(str, length)` → `str` + +Returns *str* with spaces to the left such that it is *length* chars long. + +### Origins + +These functions were originally taken from +[cliui](https://npmjs.com/package/cliui). Changes include switching to the +MUCH faster pad generation function from +[lodash](https://npmjs.com/package/lodash), making center alignment pad +both sides and adding left alignment. diff --git a/node_modules/wide-align/align.js b/node_modules/wide-align/align.js new file mode 100644 index 0000000..4f94ca4 --- /dev/null +++ b/node_modules/wide-align/align.js @@ -0,0 +1,65 @@ +'use strict' +var stringWidth = require('string-width') + +exports.center = alignCenter +exports.left = alignLeft +exports.right = alignRight + +// lodash's way of generating pad characters. + +function createPadding (width) { + var result = '' + var string = ' ' + var n = width + do { + if (n % 2) { + result += string; + } + n = Math.floor(n / 2); + string += string; + } while (n); + + return result; +} + +function alignLeft (str, width) { + var trimmed = str.trimRight() + if (trimmed.length === 0 && str.length >= width) return str + var padding = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + padding = createPadding(width - strWidth) + } + + return trimmed + padding +} + +function alignRight (str, width) { + var trimmed = str.trimLeft() + if (trimmed.length === 0 && str.length >= width) return str + var padding = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + padding = createPadding(width - strWidth) + } + + return padding + trimmed +} + +function alignCenter (str, width) { + var trimmed = str.trim() + if (trimmed.length === 0 && str.length >= width) return str + var padLeft = '' + var padRight = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + var padLeftBy = parseInt((width - strWidth) / 2, 10) + padLeft = createPadding(padLeftBy) + padRight = createPadding(width - (strWidth + padLeftBy)) + } + + return padLeft + trimmed + padRight +} diff --git a/node_modules/wide-align/package.json b/node_modules/wide-align/package.json new file mode 100644 index 0000000..b992b98 --- /dev/null +++ b/node_modules/wide-align/package.json @@ -0,0 +1,69 @@ +{ + "_args": [ + [ + "wide-align@1.1.3", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "wide-align@1.1.3", + "_id": "wide-align@1.1.3", + "_inBundle": false, + "_integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "_location": "/wide-align", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "wide-align@1.1.3", + "name": "wide-align", + "escapedName": "wide-align", + "rawSpec": "1.1.3", + "saveSpec": null, + "fetchSpec": "1.1.3" + }, + "_requiredBy": [ + "/gauge" + ], + "_resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "_spec": "1.1.3", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org/" + }, + "bugs": { + "url": "https://github.com/iarna/wide-align/issues" + }, + "dependencies": { + "string-width": "^1.0.2 || 2" + }, + "description": "A wide-character aware text alignment function for use on the console or with fixed width fonts.", + "devDependencies": { + "tap": "10 || 11 || 12" + }, + "files": [ + "align.js" + ], + "homepage": "https://github.com/iarna/wide-align#readme", + "keywords": [ + "wide", + "double", + "unicode", + "cjkv", + "pad", + "align" + ], + "license": "ISC", + "main": "align.js", + "name": "wide-align", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/wide-align.git" + }, + "scripts": { + "test": "tap --coverage test/*.js", + "version": "perl -pi -e 's/^( \"version\": $ENV{npm_config_node_version}\").*?\",/$1abc\",/' package-lock.json ; git add package-lock.json" + }, + "version": "1.1.3" +} diff --git a/node_modules/widest-line/index.js b/node_modules/widest-line/index.js new file mode 100644 index 0000000..a9865d0 --- /dev/null +++ b/node_modules/widest-line/index.js @@ -0,0 +1,8 @@ +'use strict'; +const stringWidth = require('string-width'); + +module.exports = input => { + let max = 0; + for (const s of input.split('\n')) max = Math.max(max, stringWidth(s)); + return max; +}; diff --git a/node_modules/widest-line/license b/node_modules/widest-line/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/widest-line/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/widest-line/node_modules/ansi-regex/index.js b/node_modules/widest-line/node_modules/ansi-regex/index.js new file mode 100644 index 0000000..c4aaecf --- /dev/null +++ b/node_modules/widest-line/node_modules/ansi-regex/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = () => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, 'g'); +}; diff --git a/node_modules/widest-line/node_modules/ansi-regex/license b/node_modules/widest-line/node_modules/ansi-regex/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/widest-line/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/widest-line/node_modules/ansi-regex/package.json b/node_modules/widest-line/node_modules/ansi-regex/package.json new file mode 100644 index 0000000..eb8850b --- /dev/null +++ b/node_modules/widest-line/node_modules/ansi-regex/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + "ansi-regex@3.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "ansi-regex@3.0.0", + "_id": "ansi-regex@3.0.0", + "_inBundle": false, + "_integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "_location": "/widest-line/ansi-regex", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ansi-regex@3.0.0", + "name": "ansi-regex", + "escapedName": "ansi-regex", + "rawSpec": "3.0.0", + "saveSpec": null, + "fetchSpec": "3.0.0" + }, + "_requiredBy": [ + "/widest-line/strip-ansi" + ], + "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "_spec": "3.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/ansi-regex/issues" + }, + "description": "Regular expression for matching ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/ansi-regex#readme", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "license": "MIT", + "name": "ansi-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/ansi-regex.git" + }, + "scripts": { + "test": "xo && ava", + "view-supported": "node fixtures/view-codes.js" + }, + "version": "3.0.0" +} diff --git a/node_modules/widest-line/node_modules/ansi-regex/readme.md b/node_modules/widest-line/node_modules/ansi-regex/readme.md new file mode 100644 index 0000000..22db1c3 --- /dev/null +++ b/node_modules/widest-line/node_modules/ansi-regex/readme.md @@ -0,0 +1,46 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] +``` + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/widest-line/node_modules/is-fullwidth-code-point/index.js b/node_modules/widest-line/node_modules/is-fullwidth-code-point/index.js new file mode 100644 index 0000000..d506327 --- /dev/null +++ b/node_modules/widest-line/node_modules/is-fullwidth-code-point/index.js @@ -0,0 +1,46 @@ +'use strict'; +/* eslint-disable yoda */ +module.exports = x => { + if (Number.isNaN(x)) { + return false; + } + + // code points are derived from: + // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt + if ( + x >= 0x1100 && ( + x <= 0x115f || // Hangul Jamo + x === 0x2329 || // LEFT-POINTING ANGLE BRACKET + x === 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK Radicals Supplement .. Enclosed CJK Letters and Months + (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || + // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A + (0x3250 <= x && x <= 0x4dbf) || + // CJK Unified Ideographs .. Yi Radicals + (0x4e00 <= x && x <= 0xa4c6) || + // Hangul Jamo Extended-A + (0xa960 <= x && x <= 0xa97c) || + // Hangul Syllables + (0xac00 <= x && x <= 0xd7a3) || + // CJK Compatibility Ideographs + (0xf900 <= x && x <= 0xfaff) || + // Vertical Forms + (0xfe10 <= x && x <= 0xfe19) || + // CJK Compatibility Forms .. Small Form Variants + (0xfe30 <= x && x <= 0xfe6b) || + // Halfwidth and Fullwidth Forms + (0xff01 <= x && x <= 0xff60) || + (0xffe0 <= x && x <= 0xffe6) || + // Kana Supplement + (0x1b000 <= x && x <= 0x1b001) || + // Enclosed Ideographic Supplement + (0x1f200 <= x && x <= 0x1f251) || + // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane + (0x20000 <= x && x <= 0x3fffd) + ) + ) { + return true; + } + + return false; +}; diff --git a/node_modules/widest-line/node_modules/is-fullwidth-code-point/license b/node_modules/widest-line/node_modules/is-fullwidth-code-point/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/widest-line/node_modules/is-fullwidth-code-point/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/widest-line/node_modules/is-fullwidth-code-point/package.json b/node_modules/widest-line/node_modules/is-fullwidth-code-point/package.json new file mode 100644 index 0000000..f8d2605 --- /dev/null +++ b/node_modules/widest-line/node_modules/is-fullwidth-code-point/package.json @@ -0,0 +1,81 @@ +{ + "_args": [ + [ + "is-fullwidth-code-point@2.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "is-fullwidth-code-point@2.0.0", + "_id": "is-fullwidth-code-point@2.0.0", + "_inBundle": false, + "_integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "_location": "/widest-line/is-fullwidth-code-point", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "is-fullwidth-code-point@2.0.0", + "name": "is-fullwidth-code-point", + "escapedName": "is-fullwidth-code-point", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/widest-line/string-width" + ], + "_resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "_spec": "2.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues" + }, + "description": "Check if the character represented by a given Unicode code point is fullwidth", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme", + "keywords": [ + "fullwidth", + "full-width", + "full", + "width", + "unicode", + "character", + "char", + "string", + "str", + "codepoint", + "code", + "point", + "is", + "detect", + "check" + ], + "license": "MIT", + "name": "is-fullwidth-code-point", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.0", + "xo": { + "esnext": true + } +} diff --git a/node_modules/widest-line/node_modules/is-fullwidth-code-point/readme.md b/node_modules/widest-line/node_modules/is-fullwidth-code-point/readme.md new file mode 100644 index 0000000..093b028 --- /dev/null +++ b/node_modules/widest-line/node_modules/is-fullwidth-code-point/readme.md @@ -0,0 +1,39 @@ +# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point) + +> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) + + +## Install + +``` +$ npm install --save is-fullwidth-code-point +``` + + +## Usage + +```js +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +isFullwidthCodePoint('谢'.codePointAt()); +//=> true + +isFullwidthCodePoint('a'.codePointAt()); +//=> false +``` + + +## API + +### isFullwidthCodePoint(input) + +#### input + +Type: `number` + +[Code point](https://en.wikipedia.org/wiki/Code_point) of a character. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/widest-line/node_modules/string-width/index.js b/node_modules/widest-line/node_modules/string-width/index.js new file mode 100644 index 0000000..bbc49d2 --- /dev/null +++ b/node_modules/widest-line/node_modules/string-width/index.js @@ -0,0 +1,36 @@ +'use strict'; +const stripAnsi = require('strip-ansi'); +const isFullwidthCodePoint = require('is-fullwidth-code-point'); + +module.exports = str => { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + str = stripAnsi(str); + + let width = 0; + + for (let i = 0; i < str.length; i++) { + const code = str.codePointAt(i); + + // Ignore control characters + if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { + continue; + } + + // Ignore combining characters + if (code >= 0x300 && code <= 0x36F) { + continue; + } + + // Surrogates + if (code > 0xFFFF) { + i++; + } + + width += isFullwidthCodePoint(code) ? 2 : 1; + } + + return width; +}; diff --git a/node_modules/widest-line/node_modules/string-width/license b/node_modules/widest-line/node_modules/string-width/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/widest-line/node_modules/string-width/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/widest-line/node_modules/string-width/package.json b/node_modules/widest-line/node_modules/string-width/package.json new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/node_modules/widest-line/node_modules/string-width/package.json @@ -0,0 +1,91 @@ +{ + "_args": [ + [ + "string-width@2.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "string-width@2.1.1", + "_id": "string-width@2.1.1", + "_inBundle": false, + "_integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "_location": "/widest-line/string-width", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "string-width@2.1.1", + "name": "string-width", + "escapedName": "string-width", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/widest-line" + ], + "_resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "_spec": "2.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/string-width/issues" + }, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "description": "Get the visual width of a string - the number of columns required to display it", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/string-width#readme", + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "license": "MIT", + "name": "string-width", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/string-width.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.1.1" +} diff --git a/node_modules/widest-line/node_modules/string-width/readme.md b/node_modules/widest-line/node_modules/string-width/readme.md new file mode 100644 index 0000000..df5b719 --- /dev/null +++ b/node_modules/widest-line/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/widest-line/node_modules/strip-ansi/index.js b/node_modules/widest-line/node_modules/strip-ansi/index.js new file mode 100644 index 0000000..96e0292 --- /dev/null +++ b/node_modules/widest-line/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +const ansiRegex = require('ansi-regex'); + +module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; diff --git a/node_modules/widest-line/node_modules/strip-ansi/license b/node_modules/widest-line/node_modules/strip-ansi/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/widest-line/node_modules/strip-ansi/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.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/widest-line/node_modules/strip-ansi/package.json b/node_modules/widest-line/node_modules/strip-ansi/package.json new file mode 100644 index 0000000..82beee8 --- /dev/null +++ b/node_modules/widest-line/node_modules/strip-ansi/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "strip-ansi@4.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "strip-ansi@4.0.0", + "_id": "strip-ansi@4.0.0", + "_inBundle": false, + "_integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "_location": "/widest-line/strip-ansi", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "strip-ansi@4.0.0", + "name": "strip-ansi", + "escapedName": "strip-ansi", + "rawSpec": "4.0.0", + "saveSpec": null, + "fetchSpec": "4.0.0" + }, + "_requiredBy": [ + "/widest-line/string-width" + ], + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "_spec": "4.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/strip-ansi/issues" + }, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "description": "Strip ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/strip-ansi#readme", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "name": "strip-ansi", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/strip-ansi.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "4.0.0" +} diff --git a/node_modules/widest-line/node_modules/strip-ansi/readme.md b/node_modules/widest-line/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000..dc76f0c --- /dev/null +++ b/node_modules/widest-line/node_modules/strip-ansi/readme.md @@ -0,0 +1,39 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install strip-ansi +``` + + +## Usage + +```js +const stripAnsi = require('strip-ansi'); + +stripAnsi('\u001B[4mUnicorn\u001B[0m'); +//=> 'Unicorn' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/widest-line/package.json b/node_modules/widest-line/package.json new file mode 100644 index 0000000..66f648e --- /dev/null +++ b/node_modules/widest-line/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "widest-line@2.0.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "widest-line@2.0.1", + "_id": "widest-line@2.0.1", + "_inBundle": false, + "_integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "_location": "/widest-line", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "widest-line@2.0.1", + "name": "widest-line", + "escapedName": "widest-line", + "rawSpec": "2.0.1", + "saveSpec": null, + "fetchSpec": "2.0.1" + }, + "_requiredBy": [ + "/boxen" + ], + "_resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "_spec": "2.0.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/widest-line/issues" + }, + "dependencies": { + "string-width": "^2.1.1" + }, + "description": "Get the visual width of the widest line in a string - the number of columns required to display it", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/widest-line#readme", + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "license": "MIT", + "name": "widest-line", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/widest-line.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.1" +} diff --git a/node_modules/widest-line/readme.md b/node_modules/widest-line/readme.md new file mode 100644 index 0000000..20e02d5 --- /dev/null +++ b/node_modules/widest-line/readme.md @@ -0,0 +1,34 @@ +# widest-line [![Build Status](https://travis-ci.org/sindresorhus/widest-line.svg?branch=master)](https://travis-ci.org/sindresorhus/widest-line) + +> Get the visual width of the widest line in a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to know the maximum width a string will take up in the terminal. + + +## Install + +``` +$ npm install widest-line +``` + + +## Usage + +```js +const widestLine = require('widest-line'); + +widestLine('古\n\u001B[1m@\u001B[22m'); +//=> 2 +``` + + +## Related + +- [string-width](https://github.com/sindresorhus/string-width) - Get the visual width of a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/wrappy/LICENSE b/node_modules/wrappy/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/wrappy/README.md b/node_modules/wrappy/README.md new file mode 100644 index 0000000..98eab25 --- /dev/null +++ b/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/node_modules/wrappy/package.json b/node_modules/wrappy/package.json new file mode 100644 index 0000000..e46a202 --- /dev/null +++ b/node_modules/wrappy/package.json @@ -0,0 +1,62 @@ +{ + "_args": [ + [ + "wrappy@1.0.2", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "wrappy@1.0.2", + "_id": "wrappy@1.0.2", + "_inBundle": false, + "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "_location": "/wrappy", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "wrappy@1.0.2", + "name": "wrappy", + "escapedName": "wrappy", + "rawSpec": "1.0.2", + "saveSpec": null, + "fetchSpec": "1.0.2" + }, + "_requiredBy": [ + "/inflight", + "/once" + ], + "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "_spec": "1.0.2", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "dependencies": {}, + "description": "Callback wrapping utility", + "devDependencies": { + "tap": "^2.3.1" + }, + "directories": { + "test": "test" + }, + "files": [ + "wrappy.js" + ], + "homepage": "https://github.com/npm/wrappy", + "license": "ISC", + "main": "wrappy.js", + "name": "wrappy", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/wrappy.git" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "version": "1.0.2" +} diff --git a/node_modules/wrappy/wrappy.js b/node_modules/wrappy/wrappy.js new file mode 100644 index 0000000..bb7e7d6 --- /dev/null +++ b/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/node_modules/write-file-atomic/CHANGELOG.md b/node_modules/write-file-atomic/CHANGELOG.md new file mode 100644 index 0000000..920ae2c --- /dev/null +++ b/node_modules/write-file-atomic/CHANGELOG.md @@ -0,0 +1,25 @@ +# 2.4.3 + +* Ignore errors raised by `fs.closeSync` when cleaning up after a write + error. + +# 2.4.2 + +* A pair of patches to fix some fd leaks. We would leak fds with sync use + when errors occured and with async use any time fsync was not in use. (#34) + +# 2.4.1 + +* Fix a bug where `signal-exit` instances would be leaked. This was fixed when addressing #35. + +# 2.4.0 + +## Features + +* Allow chown and mode options to be set to false to disable the defaulting behavior. (#20) +* Support passing encoding strings in options slot for compat with Node.js API. (#31) +* Add support for running inside of worker threads (#37) + +## Fixes + +* Remove unneeded call when returning success (#36) diff --git a/node_modules/write-file-atomic/LICENSE b/node_modules/write-file-atomic/LICENSE new file mode 100644 index 0000000..95e65a7 --- /dev/null +++ b/node_modules/write-file-atomic/LICENSE @@ -0,0 +1,6 @@ +Copyright (c) 2015, Rebecca Turner + +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/write-file-atomic/README.md b/node_modules/write-file-atomic/README.md new file mode 100644 index 0000000..ca28e99 --- /dev/null +++ b/node_modules/write-file-atomic/README.md @@ -0,0 +1,56 @@ +write-file-atomic +----------------- + +This is an extension for node's `fs.writeFile` that makes its operation +atomic and allows you set ownership (uid/gid of the file). + +### var writeFileAtomic = require('write-file-atomic')
        writeFileAtomic(filename, data, [options], callback) + +* filename **String** +* data **String** | **Buffer** +* options **Object** | **String** + * chown **Object** default, uid & gid of existing file, if any + * uid **Number** + * gid **Number** + * encoding **String** | **Null** default = 'utf8' + * fsync **Boolean** default = true + * mode **Number** default, from existing file, if any + * Promise **Object** default = native Promise object +* callback **Function** + +Atomically and asynchronously writes data to a file, replacing the file if it already +exists. data can be a string or a buffer. + +The file is initially named `filename + "." + murmurhex(__filename, process.pid, ++invocations)`. +Note that `require('worker_threads').threadId` is used in addition to `process.pid` if running inside of a worker thread. +If writeFile completes successfully then, if passed the **chown** option it will change +the ownership of the file. Finally it renames the file back to the filename you specified. If +it encounters errors at any of these steps it will attempt to unlink the temporary file and then +pass the error back to the caller. +If multiple writes are concurrently issued to the same file, the write operations are put into a queue and serialized in the order they were called, using Promises. Native promises are used by default, but you can inject your own promise-like object with the **Promise** option. Writes to different files are still executed in parallel. + +If provided, the **chown** option requires both **uid** and **gid** properties or else +you'll get an error. If **chown** is not specified it will default to using +the owner of the previous file. To prevent chown from being ran you can +also pass `false`, in which case the file will be created with the current user's credentials. + +If **mode** is not specified, it will default to using the permissions from +an existing file, if any. Expicitly setting this to `false` remove this default, resulting +in a file created with the system default permissions. + +If options is a String, it's assumed to be the **encoding** option. The **encoding** option is ignored if **data** is a buffer. It defaults to 'utf8'. + +If the **fsync** option is **false**, writeFile will skip the final fsync call. + +Example: + +```javascript +writeFileAtomic('message.txt', 'Hello Node', {chown:{uid:100,gid:50}}, function (err) { + if (err) throw err; + console.log('It\'s saved!'); +}); +``` + +### var writeFileAtomicSync = require('write-file-atomic').sync
        writeFileAtomicSync(filename, data, [options]) + +The synchronous version of **writeFileAtomic**. diff --git a/node_modules/write-file-atomic/index.js b/node_modules/write-file-atomic/index.js new file mode 100644 index 0000000..64ae987 --- /dev/null +++ b/node_modules/write-file-atomic/index.js @@ -0,0 +1,238 @@ +'use strict' +module.exports = writeFile +module.exports.sync = writeFileSync +module.exports._getTmpname = getTmpname // for testing +module.exports._cleanupOnExit = cleanupOnExit + +var fs = require('graceful-fs') +var MurmurHash3 = require('imurmurhash') +var onExit = require('signal-exit') +var path = require('path') +var activeFiles = {} + +// if we run inside of a worker_thread, `process.pid` is not unique +/* istanbul ignore next */ +var threadId = (function getId () { + try { + var workerThreads = require('worker_threads') + + /// if we are in main thread, this is set to `0` + return workerThreads.threadId + } catch (e) { + // worker_threads are not available, fallback to 0 + return 0 + } +})() + +var invocations = 0 +function getTmpname (filename) { + return filename + '.' + + MurmurHash3(__filename) + .hash(String(process.pid)) + .hash(String(threadId)) + .hash(String(++invocations)) + .result() +} + +function cleanupOnExit (tmpfile) { + return function () { + try { + fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) + } catch (_) {} + } +} + +function writeFile (filename, data, options, callback) { + if (options) { + if (options instanceof Function) { + callback = options + options = {} + } else if (typeof options === 'string') { + options = { encoding: options } + } + } else { + options = {} + } + + var Promise = options.Promise || global.Promise + var truename + var fd + var tmpfile + /* istanbul ignore next -- The closure only gets called when onExit triggers */ + var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) + var absoluteName = path.resolve(filename) + + new Promise(function serializeSameFile (resolve) { + // make a queue if it doesn't already exist + if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] + + activeFiles[absoluteName].push(resolve) // add this job to the queue + if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one + }).then(function getRealPath () { + return new Promise(function (resolve) { + fs.realpath(filename, function (_, realname) { + truename = realname || filename + tmpfile = getTmpname(truename) + resolve() + }) + }) + }).then(function stat () { + return new Promise(function stat (resolve) { + if (options.mode && options.chown) resolve() + else { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + fs.stat(truename, function (err, stats) { + if (err || !stats) resolve() + else { + options = Object.assign({}, options) + + if (options.mode == null) { + options.mode = stats.mode + } + if (options.chown == null && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + resolve() + } + }) + } + }) + }).then(function thenWriteFile () { + return new Promise(function (resolve, reject) { + fs.open(tmpfile, 'w', options.mode, function (err, _fd) { + fd = _fd + if (err) reject(err) + else resolve() + }) + }) + }).then(function write () { + return new Promise(function (resolve, reject) { + if (Buffer.isBuffer(data)) { + fs.write(fd, data, 0, data.length, 0, function (err) { + if (err) reject(err) + else resolve() + }) + } else if (data != null) { + fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { + if (err) reject(err) + else resolve() + }) + } else resolve() + }) + }).then(function syncAndClose () { + return new Promise(function (resolve, reject) { + if (options.fsync !== false) { + fs.fsync(fd, function (err) { + if (err) fs.close(fd, () => reject(err)) + else fs.close(fd, resolve) + }) + } else { + fs.close(fd, resolve) + } + }) + }).then(function chown () { + fd = null + if (options.chown) { + return new Promise(function (resolve, reject) { + fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function chmod () { + if (options.mode) { + return new Promise(function (resolve, reject) { + fs.chmod(tmpfile, options.mode, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function rename () { + return new Promise(function (resolve, reject) { + fs.rename(tmpfile, truename, function (err) { + if (err) reject(err) + else resolve() + }) + }) + }).then(function success () { + removeOnExitHandler() + callback() + }, function fail (err) { + return new Promise(resolve => { + return fd ? fs.close(fd, resolve) : resolve() + }).then(() => { + removeOnExitHandler() + fs.unlink(tmpfile, function () { + callback(err) + }) + }) + }).then(function checkQueue () { + activeFiles[absoluteName].shift() // remove the element added by serializeSameFile + if (activeFiles[absoluteName].length > 0) { + activeFiles[absoluteName][0]() // start next job if one is pending + } else delete activeFiles[absoluteName] + }) +} + +function writeFileSync (filename, data, options) { + if (typeof options === 'string') options = { encoding: options } + else if (!options) options = {} + try { + filename = fs.realpathSync(filename) + } catch (ex) { + // it's ok, it'll happen on a not yet existing file + } + var tmpfile = getTmpname(filename) + + if (!options.mode || !options.chown) { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + try { + var stats = fs.statSync(filename) + options = Object.assign({}, options) + if (!options.mode) { + options.mode = stats.mode + } + if (!options.chown && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + } catch (ex) { + // ignore stat errors + } + } + + var fd + var cleanup = cleanupOnExit(tmpfile) + var removeOnExitHandler = onExit(cleanup) + + try { + fd = fs.openSync(tmpfile, 'w', options.mode) + if (Buffer.isBuffer(data)) { + fs.writeSync(fd, data, 0, data.length, 0) + } else if (data != null) { + fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) + } + if (options.fsync !== false) { + fs.fsyncSync(fd) + } + fs.closeSync(fd) + if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) + if (options.mode) fs.chmodSync(tmpfile, options.mode) + fs.renameSync(tmpfile, filename) + removeOnExitHandler() + } catch (err) { + if (fd) { + try { + fs.closeSync(fd) + } catch (ex) { + // ignore close errors at this stage, error may have closed fd already. + } + } + removeOnExitHandler() + cleanup() + throw err + } +} diff --git a/node_modules/write-file-atomic/package.json b/node_modules/write-file-atomic/package.json new file mode 100644 index 0000000..4cdd7d1 --- /dev/null +++ b/node_modules/write-file-atomic/package.json @@ -0,0 +1,74 @@ +{ + "_args": [ + [ + "write-file-atomic@2.4.3", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "write-file-atomic@2.4.3", + "_id": "write-file-atomic@2.4.3", + "_inBundle": false, + "_integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "_location": "/write-file-atomic", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "write-file-atomic@2.4.3", + "name": "write-file-atomic", + "escapedName": "write-file-atomic", + "rawSpec": "2.4.3", + "saveSpec": null, + "fetchSpec": "2.4.3" + }, + "_requiredBy": [ + "/configstore" + ], + "_resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "_spec": "2.4.3", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org" + }, + "bugs": { + "url": "https://github.com/iarna/write-file-atomic/issues" + }, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + }, + "description": "Write files in an atomic fashion w/configurable ownership", + "devDependencies": { + "mkdirp": "^0.5.1", + "require-inject": "^1.4.0", + "rimraf": "^2.5.4", + "standard": "^12.0.1", + "tap": "^12.1.3" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/iarna/write-file-atomic", + "keywords": [ + "writeFile", + "atomic" + ], + "license": "ISC", + "main": "index.js", + "name": "write-file-atomic", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/iarna/write-file-atomic.git" + }, + "scripts": { + "postpublish": "git push origin --follow-tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "standard && tap --100 test/*.js" + }, + "version": "2.4.3" +} diff --git a/node_modules/x-xss-protection/CHANGELOG.md b/node_modules/x-xss-protection/CHANGELOG.md new file mode 100644 index 0000000..897affb --- /dev/null +++ b/node_modules/x-xss-protection/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog + +## 1.3.0 - 2019-09-01 +### Added +- Added `mode: null` to disable `mode=block` + +### Changed +- Minor performance improvements with Internet Explorer <9 detection + +## 1.2.0 - 2019-06-15 +### Added +- Added TypeScript type definitions. See [#8](https://github.com/helmetjs/x-xss-protection/pull/8) +- Created a changelog +- Added some additional package metadata + +### Changed +- Updated documentation +- Excluded some files from npm package + +Changes in versions 1.1.0 and below can be found in [Helmet's changelog](https://github.com/helmetjs/helmet/blob/master/CHANGELOG.md). diff --git a/node_modules/x-xss-protection/LICENSE b/node_modules/x-xss-protection/LICENSE new file mode 100644 index 0000000..9d7639c --- /dev/null +++ b/node_modules/x-xss-protection/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2019 Evan Hahn, Adam Baldwin + +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/x-xss-protection/README.md b/node_modules/x-xss-protection/README.md new file mode 100644 index 0000000..7fd2e77 --- /dev/null +++ b/node_modules/x-xss-protection/README.md @@ -0,0 +1,33 @@ +X-XSS-Protection middleware +=========================== +[![Build Status](https://travis-ci.org/helmetjs/x-xss-protection.svg?branch=master)](https://travis-ci.org/helmetjs/x-xss-protection) + +The `X-XSS-Protection` HTTP header is a basic protection against XSS. It was originally [by Microsoft](http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx) but Chrome has since adopted it as well. + +This middleware sets the `X-XSS-Protection` header. On modern browsers, it will set the value to `1; mode=block`. On old versions of Internet Explorer, this creates a vulnerability (see [here](http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities/) and [here](http://technet.microsoft.com/en-us/security/bulletin/MS10-002)), and so the header is set to `0` to disable it. + +To use this middleware: + +```javascript +const xssFilter = require('x-xss-protection') +app.use(xssFilter()) +``` + +To force the header to be set to `1; mode=block` on all versions of IE, add the option: + +```javascript +app.use(xssFilter({ setOnOldIE: true })) +// This has some security problems for old IE! +``` + +You can also optionally configure a report URI, though the flag is [specific to Chrome-based browsers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection). This option will report the violation to the specified URI: + +```javascript +app.use(xssFilter({ reportUri: '/report-xss-violation' })) +``` + +To remove `mode=block` from the header, which isn't recommended, set the `mode` option to `null`: + +```javascript +app.use(xssFilter({ mode: null })) +``` diff --git a/node_modules/x-xss-protection/dist/index.d.ts b/node_modules/x-xss-protection/dist/index.d.ts new file mode 100644 index 0000000..c3d29c4 --- /dev/null +++ b/node_modules/x-xss-protection/dist/index.d.ts @@ -0,0 +1,9 @@ +/// +import { IncomingMessage, ServerResponse } from 'http'; +interface XXssProtectionOptions { + mode?: 'block' | null; + reportUri?: string; + setOnOldIE?: boolean; +} +declare const _default: (options?: XXssProtectionOptions) => (_req: IncomingMessage, res: ServerResponse, next: () => void) => void; +export = _default; diff --git a/node_modules/x-xss-protection/dist/index.js b/node_modules/x-xss-protection/dist/index.js new file mode 100644 index 0000000..ce277b9 --- /dev/null +++ b/node_modules/x-xss-protection/dist/index.js @@ -0,0 +1,50 @@ +"use strict"; +function doesUserAgentMatchOldInternetExplorer(userAgent) { + if (!userAgent) { + return false; + } + var matches = /msie\s*(\d{1,2})/i.exec(userAgent); + return matches ? parseFloat(matches[1]) < 9 : false; +} +function getHeaderValueFromOptions(options) { + var directives = ['1']; + var isBlockMode; + if ('mode' in options) { + if (options.mode === 'block') { + isBlockMode = true; + } + else if (options.mode === null) { + isBlockMode = false; + } + else { + throw new Error('The `mode` option must be set to "block" or null.'); + } + } + else { + isBlockMode = true; + } + if (isBlockMode) { + directives.push('mode=block'); + } + if (options.reportUri) { + directives.push("report=" + options.reportUri); + } + return directives.join('; '); +} +module.exports = function xXssProtection(options) { + if (options === void 0) { options = {}; } + var headerValue = getHeaderValueFromOptions(options); + if (options.setOnOldIE) { + return function xXssProtection(_req, res, next) { + res.setHeader('X-XSS-Protection', headerValue); + next(); + }; + } + else { + return function xXssProtection(req, res, next) { + var value = doesUserAgentMatchOldInternetExplorer(req.headers['user-agent']) ? '0' : headerValue; + res.setHeader('X-XSS-Protection', value); + next(); + }; + } +}; diff --git a/node_modules/x-xss-protection/package.json b/node_modules/x-xss-protection/package.json new file mode 100644 index 0000000..15c635e --- /dev/null +++ b/node_modules/x-xss-protection/package.json @@ -0,0 +1,97 @@ +{ + "_args": [ + [ + "x-xss-protection@1.3.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "x-xss-protection@1.3.0", + "_id": "x-xss-protection@1.3.0", + "_inBundle": false, + "_integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "_location": "/x-xss-protection", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "x-xss-protection@1.3.0", + "name": "x-xss-protection", + "escapedName": "x-xss-protection", + "rawSpec": "1.3.0", + "saveSpec": null, + "fetchSpec": "1.3.0" + }, + "_requiredBy": [ + "/helmet" + ], + "_resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "_spec": "1.3.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Adam Baldwin", + "email": "adam@npmjs.com", + "url": "https://evilpacket.net" + }, + "bugs": { + "url": "https://github.com/helmetjs/x-xss-protection/issues", + "email": "me@evanhahn.com" + }, + "contributors": [ + { + "name": "Evan Hahn", + "email": "me@evanhahn.com", + "url": "https://evanhahn.com" + } + ], + "description": "Middleware to set the X-XSS-Protection header", + "devDependencies": { + "@types/connect": "^3.4.32", + "@types/jest": "^24.0.18", + "@types/supertest": "^2.0.8", + "@typescript-eslint/eslint-plugin": "^2.0.0", + "@typescript-eslint/parser": "^2.0.0", + "connect": "^3.7.0", + "eslint": "^5.16.0", + "eslint-config-helmet": "^0.2.0", + "jest": "^24.9.0", + "supertest": "^4.0.2", + "ts-jest": "^24.0.2", + "typescript": "^3.6.2" + }, + "engines": { + "node": ">=4.0.0" + }, + "files": [ + "LICENSE", + "README.md", + "CHANGELOG.md", + "dist/index.js", + "dist/index.d.ts" + ], + "homepage": "https://helmetjs.github.io/docs/xss-filter/", + "keywords": [ + "helmet", + "security", + "express", + "connect", + "xss", + "x-xss-protection" + ], + "license": "MIT", + "main": "./dist/index.js", + "name": "x-xss-protection", + "repository": { + "type": "git", + "url": "git://github.com/helmetjs/x-xss-protection.git" + }, + "scripts": { + "build": "npm run clean && tsc", + "clean": "rm -rf dist", + "lint": "eslint --fix '**/*.ts'", + "prepublishOnly": "npm run build", + "pretest": "npm run lint", + "test": "jest --config test/jest-config.json" + }, + "typings": "./dist/index.d.ts", + "version": "1.3.0" +} diff --git a/node_modules/xdg-basedir/index.js b/node_modules/xdg-basedir/index.js new file mode 100644 index 0000000..f5aa176 --- /dev/null +++ b/node_modules/xdg-basedir/index.js @@ -0,0 +1,28 @@ +'use strict'; +const os = require('os'); +const path = require('path'); + +const home = os.homedir(); +const env = process.env; + +exports.data = env.XDG_DATA_HOME || + (home ? path.join(home, '.local', 'share') : null); + +exports.config = env.XDG_CONFIG_HOME || + (home ? path.join(home, '.config') : null); + +exports.cache = env.XDG_CACHE_HOME || (home ? path.join(home, '.cache') : null); + +exports.runtime = env.XDG_RUNTIME_DIR || null; + +exports.dataDirs = (env.XDG_DATA_DIRS || '/usr/local/share/:/usr/share/').split(':'); + +if (exports.data) { + exports.dataDirs.unshift(exports.data); +} + +exports.configDirs = (env.XDG_CONFIG_DIRS || '/etc/xdg').split(':'); + +if (exports.config) { + exports.configDirs.unshift(exports.config); +} diff --git a/node_modules/xdg-basedir/license b/node_modules/xdg-basedir/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/xdg-basedir/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.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/xdg-basedir/package.json b/node_modules/xdg-basedir/package.json new file mode 100644 index 0000000..79a578e --- /dev/null +++ b/node_modules/xdg-basedir/package.json @@ -0,0 +1,77 @@ +{ + "_args": [ + [ + "xdg-basedir@3.0.0", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_development": true, + "_from": "xdg-basedir@3.0.0", + "_id": "xdg-basedir@3.0.0", + "_inBundle": false, + "_integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "_location": "/xdg-basedir", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "xdg-basedir@3.0.0", + "name": "xdg-basedir", + "escapedName": "xdg-basedir", + "rawSpec": "3.0.0", + "saveSpec": null, + "fetchSpec": "3.0.0" + }, + "_requiredBy": [ + "/configstore", + "/update-notifier" + ], + "_resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "_spec": "3.0.0", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/xdg-basedir/issues" + }, + "description": "Get XDG Base Directory paths", + "devDependencies": { + "ava": "*", + "require-uncached": "^1.0.2", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/xdg-basedir#readme", + "keywords": [ + "xdg", + "base", + "directory", + "dir", + "basedir", + "path", + "data", + "config", + "cache", + "linux", + "unix", + "spec" + ], + "license": "MIT", + "name": "xdg-basedir", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/xdg-basedir.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "3.0.0" +} diff --git a/node_modules/xdg-basedir/readme.md b/node_modules/xdg-basedir/readme.md new file mode 100644 index 0000000..61f8c16 --- /dev/null +++ b/node_modules/xdg-basedir/readme.md @@ -0,0 +1,60 @@ +# xdg-basedir [![Build Status](https://travis-ci.org/sindresorhus/xdg-basedir.svg?branch=master)](https://travis-ci.org/sindresorhus/xdg-basedir) + +> Get [XDG Base Directory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) paths + + +## Install + +``` +$ npm install --save xdg-basedir +``` + + +## Usage + +```js +const xdgBasedir = require('xdg-basedir'); + +xdgBasedir.data; +//=> '/home/sindresorhus/.local/share' + +xdgBasedir.config; +//=> '/home/sindresorhus/.config' + +xdgBasedir.dataDirs +//=> ['/home/sindresorhus/.local/share', '/usr/local/share/', '/usr/share/'] +``` + + +## API + +The properties `.data`, `.config`, `.cache`, `.runtime` will return `null` in the uncommon case that both the XDG environment variable is not set and the users home directory can't be found. You need to handle this case. A common solution is to [fall back to a temp directory](https://github.com/yeoman/configstore/blob/b82690fc401318ad18dcd7d151a0003a4898a314/index.js#L15). + +### .data + +Directory for user specific data files. + +### .config + +Directory for user specific configuration files. + +### .cache + +Directory for user specific non-essential data files. + +### .runtime + +Directory for user-specific non-essential runtime files and other file objects (such as sockets, named pipes, etc). + +### .dataDirs + +Preference-ordered array of base directories to search for data files in addition to `.data`. + +### .configDirs + +Preference-ordered array of base directories to search for configuration files in addition to `.config`. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/yallist/LICENSE b/node_modules/yallist/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/yallist/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/yallist/README.md b/node_modules/yallist/README.md new file mode 100644 index 0000000..f586101 --- /dev/null +++ b/node_modules/yallist/README.md @@ -0,0 +1,204 @@ +# yallist + +Yet Another Linked List + +There are many doubly-linked list implementations like it, but this +one is mine. + +For when an array would be too big, and a Map can't be iterated in +reverse order. + + +[![Build Status](https://travis-ci.org/isaacs/yallist.svg?branch=master)](https://travis-ci.org/isaacs/yallist) [![Coverage Status](https://coveralls.io/repos/isaacs/yallist/badge.svg?service=github)](https://coveralls.io/github/isaacs/yallist) + +## basic usage + +```javascript +var yallist = require('yallist') +var myList = yallist.create([1, 2, 3]) +myList.push('foo') +myList.unshift('bar') +// of course pop() and shift() are there, too +console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo'] +myList.forEach(function (k) { + // walk the list head to tail +}) +myList.forEachReverse(function (k, index, list) { + // walk the list tail to head +}) +var myDoubledList = myList.map(function (k) { + return k + k +}) +// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo'] +// mapReverse is also a thing +var myDoubledListReverse = myList.mapReverse(function (k) { + return k + k +}) // ['foofoo', 6, 4, 2, 'barbar'] + +var reduced = myList.reduce(function (set, entry) { + set += entry + return set +}, 'start') +console.log(reduced) // 'startfoo123bar' +``` + +## api + +The whole API is considered "public". + +Functions with the same name as an Array method work more or less the +same way. + +There's reverse versions of most things because that's the point. + +### Yallist + +Default export, the class that holds and manages a list. + +Call it with either a forEach-able (like an array) or a set of +arguments, to initialize the list. + +The Array-ish methods all act like you'd expect. No magic length, +though, so if you change that it won't automatically prune or add +empty spots. + +### Yallist.create(..) + +Alias for Yallist function. Some people like factories. + +#### yallist.head + +The first node in the list + +#### yallist.tail + +The last node in the list + +#### yallist.length + +The number of nodes in the list. (Change this at your peril. It is +not magic like Array length.) + +#### yallist.toArray() + +Convert the list to an array. + +#### yallist.forEach(fn, [thisp]) + +Call a function on each item in the list. + +#### yallist.forEachReverse(fn, [thisp]) + +Call a function on each item in the list, in reverse order. + +#### yallist.get(n) + +Get the data at position `n` in the list. If you use this a lot, +probably better off just using an Array. + +#### yallist.getReverse(n) + +Get the data at position `n`, counting from the tail. + +#### yallist.map(fn, thisp) + +Create a new Yallist with the result of calling the function on each +item. + +#### yallist.mapReverse(fn, thisp) + +Same as `map`, but in reverse. + +#### yallist.pop() + +Get the data from the list tail, and remove the tail from the list. + +#### yallist.push(item, ...) + +Insert one or more items to the tail of the list. + +#### yallist.reduce(fn, initialValue) + +Like Array.reduce. + +#### yallist.reduceReverse + +Like Array.reduce, but in reverse. + +#### yallist.reverse + +Reverse the list in place. + +#### yallist.shift() + +Get the data from the list head, and remove the head from the list. + +#### yallist.slice([from], [to]) + +Just like Array.slice, but returns a new Yallist. + +#### yallist.sliceReverse([from], [to]) + +Just like yallist.slice, but the result is returned in reverse. + +#### yallist.toArray() + +Create an array representation of the list. + +#### yallist.toArrayReverse() + +Create a reversed array representation of the list. + +#### yallist.unshift(item, ...) + +Insert one or more items to the head of the list. + +#### yallist.unshiftNode(node) + +Move a Node object to the front of the list. (That is, pull it out of +wherever it lives, and make it the new head.) + +If the node belongs to a different list, then that list will remove it +first. + +#### yallist.pushNode(node) + +Move a Node object to the end of the list. (That is, pull it out of +wherever it lives, and make it the new tail.) + +If the node belongs to a list already, then that list will remove it +first. + +#### yallist.removeNode(node) + +Remove a node from the list, preserving referential integrity of head +and tail and other nodes. + +Will throw an error if you try to have a list remove a node that +doesn't belong to it. + +### Yallist.Node + +The class that holds the data and is actually the list. + +Call with `var n = new Node(value, previousNode, nextNode)` + +Note that if you do direct operations on Nodes themselves, it's very +easy to get into weird states where the list is broken. Be careful :) + +#### node.next + +The next node in the list. + +#### node.prev + +The previous node in the list. + +#### node.value + +The data the node contains. + +#### node.list + +The list to which this node belongs. (Null if it does not belong to +any list.) diff --git a/node_modules/yallist/iterator.js b/node_modules/yallist/iterator.js new file mode 100644 index 0000000..d41c97a --- /dev/null +++ b/node_modules/yallist/iterator.js @@ -0,0 +1,8 @@ +'use strict' +module.exports = function (Yallist) { + Yallist.prototype[Symbol.iterator] = function* () { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value + } + } +} diff --git a/node_modules/yallist/package.json b/node_modules/yallist/package.json new file mode 100644 index 0000000..44b836b --- /dev/null +++ b/node_modules/yallist/package.json @@ -0,0 +1,66 @@ +{ + "_args": [ + [ + "yallist@3.1.1", + "/home/rui/code/personal/dijkstra-app/backend-dijkstra" + ] + ], + "_from": "yallist@3.1.1", + "_id": "yallist@3.1.1", + "_inBundle": false, + "_integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "_location": "/yallist", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "yallist@3.1.1", + "name": "yallist", + "escapedName": "yallist", + "rawSpec": "3.1.1", + "saveSpec": null, + "fetchSpec": "3.1.1" + }, + "_requiredBy": [ + "/minipass", + "/tar" + ], + "_resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "_spec": "3.1.1", + "_where": "/home/rui/code/personal/dijkstra-app/backend-dijkstra", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/yallist/issues" + }, + "dependencies": {}, + "description": "Yet Another Linked List", + "devDependencies": { + "tap": "^12.1.0" + }, + "directories": { + "test": "test" + }, + "files": [ + "yallist.js", + "iterator.js" + ], + "homepage": "https://github.com/isaacs/yallist#readme", + "license": "ISC", + "main": "yallist.js", + "name": "yallist", + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/yallist.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js --100" + }, + "version": "3.1.1" +} diff --git a/node_modules/yallist/yallist.js b/node_modules/yallist/yallist.js new file mode 100644 index 0000000..ed4e730 --- /dev/null +++ b/node_modules/yallist/yallist.js @@ -0,0 +1,426 @@ +'use strict' +module.exports = Yallist + +Yallist.Node = Node +Yallist.create = Yallist + +function Yallist (list) { + var self = this + if (!(self instanceof Yallist)) { + self = new Yallist() + } + + self.tail = null + self.head = null + self.length = 0 + + if (list && typeof list.forEach === 'function') { + list.forEach(function (item) { + self.push(item) + }) + } else if (arguments.length > 0) { + for (var i = 0, l = arguments.length; i < l; i++) { + self.push(arguments[i]) + } + } + + return self +} + +Yallist.prototype.removeNode = function (node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list') + } + + var next = node.next + var prev = node.prev + + if (next) { + next.prev = prev + } + + if (prev) { + prev.next = next + } + + if (node === this.head) { + this.head = next + } + if (node === this.tail) { + this.tail = prev + } + + node.list.length-- + node.next = null + node.prev = null + node.list = null + + return next +} + +Yallist.prototype.unshiftNode = function (node) { + if (node === this.head) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var head = this.head + node.list = this + node.next = head + if (head) { + head.prev = node + } + + this.head = node + if (!this.tail) { + this.tail = node + } + this.length++ +} + +Yallist.prototype.pushNode = function (node) { + if (node === this.tail) { + return + } + + if (node.list) { + node.list.removeNode(node) + } + + var tail = this.tail + node.list = this + node.prev = tail + if (tail) { + tail.next = node + } + + this.tail = node + if (!this.head) { + this.head = node + } + this.length++ +} + +Yallist.prototype.push = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + push(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.unshift = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + unshift(this, arguments[i]) + } + return this.length +} + +Yallist.prototype.pop = function () { + if (!this.tail) { + return undefined + } + + var res = this.tail.value + this.tail = this.tail.prev + if (this.tail) { + this.tail.next = null + } else { + this.head = null + } + this.length-- + return res +} + +Yallist.prototype.shift = function () { + if (!this.head) { + return undefined + } + + var res = this.head.value + this.head = this.head.next + if (this.head) { + this.head.prev = null + } else { + this.tail = null + } + this.length-- + return res +} + +Yallist.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.head, i = 0; walker !== null; i++) { + fn.call(thisp, walker.value, i, this) + walker = walker.next + } +} + +Yallist.prototype.forEachReverse = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { + fn.call(thisp, walker.value, i, this) + walker = walker.prev + } +} + +Yallist.prototype.get = function (n) { + for (var i = 0, walker = this.head; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.next + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.getReverse = function (n) { + for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev + } + if (i === n && walker !== null) { + return walker.value + } +} + +Yallist.prototype.map = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.head; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.next + } + return res +} + +Yallist.prototype.mapReverse = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.tail; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.prev + } + return res +} + +Yallist.prototype.reduce = function (fn, initial) { + var acc + var walker = this.head + if (arguments.length > 1) { + acc = initial + } else if (this.head) { + walker = this.head.next + acc = this.head.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = 0; walker !== null; i++) { + acc = fn(acc, walker.value, i) + walker = walker.next + } + + return acc +} + +Yallist.prototype.reduceReverse = function (fn, initial) { + var acc + var walker = this.tail + if (arguments.length > 1) { + acc = initial + } else if (this.tail) { + walker = this.tail.prev + acc = this.tail.value + } else { + throw new TypeError('Reduce of empty list with no initial value') + } + + for (var i = this.length - 1; walker !== null; i--) { + acc = fn(acc, walker.value, i) + walker = walker.prev + } + + return acc +} + +Yallist.prototype.toArray = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.head; walker !== null; i++) { + arr[i] = walker.value + walker = walker.next + } + return arr +} + +Yallist.prototype.toArrayReverse = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.tail; walker !== null; i++) { + arr[i] = walker.value + walker = walker.prev + } + return arr +} + +Yallist.prototype.slice = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = 0, walker = this.head; walker !== null && i < from; i++) { + walker = walker.next + } + for (; walker !== null && i < to; i++, walker = walker.next) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.sliceReverse = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { + walker = walker.prev + } + for (; walker !== null && i > from; i--, walker = walker.prev) { + ret.push(walker.value) + } + return ret +} + +Yallist.prototype.splice = function (start, deleteCount /*, ...nodes */) { + if (start > this.length) { + start = this.length - 1 + } + if (start < 0) { + start = this.length + start; + } + + for (var i = 0, walker = this.head; walker !== null && i < start; i++) { + walker = walker.next + } + + var ret = [] + for (var i = 0; walker && i < deleteCount; i++) { + ret.push(walker.value) + walker = this.removeNode(walker) + } + if (walker === null) { + walker = this.tail + } + + if (walker !== this.head && walker !== this.tail) { + walker = walker.prev + } + + for (var i = 2; i < arguments.length; i++) { + walker = insert(this, walker, arguments[i]) + } + return ret; +} + +Yallist.prototype.reverse = function () { + var head = this.head + var tail = this.tail + for (var walker = head; walker !== null; walker = walker.prev) { + var p = walker.prev + walker.prev = walker.next + walker.next = p + } + this.head = tail + this.tail = head + return this +} + +function insert (self, node, value) { + var inserted = node === self.head ? + new Node(value, null, node, self) : + new Node(value, node, node.next, self) + + if (inserted.next === null) { + self.tail = inserted + } + if (inserted.prev === null) { + self.head = inserted + } + + self.length++ + + return inserted +} + +function push (self, item) { + self.tail = new Node(item, self.tail, null, self) + if (!self.head) { + self.head = self.tail + } + self.length++ +} + +function unshift (self, item) { + self.head = new Node(item, null, self.head, self) + if (!self.tail) { + self.tail = self.head + } + self.length++ +} + +function Node (value, prev, next, list) { + if (!(this instanceof Node)) { + return new Node(value, prev, next, list) + } + + this.list = list + this.value = value + + if (prev) { + prev.next = this + this.prev = prev + } else { + this.prev = null + } + + if (next) { + next.prev = this + this.next = next + } else { + this.next = null + } +} + +try { + // add if support for Symbol.iterator is present + require('./iterator.js')(Yallist) +} catch (er) {} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f6a4c37 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3367 @@ +{ + "name": "dijkstra", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", + "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dns-prefetch-control": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", + "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==" + }, + "dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect-ct": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", + "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "frameguard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", + "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getopts": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", + "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "helmet": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", + "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", + "requires": { + "depd": "2.0.0", + "dns-prefetch-control": "0.2.0", + "dont-sniff-mimetype": "1.1.0", + "expect-ct": "0.2.0", + "feature-policy": "0.3.0", + "frameguard": "3.1.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.9.4", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "ienoopen": "1.1.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + }, + "helmet-csp": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", + "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", + "requires": { + "bowser": "^2.7.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + } + }, + "hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ienoopen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", + "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "interpret": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.0.0.tgz", + "integrity": "sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA==" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "knex": { + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.20.8.tgz", + "integrity": "sha512-fLiSg5PIBisORs0M+UGjg2s1P/E1BrYvb/NkSVk6Y90HJujkqLufSC6ag+hDgXqW73mFAF283M6+q3/NW0TrHw==", + "requires": { + "bluebird": "^3.7.2", + "colorette": "1.1.0", + "commander": "^4.1.0", + "debug": "4.1.1", + "esm": "^3.2.25", + "getopts": "2.2.5", + "inherits": "~2.0.4", + "interpret": "^2.0.0", + "liftoff": "3.1.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "pg-connection-string": "2.1.0", + "tarn": "^2.0.0", + "tildify": "2.0.0", + "uuid": "^3.3.3", + "v8flags": "^3.1.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "needle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.2.tgz", + "integrity": "sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nodejs": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/nodejs/-/nodejs-0.0.0.tgz", + "integrity": "sha1-RyL6LhisTrc6Qq4W0B41hKErdTE=" + }, + "nodemon": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", + "integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pg-connection-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.1.0.tgz", + "integrity": "sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg==" + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sqlite3": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.1.tgz", + "integrity": "sha512-CvT5XY+MWnn0HkbwVKJAyWEMfzpAPwnTiB3TobA5Mri44SrTovmmh499NPQP+gatkeOipqPlBLel7rn4E/PCQg==", + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0", + "request": "^2.87.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "tarn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-2.0.0.tgz", + "integrity": "sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==" + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1c0aae7 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "dijkstra", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.17.1", + "helmet": "^3.21.2", + "knex": "^0.20.8", + "nodejs": "^0.0.0", + "sqlite3": "^4.1.1" + }, + "devDependencies": { + "nodemon": "^2.0.2" + }, + "scripts": { + "watch": "nodemon index.js", + "start": "node index.js", + "loadDB": "knex migrate:latest && knex seed:run" + }, + "author": "Rui Hildt", + "license": "ISC" +} diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..03244a6 --- /dev/null +++ b/start.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -eu + +# ensure that data directory is owned by 'cloudron' user +chown -R cloudron:cloudron /app/data + +echo "-> Create the database" +# Move to the data writable folder +cd /app/data/ +# Create database with empty table +sqlite3 database_file.db3 "CREATE TABLE test (id INTEGER PRIMARY KEY)"; +#Delete the test table +sqlite3 database_file.db3 "DROP TABLE test"; + +echo "-> Importing data to the database" +# move back to code folder +cd /app/code +# Run the migration and seed database +npm run loadDB + +echo "-> Starting Dijkstra Backend" +# run the app as user 'cloudron' +exec /usr/local/bin/gosu cloudron:cloudron node /app/code/index.js +

        2$V54NF(PQy;HXGV0hhZ}$zBH0~ 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