From 23202c929e998ed6705159cc6b4a814577ded46a Mon Sep 17 00:00:00 2001
From: Atharva Mulmuley
Date: Tue, 27 Apr 2021 16:56:18 +0530
Subject: [PATCH] changed action for arc cluster to use az connectedk8s proxy
---
.github/workflows/main.yml | 44 +
README.md | 52 +-
action.yml | 18 +-
lib/PowerShell/Constants.js | 14 +
lib/PowerShell/IAzurePowerShellSession.js | 0
lib/PowerShell/ServicePrincipalLogin.js | 67 +
.../Utilities/PowerShellToolRunner.js | 28 +
lib/PowerShell/Utilities/ScriptBuilder.js | 55 +
lib/PowerShell/Utilities/Utils.js | 70 +
lib/arc-login.js | 87 +-
lib/login.js | 18 +-
lib/main.js | 163 +
node_modules/.bin/escodegen | 15 +
node_modules/.bin/escodegen.cmd | 17 +
node_modules/.bin/escodegen.ps1 | 18 +
node_modules/.bin/esgenerate | 15 +
node_modules/.bin/esgenerate.cmd | 17 +
node_modules/.bin/esgenerate.ps1 | 18 +
node_modules/actions-secret-parser/index.d.ts | 24 +
node_modules/actions-secret-parser/index.js | 91 +
.../actions-secret-parser/package.json | 63 +
node_modules/deep-is/.npmignore | 1 +
node_modules/deep-is/.travis.yml | 6 +
node_modules/deep-is/LICENSE | 22 +
node_modules/deep-is/README.markdown | 70 +
node_modules/deep-is/example/cmp.js | 11 +
node_modules/deep-is/index.js | 102 +
node_modules/deep-is/package.json | 90 +
node_modules/deep-is/test/NaN.js | 16 +
node_modules/deep-is/test/cmp.js | 23 +
node_modules/deep-is/test/neg-vs-pos-0.js | 15 +
node_modules/escodegen/LICENSE.BSD | 21 +
node_modules/escodegen/README.md | 84 +
node_modules/escodegen/escodegen.js | 2626 ++
node_modules/escodegen/package.json | 90 +
node_modules/estraverse/.jshintrc | 16 +
node_modules/estraverse/LICENSE.BSD | 19 +
node_modules/estraverse/README.md | 153 +
node_modules/estraverse/estraverse.js | 782 +
node_modules/estraverse/gulpfile.js | 70 +
node_modules/estraverse/package.json | 68 +
node_modules/esutils/LICENSE.BSD | 19 +
node_modules/esutils/README.md | 174 +
node_modules/esutils/lib/ast.js | 144 +
node_modules/esutils/lib/code.js | 135 +
node_modules/esutils/lib/keyword.js | 165 +
node_modules/esutils/lib/utils.js | 33 +
node_modules/esutils/package.json | 72 +
node_modules/fast-levenshtein/LICENSE.md | 25 +
node_modules/fast-levenshtein/README.md | 104 +
node_modules/fast-levenshtein/levenshtein.js | 136 +
node_modules/fast-levenshtein/package.json | 72 +
node_modules/jsonpath/.jscsrc | 60 +
node_modules/jsonpath/.jshintrc | 9 +
node_modules/jsonpath/.travis.yml | 3 +
node_modules/jsonpath/Dockerfile | 1 +
node_modules/jsonpath/Gruntfile.js | 83 +
node_modules/jsonpath/LICENSE | 7 +
node_modules/jsonpath/README.md | 216 +
node_modules/jsonpath/fig.yml | 5 +
node_modules/jsonpath/generated/parser.js | 721 +
node_modules/jsonpath/include/action.js | 4 +
node_modules/jsonpath/include/module.js | 34 +
node_modules/jsonpath/index.js | 1 +
node_modules/jsonpath/jsonpath.js | 6842 +++++
node_modules/jsonpath/jsonpath.min.js | 4 +
node_modules/jsonpath/lib/aesprim.js | 18 +
node_modules/jsonpath/lib/dict.js | 6 +
node_modules/jsonpath/lib/grammar.js | 106 +
node_modules/jsonpath/lib/handlers.js | 260 +
node_modules/jsonpath/lib/index.js | 249 +
node_modules/jsonpath/lib/parser.js | 21 +
node_modules/jsonpath/lib/slice.js | 41 +
.../jsonpath/node_modules/.bin/esparse | 15 +
.../jsonpath/node_modules/.bin/esparse.cmd | 17 +
.../jsonpath/node_modules/.bin/esparse.ps1 | 18 +
.../jsonpath/node_modules/.bin/esvalidate | 15 +
.../jsonpath/node_modules/.bin/esvalidate.cmd | 17 +
.../jsonpath/node_modules/.bin/esvalidate.ps1 | 18 +
.../jsonpath/node_modules/esprima/README.md | 24 +
.../jsonpath/node_modules/esprima/esprima.js | 3756 +++
.../node_modules/esprima/package.json | 107 +
.../node_modules/esprima/test/compat.js | 241 +
.../node_modules/esprima/test/reflect.js | 422 +
.../jsonpath/node_modules/esprima/test/run.js | 67 +
.../node_modules/esprima/test/runner.js | 495 +
.../node_modules/esprima/test/test.js | 25241 ++++++++++++++++
.../jsonpath/node_modules/underscore/LICENSE | 23 +
.../node_modules/underscore/README.md | 28 +
.../node_modules/underscore/amd/_apply.js | 7 +
.../underscore/amd/_applyProperty.js | 14 +
.../underscore/amd/_arrayAccessors.js | 11 +
.../underscore/amd/_arrayMutators.js | 15 +
.../underscore/amd/_baseCreate.js | 21 +
.../underscore/amd/_baseIteratee.js | 15 +
.../underscore/amd/_binarySearch.js | 17 +
.../node_modules/underscore/amd/_bindCb.js | 14 +
.../node_modules/underscore/amd/_bindCb4.js | 17 +
.../node_modules/underscore/amd/_byValue.js | 11 +
.../node_modules/underscore/amd/_cb.js | 12 +
.../underscore/amd/_chainResult.js | 10 +
.../underscore/amd/_collectNonEnumProps.js | 42 +
.../underscore/amd/_createAssigner.js | 24 +
.../underscore/amd/_createEscaper.js | 21 +
.../underscore/amd/_createIndexFinder.js | 30 +
.../amd/_createPredicateIndexFinder.js | 18 +
.../underscore/amd/_createReduce.js | 30 +
.../amd/_createSizePropertyCheck.js | 13 +
.../node_modules/underscore/amd/_deepGet.js | 15 +
.../node_modules/underscore/amd/_escapeMap.js | 15 +
.../underscore/amd/_executeBound.js | 16 +
.../node_modules/underscore/amd/_extremum.js | 35 +
.../node_modules/underscore/amd/_flatten.js | 32 +
.../underscore/amd/_forceNumericMinMax.js | 16 +
.../underscore/amd/_getByteLength.js | 8 +
.../node_modules/underscore/amd/_getLength.js | 8 +
.../node_modules/underscore/amd/_greater.js | 10 +
.../node_modules/underscore/amd/_group.js | 18 +
.../node_modules/underscore/amd/_has.js | 10 +
.../underscore/amd/_hasObjectTag.js | 7 +
.../underscore/amd/_isArrayLike.js | 11 +
.../underscore/amd/_isBufferLike.js | 9 +
.../node_modules/underscore/amd/_keyInObj.js | 11 +
.../node_modules/underscore/amd/_less.js | 10 +
.../node_modules/underscore/amd/_lessEqual.js | 10 +
.../underscore/amd/_linearSearch.js | 31 +
.../node_modules/underscore/amd/_mapReduce.js | 5 +
.../underscore/amd/_methodFingerprint.js | 44 +
.../underscore/amd/_optimizeCb.js | 27 +
.../node_modules/underscore/amd/_push.js | 7 +
.../node_modules/underscore/amd/_pusher.js | 13 +
.../node_modules/underscore/amd/_sequence.js | 18 +
.../node_modules/underscore/amd/_setup.js | 70 +
.../underscore/amd/_shallowProperty.js | 12 +
.../node_modules/underscore/amd/_slice.js | 7 +
.../underscore/amd/_strictEqual.js | 9 +
.../underscore/amd/_stringTagBug.js | 16 +
.../node_modules/underscore/amd/_tagTester.js | 13 +
.../underscore/amd/_toBufferView.js | 15 +
.../node_modules/underscore/amd/_toPath.js | 11 +
.../underscore/amd/_unescapeMap.js | 8 +
.../underscore/amd/_unmethodize.js | 9 +
.../underscore/amd/_wrapArrayAccessor.js | 15 +
.../underscore/amd/_wrapArrayMutator.js | 28 +
.../node_modules/underscore/amd/after.js | 14 +
.../node_modules/underscore/amd/allKeys.js | 15 +
.../node_modules/underscore/amd/before.js | 18 +
.../node_modules/underscore/amd/bind.js | 15 +
.../node_modules/underscore/amd/bindAll.js | 19 +
.../node_modules/underscore/amd/chain.js | 12 +
.../node_modules/underscore/amd/chunk.js | 17 +
.../node_modules/underscore/amd/clone.js | 11 +
.../node_modules/underscore/amd/compact.js | 10 +
.../node_modules/underscore/amd/compose.js | 18 +
.../node_modules/underscore/amd/concat.js | 7 +
.../node_modules/underscore/amd/constant.js | 12 +
.../node_modules/underscore/amd/contains.js | 12 +
.../node_modules/underscore/amd/countBy.js | 12 +
.../node_modules/underscore/amd/create.js | 14 +
.../node_modules/underscore/amd/debounce.js | 43 +
.../node_modules/underscore/amd/defaults.js | 8 +
.../node_modules/underscore/amd/defer.js | 9 +
.../node_modules/underscore/amd/delay.js | 13 +
.../node_modules/underscore/amd/difference.js | 14 +
.../node_modules/underscore/amd/each.js | 25 +
.../node_modules/underscore/amd/escape.js | 8 +
.../node_modules/underscore/amd/every.js | 17 +
.../node_modules/underscore/amd/extend.js | 8 +
.../node_modules/underscore/amd/extendOwn.js | 10 +
.../node_modules/underscore/amd/filter.js | 15 +
.../node_modules/underscore/amd/find.js | 12 +
.../node_modules/underscore/amd/findIndex.js | 8 +
.../node_modules/underscore/amd/findKey.js | 15 +
.../underscore/amd/findLastIndex.js | 8 +
.../node_modules/underscore/amd/findWhere.js | 11 +
.../node_modules/underscore/amd/first.js | 13 +
.../node_modules/underscore/amd/flatten.js | 11 +
.../node_modules/underscore/amd/functions.js | 14 +
.../node_modules/underscore/amd/get.js | 14 +
.../node_modules/underscore/amd/groupBy.js | 11 +
.../node_modules/underscore/amd/has.js | 19 +
.../node_modules/underscore/amd/identity.js | 10 +
.../underscore/amd/index-default.js | 12 +
.../node_modules/underscore/amd/index.js | 154 +
.../node_modules/underscore/amd/indexBy.js | 11 +
.../node_modules/underscore/amd/indexOf.js | 11 +
.../node_modules/underscore/amd/initial.js | 12 +
.../underscore/amd/intersection.js | 22 +
.../node_modules/underscore/amd/invert.js | 15 +
.../node_modules/underscore/amd/invoke.js | 28 +
.../underscore/amd/isArguments.js | 19 +
.../node_modules/underscore/amd/isArray.js | 9 +
.../underscore/amd/isArrayBuffer.js | 7 +
.../node_modules/underscore/amd/isBoolean.js | 10 +
.../node_modules/underscore/amd/isDataView.js | 15 +
.../node_modules/underscore/amd/isDate.js | 7 +
.../node_modules/underscore/amd/isElement.js | 10 +
.../node_modules/underscore/amd/isEmpty.js | 18 +
.../node_modules/underscore/amd/isEqual.js | 133 +
.../node_modules/underscore/amd/isError.js | 7 +
.../node_modules/underscore/amd/isFinite.js | 10 +
.../node_modules/underscore/amd/isFunction.js | 18 +
.../node_modules/underscore/amd/isMap.js | 7 +
.../node_modules/underscore/amd/isMatch.js | 17 +
.../node_modules/underscore/amd/isNaN.js | 10 +
.../node_modules/underscore/amd/isNull.js | 10 +
.../node_modules/underscore/amd/isNumber.js | 7 +
.../node_modules/underscore/amd/isObject.js | 11 +
.../node_modules/underscore/amd/isRegExp.js | 7 +
.../node_modules/underscore/amd/isSet.js | 7 +
.../node_modules/underscore/amd/isString.js | 7 +
.../node_modules/underscore/amd/isSymbol.js | 7 +
.../underscore/amd/isTypedArray.js | 16 +
.../underscore/amd/isUndefined.js | 10 +
.../node_modules/underscore/amd/isWeakMap.js | 7 +
.../node_modules/underscore/amd/isWeakSet.js | 7 +
.../node_modules/underscore/amd/iteratee.js | 13 +
.../node_modules/underscore/amd/join.js | 7 +
.../node_modules/underscore/amd/keys.js | 17 +
.../node_modules/underscore/amd/last.js | 13 +
.../underscore/amd/lastIndexOf.js | 9 +
.../node_modules/underscore/amd/map.js | 18 +
.../node_modules/underscore/amd/mapObject.js | 19 +
.../node_modules/underscore/amd/matcher.js | 14 +
.../node_modules/underscore/amd/max.js | 30 +
.../node_modules/underscore/amd/memoize.js | 17 +
.../node_modules/underscore/amd/min.js | 30 +
.../node_modules/underscore/amd/mixin.js | 18 +
.../node_modules/underscore/amd/negate.js | 12 +
.../node_modules/underscore/amd/noop.js | 8 +
.../node_modules/underscore/amd/now.js | 10 +
.../node_modules/underscore/amd/object.js | 20 +
.../node_modules/underscore/amd/omit.js | 20 +
.../node_modules/underscore/amd/once.js | 9 +
.../node_modules/underscore/amd/pairs.js | 17 +
.../node_modules/underscore/amd/partial.js | 25 +
.../node_modules/underscore/amd/partition.js | 11 +
.../node_modules/underscore/amd/pick.js | 25 +
.../node_modules/underscore/amd/pluck.js | 10 +
.../node_modules/underscore/amd/pop.js | 7 +
.../node_modules/underscore/amd/property.js | 14 +
.../node_modules/underscore/amd/propertyOf.js | 13 +
.../node_modules/underscore/amd/push.js | 7 +
.../node_modules/underscore/amd/random.js | 14 +
.../node_modules/underscore/amd/range.js | 27 +
.../node_modules/underscore/amd/reduce.js | 9 +
.../underscore/amd/reduceRight.js | 8 +
.../node_modules/underscore/amd/reject.js | 10 +
.../node_modules/underscore/amd/rest.js | 12 +
.../underscore/amd/restArguments.js | 33 +
.../node_modules/underscore/amd/result.js | 25 +
.../node_modules/underscore/amd/reverse.js | 7 +
.../node_modules/underscore/amd/sample.js | 27 +
.../node_modules/underscore/amd/shift.js | 7 +
.../node_modules/underscore/amd/shuffle.js | 10 +
.../node_modules/underscore/amd/size.js | 11 +
.../node_modules/underscore/amd/slice.js | 7 +
.../node_modules/underscore/amd/some.js | 17 +
.../node_modules/underscore/amd/sort.js | 7 +
.../node_modules/underscore/amd/sortBy.js | 26 +
.../underscore/amd/sortedIndex.js | 18 +
.../underscore/amd/sortedLastIndex.js | 11 +
.../node_modules/underscore/amd/splice.js | 7 +
.../node_modules/underscore/amd/tap.js | 13 +
.../node_modules/underscore/amd/template.js | 95 +
.../underscore/amd/templateSettings.js | 13 +
.../node_modules/underscore/amd/throttle.js | 51 +
.../node_modules/underscore/amd/times.js | 13 +
.../node_modules/underscore/amd/toArray.js | 18 +
.../node_modules/underscore/amd/toPath.js | 12 +
.../node_modules/underscore/amd/toString.js | 11 +
.../amd/underscore-array-methods.js | 30 +
.../node_modules/underscore/amd/underscore.js | 29 +
.../node_modules/underscore/amd/unescape.js | 8 +
.../node_modules/underscore/amd/union.js | 11 +
.../node_modules/underscore/amd/uniq.js | 37 +
.../node_modules/underscore/amd/uniqueId.js | 13 +
.../node_modules/underscore/amd/unshift.js | 7 +
.../node_modules/underscore/amd/unzip.js | 17 +
.../node_modules/underscore/amd/value.js | 13 +
.../node_modules/underscore/amd/values.js | 16 +
.../node_modules/underscore/amd/where.js | 11 +
.../node_modules/underscore/amd/without.js | 10 +
.../node_modules/underscore/amd/wrap.js | 12 +
.../node_modules/underscore/amd/zip.js | 9 +
.../node_modules/underscore/cjs/_apply.js | 6 +
.../underscore/cjs/_applyProperty.js | 10 +
.../underscore/cjs/_arrayAccessors.js | 11 +
.../underscore/cjs/_arrayMutators.js | 19 +
.../underscore/cjs/_baseCreate.js | 20 +
.../underscore/cjs/_baseIteratee.js | 19 +
.../underscore/cjs/_binarySearch.js | 15 +
.../node_modules/underscore/cjs/_bindCb.js | 10 +
.../node_modules/underscore/cjs/_bindCb4.js | 13 +
.../node_modules/underscore/cjs/_byValue.js | 7 +
.../node_modules/underscore/cjs/_cb.js | 12 +
.../underscore/cjs/_chainResult.js | 8 +
.../underscore/cjs/_collectNonEnumProps.js | 42 +
.../underscore/cjs/_createAssigner.js | 20 +
.../underscore/cjs/_createEscaper.js | 19 +
.../underscore/cjs/_createIndexFinder.js | 30 +
.../cjs/_createPredicateIndexFinder.js | 17 +
.../underscore/cjs/_createReduce.js | 30 +
.../cjs/_createSizePropertyCheck.js | 11 +
.../node_modules/underscore/cjs/_deepGet.js | 11 +
.../node_modules/underscore/cjs/_escapeMap.js | 11 +
.../underscore/cjs/_executeBound.js | 15 +
.../node_modules/underscore/cjs/_extremum.js | 35 +
.../node_modules/underscore/cjs/_flatten.js | 33 +
.../underscore/cjs/_forceNumericMinMax.js | 14 +
.../underscore/cjs/_getByteLength.js | 6 +
.../node_modules/underscore/cjs/_getLength.js | 6 +
.../node_modules/underscore/cjs/_greater.js | 6 +
.../node_modules/underscore/cjs/_group.js | 17 +
.../node_modules/underscore/cjs/_has.js | 8 +
.../underscore/cjs/_hasObjectTag.js | 5 +
.../underscore/cjs/_isArrayLike.js | 10 +
.../underscore/cjs/_isBufferLike.js | 8 +
.../node_modules/underscore/cjs/_keyInObj.js | 7 +
.../node_modules/underscore/cjs/_less.js | 6 +
.../node_modules/underscore/cjs/_lessEqual.js | 6 +
.../underscore/cjs/_linearSearch.js | 30 +
.../node_modules/underscore/cjs/_mapReduce.js | 1 +
.../underscore/cjs/_methodFingerprint.js | 44 +
.../underscore/cjs/_optimizeCb.js | 23 +
.../node_modules/underscore/cjs/_push.js | 6 +
.../node_modules/underscore/cjs/_pusher.js | 9 +
.../node_modules/underscore/cjs/_sequence.js | 14 +
.../node_modules/underscore/cjs/_setup.js | 66 +
.../underscore/cjs/_shallowProperty.js | 8 +
.../node_modules/underscore/cjs/_slice.js | 6 +
.../underscore/cjs/_strictEqual.js | 5 +
.../underscore/cjs/_stringTagBug.js | 15 +
.../node_modules/underscore/cjs/_tagTester.js | 11 +
.../underscore/cjs/_toBufferView.js | 13 +
.../node_modules/underscore/cjs/_toPath.js | 10 +
.../underscore/cjs/_unescapeMap.js | 7 +
.../underscore/cjs/_unmethodize.js | 8 +
.../underscore/cjs/_wrapArrayAccessor.js | 14 +
.../underscore/cjs/_wrapArrayMutator.js | 29 +
.../node_modules/underscore/cjs/after.js | 10 +
.../node_modules/underscore/cjs/allKeys.js | 15 +
.../node_modules/underscore/cjs/before.js | 14 +
.../node_modules/underscore/cjs/bind.js | 15 +
.../node_modules/underscore/cjs/bindAll.js | 19 +
.../node_modules/underscore/cjs/chain.js | 10 +
.../node_modules/underscore/cjs/chunk.js | 15 +
.../node_modules/underscore/cjs/clone.js | 11 +
.../node_modules/underscore/cjs/compact.js | 8 +
.../node_modules/underscore/cjs/compose.js | 14 +
.../node_modules/underscore/cjs/concat.js | 6 +
.../node_modules/underscore/cjs/constant.js | 8 +
.../node_modules/underscore/cjs/contains.js | 12 +
.../node_modules/underscore/cjs/countBy.js | 11 +
.../node_modules/underscore/cjs/create.js | 13 +
.../node_modules/underscore/cjs/debounce.js | 42 +
.../node_modules/underscore/cjs/defaults.js | 7 +
.../node_modules/underscore/cjs/defer.js | 9 +
.../node_modules/underscore/cjs/delay.js | 11 +
.../node_modules/underscore/cjs/difference.js | 15 +
.../node_modules/underscore/cjs/each.js | 25 +
.../node_modules/underscore/cjs/escape.js | 7 +
.../node_modules/underscore/cjs/every.js | 17 +
.../node_modules/underscore/cjs/extend.js | 7 +
.../node_modules/underscore/cjs/extendOwn.js | 9 +
.../node_modules/underscore/cjs/filter.js | 14 +
.../node_modules/underscore/cjs/find.js | 12 +
.../node_modules/underscore/cjs/findIndex.js | 6 +
.../node_modules/underscore/cjs/findKey.js | 14 +
.../underscore/cjs/findLastIndex.js | 6 +
.../node_modules/underscore/cjs/findWhere.js | 10 +
.../node_modules/underscore/cjs/first.js | 11 +
.../node_modules/underscore/cjs/flatten.js | 9 +
.../node_modules/underscore/cjs/functions.js | 12 +
.../node_modules/underscore/cjs/get.js | 14 +
.../node_modules/underscore/cjs/groupBy.js | 10 +
.../node_modules/underscore/cjs/has.js | 18 +
.../node_modules/underscore/cjs/identity.js | 6 +
.../underscore/cjs/index-default.js | 11 +
.../node_modules/underscore/cjs/index.js | 277 +
.../node_modules/underscore/cjs/indexBy.js | 9 +
.../node_modules/underscore/cjs/indexOf.js | 11 +
.../node_modules/underscore/cjs/initial.js | 10 +
.../underscore/cjs/intersection.js | 21 +
.../node_modules/underscore/cjs/invert.js | 13 +
.../node_modules/underscore/cjs/invoke.js | 30 +
.../underscore/cjs/isArguments.js | 18 +
.../node_modules/underscore/cjs/isArray.js | 8 +
.../underscore/cjs/isArrayBuffer.js | 5 +
.../node_modules/underscore/cjs/isBoolean.js | 8 +
.../node_modules/underscore/cjs/isDataView.js | 16 +
.../node_modules/underscore/cjs/isDate.js | 5 +
.../node_modules/underscore/cjs/isElement.js | 6 +
.../node_modules/underscore/cjs/isEmpty.js | 20 +
.../node_modules/underscore/cjs/isEqual.js | 140 +
.../node_modules/underscore/cjs/isError.js | 5 +
.../node_modules/underscore/cjs/isFinite.js | 9 +
.../node_modules/underscore/cjs/isFunction.js | 17 +
.../node_modules/underscore/cjs/isMap.js | 7 +
.../node_modules/underscore/cjs/isMatch.js | 15 +
.../node_modules/underscore/cjs/isNaN.js | 9 +
.../node_modules/underscore/cjs/isNull.js | 6 +
.../node_modules/underscore/cjs/isNumber.js | 5 +
.../node_modules/underscore/cjs/isObject.js | 7 +
.../node_modules/underscore/cjs/isRegExp.js | 5 +
.../node_modules/underscore/cjs/isSet.js | 7 +
.../node_modules/underscore/cjs/isString.js | 5 +
.../node_modules/underscore/cjs/isSymbol.js | 5 +
.../underscore/cjs/isTypedArray.js | 17 +
.../underscore/cjs/isUndefined.js | 6 +
.../node_modules/underscore/cjs/isWeakMap.js | 7 +
.../node_modules/underscore/cjs/isWeakSet.js | 5 +
.../node_modules/underscore/cjs/iteratee.js | 12 +
.../node_modules/underscore/cjs/join.js | 6 +
.../node_modules/underscore/cjs/keys.js | 18 +
.../node_modules/underscore/cjs/last.js | 11 +
.../underscore/cjs/lastIndexOf.js | 8 +
.../node_modules/underscore/cjs/map.js | 18 +
.../node_modules/underscore/cjs/mapObject.js | 18 +
.../node_modules/underscore/cjs/matcher.js | 13 +
.../node_modules/underscore/cjs/max.js | 31 +
.../node_modules/underscore/cjs/memoize.js | 15 +
.../node_modules/underscore/cjs/min.js | 31 +
.../node_modules/underscore/cjs/mixin.js | 20 +
.../node_modules/underscore/cjs/negate.js | 8 +
.../node_modules/underscore/cjs/noop.js | 4 +
.../node_modules/underscore/cjs/now.js | 6 +
.../node_modules/underscore/cjs/object.js | 18 +
.../node_modules/underscore/cjs/omit.js | 24 +
.../node_modules/underscore/cjs/once.js | 8 +
.../node_modules/underscore/cjs/pairs.js | 15 +
.../node_modules/underscore/cjs/partial.js | 25 +
.../node_modules/underscore/cjs/partition.js | 9 +
.../node_modules/underscore/cjs/pick.js | 28 +
.../node_modules/underscore/cjs/pluck.js | 9 +
.../node_modules/underscore/cjs/pop.js | 6 +
.../node_modules/underscore/cjs/property.js | 13 +
.../node_modules/underscore/cjs/propertyOf.js | 12 +
.../node_modules/underscore/cjs/push.js | 6 +
.../node_modules/underscore/cjs/random.js | 10 +
.../node_modules/underscore/cjs/range.js | 23 +
.../node_modules/underscore/cjs/reduce.js | 7 +
.../underscore/cjs/reduceRight.js | 6 +
.../node_modules/underscore/cjs/reject.js | 10 +
.../node_modules/underscore/cjs/rest.js | 10 +
.../underscore/cjs/restArguments.js | 29 +
.../node_modules/underscore/cjs/result.js | 24 +
.../node_modules/underscore/cjs/reverse.js | 6 +
.../node_modules/underscore/cjs/sample.js | 29 +
.../node_modules/underscore/cjs/shift.js | 6 +
.../node_modules/underscore/cjs/shuffle.js | 8 +
.../node_modules/underscore/cjs/size.js | 10 +
.../node_modules/underscore/cjs/slice.js | 6 +
.../node_modules/underscore/cjs/some.js | 17 +
.../node_modules/underscore/cjs/sort.js | 6 +
.../node_modules/underscore/cjs/sortBy.js | 26 +
.../underscore/cjs/sortedIndex.js | 17 +
.../underscore/cjs/sortedLastIndex.js | 11 +
.../node_modules/underscore/cjs/splice.js | 6 +
.../node_modules/underscore/cjs/tap.js | 9 +
.../node_modules/underscore/cjs/template.js | 95 +
.../underscore/cjs/templateSettings.js | 11 +
.../node_modules/underscore/cjs/throttle.js | 49 +
.../node_modules/underscore/cjs/times.js | 11 +
.../node_modules/underscore/cjs/toArray.js | 22 +
.../node_modules/underscore/cjs/toPath.js | 11 +
.../node_modules/underscore/cjs/toString.js | 9 +
.../cjs/underscore-array-methods.js | 31 +
.../node_modules/underscore/cjs/underscore.js | 27 +
.../node_modules/underscore/cjs/unescape.js | 7 +
.../node_modules/underscore/cjs/union.js | 11 +
.../node_modules/underscore/cjs/uniq.js | 38 +
.../node_modules/underscore/cjs/uniqueId.js | 9 +
.../node_modules/underscore/cjs/unshift.js | 6 +
.../node_modules/underscore/cjs/unzip.js | 17 +
.../node_modules/underscore/cjs/value.js | 9 +
.../node_modules/underscore/cjs/values.js | 14 +
.../node_modules/underscore/cjs/where.js | 10 +
.../node_modules/underscore/cjs/without.js | 9 +
.../node_modules/underscore/cjs/wrap.js | 10 +
.../node_modules/underscore/cjs/zip.js | 8 +
.../node_modules/underscore/modules/.eslintrc | 12 +
.../underscore/modules/_baseCreate.js | 18 +
.../underscore/modules/_baseIteratee.js | 17 +
.../node_modules/underscore/modules/_cb.js | 10 +
.../underscore/modules/_chainResult.js | 6 +
.../modules/_collectNonEnumProps.js | 40 +
.../underscore/modules/_createAssigner.js | 18 +
.../underscore/modules/_createEscaper.js | 17 +
.../underscore/modules/_createIndexFinder.js | 28 +
.../modules/_createPredicateIndexFinder.js | 15 +
.../underscore/modules/_createReduce.js | 28 +
.../modules/_createSizePropertyCheck.js | 9 +
.../underscore/modules/_deepGet.js | 9 +
.../underscore/modules/_escapeMap.js | 9 +
.../underscore/modules/_executeBound.js | 13 +
.../underscore/modules/_flatten.js | 31 +
.../underscore/modules/_getByteLength.js | 4 +
.../underscore/modules/_getLength.js | 4 +
.../node_modules/underscore/modules/_group.js | 15 +
.../node_modules/underscore/modules/_has.js | 6 +
.../underscore/modules/_hasObjectTag.js | 3 +
.../underscore/modules/_isArrayLike.js | 8 +
.../underscore/modules/_isBufferLike.js | 6 +
.../underscore/modules/_keyInObj.js | 5 +
.../underscore/modules/_methodFingerprint.js | 37 +
.../underscore/modules/_optimizeCb.js | 21 +
.../node_modules/underscore/modules/_setup.js | 43 +
.../underscore/modules/_shallowProperty.js | 6 +
.../underscore/modules/_stringTagBug.js | 10 +
.../underscore/modules/_tagTester.js | 9 +
.../underscore/modules/_toBufferView.js | 11 +
.../underscore/modules/_toPath.js | 8 +
.../underscore/modules/_unescapeMap.js | 5 +
.../node_modules/underscore/modules/after.js | 8 +
.../underscore/modules/allKeys.js | 13 +
.../node_modules/underscore/modules/before.js | 12 +
.../node_modules/underscore/modules/bind.js | 13 +
.../underscore/modules/bindAll.js | 17 +
.../node_modules/underscore/modules/chain.js | 8 +
.../node_modules/underscore/modules/chunk.js | 13 +
.../node_modules/underscore/modules/clone.js | 9 +
.../underscore/modules/compact.js | 6 +
.../underscore/modules/compose.js | 12 +
.../underscore/modules/constant.js | 6 +
.../underscore/modules/contains.js | 10 +
.../underscore/modules/countBy.js | 9 +
.../node_modules/underscore/modules/create.js | 11 +
.../underscore/modules/debounce.js | 40 +
.../underscore/modules/defaults.js | 5 +
.../node_modules/underscore/modules/defer.js | 7 +
.../node_modules/underscore/modules/delay.js | 9 +
.../underscore/modules/difference.js | 13 +
.../node_modules/underscore/modules/each.js | 23 +
.../node_modules/underscore/modules/escape.js | 5 +
.../node_modules/underscore/modules/every.js | 15 +
.../node_modules/underscore/modules/extend.js | 5 +
.../underscore/modules/extendOwn.js | 7 +
.../node_modules/underscore/modules/filter.js | 12 +
.../node_modules/underscore/modules/find.js | 10 +
.../underscore/modules/findIndex.js | 4 +
.../underscore/modules/findKey.js | 12 +
.../underscore/modules/findLastIndex.js | 4 +
.../underscore/modules/findWhere.js | 8 +
.../node_modules/underscore/modules/first.js | 9 +
.../underscore/modules/flatten.js | 7 +
.../underscore/modules/functions.js | 10 +
.../node_modules/underscore/modules/get.js | 12 +
.../underscore/modules/groupBy.js | 8 +
.../node_modules/underscore/modules/has.js | 16 +
.../underscore/modules/identity.js | 4 +
.../underscore/modules/index-all.js | 18 +
.../underscore/modules/index-default.js | 27 +
.../node_modules/underscore/modules/index.js | 200 +
.../underscore/modules/indexBy.js | 7 +
.../underscore/modules/indexOf.js | 9 +
.../underscore/modules/initial.js | 8 +
.../underscore/modules/intersection.js | 19 +
.../node_modules/underscore/modules/invert.js | 11 +
.../node_modules/underscore/modules/invoke.js | 28 +
.../underscore/modules/isArguments.js | 16 +
.../underscore/modules/isArray.js | 6 +
.../underscore/modules/isArrayBuffer.js | 3 +
.../underscore/modules/isBoolean.js | 6 +
.../underscore/modules/isDataView.js | 14 +
.../node_modules/underscore/modules/isDate.js | 3 +
.../underscore/modules/isElement.js | 4 +
.../underscore/modules/isEmpty.js | 18 +
.../underscore/modules/isEqual.js | 138 +
.../underscore/modules/isError.js | 3 +
.../underscore/modules/isFinite.js | 7 +
.../underscore/modules/isFunction.js | 15 +
.../node_modules/underscore/modules/isMap.js | 5 +
.../underscore/modules/isMatch.js | 13 +
.../node_modules/underscore/modules/isNaN.js | 7 +
.../node_modules/underscore/modules/isNull.js | 4 +
.../underscore/modules/isNumber.js | 3 +
.../underscore/modules/isObject.js | 5 +
.../underscore/modules/isRegExp.js | 3 +
.../node_modules/underscore/modules/isSet.js | 5 +
.../underscore/modules/isString.js | 3 +
.../underscore/modules/isSymbol.js | 3 +
.../underscore/modules/isTypedArray.js | 15 +
.../underscore/modules/isUndefined.js | 4 +
.../underscore/modules/isWeakMap.js | 5 +
.../underscore/modules/isWeakSet.js | 3 +
.../underscore/modules/iteratee.js | 10 +
.../node_modules/underscore/modules/keys.js | 16 +
.../node_modules/underscore/modules/last.js | 9 +
.../underscore/modules/lastIndexOf.js | 6 +
.../node_modules/underscore/modules/map.js | 16 +
.../underscore/modules/mapObject.js | 16 +
.../underscore/modules/matcher.js | 11 +
.../node_modules/underscore/modules/max.js | 29 +
.../underscore/modules/memoize.js | 13 +
.../node_modules/underscore/modules/min.js | 29 +
.../node_modules/underscore/modules/mixin.js | 18 +
.../node_modules/underscore/modules/negate.js | 6 +
.../node_modules/underscore/modules/noop.js | 2 +
.../node_modules/underscore/modules/now.js | 4 +
.../node_modules/underscore/modules/object.js | 16 +
.../node_modules/underscore/modules/omit.js | 22 +
.../node_modules/underscore/modules/once.js | 6 +
.../node_modules/underscore/modules/pairs.js | 13 +
.../underscore/modules/partial.js | 24 +
.../underscore/modules/partition.js | 7 +
.../node_modules/underscore/modules/pick.js | 26 +
.../node_modules/underscore/modules/pluck.js | 7 +
.../underscore/modules/property.js | 11 +
.../underscore/modules/propertyOf.js | 10 +
.../node_modules/underscore/modules/random.js | 8 +
.../node_modules/underscore/modules/range.js | 21 +
.../node_modules/underscore/modules/reduce.js | 5 +
.../underscore/modules/reduceRight.js | 4 +
.../node_modules/underscore/modules/reject.js | 8 +
.../node_modules/underscore/modules/rest.js | 8 +
.../underscore/modules/restArguments.js | 27 +
.../node_modules/underscore/modules/result.js | 22 +
.../node_modules/underscore/modules/sample.js | 27 +
.../underscore/modules/shuffle.js | 6 +
.../node_modules/underscore/modules/size.js | 8 +
.../node_modules/underscore/modules/some.js | 15 +
.../node_modules/underscore/modules/sortBy.js | 24 +
.../underscore/modules/sortedIndex.js | 15 +
.../node_modules/underscore/modules/tap.js | 7 +
.../underscore/modules/template.js | 93 +
.../underscore/modules/templateSettings.js | 9 +
.../underscore/modules/throttle.js | 47 +
.../node_modules/underscore/modules/times.js | 9 +
.../underscore/modules/toArray.js | 20 +
.../node_modules/underscore/modules/toPath.js | 9 +
.../modules/underscore-array-methods.js | 31 +
.../underscore/modules/underscore.js | 25 +
.../underscore/modules/unescape.js | 5 +
.../node_modules/underscore/modules/union.js | 9 +
.../node_modules/underscore/modules/uniq.js | 36 +
.../underscore/modules/uniqueId.js | 7 +
.../node_modules/underscore/modules/unzip.js | 15 +
.../node_modules/underscore/modules/values.js | 12 +
.../node_modules/underscore/modules/where.js | 8 +
.../underscore/modules/without.js | 7 +
.../node_modules/underscore/modules/wrap.js | 8 +
.../node_modules/underscore/modules/zip.js | 6 +
.../node_modules/underscore/package.json | 107 +
.../underscore/underscore-esm-min.js | 5 +
.../underscore/underscore-esm-min.js.map | 1 +
.../node_modules/underscore/underscore-esm.js | 2026 ++
.../underscore/underscore-esm.js.map | 1 +
.../node_modules/underscore/underscore-min.js | 6 +
.../underscore/underscore-min.js.map | 1 +
.../node_modules/underscore/underscore.js | 2034 ++
.../node_modules/underscore/underscore.js.map | 1 +
node_modules/jsonpath/package.json | 76 +
node_modules/jsonpath/test/data/store.json | 31 +
node_modules/jsonpath/test/lessons.js | 38 +
node_modules/jsonpath/test/parse.js | 164 +
node_modules/jsonpath/test/query.js | 359 +
node_modules/jsonpath/test/slice.js | 57 +
node_modules/jsonpath/test/stringify.js | 54 +
node_modules/jsonpath/test/sugar.js | 72 +
node_modules/levn/LICENSE | 22 +
node_modules/levn/README.md | 196 +
node_modules/levn/lib/cast.js | 298 +
node_modules/levn/lib/coerce.js | 285 +
node_modules/levn/lib/index.js | 22 +
node_modules/levn/lib/parse-string.js | 113 +
node_modules/levn/lib/parse.js | 102 +
node_modules/levn/package.json | 77 +
node_modules/optionator/CHANGELOG.md | 56 +
node_modules/optionator/LICENSE | 22 +
node_modules/optionator/README.md | 238 +
node_modules/optionator/lib/help.js | 260 +
node_modules/optionator/lib/index.js | 465 +
node_modules/optionator/lib/util.js | 54 +
node_modules/optionator/package.json | 74 +
node_modules/prelude-ls/CHANGELOG.md | 99 +
node_modules/prelude-ls/LICENSE | 22 +
node_modules/prelude-ls/README.md | 15 +
node_modules/prelude-ls/lib/Func.js | 65 +
node_modules/prelude-ls/lib/List.js | 686 +
node_modules/prelude-ls/lib/Num.js | 130 +
node_modules/prelude-ls/lib/Obj.js | 154 +
node_modules/prelude-ls/lib/Str.js | 92 +
node_modules/prelude-ls/lib/index.js | 178 +
node_modules/prelude-ls/package.json | 84 +
node_modules/source-map/CHANGELOG.md | 301 +
node_modules/source-map/LICENSE | 28 +
node_modules/source-map/README.md | 742 +
.../source-map/dist/source-map.debug.js | 3234 ++
node_modules/source-map/dist/source-map.js | 3233 ++
.../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 | 1145 +
.../source-map/lib/source-map-generator.js | 425 +
node_modules/source-map/lib/source-node.js | 413 +
node_modules/source-map/lib/util.js | 488 +
node_modules/source-map/package.json | 212 +
node_modules/source-map/source-map.d.ts | 98 +
node_modules/source-map/source-map.js | 8 +
node_modules/static-eval/.travis.yml | 4 +
node_modules/static-eval/LICENSE | 18 +
node_modules/static-eval/example/eval.js | 7 +
node_modules/static-eval/example/vars.js | 11 +
node_modules/static-eval/index.js | 178 +
node_modules/static-eval/package.json | 76 +
node_modules/static-eval/readme.markdown | 87 +
node_modules/static-eval/test/eval.js | 82 +
node_modules/static-eval/test/prop.js | 16 +
.../static-eval/test/template-strings.js | 33 +
node_modules/type-check/LICENSE | 22 +
node_modules/type-check/README.md | 210 +
node_modules/type-check/lib/check.js | 126 +
node_modules/type-check/lib/index.js | 16 +
node_modules/type-check/lib/parse-type.js | 196 +
node_modules/type-check/package.json | 71 +
node_modules/word-wrap/LICENSE | 21 +
node_modules/word-wrap/README.md | 182 +
node_modules/word-wrap/index.d.ts | 50 +
node_modules/word-wrap/index.js | 46 +
node_modules/word-wrap/package.json | 137 +
node_modules/xmldom/.travis.yml | 22 +
node_modules/xmldom/LICENSE | 8 +
node_modules/xmldom/__package__.js | 4 +
node_modules/xmldom/changelog | 14 +
node_modules/xmldom/component.json | 10 +
node_modules/xmldom/dom-parser.js | 251 +
node_modules/xmldom/dom.js | 1244 +
node_modules/xmldom/package.json | 89 +
node_modules/xmldom/readme.md | 219 +
node_modules/xmldom/sax.js | 633 +
node_modules/xpath/.npmignore | 1 +
node_modules/xpath/README.md | 133 +
node_modules/xpath/docs/XPathEvaluator.md | 62 +
node_modules/xpath/docs/XPathResult.md | 47 +
node_modules/xpath/docs/function resolvers.md | 88 +
.../xpath/docs/namespace resolvers.md | 69 +
node_modules/xpath/docs/parsed expressions.md | 21 +
node_modules/xpath/docs/variable resolvers.md | 89 +
node_modules/xpath/docs/xpath methods.md | 39 +
node_modules/xpath/package.json | 67 +
node_modules/xpath/test.js | 1092 +
node_modules/xpath/xpath.d.ts | 9 +
node_modules/xpath/xpath.js | 4764 +++
package-lock.json | 129 +
package.json | 1 +
src/PowerShell/Constants.ts | 13 +
src/PowerShell/IAzurePowerShellSession.ts | 4 +
src/PowerShell/ServicePrincipalLogin.ts | 71 +
.../Utilities/PowerShellToolRunner.ts | 16 +
src/PowerShell/Utilities/ScriptBuilder.ts | 54 +
src/PowerShell/Utilities/Utils.ts | 61 +
src/arc-login.ts | 90 +-
src/login.ts | 18 +-
src/main.ts | 176 +
760 files changed, 85163 insertions(+), 107 deletions(-)
create mode 100644 .github/workflows/main.yml
create mode 100644 lib/PowerShell/Constants.js
create mode 100644 lib/PowerShell/IAzurePowerShellSession.js
create mode 100644 lib/PowerShell/ServicePrincipalLogin.js
create mode 100644 lib/PowerShell/Utilities/PowerShellToolRunner.js
create mode 100644 lib/PowerShell/Utilities/ScriptBuilder.js
create mode 100644 lib/PowerShell/Utilities/Utils.js
create mode 100644 lib/main.js
create mode 100644 node_modules/.bin/escodegen
create mode 100644 node_modules/.bin/escodegen.cmd
create mode 100644 node_modules/.bin/escodegen.ps1
create mode 100644 node_modules/.bin/esgenerate
create mode 100644 node_modules/.bin/esgenerate.cmd
create mode 100644 node_modules/.bin/esgenerate.ps1
create mode 100644 node_modules/actions-secret-parser/index.d.ts
create mode 100644 node_modules/actions-secret-parser/index.js
create mode 100644 node_modules/actions-secret-parser/package.json
create mode 100644 node_modules/deep-is/.npmignore
create mode 100644 node_modules/deep-is/.travis.yml
create mode 100644 node_modules/deep-is/LICENSE
create mode 100644 node_modules/deep-is/README.markdown
create mode 100644 node_modules/deep-is/example/cmp.js
create mode 100644 node_modules/deep-is/index.js
create mode 100644 node_modules/deep-is/package.json
create mode 100644 node_modules/deep-is/test/NaN.js
create mode 100644 node_modules/deep-is/test/cmp.js
create mode 100644 node_modules/deep-is/test/neg-vs-pos-0.js
create mode 100644 node_modules/escodegen/LICENSE.BSD
create mode 100644 node_modules/escodegen/README.md
create mode 100644 node_modules/escodegen/escodegen.js
create mode 100644 node_modules/escodegen/package.json
create mode 100644 node_modules/estraverse/.jshintrc
create mode 100644 node_modules/estraverse/LICENSE.BSD
create mode 100644 node_modules/estraverse/README.md
create mode 100644 node_modules/estraverse/estraverse.js
create mode 100644 node_modules/estraverse/gulpfile.js
create mode 100644 node_modules/estraverse/package.json
create mode 100644 node_modules/esutils/LICENSE.BSD
create mode 100644 node_modules/esutils/README.md
create mode 100644 node_modules/esutils/lib/ast.js
create mode 100644 node_modules/esutils/lib/code.js
create mode 100644 node_modules/esutils/lib/keyword.js
create mode 100644 node_modules/esutils/lib/utils.js
create mode 100644 node_modules/esutils/package.json
create mode 100644 node_modules/fast-levenshtein/LICENSE.md
create mode 100644 node_modules/fast-levenshtein/README.md
create mode 100644 node_modules/fast-levenshtein/levenshtein.js
create mode 100644 node_modules/fast-levenshtein/package.json
create mode 100644 node_modules/jsonpath/.jscsrc
create mode 100644 node_modules/jsonpath/.jshintrc
create mode 100644 node_modules/jsonpath/.travis.yml
create mode 100644 node_modules/jsonpath/Dockerfile
create mode 100644 node_modules/jsonpath/Gruntfile.js
create mode 100644 node_modules/jsonpath/LICENSE
create mode 100644 node_modules/jsonpath/README.md
create mode 100644 node_modules/jsonpath/fig.yml
create mode 100644 node_modules/jsonpath/generated/parser.js
create mode 100644 node_modules/jsonpath/include/action.js
create mode 100644 node_modules/jsonpath/include/module.js
create mode 100644 node_modules/jsonpath/index.js
create mode 100644 node_modules/jsonpath/jsonpath.js
create mode 100644 node_modules/jsonpath/jsonpath.min.js
create mode 100644 node_modules/jsonpath/lib/aesprim.js
create mode 100644 node_modules/jsonpath/lib/dict.js
create mode 100644 node_modules/jsonpath/lib/grammar.js
create mode 100644 node_modules/jsonpath/lib/handlers.js
create mode 100644 node_modules/jsonpath/lib/index.js
create mode 100644 node_modules/jsonpath/lib/parser.js
create mode 100644 node_modules/jsonpath/lib/slice.js
create mode 100644 node_modules/jsonpath/node_modules/.bin/esparse
create mode 100644 node_modules/jsonpath/node_modules/.bin/esparse.cmd
create mode 100644 node_modules/jsonpath/node_modules/.bin/esparse.ps1
create mode 100644 node_modules/jsonpath/node_modules/.bin/esvalidate
create mode 100644 node_modules/jsonpath/node_modules/.bin/esvalidate.cmd
create mode 100644 node_modules/jsonpath/node_modules/.bin/esvalidate.ps1
create mode 100644 node_modules/jsonpath/node_modules/esprima/README.md
create mode 100644 node_modules/jsonpath/node_modules/esprima/esprima.js
create mode 100644 node_modules/jsonpath/node_modules/esprima/package.json
create mode 100644 node_modules/jsonpath/node_modules/esprima/test/compat.js
create mode 100644 node_modules/jsonpath/node_modules/esprima/test/reflect.js
create mode 100644 node_modules/jsonpath/node_modules/esprima/test/run.js
create mode 100644 node_modules/jsonpath/node_modules/esprima/test/runner.js
create mode 100644 node_modules/jsonpath/node_modules/esprima/test/test.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/LICENSE
create mode 100644 node_modules/jsonpath/node_modules/underscore/README.md
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_apply.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_applyProperty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_arrayAccessors.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_arrayMutators.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_baseCreate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_baseIteratee.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_binarySearch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_bindCb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_bindCb4.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_byValue.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_cb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_chainResult.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_collectNonEnumProps.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_createAssigner.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_createEscaper.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_createIndexFinder.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_createPredicateIndexFinder.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_createReduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_createSizePropertyCheck.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_deepGet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_escapeMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_executeBound.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_extremum.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_flatten.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_forceNumericMinMax.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_getByteLength.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_getLength.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_greater.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_group.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_has.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_hasObjectTag.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_isArrayLike.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_isBufferLike.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_keyInObj.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_less.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_lessEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_linearSearch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_mapReduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_methodFingerprint.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_optimizeCb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_push.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_pusher.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_sequence.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_setup.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_shallowProperty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_slice.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_strictEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_stringTagBug.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_tagTester.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_toBufferView.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_toPath.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_unescapeMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_unmethodize.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayAccessor.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayMutator.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/after.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/allKeys.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/before.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/bind.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/bindAll.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/chain.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/chunk.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/clone.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/compact.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/compose.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/concat.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/constant.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/contains.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/countBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/create.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/debounce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/defaults.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/defer.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/delay.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/difference.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/each.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/escape.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/every.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/extend.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/extendOwn.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/filter.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/find.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/findIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/findKey.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/findLastIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/findWhere.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/first.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/flatten.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/functions.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/get.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/groupBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/has.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/identity.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/index-default.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/index.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/indexBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/indexOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/initial.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/intersection.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/invert.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/invoke.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isArguments.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isArrayBuffer.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isBoolean.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isDataView.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isDate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isElement.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isEmpty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isError.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isFinite.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isFunction.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isMatch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isNaN.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isNull.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isNumber.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isObject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isRegExp.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isSet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isString.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isSymbol.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isTypedArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isUndefined.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isWeakMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/isWeakSet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/iteratee.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/join.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/keys.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/last.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/lastIndexOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/map.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/mapObject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/matcher.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/max.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/memoize.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/min.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/mixin.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/negate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/noop.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/now.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/object.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/omit.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/once.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/pairs.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/partial.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/partition.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/pick.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/pluck.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/pop.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/property.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/propertyOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/push.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/random.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/range.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/reduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/reduceRight.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/reject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/rest.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/restArguments.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/result.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/reverse.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/sample.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/shift.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/shuffle.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/size.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/slice.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/some.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/sort.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/sortBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/sortedIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/sortedLastIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/splice.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/tap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/template.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/templateSettings.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/throttle.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/times.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/toArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/toPath.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/toString.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/underscore-array-methods.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/underscore.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/unescape.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/union.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/uniq.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/uniqueId.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/unshift.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/unzip.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/value.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/values.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/where.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/without.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/wrap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/amd/zip.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_apply.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_applyProperty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_arrayAccessors.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_arrayMutators.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_baseCreate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_baseIteratee.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_binarySearch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_bindCb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_bindCb4.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_byValue.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_cb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_chainResult.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_collectNonEnumProps.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_createAssigner.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_createEscaper.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_createIndexFinder.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_createPredicateIndexFinder.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_createReduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_createSizePropertyCheck.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_deepGet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_escapeMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_executeBound.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_extremum.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_flatten.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_forceNumericMinMax.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_getByteLength.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_getLength.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_greater.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_group.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_has.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_hasObjectTag.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_isArrayLike.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_isBufferLike.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_keyInObj.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_less.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_lessEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_linearSearch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_mapReduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_methodFingerprint.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_optimizeCb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_push.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_pusher.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_sequence.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_setup.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_shallowProperty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_slice.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_strictEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_stringTagBug.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_tagTester.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_toBufferView.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_toPath.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_unescapeMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_unmethodize.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayAccessor.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayMutator.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/after.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/allKeys.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/before.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/bind.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/bindAll.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/chain.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/chunk.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/clone.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/compact.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/compose.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/concat.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/constant.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/contains.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/countBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/create.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/debounce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/defaults.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/defer.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/delay.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/difference.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/each.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/escape.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/every.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/extend.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/extendOwn.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/filter.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/find.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/findIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/findKey.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/findLastIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/findWhere.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/first.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/flatten.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/functions.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/get.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/groupBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/has.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/identity.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/index-default.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/index.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/indexBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/indexOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/initial.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/intersection.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/invert.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/invoke.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isArguments.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isArrayBuffer.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isBoolean.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isDataView.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isDate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isElement.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isEmpty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isError.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isFinite.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isFunction.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isMatch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isNaN.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isNull.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isNumber.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isObject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isRegExp.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isSet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isString.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isSymbol.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isTypedArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isUndefined.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isWeakMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/isWeakSet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/iteratee.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/join.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/keys.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/last.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/lastIndexOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/map.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/mapObject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/matcher.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/max.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/memoize.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/min.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/mixin.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/negate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/noop.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/now.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/object.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/omit.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/once.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/pairs.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/partial.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/partition.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/pick.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/pluck.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/pop.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/property.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/propertyOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/push.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/random.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/range.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/reduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/reduceRight.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/reject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/rest.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/restArguments.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/result.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/reverse.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/sample.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/shift.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/shuffle.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/size.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/slice.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/some.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/sort.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/sortBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/sortedIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/sortedLastIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/splice.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/tap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/template.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/templateSettings.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/throttle.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/times.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/toArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/toPath.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/toString.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/underscore-array-methods.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/underscore.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/unescape.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/union.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/uniq.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/uniqueId.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/unshift.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/unzip.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/value.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/values.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/where.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/without.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/wrap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/cjs/zip.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/.eslintrc
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_baseCreate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_baseIteratee.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_cb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_chainResult.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_collectNonEnumProps.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_createAssigner.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_createEscaper.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_createIndexFinder.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_createPredicateIndexFinder.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_createReduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_createSizePropertyCheck.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_deepGet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_escapeMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_executeBound.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_flatten.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_getByteLength.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_getLength.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_group.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_has.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_hasObjectTag.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_isArrayLike.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_isBufferLike.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_keyInObj.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_methodFingerprint.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_optimizeCb.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_setup.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_shallowProperty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_stringTagBug.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_tagTester.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_toBufferView.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_toPath.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/_unescapeMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/after.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/allKeys.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/before.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/bind.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/bindAll.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/chain.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/chunk.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/clone.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/compact.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/compose.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/constant.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/contains.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/countBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/create.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/debounce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/defaults.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/defer.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/delay.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/difference.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/each.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/escape.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/every.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/extend.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/extendOwn.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/filter.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/find.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/findIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/findKey.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/findLastIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/findWhere.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/first.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/flatten.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/functions.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/get.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/groupBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/has.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/identity.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/index-all.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/index-default.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/index.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/indexBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/indexOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/initial.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/intersection.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/invert.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/invoke.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isArguments.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isArrayBuffer.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isBoolean.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isDataView.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isDate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isElement.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isEmpty.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isEqual.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isError.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isFinite.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isFunction.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isMatch.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isNaN.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isNull.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isNumber.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isObject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isRegExp.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isSet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isString.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isSymbol.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isTypedArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isUndefined.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isWeakMap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/isWeakSet.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/iteratee.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/keys.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/last.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/lastIndexOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/map.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/mapObject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/matcher.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/max.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/memoize.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/min.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/mixin.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/negate.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/noop.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/now.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/object.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/omit.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/once.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/pairs.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/partial.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/partition.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/pick.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/pluck.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/property.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/propertyOf.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/random.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/range.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/reduce.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/reduceRight.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/reject.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/rest.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/restArguments.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/result.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/sample.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/shuffle.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/size.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/some.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/sortBy.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/sortedIndex.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/tap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/template.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/templateSettings.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/throttle.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/times.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/toArray.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/toPath.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/underscore-array-methods.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/underscore.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/unescape.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/union.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/uniq.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/uniqueId.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/unzip.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/values.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/where.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/without.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/wrap.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/modules/zip.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/package.json
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore-esm-min.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore-esm-min.js.map
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore-esm.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore-esm.js.map
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore-min.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore-min.js.map
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore.js
create mode 100644 node_modules/jsonpath/node_modules/underscore/underscore.js.map
create mode 100644 node_modules/jsonpath/package.json
create mode 100644 node_modules/jsonpath/test/data/store.json
create mode 100644 node_modules/jsonpath/test/lessons.js
create mode 100644 node_modules/jsonpath/test/parse.js
create mode 100644 node_modules/jsonpath/test/query.js
create mode 100644 node_modules/jsonpath/test/slice.js
create mode 100644 node_modules/jsonpath/test/stringify.js
create mode 100644 node_modules/jsonpath/test/sugar.js
create mode 100644 node_modules/levn/LICENSE
create mode 100644 node_modules/levn/README.md
create mode 100644 node_modules/levn/lib/cast.js
create mode 100644 node_modules/levn/lib/coerce.js
create mode 100644 node_modules/levn/lib/index.js
create mode 100644 node_modules/levn/lib/parse-string.js
create mode 100644 node_modules/levn/lib/parse.js
create mode 100644 node_modules/levn/package.json
create mode 100644 node_modules/optionator/CHANGELOG.md
create mode 100644 node_modules/optionator/LICENSE
create mode 100644 node_modules/optionator/README.md
create mode 100644 node_modules/optionator/lib/help.js
create mode 100644 node_modules/optionator/lib/index.js
create mode 100644 node_modules/optionator/lib/util.js
create mode 100644 node_modules/optionator/package.json
create mode 100644 node_modules/prelude-ls/CHANGELOG.md
create mode 100644 node_modules/prelude-ls/LICENSE
create mode 100644 node_modules/prelude-ls/README.md
create mode 100644 node_modules/prelude-ls/lib/Func.js
create mode 100644 node_modules/prelude-ls/lib/List.js
create mode 100644 node_modules/prelude-ls/lib/Num.js
create mode 100644 node_modules/prelude-ls/lib/Obj.js
create mode 100644 node_modules/prelude-ls/lib/Str.js
create mode 100644 node_modules/prelude-ls/lib/index.js
create mode 100644 node_modules/prelude-ls/package.json
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.d.ts
create mode 100644 node_modules/source-map/source-map.js
create mode 100644 node_modules/static-eval/.travis.yml
create mode 100644 node_modules/static-eval/LICENSE
create mode 100644 node_modules/static-eval/example/eval.js
create mode 100644 node_modules/static-eval/example/vars.js
create mode 100644 node_modules/static-eval/index.js
create mode 100644 node_modules/static-eval/package.json
create mode 100644 node_modules/static-eval/readme.markdown
create mode 100644 node_modules/static-eval/test/eval.js
create mode 100644 node_modules/static-eval/test/prop.js
create mode 100644 node_modules/static-eval/test/template-strings.js
create mode 100644 node_modules/type-check/LICENSE
create mode 100644 node_modules/type-check/README.md
create mode 100644 node_modules/type-check/lib/check.js
create mode 100644 node_modules/type-check/lib/index.js
create mode 100644 node_modules/type-check/lib/parse-type.js
create mode 100644 node_modules/type-check/package.json
create mode 100644 node_modules/word-wrap/LICENSE
create mode 100644 node_modules/word-wrap/README.md
create mode 100644 node_modules/word-wrap/index.d.ts
create mode 100644 node_modules/word-wrap/index.js
create mode 100644 node_modules/word-wrap/package.json
create mode 100644 node_modules/xmldom/.travis.yml
create mode 100644 node_modules/xmldom/LICENSE
create mode 100644 node_modules/xmldom/__package__.js
create mode 100644 node_modules/xmldom/changelog
create mode 100644 node_modules/xmldom/component.json
create mode 100644 node_modules/xmldom/dom-parser.js
create mode 100644 node_modules/xmldom/dom.js
create mode 100644 node_modules/xmldom/package.json
create mode 100644 node_modules/xmldom/readme.md
create mode 100644 node_modules/xmldom/sax.js
create mode 100644 node_modules/xpath/.npmignore
create mode 100644 node_modules/xpath/README.md
create mode 100644 node_modules/xpath/docs/XPathEvaluator.md
create mode 100644 node_modules/xpath/docs/XPathResult.md
create mode 100644 node_modules/xpath/docs/function resolvers.md
create mode 100644 node_modules/xpath/docs/namespace resolvers.md
create mode 100644 node_modules/xpath/docs/parsed expressions.md
create mode 100644 node_modules/xpath/docs/variable resolvers.md
create mode 100644 node_modules/xpath/docs/xpath methods.md
create mode 100644 node_modules/xpath/package.json
create mode 100644 node_modules/xpath/test.js
create mode 100644 node_modules/xpath/xpath.d.ts
create mode 100644 node_modules/xpath/xpath.js
create mode 100644 src/PowerShell/Constants.ts
create mode 100644 src/PowerShell/IAzurePowerShellSession.ts
create mode 100644 src/PowerShell/ServicePrincipalLogin.ts
create mode 100644 src/PowerShell/Utilities/PowerShellToolRunner.ts
create mode 100644 src/PowerShell/Utilities/ScriptBuilder.ts
create mode 100644 src/PowerShell/Utilities/Utils.ts
create mode 100644 src/main.ts
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..428f732a
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,44 @@
+# This is a basic workflow to help you get started with Actions
+
+name: k8s-set-context
+
+# Controls when the action will run.
+on:
+ # Triggers the workflow on push or pull request events but only for the master branch
+ push:
+ branches: [ cluster-connect-2 ]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ # This workflow contains a single job called "build"
+ build:
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v2
+
+ # Runs a single command using the runners shell
+ - name: Run a one-line script
+ run: echo Hello, world!
+
+ # Runs a set of commands using the runners shell
+ - name: Run a multi-line script
+ run: |
+ echo Add other actions to build,
+ echo test, and deploy your project.
+ - uses: atharvamulmuley/k8s-set-context@cluster-connect-2
+ with:
+ method: service-account
+ cluster-type: 'arc'
+ creds: '${{ secrets.AZURE_CREDS }}'
+ cluster-name: arcaction
+ resource-group: atharvatest2
+ token: '${{ secrets.SA_TOKEN }}'
+ - run: |
+ kubectl get pods -A
\ No newline at end of file
diff --git a/README.md b/README.md
index baf652fb..0898fb0a 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@ There are two approaches for specifying the deployment target:
- Kubeconfig file provided as input to the action
- Service account approach where the secret associated with the service account is provided as input to the action
+- Service principal approach(only applicable for arc cluster) where service principal provided with 'creds' is used as input to action
If inputs related to both these approaches are provided, kubeconfig approach related inputs are given precedence.
@@ -22,7 +23,7 @@ In both these approaches it is recommended to store these contents (kubeconfig f
method Method |
- (Optional) Acceptable values: kubeconfig/service-account. Default value: kubeconfig |
+ (Optional) Acceptable values: kubeconfig/service-account/spn. Default value: kubeconfig |
kubeconfig Kubectl config |
@@ -40,6 +41,26 @@ In both these approaches it is recommended to store these contents (kubeconfig f
k8s-secret Secret |
(Relevant for service account approach) Secret associated with the service account to be used for deployments |
+
+ cluster-type Type of cluster |
+ Type of cluster. Acceptable values: generic/arc |
+
+
+ creds Service principal credentials for az login |
+ Provide json output of 'az ad sp create-for-rbac --sdk-auth' command |
+
+
+ cluster-name Name of arc cluster |
+ Provide name of arc cluster.Applicable for cluster-type of 'arc'. |
+
+
+ resource-group resource group |
+ Provide name of resource group that contains the arc cluster.Applicable for cluster-type of 'arc'. |
+
+
+ token Service account token |
+ Applicable for 'service-account' method. |
+
## Example usage
@@ -101,6 +122,33 @@ kubectl get serviceAccounts -n -o 'jsonpath={
kubectl get secret -n -o yaml
```
+### Service account approach for arc cluster
+
+```yaml
+- uses: azure/k8s-set-context@v1
+ with:
+ method: service-account
+ cluster-type: 'arc'
+ creds: '${{ secrets.AZURE_CREDS }}'
+ cluster-name:
+ resource-group:
+ token: '${{ secrets.SA_TOKEN }}'
+ id: setcontext
+```
+
+### Service principal approach for arc cluster
+
+```yaml
+- uses: azure/k8s-set-context@v1
+ with:
+ method: spn
+ cluster-type: 'arc'
+ creds: '${{ secrets.AZURE_CREDS }}'
+ cluster-name:
+ resource-group:
+ id: setcontext
+```
+
## Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a
@@ -113,4 +161,4 @@ provided by the bot. You will only need to do this once across all repos using o
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
-contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
+contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
\ No newline at end of file
diff --git a/action.yml b/action.yml
index 6ce308c0..f84f7568 100644
--- a/action.yml
+++ b/action.yml
@@ -7,7 +7,7 @@ inputs:
required: true
default: 'generic'
method:
- description: 'Acceptable values: kubeconfig or service-account'
+ description: 'Acceptable values: kubeconfig or service-account or spn'
required: true
default: 'kubeconfig'
kubeconfig:
@@ -44,8 +44,22 @@ inputs:
description: 'Azure connected cluster name'
required: false
default: ''
+
+ # inputs for az login
+ enable-AzPSSession:
+ description: 'Set this value to true to enable Azure PowerShell Login in addition to Az CLI login'
+ required: false
+ default: false
+ environment:
+ description: 'Name of the environment. Supported values are azurecloud, azurestack, azureusgovernment, azurechinacloud, azuregermancloud. Default being azurecloud'
+ required: false
+ default: AzureCloud
+ allow-no-subscriptions:
+ description: 'Set this value to true to enable support for accessing tenants without subscriptions'
+ required: false
+ default: false
branding:
color: 'green' # optional, decorates the entry in the GitHub Marketplace
runs:
using: 'node12'
- main: 'lib/login.js'
+ main: 'lib/login.js'
\ No newline at end of file
diff --git a/lib/PowerShell/Constants.js b/lib/PowerShell/Constants.js
new file mode 100644
index 00000000..98f75ccf
--- /dev/null
+++ b/lib/PowerShell/Constants.js
@@ -0,0 +1,14 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+class Constants {
+}
+exports.default = Constants;
+Constants.prefix = "az_";
+Constants.moduleName = "Az.Accounts";
+Constants.versionPattern = /[0-9]\.[0-9]\.[0-9]/;
+Constants.AzureCloud = "AzureCloud";
+Constants.Subscription = "Subscription";
+Constants.ServicePrincipal = "ServicePrincipal";
+Constants.Success = "Success";
+Constants.Error = "Error";
+Constants.AzVersion = "AzVersion";
diff --git a/lib/PowerShell/IAzurePowerShellSession.js b/lib/PowerShell/IAzurePowerShellSession.js
new file mode 100644
index 00000000..e69de29b
diff --git a/lib/PowerShell/ServicePrincipalLogin.js b/lib/PowerShell/ServicePrincipalLogin.js
new file mode 100644
index 00000000..807cd75a
--- /dev/null
+++ b/lib/PowerShell/ServicePrincipalLogin.js
@@ -0,0 +1,67 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const core = require("@actions/core");
+const Utils_1 = require("./Utilities/Utils");
+const PowerShellToolRunner_1 = require("./Utilities/PowerShellToolRunner");
+const ScriptBuilder_1 = require("./Utilities/ScriptBuilder");
+const Constants_1 = require("./Constants");
+class ServicePrincipalLogin {
+ constructor(servicePrincipalId, servicePrincipalKey, tenantId, subscriptionId, allowNoSubscriptionsLogin, environment, resourceManagerEndpointUrl) {
+ this.servicePrincipalId = servicePrincipalId;
+ this.servicePrincipalKey = servicePrincipalKey;
+ this.tenantId = tenantId;
+ this.subscriptionId = subscriptionId;
+ this.environment = environment;
+ this.resourceManagerEndpointUrl = resourceManagerEndpointUrl;
+ this.allowNoSubscriptionsLogin = allowNoSubscriptionsLogin;
+ }
+ initialize() {
+ return __awaiter(this, void 0, void 0, function* () {
+ Utils_1.default.setPSModulePath();
+ const azLatestVersion = yield Utils_1.default.getLatestModule(Constants_1.default.moduleName);
+ core.debug(`Az Module version used: ${azLatestVersion}`);
+ Utils_1.default.setPSModulePath(`${Constants_1.default.prefix}${azLatestVersion}`);
+ });
+ }
+ login() {
+ return __awaiter(this, void 0, void 0, function* () {
+ let output = "";
+ const options = {
+ listeners: {
+ stdout: (data) => {
+ output += data.toString();
+ }
+ }
+ };
+ const args = {
+ servicePrincipalId: this.servicePrincipalId,
+ servicePrincipalKey: this.servicePrincipalKey,
+ subscriptionId: this.subscriptionId,
+ environment: this.environment,
+ scopeLevel: ServicePrincipalLogin.scopeLevel,
+ allowNoSubscriptionsLogin: this.allowNoSubscriptionsLogin,
+ resourceManagerEndpointUrl: this.resourceManagerEndpointUrl
+ };
+ const script = new ScriptBuilder_1.default().getAzPSLoginScript(ServicePrincipalLogin.scheme, this.tenantId, args);
+ yield PowerShellToolRunner_1.default.init();
+ yield PowerShellToolRunner_1.default.executePowerShellScriptBlock(script, options);
+ const result = JSON.parse(output.trim());
+ if (!(Constants_1.default.Success in result)) {
+ throw new Error(`Azure PowerShell login failed with error: ${result[Constants_1.default.Error]}`);
+ }
+ console.log(`Azure PowerShell session successfully initialized`);
+ });
+ }
+}
+exports.ServicePrincipalLogin = ServicePrincipalLogin;
+ServicePrincipalLogin.scopeLevel = Constants_1.default.Subscription;
+ServicePrincipalLogin.scheme = Constants_1.default.ServicePrincipal;
diff --git a/lib/PowerShell/Utilities/PowerShellToolRunner.js b/lib/PowerShell/Utilities/PowerShellToolRunner.js
new file mode 100644
index 00000000..edca71d9
--- /dev/null
+++ b/lib/PowerShell/Utilities/PowerShellToolRunner.js
@@ -0,0 +1,28 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const io = require("@actions/io");
+const exec = require("@actions/exec");
+class PowerShellToolRunner {
+ static init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!PowerShellToolRunner.psPath) {
+ PowerShellToolRunner.psPath = yield io.which("pwsh", true);
+ }
+ });
+ }
+ static executePowerShellScriptBlock(scriptBlock, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield exec.exec(`"${PowerShellToolRunner.psPath}" -Command`, [scriptBlock], options);
+ });
+ }
+}
+exports.default = PowerShellToolRunner;
diff --git a/lib/PowerShell/Utilities/ScriptBuilder.js b/lib/PowerShell/Utilities/ScriptBuilder.js
new file mode 100644
index 00000000..62b6276e
--- /dev/null
+++ b/lib/PowerShell/Utilities/ScriptBuilder.js
@@ -0,0 +1,55 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const core = require("@actions/core");
+const Constants_1 = require("../Constants");
+class ScriptBuilder {
+ constructor() {
+ this.script = "";
+ }
+ getAzPSLoginScript(scheme, tenantId, args) {
+ let command = `Clear-AzContext -Scope Process;
+ Clear-AzContext -Scope CurrentUser -Force -ErrorAction SilentlyContinue;`;
+ if (scheme === Constants_1.default.ServicePrincipal) {
+ if (args.environment.toLowerCase() == "azurestack") {
+ command += `Add-AzEnvironment -Name ${args.environment} -ARMEndpoint ${args.resourceManagerEndpointUrl} | out-null;`;
+ }
+ command += `Connect-AzAccount -ServicePrincipal -Tenant '${tenantId}' -Credential \
+ (New-Object System.Management.Automation.PSCredential('${args.servicePrincipalId}',(ConvertTo-SecureString '${args.servicePrincipalKey.replace("'", "''")}' -AsPlainText -Force))) \
+ -Environment '${args.environment}' | out-null;`;
+ if (args.scopeLevel === Constants_1.default.Subscription && !args.allowNoSubscriptionsLogin) {
+ command += `Set-AzContext -SubscriptionId '${args.subscriptionId}' -TenantId '${tenantId}' | out-null;`;
+ }
+ }
+ this.script += `try {
+ $ErrorActionPreference = "Stop"
+ $WarningPreference = "SilentlyContinue"
+ $output = @{}
+ ${command}
+ $output['${Constants_1.default.Success}'] = "true"
+ }
+ catch {
+ $output['${Constants_1.default.Error}'] = $_.exception.Message
+ }
+ return ConvertTo-Json $output`;
+ core.debug(`Azure PowerShell Login Script: ${this.script}`);
+ return this.script;
+ }
+ getLatestModuleScript(moduleName) {
+ const command = `Get-Module -Name ${moduleName} -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1`;
+ this.script += `try {
+ $ErrorActionPreference = "Stop"
+ $WarningPreference = "SilentlyContinue"
+ $output = @{}
+ $data = ${command}
+ $output['${Constants_1.default.AzVersion}'] = $data.Version.ToString()
+ $output['${Constants_1.default.Success}'] = "true"
+ }
+ catch {
+ $output['${Constants_1.default.Error}'] = $_.exception.Message
+ }
+ return ConvertTo-Json $output`;
+ core.debug(`GetLatestModuleScript: ${this.script}`);
+ return this.script;
+ }
+}
+exports.default = ScriptBuilder;
diff --git a/lib/PowerShell/Utilities/Utils.js b/lib/PowerShell/Utilities/Utils.js
new file mode 100644
index 00000000..f0ccd81e
--- /dev/null
+++ b/lib/PowerShell/Utilities/Utils.js
@@ -0,0 +1,70 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const os = require("os");
+const Constants_1 = require("../Constants");
+const ScriptBuilder_1 = require("./ScriptBuilder");
+const PowerShellToolRunner_1 = require("./PowerShellToolRunner");
+class Utils {
+ /**
+ * Add the folder path where Az modules are present to PSModulePath based on runner
+ * @param azPSVersion
+ * If azPSVersion is empty, folder path in which all Az modules are present are set
+ * If azPSVersion is not empty, folder path of exact Az module version is set
+ */
+ static setPSModulePath(azPSVersion = "") {
+ let modulePath = "";
+ const runner = process.env.RUNNER_OS || os.type();
+ switch (runner.toLowerCase()) {
+ case "linux":
+ modulePath = `/usr/share/${azPSVersion}:`;
+ break;
+ case "windows":
+ case "windows_nt":
+ modulePath = `C:\\Modules\\${azPSVersion};`;
+ break;
+ case "macos":
+ case "darwin":
+ throw new Error(`OS not supported`);
+ default:
+ throw new Error(`Unknown os: ${runner.toLowerCase()}`);
+ }
+ process.env.PSModulePath = `${modulePath}${process.env.PSModulePath}`;
+ }
+ static getLatestModule(moduleName) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let output = "";
+ const options = {
+ listeners: {
+ stdout: (data) => {
+ output += data.toString();
+ }
+ }
+ };
+ yield PowerShellToolRunner_1.default.init();
+ yield PowerShellToolRunner_1.default.executePowerShellScriptBlock(new ScriptBuilder_1.default()
+ .getLatestModuleScript(moduleName), options);
+ const result = JSON.parse(output.trim());
+ if (!(Constants_1.default.Success in result)) {
+ throw new Error(result[Constants_1.default.Error]);
+ }
+ const azLatestVersion = result[Constants_1.default.AzVersion];
+ if (!Utils.isValidVersion(azLatestVersion)) {
+ throw new Error(`Invalid AzPSVersion: ${azLatestVersion}`);
+ }
+ return azLatestVersion;
+ });
+ }
+ static isValidVersion(version) {
+ return !!version.match(Constants_1.default.versionPattern);
+ }
+}
+exports.default = Utils;
diff --git a/lib/arc-login.js b/lib/arc-login.js
index ec42343f..aabb8ccb 100644
--- a/lib/arc-login.js
+++ b/lib/arc-login.js
@@ -12,6 +12,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
const core = require("@actions/core");
const client_1 = require("./client");
const querystring = require("querystring");
+const az_login = require("./main");
+const path = require("path");
+const child_process_1 = require("child_process");
+const fs = require("fs");
function getAzureAccessToken(servicePrincipalId, servicePrincipalKey, tenantId, authorityUrl, managementEndpointUrl) {
return __awaiter(this, void 0, void 0, function* () {
if (!servicePrincipalId || !servicePrincipalKey || !tenantId || !authorityUrl) {
@@ -52,51 +56,47 @@ function getAzureAccessToken(servicePrincipalId, servicePrincipalKey, tenantId,
function getArcKubeconfig() {
return __awaiter(this, void 0, void 0, function* () {
try {
- let creds = core.getInput('creds');
- let credsObject;
- try {
- credsObject = JSON.parse(creds);
+ let method = core.getInput('method');
+ if (method != 'service-account' && method != 'spn') {
+ throw Error("Supported methods for arc cluster are 'service-account' and 'spn'.");
}
- catch (ex) {
- throw new Error('Credentials object is not a valid JSON: ' + ex);
- }
- let servicePrincipalId = credsObject["clientId"];
- let servicePrincipalKey = credsObject["clientSecret"];
- let tenantId = credsObject["tenantId"];
- let authorityUrl = credsObject["activeDirectoryEndpointUrl"] || "https://login.microsoftonline.com";
- let managementEndpointUrl = credsObject["resourceManagerEndpointUrl"] || "https://management.azure.com/";
- let subscriptionId = credsObject["subscriptionId"];
- let azureSessionToken = yield getAzureAccessToken(servicePrincipalId, servicePrincipalKey, tenantId, authorityUrl, managementEndpointUrl).catch(ex => {
- throw new Error('Could not fetch the azure access token: ' + ex);
- });
let resourceGroupName = core.getInput('resource-group');
let clusterName = core.getInput('cluster-name');
- let saToken = core.getInput('token');
- return new Promise((resolve, reject) => {
- var webRequest = new client_1.WebRequest();
- webRequest.method = 'POST';
- webRequest.uri = `${managementEndpointUrl}/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.Kubernetes/connectedClusters/${clusterName}/listClusterUserCredentials?api-version=2020-01-01-preview`;
- webRequest.headers = {
- 'Authorization': 'Bearer ' + azureSessionToken,
- 'Content-Type': 'application/json; charset=utf-8'
- };
- webRequest.body = JSON.stringify({
- authenticationMethod: "Token",
- value: {
- token: saToken
- }
- });
- client_1.sendRequest(webRequest).then((response) => {
- let kubeconfigs = response.body.kubeconfigs;
- if (kubeconfigs && kubeconfigs.length > 0) {
- var kubeconfig = Buffer.from(kubeconfigs[0].value, 'base64');
- resolve(kubeconfig.toString());
- }
- else {
- reject(JSON.stringify(response.body));
- }
- }).catch(reject);
- });
+ if (!resourceGroupName) {
+ throw Error("'resourceGroupName' is not passed for arc cluster.");
+ }
+ if (!clusterName) {
+ throw Error("'clusterName' is not passed for arc cluster.");
+ }
+ yield az_login.main();
+ yield az_login.executeAzCliCommand(`account show`, false);
+ yield az_login.executeAzCliCommand(`extension add -n connectedk8s`, false);
+ yield az_login.executeAzCliCommand(`extension list`, false);
+ const runnerTempDirectory = process.env['RUNNER_TEMP']; // Using process.env until the core libs are updated
+ const kubeconfigPath = path.join(runnerTempDirectory, `kubeconfig_${Date.now()}`);
+ if (method == 'service-account') {
+ let saToken = core.getInput('token');
+ if (!saToken) {
+ throw Error("'saToken' is not passed for 'service-account' method.");
+ }
+ console.log('using service account method for authenticating to arc cluster.');
+ child_process_1.spawn('az', ['connectedk8s', 'proxy', '-n', clusterName, '-g', resourceGroupName, '-f', kubeconfigPath, '--token', saToken], {
+ detached: true,
+ stdio: 'ignore'
+ }).unref();
+ }
+ else {
+ console.log('using spn method for authenticating to arc cluster.');
+ child_process_1.spawn('az', ['connectedk8s', 'proxy', '-n', clusterName, '-g', resourceGroupName, '-f', kubeconfigPath], {
+ detached: true,
+ stdio: 'ignore'
+ }).unref();
+ }
+ console.log('started proxy');
+ yield sleep(120000); //sleeping for a minute to allow kubeconfig to be merged
+ fs.chmodSync(kubeconfigPath, '600');
+ core.exportVariable('KUBECONFIG', kubeconfigPath);
+ console.log('KUBECONFIG environment variable is set');
}
catch (ex) {
return Promise.reject(ex);
@@ -104,3 +104,6 @@ function getArcKubeconfig() {
});
}
exports.getArcKubeconfig = getArcKubeconfig;
+function sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
diff --git a/lib/login.js b/lib/login.js
index e8d04d13..f7749276 100644
--- a/lib/login.js
+++ b/lib/login.js
@@ -111,21 +111,21 @@ function run() {
let kubeconfig = '';
const cluster_type = core.getInput('cluster-type', { required: true });
if (cluster_type == 'arc') {
- kubeconfig = yield arc_login_1.getArcKubeconfig().catch(ex => {
+ yield arc_login_1.getArcKubeconfig().catch(ex => {
throw new Error('Error: Could not get the KUBECONFIG for arc cluster: ' + ex);
});
}
else {
+ const runnerTempDirectory = process.env['RUNNER_TEMP']; // Using process.env until the core libs are updated
+ const kubeconfigPath = path.join(runnerTempDirectory, `kubeconfig_${Date.now()}`);
kubeconfig = getKubeconfig();
+ core.debug(`Writing kubeconfig contents to ${kubeconfigPath}`);
+ fs.writeFileSync(kubeconfigPath, kubeconfig);
+ fs.chmodSync(kubeconfigPath, '600');
+ core.exportVariable('KUBECONFIG', kubeconfigPath);
+ console.log('KUBECONFIG environment variable is set');
+ yield setContext(kubeconfigPath);
}
- const runnerTempDirectory = process.env['RUNNER_TEMP']; // Using process.env until the core libs are updated
- const kubeconfigPath = path.join(runnerTempDirectory, `kubeconfig_${Date.now()}`);
- core.debug(`Writing kubeconfig contents to ${kubeconfigPath}`);
- fs.writeFileSync(kubeconfigPath, kubeconfig);
- fs.chmodSync(kubeconfigPath, '600');
- core.exportVariable('KUBECONFIG', kubeconfigPath);
- console.log('KUBECONFIG environment variable is set');
- yield setContext(kubeconfigPath);
}
catch (ex) {
return Promise.reject(ex);
diff --git a/lib/main.js b/lib/main.js
new file mode 100644
index 00000000..6cc9c48d
--- /dev/null
+++ b/lib/main.js
@@ -0,0 +1,163 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const core = require("@actions/core");
+const exec = require("@actions/exec");
+const io = require("@actions/io");
+const actions_secret_parser_1 = require("actions-secret-parser");
+const ServicePrincipalLogin_1 = require("./PowerShell/ServicePrincipalLogin");
+var azPath;
+var prefix = !!process.env.AZURE_HTTP_USER_AGENT ? `${process.env.AZURE_HTTP_USER_AGENT}` : "";
+var azPSHostEnv = !!process.env.AZUREPS_HOST_ENVIRONMENT ? `${process.env.AZUREPS_HOST_ENVIRONMENT}` : "";
+function main() {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ // Set user agent variable
+ var isAzCLISuccess = false;
+ let usrAgentRepo = `${process.env.GITHUB_REPOSITORY}`;
+ let actionName = 'AzureLogin';
+ let userAgentString = (!!prefix ? `${prefix}+` : '') + `GITHUBACTIONS/${actionName}@v1_${usrAgentRepo}`;
+ let azurePSHostEnv = (!!azPSHostEnv ? `${azPSHostEnv}+` : '') + `GITHUBACTIONS/${actionName}@v1_${usrAgentRepo}`;
+ core.exportVariable('AZURE_HTTP_USER_AGENT', userAgentString);
+ core.exportVariable('AZUREPS_HOST_ENVIRONMENT', azurePSHostEnv);
+ azPath = yield io.which("az", true);
+ let azureSupportedCloudName = new Set([
+ "azureusgovernment",
+ "azurechinacloud",
+ "azuregermancloud",
+ "azurecloud",
+ "azurestack"
+ ]);
+ let output = "";
+ const execOptions = {
+ listeners: {
+ stdout: (data) => {
+ output += data.toString();
+ }
+ }
+ };
+ yield executeAzCliCommand("--version", true, execOptions);
+ core.debug(`az cli version used:\n${output}`);
+ let creds = core.getInput('creds', { required: true });
+ let secrets = new actions_secret_parser_1.SecretParser(creds, actions_secret_parser_1.FormatType.JSON);
+ let servicePrincipalId = secrets.getSecret("$.clientId", false);
+ let servicePrincipalKey = secrets.getSecret("$.clientSecret", true);
+ let tenantId = secrets.getSecret("$.tenantId", false);
+ let subscriptionId = secrets.getSecret("$.subscriptionId", false);
+ let resourceManagerEndpointUrl = secrets.getSecret("$.resourceManagerEndpointUrl", false);
+ let environment = core.getInput("environment").toLowerCase();
+ const enableAzPSSession = core.getInput('enable-AzPSSession').toLowerCase() === "true";
+ const allowNoSubscriptionsLogin = core.getInput('allow-no-subscriptions').toLowerCase() === "true";
+ if (!servicePrincipalId || !servicePrincipalKey || !tenantId) {
+ throw new Error("Not all values are present in the creds object. Ensure clientId, clientSecret and tenantId are supplied.");
+ }
+ if (!subscriptionId && !allowNoSubscriptionsLogin) {
+ throw new Error("Not all values are present in the creds object. Ensure subscriptionId is supplied.");
+ }
+ if (!azureSupportedCloudName.has(environment)) {
+ throw new Error("Unsupported value for environment is passed.The list of supported values for environment are ‘azureusgovernment', ‘azurechinacloud’, ‘azuregermancloud’, ‘azurecloud’ or ’azurestack’");
+ }
+ // Attempting Az cli login
+ if (environment == "azurestack") {
+ if (!resourceManagerEndpointUrl) {
+ throw new Error("resourceManagerEndpointUrl is a required parameter when environment is defined.");
+ }
+ console.log(`Unregistering cloud: "${environment}" first if it exists`);
+ try {
+ yield executeAzCliCommand(`cloud set -n AzureCloud`, true);
+ yield executeAzCliCommand(`cloud unregister -n "${environment}"`, false);
+ }
+ catch (error) {
+ console.log(`Ignore cloud not registered error: "${error}"`);
+ }
+ console.log(`Registering cloud: "${environment}" with ARM endpoint: "${resourceManagerEndpointUrl}"`);
+ try {
+ let baseUri = resourceManagerEndpointUrl;
+ if (baseUri.endsWith('/')) {
+ baseUri = baseUri.substring(0, baseUri.length - 1); // need to remove trailing / from resourceManagerEndpointUrl to correctly derive suffixes below
+ }
+ let suffixKeyvault = ".vault" + baseUri.substring(baseUri.indexOf('.')); // keyvault suffix starts with .
+ let suffixStorage = baseUri.substring(baseUri.indexOf('.') + 1); // storage suffix starts without .
+ let profileVersion = "2019-03-01-hybrid";
+ yield executeAzCliCommand(`cloud register -n "${environment}" --endpoint-resource-manager "${resourceManagerEndpointUrl}" --suffix-keyvault-dns "${suffixKeyvault}" --suffix-storage-endpoint "${suffixStorage}" --profile "${profileVersion}"`, false);
+ }
+ catch (error) {
+ core.error(`Error while trying to register cloud "${environment}": "${error}"`);
+ }
+ console.log(`Done registering cloud: "${environment}"`);
+ }
+ yield executeAzCliCommand(`cloud set -n "${environment}"`, false);
+ console.log(`Done setting cloud: "${environment}"`);
+ // Attempting Az cli login
+ if (allowNoSubscriptionsLogin) {
+ let args = [
+ "--allow-no-subscriptions",
+ "--service-principal",
+ "-u", servicePrincipalId,
+ "-p", servicePrincipalKey,
+ "--tenant", tenantId
+ ];
+ yield executeAzCliCommand(`login`, true, {}, args);
+ }
+ else {
+ let args = [
+ "--service-principal",
+ "-u", servicePrincipalId,
+ "-p", servicePrincipalKey,
+ "--tenant", tenantId
+ ];
+ yield executeAzCliCommand(`login`, true, {}, args);
+ args = [
+ "--subscription",
+ subscriptionId
+ ];
+ yield executeAzCliCommand(`account set`, true, {}, args);
+ }
+ isAzCLISuccess = true;
+ if (enableAzPSSession) {
+ // Attempting Az PS login
+ console.log(`Running Azure PS Login`);
+ const spnlogin = new ServicePrincipalLogin_1.ServicePrincipalLogin(servicePrincipalId, servicePrincipalKey, tenantId, subscriptionId, allowNoSubscriptionsLogin, environment, resourceManagerEndpointUrl);
+ yield spnlogin.initialize();
+ yield spnlogin.login();
+ }
+ console.log("Login successful.");
+ }
+ catch (error) {
+ if (!isAzCLISuccess) {
+ core.error("Az CLI Login failed. Please check the credentials. For more information refer https://aka.ms/create-secrets-for-GitHub-workflows");
+ }
+ else {
+ core.error(`Azure PowerShell Login failed. Please check the credentials. For more information refer https://aka.ms/create-secrets-for-GitHub-workflows"`);
+ }
+ core.setFailed(error);
+ }
+ finally {
+ // Reset AZURE_HTTP_USER_AGENT
+ core.exportVariable('AZURE_HTTP_USER_AGENT', prefix);
+ core.exportVariable('AZUREPS_HOST_ENVIRONMENT', azPSHostEnv);
+ }
+ });
+}
+exports.main = main;
+function executeAzCliCommand(command, silent, execOptions = {}, args = []) {
+ return __awaiter(this, void 0, void 0, function* () {
+ execOptions.silent = !!silent;
+ try {
+ yield exec.exec(`"${azPath}" ${command}`, args, execOptions);
+ }
+ catch (error) {
+ throw new Error(error);
+ }
+ });
+}
+exports.executeAzCliCommand = executeAzCliCommand;
+main();
diff --git a/node_modules/.bin/escodegen b/node_modules/.bin/escodegen
new file mode 100644
index 00000000..aa70e8b4
--- /dev/null
+++ b/node_modules/.bin/escodegen
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../escodegen/bin/escodegen.js" "$@"
+ ret=$?
+else
+ node "$basedir/../escodegen/bin/escodegen.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/escodegen.cmd b/node_modules/.bin/escodegen.cmd
new file mode 100644
index 00000000..6b7adbf3
--- /dev/null
+++ b/node_modules/.bin/escodegen.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\escodegen\bin\escodegen.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/escodegen.ps1 b/node_modules/.bin/escodegen.ps1
new file mode 100644
index 00000000..d4614ac5
--- /dev/null
+++ b/node_modules/.bin/escodegen.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../escodegen/bin/escodegen.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../escodegen/bin/escodegen.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/esgenerate b/node_modules/.bin/esgenerate
new file mode 100644
index 00000000..4a2495a6
--- /dev/null
+++ b/node_modules/.bin/esgenerate
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../escodegen/bin/esgenerate.js" "$@"
+ ret=$?
+else
+ node "$basedir/../escodegen/bin/esgenerate.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/esgenerate.cmd b/node_modules/.bin/esgenerate.cmd
new file mode 100644
index 00000000..4ad231e5
--- /dev/null
+++ b/node_modules/.bin/esgenerate.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\escodegen\bin\esgenerate.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/esgenerate.ps1 b/node_modules/.bin/esgenerate.ps1
new file mode 100644
index 00000000..eb4fc38f
--- /dev/null
+++ b/node_modules/.bin/esgenerate.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../escodegen/bin/esgenerate.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../escodegen/bin/esgenerate.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/actions-secret-parser/index.d.ts b/node_modules/actions-secret-parser/index.d.ts
new file mode 100644
index 00000000..a759a864
--- /dev/null
+++ b/node_modules/actions-secret-parser/index.d.ts
@@ -0,0 +1,24 @@
+export declare enum FormatType {
+ "JSON" = 0,
+ "XML" = 1
+}
+/**
+ * Takes content as string and format type (xml, json).
+ * Exposes getSecret method to get value of specific secret in object and set it as secret.
+ */
+export declare class SecretParser {
+ private dom;
+ private contentType;
+ constructor(content: string, contentType: FormatType);
+ /**
+ *
+ * @param key jsonpath or xpath depending on content type
+ * @param isSecret should the value parsed be a secret. Deafult: true
+ * @param variableName optional. If provided value will be exported with this variable name
+ * @returns a string value or empty string if key not found
+ */
+ getSecret(key: string, isSecret?: boolean, variableName?: string): string;
+ private extractJsonPath;
+ private extractXmlPath;
+ private handleSecret;
+}
diff --git a/node_modules/actions-secret-parser/index.js b/node_modules/actions-secret-parser/index.js
new file mode 100644
index 00000000..e079a554
--- /dev/null
+++ b/node_modules/actions-secret-parser/index.js
@@ -0,0 +1,91 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var core = require('@actions/core');
+var jp = require('jsonpath');
+var xpath = require('xpath');
+var domParser = require('xmldom').DOMParser;
+var FormatType;
+(function (FormatType) {
+ FormatType[FormatType["JSON"] = 0] = "JSON";
+ FormatType[FormatType["XML"] = 1] = "XML";
+})(FormatType = exports.FormatType || (exports.FormatType = {}));
+/**
+ * Takes content as string and format type (xml, json).
+ * Exposes getSecret method to get value of specific secret in object and set it as secret.
+ */
+class SecretParser {
+ constructor(content, contentType) {
+ switch (contentType) {
+ case FormatType.JSON:
+ try {
+ this.dom = JSON.parse(content);
+ }
+ catch (ex) {
+ throw new Error('Content is not a valid JSON object');
+ }
+ break;
+ case FormatType.XML:
+ try {
+ this.dom = new domParser().parseFromString(content);
+ }
+ catch (ex) {
+ throw new Error('Content is not a valid XML object');
+ }
+ break;
+ default:
+ throw new Error(`Given format: ${contentType} is not supported. Valid options are JSON, XML.`);
+ }
+ this.contentType = contentType;
+ }
+ /**
+ *
+ * @param key jsonpath or xpath depending on content type
+ * @param isSecret should the value parsed be a secret. Deafult: true
+ * @param variableName optional. If provided value will be exported with this variable name
+ * @returns a string value or empty string if key not found
+ */
+ getSecret(key, isSecret = true, variableName) {
+ let value = "";
+ switch (this.contentType) {
+ case FormatType.JSON:
+ value = this.extractJsonPath(key, isSecret, variableName);
+ break;
+ case FormatType.XML:
+ value = this.extractXmlPath(key, isSecret, variableName);
+ break;
+ }
+ return value;
+ }
+ extractJsonPath(key, isSecret = false, variableName) {
+ let value = jp.query(this.dom, key);
+ if (value.length == 0) {
+ core.debug("Cannot find key: " + key);
+ return "";
+ }
+ else if (value.length > 1) {
+ core.debug("Multiple values found for key: " + key + ". Please give jsonPath which points to a single value.");
+ return "";
+ }
+ return this.handleSecret(key, value[0], isSecret, variableName);
+ }
+ extractXmlPath(key, isSecret = false, variableName) {
+ let value = xpath.select("string(" + key + ")", this.dom);
+ return this.handleSecret(key, value, isSecret, variableName);
+ }
+ handleSecret(key, value, isSecret, variableName) {
+ if (!!value) {
+ if (isSecret) {
+ core.setSecret(value);
+ }
+ if (!!variableName) {
+ core.exportVariable(variableName, value);
+ }
+ return value;
+ }
+ else {
+ core.debug("Cannot find key: " + key);
+ return "";
+ }
+ }
+}
+exports.SecretParser = SecretParser;
diff --git a/node_modules/actions-secret-parser/package.json b/node_modules/actions-secret-parser/package.json
new file mode 100644
index 00000000..bdf7a30d
--- /dev/null
+++ b/node_modules/actions-secret-parser/package.json
@@ -0,0 +1,63 @@
+{
+ "_from": "actions-secret-parser",
+ "_id": "actions-secret-parser@1.0.3",
+ "_inBundle": false,
+ "_integrity": "sha512-+iGlMSsE/cbxDaEZlqR0NUjn35DckMYsdYFwVeZ7JRbtyO/AiBKnaScKkzkHSoiZ4nEPTdIHtMpRGVgoeVYX+A==",
+ "_location": "/actions-secret-parser",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "tag",
+ "registry": true,
+ "raw": "actions-secret-parser",
+ "name": "actions-secret-parser",
+ "escapedName": "actions-secret-parser",
+ "rawSpec": "",
+ "saveSpec": null,
+ "fetchSpec": "latest"
+ },
+ "_requiredBy": [
+ "#USER",
+ "/"
+ ],
+ "_resolved": "https://registry.npmjs.org/actions-secret-parser/-/actions-secret-parser-1.0.3.tgz",
+ "_shasum": "2574adaab76103ed0b3579546d85e0928c354034",
+ "_spec": "actions-secret-parser",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules",
+ "author": {
+ "name": "Sumiran Aggarwal",
+ "email": "suaggar@microsoft.com"
+ },
+ "bugs": {
+ "url": "https://github.com/Microsoft/pipelines-appservice-lib/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "@actions/core": "^1.1.3",
+ "jsonpath": "^1.0.2",
+ "xmldom": "^0.1.27",
+ "xpath": "0.0.27"
+ },
+ "deprecated": false,
+ "description": "Parse and set repository secrets",
+ "devDependencies": {
+ "typescript": "^3.6.3"
+ },
+ "homepage": "https://github.com/Microsoft/pipelines-appservice-lib/tree/master/packages/utility",
+ "keywords": [
+ "secret",
+ "actions"
+ ],
+ "license": "MIT",
+ "main": "lib/index.js",
+ "name": "actions-secret-parser",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Microsoft/pipelines-appservice-lib.git"
+ },
+ "scripts": {
+ "build": "tsc",
+ "copypackage": "copy package.json lib",
+ "dist": "npm run build && npm run copypackage && cd lib && npm publish"
+ },
+ "version": "1.0.3"
+}
diff --git a/node_modules/deep-is/.npmignore b/node_modules/deep-is/.npmignore
new file mode 100644
index 00000000..3c3629e6
--- /dev/null
+++ b/node_modules/deep-is/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/deep-is/.travis.yml b/node_modules/deep-is/.travis.yml
new file mode 100644
index 00000000..d523c5f5
--- /dev/null
+++ b/node_modules/deep-is/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
+ - 0.8
+ - 0.10
diff --git a/node_modules/deep-is/LICENSE b/node_modules/deep-is/LICENSE
new file mode 100644
index 00000000..c38f8407
--- /dev/null
+++ b/node_modules/deep-is/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012, 2013 Thorsten Lorenz
+Copyright (c) 2012 James Halliday
+Copyright (c) 2009 Thomas Robinson <280north.com>
+
+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/deep-is/README.markdown b/node_modules/deep-is/README.markdown
new file mode 100644
index 00000000..eb69a83b
--- /dev/null
+++ b/node_modules/deep-is/README.markdown
@@ -0,0 +1,70 @@
+deep-is
+==========
+
+Node's `assert.deepEqual() algorithm` as a standalone module. Exactly like
+[deep-equal](https://github.com/substack/node-deep-equal) except for the fact that `deepEqual(NaN, NaN) === true`.
+
+This module is around [5 times faster](https://gist.github.com/2790507)
+than wrapping `assert.deepEqual()` in a `try/catch`.
+
+[](http://ci.testling.com/thlorenz/deep-is)
+
+[](http://travis-ci.org/thlorenz/deep-is)
+
+example
+=======
+
+``` js
+var equal = require('deep-is');
+console.dir([
+ equal(
+ { a : [ 2, 3 ], b : [ 4 ] },
+ { a : [ 2, 3 ], b : [ 4 ] }
+ ),
+ equal(
+ { x : 5, y : [6] },
+ { x : 5, y : 6 }
+ )
+]);
+```
+
+methods
+=======
+
+var deepIs = require('deep-is')
+
+deepIs(a, b)
+---------------
+
+Compare objects `a` and `b`, returning whether they are equal according to a
+recursive equality algorithm.
+
+install
+=======
+
+With [npm](http://npmjs.org) do:
+
+```
+npm install deep-is
+```
+
+test
+====
+
+With [npm](http://npmjs.org) do:
+
+```
+npm test
+```
+
+license
+=======
+
+Copyright (c) 2012, 2013 Thorsten Lorenz
+Copyright (c) 2012 James Halliday
+
+Derived largely from node's assert module, which has the copyright statement:
+
+Copyright (c) 2009 Thomas Robinson <280north.com>
+
+Released under the MIT license, see LICENSE for details.
diff --git a/node_modules/deep-is/example/cmp.js b/node_modules/deep-is/example/cmp.js
new file mode 100644
index 00000000..67014b88
--- /dev/null
+++ b/node_modules/deep-is/example/cmp.js
@@ -0,0 +1,11 @@
+var equal = require('../');
+console.dir([
+ equal(
+ { a : [ 2, 3 ], b : [ 4 ] },
+ { a : [ 2, 3 ], b : [ 4 ] }
+ ),
+ equal(
+ { x : 5, y : [6] },
+ { x : 5, y : 6 }
+ )
+]);
diff --git a/node_modules/deep-is/index.js b/node_modules/deep-is/index.js
new file mode 100644
index 00000000..506fe279
--- /dev/null
+++ b/node_modules/deep-is/index.js
@@ -0,0 +1,102 @@
+var pSlice = Array.prototype.slice;
+var Object_keys = typeof Object.keys === 'function'
+ ? Object.keys
+ : function (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+ }
+;
+
+var deepEqual = module.exports = function (actual, expected) {
+ // enforce Object.is +0 !== -0
+ if (actual === 0 && expected === 0) {
+ return areZerosEqual(actual, expected);
+
+ // 7.1. All identical values are equivalent, as determined by ===.
+ } else if (actual === expected) {
+ return true;
+
+ } else if (actual instanceof Date && expected instanceof Date) {
+ return actual.getTime() === expected.getTime();
+
+ } else if (isNumberNaN(actual)) {
+ return isNumberNaN(expected);
+
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (typeof actual != 'object' && typeof expected != 'object') {
+ return actual == expected;
+
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected);
+ }
+};
+
+function isUndefinedOrNull(value) {
+ return value === null || value === undefined;
+}
+
+function isArguments(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function isNumberNaN(value) {
+ // NaN === NaN -> false
+ return typeof value == 'number' && value !== value;
+}
+
+function areZerosEqual(zeroA, zeroB) {
+ // (1 / +0|0) -> Infinity, but (1 / -0) -> -Infinity and (Infinity !== -Infinity)
+ return (1 / zeroA) === (1 / zeroB);
+}
+
+function objEquiv(a, b) {
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
+ return false;
+
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ //~~~I've managed to break Object.keys through screwy arguments passing.
+ // Converting to array solves the problem.
+ if (isArguments(a)) {
+ if (!isArguments(b)) {
+ return false;
+ }
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return deepEqual(a, b);
+ }
+ try {
+ var ka = Object_keys(a),
+ kb = Object_keys(b),
+ key, i;
+ } catch (e) {//happens when one is a string literal and the other isn't
+ return false;
+ }
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!deepEqual(a[key], b[key])) return false;
+ }
+ return true;
+}
diff --git a/node_modules/deep-is/package.json b/node_modules/deep-is/package.json
new file mode 100644
index 00000000..ed4b0033
--- /dev/null
+++ b/node_modules/deep-is/package.json
@@ -0,0 +1,90 @@
+{
+ "_from": "deep-is@~0.1.3",
+ "_id": "deep-is@0.1.3",
+ "_inBundle": false,
+ "_integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "_location": "/deep-is",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "deep-is@~0.1.3",
+ "name": "deep-is",
+ "escapedName": "deep-is",
+ "rawSpec": "~0.1.3",
+ "saveSpec": null,
+ "fetchSpec": "~0.1.3"
+ },
+ "_requiredBy": [
+ "/optionator"
+ ],
+ "_resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "_shasum": "b369d6fb5dbc13eecf524f91b070feedc357cf34",
+ "_spec": "deep-is@~0.1.3",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\optionator",
+ "author": {
+ "name": "Thorsten Lorenz",
+ "email": "thlorenz@gmx.de",
+ "url": "http://thlorenz.com"
+ },
+ "bugs": {
+ "url": "https://github.com/thlorenz/deep-is/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "node's assert.deepEqual algorithm except for NaN being equal to NaN",
+ "devDependencies": {
+ "tape": "~1.0.2"
+ },
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "homepage": "https://github.com/thlorenz/deep-is#readme",
+ "keywords": [
+ "equality",
+ "equal",
+ "compare"
+ ],
+ "license": {
+ "type": "MIT",
+ "url": "https://github.com/thlorenz/deep-is/blob/master/LICENSE"
+ },
+ "main": "index.js",
+ "name": "deep-is",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/thlorenz/deep-is.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": {
+ "ie": [
+ 6,
+ 7,
+ 8,
+ 9
+ ],
+ "ff": [
+ 3.5,
+ 10,
+ 15
+ ],
+ "chrome": [
+ 10,
+ 22
+ ],
+ "safari": [
+ 5.1
+ ],
+ "opera": [
+ 12
+ ]
+ }
+ },
+ "version": "0.1.3"
+}
diff --git a/node_modules/deep-is/test/NaN.js b/node_modules/deep-is/test/NaN.js
new file mode 100644
index 00000000..ddaa5a77
--- /dev/null
+++ b/node_modules/deep-is/test/NaN.js
@@ -0,0 +1,16 @@
+var test = require('tape');
+var equal = require('../');
+
+test('NaN and 0 values', function (t) {
+ t.ok(equal(NaN, NaN));
+ t.notOk(equal(0, NaN));
+ t.ok(equal(0, 0));
+ t.notOk(equal(0, 1));
+ t.end();
+});
+
+
+test('nested NaN values', function (t) {
+ t.ok(equal([ NaN, 1, NaN ], [ NaN, 1, NaN ]));
+ t.end();
+});
diff --git a/node_modules/deep-is/test/cmp.js b/node_modules/deep-is/test/cmp.js
new file mode 100644
index 00000000..30710134
--- /dev/null
+++ b/node_modules/deep-is/test/cmp.js
@@ -0,0 +1,23 @@
+var test = require('tape');
+var equal = require('../');
+
+test('equal', function (t) {
+ t.ok(equal(
+ { a : [ 2, 3 ], b : [ 4 ] },
+ { a : [ 2, 3 ], b : [ 4 ] }
+ ));
+ t.end();
+});
+
+test('not equal', function (t) {
+ t.notOk(equal(
+ { x : 5, y : [6] },
+ { x : 5, y : 6 }
+ ));
+ t.end();
+});
+
+test('nested nulls', function (t) {
+ t.ok(equal([ null, null, null ], [ null, null, null ]));
+ t.end();
+});
diff --git a/node_modules/deep-is/test/neg-vs-pos-0.js b/node_modules/deep-is/test/neg-vs-pos-0.js
new file mode 100644
index 00000000..ac26130e
--- /dev/null
+++ b/node_modules/deep-is/test/neg-vs-pos-0.js
@@ -0,0 +1,15 @@
+var test = require('tape');
+var equal = require('../');
+
+test('0 values', function (t) {
+ t.ok(equal( 0, 0), ' 0 === 0');
+ t.ok(equal( 0, +0), ' 0 === +0');
+ t.ok(equal(+0, +0), '+0 === +0');
+ t.ok(equal(-0, -0), '-0 === -0');
+
+ t.notOk(equal(-0, 0), '-0 !== 0');
+ t.notOk(equal(-0, +0), '-0 !== +0');
+
+ t.end();
+});
+
diff --git a/node_modules/escodegen/LICENSE.BSD b/node_modules/escodegen/LICENSE.BSD
new file mode 100644
index 00000000..426019dc
--- /dev/null
+++ b/node_modules/escodegen/LICENSE.BSD
@@ -0,0 +1,21 @@
+Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors.
+
+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.
+
+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 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/escodegen/README.md b/node_modules/escodegen/README.md
new file mode 100644
index 00000000..c4917b82
--- /dev/null
+++ b/node_modules/escodegen/README.md
@@ -0,0 +1,84 @@
+## Escodegen
+[](http://badge.fury.io/js/escodegen)
+[](http://travis-ci.org/estools/escodegen)
+[](https://david-dm.org/estools/escodegen)
+[](https://david-dm.org/estools/escodegen#info=devDependencies)
+
+Escodegen ([escodegen](http://github.com/estools/escodegen)) is an
+[ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
+(also popularly known as [JavaScript](http://en.wikipedia.org/wiki/JavaScript))
+code generator from [Mozilla's Parser API](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)
+AST. See the [online generator](https://estools.github.io/escodegen/demo/index.html)
+for a demo.
+
+
+### Install
+
+Escodegen can be used in a web browser:
+
+
+
+escodegen.browser.js can be found in tagged revisions on GitHub.
+
+Or in a Node.js application via npm:
+
+ npm install escodegen
+
+### Usage
+
+A simple example: the program
+
+ escodegen.generate({
+ type: 'BinaryExpression',
+ operator: '+',
+ left: { type: 'Literal', value: 40 },
+ right: { type: 'Literal', value: 2 }
+ });
+
+produces the string `'40 + 2'`.
+
+See the [API page](https://github.com/estools/escodegen/wiki/API) for
+options. To run the tests, execute `npm test` in the root directory.
+
+### Building browser bundle / minified browser bundle
+
+At first, execute `npm install` to install the all dev dependencies.
+After that,
+
+ npm run-script build
+
+will generate `escodegen.browser.js`, which can be used in browser environments.
+
+And,
+
+ npm run-script build-min
+
+will generate the minified file `escodegen.browser.min.js`.
+
+### License
+
+#### Escodegen
+
+Copyright (C) 2012 [Yusuke Suzuki](http://github.com/Constellation)
+ (twitter: [@Constellation](http://twitter.com/Constellation)) and other contributors.
+
+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.
+
+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 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/escodegen/escodegen.js b/node_modules/escodegen/escodegen.js
new file mode 100644
index 00000000..4c055b88
--- /dev/null
+++ b/node_modules/escodegen/escodegen.js
@@ -0,0 +1,2626 @@
+/*
+ Copyright (C) 2012-2014 Yusuke Suzuki
+ Copyright (C) 2015 Ingvar Stepanyan
+ Copyright (C) 2014 Ivan Nikulin
+ Copyright (C) 2012-2013 Michael Ficarra
+ Copyright (C) 2012-2013 Mathias Bynens
+ Copyright (C) 2013 Irakli Gozalishvili
+ Copyright (C) 2012 Robert Gust-Bardon
+ Copyright (C) 2012 John Freeman
+ Copyright (C) 2011-2012 Ariya Hidayat
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Kris Kowal
+ Copyright (C) 2012 Arpad Borsos
+
+ 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.
+
+ 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 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.
+*/
+
+/*global exports:true, require:true, global:true*/
+(function () {
+ 'use strict';
+
+ var Syntax,
+ Precedence,
+ BinaryPrecedence,
+ SourceNode,
+ estraverse,
+ esutils,
+ base,
+ indent,
+ json,
+ renumber,
+ hexadecimal,
+ quotes,
+ escapeless,
+ newline,
+ space,
+ parentheses,
+ semicolons,
+ safeConcatenation,
+ directive,
+ extra,
+ parse,
+ sourceMap,
+ sourceCode,
+ preserveBlankLines,
+ FORMAT_MINIFY,
+ FORMAT_DEFAULTS;
+
+ estraverse = require('estraverse');
+ esutils = require('esutils');
+
+ Syntax = estraverse.Syntax;
+
+ // Generation is done by generateExpression.
+ function isExpression(node) {
+ return CodeGenerator.Expression.hasOwnProperty(node.type);
+ }
+
+ // Generation is done by generateStatement.
+ function isStatement(node) {
+ return CodeGenerator.Statement.hasOwnProperty(node.type);
+ }
+
+ Precedence = {
+ Sequence: 0,
+ Yield: 1,
+ Assignment: 1,
+ Conditional: 2,
+ ArrowFunction: 2,
+ LogicalOR: 3,
+ LogicalAND: 4,
+ BitwiseOR: 5,
+ BitwiseXOR: 6,
+ BitwiseAND: 7,
+ Equality: 8,
+ Relational: 9,
+ BitwiseSHIFT: 10,
+ Additive: 11,
+ Multiplicative: 12,
+ Exponentiation: 13,
+ Await: 14,
+ Unary: 14,
+ Postfix: 15,
+ Call: 16,
+ New: 17,
+ TaggedTemplate: 18,
+ Member: 19,
+ Primary: 20
+ };
+
+ BinaryPrecedence = {
+ '||': Precedence.LogicalOR,
+ '&&': Precedence.LogicalAND,
+ '|': Precedence.BitwiseOR,
+ '^': Precedence.BitwiseXOR,
+ '&': Precedence.BitwiseAND,
+ '==': Precedence.Equality,
+ '!=': Precedence.Equality,
+ '===': Precedence.Equality,
+ '!==': Precedence.Equality,
+ 'is': Precedence.Equality,
+ 'isnt': Precedence.Equality,
+ '<': Precedence.Relational,
+ '>': Precedence.Relational,
+ '<=': Precedence.Relational,
+ '>=': Precedence.Relational,
+ 'in': Precedence.Relational,
+ 'instanceof': Precedence.Relational,
+ '<<': Precedence.BitwiseSHIFT,
+ '>>': Precedence.BitwiseSHIFT,
+ '>>>': Precedence.BitwiseSHIFT,
+ '+': Precedence.Additive,
+ '-': Precedence.Additive,
+ '*': Precedence.Multiplicative,
+ '%': Precedence.Multiplicative,
+ '/': Precedence.Multiplicative,
+ '**': Precedence.Exponentiation
+ };
+
+ //Flags
+ var F_ALLOW_IN = 1,
+ F_ALLOW_CALL = 1 << 1,
+ F_ALLOW_UNPARATH_NEW = 1 << 2,
+ F_FUNC_BODY = 1 << 3,
+ F_DIRECTIVE_CTX = 1 << 4,
+ F_SEMICOLON_OPT = 1 << 5;
+
+ //Expression flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_ALLOW_CALL
+ // F_ALLOW_UNPARATH_NEW
+ var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TTF = F_ALLOW_IN | F_ALLOW_CALL,
+ E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TFF = F_ALLOW_IN,
+ E_FFT = F_ALLOW_UNPARATH_NEW,
+ E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;
+
+ //Statement flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_FUNC_BODY
+ // F_DIRECTIVE_CTX
+ // F_SEMICOLON_OPT
+ var S_TFFF = F_ALLOW_IN,
+ S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,
+ S_FFFF = 0x00,
+ S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,
+ S_TTFF = F_ALLOW_IN | F_FUNC_BODY;
+
+ function getDefaultOptions() {
+ // default options
+ return {
+ indent: null,
+ base: null,
+ parse: null,
+ comment: false,
+ format: {
+ indent: {
+ style: ' ',
+ base: 0,
+ adjustMultilineComment: false
+ },
+ newline: '\n',
+ space: ' ',
+ json: false,
+ renumber: false,
+ hexadecimal: false,
+ quotes: 'single',
+ escapeless: false,
+ compact: false,
+ parentheses: true,
+ semicolons: true,
+ safeConcatenation: false,
+ preserveBlankLines: false
+ },
+ moz: {
+ comprehensionExpressionStartsWithAssignment: false,
+ starlessGenerator: false
+ },
+ sourceMap: null,
+ sourceMapRoot: null,
+ sourceMapWithCode: false,
+ directive: false,
+ raw: true,
+ verbatim: null,
+ sourceCode: null
+ };
+ }
+
+ function stringRepeat(str, num) {
+ var result = '';
+
+ for (num |= 0; num > 0; num >>>= 1, str += str) {
+ if (num & 1) {
+ result += str;
+ }
+ }
+
+ return result;
+ }
+
+ function hasLineTerminator(str) {
+ return (/[\r\n]/g).test(str);
+ }
+
+ function endsWithLineTerminator(str) {
+ var len = str.length;
+ return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));
+ }
+
+ function merge(target, override) {
+ var key;
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ target[key] = override[key];
+ }
+ }
+ return target;
+ }
+
+ function updateDeeply(target, override) {
+ var key, val;
+
+ function isHashObject(target) {
+ return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);
+ }
+
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ val = override[key];
+ if (isHashObject(val)) {
+ if (isHashObject(target[key])) {
+ updateDeeply(target[key], val);
+ } else {
+ target[key] = updateDeeply({}, val);
+ }
+ } else {
+ target[key] = val;
+ }
+ }
+ }
+ return target;
+ }
+
+ function generateNumber(value) {
+ var result, point, temp, exponent, pos;
+
+ if (value !== value) {
+ throw new Error('Numeric literal whose value is NaN');
+ }
+ if (value < 0 || (value === 0 && 1 / value < 0)) {
+ throw new Error('Numeric literal whose value is negative');
+ }
+
+ if (value === 1 / 0) {
+ return json ? 'null' : renumber ? '1e400' : '1e+400';
+ }
+
+ result = '' + value;
+ if (!renumber || result.length < 3) {
+ return result;
+ }
+
+ point = result.indexOf('.');
+ if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) {
+ point = 0;
+ result = result.slice(1);
+ }
+ temp = result;
+ result = result.replace('e+', 'e');
+ exponent = 0;
+ if ((pos = temp.indexOf('e')) > 0) {
+ exponent = +temp.slice(pos + 1);
+ temp = temp.slice(0, pos);
+ }
+ if (point >= 0) {
+ exponent -= temp.length - point - 1;
+ temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';
+ }
+ pos = 0;
+ while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) {
+ --pos;
+ }
+ if (pos !== 0) {
+ exponent -= pos;
+ temp = temp.slice(0, pos);
+ }
+ if (exponent !== 0) {
+ temp += 'e' + exponent;
+ }
+ if ((temp.length < result.length ||
+ (hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&
+ +temp === value) {
+ result = temp;
+ }
+
+ return result;
+ }
+
+ // Generate valid RegExp expression.
+ // This function is based on https://github.com/Constellation/iv Engine
+
+ function escapeRegExpCharacter(ch, previousIsBackslash) {
+ // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
+ if ((ch & ~1) === 0x2028) {
+ return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
+ } else if (ch === 10 || ch === 13) { // \n, \r
+ return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
+ }
+ return String.fromCharCode(ch);
+ }
+
+ function generateRegExp(reg) {
+ var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;
+
+ result = reg.toString();
+
+ if (reg.source) {
+ // extract flag from toString result
+ match = result.match(/\/([^/]*)$/);
+ if (!match) {
+ return result;
+ }
+
+ flags = match[1];
+ result = '';
+
+ characterInBrack = false;
+ previousIsBackslash = false;
+ for (i = 0, iz = reg.source.length; i < iz; ++i) {
+ ch = reg.source.charCodeAt(i);
+
+ if (!previousIsBackslash) {
+ if (characterInBrack) {
+ if (ch === 93) { // ]
+ characterInBrack = false;
+ }
+ } else {
+ if (ch === 47) { // /
+ result += '\\';
+ } else if (ch === 91) { // [
+ characterInBrack = true;
+ }
+ }
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ previousIsBackslash = ch === 92; // \
+ } else {
+ // if new RegExp("\\\n') is provided, create /\n/
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ // prevent like /\\[/]/
+ previousIsBackslash = false;
+ }
+ }
+
+ return '/' + result + '/' + flags;
+ }
+
+ return result;
+ }
+
+ function escapeAllowedCharacter(code, next) {
+ var hex;
+
+ if (code === 0x08 /* \b */) {
+ return '\\b';
+ }
+
+ if (code === 0x0C /* \f */) {
+ return '\\f';
+ }
+
+ if (code === 0x09 /* \t */) {
+ return '\\t';
+ }
+
+ hex = code.toString(16).toUpperCase();
+ if (json || code > 0xFF) {
+ return '\\u' + '0000'.slice(hex.length) + hex;
+ } else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {
+ return '\\0';
+ } else if (code === 0x000B /* \v */) { // '\v'
+ return '\\x0B';
+ } else {
+ return '\\x' + '00'.slice(hex.length) + hex;
+ }
+ }
+
+ function escapeDisallowedCharacter(code) {
+ if (code === 0x5C /* \ */) {
+ return '\\\\';
+ }
+
+ if (code === 0x0A /* \n */) {
+ return '\\n';
+ }
+
+ if (code === 0x0D /* \r */) {
+ return '\\r';
+ }
+
+ if (code === 0x2028) {
+ return '\\u2028';
+ }
+
+ if (code === 0x2029) {
+ return '\\u2029';
+ }
+
+ throw new Error('Incorrectly classified character');
+ }
+
+ function escapeDirective(str) {
+ var i, iz, code, quote;
+
+ quote = quotes === 'double' ? '"' : '\'';
+ for (i = 0, iz = str.length; i < iz; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ quote = '"';
+ break;
+ } else if (code === 0x22 /* " */) {
+ quote = '\'';
+ break;
+ } else if (code === 0x5C /* \ */) {
+ ++i;
+ }
+ }
+
+ return quote + str + quote;
+ }
+
+ function escapeString(str) {
+ var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ ++singleQuotes;
+ } else if (code === 0x22 /* " */) {
+ ++doubleQuotes;
+ } else if (code === 0x2F /* / */ && json) {
+ result += '\\';
+ } else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) {
+ result += escapeDisallowedCharacter(code);
+ continue;
+ } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20 /* SP */ || !json && !escapeless && (code < 0x20 /* SP */ || code > 0x7E /* ~ */))) {
+ result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));
+ continue;
+ }
+ result += String.fromCharCode(code);
+ }
+
+ single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));
+ quote = single ? '\'' : '"';
+
+ if (!(single ? singleQuotes : doubleQuotes)) {
+ return quote + result + quote;
+ }
+
+ str = result;
+ result = quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) {
+ result += '\\';
+ }
+ result += String.fromCharCode(code);
+ }
+
+ return result + quote;
+ }
+
+ /**
+ * flatten an array to a string, where the array can contain
+ * either strings or nested arrays
+ */
+ function flattenToString(arr) {
+ var i, iz, elem, result = '';
+ for (i = 0, iz = arr.length; i < iz; ++i) {
+ elem = arr[i];
+ result += Array.isArray(elem) ? flattenToString(elem) : elem;
+ }
+ return result;
+ }
+
+ /**
+ * convert generated to a SourceNode when source maps are enabled.
+ */
+ function toSourceNodeWhenNeeded(generated, node) {
+ if (!sourceMap) {
+ // with no source maps, generated is either an
+ // array or a string. if an array, flatten it.
+ // if a string, just return it
+ if (Array.isArray(generated)) {
+ return flattenToString(generated);
+ } else {
+ return generated;
+ }
+ }
+ if (node == null) {
+ if (generated instanceof SourceNode) {
+ return generated;
+ } else {
+ node = {};
+ }
+ }
+ if (node.loc == null) {
+ return new SourceNode(null, null, sourceMap, generated, node.name || null);
+ }
+ return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap === true ? node.loc.source || null : sourceMap), generated, node.name || null);
+ }
+
+ function noEmptySpace() {
+ return (space) ? space : ' ';
+ }
+
+ function join(left, right) {
+ var leftSource,
+ rightSource,
+ leftCharCode,
+ rightCharCode;
+
+ leftSource = toSourceNodeWhenNeeded(left).toString();
+ if (leftSource.length === 0) {
+ return [right];
+ }
+
+ rightSource = toSourceNodeWhenNeeded(right).toString();
+ if (rightSource.length === 0) {
+ return [left];
+ }
+
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = rightSource.charCodeAt(0);
+
+ if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode ||
+ esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) ||
+ leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i`
+ return [left, noEmptySpace(), right];
+ } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||
+ esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {
+ return [left, right];
+ }
+ return [left, space, right];
+ }
+
+ function addIndent(stmt) {
+ return [base, stmt];
+ }
+
+ function withIndent(fn) {
+ var previousBase;
+ previousBase = base;
+ base += indent;
+ fn(base);
+ base = previousBase;
+ }
+
+ function calculateSpaces(str) {
+ var i;
+ for (i = str.length - 1; i >= 0; --i) {
+ if (esutils.code.isLineTerminator(str.charCodeAt(i))) {
+ break;
+ }
+ }
+ return (str.length - 1) - i;
+ }
+
+ function adjustMultilineComment(value, specialBase) {
+ var array, i, len, line, j, spaces, previousBase, sn;
+
+ array = value.split(/\r\n|[\r\n]/);
+ spaces = Number.MAX_VALUE;
+
+ // first line doesn't have indentation
+ for (i = 1, len = array.length; i < len; ++i) {
+ line = array[i];
+ j = 0;
+ while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {
+ ++j;
+ }
+ if (spaces > j) {
+ spaces = j;
+ }
+ }
+
+ if (typeof specialBase !== 'undefined') {
+ // pattern like
+ // {
+ // var t = 20; /*
+ // * this is comment
+ // */
+ // }
+ previousBase = base;
+ if (array[1][spaces] === '*') {
+ specialBase += ' ';
+ }
+ base = specialBase;
+ } else {
+ if (spaces & 1) {
+ // /*
+ // *
+ // */
+ // If spaces are odd number, above pattern is considered.
+ // We waste 1 space.
+ --spaces;
+ }
+ previousBase = base;
+ }
+
+ for (i = 1, len = array.length; i < len; ++i) {
+ sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));
+ array[i] = sourceMap ? sn.join('') : sn;
+ }
+
+ base = previousBase;
+
+ return array.join('\n');
+ }
+
+ function generateComment(comment, specialBase) {
+ if (comment.type === 'Line') {
+ if (endsWithLineTerminator(comment.value)) {
+ return '//' + comment.value;
+ } else {
+ // Always use LineTerminator
+ var result = '//' + comment.value;
+ if (!preserveBlankLines) {
+ result += '\n';
+ }
+ return result;
+ }
+ }
+ if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {
+ return adjustMultilineComment('/*' + comment.value + '*/', specialBase);
+ }
+ return '/*' + comment.value + '*/';
+ }
+
+ function addComments(stmt, result) {
+ var i, len, comment, save, tailingToStatement, specialBase, fragment,
+ extRange, range, prevRange, prefix, infix, suffix, count;
+
+ if (stmt.leadingComments && stmt.leadingComments.length > 0) {
+ save = result;
+
+ if (preserveBlankLines) {
+ comment = stmt.leadingComments[0];
+ result = [];
+
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+
+ prevRange = range;
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; i++) {
+ comment = stmt.leadingComments[i];
+ range = comment.range;
+
+ infix = sourceCode.substring(prevRange[1], range[0]);
+ count = (infix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+
+ prevRange = range;
+ }
+
+ suffix = sourceCode.substring(range[1], extRange[1]);
+ count = (suffix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ } else {
+ comment = stmt.leadingComments[0];
+ result = [];
+ if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {
+ result.push('\n');
+ }
+ result.push(generateComment(comment));
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push('\n');
+ }
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {
+ comment = stmt.leadingComments[i];
+ fragment = [generateComment(comment)];
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ fragment.push('\n');
+ }
+ result.push(addIndent(fragment));
+ }
+ }
+
+ result.push(addIndent(save));
+ }
+
+ if (stmt.trailingComments) {
+
+ if (preserveBlankLines) {
+ comment = stmt.trailingComments[0];
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+ } else {
+ tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));
+ for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {
+ comment = stmt.trailingComments[i];
+ if (tailingToStatement) {
+ // We assume target like following script
+ //
+ // var t = 20; /**
+ // * This is comment of t
+ // */
+ if (i === 0) {
+ // first case
+ result = [result, indent];
+ } else {
+ result = [result, specialBase];
+ }
+ result.push(generateComment(comment, specialBase));
+ } else {
+ result = [result, addIndent(generateComment(comment))];
+ }
+ if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result = [result, '\n'];
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ function generateBlankLines(start, end, result) {
+ var j, newlineCount = 0;
+
+ for (j = start; j < end; j++) {
+ if (sourceCode[j] === '\n') {
+ newlineCount++;
+ }
+ }
+
+ for (j = 1; j < newlineCount; j++) {
+ result.push(newline);
+ }
+ }
+
+ function parenthesize(text, current, should) {
+ if (current < should) {
+ return ['(', text, ')'];
+ }
+ return text;
+ }
+
+ function generateVerbatimString(string) {
+ var i, iz, result;
+ result = string.split(/\r\n|\n/);
+ for (i = 1, iz = result.length; i < iz; i++) {
+ result[i] = newline + base + result[i];
+ }
+ return result;
+ }
+
+ function generateVerbatim(expr, precedence) {
+ var verbatim, result, prec;
+ verbatim = expr[extra.verbatim];
+
+ if (typeof verbatim === 'string') {
+ result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);
+ } else {
+ // verbatim is object
+ result = generateVerbatimString(verbatim.content);
+ prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;
+ result = parenthesize(result, prec, precedence);
+ }
+
+ return toSourceNodeWhenNeeded(result, expr);
+ }
+
+ function CodeGenerator() {
+ }
+
+ // Helpers.
+
+ CodeGenerator.prototype.maybeBlock = function(stmt, flags) {
+ var result, noLeadingComment, that = this;
+
+ noLeadingComment = !extra.comment || !stmt.leadingComments;
+
+ if (stmt.type === Syntax.BlockStatement && noLeadingComment) {
+ return [space, this.generateStatement(stmt, flags)];
+ }
+
+ if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {
+ return ';';
+ }
+
+ withIndent(function () {
+ result = [
+ newline,
+ addIndent(that.generateStatement(stmt, flags))
+ ];
+ });
+
+ return result;
+ };
+
+ CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {
+ var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {
+ return [result, space];
+ }
+ if (ends) {
+ return [result, base];
+ }
+ return [result, newline, base];
+ };
+
+ function generateIdentifier(node) {
+ return toSourceNodeWhenNeeded(node.name, node);
+ }
+
+ function generateAsyncPrefix(node, spaceRequired) {
+ return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
+ }
+
+ function generateStarSuffix(node) {
+ var isGenerator = node.generator && !extra.moz.starlessGenerator;
+ return isGenerator ? '*' + space : '';
+ }
+
+ function generateMethodPrefix(prop) {
+ var func = prop.value, prefix = '';
+ if (func.async) {
+ prefix += generateAsyncPrefix(func, !prop.computed);
+ }
+ if (func.generator) {
+ // avoid space before method name
+ prefix += generateStarSuffix(func) ? '*' : '';
+ }
+ return prefix;
+ }
+
+ CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
+ if (node.type === Syntax.Identifier) {
+ return generateIdentifier(node);
+ }
+ return this.generateExpression(node, precedence, flags);
+ };
+
+ CodeGenerator.prototype.generateFunctionParams = function (node) {
+ var i, iz, result, hasDefault;
+
+ hasDefault = false;
+
+ if (node.type === Syntax.ArrowFunctionExpression &&
+ !node.rest && (!node.defaults || node.defaults.length === 0) &&
+ node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
+ // arg => { } case
+ result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
+ } else {
+ result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
+ result.push('(');
+ if (node.defaults) {
+ hasDefault = true;
+ }
+ for (i = 0, iz = node.params.length; i < iz; ++i) {
+ if (hasDefault && node.defaults[i]) {
+ // Handle default values.
+ result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));
+ } else {
+ result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+
+ if (node.rest) {
+ if (node.params.length) {
+ result.push(',' + space);
+ }
+ result.push('...');
+ result.push(generateIdentifier(node.rest));
+ }
+
+ result.push(')');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateFunctionBody = function (node) {
+ var result, expr;
+
+ result = this.generateFunctionParams(node);
+
+ if (node.type === Syntax.ArrowFunctionExpression) {
+ result.push(space);
+ result.push('=>');
+ }
+
+ if (node.expression) {
+ result.push(space);
+ expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);
+ if (expr.toString().charAt(0) === '{') {
+ expr = ['(', expr, ')'];
+ }
+ result.push(expr);
+ } else {
+ result.push(this.maybeBlock(node.body, S_TTFF));
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {
+ var result = ['for' + (stmt.await ? noEmptySpace() + 'await' : '') + space + '('], that = this;
+ withIndent(function () {
+ if (stmt.left.type === Syntax.VariableDeclaration) {
+ withIndent(function () {
+ result.push(stmt.left.kind + noEmptySpace());
+ result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));
+ });
+ } else {
+ result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
+ }
+
+ result = join(result, operator);
+ result = [join(
+ result,
+ that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
+ ), ')'];
+ });
+ result.push(this.maybeBlock(stmt.body, flags));
+ return result;
+ };
+
+ CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {
+ var result = [];
+
+ if (computed) {
+ result.push('[');
+ }
+
+ result.push(this.generateExpression(expr, Precedence.Assignment, E_TTT));
+
+ if (computed) {
+ result.push(']');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {
+ if (Precedence.Assignment < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ return parenthesize(
+ [
+ this.generateExpression(left, Precedence.Call, flags),
+ space + operator + space,
+ this.generateExpression(right, Precedence.Assignment, flags)
+ ],
+ Precedence.Assignment,
+ precedence
+ );
+ };
+
+ CodeGenerator.prototype.semicolon = function (flags) {
+ if (!semicolons && flags & F_SEMICOLON_OPT) {
+ return '';
+ }
+ return ';';
+ };
+
+ // Statements.
+
+ CodeGenerator.Statement = {
+
+ BlockStatement: function (stmt, flags) {
+ var range, content, result = ['{', newline], that = this;
+
+ withIndent(function () {
+ // handle functions without any code
+ if (stmt.body.length === 0 && preserveBlankLines) {
+ range = stmt.range;
+ if (range[1] - range[0] > 2) {
+ content = sourceCode.substring(range[0] + 1, range[1] - 1);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ result.push(content);
+ }
+ }
+
+ var i, iz, fragment, bodyFlags;
+ bodyFlags = S_TFFF;
+ if (flags & F_FUNC_BODY) {
+ bodyFlags |= F_DIRECTIVE_CTX;
+ }
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (stmt.body[0].leadingComments) {
+ range = stmt.body[0].leadingComments[0].extendedRange;
+ content = sourceCode.substring(range[0], range[1]);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ }
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (stmt.body[i].leadingComments && preserveBlankLines) {
+ fragment = that.generateStatement(stmt.body[i], bodyFlags);
+ } else {
+ fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));
+ }
+
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines && i < iz - 1) {
+ // don't add a new line if there are leading coments
+ // in the next statement
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ });
+
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ BreakStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'break ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'break' + this.semicolon(flags);
+ },
+
+ ContinueStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'continue ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'continue' + this.semicolon(flags);
+ },
+
+ ClassBody: function (stmt, flags) {
+ var result = [ '{', newline], that = this;
+
+ withIndent(function (indent) {
+ var i, iz;
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(newline);
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ ClassDeclaration: function (stmt, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (stmt.id) {
+ result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
+ }
+ if (stmt.superClass) {
+ fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(stmt.body, S_TFFT));
+ return result;
+ },
+
+ DirectiveStatement: function (stmt, flags) {
+ if (extra.raw && stmt.raw) {
+ return stmt.raw + this.semicolon(flags);
+ }
+ return escapeDirective(stmt.directive) + this.semicolon(flags);
+ },
+
+ DoWhileStatement: function (stmt, flags) {
+ // Because `do 42 while (cond)` is Syntax Error. We need semicolon.
+ var result = join('do', this.maybeBlock(stmt.body, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.body, result);
+ return join(result, [
+ 'while' + space + '(',
+ this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')' + this.semicolon(flags)
+ ]);
+ },
+
+ CatchClause: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ var guard;
+
+ if (stmt.param) {
+ result = [
+ 'catch' + space + '(',
+ that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+
+ if (stmt.guard) {
+ guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);
+ result.splice(2, 0, ' if ', guard);
+ }
+ } else {
+ result = ['catch'];
+ }
+ });
+ result.push(this.maybeBlock(stmt.body, S_TFFF));
+ return result;
+ },
+
+ DebuggerStatement: function (stmt, flags) {
+ return 'debugger' + this.semicolon(flags);
+ },
+
+ EmptyStatement: function (stmt, flags) {
+ return ';';
+ },
+
+ ExportDefaultDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export default HoistableDeclaration[Default]
+ // export default AssignmentExpression[In] ;
+ result = join(result, 'default');
+ if (isStatement(stmt.declaration)) {
+ result = join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ } else {
+ result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ExportNamedDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags, that = this;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export VariableStatement
+ // export Declaration[Default]
+ if (stmt.declaration) {
+ return join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ }
+
+ // export ExportClause[NoReference] FromClause ;
+ // export ExportClause ;
+ if (stmt.specifiers) {
+ if (stmt.specifiers.length === 0) {
+ result = join(result, '{' + space + '}');
+ } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
+ result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
+ } else {
+ result = join(result, '{');
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}');
+ }
+
+ if (stmt.source) {
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ }
+ return result;
+ },
+
+ ExportAllDeclaration: function (stmt, flags) {
+ // export * FromClause ;
+ return [
+ 'export' + space,
+ '*' + space,
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ },
+
+ ExpressionStatement: function (stmt, flags) {
+ var result, fragment;
+
+ function isClassPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 5) !== 'class') {
+ return false;
+ }
+ code = fragment.charCodeAt(5);
+ return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);
+ }
+
+ function isFunctionPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ function isAsyncPrefixed(fragment) {
+ var code, i, iz;
+ if (fragment.slice(0, 5) !== 'async') {
+ return false;
+ }
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {
+ return false;
+ }
+ for (i = 6, iz = fragment.length; i < iz; ++i) {
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {
+ break;
+ }
+ }
+ if (i === iz) {
+ return false;
+ }
+ if (fragment.slice(i, i + 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(i + 8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];
+ // 12.4 '{', 'function', 'class' is not allowed in this position.
+ // wrap expression with parentheses
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression
+ isClassPrefixed(fragment) ||
+ isFunctionPrefixed(fragment) ||
+ isAsyncPrefixed(fragment) ||
+ (directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
+ result = ['(', result, ')' + this.semicolon(flags)];
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ImportDeclaration: function (stmt, flags) {
+ // ES6: 15.2.1 valid import declarations:
+ // - import ImportClause FromClause ;
+ // - import ModuleSpecifier ;
+ var result, cursor, that = this;
+
+ // If no ImportClause is present,
+ // this should be `import ModuleSpecifier` so skip `from`
+ // ModuleSpecifier is StringLiteral.
+ if (stmt.specifiers.length === 0) {
+ // import ModuleSpecifier ;
+ return [
+ 'import',
+ space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ }
+
+ // import ImportClause FromClause ;
+ result = [
+ 'import'
+ ];
+ cursor = 0;
+
+ // ImportedBinding
+ if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
+ result = join(result, [
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ ++cursor;
+ }
+
+ if (stmt.specifiers[cursor]) {
+ if (cursor !== 0) {
+ result.push(',');
+ }
+
+ if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
+ // NameSpaceImport
+ result = join(result, [
+ space,
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ } else {
+ // NamedImports
+ result.push(space + '{');
+
+ if ((stmt.specifiers.length - cursor) === 1) {
+ // import { ... } from "...";
+ result.push(space);
+ result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));
+ result.push(space + '}' + space);
+ } else {
+ // import {
+ // ...,
+ // ...,
+ // } from "...";
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}' + space);
+ }
+ }
+ }
+
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ return result;
+ },
+
+ VariableDeclarator: function (stmt, flags) {
+ var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;
+ if (stmt.init) {
+ return [
+ this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),
+ space,
+ '=',
+ space,
+ this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)
+ ];
+ }
+ return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);
+ },
+
+ VariableDeclaration: function (stmt, flags) {
+ // VariableDeclarator is typed as Statement,
+ // but joined with comma (not LineTerminator).
+ // So if comment is attached to target node, we should specialize.
+ var result, i, iz, node, bodyFlags, that = this;
+
+ result = [ stmt.kind ];
+
+ bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;
+
+ function block() {
+ node = stmt.declarations[0];
+ if (extra.comment && node.leadingComments) {
+ result.push('\n');
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(noEmptySpace());
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+
+ for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {
+ node = stmt.declarations[i];
+ if (extra.comment && node.leadingComments) {
+ result.push(',' + newline);
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(',' + space);
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+ }
+ }
+
+ if (stmt.declarations.length > 1) {
+ withIndent(block);
+ } else {
+ block();
+ }
+
+ result.push(this.semicolon(flags));
+
+ return result;
+ },
+
+ ThrowStatement: function (stmt, flags) {
+ return [join(
+ 'throw',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ },
+
+ TryStatement: function (stmt, flags) {
+ var result, i, iz, guardedHandlers;
+
+ result = ['try', this.maybeBlock(stmt.block, S_TFFF)];
+ result = this.maybeBlockSuffix(stmt.block, result);
+
+ if (stmt.handlers) {
+ // old interface
+ for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
+ }
+ }
+ } else {
+ guardedHandlers = stmt.guardedHandlers || [];
+
+ for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
+ }
+ }
+
+ // new interface
+ if (stmt.handler) {
+ if (Array.isArray(stmt.handler)) {
+ for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handler[i].body, result);
+ }
+ }
+ } else {
+ result = join(result, this.generateStatement(stmt.handler, S_TFFF));
+ if (stmt.finalizer) {
+ result = this.maybeBlockSuffix(stmt.handler.body, result);
+ }
+ }
+ }
+ }
+ if (stmt.finalizer) {
+ result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);
+ }
+ return result;
+ },
+
+ SwitchStatement: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ result = [
+ 'switch' + space + '(',
+ that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),
+ ')' + space + '{' + newline
+ ];
+ });
+ if (stmt.cases) {
+ bodyFlags = S_TFFF;
+ for (i = 0, iz = stmt.cases.length; i < iz; ++i) {
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ }
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ SwitchCase: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ if (stmt.test) {
+ result = [
+ join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
+ ':'
+ ];
+ } else {
+ result = ['default:'];
+ }
+
+ i = 0;
+ iz = stmt.consequent.length;
+ if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {
+ fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);
+ result.push(fragment);
+ i = 1;
+ }
+
+ if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+
+ bodyFlags = S_TFFF;
+ for (; i < iz; ++i) {
+ if (i === iz - 1 && flags & F_SEMICOLON_OPT) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ });
+ return result;
+ },
+
+ IfStatement: function (stmt, flags) {
+ var result, bodyFlags, semicolonOptional, that = this;
+ withIndent(function () {
+ result = [
+ 'if' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ semicolonOptional = flags & F_SEMICOLON_OPT;
+ bodyFlags = S_TFFF;
+ if (semicolonOptional) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ if (stmt.alternate) {
+ result.push(this.maybeBlock(stmt.consequent, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.consequent, result);
+ if (stmt.alternate.type === Syntax.IfStatement) {
+ result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);
+ } else {
+ result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));
+ }
+ } else {
+ result.push(this.maybeBlock(stmt.consequent, bodyFlags));
+ }
+ return result;
+ },
+
+ ForStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = ['for' + space + '('];
+ if (stmt.init) {
+ if (stmt.init.type === Syntax.VariableDeclaration) {
+ result.push(that.generateStatement(stmt.init, S_FFFF));
+ } else {
+ // F_ALLOW_IN becomes false.
+ result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));
+ result.push(';');
+ }
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.test) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));
+ result.push(';');
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.update) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
+ result.push(')');
+ } else {
+ result.push(')');
+ }
+ });
+
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ ForInStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ ForOfStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ LabeledStatement: function (stmt, flags) {
+ return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];
+ },
+
+ Program: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags;
+ iz = stmt.body.length;
+ result = [safeConcatenation && iz > 0 ? '\n' : ''];
+ bodyFlags = S_TFTF;
+ for (i = 0; i < iz; ++i) {
+ if (!safeConcatenation && i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines) {
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ return result;
+ },
+
+ FunctionDeclaration: function (stmt, flags) {
+ return [
+ generateAsyncPrefix(stmt, true),
+ 'function',
+ generateStarSuffix(stmt) || noEmptySpace(),
+ stmt.id ? generateIdentifier(stmt.id) : '',
+ this.generateFunctionBody(stmt)
+ ];
+ },
+
+ ReturnStatement: function (stmt, flags) {
+ if (stmt.argument) {
+ return [join(
+ 'return',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ }
+ return ['return' + this.semicolon(flags)];
+ },
+
+ WhileStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'while' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ WithStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'with' + space + '(',
+ that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ }
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Statement);
+
+ // Expressions.
+
+ CodeGenerator.Expression = {
+
+ SequenceExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ if (Precedence.Sequence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ result = [];
+ for (i = 0, iz = expr.expressions.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ return parenthesize(result, Precedence.Sequence, precedence);
+ },
+
+ AssignmentExpression: function (expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
+ },
+
+ ArrowFunctionExpression: function (expr, precedence, flags) {
+ return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);
+ },
+
+ ConditionalExpression: function (expr, precedence, flags) {
+ if (Precedence.Conditional < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.test, Precedence.LogicalOR, flags),
+ space + '?' + space,
+ this.generateExpression(expr.consequent, Precedence.Assignment, flags),
+ space + ':' + space,
+ this.generateExpression(expr.alternate, Precedence.Assignment, flags)
+ ],
+ Precedence.Conditional,
+ precedence
+ );
+ },
+
+ LogicalExpression: function (expr, precedence, flags) {
+ return this.BinaryExpression(expr, precedence, flags);
+ },
+
+ BinaryExpression: function (expr, precedence, flags) {
+ var result, leftPrecedence, rightPrecedence, currentPrecedence, fragment, leftSource;
+ currentPrecedence = BinaryPrecedence[expr.operator];
+ leftPrecedence = expr.operator === '**' ? Precedence.Postfix : currentPrecedence;
+ rightPrecedence = expr.operator === '**' ? currentPrecedence : currentPrecedence + 1;
+
+ if (currentPrecedence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ fragment = this.generateExpression(expr.left, leftPrecedence, flags);
+
+ leftSource = fragment.toString();
+
+ if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
+ result = [fragment, noEmptySpace(), expr.operator];
+ } else {
+ result = join(fragment, expr.operator);
+ }
+
+ fragment = this.generateExpression(expr.right, rightPrecedence, flags);
+
+ if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||
+ expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {
+ // If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result = join(result, fragment);
+ }
+
+ if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, currentPrecedence, precedence);
+ },
+
+ CallExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
+ result.push('(');
+ for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+
+ if (!(flags & F_ALLOW_CALL)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, Precedence.Call, precedence);
+ },
+
+ NewExpression: function (expr, precedence, flags) {
+ var result, length, i, iz, itemFlags;
+ length = expr['arguments'].length;
+
+ // F_ALLOW_CALL becomes false.
+ // F_ALLOW_UNPARATH_NEW may become false.
+ itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;
+
+ result = join(
+ 'new',
+ this.generateExpression(expr.callee, Precedence.New, itemFlags)
+ );
+
+ if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {
+ result.push('(');
+ for (i = 0, iz = length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+ }
+
+ return parenthesize(result, Precedence.New, precedence);
+ },
+
+ MemberExpression: function (expr, precedence, flags) {
+ var result, fragment;
+
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
+
+ if (expr.computed) {
+ result.push('[');
+ result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
+ result.push(']');
+ } else {
+ if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ // When the following conditions are all true,
+ // 1. No floating point
+ // 2. Don't have exponents
+ // 3. The last character is a decimal digit
+ // 4. Not hexadecimal OR octal number literal
+ // we should add a floating point.
+ if (
+ fragment.indexOf('.') < 0 &&
+ !/[eExX]/.test(fragment) &&
+ esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&
+ !(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0'
+ ) {
+ result.push(' ');
+ }
+ }
+ result.push('.');
+ result.push(generateIdentifier(expr.property));
+ }
+
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ MetaProperty: function (expr, precedence, flags) {
+ var result;
+ result = [];
+ result.push(typeof expr.meta === "string" ? expr.meta : generateIdentifier(expr.meta));
+ result.push('.');
+ result.push(typeof expr.property === "string" ? expr.property : generateIdentifier(expr.property));
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ UnaryExpression: function (expr, precedence, flags) {
+ var result, fragment, rightCharCode, leftSource, leftCharCode;
+ fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
+
+ if (space === '') {
+ result = join(expr.operator, fragment);
+ } else {
+ result = [expr.operator];
+ if (expr.operator.length > 2) {
+ // delete, void, typeof
+ // get `typeof []`, not `typeof[]`
+ result = join(result, fragment);
+ } else {
+ // Prevent inserting spaces between operator and argument if it is unnecessary
+ // like, `!cond`
+ leftSource = toSourceNodeWhenNeeded(result).toString();
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = fragment.toString().charCodeAt(0);
+
+ if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) ||
+ (esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) {
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ }
+ return parenthesize(result, Precedence.Unary, precedence);
+ },
+
+ YieldExpression: function (expr, precedence, flags) {
+ var result;
+ if (expr.delegate) {
+ result = 'yield*';
+ } else {
+ result = 'yield';
+ }
+ if (expr.argument) {
+ result = join(
+ result,
+ this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
+ );
+ }
+ return parenthesize(result, Precedence.Yield, precedence);
+ },
+
+ AwaitExpression: function (expr, precedence, flags) {
+ var result = join(
+ expr.all ? 'await*' : 'await',
+ this.generateExpression(expr.argument, Precedence.Await, E_TTT)
+ );
+ return parenthesize(result, Precedence.Await, precedence);
+ },
+
+ UpdateExpression: function (expr, precedence, flags) {
+ if (expr.prefix) {
+ return parenthesize(
+ [
+ expr.operator,
+ this.generateExpression(expr.argument, Precedence.Unary, E_TTT)
+ ],
+ Precedence.Unary,
+ precedence
+ );
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),
+ expr.operator
+ ],
+ Precedence.Postfix,
+ precedence
+ );
+ },
+
+ FunctionExpression: function (expr, precedence, flags) {
+ var result = [
+ generateAsyncPrefix(expr, true),
+ 'function'
+ ];
+ if (expr.id) {
+ result.push(generateStarSuffix(expr) || noEmptySpace());
+ result.push(generateIdentifier(expr.id));
+ } else {
+ result.push(generateStarSuffix(expr) || space);
+ }
+ result.push(this.generateFunctionBody(expr));
+ return result;
+ },
+
+ ArrayPattern: function (expr, precedence, flags) {
+ return this.ArrayExpression(expr, precedence, flags, true);
+ },
+
+ ArrayExpression: function (expr, precedence, flags, isPattern) {
+ var result, multiline, that = this;
+ if (!expr.elements.length) {
+ return '[]';
+ }
+ multiline = isPattern ? false : expr.elements.length > 1;
+ result = ['[', multiline ? newline : ''];
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.elements.length; i < iz; ++i) {
+ if (!expr.elements[i]) {
+ if (multiline) {
+ result.push(indent);
+ }
+ if (i + 1 === iz) {
+ result.push(',');
+ }
+ } else {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push(']');
+ return result;
+ },
+
+ RestElement: function(expr, precedence, flags) {
+ return '...' + this.generatePattern(expr.argument);
+ },
+
+ ClassExpression: function (expr, precedence, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (expr.id) {
+ result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
+ }
+ if (expr.superClass) {
+ fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(expr.body, S_TFFT));
+ return result;
+ },
+
+ MethodDefinition: function (expr, precedence, flags) {
+ var result, fragment;
+ if (expr['static']) {
+ result = ['static' + space];
+ } else {
+ result = [];
+ }
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ fragment = [
+ join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
+ this.generateFunctionBody(expr.value)
+ ];
+ } else {
+ fragment = [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+ return join(result, fragment);
+ },
+
+ Property: function (expr, precedence, flags) {
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ return [
+ expr.kind, noEmptySpace(),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ if (expr.shorthand) {
+ if (expr.value.type === "AssignmentPattern") {
+ return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT);
+ }
+ return this.generatePropertyKey(expr.key, expr.computed);
+ }
+
+ if (expr.method) {
+ return [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ return [
+ this.generatePropertyKey(expr.key, expr.computed),
+ ':' + space,
+ this.generateExpression(expr.value, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ ObjectExpression: function (expr, precedence, flags) {
+ var multiline, result, fragment, that = this;
+
+ if (!expr.properties.length) {
+ return '{}';
+ }
+ multiline = expr.properties.length > 1;
+
+ withIndent(function () {
+ fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);
+ });
+
+ if (!multiline) {
+ // issues 4
+ // Do not transform from
+ // dejavu.Class.declare({
+ // method2: function () {}
+ // });
+ // to
+ // dejavu.Class.declare({method2: function () {
+ // }});
+ if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ return [ '{', space, fragment, space, '}' ];
+ }
+ }
+
+ withIndent(function (indent) {
+ var i, iz;
+ result = [ '{', newline, indent, fragment ];
+
+ if (multiline) {
+ result.push(',' + newline);
+ for (i = 1, iz = expr.properties.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ AssignmentPattern: function(expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, '=', precedence, flags);
+ },
+
+ ObjectPattern: function (expr, precedence, flags) {
+ var result, i, iz, multiline, property, that = this;
+ if (!expr.properties.length) {
+ return '{}';
+ }
+
+ multiline = false;
+ if (expr.properties.length === 1) {
+ property = expr.properties[0];
+ if (
+ property.type === Syntax.Property
+ && property.value.type !== Syntax.Identifier
+ ) {
+ multiline = true;
+ }
+ } else {
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ property = expr.properties[i];
+ if (
+ property.type === Syntax.Property
+ && !property.shorthand
+ ) {
+ multiline = true;
+ break;
+ }
+ }
+ }
+ result = ['{', multiline ? newline : '' ];
+
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push('}');
+ return result;
+ },
+
+ ThisExpression: function (expr, precedence, flags) {
+ return 'this';
+ },
+
+ Super: function (expr, precedence, flags) {
+ return 'super';
+ },
+
+ Identifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr);
+ },
+
+ ImportDefaultSpecifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr.id || expr.local);
+ },
+
+ ImportNamespaceSpecifier: function (expr, precedence, flags) {
+ var result = ['*'];
+ var id = expr.id || expr.local;
+ if (id) {
+ result.push(space + 'as' + noEmptySpace() + generateIdentifier(id));
+ }
+ return result;
+ },
+
+ ImportSpecifier: function (expr, precedence, flags) {
+ var imported = expr.imported;
+ var result = [ imported.name ];
+ var local = expr.local;
+ if (local && local.name !== imported.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local));
+ }
+ return result;
+ },
+
+ ExportSpecifier: function (expr, precedence, flags) {
+ var local = expr.local;
+ var result = [ local.name ];
+ var exported = expr.exported;
+ if (exported && exported.name !== local.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported));
+ }
+ return result;
+ },
+
+ Literal: function (expr, precedence, flags) {
+ var raw;
+ if (expr.hasOwnProperty('raw') && parse && extra.raw) {
+ try {
+ raw = parse(expr.raw).body[0].expression;
+ if (raw.type === Syntax.Literal) {
+ if (raw.value === expr.value) {
+ return expr.raw;
+ }
+ }
+ } catch (e) {
+ // not use raw property
+ }
+ }
+
+ if (expr.regex) {
+ return '/' + expr.regex.pattern + '/' + expr.regex.flags;
+ }
+
+ if (expr.value === null) {
+ return 'null';
+ }
+
+ if (typeof expr.value === 'string') {
+ return escapeString(expr.value);
+ }
+
+ if (typeof expr.value === 'number') {
+ return generateNumber(expr.value);
+ }
+
+ if (typeof expr.value === 'boolean') {
+ return expr.value ? 'true' : 'false';
+ }
+
+ return generateRegExp(expr.value);
+ },
+
+ GeneratorExpression: function (expr, precedence, flags) {
+ return this.ComprehensionExpression(expr, precedence, flags);
+ },
+
+ ComprehensionExpression: function (expr, precedence, flags) {
+ // GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]
+ // Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6
+
+ var result, i, iz, fragment, that = this;
+ result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];
+
+ if (extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+ result.push(fragment);
+ }
+
+ if (expr.blocks) {
+ withIndent(function () {
+ for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
+ fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
+ if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
+ result = join(result, fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ });
+ }
+
+ if (expr.filter) {
+ result = join(result, 'if' + space);
+ fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
+ result = join(result, [ '(', fragment, ')' ]);
+ }
+
+ if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+
+ result = join(result, fragment);
+ }
+
+ result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');
+ return result;
+ },
+
+ ComprehensionBlock: function (expr, precedence, flags) {
+ var fragment;
+ if (expr.left.type === Syntax.VariableDeclaration) {
+ fragment = [
+ expr.left.kind, noEmptySpace(),
+ this.generateStatement(expr.left.declarations[0], S_FFFF)
+ ];
+ } else {
+ fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
+ }
+
+ fragment = join(fragment, expr.of ? 'of' : 'in');
+ fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
+
+ return [ 'for' + space + '(', fragment, ')' ];
+ },
+
+ SpreadElement: function (expr, precedence, flags) {
+ return [
+ '...',
+ this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ TaggedTemplateExpression: function (expr, precedence, flags) {
+ var itemFlags = E_TTF;
+ if (!(flags & F_ALLOW_CALL)) {
+ itemFlags = E_TFF;
+ }
+ var result = [
+ this.generateExpression(expr.tag, Precedence.Call, itemFlags),
+ this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)
+ ];
+ return parenthesize(result, Precedence.TaggedTemplate, precedence);
+ },
+
+ TemplateElement: function (expr, precedence, flags) {
+ // Don't use "cooked". Since tagged template can use raw template
+ // representation. So if we do so, it breaks the script semantics.
+ return expr.value.raw;
+ },
+
+ TemplateLiteral: function (expr, precedence, flags) {
+ var result, i, iz;
+ result = [ '`' ];
+ for (i = 0, iz = expr.quasis.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));
+ if (i + 1 < iz) {
+ result.push('${' + space);
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));
+ result.push(space + '}');
+ }
+ }
+ result.push('`');
+ return result;
+ },
+
+ ModuleSpecifier: function (expr, precedence, flags) {
+ return this.Literal(expr, precedence, flags);
+ },
+
+ ImportExpression: function(expr, precedence, flag) {
+ return parenthesize([
+ 'import(',
+ this.generateExpression(expr.source, Precedence.Assignment, E_TTT),
+ ')'
+ ], Precedence.Call, precedence);
+ },
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Expression);
+
+ CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {
+ var result, type;
+
+ type = expr.type || Syntax.Property;
+
+ if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {
+ return generateVerbatim(expr, precedence);
+ }
+
+ result = this[type](expr, precedence, flags);
+
+
+ if (extra.comment) {
+ result = addComments(expr, result);
+ }
+ return toSourceNodeWhenNeeded(result, expr);
+ };
+
+ CodeGenerator.prototype.generateStatement = function (stmt, flags) {
+ var result,
+ fragment;
+
+ result = this[stmt.type](stmt, flags);
+
+ // Attach comments
+
+ if (extra.comment) {
+ result = addComments(stmt, result);
+ }
+
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') {
+ result = sourceMap ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');
+ }
+
+ return toSourceNodeWhenNeeded(result, stmt);
+ };
+
+ function generateInternal(node) {
+ var codegen;
+
+ codegen = new CodeGenerator();
+ if (isStatement(node)) {
+ return codegen.generateStatement(node, S_TFFF);
+ }
+
+ if (isExpression(node)) {
+ return codegen.generateExpression(node, Precedence.Sequence, E_TTT);
+ }
+
+ throw new Error('Unknown node type: ' + node.type);
+ }
+
+ function generate(node, options) {
+ var defaultOptions = getDefaultOptions(), result, pair;
+
+ if (options != null) {
+ // Obsolete options
+ //
+ // `options.indent`
+ // `options.base`
+ //
+ // Instead of them, we can use `option.format.indent`.
+ if (typeof options.indent === 'string') {
+ defaultOptions.format.indent.style = options.indent;
+ }
+ if (typeof options.base === 'number') {
+ defaultOptions.format.indent.base = options.base;
+ }
+ options = updateDeeply(defaultOptions, options);
+ indent = options.format.indent.style;
+ if (typeof options.base === 'string') {
+ base = options.base;
+ } else {
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ } else {
+ options = defaultOptions;
+ indent = options.format.indent.style;
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ json = options.format.json;
+ renumber = options.format.renumber;
+ hexadecimal = json ? false : options.format.hexadecimal;
+ quotes = json ? 'double' : options.format.quotes;
+ escapeless = options.format.escapeless;
+ newline = options.format.newline;
+ space = options.format.space;
+ if (options.format.compact) {
+ newline = space = indent = base = '';
+ }
+ parentheses = options.format.parentheses;
+ semicolons = options.format.semicolons;
+ safeConcatenation = options.format.safeConcatenation;
+ directive = options.directive;
+ parse = json ? null : options.parse;
+ sourceMap = options.sourceMap;
+ sourceCode = options.sourceCode;
+ preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;
+ extra = options;
+
+ if (sourceMap) {
+ if (!exports.browser) {
+ // We assume environment is node.js
+ // And prevent from including source-map by browserify
+ SourceNode = require('source-map').SourceNode;
+ } else {
+ SourceNode = global.sourceMap.SourceNode;
+ }
+ }
+
+ result = generateInternal(node);
+
+ if (!sourceMap) {
+ pair = {code: result.toString(), map: null};
+ return options.sourceMapWithCode ? pair : pair.code;
+ }
+
+
+ pair = result.toStringWithSourceMap({
+ file: options.file,
+ sourceRoot: options.sourceMapRoot
+ });
+
+ if (options.sourceContent) {
+ pair.map.setSourceContent(options.sourceMap,
+ options.sourceContent);
+ }
+
+ if (options.sourceMapWithCode) {
+ return pair;
+ }
+
+ return pair.map.toString();
+ }
+
+ FORMAT_MINIFY = {
+ indent: {
+ style: '',
+ base: 0
+ },
+ renumber: true,
+ hexadecimal: true,
+ quotes: 'auto',
+ escapeless: true,
+ compact: true,
+ parentheses: false,
+ semicolons: false
+ };
+
+ FORMAT_DEFAULTS = getDefaultOptions().format;
+
+ exports.version = require('./package.json').version;
+ exports.generate = generate;
+ exports.attachComments = estraverse.attachComments;
+ exports.Precedence = updateDeeply({}, Precedence);
+ exports.browser = false;
+ exports.FORMAT_MINIFY = FORMAT_MINIFY;
+ exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/escodegen/package.json b/node_modules/escodegen/package.json
new file mode 100644
index 00000000..159af4bc
--- /dev/null
+++ b/node_modules/escodegen/package.json
@@ -0,0 +1,90 @@
+{
+ "_from": "escodegen@^1.8.1",
+ "_id": "escodegen@1.14.3",
+ "_inBundle": false,
+ "_integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "_location": "/escodegen",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "escodegen@^1.8.1",
+ "name": "escodegen",
+ "escapedName": "escodegen",
+ "rawSpec": "^1.8.1",
+ "saveSpec": null,
+ "fetchSpec": "^1.8.1"
+ },
+ "_requiredBy": [
+ "/static-eval"
+ ],
+ "_resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "_shasum": "4e7b81fba61581dc97582ed78cab7f0e8d63f503",
+ "_spec": "escodegen@^1.8.1",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\static-eval",
+ "bin": {
+ "esgenerate": "bin/esgenerate.js",
+ "escodegen": "bin/escodegen.js"
+ },
+ "bugs": {
+ "url": "https://github.com/estools/escodegen/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ },
+ "deprecated": false,
+ "description": "ECMAScript code generator",
+ "devDependencies": {
+ "acorn": "^7.1.0",
+ "bluebird": "^3.4.7",
+ "bower-registry-client": "^1.0.0",
+ "chai": "^3.5.0",
+ "commonjs-everywhere": "^0.9.7",
+ "gulp": "^3.8.10",
+ "gulp-eslint": "^3.0.1",
+ "gulp-mocha": "^3.0.1",
+ "semver": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "files": [
+ "LICENSE.BSD",
+ "README.md",
+ "bin",
+ "escodegen.js",
+ "package.json"
+ ],
+ "homepage": "http://github.com/estools/escodegen",
+ "license": "BSD-2-Clause",
+ "main": "escodegen.js",
+ "maintainers": [
+ {
+ "name": "Yusuke Suzuki",
+ "email": "utatane.tea@gmail.com",
+ "url": "http://github.com/Constellation"
+ }
+ ],
+ "name": "escodegen",
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/estools/escodegen.git"
+ },
+ "scripts": {
+ "build": "cjsify -a path: tools/entry-point.js > escodegen.browser.js",
+ "build-min": "cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",
+ "lint": "gulp lint",
+ "release": "node tools/release.js",
+ "test": "gulp travis",
+ "unit-test": "gulp test"
+ },
+ "version": "1.14.3"
+}
diff --git a/node_modules/estraverse/.jshintrc b/node_modules/estraverse/.jshintrc
new file mode 100644
index 00000000..f642dae7
--- /dev/null
+++ b/node_modules/estraverse/.jshintrc
@@ -0,0 +1,16 @@
+{
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "eqnull": true,
+ "latedef": true,
+ "noarg": true,
+ "noempty": true,
+ "quotmark": "single",
+ "undef": true,
+ "unused": true,
+ "strict": true,
+ "trailing": true,
+
+ "node": true
+}
diff --git a/node_modules/estraverse/LICENSE.BSD b/node_modules/estraverse/LICENSE.BSD
new file mode 100644
index 00000000..3e580c35
--- /dev/null
+++ b/node_modules/estraverse/LICENSE.BSD
@@ -0,0 +1,19 @@
+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.
+
+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 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/estraverse/README.md b/node_modules/estraverse/README.md
new file mode 100644
index 00000000..ccd3377f
--- /dev/null
+++ b/node_modules/estraverse/README.md
@@ -0,0 +1,153 @@
+### Estraverse [](http://travis-ci.org/estools/estraverse)
+
+Estraverse ([estraverse](http://github.com/estools/estraverse)) is
+[ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
+traversal functions from [esmangle project](http://github.com/estools/esmangle).
+
+### Documentation
+
+You can find usage docs at [wiki page](https://github.com/estools/estraverse/wiki/Usage).
+
+### Example Usage
+
+The following code will output all variables declared at the root of a file.
+
+```javascript
+estraverse.traverse(ast, {
+ enter: function (node, parent) {
+ if (node.type == 'FunctionExpression' || node.type == 'FunctionDeclaration')
+ return estraverse.VisitorOption.Skip;
+ },
+ leave: function (node, parent) {
+ if (node.type == 'VariableDeclarator')
+ console.log(node.id.name);
+ }
+});
+```
+
+We can use `this.skip`, `this.remove` and `this.break` functions instead of using Skip, Remove and Break.
+
+```javascript
+estraverse.traverse(ast, {
+ enter: function (node) {
+ this.break();
+ }
+});
+```
+
+And estraverse provides `estraverse.replace` function. When returning node from `enter`/`leave`, current node is replaced with it.
+
+```javascript
+result = estraverse.replace(tree, {
+ enter: function (node) {
+ // Replace it with replaced.
+ if (node.type === 'Literal')
+ return replaced;
+ }
+});
+```
+
+By passing `visitor.keys` mapping, we can extend estraverse traversing functionality.
+
+```javascript
+// This tree contains a user-defined `TestExpression` node.
+var tree = {
+ type: 'TestExpression',
+
+ // This 'argument' is the property containing the other **node**.
+ argument: {
+ type: 'Literal',
+ value: 20
+ },
+
+ // This 'extended' is the property not containing the other **node**.
+ extended: true
+};
+estraverse.traverse(tree, {
+ enter: function (node) { },
+
+ // Extending the existing traversing rules.
+ keys: {
+ // TargetNodeName: [ 'keys', 'containing', 'the', 'other', '**node**' ]
+ TestExpression: ['argument']
+ }
+});
+```
+
+By passing `visitor.fallback` option, we can control the behavior when encountering unknown nodes.
+
+```javascript
+// This tree contains a user-defined `TestExpression` node.
+var tree = {
+ type: 'TestExpression',
+
+ // This 'argument' is the property containing the other **node**.
+ argument: {
+ type: 'Literal',
+ value: 20
+ },
+
+ // This 'extended' is the property not containing the other **node**.
+ extended: true
+};
+estraverse.traverse(tree, {
+ enter: function (node) { },
+
+ // Iterating the child **nodes** of unknown nodes.
+ fallback: 'iteration'
+});
+```
+
+When `visitor.fallback` is a function, we can determine which keys to visit on each node.
+
+```javascript
+// This tree contains a user-defined `TestExpression` node.
+var tree = {
+ type: 'TestExpression',
+
+ // This 'argument' is the property containing the other **node**.
+ argument: {
+ type: 'Literal',
+ value: 20
+ },
+
+ // This 'extended' is the property not containing the other **node**.
+ extended: true
+};
+estraverse.traverse(tree, {
+ enter: function (node) { },
+
+ // Skip the `argument` property of each node
+ fallback: function(node) {
+ return Object.keys(node).filter(function(key) {
+ return key !== 'argument';
+ });
+ }
+});
+```
+
+### License
+
+Copyright (C) 2012-2016 [Yusuke Suzuki](http://github.com/Constellation)
+ (twitter: [@Constellation](http://twitter.com/Constellation)) and other contributors.
+
+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.
+
+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 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/estraverse/estraverse.js b/node_modules/estraverse/estraverse.js
new file mode 100644
index 00000000..b106d386
--- /dev/null
+++ b/node_modules/estraverse/estraverse.js
@@ -0,0 +1,782 @@
+/*
+ Copyright (C) 2012-2013 Yusuke Suzuki
+ Copyright (C) 2012 Ariya Hidayat
+
+ 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.
+
+ 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 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.
+*/
+/*jslint vars:false, bitwise:true*/
+/*jshint indent:4*/
+/*global exports:true*/
+(function clone(exports) {
+ 'use strict';
+
+ var Syntax,
+ VisitorOption,
+ VisitorKeys,
+ BREAK,
+ SKIP,
+ REMOVE;
+
+ function deepCopy(obj) {
+ var ret = {}, key, val;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ val = obj[key];
+ if (typeof val === 'object' && val !== null) {
+ ret[key] = deepCopy(val);
+ } else {
+ ret[key] = val;
+ }
+ }
+ }
+ return ret;
+ }
+
+ // based on LLVM libc++ upper_bound / lower_bound
+ // MIT License
+
+ function upperBound(array, func) {
+ var diff, len, i, current;
+
+ len = array.length;
+ i = 0;
+
+ while (len) {
+ diff = len >>> 1;
+ current = i + diff;
+ if (func(array[current])) {
+ len = diff;
+ } else {
+ i = current + 1;
+ len -= diff + 1;
+ }
+ }
+ return i;
+ }
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ DirectiveStatement: 'DirectiveStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ ForOfStatement: 'ForOfStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportExpression: 'ImportExpression',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ ModuleSpecifier: 'ModuleSpecifier',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+ VisitorKeys = {
+ AssignmentExpression: ['left', 'right'],
+ AssignmentPattern: ['left', 'right'],
+ ArrayExpression: ['elements'],
+ ArrayPattern: ['elements'],
+ ArrowFunctionExpression: ['params', 'body'],
+ AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
+ BlockStatement: ['body'],
+ BinaryExpression: ['left', 'right'],
+ BreakStatement: ['label'],
+ CallExpression: ['callee', 'arguments'],
+ CatchClause: ['param', 'body'],
+ ClassBody: ['body'],
+ ClassDeclaration: ['id', 'superClass', 'body'],
+ ClassExpression: ['id', 'superClass', 'body'],
+ ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ ConditionalExpression: ['test', 'consequent', 'alternate'],
+ ContinueStatement: ['label'],
+ DebuggerStatement: [],
+ DirectiveStatement: [],
+ DoWhileStatement: ['body', 'test'],
+ EmptyStatement: [],
+ ExportAllDeclaration: ['source'],
+ ExportDefaultDeclaration: ['declaration'],
+ ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
+ ExportSpecifier: ['exported', 'local'],
+ ExpressionStatement: ['expression'],
+ ForStatement: ['init', 'test', 'update', 'body'],
+ ForInStatement: ['left', 'right', 'body'],
+ ForOfStatement: ['left', 'right', 'body'],
+ FunctionDeclaration: ['id', 'params', 'body'],
+ FunctionExpression: ['id', 'params', 'body'],
+ GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ Identifier: [],
+ IfStatement: ['test', 'consequent', 'alternate'],
+ ImportExpression: ['source'],
+ ImportDeclaration: ['specifiers', 'source'],
+ ImportDefaultSpecifier: ['local'],
+ ImportNamespaceSpecifier: ['local'],
+ ImportSpecifier: ['imported', 'local'],
+ Literal: [],
+ LabeledStatement: ['label', 'body'],
+ LogicalExpression: ['left', 'right'],
+ MemberExpression: ['object', 'property'],
+ MetaProperty: ['meta', 'property'],
+ MethodDefinition: ['key', 'value'],
+ ModuleSpecifier: [],
+ NewExpression: ['callee', 'arguments'],
+ ObjectExpression: ['properties'],
+ ObjectPattern: ['properties'],
+ Program: ['body'],
+ Property: ['key', 'value'],
+ RestElement: [ 'argument' ],
+ ReturnStatement: ['argument'],
+ SequenceExpression: ['expressions'],
+ SpreadElement: ['argument'],
+ Super: [],
+ SwitchStatement: ['discriminant', 'cases'],
+ SwitchCase: ['test', 'consequent'],
+ TaggedTemplateExpression: ['tag', 'quasi'],
+ TemplateElement: [],
+ TemplateLiteral: ['quasis', 'expressions'],
+ ThisExpression: [],
+ ThrowStatement: ['argument'],
+ TryStatement: ['block', 'handler', 'finalizer'],
+ UnaryExpression: ['argument'],
+ UpdateExpression: ['argument'],
+ VariableDeclaration: ['declarations'],
+ VariableDeclarator: ['id', 'init'],
+ WhileStatement: ['test', 'body'],
+ WithStatement: ['object', 'body'],
+ YieldExpression: ['argument']
+ };
+
+ // unique id
+ BREAK = {};
+ SKIP = {};
+ REMOVE = {};
+
+ VisitorOption = {
+ Break: BREAK,
+ Skip: SKIP,
+ Remove: REMOVE
+ };
+
+ function Reference(parent, key) {
+ this.parent = parent;
+ this.key = key;
+ }
+
+ Reference.prototype.replace = function replace(node) {
+ this.parent[this.key] = node;
+ };
+
+ Reference.prototype.remove = function remove() {
+ if (Array.isArray(this.parent)) {
+ this.parent.splice(this.key, 1);
+ return true;
+ } else {
+ this.replace(null);
+ return false;
+ }
+ };
+
+ function Element(node, path, wrap, ref) {
+ this.node = node;
+ this.path = path;
+ this.wrap = wrap;
+ this.ref = ref;
+ }
+
+ function Controller() { }
+
+ // API:
+ // return property path array from root to current node
+ Controller.prototype.path = function path() {
+ var i, iz, j, jz, result, element;
+
+ function addToPath(result, path) {
+ if (Array.isArray(path)) {
+ for (j = 0, jz = path.length; j < jz; ++j) {
+ result.push(path[j]);
+ }
+ } else {
+ result.push(path);
+ }
+ }
+
+ // root node
+ if (!this.__current.path) {
+ return null;
+ }
+
+ // first node is sentinel, second node is root element
+ result = [];
+ for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
+ element = this.__leavelist[i];
+ addToPath(result, element.path);
+ }
+ addToPath(result, this.__current.path);
+ return result;
+ };
+
+ // API:
+ // return type of current node
+ Controller.prototype.type = function () {
+ var node = this.current();
+ return node.type || this.__current.wrap;
+ };
+
+ // API:
+ // return array of parent elements
+ Controller.prototype.parents = function parents() {
+ var i, iz, result;
+
+ // first node is sentinel
+ result = [];
+ for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
+ result.push(this.__leavelist[i].node);
+ }
+
+ return result;
+ };
+
+ // API:
+ // return current node
+ Controller.prototype.current = function current() {
+ return this.__current.node;
+ };
+
+ Controller.prototype.__execute = function __execute(callback, element) {
+ var previous, result;
+
+ result = undefined;
+
+ previous = this.__current;
+ this.__current = element;
+ this.__state = null;
+ if (callback) {
+ result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
+ }
+ this.__current = previous;
+
+ return result;
+ };
+
+ // API:
+ // notify control skip / break
+ Controller.prototype.notify = function notify(flag) {
+ this.__state = flag;
+ };
+
+ // API:
+ // skip child nodes of current node
+ Controller.prototype.skip = function () {
+ this.notify(SKIP);
+ };
+
+ // API:
+ // break traversals
+ Controller.prototype['break'] = function () {
+ this.notify(BREAK);
+ };
+
+ // API:
+ // remove node
+ Controller.prototype.remove = function () {
+ this.notify(REMOVE);
+ };
+
+ Controller.prototype.__initialize = function(root, visitor) {
+ this.visitor = visitor;
+ this.root = root;
+ this.__worklist = [];
+ this.__leavelist = [];
+ this.__current = null;
+ this.__state = null;
+ this.__fallback = null;
+ if (visitor.fallback === 'iteration') {
+ this.__fallback = Object.keys;
+ } else if (typeof visitor.fallback === 'function') {
+ this.__fallback = visitor.fallback;
+ }
+
+ this.__keys = VisitorKeys;
+ if (visitor.keys) {
+ this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
+ }
+ };
+
+ function isNode(node) {
+ if (node == null) {
+ return false;
+ }
+ return typeof node === 'object' && typeof node.type === 'string';
+ }
+
+ function isProperty(nodeType, key) {
+ return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
+ }
+
+ Controller.prototype.traverse = function traverse(root, visitor) {
+ var worklist,
+ leavelist,
+ element,
+ node,
+ nodeType,
+ ret,
+ key,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel;
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ worklist.push(new Element(root, null, null, null));
+ leavelist.push(new Element(null, null, null, null));
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ ret = this.__execute(visitor.leave, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+ continue;
+ }
+
+ if (element.node) {
+
+ ret = this.__execute(visitor.enter, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || ret === SKIP) {
+ continue;
+ }
+
+ node = element.node;
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', null);
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, null);
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, null));
+ }
+ }
+ }
+ }
+ };
+
+ Controller.prototype.replace = function replace(root, visitor) {
+ var worklist,
+ leavelist,
+ node,
+ nodeType,
+ target,
+ element,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel,
+ outer,
+ key;
+
+ function removeElem(element) {
+ var i,
+ key,
+ nextElem,
+ parent;
+
+ if (element.ref.remove()) {
+ // When the reference is an element of an array.
+ key = element.ref.key;
+ parent = element.ref.parent;
+
+ // If removed from array, then decrease following items' keys.
+ i = worklist.length;
+ while (i--) {
+ nextElem = worklist[i];
+ if (nextElem.ref && nextElem.ref.parent === parent) {
+ if (nextElem.ref.key < key) {
+ break;
+ }
+ --nextElem.ref.key;
+ }
+ }
+ }
+ }
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ outer = {
+ root: root
+ };
+ element = new Element(root, null, null, new Reference(outer, 'root'));
+ worklist.push(element);
+ leavelist.push(element);
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ target = this.__execute(visitor.leave, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+ continue;
+ }
+
+ target = this.__execute(visitor.enter, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ element.node = target;
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ element.node = null;
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+
+ // node may be null
+ node = element.node;
+ if (!node) {
+ continue;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || target === SKIP) {
+ continue;
+ }
+
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, new Reference(node, key)));
+ }
+ }
+ }
+
+ return outer.root;
+ };
+
+ function traverse(root, visitor) {
+ var controller = new Controller();
+ return controller.traverse(root, visitor);
+ }
+
+ function replace(root, visitor) {
+ var controller = new Controller();
+ return controller.replace(root, visitor);
+ }
+
+ function extendCommentRange(comment, tokens) {
+ var target;
+
+ target = upperBound(tokens, function search(token) {
+ return token.range[0] > comment.range[0];
+ });
+
+ comment.extendedRange = [comment.range[0], comment.range[1]];
+
+ if (target !== tokens.length) {
+ comment.extendedRange[1] = tokens[target].range[0];
+ }
+
+ target -= 1;
+ if (target >= 0) {
+ comment.extendedRange[0] = tokens[target].range[1];
+ }
+
+ return comment;
+ }
+
+ function attachComments(tree, providedComments, tokens) {
+ // At first, we should calculate extended comment ranges.
+ var comments = [], comment, len, i, cursor;
+
+ if (!tree.range) {
+ throw new Error('attachComments needs range information');
+ }
+
+ // tokens array is empty, we attach comments to tree as 'leadingComments'
+ if (!tokens.length) {
+ if (providedComments.length) {
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comment = deepCopy(providedComments[i]);
+ comment.extendedRange = [0, tree.range[0]];
+ comments.push(comment);
+ }
+ tree.leadingComments = comments;
+ }
+ return tree;
+ }
+
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
+ }
+
+ // This is based on John Freeman's implementation.
+ cursor = 0;
+ traverse(tree, {
+ enter: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (comment.extendedRange[1] > node.range[0]) {
+ break;
+ }
+
+ if (comment.extendedRange[1] === node.range[0]) {
+ if (!node.leadingComments) {
+ node.leadingComments = [];
+ }
+ node.leadingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ cursor = 0;
+ traverse(tree, {
+ leave: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (node.range[1] < comment.extendedRange[0]) {
+ break;
+ }
+
+ if (node.range[1] === comment.extendedRange[0]) {
+ if (!node.trailingComments) {
+ node.trailingComments = [];
+ }
+ node.trailingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ return tree;
+ }
+
+ exports.version = require('./package.json').version;
+ exports.Syntax = Syntax;
+ exports.traverse = traverse;
+ exports.replace = replace;
+ exports.attachComments = attachComments;
+ exports.VisitorKeys = VisitorKeys;
+ exports.VisitorOption = VisitorOption;
+ exports.Controller = Controller;
+ exports.cloneEnvironment = function () { return clone({}); };
+
+ return exports;
+}(exports));
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/estraverse/gulpfile.js b/node_modules/estraverse/gulpfile.js
new file mode 100644
index 00000000..8772bbcc
--- /dev/null
+++ b/node_modules/estraverse/gulpfile.js
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2014 Yusuke Suzuki
+
+ 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.
+
+ 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 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 gulp = require('gulp'),
+ git = require('gulp-git'),
+ bump = require('gulp-bump'),
+ filter = require('gulp-filter'),
+ tagVersion = require('gulp-tag-version');
+
+var TEST = [ 'test/*.js' ];
+var POWERED = [ 'powered-test/*.js' ];
+var SOURCE = [ 'src/**/*.js' ];
+
+/**
+ * Bumping version number and tagging the repository with it.
+ * Please read http://semver.org/
+ *
+ * You can use the commands
+ *
+ * gulp patch # makes v0.1.0 -> v0.1.1
+ * gulp feature # makes v0.1.1 -> v0.2.0
+ * gulp release # makes v0.2.1 -> v1.0.0
+ *
+ * To bump the version numbers accordingly after you did a patch,
+ * introduced a feature or made a backwards-incompatible release.
+ */
+
+function inc(importance) {
+ // get all the files to bump version in
+ return gulp.src(['./package.json'])
+ // bump the version number in those files
+ .pipe(bump({type: importance}))
+ // save it back to filesystem
+ .pipe(gulp.dest('./'))
+ // commit the changed version number
+ .pipe(git.commit('Bumps package version'))
+ // read only one file to get the version number
+ .pipe(filter('package.json'))
+ // **tag it in the repository**
+ .pipe(tagVersion({
+ prefix: ''
+ }));
+}
+
+gulp.task('patch', [ ], function () { return inc('patch'); })
+gulp.task('minor', [ ], function () { return inc('minor'); })
+gulp.task('major', [ ], function () { return inc('major'); })
diff --git a/node_modules/estraverse/package.json b/node_modules/estraverse/package.json
new file mode 100644
index 00000000..cb4e27af
--- /dev/null
+++ b/node_modules/estraverse/package.json
@@ -0,0 +1,68 @@
+{
+ "_from": "estraverse@^4.2.0",
+ "_id": "estraverse@4.3.0",
+ "_inBundle": false,
+ "_integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "_location": "/estraverse",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "estraverse@^4.2.0",
+ "name": "estraverse",
+ "escapedName": "estraverse",
+ "rawSpec": "^4.2.0",
+ "saveSpec": null,
+ "fetchSpec": "^4.2.0"
+ },
+ "_requiredBy": [
+ "/escodegen"
+ ],
+ "_resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "_shasum": "398ad3f3c5a24948be7725e83d11a7de28cdbd1d",
+ "_spec": "estraverse@^4.2.0",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\escodegen",
+ "bugs": {
+ "url": "https://github.com/estools/estraverse/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "ECMAScript JS AST traversal functions",
+ "devDependencies": {
+ "babel-preset-env": "^1.6.1",
+ "babel-register": "^6.3.13",
+ "chai": "^2.1.1",
+ "espree": "^1.11.0",
+ "gulp": "^3.8.10",
+ "gulp-bump": "^0.2.2",
+ "gulp-filter": "^2.0.0",
+ "gulp-git": "^1.0.1",
+ "gulp-tag-version": "^1.3.0",
+ "jshint": "^2.5.6",
+ "mocha": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "homepage": "https://github.com/estools/estraverse",
+ "license": "BSD-2-Clause",
+ "main": "estraverse.js",
+ "maintainers": [
+ {
+ "name": "Yusuke Suzuki",
+ "email": "utatane.tea@gmail.com",
+ "url": "http://github.com/Constellation"
+ }
+ ],
+ "name": "estraverse",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/estools/estraverse.git"
+ },
+ "scripts": {
+ "lint": "jshint estraverse.js",
+ "test": "npm run-script lint && npm run-script unit-test",
+ "unit-test": "mocha --compilers js:babel-register"
+ },
+ "version": "4.3.0"
+}
diff --git a/node_modules/esutils/LICENSE.BSD b/node_modules/esutils/LICENSE.BSD
new file mode 100644
index 00000000..3e580c35
--- /dev/null
+++ b/node_modules/esutils/LICENSE.BSD
@@ -0,0 +1,19 @@
+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.
+
+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 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/esutils/README.md b/node_modules/esutils/README.md
new file mode 100644
index 00000000..517526cf
--- /dev/null
+++ b/node_modules/esutils/README.md
@@ -0,0 +1,174 @@
+### esutils [](http://travis-ci.org/estools/esutils)
+esutils ([esutils](http://github.com/estools/esutils)) is
+utility box for ECMAScript language tools.
+
+### API
+
+### ast
+
+#### ast.isExpression(node)
+
+Returns true if `node` is an Expression as defined in ECMA262 edition 5.1 section
+[11](https://es5.github.io/#x11).
+
+#### ast.isStatement(node)
+
+Returns true if `node` is a Statement as defined in ECMA262 edition 5.1 section
+[12](https://es5.github.io/#x12).
+
+#### ast.isIterationStatement(node)
+
+Returns true if `node` is an IterationStatement as defined in ECMA262 edition
+5.1 section [12.6](https://es5.github.io/#x12.6).
+
+#### ast.isSourceElement(node)
+
+Returns true if `node` is a SourceElement as defined in ECMA262 edition 5.1
+section [14](https://es5.github.io/#x14).
+
+#### ast.trailingStatement(node)
+
+Returns `Statement?` if `node` has trailing `Statement`.
+```js
+if (cond)
+ consequent;
+```
+When taking this `IfStatement`, returns `consequent;` statement.
+
+#### ast.isProblematicIfStatement(node)
+
+Returns true if `node` is a problematic IfStatement. If `node` is a problematic `IfStatement`, `node` cannot be represented as an one on one JavaScript code.
+```js
+{
+ type: 'IfStatement',
+ consequent: {
+ type: 'WithStatement',
+ body: {
+ type: 'IfStatement',
+ consequent: {type: 'EmptyStatement'}
+ }
+ },
+ alternate: {type: 'EmptyStatement'}
+}
+```
+The above node cannot be represented as a JavaScript code, since the top level `else` alternate belongs to an inner `IfStatement`.
+
+
+### code
+
+#### code.isDecimalDigit(code)
+
+Return true if provided code is decimal digit.
+
+#### code.isHexDigit(code)
+
+Return true if provided code is hexadecimal digit.
+
+#### code.isOctalDigit(code)
+
+Return true if provided code is octal digit.
+
+#### code.isWhiteSpace(code)
+
+Return true if provided code is white space. White space characters are formally defined in ECMA262.
+
+#### code.isLineTerminator(code)
+
+Return true if provided code is line terminator. Line terminator characters are formally defined in ECMA262.
+
+#### code.isIdentifierStart(code)
+
+Return true if provided code can be the first character of ECMA262 Identifier. They are formally defined in ECMA262.
+
+#### code.isIdentifierPart(code)
+
+Return true if provided code can be the trailing character of ECMA262 Identifier. They are formally defined in ECMA262.
+
+### keyword
+
+#### keyword.isKeywordES5(id, strict)
+
+Returns `true` if provided identifier string is a Keyword or Future Reserved Word
+in ECMA262 edition 5.1. They are formally defined in ECMA262 sections
+[7.6.1.1](http://es5.github.io/#x7.6.1.1) and [7.6.1.2](http://es5.github.io/#x7.6.1.2),
+respectively. If the `strict` flag is truthy, this function additionally checks whether
+`id` is a Keyword or Future Reserved Word under strict mode.
+
+#### keyword.isKeywordES6(id, strict)
+
+Returns `true` if provided identifier string is a Keyword or Future Reserved Word
+in ECMA262 edition 6. They are formally defined in ECMA262 sections
+[11.6.2.1](http://ecma-international.org/ecma-262/6.0/#sec-keywords) and
+[11.6.2.2](http://ecma-international.org/ecma-262/6.0/#sec-future-reserved-words),
+respectively. If the `strict` flag is truthy, this function additionally checks whether
+`id` is a Keyword or Future Reserved Word under strict mode.
+
+#### keyword.isReservedWordES5(id, strict)
+
+Returns `true` if provided identifier string is a Reserved Word in ECMA262 edition 5.1.
+They are formally defined in ECMA262 section [7.6.1](http://es5.github.io/#x7.6.1).
+If the `strict` flag is truthy, this function additionally checks whether `id`
+is a Reserved Word under strict mode.
+
+#### keyword.isReservedWordES6(id, strict)
+
+Returns `true` if provided identifier string is a Reserved Word in ECMA262 edition 6.
+They are formally defined in ECMA262 section [11.6.2](http://ecma-international.org/ecma-262/6.0/#sec-reserved-words).
+If the `strict` flag is truthy, this function additionally checks whether `id`
+is a Reserved Word under strict mode.
+
+#### keyword.isRestrictedWord(id)
+
+Returns `true` if provided identifier string is one of `eval` or `arguments`.
+They are restricted in strict mode code throughout ECMA262 edition 5.1 and
+in ECMA262 edition 6 section [12.1.1](http://ecma-international.org/ecma-262/6.0/#sec-identifiers-static-semantics-early-errors).
+
+#### keyword.isIdentifierNameES5(id)
+
+Return true if provided identifier string is an IdentifierName as specified in
+ECMA262 edition 5.1 section [7.6](https://es5.github.io/#x7.6).
+
+#### keyword.isIdentifierNameES6(id)
+
+Return true if provided identifier string is an IdentifierName as specified in
+ECMA262 edition 6 section [11.6](http://ecma-international.org/ecma-262/6.0/#sec-names-and-keywords).
+
+#### keyword.isIdentifierES5(id, strict)
+
+Return true if provided identifier string is an Identifier as specified in
+ECMA262 edition 5.1 section [7.6](https://es5.github.io/#x7.6). If the `strict`
+flag is truthy, this function additionally checks whether `id` is an Identifier
+under strict mode.
+
+#### keyword.isIdentifierES6(id, strict)
+
+Return true if provided identifier string is an Identifier as specified in
+ECMA262 edition 6 section [12.1](http://ecma-international.org/ecma-262/6.0/#sec-identifiers).
+If the `strict` flag is truthy, this function additionally checks whether `id`
+is an Identifier under strict mode.
+
+### License
+
+Copyright (C) 2013 [Yusuke Suzuki](http://github.com/Constellation)
+ (twitter: [@Constellation](http://twitter.com/Constellation)) and other contributors.
+
+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.
+
+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 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/esutils/lib/ast.js b/node_modules/esutils/lib/ast.js
new file mode 100644
index 00000000..8faadae1
--- /dev/null
+++ b/node_modules/esutils/lib/ast.js
@@ -0,0 +1,144 @@
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ 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.
+
+ 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 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.
+*/
+
+(function () {
+ 'use strict';
+
+ function isExpression(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'ArrayExpression':
+ case 'AssignmentExpression':
+ case 'BinaryExpression':
+ case 'CallExpression':
+ case 'ConditionalExpression':
+ case 'FunctionExpression':
+ case 'Identifier':
+ case 'Literal':
+ case 'LogicalExpression':
+ case 'MemberExpression':
+ case 'NewExpression':
+ case 'ObjectExpression':
+ case 'SequenceExpression':
+ case 'ThisExpression':
+ case 'UnaryExpression':
+ case 'UpdateExpression':
+ return true;
+ }
+ return false;
+ }
+
+ function isIterationStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'DoWhileStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'WhileStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'BlockStatement':
+ case 'BreakStatement':
+ case 'ContinueStatement':
+ case 'DebuggerStatement':
+ case 'DoWhileStatement':
+ case 'EmptyStatement':
+ case 'ExpressionStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'IfStatement':
+ case 'LabeledStatement':
+ case 'ReturnStatement':
+ case 'SwitchStatement':
+ case 'ThrowStatement':
+ case 'TryStatement':
+ case 'VariableDeclaration':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isSourceElement(node) {
+ return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
+ }
+
+ function trailingStatement(node) {
+ switch (node.type) {
+ case 'IfStatement':
+ if (node.alternate != null) {
+ return node.alternate;
+ }
+ return node.consequent;
+
+ case 'LabeledStatement':
+ case 'ForStatement':
+ case 'ForInStatement':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return node.body;
+ }
+ return null;
+ }
+
+ function isProblematicIfStatement(node) {
+ var current;
+
+ if (node.type !== 'IfStatement') {
+ return false;
+ }
+ if (node.alternate == null) {
+ return false;
+ }
+ current = node.consequent;
+ do {
+ if (current.type === 'IfStatement') {
+ if (current.alternate == null) {
+ return true;
+ }
+ }
+ current = trailingStatement(current);
+ } while (current);
+
+ return false;
+ }
+
+ module.exports = {
+ isExpression: isExpression,
+ isStatement: isStatement,
+ isIterationStatement: isIterationStatement,
+ isSourceElement: isSourceElement,
+ isProblematicIfStatement: isProblematicIfStatement,
+
+ trailingStatement: trailingStatement
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esutils/lib/code.js b/node_modules/esutils/lib/code.js
new file mode 100644
index 00000000..23136af9
--- /dev/null
+++ b/node_modules/esutils/lib/code.js
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2013-2014 Yusuke Suzuki
+ Copyright (C) 2014 Ivan Nikulin
+
+ 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.
+
+ 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 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.
+*/
+
+(function () {
+ 'use strict';
+
+ var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch;
+
+ // See `tools/generate-identifier-regex.js`.
+ ES5Regex = {
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
+ };
+
+ ES6Regex = {
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+
+ function isDecimalDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39; // 0..9
+ }
+
+ function isHexDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39 || // 0..9
+ 0x61 <= ch && ch <= 0x66 || // a..f
+ 0x41 <= ch && ch <= 0x46; // A..F
+ }
+
+ function isOctalDigit(ch) {
+ return ch >= 0x30 && ch <= 0x37; // 0..7
+ }
+
+ // 7.2 White Space
+
+ NON_ASCII_WHITESPACES = [
+ 0x1680,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
+ 0x202F, 0x205F,
+ 0x3000,
+ 0xFEFF
+ ];
+
+ function isWhiteSpace(ch) {
+ return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 ||
+ ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
+ }
+
+ // 7.3 Line Terminators
+
+ function isLineTerminator(ch) {
+ return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
+ }
+
+ // 7.6 Identifier Names and Identifiers
+
+ function fromCodePoint(cp) {
+ if (cp <= 0xFFFF) { return String.fromCharCode(cp); }
+ var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
+ var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00);
+ return cu1 + cu2;
+ }
+
+ IDENTIFIER_START = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_START[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ IDENTIFIER_PART = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_PART[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch >= 0x30 && ch <= 0x39 || // 0..9
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ function isIdentifierStartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierStartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ module.exports = {
+ isDecimalDigit: isDecimalDigit,
+ isHexDigit: isHexDigit,
+ isOctalDigit: isOctalDigit,
+ isWhiteSpace: isWhiteSpace,
+ isLineTerminator: isLineTerminator,
+ isIdentifierStartES5: isIdentifierStartES5,
+ isIdentifierPartES5: isIdentifierPartES5,
+ isIdentifierStartES6: isIdentifierStartES6,
+ isIdentifierPartES6: isIdentifierPartES6
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esutils/lib/keyword.js b/node_modules/esutils/lib/keyword.js
new file mode 100644
index 00000000..13c8c6a9
--- /dev/null
+++ b/node_modules/esutils/lib/keyword.js
@@ -0,0 +1,165 @@
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ 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.
+
+ 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 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.
+*/
+
+(function () {
+ 'use strict';
+
+ var code = require('./code');
+
+ function isStrictModeReservedWordES6(id) {
+ switch (id) {
+ case 'implements':
+ case 'interface':
+ case 'package':
+ case 'private':
+ case 'protected':
+ case 'public':
+ case 'static':
+ case 'let':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isKeywordES5(id, strict) {
+ // yield should not be treated as keyword under non-strict mode.
+ if (!strict && id === 'yield') {
+ return false;
+ }
+ return isKeywordES6(id, strict);
+ }
+
+ function isKeywordES6(id, strict) {
+ if (strict && isStrictModeReservedWordES6(id)) {
+ return true;
+ }
+
+ switch (id.length) {
+ case 2:
+ return (id === 'if') || (id === 'in') || (id === 'do');
+ case 3:
+ return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
+ case 4:
+ return (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum');
+ case 5:
+ return (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') ||
+ (id === 'class') || (id === 'super');
+ case 6:
+ return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
+ (id === 'switch') || (id === 'export') || (id === 'import');
+ case 7:
+ return (id === 'default') || (id === 'finally') || (id === 'extends');
+ case 8:
+ return (id === 'function') || (id === 'continue') || (id === 'debugger');
+ case 10:
+ return (id === 'instanceof');
+ default:
+ return false;
+ }
+ }
+
+ function isReservedWordES5(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
+ }
+
+ function isReservedWordES6(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
+ }
+
+ function isRestrictedWord(id) {
+ return id === 'eval' || id === 'arguments';
+ }
+
+ function isIdentifierNameES5(id) {
+ var i, iz, ch;
+
+ if (id.length === 0) { return false; }
+
+ ch = id.charCodeAt(0);
+ if (!code.isIdentifierStartES5(ch)) {
+ return false;
+ }
+
+ for (i = 1, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (!code.isIdentifierPartES5(ch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function decodeUtf16(lead, trail) {
+ return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+ }
+
+ function isIdentifierNameES6(id) {
+ var i, iz, ch, lowCh, check;
+
+ if (id.length === 0) { return false; }
+
+ check = code.isIdentifierStartES6;
+ for (i = 0, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (0xD800 <= ch && ch <= 0xDBFF) {
+ ++i;
+ if (i >= iz) { return false; }
+ lowCh = id.charCodeAt(i);
+ if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
+ return false;
+ }
+ ch = decodeUtf16(ch, lowCh);
+ }
+ if (!check(ch)) {
+ return false;
+ }
+ check = code.isIdentifierPartES6;
+ }
+ return true;
+ }
+
+ function isIdentifierES5(id, strict) {
+ return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
+ }
+
+ function isIdentifierES6(id, strict) {
+ return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
+ }
+
+ module.exports = {
+ isKeywordES5: isKeywordES5,
+ isKeywordES6: isKeywordES6,
+ isReservedWordES5: isReservedWordES5,
+ isReservedWordES6: isReservedWordES6,
+ isRestrictedWord: isRestrictedWord,
+ isIdentifierNameES5: isIdentifierNameES5,
+ isIdentifierNameES6: isIdentifierNameES6,
+ isIdentifierES5: isIdentifierES5,
+ isIdentifierES6: isIdentifierES6
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esutils/lib/utils.js b/node_modules/esutils/lib/utils.js
new file mode 100644
index 00000000..ce18faa6
--- /dev/null
+++ b/node_modules/esutils/lib/utils.js
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ 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.
+
+ 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 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.
+*/
+
+
+(function () {
+ 'use strict';
+
+ exports.ast = require('./ast');
+ exports.code = require('./code');
+ exports.keyword = require('./keyword');
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esutils/package.json b/node_modules/esutils/package.json
new file mode 100644
index 00000000..53029f87
--- /dev/null
+++ b/node_modules/esutils/package.json
@@ -0,0 +1,72 @@
+{
+ "_from": "esutils@^2.0.2",
+ "_id": "esutils@2.0.3",
+ "_inBundle": false,
+ "_integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "_location": "/esutils",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "esutils@^2.0.2",
+ "name": "esutils",
+ "escapedName": "esutils",
+ "rawSpec": "^2.0.2",
+ "saveSpec": null,
+ "fetchSpec": "^2.0.2"
+ },
+ "_requiredBy": [
+ "/escodegen"
+ ],
+ "_resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "_shasum": "74d2eb4de0b8da1293711910d50775b9b710ef64",
+ "_spec": "esutils@^2.0.2",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\escodegen",
+ "bugs": {
+ "url": "https://github.com/estools/esutils/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "utility box for ECMAScript language tools",
+ "devDependencies": {
+ "chai": "~1.7.2",
+ "coffee-script": "~1.6.3",
+ "jshint": "2.6.3",
+ "mocha": "~2.2.1",
+ "regenerate": "~1.3.1",
+ "unicode-9.0.0": "~0.7.0"
+ },
+ "directories": {
+ "lib": "./lib"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "LICENSE.BSD",
+ "README.md",
+ "lib"
+ ],
+ "homepage": "https://github.com/estools/esutils",
+ "license": "BSD-2-Clause",
+ "main": "lib/utils.js",
+ "maintainers": [
+ {
+ "name": "Yusuke Suzuki",
+ "email": "utatane.tea@gmail.com",
+ "url": "http://github.com/Constellation"
+ }
+ ],
+ "name": "esutils",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/estools/esutils.git"
+ },
+ "scripts": {
+ "generate-regex": "node tools/generate-identifier-regex.js",
+ "lint": "jshint lib/*.js",
+ "test": "npm run-script lint && npm run-script unit-test",
+ "unit-test": "mocha --compilers coffee:coffee-script -R spec"
+ },
+ "version": "2.0.3"
+}
diff --git a/node_modules/fast-levenshtein/LICENSE.md b/node_modules/fast-levenshtein/LICENSE.md
new file mode 100644
index 00000000..6212406b
--- /dev/null
+++ b/node_modules/fast-levenshtein/LICENSE.md
@@ -0,0 +1,25 @@
+(MIT License)
+
+Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.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/fast-levenshtein/README.md b/node_modules/fast-levenshtein/README.md
new file mode 100644
index 00000000..a7789953
--- /dev/null
+++ b/node_modules/fast-levenshtein/README.md
@@ -0,0 +1,104 @@
+# fast-levenshtein - Levenshtein algorithm in Javascript
+
+[](http://travis-ci.org/hiddentao/fast-levenshtein)
+[](https://badge.fury.io/js/fast-levenshtein)
+[](https://www.npmjs.com/package/fast-levenshtein)
+[](https://twitter.com/hiddentao)
+
+An efficient Javascript implementation of the [Levenshtein algorithm](http://en.wikipedia.org/wiki/Levenshtein_distance) with locale-specific collator support.
+
+## Features
+
+* Works in node.js and in the browser.
+* Better performance than other implementations by not needing to store the whole matrix ([more info](http://www.codeproject.com/Articles/13525/Fast-memory-efficient-Levenshtein-algorithm)).
+* Locale-sensitive string comparisions if needed.
+* Comprehensive test suite and performance benchmark.
+* Small: <1 KB minified and gzipped
+
+## Installation
+
+### node.js
+
+Install using [npm](http://npmjs.org/):
+
+```bash
+$ npm install fast-levenshtein
+```
+
+### Browser
+
+Using bower:
+
+```bash
+$ bower install fast-levenshtein
+```
+
+If you are not using any module loader system then the API will then be accessible via the `window.Levenshtein` object.
+
+## Examples
+
+**Default usage**
+
+```javascript
+var levenshtein = require('fast-levenshtein');
+
+var distance = levenshtein.get('back', 'book'); // 2
+var distance = levenshtein.get('我愛你', '我叫你'); // 1
+```
+
+**Locale-sensitive string comparisons**
+
+It supports using [Intl.Collator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator) for locale-sensitive string comparisons:
+
+```javascript
+var levenshtein = require('fast-levenshtein');
+
+levenshtein.get('mikailovitch', 'Mikhaïlovitch', { useCollator: true});
+// 1
+```
+
+## Building and Testing
+
+To build the code and run the tests:
+
+```bash
+$ npm install -g grunt-cli
+$ npm install
+$ npm run build
+```
+
+## Performance
+
+_Thanks to [Titus Wormer](https://github.com/wooorm) for [encouraging me](https://github.com/hiddentao/fast-levenshtein/issues/1) to do this._
+
+Benchmarked against other node.js levenshtein distance modules (on Macbook Air 2012, Core i7, 8GB RAM):
+
+```bash
+Running suite Implementation comparison [benchmark/speed.js]...
+>> levenshtein-edit-distance x 234 ops/sec ±3.02% (73 runs sampled)
+>> levenshtein-component x 422 ops/sec ±4.38% (83 runs sampled)
+>> levenshtein-deltas x 283 ops/sec ±3.83% (78 runs sampled)
+>> natural x 255 ops/sec ±0.76% (88 runs sampled)
+>> levenshtein x 180 ops/sec ±3.55% (86 runs sampled)
+>> fast-levenshtein x 1,792 ops/sec ±2.72% (95 runs sampled)
+Benchmark done.
+Fastest test is fast-levenshtein at 4.2x faster than levenshtein-component
+```
+
+You can run this benchmark yourself by doing:
+
+```bash
+$ npm install
+$ npm run build
+$ npm run benchmark
+```
+
+## Contributing
+
+If you wish to submit a pull request please update and/or create new tests for any changes you make and ensure the grunt build passes.
+
+See [CONTRIBUTING.md](https://github.com/hiddentao/fast-levenshtein/blob/master/CONTRIBUTING.md) for details.
+
+## License
+
+MIT - see [LICENSE.md](https://github.com/hiddentao/fast-levenshtein/blob/master/LICENSE.md)
diff --git a/node_modules/fast-levenshtein/levenshtein.js b/node_modules/fast-levenshtein/levenshtein.js
new file mode 100644
index 00000000..dbe36280
--- /dev/null
+++ b/node_modules/fast-levenshtein/levenshtein.js
@@ -0,0 +1,136 @@
+(function() {
+ 'use strict';
+
+ var collator;
+ try {
+ collator = (typeof Intl !== "undefined" && typeof Intl.Collator !== "undefined") ? Intl.Collator("generic", { sensitivity: "base" }) : null;
+ } catch (err){
+ console.log("Collator could not be initialized and wouldn't be used");
+ }
+ // arrays to re-use
+ var prevRow = [],
+ str2Char = [];
+
+ /**
+ * Based on the algorithm at http://en.wikipedia.org/wiki/Levenshtein_distance.
+ */
+ var Levenshtein = {
+ /**
+ * Calculate levenshtein distance of the two strings.
+ *
+ * @param str1 String the first string.
+ * @param str2 String the second string.
+ * @param [options] Additional options.
+ * @param [options.useCollator] Use `Intl.Collator` for locale-sensitive string comparison.
+ * @return Integer the levenshtein distance (0 and above).
+ */
+ get: function(str1, str2, options) {
+ var useCollator = (options && collator && options.useCollator);
+
+ var str1Len = str1.length,
+ str2Len = str2.length;
+
+ // base cases
+ if (str1Len === 0) return str2Len;
+ if (str2Len === 0) return str1Len;
+
+ // two rows
+ var curCol, nextCol, i, j, tmp;
+
+ // initialise previous row
+ for (i=0; i tmp) {
+ nextCol = tmp;
+ }
+ // deletion
+ tmp = prevRow[j + 1] + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+
+ // copy current col value into previous (in preparation for next iteration)
+ prevRow[j] = curCol;
+ }
+
+ // copy last col value into previous (in preparation for next iteration)
+ prevRow[j] = nextCol;
+ }
+ }
+ else {
+ // calculate current row distance from previous row without collator
+ for (i = 0; i < str1Len; ++i) {
+ nextCol = i + 1;
+
+ for (j = 0; j < str2Len; ++j) {
+ curCol = nextCol;
+
+ // substution
+ strCmp = str1.charCodeAt(i) === str2Char[j];
+
+ nextCol = prevRow[j] + (strCmp ? 0 : 1);
+
+ // insertion
+ tmp = curCol + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+ // deletion
+ tmp = prevRow[j + 1] + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+
+ // copy current col value into previous (in preparation for next iteration)
+ prevRow[j] = curCol;
+ }
+
+ // copy last col value into previous (in preparation for next iteration)
+ prevRow[j] = nextCol;
+ }
+ }
+ return nextCol;
+ }
+
+ };
+
+ // amd
+ if (typeof define !== "undefined" && define !== null && define.amd) {
+ define(function() {
+ return Levenshtein;
+ });
+ }
+ // commonjs
+ else if (typeof module !== "undefined" && module !== null && typeof exports !== "undefined" && module.exports === exports) {
+ module.exports = Levenshtein;
+ }
+ // web worker
+ else if (typeof self !== "undefined" && typeof self.postMessage === 'function' && typeof self.importScripts === 'function') {
+ self.Levenshtein = Levenshtein;
+ }
+ // browser main thread
+ else if (typeof window !== "undefined" && window !== null) {
+ window.Levenshtein = Levenshtein;
+ }
+}());
+
diff --git a/node_modules/fast-levenshtein/package.json b/node_modules/fast-levenshtein/package.json
new file mode 100644
index 00000000..a22731d0
--- /dev/null
+++ b/node_modules/fast-levenshtein/package.json
@@ -0,0 +1,72 @@
+{
+ "_from": "fast-levenshtein@~2.0.6",
+ "_id": "fast-levenshtein@2.0.6",
+ "_inBundle": false,
+ "_integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "_location": "/fast-levenshtein",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "fast-levenshtein@~2.0.6",
+ "name": "fast-levenshtein",
+ "escapedName": "fast-levenshtein",
+ "rawSpec": "~2.0.6",
+ "saveSpec": null,
+ "fetchSpec": "~2.0.6"
+ },
+ "_requiredBy": [
+ "/optionator"
+ ],
+ "_resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "_shasum": "3d8a5c66883a16a30ca8643e851f19baa7797917",
+ "_spec": "fast-levenshtein@~2.0.6",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\optionator",
+ "author": {
+ "name": "Ramesh Nair",
+ "email": "ram@hiddentao.com",
+ "url": "http://www.hiddentao.com/"
+ },
+ "bugs": {
+ "url": "https://github.com/hiddentao/fast-levenshtein/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "Efficient implementation of Levenshtein algorithm with locale-specific collator support.",
+ "devDependencies": {
+ "chai": "~1.5.0",
+ "grunt": "~0.4.1",
+ "grunt-benchmark": "~0.2.0",
+ "grunt-cli": "^1.2.0",
+ "grunt-contrib-jshint": "~0.4.3",
+ "grunt-contrib-uglify": "~0.2.0",
+ "grunt-mocha-test": "~0.2.2",
+ "grunt-npm-install": "~0.1.0",
+ "load-grunt-tasks": "~0.6.0",
+ "lodash": "^4.0.1",
+ "mocha": "~1.9.0"
+ },
+ "files": [
+ "levenshtein.js"
+ ],
+ "homepage": "https://github.com/hiddentao/fast-levenshtein#readme",
+ "keywords": [
+ "levenshtein",
+ "distance",
+ "string"
+ ],
+ "license": "MIT",
+ "main": "levenshtein.js",
+ "name": "fast-levenshtein",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/hiddentao/fast-levenshtein.git"
+ },
+ "scripts": {
+ "benchmark": "grunt benchmark",
+ "build": "grunt build",
+ "prepublish": "npm run build",
+ "test": "mocha"
+ },
+ "version": "2.0.6"
+}
diff --git a/node_modules/jsonpath/.jscsrc b/node_modules/jsonpath/.jscsrc
new file mode 100644
index 00000000..4f9e965b
--- /dev/null
+++ b/node_modules/jsonpath/.jscsrc
@@ -0,0 +1,60 @@
+{
+ "disallowSpacesInNamedFunctionExpression": {
+ "beforeOpeningRoundBrace": true
+ },
+ "disallowSpacesInFunctionExpression": {
+ "beforeOpeningRoundBrace": true
+ },
+ "disallowSpacesInAnonymousFunctionExpression": {
+ "beforeOpeningRoundBrace": true
+ },
+ "disallowSpacesInFunctionDeclaration": {
+ "beforeOpeningRoundBrace": true
+ },
+ "disallowEmptyBlocks": true,
+ "disallowSpacesInsideParentheses": true,
+ "disallowQuotedKeysInObjects": true,
+ "disallowSpaceAfterObjectKeys": true,
+ "disallowSpaceAfterPrefixUnaryOperators": true,
+ "disallowSpaceBeforePostfixUnaryOperators": true,
+ "disallowSpaceBeforeBinaryOperators": [
+ ","
+ ],
+ "disallowMixedSpacesAndTabs": true,
+ "disallowTrailingWhitespace": true,
+ "disallowTrailingComma": true,
+ "disallowYodaConditions": true,
+ "disallowKeywords": [ "with" ],
+ "disallowMultipleLineBreaks": true,
+ "requireSpaceBeforeBlockStatements": true,
+ "requireParenthesesAroundIIFE": true,
+ "requireSpacesInConditionalExpression": true,
+ "disallowMultipleVarDecl": true,
+ "requireBlocksOnNewline": 1,
+ "requireCommaBeforeLineBreak": true,
+ "requireSpaceBeforeBinaryOperators": true,
+ "requireSpaceAfterBinaryOperators": true,
+ "requireLineFeedAtFileEnd": true,
+ "requireCapitalizedConstructors": true,
+ "requireDotNotation": true,
+ "requireSpacesInForStatement": true,
+ "requireCurlyBraces": [
+ "do"
+ ],
+ "requireSpaceAfterKeywords": [
+ "if",
+ "else",
+ "for",
+ "while",
+ "do",
+ "switch",
+ "case",
+ "return",
+ "try",
+ "catch",
+ "typeof"
+ ],
+ "safeContextKeyword": "self",
+ "validateLineBreaks": "LF",
+ "validateIndentation": 2
+}
diff --git a/node_modules/jsonpath/.jshintrc b/node_modules/jsonpath/.jshintrc
new file mode 100644
index 00000000..b175c334
--- /dev/null
+++ b/node_modules/jsonpath/.jshintrc
@@ -0,0 +1,9 @@
+{
+ "node": true,
+ "undef": true,
+ "unused": true,
+ "lastsemic": true,
+ "-W058": false, /* don't require parentheses for no-arg constructors */
+ "-W054": false, /* use Function constructor responsibly */
+ "-W033": false /* let jscs deal with semicolons */
+}
diff --git a/node_modules/jsonpath/.travis.yml b/node_modules/jsonpath/.travis.yml
new file mode 100644
index 00000000..6e5919de
--- /dev/null
+++ b/node_modules/jsonpath/.travis.yml
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+ - "0.10"
diff --git a/node_modules/jsonpath/Dockerfile b/node_modules/jsonpath/Dockerfile
new file mode 100644
index 00000000..58b1abfb
--- /dev/null
+++ b/node_modules/jsonpath/Dockerfile
@@ -0,0 +1 @@
+FROM node:0.11-onbuild
diff --git a/node_modules/jsonpath/Gruntfile.js b/node_modules/jsonpath/Gruntfile.js
new file mode 100644
index 00000000..527b04ba
--- /dev/null
+++ b/node_modules/jsonpath/Gruntfile.js
@@ -0,0 +1,83 @@
+var Browserify = require('browserify');
+var bresolve = require('browser-resolve');
+patchResolve();
+
+module.exports = function (grunt) {
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+ outputFolder: ".",
+
+ browserify: {
+ main: {
+ src: ['index.js'],
+ dest: '<%= outputFolder %>/<%= pkg.name %>.js',
+ options: {
+ browserifyOptions: { standalone: '<%= pkg.name %>' },
+ banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n',
+ alias: {
+ "jsonpath": "./index.js"
+ },
+ require: [
+ /**
+ * When running in Node, we require('./aesprim') and that module takes care of monkey-patching esprima
+ * using resolve, path finding, etc...
+ * Anyways, Browserify doesn't support "resolve", so we need to trick the module. We'll actually be
+ * returning a verbatim, non-modified "esprima" when the code runs require('./aesprim').
+ * That is ok because we will modify the "esprima" source code right after the bundle process, via
+ * the postBundleCB callback.
+ */
+ ["esprima", {expose: "./aesprim"}]
+ ],
+ ignore: [
+ 'file',
+ 'system',
+ 'source-map',
+ 'estraverse',
+ 'escodegen',
+ 'underscore',
+ 'reflect',
+ 'JSONSelect',
+ './lib/aesprim.js'
+ //'assert' //can't remove because of lib/index.js,
+ ],
+ postBundleCB: function(err, src, next) {
+ /**
+ * This is ugly, but we need to make "esprima" understand '@' as a valid character.
+ * It's either this or bundle a copy of the library with those few bytes of changes.
+ */
+ src = src.toString("utf8").replace(/(function isIdentifierStart\(ch\) {\s+return)/m, '$1 (ch == 0x40) || ');
+ next(err, new Buffer(src, "utf8"));
+ }
+ }
+ }
+ },
+
+ uglify: {
+ options: {
+ banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n'
+ },
+ build: {
+ src: '<%= outputFolder %>/<%= pkg.name %>.js',
+ dest: '<%= outputFolder %>/<%= pkg.name %>.min.js'
+ }
+ }
+
+ });
+
+ grunt.loadNpmTasks('grunt-browserify');
+ grunt.loadNpmTasks('grunt-contrib-uglify')
+ grunt.registerTask('default', ['browserify', 'uglify']);
+
+};
+
+function patchResolve() {
+ var _createDeps = Browserify.prototype._createDeps;
+ Browserify.prototype._createDeps = function() {
+ var returnValue = _createDeps.apply(this, arguments);
+ this._bresolve = function(id, opts, cb) {
+ opts.browser = 'alias';
+ return bresolve(id, opts, cb);
+ };
+ return returnValue;
+ }
+}
diff --git a/node_modules/jsonpath/LICENSE b/node_modules/jsonpath/LICENSE
new file mode 100644
index 00000000..3393f80d
--- /dev/null
+++ b/node_modules/jsonpath/LICENSE
@@ -0,0 +1,7 @@
+Copyright (c) 2014-2016 David Chester
+
+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/jsonpath/README.md b/node_modules/jsonpath/README.md
new file mode 100644
index 00000000..5a18bcd4
--- /dev/null
+++ b/node_modules/jsonpath/README.md
@@ -0,0 +1,216 @@
+[](https://travis-ci.org/dchester/jsonpath)
+
+# jsonpath
+
+Query JavaScript objects with JSONPath expressions. Robust / safe JSONPath engine for Node.js.
+
+
+## Query Example
+
+```javascript
+var cities = [
+ { name: "London", "population": 8615246 },
+ { name: "Berlin", "population": 3517424 },
+ { name: "Madrid", "population": 3165235 },
+ { name: "Rome", "population": 2870528 }
+];
+
+var jp = require('jsonpath');
+var names = jp.query(cities, '$..name');
+
+// [ "London", "Berlin", "Madrid", "Rome" ]
+```
+
+## Install
+
+Install from npm:
+```bash
+$ npm install jsonpath
+```
+
+## JSONPath Syntax
+
+Here are syntax and examples adapted from [Stefan Goessner's original post](http://goessner.net/articles/JsonPath/) introducing JSONPath in 2007.
+
+JSONPath | Description
+-----------------|------------
+`$` | The root object/element
+`@` | The current object/element
+`.` | Child member operator
+`..` | Recursive descendant operator; JSONPath borrows this syntax from E4X
+`*` | Wildcard matching all objects/elements regardless their names
+`[]` | Subscript operator
+`[,]` | Union operator for alternate names or array indices as a set
+`[start:end:step]` | Array slice operator borrowed from ES4 / Python
+`?()` | Applies a filter (script) expression via static evaluation
+`()` | Script expression via static evaluation
+
+Given this sample data set, see example expressions below:
+
+```javascript
+{
+ "store": {
+ "book": [
+ {
+ "category": "reference",
+ "author": "Nigel Rees",
+ "title": "Sayings of the Century",
+ "price": 8.95
+ }, {
+ "category": "fiction",
+ "author": "Evelyn Waugh",
+ "title": "Sword of Honour",
+ "price": 12.99
+ }, {
+ "category": "fiction",
+ "author": "Herman Melville",
+ "title": "Moby Dick",
+ "isbn": "0-553-21311-3",
+ "price": 8.99
+ }, {
+ "category": "fiction",
+ "author": "J. R. R. Tolkien",
+ "title": "The Lord of the Rings",
+ "isbn": "0-395-19395-8",
+ "price": 22.99
+ }
+ ],
+ "bicycle": {
+ "color": "red",
+ "price": 19.95
+ }
+ }
+}
+```
+
+Example JSONPath expressions:
+
+JSONPath | Description
+------------------------------|------------
+`$.store.book[*].author` | The authors of all books in the store
+`$..author` | All authors
+`$.store.*` | All things in store, which are some books and a red bicycle
+`$.store..price` | The price of everything in the store
+`$..book[2]` | The third book
+`$..book[(@.length-1)]` | The last book via script subscript
+`$..book[-1:]` | The last book via slice
+`$..book[0,1]` | The first two books via subscript union
+`$..book[:2]` | The first two books via subscript array slice
+`$..book[?(@.isbn)]` | Filter all books with isbn number
+`$..book[?(@.price<10)]` | Filter all books cheaper than 10
+`$..book[?(@.price==8.95)]` | Filter all books that cost 8.95
+`$..book[?(@.price<30 && @.category=="fiction")]` | Filter all fiction books cheaper than 30
+`$..*` | All members of JSON structure
+
+
+## Methods
+
+#### jp.query(obj, pathExpression[, count])
+
+Find elements in `obj` matching `pathExpression`. Returns an array of elements that satisfy the provided JSONPath expression, or an empty array if none were matched. Returns only first `count` elements if specified.
+
+```javascript
+var authors = jp.query(data, '$..author');
+// [ 'Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien' ]
+```
+
+#### jp.paths(obj, pathExpression[, count])
+
+Find paths to elements in `obj` matching `pathExpression`. Returns an array of element paths that satisfy the provided JSONPath expression. Each path is itself an array of keys representing the location within `obj` of the matching element. Returns only first `count` paths if specified.
+
+
+```javascript
+var paths = jp.paths(data, '$..author');
+// [
+// ['$', 'store', 'book', 0, 'author'] },
+// ['$', 'store', 'book', 1, 'author'] },
+// ['$', 'store', 'book', 2, 'author'] },
+// ['$', 'store', 'book', 3, 'author'] }
+// ]
+```
+
+#### jp.nodes(obj, pathExpression[, count])
+
+Find elements and their corresponding paths in `obj` matching `pathExpression`. Returns an array of node objects where each node has a `path` containing an array of keys representing the location within `obj`, and a `value` pointing to the matched element. Returns only first `count` nodes if specified.
+
+```javascript
+var nodes = jp.nodes(data, '$..author');
+// [
+// { path: ['$', 'store', 'book', 0, 'author'], value: 'Nigel Rees' },
+// { path: ['$', 'store', 'book', 1, 'author'], value: 'Evelyn Waugh' },
+// { path: ['$', 'store', 'book', 2, 'author'], value: 'Herman Melville' },
+// { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. Tolkien' }
+// ]
+```
+
+#### jp.value(obj, pathExpression[, newValue])
+
+Returns the value of the first element matching `pathExpression`. If `newValue` is provided, sets the value of the first matching element and returns the new value.
+
+#### jp.parent(obj, pathExpression)
+
+Returns the parent of the first matching element.
+
+#### jp.apply(obj, pathExpression, fn)
+
+Runs the supplied function `fn` on each matching element, and replaces each matching element with the return value from the function. The function accepts the value of the matching element as its only parameter. Returns matching nodes with their updated values.
+
+
+```javascript
+var nodes = jp.apply(data, '$..author', function(value) { return value.toUpperCase() });
+// [
+// { path: ['$', 'store', 'book', 0, 'author'], value: 'NIGEL REES' },
+// { path: ['$', 'store', 'book', 1, 'author'], value: 'EVELYN WAUGH' },
+// { path: ['$', 'store', 'book', 2, 'author'], value: 'HERMAN MELVILLE' },
+// { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. TOLKIEN' }
+// ]
+```
+
+#### jp.parse(pathExpression)
+
+Parse the provided JSONPath expression into path components and their associated operations.
+
+```javascript
+var path = jp.parse('$..author');
+// [
+// { expression: { type: 'root', value: '$' } },
+// { expression: { type: 'identifier', value: 'author' }, operation: 'member', scope: 'descendant' }
+// ]
+```
+
+#### jp.stringify(path)
+
+Returns a path expression in string form, given a path. The supplied path may either be a flat array of keys, as returned by `jp.nodes` for example, or may alternatively be a fully parsed path expression in the form of an array of path components as returned by `jp.parse`.
+
+```javascript
+var pathExpression = jp.stringify(['$', 'store', 'book', 0, 'author']);
+// "$.store.book[0].author"
+```
+
+## Differences from Original Implementation
+
+This implementation aims to be compatible with Stefan Goessner's original implementation with a few notable exceptions described below.
+
+#### Evaluating Script Expressions
+
+Script expressions (i.e, `(...)` and `?(...)`) are statically evaluated via [static-eval](https://github.com/substack/static-eval) rather than using the underlying script engine directly. That means both that the scope is limited to the instance variable (`@`), and only simple expressions (with no side effects) will be valid. So for example, `?(@.length>10)` will be just fine to match arrays with more than ten elements, but `?(process.exit())` will not get evaluated since `process` would yield a `ReferenceError`. This method is even safer than `vm.runInNewContext`, since the script engine itself is more limited and entirely distinct from the one running the application code. See more details in the [implementation](https://github.com/substack/static-eval/blob/master/index.js) of the evaluator.
+
+#### Grammar
+
+This project uses a formal BNF [grammar](https://github.com/dchester/jsonpath/blob/master/lib/grammar.js) to parse JSONPath expressions, an attempt at reverse-engineering the intent of the original implementation, which parses via a series of creative regular expressions. The original regex approach can sometimes be forgiving for better or for worse (e.g., `$['store]` => `$['store']`), and in other cases, can be just plain wrong (e.g. `[` => `$`).
+
+#### Other Minor Differences
+
+As a result of using a real parser and static evaluation, there are some arguable bugs in the original library that have not been carried through here:
+
+- strings in subscripts may now be double-quoted
+- final `step` arguments in slice operators may now be negative
+- script expressions may now contain `.` and `@` characters not referring to instance variables
+- subscripts no longer act as character slices on string elements
+- non-ascii non-word characters are no-longer valid in member identifier names; use quoted subscript strings instead (e.g., `$['$']` instead of `$.$`)
+- unions now yield real unions with no duplicates rather than concatenated results
+
+## License
+
+[MIT](LICENSE)
+
diff --git a/node_modules/jsonpath/fig.yml b/node_modules/jsonpath/fig.yml
new file mode 100644
index 00000000..97e0c5bb
--- /dev/null
+++ b/node_modules/jsonpath/fig.yml
@@ -0,0 +1,5 @@
+test:
+ build: .
+ command: node /usr/src/app/node_modules/.bin/mocha -u tdd test/
+ volumes:
+ - .:/usr/src/app
diff --git a/node_modules/jsonpath/generated/parser.js b/node_modules/jsonpath/generated/parser.js
new file mode 100644
index 00000000..02de9cc7
--- /dev/null
+++ b/node_modules/jsonpath/generated/parser.js
@@ -0,0 +1,721 @@
+/* parser generated by jison 0.4.13 */
+/*
+ Returns a Parser object of the following structure:
+
+ Parser: {
+ yy: {}
+ }
+
+ Parser.prototype: {
+ yy: {},
+ trace: function(),
+ symbols_: {associative list: name ==> number},
+ terminals_: {associative list: number ==> name},
+ productions_: [...],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+ table: [...],
+ defaultActions: {...},
+ parseError: function(str, hash),
+ parse: function(input),
+
+ lexer: {
+ EOF: 1,
+ parseError: function(str, hash),
+ setInput: function(input),
+ input: function(),
+ unput: function(str),
+ more: function(),
+ less: function(n),
+ pastInput: function(),
+ upcomingInput: function(),
+ showPosition: function(),
+ test_match: function(regex_match_array, rule_index),
+ next: function(),
+ lex: function(),
+ begin: function(condition),
+ popState: function(),
+ _currentRules: function(),
+ topState: function(),
+ pushState: function(condition),
+
+ options: {
+ ranges: boolean (optional: true ==> token location info will include a .range[] member)
+ flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+ backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+ },
+
+ performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+ rules: [...],
+ conditions: {associative list: name ==> set},
+ }
+ }
+
+
+ token location info (@$, _$, etc.): {
+ first_line: n,
+ last_line: n,
+ first_column: n,
+ last_column: n,
+ range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
+ }
+
+
+ the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+ text: (matched text)
+ token: (the produced terminal token, if any)
+ line: (yylineno)
+ }
+ while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+ loc: (yylloc)
+ expected: (string describing the set of expected tokens)
+ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+ }
+*/
+var parser = (function(){
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"JSON_PATH":3,"DOLLAR":4,"PATH_COMPONENTS":5,"LEADING_CHILD_MEMBER_EXPRESSION":6,"PATH_COMPONENT":7,"MEMBER_COMPONENT":8,"SUBSCRIPT_COMPONENT":9,"CHILD_MEMBER_COMPONENT":10,"DESCENDANT_MEMBER_COMPONENT":11,"DOT":12,"MEMBER_EXPRESSION":13,"DOT_DOT":14,"STAR":15,"IDENTIFIER":16,"SCRIPT_EXPRESSION":17,"INTEGER":18,"END":19,"CHILD_SUBSCRIPT_COMPONENT":20,"DESCENDANT_SUBSCRIPT_COMPONENT":21,"[":22,"SUBSCRIPT":23,"]":24,"SUBSCRIPT_EXPRESSION":25,"SUBSCRIPT_EXPRESSION_LIST":26,"SUBSCRIPT_EXPRESSION_LISTABLE":27,",":28,"STRING_LITERAL":29,"ARRAY_SLICE":30,"FILTER_EXPRESSION":31,"QQ_STRING":32,"Q_STRING":33,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"DOLLAR",12:"DOT",14:"DOT_DOT",15:"STAR",16:"IDENTIFIER",17:"SCRIPT_EXPRESSION",18:"INTEGER",19:"END",22:"[",24:"]",28:",",30:"ARRAY_SLICE",31:"FILTER_EXPRESSION",32:"QQ_STRING",33:"Q_STRING"},
+productions_: [0,[3,1],[3,2],[3,1],[3,2],[5,1],[5,2],[7,1],[7,1],[8,1],[8,1],[10,2],[6,1],[11,2],[13,1],[13,1],[13,1],[13,1],[13,1],[9,1],[9,1],[20,3],[21,4],[23,1],[23,1],[26,1],[26,3],[27,1],[27,1],[27,1],[25,1],[25,1],[25,1],[29,1],[29,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */
+/**/) {
+/* this == yyval */
+if (!yy.ast) {
+ yy.ast = _ast;
+ _ast.initialize();
+}
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:yy.ast.set({ expression: { type: "root", value: $$[$0] } }); yy.ast.unshift(); return yy.ast.yield()
+break;
+case 2:yy.ast.set({ expression: { type: "root", value: $$[$0-1] } }); yy.ast.unshift(); return yy.ast.yield()
+break;
+case 3:yy.ast.unshift(); return yy.ast.yield()
+break;
+case 4:yy.ast.set({ operation: "member", scope: "child", expression: { type: "identifier", value: $$[$0-1] }}); yy.ast.unshift(); return yy.ast.yield()
+break;
+case 5:
+break;
+case 6:
+break;
+case 7:yy.ast.set({ operation: "member" }); yy.ast.push()
+break;
+case 8:yy.ast.set({ operation: "subscript" }); yy.ast.push()
+break;
+case 9:yy.ast.set({ scope: "child" })
+break;
+case 10:yy.ast.set({ scope: "descendant" })
+break;
+case 11:
+break;
+case 12:yy.ast.set({ scope: "child", operation: "member" })
+break;
+case 13:
+break;
+case 14:yy.ast.set({ expression: { type: "wildcard", value: $$[$0] } })
+break;
+case 15:yy.ast.set({ expression: { type: "identifier", value: $$[$0] } })
+break;
+case 16:yy.ast.set({ expression: { type: "script_expression", value: $$[$0] } })
+break;
+case 17:yy.ast.set({ expression: { type: "numeric_literal", value: parseInt($$[$0]) } })
+break;
+case 18:
+break;
+case 19:yy.ast.set({ scope: "child" })
+break;
+case 20:yy.ast.set({ scope: "descendant" })
+break;
+case 21:
+break;
+case 22:
+break;
+case 23:
+break;
+case 24:$$[$0].length > 1? yy.ast.set({ expression: { type: "union", value: $$[$0] } }) : this.$ = $$[$0]
+break;
+case 25:this.$ = [$$[$0]]
+break;
+case 26:this.$ = $$[$0-2].concat($$[$0])
+break;
+case 27:this.$ = { expression: { type: "numeric_literal", value: parseInt($$[$0]) } }; yy.ast.set(this.$)
+break;
+case 28:this.$ = { expression: { type: "string_literal", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 29:this.$ = { expression: { type: "slice", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 30:this.$ = { expression: { type: "wildcard", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 31:this.$ = { expression: { type: "script_expression", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 32:this.$ = { expression: { type: "filter_expression", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 33:this.$ = $$[$0]
+break;
+case 34:this.$ = $$[$0]
+break;
+}
+},
+table: [{3:1,4:[1,2],6:3,13:4,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{1:[3]},{1:[2,1],5:10,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,3],5:21,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,12],12:[2,12],14:[2,12],22:[2,12]},{1:[2,14],12:[2,14],14:[2,14],22:[2,14]},{1:[2,15],12:[2,15],14:[2,15],22:[2,15]},{1:[2,16],12:[2,16],14:[2,16],22:[2,16]},{1:[2,17],12:[2,17],14:[2,17],22:[2,17]},{1:[2,18],12:[2,18],14:[2,18],22:[2,18]},{1:[2,2],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,5],12:[2,5],14:[2,5],22:[2,5]},{1:[2,7],12:[2,7],14:[2,7],22:[2,7]},{1:[2,8],12:[2,8],14:[2,8],22:[2,8]},{1:[2,9],12:[2,9],14:[2,9],22:[2,9]},{1:[2,10],12:[2,10],14:[2,10],22:[2,10]},{1:[2,19],12:[2,19],14:[2,19],22:[2,19]},{1:[2,20],12:[2,20],14:[2,20],22:[2,20]},{13:23,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{13:24,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9],22:[1,25]},{15:[1,29],17:[1,30],18:[1,33],23:26,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{1:[2,4],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,6],12:[2,6],14:[2,6],22:[2,6]},{1:[2,11],12:[2,11],14:[2,11],22:[2,11]},{1:[2,13],12:[2,13],14:[2,13],22:[2,13]},{15:[1,29],17:[1,30],18:[1,33],23:38,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{24:[1,39]},{24:[2,23]},{24:[2,24],28:[1,40]},{24:[2,30]},{24:[2,31]},{24:[2,32]},{24:[2,25],28:[2,25]},{24:[2,27],28:[2,27]},{24:[2,28],28:[2,28]},{24:[2,29],28:[2,29]},{24:[2,33],28:[2,33]},{24:[2,34],28:[2,34]},{24:[1,41]},{1:[2,21],12:[2,21],14:[2,21],22:[2,21]},{18:[1,33],27:42,29:34,30:[1,35],32:[1,36],33:[1,37]},{1:[2,22],12:[2,22],14:[2,22],22:[2,22]},{24:[2,26],28:[2,26]}],
+defaultActions: {27:[2,23],29:[2,30],30:[2,31],31:[2,32]},
+parseError: function parseError(str, hash) {
+ if (hash.recoverable) {
+ this.trace(str);
+ } else {
+ throw new Error(str);
+ }
+},
+parse: function parse(input) {
+ var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+ var args = lstack.slice.call(arguments, 1);
+ this.lexer.setInput(input);
+ this.lexer.yy = this.yy;
+ this.yy.lexer = this.lexer;
+ this.yy.parser = this;
+ if (typeof this.lexer.yylloc == 'undefined') {
+ this.lexer.yylloc = {};
+ }
+ var yyloc = this.lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = this.lexer.options && this.lexer.options.ranges;
+ if (typeof this.yy.parseError === 'function') {
+ this.parseError = this.yy.parseError;
+ } else {
+ this.parseError = Object.getPrototypeOf(this).parseError;
+ }
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+ function lex() {
+ var token;
+ token = self.lexer.lex() || EOF;
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ }
+ var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+ while (true) {
+ state = stack[stack.length - 1];
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == 'undefined') {
+ symbol = lex();
+ }
+ action = table[state] && table[state][symbol];
+ }
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+ var errStr = '';
+ expected = [];
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > TERROR) {
+ expected.push('\'' + this.terminals_[p] + '\'');
+ }
+ }
+ if (this.lexer.showPosition) {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + this.lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+ } else {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+ }
+ this.parseError(errStr, {
+ text: this.lexer.match,
+ token: this.terminals_[symbol] || symbol,
+ line: this.lexer.yylineno,
+ loc: yyloc,
+ expected: expected
+ });
+ }
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+ }
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(this.lexer.yytext);
+ lstack.push(this.lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+ if (!preErrorSymbol) {
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ yyloc = this.lexer.yylloc;
+ if (recovering > 0) {
+ recovering--;
+ }
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {
+ first_line: lstack[lstack.length - (len || 1)].first_line,
+ last_line: lstack[lstack.length - 1].last_line,
+ first_column: lstack[lstack.length - (len || 1)].first_column,
+ last_column: lstack[lstack.length - 1].last_column
+ };
+ if (ranges) {
+ yyval._$.range = [
+ lstack[lstack.length - (len || 1)].range[0],
+ lstack[lstack.length - 1].range[1]
+ ];
+ }
+ r = this.performAction.apply(yyval, [
+ yytext,
+ yyleng,
+ yylineno,
+ this.yy,
+ action[1],
+ vstack,
+ lstack
+ ].concat(args));
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+ case 3:
+ return true;
+ }
+ }
+ return true;
+}};
+var _ast = {
+
+ initialize: function() {
+ this._nodes = [];
+ this._node = {};
+ this._stash = [];
+ },
+
+ set: function(props) {
+ for (var k in props) this._node[k] = props[k];
+ return this._node;
+ },
+
+ node: function(obj) {
+ if (arguments.length) this._node = obj;
+ return this._node;
+ },
+
+ push: function() {
+ this._nodes.push(this._node);
+ this._node = {};
+ },
+
+ unshift: function() {
+ this._nodes.unshift(this._node);
+ this._node = {};
+ },
+
+ yield: function() {
+ var _nodes = this._nodes;
+ this.initialize();
+ return _nodes;
+ }
+};
+/* generated by jison-lex 0.2.1 */
+var lexer = (function(){
+var lexer = {
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+
+// resets the lexer, sets new input
+setInput:function (input) {
+ this._input = input;
+ this._more = this._backtrack = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {
+ first_line: 1,
+ first_column: 0,
+ last_line: 1,
+ last_column: 0
+ };
+ if (this.options.ranges) {
+ this.yylloc.range = [0,0];
+ }
+ this.offset = 0;
+ return this;
+ },
+
+// consumes and returns one char from the input
+input:function () {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+ if (this.options.ranges) {
+ this.yylloc.range[1]++;
+ }
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
+ //this.yyleng -= len;
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) {
+ this.yylineno -= lines.length - 1;
+ }
+ var r = this.yylloc.range;
+
+ this.yylloc = {
+ first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ?
+ (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+ + oldLines[oldLines.length - lines.length].length - lines[0].length :
+ this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+ this.yyleng = this.yytext.length;
+ return this;
+ },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+ this._more = true;
+ return this;
+ },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+ if (this.options.backtrack_lexer) {
+ this._backtrack = true;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+
+ }
+ return this;
+ },
+
+// retain first n characters of the match
+less:function (n) {
+ this.unput(this.match.slice(n));
+ },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+ },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+ var next = this.match;
+ if (next.length < 20) {
+ next += this._input.substr(0, 20-next.length);
+ }
+ return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+ var token,
+ lines,
+ backup;
+
+ if (this.options.backtrack_lexer) {
+ // save context
+ backup = {
+ yylineno: this.yylineno,
+ yylloc: {
+ first_line: this.yylloc.first_line,
+ last_line: this.last_line,
+ first_column: this.yylloc.first_column,
+ last_column: this.yylloc.last_column
+ },
+ yytext: this.yytext,
+ match: this.match,
+ matches: this.matches,
+ matched: this.matched,
+ yyleng: this.yyleng,
+ offset: this.offset,
+ _more: this._more,
+ _input: this._input,
+ yy: this.yy,
+ conditionStack: this.conditionStack.slice(0),
+ done: this.done
+ };
+ if (this.options.ranges) {
+ backup.yylloc.range = this.yylloc.range.slice(0);
+ }
+ }
+
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno += lines.length;
+ }
+ this.yylloc = {
+ first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ?
+ lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+ this.yylloc.last_column + match[0].length
+ };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+ this._more = false;
+ this._backtrack = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+ if (this.done && this._input) {
+ this.done = false;
+ }
+ if (token) {
+ return token;
+ } else if (this._backtrack) {
+ // recover context
+ for (var k in backup) {
+ this[k] = backup[k];
+ }
+ return false; // rule action called reject() implying the next rule should be tested instead.
+ }
+ return false;
+ },
+
+// return next match in input
+next:function () {
+ if (this.done) {
+ return this.EOF;
+ }
+ if (!this._input) {
+ this.done = true;
+ }
+
+ var token,
+ match,
+ tempMatch,
+ index;
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+ var rules = this._currentRules();
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+ if (this.options.backtrack_lexer) {
+ token = this.test_match(tempMatch, rules[i]);
+ if (token !== false) {
+ return token;
+ } else if (this._backtrack) {
+ match = false;
+ continue; // rule action called reject() implying a rule MISmatch.
+ } else {
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ } else if (!this.options.flex) {
+ break;
+ }
+ }
+ }
+ if (match) {
+ token = this.test_match(match, rules[index]);
+ if (token !== false) {
+ return token;
+ }
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+ },
+
+// return next match that has a token
+lex:function lex() {
+ var r = this.next();
+ if (r) {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+ var n = this.conditionStack.length - 1;
+ if (n > 0) {
+ return this.conditionStack.pop();
+ } else {
+ return this.conditionStack[0];
+ }
+ },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+ if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ } else {
+ return this.conditions["INITIAL"].rules;
+ }
+ },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+ n = this.conditionStack.length - 1 - Math.abs(n || 0);
+ if (n >= 0) {
+ return this.conditionStack[n];
+ } else {
+ return "INITIAL";
+ }
+ },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+ this.begin(condition);
+ },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+ return this.conditionStack.length;
+ },
+options: {},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START
+/**/) {
+
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 4
+break;
+case 1:return 14
+break;
+case 2:return 12
+break;
+case 3:return 15
+break;
+case 4:return 16
+break;
+case 5:return 22
+break;
+case 6:return 24
+break;
+case 7:return 28
+break;
+case 8:return 30
+break;
+case 9:return 18
+break;
+case 10:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 32;
+break;
+case 11:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 33;
+break;
+case 12:return 17
+break;
+case 13:return 31
+break;
+}
+},
+rules: [/^(?:\$)/,/^(?:\.\.)/,/^(?:\.)/,/^(?:\*)/,/^(?:[a-zA-Z_]+[a-zA-Z0-9_]*)/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?:((-?(?:0|[1-9][0-9]*)))?\:((-?(?:0|[1-9][0-9]*)))?(\:((-?(?:0|[1-9][0-9]*)))?)?)/,/^(?:(-?(?:0|[1-9][0-9]*)))/,/^(?:"(?:\\["bfnrt/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*")/,/^(?:'(?:\\['bfnrt/\\]|\\u[a-fA-F0-9]{4}|[^'\\])*')/,/^(?:\(.+?\)(?=\]))/,/^(?:\?\(.+?\)(?=\]))/],
+conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}
+};
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+ this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+ if (!args[1]) {
+ console.log('Usage: '+args[0]+' FILE');
+ process.exit(1);
+ }
+ var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+ return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+ exports.main(process.argv.slice(1));
+}
+}
diff --git a/node_modules/jsonpath/include/action.js b/node_modules/jsonpath/include/action.js
new file mode 100644
index 00000000..f4a102e2
--- /dev/null
+++ b/node_modules/jsonpath/include/action.js
@@ -0,0 +1,4 @@
+if (!yy.ast) {
+ yy.ast = _ast;
+ _ast.initialize();
+}
diff --git a/node_modules/jsonpath/include/module.js b/node_modules/jsonpath/include/module.js
new file mode 100644
index 00000000..a1329e39
--- /dev/null
+++ b/node_modules/jsonpath/include/module.js
@@ -0,0 +1,34 @@
+var _ast = {
+
+ initialize: function() {
+ this._nodes = [];
+ this._node = {};
+ this._stash = [];
+ },
+
+ set: function(props) {
+ for (var k in props) this._node[k] = props[k];
+ return this._node;
+ },
+
+ node: function(obj) {
+ if (arguments.length) this._node = obj;
+ return this._node;
+ },
+
+ push: function() {
+ this._nodes.push(this._node);
+ this._node = {};
+ },
+
+ unshift: function() {
+ this._nodes.unshift(this._node);
+ this._node = {};
+ },
+
+ yield: function() {
+ var _nodes = this._nodes;
+ this.initialize();
+ return _nodes;
+ }
+};
diff --git a/node_modules/jsonpath/index.js b/node_modules/jsonpath/index.js
new file mode 100644
index 00000000..b58e228f
--- /dev/null
+++ b/node_modules/jsonpath/index.js
@@ -0,0 +1 @@
+module.exports = require('./lib/index');
diff --git a/node_modules/jsonpath/jsonpath.js b/node_modules/jsonpath/jsonpath.js
new file mode 100644
index 00000000..451371c9
--- /dev/null
+++ b/node_modules/jsonpath/jsonpath.js
@@ -0,0 +1,6842 @@
+/*! jsonpath 1.1.1 */
+
+(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.jsonpath = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);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 require=="function"&&require;for(var o=0;o
+ Copyright (C) 2013 Thaddee Tyl
+ Copyright (C) 2013 Mathias Bynens
+ Copyright (C) 2012 Ariya Hidayat
+ Copyright (C) 2012 Mathias Bynens
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Kris Kowal
+ Copyright (C) 2012 Yusuke Suzuki
+ Copyright (C) 2012 Arpad Borsos
+ Copyright (C) 2011 Ariya Hidayat
+
+ 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.
+
+ 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 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.
+*/
+
+/*jslint bitwise:true plusplus:true */
+/*global esprima:true, define:true, exports:true, window: true,
+throwErrorTolerant: true,
+throwError: true, generateStatement: true, peek: true,
+parseAssignmentExpression: true, parseBlock: true, parseExpression: true,
+parseFunctionDeclaration: true, parseFunctionExpression: true,
+parseFunctionSourceElements: true, parseVariableIdentifier: true,
+parseLeftHandSideExpression: true,
+parseUnaryExpression: true,
+parseStatement: true, parseSourceElement: true */
+
+(function (root, factory) {
+ 'use strict';
+
+ // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
+ // Rhino, and plain browser loading.
+
+ /* istanbul ignore next */
+ if (typeof define === 'function' && define.amd) {
+ define(['exports'], factory);
+ } else if (typeof exports !== 'undefined') {
+ factory(exports);
+ } else {
+ factory((root.esprima = {}));
+ }
+}(this, function (exports) {
+ 'use strict';
+
+ var Token,
+ TokenName,
+ FnExprTokens,
+ Syntax,
+ PropertyKind,
+ Messages,
+ Regex,
+ SyntaxTreeDelegate,
+ source,
+ strict,
+ index,
+ lineNumber,
+ lineStart,
+ length,
+ delegate,
+ lookahead,
+ state,
+ extra;
+
+ Token = {
+ BooleanLiteral: 1,
+ EOF: 2,
+ Identifier: 3,
+ Keyword: 4,
+ NullLiteral: 5,
+ NumericLiteral: 6,
+ Punctuator: 7,
+ StringLiteral: 8,
+ RegularExpression: 9
+ };
+
+ TokenName = {};
+ TokenName[Token.BooleanLiteral] = 'Boolean';
+ TokenName[Token.EOF] = '';
+ TokenName[Token.Identifier] = 'Identifier';
+ TokenName[Token.Keyword] = 'Keyword';
+ TokenName[Token.NullLiteral] = 'Null';
+ TokenName[Token.NumericLiteral] = 'Numeric';
+ TokenName[Token.Punctuator] = 'Punctuator';
+ TokenName[Token.StringLiteral] = 'String';
+ TokenName[Token.RegularExpression] = 'RegularExpression';
+
+ // A function following one of those tokens is an expression.
+ FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
+ 'return', 'case', 'delete', 'throw', 'void',
+ // assignment operators
+ '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',
+ '&=', '|=', '^=', ',',
+ // binary/unary operators
+ '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
+ '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
+ '<=', '<', '>', '!=', '!=='];
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ ArrayExpression: 'ArrayExpression',
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ Program: 'Program',
+ Property: 'Property',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement'
+ };
+
+ PropertyKind = {
+ Data: 1,
+ Get: 2,
+ Set: 4
+ };
+
+ // Error messages should be identical to V8.
+ Messages = {
+ UnexpectedToken: 'Unexpected token %0',
+ UnexpectedNumber: 'Unexpected number',
+ UnexpectedString: 'Unexpected string',
+ UnexpectedIdentifier: 'Unexpected identifier',
+ UnexpectedReserved: 'Unexpected reserved word',
+ UnexpectedEOS: 'Unexpected end of input',
+ NewlineAfterThrow: 'Illegal newline after throw',
+ InvalidRegExp: 'Invalid regular expression',
+ UnterminatedRegExp: 'Invalid regular expression: missing /',
+ InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
+ InvalidLHSInForIn: 'Invalid left-hand side in for-in',
+ MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
+ NoCatchOrFinally: 'Missing catch or finally after try',
+ UnknownLabel: 'Undefined label \'%0\'',
+ Redeclaration: '%0 \'%1\' has already been declared',
+ IllegalContinue: 'Illegal continue statement',
+ IllegalBreak: 'Illegal break statement',
+ IllegalReturn: 'Illegal return statement',
+ StrictModeWith: 'Strict mode code may not include a with statement',
+ StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
+ StrictVarName: 'Variable name may not be eval or arguments in strict mode',
+ StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
+ StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
+ StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
+ StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
+ StrictDelete: 'Delete of an unqualified identifier in strict mode.',
+ StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode',
+ AccessorDataProperty: 'Object literal may not have data and accessor property with the same name',
+ AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name',
+ StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
+ StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictReservedWord: 'Use of future reserved word in strict mode'
+ };
+
+ // See also tools/generate-unicode-regex.py.
+ Regex = {
+ NonAsciiIdentifierStart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]'),
+ NonAsciiIdentifierPart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0\u08A2-\u08AC\u08E4-\u08FE\u0900-\u0963\u0966-\u096F\u0971-\u0977\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1D00-\u1DE6\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA697\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]')
+ };
+
+ // Ensure the condition is true, otherwise throw an error.
+ // This is only to have a better contract semantic, i.e. another safety net
+ // to catch a logic error. The condition shall be fulfilled in normal case.
+ // Do NOT use this to enforce a certain condition on any user input.
+
+ function assert(condition, message) {
+ /* istanbul ignore if */
+ if (!condition) {
+ throw new Error('ASSERT: ' + message);
+ }
+ }
+
+ function isDecimalDigit(ch) {
+ return (ch >= 48 && ch <= 57); // 0..9
+ }
+
+ function isHexDigit(ch) {
+ return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;
+ }
+
+ function isOctalDigit(ch) {
+ return '01234567'.indexOf(ch) >= 0;
+ }
+
+
+ // 7.2 White Space
+
+ function isWhiteSpace(ch) {
+ return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||
+ (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0);
+ }
+
+ // 7.3 Line Terminators
+
+ function isLineTerminator(ch) {
+ return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);
+ }
+
+ // 7.6 Identifier Names and Identifiers
+
+ function isIdentifierStart(ch) {
+ return (ch == 0x40) || (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)
+ (ch >= 0x41 && ch <= 0x5A) || // A..Z
+ (ch >= 0x61 && ch <= 0x7A) || // a..z
+ (ch === 0x5C) || // \ (backslash)
+ ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));
+ }
+
+ function isIdentifierPart(ch) {
+ return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)
+ (ch >= 0x41 && ch <= 0x5A) || // A..Z
+ (ch >= 0x61 && ch <= 0x7A) || // a..z
+ (ch >= 0x30 && ch <= 0x39) || // 0..9
+ (ch === 0x5C) || // \ (backslash)
+ ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));
+ }
+
+ // 7.6.1.2 Future Reserved Words
+
+ function isFutureReservedWord(id) {
+ switch (id) {
+ case 'class':
+ case 'enum':
+ case 'export':
+ case 'extends':
+ case 'import':
+ case 'super':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isStrictModeReservedWord(id) {
+ switch (id) {
+ case 'implements':
+ case 'interface':
+ case 'package':
+ case 'private':
+ case 'protected':
+ case 'public':
+ case 'static':
+ case 'yield':
+ case 'let':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isRestrictedWord(id) {
+ return id === 'eval' || id === 'arguments';
+ }
+
+ // 7.6.1.1 Keywords
+
+ function isKeyword(id) {
+ if (strict && isStrictModeReservedWord(id)) {
+ return true;
+ }
+
+ // 'const' is specialized as Keyword in V8.
+ // 'yield' and 'let' are for compatiblity with SpiderMonkey and ES.next.
+ // Some others are from future reserved words.
+
+ switch (id.length) {
+ case 2:
+ return (id === 'if') || (id === 'in') || (id === 'do');
+ case 3:
+ return (id === 'var') || (id === 'for') || (id === 'new') ||
+ (id === 'try') || (id === 'let');
+ case 4:
+ return (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum');
+ case 5:
+ return (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') ||
+ (id === 'class') || (id === 'super');
+ case 6:
+ return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
+ (id === 'switch') || (id === 'export') || (id === 'import');
+ case 7:
+ return (id === 'default') || (id === 'finally') || (id === 'extends');
+ case 8:
+ return (id === 'function') || (id === 'continue') || (id === 'debugger');
+ case 10:
+ return (id === 'instanceof');
+ default:
+ return false;
+ }
+ }
+
+ // 7.4 Comments
+
+ function addComment(type, value, start, end, loc) {
+ var comment, attacher;
+
+ assert(typeof start === 'number', 'Comment must have valid position');
+
+ // Because the way the actual token is scanned, often the comments
+ // (if any) are skipped twice during the lexical analysis.
+ // Thus, we need to skip adding a comment if the comment array already
+ // handled it.
+ if (state.lastCommentStart >= start) {
+ return;
+ }
+ state.lastCommentStart = start;
+
+ comment = {
+ type: type,
+ value: value
+ };
+ if (extra.range) {
+ comment.range = [start, end];
+ }
+ if (extra.loc) {
+ comment.loc = loc;
+ }
+ extra.comments.push(comment);
+ if (extra.attachComment) {
+ extra.leadingComments.push(comment);
+ extra.trailingComments.push(comment);
+ }
+ }
+
+ function skipSingleLineComment(offset) {
+ var start, loc, ch, comment;
+
+ start = index - offset;
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart - offset
+ }
+ };
+
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ ++index;
+ if (isLineTerminator(ch)) {
+ if (extra.comments) {
+ comment = source.slice(start + offset, index - 1);
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart - 1
+ };
+ addComment('Line', comment, start, index - 1, loc);
+ }
+ if (ch === 13 && source.charCodeAt(index) === 10) {
+ ++index;
+ }
+ ++lineNumber;
+ lineStart = index;
+ return;
+ }
+ }
+
+ if (extra.comments) {
+ comment = source.slice(start + offset, index);
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+ addComment('Line', comment, start, index, loc);
+ }
+ }
+
+ function skipMultiLineComment() {
+ var start, loc, ch, comment;
+
+ if (extra.comments) {
+ start = index - 2;
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart - 2
+ }
+ };
+ }
+
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ if (isLineTerminator(ch)) {
+ if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {
+ ++index;
+ }
+ ++lineNumber;
+ ++index;
+ lineStart = index;
+ if (index >= length) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ } else if (ch === 0x2A) {
+ // Block comment ends with '*/'.
+ if (source.charCodeAt(index + 1) === 0x2F) {
+ ++index;
+ ++index;
+ if (extra.comments) {
+ comment = source.slice(start + 2, index - 2);
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+ addComment('Block', comment, start, index, loc);
+ }
+ return;
+ }
+ ++index;
+ } else {
+ ++index;
+ }
+ }
+
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ function skipComment() {
+ var ch, start;
+
+ start = (index === 0);
+ while (index < length) {
+ ch = source.charCodeAt(index);
+
+ if (isWhiteSpace(ch)) {
+ ++index;
+ } else if (isLineTerminator(ch)) {
+ ++index;
+ if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {
+ ++index;
+ }
+ ++lineNumber;
+ lineStart = index;
+ start = true;
+ } else if (ch === 0x2F) { // U+002F is '/'
+ ch = source.charCodeAt(index + 1);
+ if (ch === 0x2F) {
+ ++index;
+ ++index;
+ skipSingleLineComment(2);
+ start = true;
+ } else if (ch === 0x2A) { // U+002A is '*'
+ ++index;
+ ++index;
+ skipMultiLineComment();
+ } else {
+ break;
+ }
+ } else if (start && ch === 0x2D) { // U+002D is '-'
+ // U+003E is '>'
+ if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {
+ // '-->' is a single-line comment
+ index += 3;
+ skipSingleLineComment(3);
+ } else {
+ break;
+ }
+ } else if (ch === 0x3C) { // U+003C is '<'
+ if (source.slice(index + 1, index + 4) === '!--') {
+ ++index; // `<`
+ ++index; // `!`
+ ++index; // `-`
+ ++index; // `-`
+ skipSingleLineComment(4);
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ function scanHexEscape(prefix) {
+ var i, len, ch, code = 0;
+
+ len = (prefix === 'u') ? 4 : 2;
+ for (i = 0; i < len; ++i) {
+ if (index < length && isHexDigit(source[index])) {
+ ch = source[index++];
+ code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
+ } else {
+ return '';
+ }
+ }
+ return String.fromCharCode(code);
+ }
+
+ function getEscapedIdentifier() {
+ var ch, id;
+
+ ch = source.charCodeAt(index++);
+ id = String.fromCharCode(ch);
+
+ // '\u' (U+005C, U+0075) denotes an escaped character.
+ if (ch === 0x5C) {
+ if (source.charCodeAt(index) !== 0x75) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ ++index;
+ ch = scanHexEscape('u');
+ if (!ch || ch === '\\' || !isIdentifierStart(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ id = ch;
+ }
+
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ if (!isIdentifierPart(ch)) {
+ break;
+ }
+ ++index;
+ id += String.fromCharCode(ch);
+
+ // '\u' (U+005C, U+0075) denotes an escaped character.
+ if (ch === 0x5C) {
+ id = id.substr(0, id.length - 1);
+ if (source.charCodeAt(index) !== 0x75) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ ++index;
+ ch = scanHexEscape('u');
+ if (!ch || ch === '\\' || !isIdentifierPart(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ id += ch;
+ }
+ }
+
+ return id;
+ }
+
+ function getIdentifier() {
+ var start, ch;
+
+ start = index++;
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ if (ch === 0x5C) {
+ // Blackslash (U+005C) marks Unicode escape sequence.
+ index = start;
+ return getEscapedIdentifier();
+ }
+ if (isIdentifierPart(ch)) {
+ ++index;
+ } else {
+ break;
+ }
+ }
+
+ return source.slice(start, index);
+ }
+
+ function scanIdentifier() {
+ var start, id, type;
+
+ start = index;
+
+ // Backslash (U+005C) starts an escaped character.
+ id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier();
+
+ // There is no keyword or literal with only one character.
+ // Thus, it must be an identifier.
+ if (id.length === 1) {
+ type = Token.Identifier;
+ } else if (isKeyword(id)) {
+ type = Token.Keyword;
+ } else if (id === 'null') {
+ type = Token.NullLiteral;
+ } else if (id === 'true' || id === 'false') {
+ type = Token.BooleanLiteral;
+ } else {
+ type = Token.Identifier;
+ }
+
+ return {
+ type: type,
+ value: id,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+
+ // 7.7 Punctuators
+
+ function scanPunctuator() {
+ var start = index,
+ code = source.charCodeAt(index),
+ code2,
+ ch1 = source[index],
+ ch2,
+ ch3,
+ ch4;
+
+ switch (code) {
+
+ // Check for most common single-character punctuators.
+ case 0x2E: // . dot
+ case 0x28: // ( open bracket
+ case 0x29: // ) close bracket
+ case 0x3B: // ; semicolon
+ case 0x2C: // , comma
+ case 0x7B: // { open curly brace
+ case 0x7D: // } close curly brace
+ case 0x5B: // [
+ case 0x5D: // ]
+ case 0x3A: // :
+ case 0x3F: // ?
+ case 0x7E: // ~
+ ++index;
+ if (extra.tokenize) {
+ if (code === 0x28) {
+ extra.openParenToken = extra.tokens.length;
+ } else if (code === 0x7B) {
+ extra.openCurlyToken = extra.tokens.length;
+ }
+ }
+ return {
+ type: Token.Punctuator,
+ value: String.fromCharCode(code),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+
+ default:
+ code2 = source.charCodeAt(index + 1);
+
+ // '=' (U+003D) marks an assignment or comparison operator.
+ if (code2 === 0x3D) {
+ switch (code) {
+ case 0x2B: // +
+ case 0x2D: // -
+ case 0x2F: // /
+ case 0x3C: // <
+ case 0x3E: // >
+ case 0x5E: // ^
+ case 0x7C: // |
+ case 0x25: // %
+ case 0x26: // &
+ case 0x2A: // *
+ index += 2;
+ return {
+ type: Token.Punctuator,
+ value: String.fromCharCode(code) + String.fromCharCode(code2),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+
+ case 0x21: // !
+ case 0x3D: // =
+ index += 2;
+
+ // !== and ===
+ if (source.charCodeAt(index) === 0x3D) {
+ ++index;
+ }
+ return {
+ type: Token.Punctuator,
+ value: source.slice(start, index),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+ }
+ }
+
+ // 4-character punctuator: >>>=
+
+ ch4 = source.substr(index, 4);
+
+ if (ch4 === '>>>=') {
+ index += 4;
+ return {
+ type: Token.Punctuator,
+ value: ch4,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // 3-character punctuators: === !== >>> <<= >>=
+
+ ch3 = ch4.substr(0, 3);
+
+ if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') {
+ index += 3;
+ return {
+ type: Token.Punctuator,
+ value: ch3,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // Other 2-character punctuators: ++ -- << >> && ||
+ ch2 = ch3.substr(0, 2);
+
+ if ((ch1 === ch2[1] && ('+-<>&|'.indexOf(ch1) >= 0)) || ch2 === '=>') {
+ index += 2;
+ return {
+ type: Token.Punctuator,
+ value: ch2,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // 1-character punctuators: < > = ! + - * % & | ^ /
+ if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
+ ++index;
+ return {
+ type: Token.Punctuator,
+ value: ch1,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ // 7.8.3 Numeric Literals
+
+ function scanHexLiteral(start) {
+ var number = '';
+
+ while (index < length) {
+ if (!isHexDigit(source[index])) {
+ break;
+ }
+ number += source[index++];
+ }
+
+ if (number.length === 0) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ if (isIdentifierStart(source.charCodeAt(index))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.NumericLiteral,
+ value: parseInt('0x' + number, 16),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ function scanOctalLiteral(start) {
+ var number = '0' + source[index++];
+ while (index < length) {
+ if (!isOctalDigit(source[index])) {
+ break;
+ }
+ number += source[index++];
+ }
+
+ if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.NumericLiteral,
+ value: parseInt(number, 8),
+ octal: true,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ function scanNumericLiteral() {
+ var number, start, ch;
+
+ ch = source[index];
+ assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
+ 'Numeric literal must start with a decimal digit or a decimal point');
+
+ start = index;
+ number = '';
+ if (ch !== '.') {
+ number = source[index++];
+ ch = source[index];
+
+ // Hex number starts with '0x'.
+ // Octal number starts with '0'.
+ if (number === '0') {
+ if (ch === 'x' || ch === 'X') {
+ ++index;
+ return scanHexLiteral(start);
+ }
+ if (isOctalDigit(ch)) {
+ return scanOctalLiteral(start);
+ }
+
+ // decimal number starts with '0' such as '09' is illegal.
+ if (ch && isDecimalDigit(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ }
+
+ while (isDecimalDigit(source.charCodeAt(index))) {
+ number += source[index++];
+ }
+ ch = source[index];
+ }
+
+ if (ch === '.') {
+ number += source[index++];
+ while (isDecimalDigit(source.charCodeAt(index))) {
+ number += source[index++];
+ }
+ ch = source[index];
+ }
+
+ if (ch === 'e' || ch === 'E') {
+ number += source[index++];
+
+ ch = source[index];
+ if (ch === '+' || ch === '-') {
+ number += source[index++];
+ }
+ if (isDecimalDigit(source.charCodeAt(index))) {
+ while (isDecimalDigit(source.charCodeAt(index))) {
+ number += source[index++];
+ }
+ } else {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ }
+
+ if (isIdentifierStart(source.charCodeAt(index))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.NumericLiteral,
+ value: parseFloat(number),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // 7.8.4 String Literals
+
+ function scanStringLiteral() {
+ var str = '', quote, start, ch, code, unescaped, restore, octal = false, startLineNumber, startLineStart;
+ startLineNumber = lineNumber;
+ startLineStart = lineStart;
+
+ quote = source[index];
+ assert((quote === '\'' || quote === '"'),
+ 'String literal must starts with a quote');
+
+ start = index;
+ ++index;
+
+ while (index < length) {
+ ch = source[index++];
+
+ if (ch === quote) {
+ quote = '';
+ break;
+ } else if (ch === '\\') {
+ ch = source[index++];
+ if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
+ switch (ch) {
+ case 'u':
+ case 'x':
+ restore = index;
+ unescaped = scanHexEscape(ch);
+ if (unescaped) {
+ str += unescaped;
+ } else {
+ index = restore;
+ str += ch;
+ }
+ break;
+ case 'n':
+ str += '\n';
+ break;
+ case 'r':
+ str += '\r';
+ break;
+ case 't':
+ str += '\t';
+ break;
+ case 'b':
+ str += '\b';
+ break;
+ case 'f':
+ str += '\f';
+ break;
+ case 'v':
+ str += '\x0B';
+ break;
+
+ default:
+ if (isOctalDigit(ch)) {
+ code = '01234567'.indexOf(ch);
+
+ // \0 is not octal escape sequence
+ if (code !== 0) {
+ octal = true;
+ }
+
+ if (index < length && isOctalDigit(source[index])) {
+ octal = true;
+ code = code * 8 + '01234567'.indexOf(source[index++]);
+
+ // 3 digits are only allowed when string starts
+ // with 0, 1, 2, 3
+ if ('0123'.indexOf(ch) >= 0 &&
+ index < length &&
+ isOctalDigit(source[index])) {
+ code = code * 8 + '01234567'.indexOf(source[index++]);
+ }
+ }
+ str += String.fromCharCode(code);
+ } else {
+ str += ch;
+ }
+ break;
+ }
+ } else {
+ ++lineNumber;
+ if (ch === '\r' && source[index] === '\n') {
+ ++index;
+ }
+ lineStart = index;
+ }
+ } else if (isLineTerminator(ch.charCodeAt(0))) {
+ break;
+ } else {
+ str += ch;
+ }
+ }
+
+ if (quote !== '') {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.StringLiteral,
+ value: str,
+ octal: octal,
+ startLineNumber: startLineNumber,
+ startLineStart: startLineStart,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ function testRegExp(pattern, flags) {
+ var value;
+ try {
+ value = new RegExp(pattern, flags);
+ } catch (e) {
+ throwError({}, Messages.InvalidRegExp);
+ }
+ return value;
+ }
+
+ function scanRegExpBody() {
+ var ch, str, classMarker, terminated, body;
+
+ ch = source[index];
+ assert(ch === '/', 'Regular expression literal must start with a slash');
+ str = source[index++];
+
+ classMarker = false;
+ terminated = false;
+ while (index < length) {
+ ch = source[index++];
+ str += ch;
+ if (ch === '\\') {
+ ch = source[index++];
+ // ECMA-262 7.8.5
+ if (isLineTerminator(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnterminatedRegExp);
+ }
+ str += ch;
+ } else if (isLineTerminator(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnterminatedRegExp);
+ } else if (classMarker) {
+ if (ch === ']') {
+ classMarker = false;
+ }
+ } else {
+ if (ch === '/') {
+ terminated = true;
+ break;
+ } else if (ch === '[') {
+ classMarker = true;
+ }
+ }
+ }
+
+ if (!terminated) {
+ throwError({}, Messages.UnterminatedRegExp);
+ }
+
+ // Exclude leading and trailing slash.
+ body = str.substr(1, str.length - 2);
+ return {
+ value: body,
+ literal: str
+ };
+ }
+
+ function scanRegExpFlags() {
+ var ch, str, flags, restore;
+
+ str = '';
+ flags = '';
+ while (index < length) {
+ ch = source[index];
+ if (!isIdentifierPart(ch.charCodeAt(0))) {
+ break;
+ }
+
+ ++index;
+ if (ch === '\\' && index < length) {
+ ch = source[index];
+ if (ch === 'u') {
+ ++index;
+ restore = index;
+ ch = scanHexEscape('u');
+ if (ch) {
+ flags += ch;
+ for (str += '\\u'; restore < index; ++restore) {
+ str += source[restore];
+ }
+ } else {
+ index = restore;
+ flags += 'u';
+ str += '\\u';
+ }
+ throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');
+ } else {
+ str += '\\';
+ throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ } else {
+ flags += ch;
+ str += ch;
+ }
+ }
+
+ return {
+ value: flags,
+ literal: str
+ };
+ }
+
+ function scanRegExp() {
+ var start, body, flags, pattern, value;
+
+ lookahead = null;
+ skipComment();
+ start = index;
+
+ body = scanRegExpBody();
+ flags = scanRegExpFlags();
+ value = testRegExp(body.value, flags.value);
+
+ if (extra.tokenize) {
+ return {
+ type: Token.RegularExpression,
+ value: value,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ return {
+ literal: body.literal + flags.literal,
+ value: value,
+ start: start,
+ end: index
+ };
+ }
+
+ function collectRegex() {
+ var pos, loc, regex, token;
+
+ skipComment();
+
+ pos = index;
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart
+ }
+ };
+
+ regex = scanRegExp();
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+
+ /* istanbul ignore next */
+ if (!extra.tokenize) {
+ // Pop the previous token, which is likely '/' or '/='
+ if (extra.tokens.length > 0) {
+ token = extra.tokens[extra.tokens.length - 1];
+ if (token.range[0] === pos && token.type === 'Punctuator') {
+ if (token.value === '/' || token.value === '/=') {
+ extra.tokens.pop();
+ }
+ }
+ }
+
+ extra.tokens.push({
+ type: 'RegularExpression',
+ value: regex.literal,
+ range: [pos, index],
+ loc: loc
+ });
+ }
+
+ return regex;
+ }
+
+ function isIdentifierName(token) {
+ return token.type === Token.Identifier ||
+ token.type === Token.Keyword ||
+ token.type === Token.BooleanLiteral ||
+ token.type === Token.NullLiteral;
+ }
+
+ function advanceSlash() {
+ var prevToken,
+ checkToken;
+ // Using the following algorithm:
+ // https://github.com/mozilla/sweet.js/wiki/design
+ prevToken = extra.tokens[extra.tokens.length - 1];
+ if (!prevToken) {
+ // Nothing before that: it cannot be a division.
+ return collectRegex();
+ }
+ if (prevToken.type === 'Punctuator') {
+ if (prevToken.value === ']') {
+ return scanPunctuator();
+ }
+ if (prevToken.value === ')') {
+ checkToken = extra.tokens[extra.openParenToken - 1];
+ if (checkToken &&
+ checkToken.type === 'Keyword' &&
+ (checkToken.value === 'if' ||
+ checkToken.value === 'while' ||
+ checkToken.value === 'for' ||
+ checkToken.value === 'with')) {
+ return collectRegex();
+ }
+ return scanPunctuator();
+ }
+ if (prevToken.value === '}') {
+ // Dividing a function by anything makes little sense,
+ // but we have to check for that.
+ if (extra.tokens[extra.openCurlyToken - 3] &&
+ extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') {
+ // Anonymous function.
+ checkToken = extra.tokens[extra.openCurlyToken - 4];
+ if (!checkToken) {
+ return scanPunctuator();
+ }
+ } else if (extra.tokens[extra.openCurlyToken - 4] &&
+ extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') {
+ // Named function.
+ checkToken = extra.tokens[extra.openCurlyToken - 5];
+ if (!checkToken) {
+ return collectRegex();
+ }
+ } else {
+ return scanPunctuator();
+ }
+ // checkToken determines whether the function is
+ // a declaration or an expression.
+ if (FnExprTokens.indexOf(checkToken.value) >= 0) {
+ // It is an expression.
+ return scanPunctuator();
+ }
+ // It is a declaration.
+ return collectRegex();
+ }
+ return collectRegex();
+ }
+ if (prevToken.type === 'Keyword') {
+ return collectRegex();
+ }
+ return scanPunctuator();
+ }
+
+ function advance() {
+ var ch;
+
+ skipComment();
+
+ if (index >= length) {
+ return {
+ type: Token.EOF,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: index,
+ end: index
+ };
+ }
+
+ ch = source.charCodeAt(index);
+
+ if (isIdentifierStart(ch)) {
+ return scanIdentifier();
+ }
+
+ // Very common: ( and ) and ;
+ if (ch === 0x28 || ch === 0x29 || ch === 0x3B) {
+ return scanPunctuator();
+ }
+
+ // String literal starts with single quote (U+0027) or double quote (U+0022).
+ if (ch === 0x27 || ch === 0x22) {
+ return scanStringLiteral();
+ }
+
+
+ // Dot (.) U+002E can also start a floating-point number, hence the need
+ // to check the next character.
+ if (ch === 0x2E) {
+ if (isDecimalDigit(source.charCodeAt(index + 1))) {
+ return scanNumericLiteral();
+ }
+ return scanPunctuator();
+ }
+
+ if (isDecimalDigit(ch)) {
+ return scanNumericLiteral();
+ }
+
+ // Slash (/) U+002F can also start a regex.
+ if (extra.tokenize && ch === 0x2F) {
+ return advanceSlash();
+ }
+
+ return scanPunctuator();
+ }
+
+ function collectToken() {
+ var loc, token, range, value;
+
+ skipComment();
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart
+ }
+ };
+
+ token = advance();
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+
+ if (token.type !== Token.EOF) {
+ value = source.slice(token.start, token.end);
+ extra.tokens.push({
+ type: TokenName[token.type],
+ value: value,
+ range: [token.start, token.end],
+ loc: loc
+ });
+ }
+
+ return token;
+ }
+
+ function lex() {
+ var token;
+
+ token = lookahead;
+ index = token.end;
+ lineNumber = token.lineNumber;
+ lineStart = token.lineStart;
+
+ lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();
+
+ index = token.end;
+ lineNumber = token.lineNumber;
+ lineStart = token.lineStart;
+
+ return token;
+ }
+
+ function peek() {
+ var pos, line, start;
+
+ pos = index;
+ line = lineNumber;
+ start = lineStart;
+ lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();
+ index = pos;
+ lineNumber = line;
+ lineStart = start;
+ }
+
+ function Position(line, column) {
+ this.line = line;
+ this.column = column;
+ }
+
+ function SourceLocation(startLine, startColumn, line, column) {
+ this.start = new Position(startLine, startColumn);
+ this.end = new Position(line, column);
+ }
+
+ SyntaxTreeDelegate = {
+
+ name: 'SyntaxTree',
+
+ processComment: function (node) {
+ var lastChild, trailingComments;
+
+ if (node.type === Syntax.Program) {
+ if (node.body.length > 0) {
+ return;
+ }
+ }
+
+ if (extra.trailingComments.length > 0) {
+ if (extra.trailingComments[0].range[0] >= node.range[1]) {
+ trailingComments = extra.trailingComments;
+ extra.trailingComments = [];
+ } else {
+ extra.trailingComments.length = 0;
+ }
+ } else {
+ if (extra.bottomRightStack.length > 0 &&
+ extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments &&
+ extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) {
+ trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
+ delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
+ }
+ }
+
+ // Eating the stack.
+ while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) {
+ lastChild = extra.bottomRightStack.pop();
+ }
+
+ if (lastChild) {
+ if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) {
+ node.leadingComments = lastChild.leadingComments;
+ delete lastChild.leadingComments;
+ }
+ } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) {
+ node.leadingComments = extra.leadingComments;
+ extra.leadingComments = [];
+ }
+
+
+ if (trailingComments) {
+ node.trailingComments = trailingComments;
+ }
+
+ extra.bottomRightStack.push(node);
+ },
+
+ markEnd: function (node, startToken) {
+ if (extra.range) {
+ node.range = [startToken.start, index];
+ }
+ if (extra.loc) {
+ node.loc = new SourceLocation(
+ startToken.startLineNumber === undefined ? startToken.lineNumber : startToken.startLineNumber,
+ startToken.start - (startToken.startLineStart === undefined ? startToken.lineStart : startToken.startLineStart),
+ lineNumber,
+ index - lineStart
+ );
+ this.postProcess(node);
+ }
+
+ if (extra.attachComment) {
+ this.processComment(node);
+ }
+ return node;
+ },
+
+ postProcess: function (node) {
+ if (extra.source) {
+ node.loc.source = extra.source;
+ }
+ return node;
+ },
+
+ createArrayExpression: function (elements) {
+ return {
+ type: Syntax.ArrayExpression,
+ elements: elements
+ };
+ },
+
+ createAssignmentExpression: function (operator, left, right) {
+ return {
+ type: Syntax.AssignmentExpression,
+ operator: operator,
+ left: left,
+ right: right
+ };
+ },
+
+ createBinaryExpression: function (operator, left, right) {
+ var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression :
+ Syntax.BinaryExpression;
+ return {
+ type: type,
+ operator: operator,
+ left: left,
+ right: right
+ };
+ },
+
+ createBlockStatement: function (body) {
+ return {
+ type: Syntax.BlockStatement,
+ body: body
+ };
+ },
+
+ createBreakStatement: function (label) {
+ return {
+ type: Syntax.BreakStatement,
+ label: label
+ };
+ },
+
+ createCallExpression: function (callee, args) {
+ return {
+ type: Syntax.CallExpression,
+ callee: callee,
+ 'arguments': args
+ };
+ },
+
+ createCatchClause: function (param, body) {
+ return {
+ type: Syntax.CatchClause,
+ param: param,
+ body: body
+ };
+ },
+
+ createConditionalExpression: function (test, consequent, alternate) {
+ return {
+ type: Syntax.ConditionalExpression,
+ test: test,
+ consequent: consequent,
+ alternate: alternate
+ };
+ },
+
+ createContinueStatement: function (label) {
+ return {
+ type: Syntax.ContinueStatement,
+ label: label
+ };
+ },
+
+ createDebuggerStatement: function () {
+ return {
+ type: Syntax.DebuggerStatement
+ };
+ },
+
+ createDoWhileStatement: function (body, test) {
+ return {
+ type: Syntax.DoWhileStatement,
+ body: body,
+ test: test
+ };
+ },
+
+ createEmptyStatement: function () {
+ return {
+ type: Syntax.EmptyStatement
+ };
+ },
+
+ createExpressionStatement: function (expression) {
+ return {
+ type: Syntax.ExpressionStatement,
+ expression: expression
+ };
+ },
+
+ createForStatement: function (init, test, update, body) {
+ return {
+ type: Syntax.ForStatement,
+ init: init,
+ test: test,
+ update: update,
+ body: body
+ };
+ },
+
+ createForInStatement: function (left, right, body) {
+ return {
+ type: Syntax.ForInStatement,
+ left: left,
+ right: right,
+ body: body,
+ each: false
+ };
+ },
+
+ createFunctionDeclaration: function (id, params, defaults, body) {
+ return {
+ type: Syntax.FunctionDeclaration,
+ id: id,
+ params: params,
+ defaults: defaults,
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ };
+ },
+
+ createFunctionExpression: function (id, params, defaults, body) {
+ return {
+ type: Syntax.FunctionExpression,
+ id: id,
+ params: params,
+ defaults: defaults,
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ };
+ },
+
+ createIdentifier: function (name) {
+ return {
+ type: Syntax.Identifier,
+ name: name
+ };
+ },
+
+ createIfStatement: function (test, consequent, alternate) {
+ return {
+ type: Syntax.IfStatement,
+ test: test,
+ consequent: consequent,
+ alternate: alternate
+ };
+ },
+
+ createLabeledStatement: function (label, body) {
+ return {
+ type: Syntax.LabeledStatement,
+ label: label,
+ body: body
+ };
+ },
+
+ createLiteral: function (token) {
+ return {
+ type: Syntax.Literal,
+ value: token.value,
+ raw: source.slice(token.start, token.end)
+ };
+ },
+
+ createMemberExpression: function (accessor, object, property) {
+ return {
+ type: Syntax.MemberExpression,
+ computed: accessor === '[',
+ object: object,
+ property: property
+ };
+ },
+
+ createNewExpression: function (callee, args) {
+ return {
+ type: Syntax.NewExpression,
+ callee: callee,
+ 'arguments': args
+ };
+ },
+
+ createObjectExpression: function (properties) {
+ return {
+ type: Syntax.ObjectExpression,
+ properties: properties
+ };
+ },
+
+ createPostfixExpression: function (operator, argument) {
+ return {
+ type: Syntax.UpdateExpression,
+ operator: operator,
+ argument: argument,
+ prefix: false
+ };
+ },
+
+ createProgram: function (body) {
+ return {
+ type: Syntax.Program,
+ body: body
+ };
+ },
+
+ createProperty: function (kind, key, value) {
+ return {
+ type: Syntax.Property,
+ key: key,
+ value: value,
+ kind: kind
+ };
+ },
+
+ createReturnStatement: function (argument) {
+ return {
+ type: Syntax.ReturnStatement,
+ argument: argument
+ };
+ },
+
+ createSequenceExpression: function (expressions) {
+ return {
+ type: Syntax.SequenceExpression,
+ expressions: expressions
+ };
+ },
+
+ createSwitchCase: function (test, consequent) {
+ return {
+ type: Syntax.SwitchCase,
+ test: test,
+ consequent: consequent
+ };
+ },
+
+ createSwitchStatement: function (discriminant, cases) {
+ return {
+ type: Syntax.SwitchStatement,
+ discriminant: discriminant,
+ cases: cases
+ };
+ },
+
+ createThisExpression: function () {
+ return {
+ type: Syntax.ThisExpression
+ };
+ },
+
+ createThrowStatement: function (argument) {
+ return {
+ type: Syntax.ThrowStatement,
+ argument: argument
+ };
+ },
+
+ createTryStatement: function (block, guardedHandlers, handlers, finalizer) {
+ return {
+ type: Syntax.TryStatement,
+ block: block,
+ guardedHandlers: guardedHandlers,
+ handlers: handlers,
+ finalizer: finalizer
+ };
+ },
+
+ createUnaryExpression: function (operator, argument) {
+ if (operator === '++' || operator === '--') {
+ return {
+ type: Syntax.UpdateExpression,
+ operator: operator,
+ argument: argument,
+ prefix: true
+ };
+ }
+ return {
+ type: Syntax.UnaryExpression,
+ operator: operator,
+ argument: argument,
+ prefix: true
+ };
+ },
+
+ createVariableDeclaration: function (declarations, kind) {
+ return {
+ type: Syntax.VariableDeclaration,
+ declarations: declarations,
+ kind: kind
+ };
+ },
+
+ createVariableDeclarator: function (id, init) {
+ return {
+ type: Syntax.VariableDeclarator,
+ id: id,
+ init: init
+ };
+ },
+
+ createWhileStatement: function (test, body) {
+ return {
+ type: Syntax.WhileStatement,
+ test: test,
+ body: body
+ };
+ },
+
+ createWithStatement: function (object, body) {
+ return {
+ type: Syntax.WithStatement,
+ object: object,
+ body: body
+ };
+ }
+ };
+
+ // Return true if there is a line terminator before the next token.
+
+ function peekLineTerminator() {
+ var pos, line, start, found;
+
+ pos = index;
+ line = lineNumber;
+ start = lineStart;
+ skipComment();
+ found = lineNumber !== line;
+ index = pos;
+ lineNumber = line;
+ lineStart = start;
+
+ return found;
+ }
+
+ // Throw an exception
+
+ function throwError(token, messageFormat) {
+ var error,
+ args = Array.prototype.slice.call(arguments, 2),
+ msg = messageFormat.replace(
+ /%(\d)/g,
+ function (whole, index) {
+ assert(index < args.length, 'Message reference must be in range');
+ return args[index];
+ }
+ );
+
+ if (typeof token.lineNumber === 'number') {
+ error = new Error('Line ' + token.lineNumber + ': ' + msg);
+ error.index = token.start;
+ error.lineNumber = token.lineNumber;
+ error.column = token.start - lineStart + 1;
+ } else {
+ error = new Error('Line ' + lineNumber + ': ' + msg);
+ error.index = index;
+ error.lineNumber = lineNumber;
+ error.column = index - lineStart + 1;
+ }
+
+ error.description = msg;
+ throw error;
+ }
+
+ function throwErrorTolerant() {
+ try {
+ throwError.apply(null, arguments);
+ } catch (e) {
+ if (extra.errors) {
+ extra.errors.push(e);
+ } else {
+ throw e;
+ }
+ }
+ }
+
+
+ // Throw an exception because of the token.
+
+ function throwUnexpected(token) {
+ if (token.type === Token.EOF) {
+ throwError(token, Messages.UnexpectedEOS);
+ }
+
+ if (token.type === Token.NumericLiteral) {
+ throwError(token, Messages.UnexpectedNumber);
+ }
+
+ if (token.type === Token.StringLiteral) {
+ throwError(token, Messages.UnexpectedString);
+ }
+
+ if (token.type === Token.Identifier) {
+ throwError(token, Messages.UnexpectedIdentifier);
+ }
+
+ if (token.type === Token.Keyword) {
+ if (isFutureReservedWord(token.value)) {
+ throwError(token, Messages.UnexpectedReserved);
+ } else if (strict && isStrictModeReservedWord(token.value)) {
+ throwErrorTolerant(token, Messages.StrictReservedWord);
+ return;
+ }
+ throwError(token, Messages.UnexpectedToken, token.value);
+ }
+
+ // BooleanLiteral, NullLiteral, or Punctuator.
+ throwError(token, Messages.UnexpectedToken, token.value);
+ }
+
+ // Expect the next token to match the specified punctuator.
+ // If not, an exception will be thrown.
+
+ function expect(value) {
+ var token = lex();
+ if (token.type !== Token.Punctuator || token.value !== value) {
+ throwUnexpected(token);
+ }
+ }
+
+ // Expect the next token to match the specified keyword.
+ // If not, an exception will be thrown.
+
+ function expectKeyword(keyword) {
+ var token = lex();
+ if (token.type !== Token.Keyword || token.value !== keyword) {
+ throwUnexpected(token);
+ }
+ }
+
+ // Return true if the next token matches the specified punctuator.
+
+ function match(value) {
+ return lookahead.type === Token.Punctuator && lookahead.value === value;
+ }
+
+ // Return true if the next token matches the specified keyword
+
+ function matchKeyword(keyword) {
+ return lookahead.type === Token.Keyword && lookahead.value === keyword;
+ }
+
+ // Return true if the next token is an assignment operator
+
+ function matchAssign() {
+ var op;
+
+ if (lookahead.type !== Token.Punctuator) {
+ return false;
+ }
+ op = lookahead.value;
+ return op === '=' ||
+ op === '*=' ||
+ op === '/=' ||
+ op === '%=' ||
+ op === '+=' ||
+ op === '-=' ||
+ op === '<<=' ||
+ op === '>>=' ||
+ op === '>>>=' ||
+ op === '&=' ||
+ op === '^=' ||
+ op === '|=';
+ }
+
+ function consumeSemicolon() {
+ var line;
+
+ // Catch the very common case first: immediately a semicolon (U+003B).
+ if (source.charCodeAt(index) === 0x3B || match(';')) {
+ lex();
+ return;
+ }
+
+ line = lineNumber;
+ skipComment();
+ if (lineNumber !== line) {
+ return;
+ }
+
+ if (lookahead.type !== Token.EOF && !match('}')) {
+ throwUnexpected(lookahead);
+ }
+ }
+
+ // Return true if provided expression is LeftHandSideExpression
+
+ function isLeftHandSide(expr) {
+ return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;
+ }
+
+ // 11.1.4 Array Initialiser
+
+ function parseArrayInitialiser() {
+ var elements = [], startToken;
+
+ startToken = lookahead;
+ expect('[');
+
+ while (!match(']')) {
+ if (match(',')) {
+ lex();
+ elements.push(null);
+ } else {
+ elements.push(parseAssignmentExpression());
+
+ if (!match(']')) {
+ expect(',');
+ }
+ }
+ }
+
+ lex();
+
+ return delegate.markEnd(delegate.createArrayExpression(elements), startToken);
+ }
+
+ // 11.1.5 Object Initialiser
+
+ function parsePropertyFunction(param, first) {
+ var previousStrict, body, startToken;
+
+ previousStrict = strict;
+ startToken = lookahead;
+ body = parseFunctionSourceElements();
+ if (first && strict && isRestrictedWord(param[0].name)) {
+ throwErrorTolerant(first, Messages.StrictParamName);
+ }
+ strict = previousStrict;
+ return delegate.markEnd(delegate.createFunctionExpression(null, param, [], body), startToken);
+ }
+
+ function parseObjectPropertyKey() {
+ var token, startToken;
+
+ startToken = lookahead;
+ token = lex();
+
+ // Note: This function is called only from parseObjectProperty(), where
+ // EOF and Punctuator tokens are already filtered out.
+
+ if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
+ if (strict && token.octal) {
+ throwErrorTolerant(token, Messages.StrictOctalLiteral);
+ }
+ return delegate.markEnd(delegate.createLiteral(token), startToken);
+ }
+
+ return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
+ }
+
+ function parseObjectProperty() {
+ var token, key, id, value, param, startToken;
+
+ token = lookahead;
+ startToken = lookahead;
+
+ if (token.type === Token.Identifier) {
+
+ id = parseObjectPropertyKey();
+
+ // Property Assignment: Getter and Setter.
+
+ if (token.value === 'get' && !match(':')) {
+ key = parseObjectPropertyKey();
+ expect('(');
+ expect(')');
+ value = parsePropertyFunction([]);
+ return delegate.markEnd(delegate.createProperty('get', key, value), startToken);
+ }
+ if (token.value === 'set' && !match(':')) {
+ key = parseObjectPropertyKey();
+ expect('(');
+ token = lookahead;
+ if (token.type !== Token.Identifier) {
+ expect(')');
+ throwErrorTolerant(token, Messages.UnexpectedToken, token.value);
+ value = parsePropertyFunction([]);
+ } else {
+ param = [ parseVariableIdentifier() ];
+ expect(')');
+ value = parsePropertyFunction(param, token);
+ }
+ return delegate.markEnd(delegate.createProperty('set', key, value), startToken);
+ }
+ expect(':');
+ value = parseAssignmentExpression();
+ return delegate.markEnd(delegate.createProperty('init', id, value), startToken);
+ }
+ if (token.type === Token.EOF || token.type === Token.Punctuator) {
+ throwUnexpected(token);
+ } else {
+ key = parseObjectPropertyKey();
+ expect(':');
+ value = parseAssignmentExpression();
+ return delegate.markEnd(delegate.createProperty('init', key, value), startToken);
+ }
+ }
+
+ function parseObjectInitialiser() {
+ var properties = [], property, name, key, kind, map = {}, toString = String, startToken;
+
+ startToken = lookahead;
+
+ expect('{');
+
+ while (!match('}')) {
+ property = parseObjectProperty();
+
+ if (property.key.type === Syntax.Identifier) {
+ name = property.key.name;
+ } else {
+ name = toString(property.key.value);
+ }
+ kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;
+
+ key = '$' + name;
+ if (Object.prototype.hasOwnProperty.call(map, key)) {
+ if (map[key] === PropertyKind.Data) {
+ if (strict && kind === PropertyKind.Data) {
+ throwErrorTolerant({}, Messages.StrictDuplicateProperty);
+ } else if (kind !== PropertyKind.Data) {
+ throwErrorTolerant({}, Messages.AccessorDataProperty);
+ }
+ } else {
+ if (kind === PropertyKind.Data) {
+ throwErrorTolerant({}, Messages.AccessorDataProperty);
+ } else if (map[key] & kind) {
+ throwErrorTolerant({}, Messages.AccessorGetSet);
+ }
+ }
+ map[key] |= kind;
+ } else {
+ map[key] = kind;
+ }
+
+ properties.push(property);
+
+ if (!match('}')) {
+ expect(',');
+ }
+ }
+
+ expect('}');
+
+ return delegate.markEnd(delegate.createObjectExpression(properties), startToken);
+ }
+
+ // 11.1.6 The Grouping Operator
+
+ function parseGroupExpression() {
+ var expr;
+
+ expect('(');
+
+ expr = parseExpression();
+
+ expect(')');
+
+ return expr;
+ }
+
+
+ // 11.1 Primary Expressions
+
+ function parsePrimaryExpression() {
+ var type, token, expr, startToken;
+
+ if (match('(')) {
+ return parseGroupExpression();
+ }
+
+ if (match('[')) {
+ return parseArrayInitialiser();
+ }
+
+ if (match('{')) {
+ return parseObjectInitialiser();
+ }
+
+ type = lookahead.type;
+ startToken = lookahead;
+
+ if (type === Token.Identifier) {
+ expr = delegate.createIdentifier(lex().value);
+ } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
+ if (strict && lookahead.octal) {
+ throwErrorTolerant(lookahead, Messages.StrictOctalLiteral);
+ }
+ expr = delegate.createLiteral(lex());
+ } else if (type === Token.Keyword) {
+ if (matchKeyword('function')) {
+ return parseFunctionExpression();
+ }
+ if (matchKeyword('this')) {
+ lex();
+ expr = delegate.createThisExpression();
+ } else {
+ throwUnexpected(lex());
+ }
+ } else if (type === Token.BooleanLiteral) {
+ token = lex();
+ token.value = (token.value === 'true');
+ expr = delegate.createLiteral(token);
+ } else if (type === Token.NullLiteral) {
+ token = lex();
+ token.value = null;
+ expr = delegate.createLiteral(token);
+ } else if (match('/') || match('/=')) {
+ if (typeof extra.tokens !== 'undefined') {
+ expr = delegate.createLiteral(collectRegex());
+ } else {
+ expr = delegate.createLiteral(scanRegExp());
+ }
+ peek();
+ } else {
+ throwUnexpected(lex());
+ }
+
+ return delegate.markEnd(expr, startToken);
+ }
+
+ // 11.2 Left-Hand-Side Expressions
+
+ function parseArguments() {
+ var args = [];
+
+ expect('(');
+
+ if (!match(')')) {
+ while (index < length) {
+ args.push(parseAssignmentExpression());
+ if (match(')')) {
+ break;
+ }
+ expect(',');
+ }
+ }
+
+ expect(')');
+
+ return args;
+ }
+
+ function parseNonComputedProperty() {
+ var token, startToken;
+
+ startToken = lookahead;
+ token = lex();
+
+ if (!isIdentifierName(token)) {
+ throwUnexpected(token);
+ }
+
+ return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
+ }
+
+ function parseNonComputedMember() {
+ expect('.');
+
+ return parseNonComputedProperty();
+ }
+
+ function parseComputedMember() {
+ var expr;
+
+ expect('[');
+
+ expr = parseExpression();
+
+ expect(']');
+
+ return expr;
+ }
+
+ function parseNewExpression() {
+ var callee, args, startToken;
+
+ startToken = lookahead;
+ expectKeyword('new');
+ callee = parseLeftHandSideExpression();
+ args = match('(') ? parseArguments() : [];
+
+ return delegate.markEnd(delegate.createNewExpression(callee, args), startToken);
+ }
+
+ function parseLeftHandSideExpressionAllowCall() {
+ var previousAllowIn, expr, args, property, startToken;
+
+ startToken = lookahead;
+
+ previousAllowIn = state.allowIn;
+ state.allowIn = true;
+ expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
+ state.allowIn = previousAllowIn;
+
+ for (;;) {
+ if (match('.')) {
+ property = parseNonComputedMember();
+ expr = delegate.createMemberExpression('.', expr, property);
+ } else if (match('(')) {
+ args = parseArguments();
+ expr = delegate.createCallExpression(expr, args);
+ } else if (match('[')) {
+ property = parseComputedMember();
+ expr = delegate.createMemberExpression('[', expr, property);
+ } else {
+ break;
+ }
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ function parseLeftHandSideExpression() {
+ var previousAllowIn, expr, property, startToken;
+
+ startToken = lookahead;
+
+ previousAllowIn = state.allowIn;
+ expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
+ state.allowIn = previousAllowIn;
+
+ while (match('.') || match('[')) {
+ if (match('[')) {
+ property = parseComputedMember();
+ expr = delegate.createMemberExpression('[', expr, property);
+ } else {
+ property = parseNonComputedMember();
+ expr = delegate.createMemberExpression('.', expr, property);
+ }
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ // 11.3 Postfix Expressions
+
+ function parsePostfixExpression() {
+ var expr, token, startToken = lookahead;
+
+ expr = parseLeftHandSideExpressionAllowCall();
+
+ if (lookahead.type === Token.Punctuator) {
+ if ((match('++') || match('--')) && !peekLineTerminator()) {
+ // 11.3.1, 11.3.2
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
+ throwErrorTolerant({}, Messages.StrictLHSPostfix);
+ }
+
+ if (!isLeftHandSide(expr)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
+ }
+
+ token = lex();
+ expr = delegate.markEnd(delegate.createPostfixExpression(token.value, expr), startToken);
+ }
+ }
+
+ return expr;
+ }
+
+ // 11.4 Unary Operators
+
+ function parseUnaryExpression() {
+ var token, expr, startToken;
+
+ if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
+ expr = parsePostfixExpression();
+ } else if (match('++') || match('--')) {
+ startToken = lookahead;
+ token = lex();
+ expr = parseUnaryExpression();
+ // 11.4.4, 11.4.5
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
+ throwErrorTolerant({}, Messages.StrictLHSPrefix);
+ }
+
+ if (!isLeftHandSide(expr)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
+ }
+
+ expr = delegate.createUnaryExpression(token.value, expr);
+ expr = delegate.markEnd(expr, startToken);
+ } else if (match('+') || match('-') || match('~') || match('!')) {
+ startToken = lookahead;
+ token = lex();
+ expr = parseUnaryExpression();
+ expr = delegate.createUnaryExpression(token.value, expr);
+ expr = delegate.markEnd(expr, startToken);
+ } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
+ startToken = lookahead;
+ token = lex();
+ expr = parseUnaryExpression();
+ expr = delegate.createUnaryExpression(token.value, expr);
+ expr = delegate.markEnd(expr, startToken);
+ if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {
+ throwErrorTolerant({}, Messages.StrictDelete);
+ }
+ } else {
+ expr = parsePostfixExpression();
+ }
+
+ return expr;
+ }
+
+ function binaryPrecedence(token, allowIn) {
+ var prec = 0;
+
+ if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
+ return 0;
+ }
+
+ switch (token.value) {
+ case '||':
+ prec = 1;
+ break;
+
+ case '&&':
+ prec = 2;
+ break;
+
+ case '|':
+ prec = 3;
+ break;
+
+ case '^':
+ prec = 4;
+ break;
+
+ case '&':
+ prec = 5;
+ break;
+
+ case '==':
+ case '!=':
+ case '===':
+ case '!==':
+ prec = 6;
+ break;
+
+ case '<':
+ case '>':
+ case '<=':
+ case '>=':
+ case 'instanceof':
+ prec = 7;
+ break;
+
+ case 'in':
+ prec = allowIn ? 7 : 0;
+ break;
+
+ case '<<':
+ case '>>':
+ case '>>>':
+ prec = 8;
+ break;
+
+ case '+':
+ case '-':
+ prec = 9;
+ break;
+
+ case '*':
+ case '/':
+ case '%':
+ prec = 11;
+ break;
+
+ default:
+ break;
+ }
+
+ return prec;
+ }
+
+ // 11.5 Multiplicative Operators
+ // 11.6 Additive Operators
+ // 11.7 Bitwise Shift Operators
+ // 11.8 Relational Operators
+ // 11.9 Equality Operators
+ // 11.10 Binary Bitwise Operators
+ // 11.11 Binary Logical Operators
+
+ function parseBinaryExpression() {
+ var marker, markers, expr, token, prec, stack, right, operator, left, i;
+
+ marker = lookahead;
+ left = parseUnaryExpression();
+
+ token = lookahead;
+ prec = binaryPrecedence(token, state.allowIn);
+ if (prec === 0) {
+ return left;
+ }
+ token.prec = prec;
+ lex();
+
+ markers = [marker, lookahead];
+ right = parseUnaryExpression();
+
+ stack = [left, token, right];
+
+ while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) {
+
+ // Reduce: make a binary expression from the three topmost entries.
+ while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
+ right = stack.pop();
+ operator = stack.pop().value;
+ left = stack.pop();
+ expr = delegate.createBinaryExpression(operator, left, right);
+ markers.pop();
+ marker = markers[markers.length - 1];
+ delegate.markEnd(expr, marker);
+ stack.push(expr);
+ }
+
+ // Shift.
+ token = lex();
+ token.prec = prec;
+ stack.push(token);
+ markers.push(lookahead);
+ expr = parseUnaryExpression();
+ stack.push(expr);
+ }
+
+ // Final reduce to clean-up the stack.
+ i = stack.length - 1;
+ expr = stack[i];
+ markers.pop();
+ while (i > 1) {
+ expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
+ i -= 2;
+ marker = markers.pop();
+ delegate.markEnd(expr, marker);
+ }
+
+ return expr;
+ }
+
+
+ // 11.12 Conditional Operator
+
+ function parseConditionalExpression() {
+ var expr, previousAllowIn, consequent, alternate, startToken;
+
+ startToken = lookahead;
+
+ expr = parseBinaryExpression();
+
+ if (match('?')) {
+ lex();
+ previousAllowIn = state.allowIn;
+ state.allowIn = true;
+ consequent = parseAssignmentExpression();
+ state.allowIn = previousAllowIn;
+ expect(':');
+ alternate = parseAssignmentExpression();
+
+ expr = delegate.createConditionalExpression(expr, consequent, alternate);
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ // 11.13 Assignment Operators
+
+ function parseAssignmentExpression() {
+ var token, left, right, node, startToken;
+
+ token = lookahead;
+ startToken = lookahead;
+
+ node = left = parseConditionalExpression();
+
+ if (matchAssign()) {
+ // LeftHandSideExpression
+ if (!isLeftHandSide(left)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
+ }
+
+ // 11.13.1
+ if (strict && left.type === Syntax.Identifier && isRestrictedWord(left.name)) {
+ throwErrorTolerant(token, Messages.StrictLHSAssignment);
+ }
+
+ token = lex();
+ right = parseAssignmentExpression();
+ node = delegate.markEnd(delegate.createAssignmentExpression(token.value, left, right), startToken);
+ }
+
+ return node;
+ }
+
+ // 11.14 Comma Operator
+
+ function parseExpression() {
+ var expr, startToken = lookahead;
+
+ expr = parseAssignmentExpression();
+
+ if (match(',')) {
+ expr = delegate.createSequenceExpression([ expr ]);
+
+ while (index < length) {
+ if (!match(',')) {
+ break;
+ }
+ lex();
+ expr.expressions.push(parseAssignmentExpression());
+ }
+
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ // 12.1 Block
+
+ function parseStatementList() {
+ var list = [],
+ statement;
+
+ while (index < length) {
+ if (match('}')) {
+ break;
+ }
+ statement = parseSourceElement();
+ if (typeof statement === 'undefined') {
+ break;
+ }
+ list.push(statement);
+ }
+
+ return list;
+ }
+
+ function parseBlock() {
+ var block, startToken;
+
+ startToken = lookahead;
+ expect('{');
+
+ block = parseStatementList();
+
+ expect('}');
+
+ return delegate.markEnd(delegate.createBlockStatement(block), startToken);
+ }
+
+ // 12.2 Variable Statement
+
+ function parseVariableIdentifier() {
+ var token, startToken;
+
+ startToken = lookahead;
+ token = lex();
+
+ if (token.type !== Token.Identifier) {
+ throwUnexpected(token);
+ }
+
+ return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
+ }
+
+ function parseVariableDeclaration(kind) {
+ var init = null, id, startToken;
+
+ startToken = lookahead;
+ id = parseVariableIdentifier();
+
+ // 12.2.1
+ if (strict && isRestrictedWord(id.name)) {
+ throwErrorTolerant({}, Messages.StrictVarName);
+ }
+
+ if (kind === 'const') {
+ expect('=');
+ init = parseAssignmentExpression();
+ } else if (match('=')) {
+ lex();
+ init = parseAssignmentExpression();
+ }
+
+ return delegate.markEnd(delegate.createVariableDeclarator(id, init), startToken);
+ }
+
+ function parseVariableDeclarationList(kind) {
+ var list = [];
+
+ do {
+ list.push(parseVariableDeclaration(kind));
+ if (!match(',')) {
+ break;
+ }
+ lex();
+ } while (index < length);
+
+ return list;
+ }
+
+ function parseVariableStatement() {
+ var declarations;
+
+ expectKeyword('var');
+
+ declarations = parseVariableDeclarationList();
+
+ consumeSemicolon();
+
+ return delegate.createVariableDeclaration(declarations, 'var');
+ }
+
+ // kind may be `const` or `let`
+ // Both are experimental and not in the specification yet.
+ // see http://wiki.ecmascript.org/doku.php?id=harmony:const
+ // and http://wiki.ecmascript.org/doku.php?id=harmony:let
+ function parseConstLetDeclaration(kind) {
+ var declarations, startToken;
+
+ startToken = lookahead;
+
+ expectKeyword(kind);
+
+ declarations = parseVariableDeclarationList(kind);
+
+ consumeSemicolon();
+
+ return delegate.markEnd(delegate.createVariableDeclaration(declarations, kind), startToken);
+ }
+
+ // 12.3 Empty Statement
+
+ function parseEmptyStatement() {
+ expect(';');
+ return delegate.createEmptyStatement();
+ }
+
+ // 12.4 Expression Statement
+
+ function parseExpressionStatement() {
+ var expr = parseExpression();
+ consumeSemicolon();
+ return delegate.createExpressionStatement(expr);
+ }
+
+ // 12.5 If statement
+
+ function parseIfStatement() {
+ var test, consequent, alternate;
+
+ expectKeyword('if');
+
+ expect('(');
+
+ test = parseExpression();
+
+ expect(')');
+
+ consequent = parseStatement();
+
+ if (matchKeyword('else')) {
+ lex();
+ alternate = parseStatement();
+ } else {
+ alternate = null;
+ }
+
+ return delegate.createIfStatement(test, consequent, alternate);
+ }
+
+ // 12.6 Iteration Statements
+
+ function parseDoWhileStatement() {
+ var body, test, oldInIteration;
+
+ expectKeyword('do');
+
+ oldInIteration = state.inIteration;
+ state.inIteration = true;
+
+ body = parseStatement();
+
+ state.inIteration = oldInIteration;
+
+ expectKeyword('while');
+
+ expect('(');
+
+ test = parseExpression();
+
+ expect(')');
+
+ if (match(';')) {
+ lex();
+ }
+
+ return delegate.createDoWhileStatement(body, test);
+ }
+
+ function parseWhileStatement() {
+ var test, body, oldInIteration;
+
+ expectKeyword('while');
+
+ expect('(');
+
+ test = parseExpression();
+
+ expect(')');
+
+ oldInIteration = state.inIteration;
+ state.inIteration = true;
+
+ body = parseStatement();
+
+ state.inIteration = oldInIteration;
+
+ return delegate.createWhileStatement(test, body);
+ }
+
+ function parseForVariableDeclaration() {
+ var token, declarations, startToken;
+
+ startToken = lookahead;
+ token = lex();
+ declarations = parseVariableDeclarationList();
+
+ return delegate.markEnd(delegate.createVariableDeclaration(declarations, token.value), startToken);
+ }
+
+ function parseForStatement() {
+ var init, test, update, left, right, body, oldInIteration;
+
+ init = test = update = null;
+
+ expectKeyword('for');
+
+ expect('(');
+
+ if (match(';')) {
+ lex();
+ } else {
+ if (matchKeyword('var') || matchKeyword('let')) {
+ state.allowIn = false;
+ init = parseForVariableDeclaration();
+ state.allowIn = true;
+
+ if (init.declarations.length === 1 && matchKeyword('in')) {
+ lex();
+ left = init;
+ right = parseExpression();
+ init = null;
+ }
+ } else {
+ state.allowIn = false;
+ init = parseExpression();
+ state.allowIn = true;
+
+ if (matchKeyword('in')) {
+ // LeftHandSideExpression
+ if (!isLeftHandSide(init)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInForIn);
+ }
+
+ lex();
+ left = init;
+ right = parseExpression();
+ init = null;
+ }
+ }
+
+ if (typeof left === 'undefined') {
+ expect(';');
+ }
+ }
+
+ if (typeof left === 'undefined') {
+
+ if (!match(';')) {
+ test = parseExpression();
+ }
+ expect(';');
+
+ if (!match(')')) {
+ update = parseExpression();
+ }
+ }
+
+ expect(')');
+
+ oldInIteration = state.inIteration;
+ state.inIteration = true;
+
+ body = parseStatement();
+
+ state.inIteration = oldInIteration;
+
+ return (typeof left === 'undefined') ?
+ delegate.createForStatement(init, test, update, body) :
+ delegate.createForInStatement(left, right, body);
+ }
+
+ // 12.7 The continue statement
+
+ function parseContinueStatement() {
+ var label = null, key;
+
+ expectKeyword('continue');
+
+ // Optimize the most common form: 'continue;'.
+ if (source.charCodeAt(index) === 0x3B) {
+ lex();
+
+ if (!state.inIteration) {
+ throwError({}, Messages.IllegalContinue);
+ }
+
+ return delegate.createContinueStatement(null);
+ }
+
+ if (peekLineTerminator()) {
+ if (!state.inIteration) {
+ throwError({}, Messages.IllegalContinue);
+ }
+
+ return delegate.createContinueStatement(null);
+ }
+
+ if (lookahead.type === Token.Identifier) {
+ label = parseVariableIdentifier();
+
+ key = '$' + label.name;
+ if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
+ throwError({}, Messages.UnknownLabel, label.name);
+ }
+ }
+
+ consumeSemicolon();
+
+ if (label === null && !state.inIteration) {
+ throwError({}, Messages.IllegalContinue);
+ }
+
+ return delegate.createContinueStatement(label);
+ }
+
+ // 12.8 The break statement
+
+ function parseBreakStatement() {
+ var label = null, key;
+
+ expectKeyword('break');
+
+ // Catch the very common case first: immediately a semicolon (U+003B).
+ if (source.charCodeAt(index) === 0x3B) {
+ lex();
+
+ if (!(state.inIteration || state.inSwitch)) {
+ throwError({}, Messages.IllegalBreak);
+ }
+
+ return delegate.createBreakStatement(null);
+ }
+
+ if (peekLineTerminator()) {
+ if (!(state.inIteration || state.inSwitch)) {
+ throwError({}, Messages.IllegalBreak);
+ }
+
+ return delegate.createBreakStatement(null);
+ }
+
+ if (lookahead.type === Token.Identifier) {
+ label = parseVariableIdentifier();
+
+ key = '$' + label.name;
+ if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
+ throwError({}, Messages.UnknownLabel, label.name);
+ }
+ }
+
+ consumeSemicolon();
+
+ if (label === null && !(state.inIteration || state.inSwitch)) {
+ throwError({}, Messages.IllegalBreak);
+ }
+
+ return delegate.createBreakStatement(label);
+ }
+
+ // 12.9 The return statement
+
+ function parseReturnStatement() {
+ var argument = null;
+
+ expectKeyword('return');
+
+ if (!state.inFunctionBody) {
+ throwErrorTolerant({}, Messages.IllegalReturn);
+ }
+
+ // 'return' followed by a space and an identifier is very common.
+ if (source.charCodeAt(index) === 0x20) {
+ if (isIdentifierStart(source.charCodeAt(index + 1))) {
+ argument = parseExpression();
+ consumeSemicolon();
+ return delegate.createReturnStatement(argument);
+ }
+ }
+
+ if (peekLineTerminator()) {
+ return delegate.createReturnStatement(null);
+ }
+
+ if (!match(';')) {
+ if (!match('}') && lookahead.type !== Token.EOF) {
+ argument = parseExpression();
+ }
+ }
+
+ consumeSemicolon();
+
+ return delegate.createReturnStatement(argument);
+ }
+
+ // 12.10 The with statement
+
+ function parseWithStatement() {
+ var object, body;
+
+ if (strict) {
+ // TODO(ikarienator): Should we update the test cases instead?
+ skipComment();
+ throwErrorTolerant({}, Messages.StrictModeWith);
+ }
+
+ expectKeyword('with');
+
+ expect('(');
+
+ object = parseExpression();
+
+ expect(')');
+
+ body = parseStatement();
+
+ return delegate.createWithStatement(object, body);
+ }
+
+ // 12.10 The swith statement
+
+ function parseSwitchCase() {
+ var test, consequent = [], statement, startToken;
+
+ startToken = lookahead;
+ if (matchKeyword('default')) {
+ lex();
+ test = null;
+ } else {
+ expectKeyword('case');
+ test = parseExpression();
+ }
+ expect(':');
+
+ while (index < length) {
+ if (match('}') || matchKeyword('default') || matchKeyword('case')) {
+ break;
+ }
+ statement = parseStatement();
+ consequent.push(statement);
+ }
+
+ return delegate.markEnd(delegate.createSwitchCase(test, consequent), startToken);
+ }
+
+ function parseSwitchStatement() {
+ var discriminant, cases, clause, oldInSwitch, defaultFound;
+
+ expectKeyword('switch');
+
+ expect('(');
+
+ discriminant = parseExpression();
+
+ expect(')');
+
+ expect('{');
+
+ cases = [];
+
+ if (match('}')) {
+ lex();
+ return delegate.createSwitchStatement(discriminant, cases);
+ }
+
+ oldInSwitch = state.inSwitch;
+ state.inSwitch = true;
+ defaultFound = false;
+
+ while (index < length) {
+ if (match('}')) {
+ break;
+ }
+ clause = parseSwitchCase();
+ if (clause.test === null) {
+ if (defaultFound) {
+ throwError({}, Messages.MultipleDefaultsInSwitch);
+ }
+ defaultFound = true;
+ }
+ cases.push(clause);
+ }
+
+ state.inSwitch = oldInSwitch;
+
+ expect('}');
+
+ return delegate.createSwitchStatement(discriminant, cases);
+ }
+
+ // 12.13 The throw statement
+
+ function parseThrowStatement() {
+ var argument;
+
+ expectKeyword('throw');
+
+ if (peekLineTerminator()) {
+ throwError({}, Messages.NewlineAfterThrow);
+ }
+
+ argument = parseExpression();
+
+ consumeSemicolon();
+
+ return delegate.createThrowStatement(argument);
+ }
+
+ // 12.14 The try statement
+
+ function parseCatchClause() {
+ var param, body, startToken;
+
+ startToken = lookahead;
+ expectKeyword('catch');
+
+ expect('(');
+ if (match(')')) {
+ throwUnexpected(lookahead);
+ }
+
+ param = parseVariableIdentifier();
+ // 12.14.1
+ if (strict && isRestrictedWord(param.name)) {
+ throwErrorTolerant({}, Messages.StrictCatchVariable);
+ }
+
+ expect(')');
+ body = parseBlock();
+ return delegate.markEnd(delegate.createCatchClause(param, body), startToken);
+ }
+
+ function parseTryStatement() {
+ var block, handlers = [], finalizer = null;
+
+ expectKeyword('try');
+
+ block = parseBlock();
+
+ if (matchKeyword('catch')) {
+ handlers.push(parseCatchClause());
+ }
+
+ if (matchKeyword('finally')) {
+ lex();
+ finalizer = parseBlock();
+ }
+
+ if (handlers.length === 0 && !finalizer) {
+ throwError({}, Messages.NoCatchOrFinally);
+ }
+
+ return delegate.createTryStatement(block, [], handlers, finalizer);
+ }
+
+ // 12.15 The debugger statement
+
+ function parseDebuggerStatement() {
+ expectKeyword('debugger');
+
+ consumeSemicolon();
+
+ return delegate.createDebuggerStatement();
+ }
+
+ // 12 Statements
+
+ function parseStatement() {
+ var type = lookahead.type,
+ expr,
+ labeledBody,
+ key,
+ startToken;
+
+ if (type === Token.EOF) {
+ throwUnexpected(lookahead);
+ }
+
+ if (type === Token.Punctuator && lookahead.value === '{') {
+ return parseBlock();
+ }
+
+ startToken = lookahead;
+
+ if (type === Token.Punctuator) {
+ switch (lookahead.value) {
+ case ';':
+ return delegate.markEnd(parseEmptyStatement(), startToken);
+ case '(':
+ return delegate.markEnd(parseExpressionStatement(), startToken);
+ default:
+ break;
+ }
+ }
+
+ if (type === Token.Keyword) {
+ switch (lookahead.value) {
+ case 'break':
+ return delegate.markEnd(parseBreakStatement(), startToken);
+ case 'continue':
+ return delegate.markEnd(parseContinueStatement(), startToken);
+ case 'debugger':
+ return delegate.markEnd(parseDebuggerStatement(), startToken);
+ case 'do':
+ return delegate.markEnd(parseDoWhileStatement(), startToken);
+ case 'for':
+ return delegate.markEnd(parseForStatement(), startToken);
+ case 'function':
+ return delegate.markEnd(parseFunctionDeclaration(), startToken);
+ case 'if':
+ return delegate.markEnd(parseIfStatement(), startToken);
+ case 'return':
+ return delegate.markEnd(parseReturnStatement(), startToken);
+ case 'switch':
+ return delegate.markEnd(parseSwitchStatement(), startToken);
+ case 'throw':
+ return delegate.markEnd(parseThrowStatement(), startToken);
+ case 'try':
+ return delegate.markEnd(parseTryStatement(), startToken);
+ case 'var':
+ return delegate.markEnd(parseVariableStatement(), startToken);
+ case 'while':
+ return delegate.markEnd(parseWhileStatement(), startToken);
+ case 'with':
+ return delegate.markEnd(parseWithStatement(), startToken);
+ default:
+ break;
+ }
+ }
+
+ expr = parseExpression();
+
+ // 12.12 Labelled Statements
+ if ((expr.type === Syntax.Identifier) && match(':')) {
+ lex();
+
+ key = '$' + expr.name;
+ if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
+ throwError({}, Messages.Redeclaration, 'Label', expr.name);
+ }
+
+ state.labelSet[key] = true;
+ labeledBody = parseStatement();
+ delete state.labelSet[key];
+ return delegate.markEnd(delegate.createLabeledStatement(expr, labeledBody), startToken);
+ }
+
+ consumeSemicolon();
+
+ return delegate.markEnd(delegate.createExpressionStatement(expr), startToken);
+ }
+
+ // 13 Function Definition
+
+ function parseFunctionSourceElements() {
+ var sourceElement, sourceElements = [], token, directive, firstRestricted,
+ oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, startToken;
+
+ startToken = lookahead;
+ expect('{');
+
+ while (index < length) {
+ if (lookahead.type !== Token.StringLiteral) {
+ break;
+ }
+ token = lookahead;
+
+ sourceElement = parseSourceElement();
+ sourceElements.push(sourceElement);
+ if (sourceElement.expression.type !== Syntax.Literal) {
+ // this is not directive
+ break;
+ }
+ directive = source.slice(token.start + 1, token.end - 1);
+ if (directive === 'use strict') {
+ strict = true;
+ if (firstRestricted) {
+ throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
+ }
+ } else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+
+ oldLabelSet = state.labelSet;
+ oldInIteration = state.inIteration;
+ oldInSwitch = state.inSwitch;
+ oldInFunctionBody = state.inFunctionBody;
+
+ state.labelSet = {};
+ state.inIteration = false;
+ state.inSwitch = false;
+ state.inFunctionBody = true;
+
+ while (index < length) {
+ if (match('}')) {
+ break;
+ }
+ sourceElement = parseSourceElement();
+ if (typeof sourceElement === 'undefined') {
+ break;
+ }
+ sourceElements.push(sourceElement);
+ }
+
+ expect('}');
+
+ state.labelSet = oldLabelSet;
+ state.inIteration = oldInIteration;
+ state.inSwitch = oldInSwitch;
+ state.inFunctionBody = oldInFunctionBody;
+
+ return delegate.markEnd(delegate.createBlockStatement(sourceElements), startToken);
+ }
+
+ function parseParams(firstRestricted) {
+ var param, params = [], token, stricted, paramSet, key, message;
+ expect('(');
+
+ if (!match(')')) {
+ paramSet = {};
+ while (index < length) {
+ token = lookahead;
+ param = parseVariableIdentifier();
+ key = '$' + token.value;
+ if (strict) {
+ if (isRestrictedWord(token.value)) {
+ stricted = token;
+ message = Messages.StrictParamName;
+ }
+ if (Object.prototype.hasOwnProperty.call(paramSet, key)) {
+ stricted = token;
+ message = Messages.StrictParamDupe;
+ }
+ } else if (!firstRestricted) {
+ if (isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictParamName;
+ } else if (isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictReservedWord;
+ } else if (Object.prototype.hasOwnProperty.call(paramSet, key)) {
+ firstRestricted = token;
+ message = Messages.StrictParamDupe;
+ }
+ }
+ params.push(param);
+ paramSet[key] = true;
+ if (match(')')) {
+ break;
+ }
+ expect(',');
+ }
+ }
+
+ expect(')');
+
+ return {
+ params: params,
+ stricted: stricted,
+ firstRestricted: firstRestricted,
+ message: message
+ };
+ }
+
+ function parseFunctionDeclaration() {
+ var id, params = [], body, token, stricted, tmp, firstRestricted, message, previousStrict, startToken;
+
+ startToken = lookahead;
+
+ expectKeyword('function');
+ token = lookahead;
+ id = parseVariableIdentifier();
+ if (strict) {
+ if (isRestrictedWord(token.value)) {
+ throwErrorTolerant(token, Messages.StrictFunctionName);
+ }
+ } else {
+ if (isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictFunctionName;
+ } else if (isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictReservedWord;
+ }
+ }
+
+ tmp = parseParams(firstRestricted);
+ params = tmp.params;
+ stricted = tmp.stricted;
+ firstRestricted = tmp.firstRestricted;
+ if (tmp.message) {
+ message = tmp.message;
+ }
+
+ previousStrict = strict;
+ body = parseFunctionSourceElements();
+ if (strict && firstRestricted) {
+ throwError(firstRestricted, message);
+ }
+ if (strict && stricted) {
+ throwErrorTolerant(stricted, message);
+ }
+ strict = previousStrict;
+
+ return delegate.markEnd(delegate.createFunctionDeclaration(id, params, [], body), startToken);
+ }
+
+ function parseFunctionExpression() {
+ var token, id = null, stricted, firstRestricted, message, tmp, params = [], body, previousStrict, startToken;
+
+ startToken = lookahead;
+ expectKeyword('function');
+
+ if (!match('(')) {
+ token = lookahead;
+ id = parseVariableIdentifier();
+ if (strict) {
+ if (isRestrictedWord(token.value)) {
+ throwErrorTolerant(token, Messages.StrictFunctionName);
+ }
+ } else {
+ if (isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictFunctionName;
+ } else if (isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictReservedWord;
+ }
+ }
+ }
+
+ tmp = parseParams(firstRestricted);
+ params = tmp.params;
+ stricted = tmp.stricted;
+ firstRestricted = tmp.firstRestricted;
+ if (tmp.message) {
+ message = tmp.message;
+ }
+
+ previousStrict = strict;
+ body = parseFunctionSourceElements();
+ if (strict && firstRestricted) {
+ throwError(firstRestricted, message);
+ }
+ if (strict && stricted) {
+ throwErrorTolerant(stricted, message);
+ }
+ strict = previousStrict;
+
+ return delegate.markEnd(delegate.createFunctionExpression(id, params, [], body), startToken);
+ }
+
+ // 14 Program
+
+ function parseSourceElement() {
+ if (lookahead.type === Token.Keyword) {
+ switch (lookahead.value) {
+ case 'const':
+ case 'let':
+ return parseConstLetDeclaration(lookahead.value);
+ case 'function':
+ return parseFunctionDeclaration();
+ default:
+ return parseStatement();
+ }
+ }
+
+ if (lookahead.type !== Token.EOF) {
+ return parseStatement();
+ }
+ }
+
+ function parseSourceElements() {
+ var sourceElement, sourceElements = [], token, directive, firstRestricted;
+
+ while (index < length) {
+ token = lookahead;
+ if (token.type !== Token.StringLiteral) {
+ break;
+ }
+
+ sourceElement = parseSourceElement();
+ sourceElements.push(sourceElement);
+ if (sourceElement.expression.type !== Syntax.Literal) {
+ // this is not directive
+ break;
+ }
+ directive = source.slice(token.start + 1, token.end - 1);
+ if (directive === 'use strict') {
+ strict = true;
+ if (firstRestricted) {
+ throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
+ }
+ } else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+
+ while (index < length) {
+ sourceElement = parseSourceElement();
+ /* istanbul ignore if */
+ if (typeof sourceElement === 'undefined') {
+ break;
+ }
+ sourceElements.push(sourceElement);
+ }
+ return sourceElements;
+ }
+
+ function parseProgram() {
+ var body, startToken;
+
+ skipComment();
+ peek();
+ startToken = lookahead;
+ strict = false;
+
+ body = parseSourceElements();
+ return delegate.markEnd(delegate.createProgram(body), startToken);
+ }
+
+ function filterTokenLocation() {
+ var i, entry, token, tokens = [];
+
+ for (i = 0; i < extra.tokens.length; ++i) {
+ entry = extra.tokens[i];
+ token = {
+ type: entry.type,
+ value: entry.value
+ };
+ if (extra.range) {
+ token.range = entry.range;
+ }
+ if (extra.loc) {
+ token.loc = entry.loc;
+ }
+ tokens.push(token);
+ }
+
+ extra.tokens = tokens;
+ }
+
+ function tokenize(code, options) {
+ var toString,
+ token,
+ tokens;
+
+ toString = String;
+ if (typeof code !== 'string' && !(code instanceof String)) {
+ code = toString(code);
+ }
+
+ delegate = SyntaxTreeDelegate;
+ source = code;
+ index = 0;
+ lineNumber = (source.length > 0) ? 1 : 0;
+ lineStart = 0;
+ length = source.length;
+ lookahead = null;
+ state = {
+ allowIn: true,
+ labelSet: {},
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ lastCommentStart: -1
+ };
+
+ extra = {};
+
+ // Options matching.
+ options = options || {};
+
+ // Of course we collect tokens here.
+ options.tokens = true;
+ extra.tokens = [];
+ extra.tokenize = true;
+ // The following two fields are necessary to compute the Regex tokens.
+ extra.openParenToken = -1;
+ extra.openCurlyToken = -1;
+
+ extra.range = (typeof options.range === 'boolean') && options.range;
+ extra.loc = (typeof options.loc === 'boolean') && options.loc;
+
+ if (typeof options.comment === 'boolean' && options.comment) {
+ extra.comments = [];
+ }
+ if (typeof options.tolerant === 'boolean' && options.tolerant) {
+ extra.errors = [];
+ }
+
+ try {
+ peek();
+ if (lookahead.type === Token.EOF) {
+ return extra.tokens;
+ }
+
+ token = lex();
+ while (lookahead.type !== Token.EOF) {
+ try {
+ token = lex();
+ } catch (lexError) {
+ token = lookahead;
+ if (extra.errors) {
+ extra.errors.push(lexError);
+ // We have to break on the first error
+ // to avoid infinite loops.
+ break;
+ } else {
+ throw lexError;
+ }
+ }
+ }
+
+ filterTokenLocation();
+ tokens = extra.tokens;
+ if (typeof extra.comments !== 'undefined') {
+ tokens.comments = extra.comments;
+ }
+ if (typeof extra.errors !== 'undefined') {
+ tokens.errors = extra.errors;
+ }
+ } catch (e) {
+ throw e;
+ } finally {
+ extra = {};
+ }
+ return tokens;
+ }
+
+ function parse(code, options) {
+ var program, toString;
+
+ toString = String;
+ if (typeof code !== 'string' && !(code instanceof String)) {
+ code = toString(code);
+ }
+
+ delegate = SyntaxTreeDelegate;
+ source = code;
+ index = 0;
+ lineNumber = (source.length > 0) ? 1 : 0;
+ lineStart = 0;
+ length = source.length;
+ lookahead = null;
+ state = {
+ allowIn: true,
+ labelSet: {},
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ lastCommentStart: -1
+ };
+
+ extra = {};
+ if (typeof options !== 'undefined') {
+ extra.range = (typeof options.range === 'boolean') && options.range;
+ extra.loc = (typeof options.loc === 'boolean') && options.loc;
+ extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment;
+
+ if (extra.loc && options.source !== null && options.source !== undefined) {
+ extra.source = toString(options.source);
+ }
+
+ if (typeof options.tokens === 'boolean' && options.tokens) {
+ extra.tokens = [];
+ }
+ if (typeof options.comment === 'boolean' && options.comment) {
+ extra.comments = [];
+ }
+ if (typeof options.tolerant === 'boolean' && options.tolerant) {
+ extra.errors = [];
+ }
+ if (extra.attachComment) {
+ extra.range = true;
+ extra.comments = [];
+ extra.bottomRightStack = [];
+ extra.trailingComments = [];
+ extra.leadingComments = [];
+ }
+ }
+
+ try {
+ program = parseProgram();
+ if (typeof extra.comments !== 'undefined') {
+ program.comments = extra.comments;
+ }
+ if (typeof extra.tokens !== 'undefined') {
+ filterTokenLocation();
+ program.tokens = extra.tokens;
+ }
+ if (typeof extra.errors !== 'undefined') {
+ program.errors = extra.errors;
+ }
+ } catch (e) {
+ throw e;
+ } finally {
+ extra = {};
+ }
+
+ return program;
+ }
+
+ // Sync with *.json manifests.
+ exports.version = '1.2.2';
+
+ exports.tokenize = tokenize;
+
+ exports.parse = parse;
+
+ // Deep copy.
+ /* istanbul ignore next */
+ exports.Syntax = (function () {
+ var name, types = {};
+
+ if (typeof Object.create === 'function') {
+ types = Object.create(null);
+ }
+
+ for (name in Syntax) {
+ if (Syntax.hasOwnProperty(name)) {
+ types[name] = Syntax[name];
+ }
+ }
+
+ if (typeof Object.freeze === 'function') {
+ Object.freeze(types);
+ }
+
+ return types;
+ }());
+
+}));
+/* vim: set sw=4 ts=4 et tw=80 : */
+
+},{}],1:[function(require,module,exports){
+(function (process){
+/* parser generated by jison 0.4.13 */
+/*
+ Returns a Parser object of the following structure:
+
+ Parser: {
+ yy: {}
+ }
+
+ Parser.prototype: {
+ yy: {},
+ trace: function(),
+ symbols_: {associative list: name ==> number},
+ terminals_: {associative list: number ==> name},
+ productions_: [...],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+ table: [...],
+ defaultActions: {...},
+ parseError: function(str, hash),
+ parse: function(input),
+
+ lexer: {
+ EOF: 1,
+ parseError: function(str, hash),
+ setInput: function(input),
+ input: function(),
+ unput: function(str),
+ more: function(),
+ less: function(n),
+ pastInput: function(),
+ upcomingInput: function(),
+ showPosition: function(),
+ test_match: function(regex_match_array, rule_index),
+ next: function(),
+ lex: function(),
+ begin: function(condition),
+ popState: function(),
+ _currentRules: function(),
+ topState: function(),
+ pushState: function(condition),
+
+ options: {
+ ranges: boolean (optional: true ==> token location info will include a .range[] member)
+ flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+ backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+ },
+
+ performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+ rules: [...],
+ conditions: {associative list: name ==> set},
+ }
+ }
+
+
+ token location info (@$, _$, etc.): {
+ first_line: n,
+ last_line: n,
+ first_column: n,
+ last_column: n,
+ range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
+ }
+
+
+ the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+ text: (matched text)
+ token: (the produced terminal token, if any)
+ line: (yylineno)
+ }
+ while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+ loc: (yylloc)
+ expected: (string describing the set of expected tokens)
+ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+ }
+*/
+var parser = (function(){
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"JSON_PATH":3,"DOLLAR":4,"PATH_COMPONENTS":5,"LEADING_CHILD_MEMBER_EXPRESSION":6,"PATH_COMPONENT":7,"MEMBER_COMPONENT":8,"SUBSCRIPT_COMPONENT":9,"CHILD_MEMBER_COMPONENT":10,"DESCENDANT_MEMBER_COMPONENT":11,"DOT":12,"MEMBER_EXPRESSION":13,"DOT_DOT":14,"STAR":15,"IDENTIFIER":16,"SCRIPT_EXPRESSION":17,"INTEGER":18,"END":19,"CHILD_SUBSCRIPT_COMPONENT":20,"DESCENDANT_SUBSCRIPT_COMPONENT":21,"[":22,"SUBSCRIPT":23,"]":24,"SUBSCRIPT_EXPRESSION":25,"SUBSCRIPT_EXPRESSION_LIST":26,"SUBSCRIPT_EXPRESSION_LISTABLE":27,",":28,"STRING_LITERAL":29,"ARRAY_SLICE":30,"FILTER_EXPRESSION":31,"QQ_STRING":32,"Q_STRING":33,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"DOLLAR",12:"DOT",14:"DOT_DOT",15:"STAR",16:"IDENTIFIER",17:"SCRIPT_EXPRESSION",18:"INTEGER",19:"END",22:"[",24:"]",28:",",30:"ARRAY_SLICE",31:"FILTER_EXPRESSION",32:"QQ_STRING",33:"Q_STRING"},
+productions_: [0,[3,1],[3,2],[3,1],[3,2],[5,1],[5,2],[7,1],[7,1],[8,1],[8,1],[10,2],[6,1],[11,2],[13,1],[13,1],[13,1],[13,1],[13,1],[9,1],[9,1],[20,3],[21,4],[23,1],[23,1],[26,1],[26,3],[27,1],[27,1],[27,1],[25,1],[25,1],[25,1],[29,1],[29,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */
+/**/) {
+/* this == yyval */
+if (!yy.ast) {
+ yy.ast = _ast;
+ _ast.initialize();
+}
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:yy.ast.set({ expression: { type: "root", value: $$[$0] } }); yy.ast.unshift(); return yy.ast.yield()
+break;
+case 2:yy.ast.set({ expression: { type: "root", value: $$[$0-1] } }); yy.ast.unshift(); return yy.ast.yield()
+break;
+case 3:yy.ast.unshift(); return yy.ast.yield()
+break;
+case 4:yy.ast.set({ operation: "member", scope: "child", expression: { type: "identifier", value: $$[$0-1] }}); yy.ast.unshift(); return yy.ast.yield()
+break;
+case 5:
+break;
+case 6:
+break;
+case 7:yy.ast.set({ operation: "member" }); yy.ast.push()
+break;
+case 8:yy.ast.set({ operation: "subscript" }); yy.ast.push()
+break;
+case 9:yy.ast.set({ scope: "child" })
+break;
+case 10:yy.ast.set({ scope: "descendant" })
+break;
+case 11:
+break;
+case 12:yy.ast.set({ scope: "child", operation: "member" })
+break;
+case 13:
+break;
+case 14:yy.ast.set({ expression: { type: "wildcard", value: $$[$0] } })
+break;
+case 15:yy.ast.set({ expression: { type: "identifier", value: $$[$0] } })
+break;
+case 16:yy.ast.set({ expression: { type: "script_expression", value: $$[$0] } })
+break;
+case 17:yy.ast.set({ expression: { type: "numeric_literal", value: parseInt($$[$0]) } })
+break;
+case 18:
+break;
+case 19:yy.ast.set({ scope: "child" })
+break;
+case 20:yy.ast.set({ scope: "descendant" })
+break;
+case 21:
+break;
+case 22:
+break;
+case 23:
+break;
+case 24:$$[$0].length > 1? yy.ast.set({ expression: { type: "union", value: $$[$0] } }) : this.$ = $$[$0]
+break;
+case 25:this.$ = [$$[$0]]
+break;
+case 26:this.$ = $$[$0-2].concat($$[$0])
+break;
+case 27:this.$ = { expression: { type: "numeric_literal", value: parseInt($$[$0]) } }; yy.ast.set(this.$)
+break;
+case 28:this.$ = { expression: { type: "string_literal", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 29:this.$ = { expression: { type: "slice", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 30:this.$ = { expression: { type: "wildcard", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 31:this.$ = { expression: { type: "script_expression", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 32:this.$ = { expression: { type: "filter_expression", value: $$[$0] } }; yy.ast.set(this.$)
+break;
+case 33:this.$ = $$[$0]
+break;
+case 34:this.$ = $$[$0]
+break;
+}
+},
+table: [{3:1,4:[1,2],6:3,13:4,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{1:[3]},{1:[2,1],5:10,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,3],5:21,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,12],12:[2,12],14:[2,12],22:[2,12]},{1:[2,14],12:[2,14],14:[2,14],22:[2,14]},{1:[2,15],12:[2,15],14:[2,15],22:[2,15]},{1:[2,16],12:[2,16],14:[2,16],22:[2,16]},{1:[2,17],12:[2,17],14:[2,17],22:[2,17]},{1:[2,18],12:[2,18],14:[2,18],22:[2,18]},{1:[2,2],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,5],12:[2,5],14:[2,5],22:[2,5]},{1:[2,7],12:[2,7],14:[2,7],22:[2,7]},{1:[2,8],12:[2,8],14:[2,8],22:[2,8]},{1:[2,9],12:[2,9],14:[2,9],22:[2,9]},{1:[2,10],12:[2,10],14:[2,10],22:[2,10]},{1:[2,19],12:[2,19],14:[2,19],22:[2,19]},{1:[2,20],12:[2,20],14:[2,20],22:[2,20]},{13:23,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{13:24,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9],22:[1,25]},{15:[1,29],17:[1,30],18:[1,33],23:26,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{1:[2,4],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,6],12:[2,6],14:[2,6],22:[2,6]},{1:[2,11],12:[2,11],14:[2,11],22:[2,11]},{1:[2,13],12:[2,13],14:[2,13],22:[2,13]},{15:[1,29],17:[1,30],18:[1,33],23:38,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{24:[1,39]},{24:[2,23]},{24:[2,24],28:[1,40]},{24:[2,30]},{24:[2,31]},{24:[2,32]},{24:[2,25],28:[2,25]},{24:[2,27],28:[2,27]},{24:[2,28],28:[2,28]},{24:[2,29],28:[2,29]},{24:[2,33],28:[2,33]},{24:[2,34],28:[2,34]},{24:[1,41]},{1:[2,21],12:[2,21],14:[2,21],22:[2,21]},{18:[1,33],27:42,29:34,30:[1,35],32:[1,36],33:[1,37]},{1:[2,22],12:[2,22],14:[2,22],22:[2,22]},{24:[2,26],28:[2,26]}],
+defaultActions: {27:[2,23],29:[2,30],30:[2,31],31:[2,32]},
+parseError: function parseError(str, hash) {
+ if (hash.recoverable) {
+ this.trace(str);
+ } else {
+ throw new Error(str);
+ }
+},
+parse: function parse(input) {
+ var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+ var args = lstack.slice.call(arguments, 1);
+ this.lexer.setInput(input);
+ this.lexer.yy = this.yy;
+ this.yy.lexer = this.lexer;
+ this.yy.parser = this;
+ if (typeof this.lexer.yylloc == 'undefined') {
+ this.lexer.yylloc = {};
+ }
+ var yyloc = this.lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = this.lexer.options && this.lexer.options.ranges;
+ if (typeof this.yy.parseError === 'function') {
+ this.parseError = this.yy.parseError;
+ } else {
+ this.parseError = Object.getPrototypeOf(this).parseError;
+ }
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+ function lex() {
+ var token;
+ token = self.lexer.lex() || EOF;
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ }
+ var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+ while (true) {
+ state = stack[stack.length - 1];
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == 'undefined') {
+ symbol = lex();
+ }
+ action = table[state] && table[state][symbol];
+ }
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+ var errStr = '';
+ expected = [];
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > TERROR) {
+ expected.push('\'' + this.terminals_[p] + '\'');
+ }
+ }
+ if (this.lexer.showPosition) {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + this.lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+ } else {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+ }
+ this.parseError(errStr, {
+ text: this.lexer.match,
+ token: this.terminals_[symbol] || symbol,
+ line: this.lexer.yylineno,
+ loc: yyloc,
+ expected: expected
+ });
+ }
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+ }
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(this.lexer.yytext);
+ lstack.push(this.lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+ if (!preErrorSymbol) {
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ yyloc = this.lexer.yylloc;
+ if (recovering > 0) {
+ recovering--;
+ }
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {
+ first_line: lstack[lstack.length - (len || 1)].first_line,
+ last_line: lstack[lstack.length - 1].last_line,
+ first_column: lstack[lstack.length - (len || 1)].first_column,
+ last_column: lstack[lstack.length - 1].last_column
+ };
+ if (ranges) {
+ yyval._$.range = [
+ lstack[lstack.length - (len || 1)].range[0],
+ lstack[lstack.length - 1].range[1]
+ ];
+ }
+ r = this.performAction.apply(yyval, [
+ yytext,
+ yyleng,
+ yylineno,
+ this.yy,
+ action[1],
+ vstack,
+ lstack
+ ].concat(args));
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+ case 3:
+ return true;
+ }
+ }
+ return true;
+}};
+var _ast = {
+
+ initialize: function() {
+ this._nodes = [];
+ this._node = {};
+ this._stash = [];
+ },
+
+ set: function(props) {
+ for (var k in props) this._node[k] = props[k];
+ return this._node;
+ },
+
+ node: function(obj) {
+ if (arguments.length) this._node = obj;
+ return this._node;
+ },
+
+ push: function() {
+ this._nodes.push(this._node);
+ this._node = {};
+ },
+
+ unshift: function() {
+ this._nodes.unshift(this._node);
+ this._node = {};
+ },
+
+ yield: function() {
+ var _nodes = this._nodes;
+ this.initialize();
+ return _nodes;
+ }
+};
+/* generated by jison-lex 0.2.1 */
+var lexer = (function(){
+var lexer = {
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+
+// resets the lexer, sets new input
+setInput:function (input) {
+ this._input = input;
+ this._more = this._backtrack = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {
+ first_line: 1,
+ first_column: 0,
+ last_line: 1,
+ last_column: 0
+ };
+ if (this.options.ranges) {
+ this.yylloc.range = [0,0];
+ }
+ this.offset = 0;
+ return this;
+ },
+
+// consumes and returns one char from the input
+input:function () {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+ if (this.options.ranges) {
+ this.yylloc.range[1]++;
+ }
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
+ //this.yyleng -= len;
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) {
+ this.yylineno -= lines.length - 1;
+ }
+ var r = this.yylloc.range;
+
+ this.yylloc = {
+ first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ?
+ (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+ + oldLines[oldLines.length - lines.length].length - lines[0].length :
+ this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+ this.yyleng = this.yytext.length;
+ return this;
+ },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+ this._more = true;
+ return this;
+ },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+ if (this.options.backtrack_lexer) {
+ this._backtrack = true;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+
+ }
+ return this;
+ },
+
+// retain first n characters of the match
+less:function (n) {
+ this.unput(this.match.slice(n));
+ },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+ },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+ var next = this.match;
+ if (next.length < 20) {
+ next += this._input.substr(0, 20-next.length);
+ }
+ return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+ var token,
+ lines,
+ backup;
+
+ if (this.options.backtrack_lexer) {
+ // save context
+ backup = {
+ yylineno: this.yylineno,
+ yylloc: {
+ first_line: this.yylloc.first_line,
+ last_line: this.last_line,
+ first_column: this.yylloc.first_column,
+ last_column: this.yylloc.last_column
+ },
+ yytext: this.yytext,
+ match: this.match,
+ matches: this.matches,
+ matched: this.matched,
+ yyleng: this.yyleng,
+ offset: this.offset,
+ _more: this._more,
+ _input: this._input,
+ yy: this.yy,
+ conditionStack: this.conditionStack.slice(0),
+ done: this.done
+ };
+ if (this.options.ranges) {
+ backup.yylloc.range = this.yylloc.range.slice(0);
+ }
+ }
+
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno += lines.length;
+ }
+ this.yylloc = {
+ first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ?
+ lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+ this.yylloc.last_column + match[0].length
+ };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+ this._more = false;
+ this._backtrack = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+ if (this.done && this._input) {
+ this.done = false;
+ }
+ if (token) {
+ return token;
+ } else if (this._backtrack) {
+ // recover context
+ for (var k in backup) {
+ this[k] = backup[k];
+ }
+ return false; // rule action called reject() implying the next rule should be tested instead.
+ }
+ return false;
+ },
+
+// return next match in input
+next:function () {
+ if (this.done) {
+ return this.EOF;
+ }
+ if (!this._input) {
+ this.done = true;
+ }
+
+ var token,
+ match,
+ tempMatch,
+ index;
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+ var rules = this._currentRules();
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+ if (this.options.backtrack_lexer) {
+ token = this.test_match(tempMatch, rules[i]);
+ if (token !== false) {
+ return token;
+ } else if (this._backtrack) {
+ match = false;
+ continue; // rule action called reject() implying a rule MISmatch.
+ } else {
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ } else if (!this.options.flex) {
+ break;
+ }
+ }
+ }
+ if (match) {
+ token = this.test_match(match, rules[index]);
+ if (token !== false) {
+ return token;
+ }
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+ },
+
+// return next match that has a token
+lex:function lex() {
+ var r = this.next();
+ if (r) {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+ var n = this.conditionStack.length - 1;
+ if (n > 0) {
+ return this.conditionStack.pop();
+ } else {
+ return this.conditionStack[0];
+ }
+ },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+ if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ } else {
+ return this.conditions["INITIAL"].rules;
+ }
+ },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+ n = this.conditionStack.length - 1 - Math.abs(n || 0);
+ if (n >= 0) {
+ return this.conditionStack[n];
+ } else {
+ return "INITIAL";
+ }
+ },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+ this.begin(condition);
+ },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+ return this.conditionStack.length;
+ },
+options: {},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START
+/**/) {
+
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 4
+break;
+case 1:return 14
+break;
+case 2:return 12
+break;
+case 3:return 15
+break;
+case 4:return 16
+break;
+case 5:return 22
+break;
+case 6:return 24
+break;
+case 7:return 28
+break;
+case 8:return 30
+break;
+case 9:return 18
+break;
+case 10:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 32;
+break;
+case 11:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 33;
+break;
+case 12:return 17
+break;
+case 13:return 31
+break;
+}
+},
+rules: [/^(?:\$)/,/^(?:\.\.)/,/^(?:\.)/,/^(?:\*)/,/^(?:[a-zA-Z_]+[a-zA-Z0-9_]*)/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?:((-?(?:0|[1-9][0-9]*)))?\:((-?(?:0|[1-9][0-9]*)))?(\:((-?(?:0|[1-9][0-9]*)))?)?)/,/^(?:(-?(?:0|[1-9][0-9]*)))/,/^(?:"(?:\\["bfnrt/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*")/,/^(?:'(?:\\['bfnrt/\\]|\\u[a-fA-F0-9]{4}|[^'\\])*')/,/^(?:\(.+?\)(?=\]))/,/^(?:\?\(.+?\)(?=\]))/],
+conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}
+};
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+ this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+ if (!args[1]) {
+ console.log('Usage: '+args[0]+' FILE');
+ process.exit(1);
+ }
+ var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+ return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+ exports.main(process.argv.slice(1));
+}
+}
+
+}).call(this,require('_process'))
+},{"_process":14,"fs":12,"path":13}],2:[function(require,module,exports){
+module.exports = {
+ identifier: "[a-zA-Z_]+[a-zA-Z0-9_]*",
+ integer: "-?(?:0|[1-9][0-9]*)",
+ qq_string: "\"(?:\\\\[\"bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\"\\\\])*\"",
+ q_string: "'(?:\\\\[\'bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\'\\\\])*'"
+};
+
+},{}],3:[function(require,module,exports){
+var dict = require('./dict');
+var fs = require('fs');
+var grammar = {
+
+ lex: {
+
+ macros: {
+ esc: "\\\\",
+ int: dict.integer
+ },
+
+ rules: [
+ ["\\$", "return 'DOLLAR'"],
+ ["\\.\\.", "return 'DOT_DOT'"],
+ ["\\.", "return 'DOT'"],
+ ["\\*", "return 'STAR'"],
+ [dict.identifier, "return 'IDENTIFIER'"],
+ ["\\[", "return '['"],
+ ["\\]", "return ']'"],
+ [",", "return ','"],
+ ["({int})?\\:({int})?(\\:({int})?)?", "return 'ARRAY_SLICE'"],
+ ["{int}", "return 'INTEGER'"],
+ [dict.qq_string, "yytext = yytext.substr(1,yyleng-2); return 'QQ_STRING';"],
+ [dict.q_string, "yytext = yytext.substr(1,yyleng-2); return 'Q_STRING';"],
+ ["\\(.+?\\)(?=\\])", "return 'SCRIPT_EXPRESSION'"],
+ ["\\?\\(.+?\\)(?=\\])", "return 'FILTER_EXPRESSION'"]
+ ]
+ },
+
+ start: "JSON_PATH",
+
+ bnf: {
+
+ JSON_PATH: [
+ [ 'DOLLAR', 'yy.ast.set({ expression: { type: "root", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],
+ [ 'DOLLAR PATH_COMPONENTS', 'yy.ast.set({ expression: { type: "root", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()' ],
+ [ 'LEADING_CHILD_MEMBER_EXPRESSION', 'yy.ast.unshift(); return yy.ast.yield()' ],
+ [ 'LEADING_CHILD_MEMBER_EXPRESSION PATH_COMPONENTS', 'yy.ast.set({ operation: "member", scope: "child", expression: { type: "identifier", value: $1 }}); yy.ast.unshift(); return yy.ast.yield()' ] ],
+
+ PATH_COMPONENTS: [
+ [ 'PATH_COMPONENT', '' ],
+ [ 'PATH_COMPONENTS PATH_COMPONENT', '' ] ],
+
+ PATH_COMPONENT: [
+ [ 'MEMBER_COMPONENT', 'yy.ast.set({ operation: "member" }); yy.ast.push()' ],
+ [ 'SUBSCRIPT_COMPONENT', 'yy.ast.set({ operation: "subscript" }); yy.ast.push() ' ] ],
+
+ MEMBER_COMPONENT: [
+ [ 'CHILD_MEMBER_COMPONENT', 'yy.ast.set({ scope: "child" })' ],
+ [ 'DESCENDANT_MEMBER_COMPONENT', 'yy.ast.set({ scope: "descendant" })' ] ],
+
+ CHILD_MEMBER_COMPONENT: [
+ [ 'DOT MEMBER_EXPRESSION', '' ] ],
+
+ LEADING_CHILD_MEMBER_EXPRESSION: [
+ [ 'MEMBER_EXPRESSION', 'yy.ast.set({ scope: "child", operation: "member" })' ] ],
+
+ DESCENDANT_MEMBER_COMPONENT: [
+ [ 'DOT_DOT MEMBER_EXPRESSION', '' ] ],
+
+ MEMBER_EXPRESSION: [
+ [ 'STAR', 'yy.ast.set({ expression: { type: "wildcard", value: $1 } })' ],
+ [ 'IDENTIFIER', 'yy.ast.set({ expression: { type: "identifier", value: $1 } })' ],
+ [ 'SCRIPT_EXPRESSION', 'yy.ast.set({ expression: { type: "script_expression", value: $1 } })' ],
+ [ 'INTEGER', 'yy.ast.set({ expression: { type: "numeric_literal", value: parseInt($1) } })' ],
+ [ 'END', '' ] ],
+
+ SUBSCRIPT_COMPONENT: [
+ [ 'CHILD_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: "child" })' ],
+ [ 'DESCENDANT_SUBSCRIPT_COMPONENT', 'yy.ast.set({ scope: "descendant" })' ] ],
+
+ CHILD_SUBSCRIPT_COMPONENT: [
+ [ '[ SUBSCRIPT ]', '' ] ],
+
+ DESCENDANT_SUBSCRIPT_COMPONENT: [
+ [ 'DOT_DOT [ SUBSCRIPT ]', '' ] ],
+
+ SUBSCRIPT: [
+ [ 'SUBSCRIPT_EXPRESSION', '' ],
+ [ 'SUBSCRIPT_EXPRESSION_LIST', '$1.length > 1? yy.ast.set({ expression: { type: "union", value: $1 } }) : $$ = $1' ] ],
+
+ SUBSCRIPT_EXPRESSION_LIST: [
+ [ 'SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = [$1]'],
+ [ 'SUBSCRIPT_EXPRESSION_LIST , SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = $1.concat($3)' ] ],
+
+ SUBSCRIPT_EXPRESSION_LISTABLE: [
+ [ 'INTEGER', '$$ = { expression: { type: "numeric_literal", value: parseInt($1) } }; yy.ast.set($$)' ],
+ [ 'STRING_LITERAL', '$$ = { expression: { type: "string_literal", value: $1 } }; yy.ast.set($$)' ],
+ [ 'ARRAY_SLICE', '$$ = { expression: { type: "slice", value: $1 } }; yy.ast.set($$)' ] ],
+
+ SUBSCRIPT_EXPRESSION: [
+ [ 'STAR', '$$ = { expression: { type: "wildcard", value: $1 } }; yy.ast.set($$)' ],
+ [ 'SCRIPT_EXPRESSION', '$$ = { expression: { type: "script_expression", value: $1 } }; yy.ast.set($$)' ],
+ [ 'FILTER_EXPRESSION', '$$ = { expression: { type: "filter_expression", value: $1 } }; yy.ast.set($$)' ] ],
+
+ STRING_LITERAL: [
+ [ 'QQ_STRING', "$$ = $1" ],
+ [ 'Q_STRING', "$$ = $1" ] ]
+ }
+};
+if (fs.readFileSync) {
+ grammar.moduleInclude = fs.readFileSync(require.resolve("../include/module.js"));
+ grammar.actionInclude = fs.readFileSync(require.resolve("../include/action.js"));
+}
+
+module.exports = grammar;
+
+},{"./dict":2,"fs":12}],4:[function(require,module,exports){
+var aesprim = require('./aesprim');
+var slice = require('./slice');
+var _evaluate = require('static-eval');
+var _uniq = require('underscore').uniq;
+
+var Handlers = function() {
+ return this.initialize.apply(this, arguments);
+}
+
+Handlers.prototype.initialize = function() {
+ this.traverse = traverser(true);
+ this.descend = traverser();
+}
+
+Handlers.prototype.keys = Object.keys;
+
+Handlers.prototype.resolve = function(component) {
+
+ var key = [ component.operation, component.scope, component.expression.type ].join('-');
+ var method = this._fns[key];
+
+ if (!method) throw new Error("couldn't resolve key: " + key);
+ return method.bind(this);
+};
+
+Handlers.prototype.register = function(key, handler) {
+
+ if (!handler instanceof Function) {
+ throw new Error("handler must be a function");
+ }
+
+ this._fns[key] = handler;
+};
+
+Handlers.prototype._fns = {
+
+ 'member-child-identifier': function(component, partial) {
+ var key = component.expression.value;
+ var value = partial.value;
+ if (value instanceof Object && key in value) {
+ return [ { value: value[key], path: partial.path.concat(key) } ]
+ }
+ },
+
+ 'member-descendant-identifier':
+ _traverse(function(key, value, ref) { return key == ref }),
+
+ 'subscript-child-numeric_literal':
+ _descend(function(key, value, ref) { return key === ref }),
+
+ 'member-child-numeric_literal':
+ _descend(function(key, value, ref) { return String(key) === String(ref) }),
+
+ 'subscript-descendant-numeric_literal':
+ _traverse(function(key, value, ref) { return key === ref }),
+
+ 'member-child-wildcard':
+ _descend(function() { return true }),
+
+ 'member-descendant-wildcard':
+ _traverse(function() { return true }),
+
+ 'subscript-descendant-wildcard':
+ _traverse(function() { return true }),
+
+ 'subscript-child-wildcard':
+ _descend(function() { return true }),
+
+ 'subscript-child-slice': function(component, partial) {
+ if (is_array(partial.value)) {
+ var args = component.expression.value.split(':').map(_parse_nullable_int);
+ var values = partial.value.map(function(v, i) { return { value: v, path: partial.path.concat(i) } });
+ return slice.apply(null, [values].concat(args));
+ }
+ },
+
+ 'subscript-child-union': function(component, partial) {
+ var results = [];
+ component.expression.value.forEach(function(component) {
+ var _component = { operation: 'subscript', scope: 'child', expression: component.expression };
+ var handler = this.resolve(_component);
+ var _results = handler(_component, partial);
+ if (_results) {
+ results = results.concat(_results);
+ }
+ }, this);
+
+ return unique(results);
+ },
+
+ 'subscript-descendant-union': function(component, partial, count) {
+
+ var jp = require('..');
+ var self = this;
+
+ var results = [];
+ var nodes = jp.nodes(partial, '$..*').slice(1);
+
+ nodes.forEach(function(node) {
+ if (results.length >= count) return;
+ component.expression.value.forEach(function(component) {
+ var _component = { operation: 'subscript', scope: 'child', expression: component.expression };
+ var handler = self.resolve(_component);
+ var _results = handler(_component, node);
+ results = results.concat(_results);
+ });
+ });
+
+ return unique(results);
+ },
+
+ 'subscript-child-filter_expression': function(component, partial, count) {
+
+ // slice out the expression from ?(expression)
+ var src = component.expression.value.slice(2, -1);
+ var ast = aesprim.parse(src).body[0].expression;
+
+ var passable = function(key, value) {
+ return evaluate(ast, { '@': value });
+ }
+
+ return this.descend(partial, null, passable, count);
+
+ },
+
+ 'subscript-descendant-filter_expression': function(component, partial, count) {
+
+ // slice out the expression from ?(expression)
+ var src = component.expression.value.slice(2, -1);
+ var ast = aesprim.parse(src).body[0].expression;
+
+ var passable = function(key, value) {
+ return evaluate(ast, { '@': value });
+ }
+
+ return this.traverse(partial, null, passable, count);
+ },
+
+ 'subscript-child-script_expression': function(component, partial) {
+ var exp = component.expression.value.slice(1, -1);
+ return eval_recurse(partial, exp, '$[{{value}}]');
+ },
+
+ 'member-child-script_expression': function(component, partial) {
+ var exp = component.expression.value.slice(1, -1);
+ return eval_recurse(partial, exp, '$.{{value}}');
+ },
+
+ 'member-descendant-script_expression': function(component, partial) {
+ var exp = component.expression.value.slice(1, -1);
+ return eval_recurse(partial, exp, '$..value');
+ }
+};
+
+Handlers.prototype._fns['subscript-child-string_literal'] =
+ Handlers.prototype._fns['member-child-identifier'];
+
+Handlers.prototype._fns['member-descendant-numeric_literal'] =
+ Handlers.prototype._fns['subscript-descendant-string_literal'] =
+ Handlers.prototype._fns['member-descendant-identifier'];
+
+function eval_recurse(partial, src, template) {
+
+ var jp = require('./index');
+ var ast = aesprim.parse(src).body[0].expression;
+ var value = evaluate(ast, { '@': partial.value });
+ var path = template.replace(/\{\{\s*value\s*\}\}/g, value);
+
+ var results = jp.nodes(partial.value, path);
+ results.forEach(function(r) {
+ r.path = partial.path.concat(r.path.slice(1));
+ });
+
+ return results;
+}
+
+function is_array(val) {
+ return Array.isArray(val);
+}
+
+function is_object(val) {
+ // is this a non-array, non-null object?
+ return val && !(val instanceof Array) && val instanceof Object;
+}
+
+function traverser(recurse) {
+
+ return function(partial, ref, passable, count) {
+
+ var value = partial.value;
+ var path = partial.path;
+
+ var results = [];
+
+ var descend = function(value, path) {
+
+ if (is_array(value)) {
+ value.forEach(function(element, index) {
+ if (results.length >= count) { return }
+ if (passable(index, element, ref)) {
+ results.push({ path: path.concat(index), value: element });
+ }
+ });
+ value.forEach(function(element, index) {
+ if (results.length >= count) { return }
+ if (recurse) {
+ descend(element, path.concat(index));
+ }
+ });
+ } else if (is_object(value)) {
+ this.keys(value).forEach(function(k) {
+ if (results.length >= count) { return }
+ if (passable(k, value[k], ref)) {
+ results.push({ path: path.concat(k), value: value[k] });
+ }
+ })
+ this.keys(value).forEach(function(k) {
+ if (results.length >= count) { return }
+ if (recurse) {
+ descend(value[k], path.concat(k));
+ }
+ });
+ }
+ }.bind(this);
+ descend(value, path);
+ return results;
+ }
+}
+
+function _descend(passable) {
+ return function(component, partial, count) {
+ return this.descend(partial, component.expression.value, passable, count);
+ }
+}
+
+function _traverse(passable) {
+ return function(component, partial, count) {
+ return this.traverse(partial, component.expression.value, passable, count);
+ }
+}
+
+function evaluate() {
+ try { return _evaluate.apply(this, arguments) }
+ catch (e) { }
+}
+
+function unique(results) {
+ results = results.filter(function(d) { return d })
+ return _uniq(
+ results,
+ function(r) { return r.path.map(function(c) { return String(c).replace('-', '--') }).join('-') }
+ );
+}
+
+function _parse_nullable_int(val) {
+ var sval = String(val);
+ return sval.match(/^-?[0-9]+$/) ? parseInt(sval) : null;
+}
+
+module.exports = Handlers;
+
+},{"..":"jsonpath","./aesprim":"./aesprim","./index":5,"./slice":7,"static-eval":15,"underscore":12}],5:[function(require,module,exports){
+var assert = require('assert');
+var dict = require('./dict');
+var Parser = require('./parser');
+var Handlers = require('./handlers');
+
+var JSONPath = function() {
+ this.initialize.apply(this, arguments);
+};
+
+JSONPath.prototype.initialize = function() {
+ this.parser = new Parser();
+ this.handlers = new Handlers();
+};
+
+JSONPath.prototype.parse = function(string) {
+ assert.ok(_is_string(string), "we need a path");
+ return this.parser.parse(string);
+};
+
+JSONPath.prototype.parent = function(obj, string) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ var node = this.nodes(obj, string)[0];
+ var key = node.path.pop(); /* jshint unused:false */
+ return this.value(obj, node.path);
+}
+
+JSONPath.prototype.apply = function(obj, string, fn) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+ assert.equal(typeof fn, "function", "fn needs to be function")
+
+ var nodes = this.nodes(obj, string).sort(function(a, b) {
+ // sort nodes so we apply from the bottom up
+ return b.path.length - a.path.length;
+ });
+
+ nodes.forEach(function(node) {
+ var key = node.path.pop();
+ var parent = this.value(obj, this.stringify(node.path));
+ var val = node.value = fn.call(obj, parent[key]);
+ parent[key] = val;
+ }, this);
+
+ return nodes;
+}
+
+JSONPath.prototype.value = function(obj, path, value) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(path, "we need a path");
+
+ if (arguments.length >= 3) {
+ var node = this.nodes(obj, path).shift();
+ if (!node) return this._vivify(obj, path, value);
+ var key = node.path.slice(-1).shift();
+ var parent = this.parent(obj, this.stringify(node.path));
+ parent[key] = value;
+ }
+ return this.query(obj, this.stringify(path), 1).shift();
+}
+
+JSONPath.prototype._vivify = function(obj, string, value) {
+
+ var self = this;
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ var path = this.parser.parse(string)
+ .map(function(component) { return component.expression.value });
+
+ var setValue = function(path, value) {
+ var key = path.pop();
+ var node = self.value(obj, path);
+ if (!node) {
+ setValue(path.concat(), typeof key === 'string' ? {} : []);
+ node = self.value(obj, path);
+ }
+ node[key] = value;
+ }
+ setValue(path, value);
+ return this.query(obj, string)[0];
+}
+
+JSONPath.prototype.query = function(obj, string, count) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(_is_string(string), "we need a path");
+
+ var results = this.nodes(obj, string, count)
+ .map(function(r) { return r.value });
+
+ return results;
+};
+
+JSONPath.prototype.paths = function(obj, string, count) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ var results = this.nodes(obj, string, count)
+ .map(function(r) { return r.path });
+
+ return results;
+};
+
+JSONPath.prototype.nodes = function(obj, string, count) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ if (count === 0) return [];
+
+ var path = this.parser.parse(string);
+ var handlers = this.handlers;
+
+ var partials = [ { path: ['$'], value: obj } ];
+ var matches = [];
+
+ if (path.length && path[0].expression.type == 'root') path.shift();
+
+ if (!path.length) return partials;
+
+ path.forEach(function(component, index) {
+
+ if (matches.length >= count) return;
+ var handler = handlers.resolve(component);
+ var _partials = [];
+
+ partials.forEach(function(p) {
+
+ if (matches.length >= count) return;
+ var results = handler(component, p, count);
+
+ if (index == path.length - 1) {
+ // if we're through the components we're done
+ matches = matches.concat(results || []);
+ } else {
+ // otherwise accumulate and carry on through
+ _partials = _partials.concat(results || []);
+ }
+ });
+
+ partials = _partials;
+
+ });
+
+ return count ? matches.slice(0, count) : matches;
+};
+
+JSONPath.prototype.stringify = function(path) {
+
+ assert.ok(path, "we need a path");
+
+ var string = '$';
+
+ var templates = {
+ 'descendant-member': '..{{value}}',
+ 'child-member': '.{{value}}',
+ 'descendant-subscript': '..[{{value}}]',
+ 'child-subscript': '[{{value}}]'
+ };
+
+ path = this._normalize(path);
+
+ path.forEach(function(component) {
+
+ if (component.expression.type == 'root') return;
+
+ var key = [component.scope, component.operation].join('-');
+ var template = templates[key];
+ var value;
+
+ if (component.expression.type == 'string_literal') {
+ value = JSON.stringify(component.expression.value)
+ } else {
+ value = component.expression.value;
+ }
+
+ if (!template) throw new Error("couldn't find template " + key);
+
+ string += template.replace(/{{value}}/, value);
+ });
+
+ return string;
+}
+
+JSONPath.prototype._normalize = function(path) {
+
+ assert.ok(path, "we need a path");
+
+ if (typeof path == "string") {
+
+ return this.parser.parse(path);
+
+ } else if (Array.isArray(path) && typeof path[0] == "string") {
+
+ var _path = [ { expression: { type: "root", value: "$" } } ];
+
+ path.forEach(function(component, index) {
+
+ if (component == '$' && index === 0) return;
+
+ if (typeof component == "string" && component.match("^" + dict.identifier + "$")) {
+
+ _path.push({
+ operation: 'member',
+ scope: 'child',
+ expression: { value: component, type: 'identifier' }
+ });
+
+ } else {
+
+ var type = typeof component == "number" ?
+ 'numeric_literal' : 'string_literal';
+
+ _path.push({
+ operation: 'subscript',
+ scope: 'child',
+ expression: { value: component, type: type }
+ });
+ }
+ });
+
+ return _path;
+
+ } else if (Array.isArray(path) && typeof path[0] == "object") {
+
+ return path
+ }
+
+ throw new Error("couldn't understand path " + path);
+}
+
+function _is_string(obj) {
+ return Object.prototype.toString.call(obj) == '[object String]';
+}
+
+JSONPath.Handlers = Handlers;
+JSONPath.Parser = Parser;
+
+var instance = new JSONPath;
+instance.JSONPath = JSONPath;
+
+module.exports = instance;
+
+},{"./dict":2,"./handlers":4,"./parser":6,"assert":8}],6:[function(require,module,exports){
+var grammar = require('./grammar');
+var gparser = require('../generated/parser');
+
+var Parser = function() {
+
+ var parser = new gparser.Parser();
+
+ var _parseError = parser.parseError;
+ parser.yy.parseError = function() {
+ if (parser.yy.ast) {
+ parser.yy.ast.initialize();
+ }
+ _parseError.apply(parser, arguments);
+ }
+
+ return parser;
+
+};
+
+Parser.grammar = grammar;
+module.exports = Parser;
+
+},{"../generated/parser":1,"./grammar":3}],7:[function(require,module,exports){
+module.exports = function(arr, start, end, step) {
+
+ if (typeof start == 'string') throw new Error("start cannot be a string");
+ if (typeof end == 'string') throw new Error("end cannot be a string");
+ if (typeof step == 'string') throw new Error("step cannot be a string");
+
+ var len = arr.length;
+
+ if (step === 0) throw new Error("step cannot be zero");
+ step = step ? integer(step) : 1;
+
+ // normalize negative values
+ start = start < 0 ? len + start : start;
+ end = end < 0 ? len + end : end;
+
+ // default extents to extents
+ start = integer(start === 0 ? 0 : !start ? (step > 0 ? 0 : len - 1) : start);
+ end = integer(end === 0 ? 0 : !end ? (step > 0 ? len : -1) : end);
+
+ // clamp extents
+ start = step > 0 ? Math.max(0, start) : Math.min(len, start);
+ end = step > 0 ? Math.min(end, len) : Math.max(-1, end);
+
+ // return empty if extents are backwards
+ if (step > 0 && end <= start) return [];
+ if (step < 0 && start <= end) return [];
+
+ var result = [];
+
+ for (var i = start; i != end; i += step) {
+ if ((step < 0 && i <= end) || (step > 0 && i >= end)) break;
+ result.push(arr[i]);
+ }
+
+ return result;
+}
+
+function integer(val) {
+ return String(val).match(/^[0-9]+$/) ? parseInt(val) :
+ Number.isFinite(val) ? parseInt(val, 10) : 0;
+}
+
+},{}],8:[function(require,module,exports){
+// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
+//
+// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
+//
+// Originally from narwhal.js (http://narwhaljs.org)
+// Copyright (c) 2009 Thomas Robinson <280north.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the 'Software'), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// when used in node, this will actually load the util module we depend on
+// versus loading the builtin util module as happens otherwise
+// this is a bug in node module loading as far as I am concerned
+var util = require('util/');
+
+var pSlice = Array.prototype.slice;
+var hasOwn = Object.prototype.hasOwnProperty;
+
+// 1. The assert module provides functions that throw
+// AssertionError's when particular conditions are not met. The
+// assert module must conform to the following interface.
+
+var assert = module.exports = ok;
+
+// 2. The AssertionError is defined in assert.
+// new assert.AssertionError({ message: message,
+// actual: actual,
+// expected: expected })
+
+assert.AssertionError = function AssertionError(options) {
+ this.name = 'AssertionError';
+ this.actual = options.actual;
+ this.expected = options.expected;
+ this.operator = options.operator;
+ if (options.message) {
+ this.message = options.message;
+ this.generatedMessage = false;
+ } else {
+ this.message = getMessage(this);
+ this.generatedMessage = true;
+ }
+ var stackStartFunction = options.stackStartFunction || fail;
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, stackStartFunction);
+ }
+ else {
+ // non v8 browsers so we can have a stacktrace
+ var err = new Error();
+ if (err.stack) {
+ var out = err.stack;
+
+ // try to strip useless frames
+ var fn_name = stackStartFunction.name;
+ var idx = out.indexOf('\n' + fn_name);
+ if (idx >= 0) {
+ // once we have located the function frame
+ // we need to strip out everything before it (and its line)
+ var next_line = out.indexOf('\n', idx + 1);
+ out = out.substring(next_line + 1);
+ }
+
+ this.stack = out;
+ }
+ }
+};
+
+// assert.AssertionError instanceof Error
+util.inherits(assert.AssertionError, Error);
+
+function replacer(key, value) {
+ if (util.isUndefined(value)) {
+ return '' + value;
+ }
+ if (util.isNumber(value) && !isFinite(value)) {
+ return value.toString();
+ }
+ if (util.isFunction(value) || util.isRegExp(value)) {
+ return value.toString();
+ }
+ return value;
+}
+
+function truncate(s, n) {
+ if (util.isString(s)) {
+ return s.length < n ? s : s.slice(0, n);
+ } else {
+ return s;
+ }
+}
+
+function getMessage(self) {
+ return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
+ self.operator + ' ' +
+ truncate(JSON.stringify(self.expected, replacer), 128);
+}
+
+// At present only the three keys mentioned above are used and
+// understood by the spec. Implementations or sub modules can pass
+// other keys to the AssertionError's constructor - they will be
+// ignored.
+
+// 3. All of the following functions must throw an AssertionError
+// when a corresponding condition is not met, with a message that
+// may be undefined if not provided. All assertion methods provide
+// both the actual and expected values to the assertion error for
+// display purposes.
+
+function fail(actual, expected, message, operator, stackStartFunction) {
+ throw new assert.AssertionError({
+ message: message,
+ actual: actual,
+ expected: expected,
+ operator: operator,
+ stackStartFunction: stackStartFunction
+ });
+}
+
+// EXTENSION! allows for well behaved errors defined elsewhere.
+assert.fail = fail;
+
+// 4. Pure assertion tests whether a value is truthy, as determined
+// by !!guard.
+// assert.ok(guard, message_opt);
+// This statement is equivalent to assert.equal(true, !!guard,
+// message_opt);. To test strictly for the value true, use
+// assert.strictEqual(true, guard, message_opt);.
+
+function ok(value, message) {
+ if (!value) fail(value, true, message, '==', assert.ok);
+}
+assert.ok = ok;
+
+// 5. The equality assertion tests shallow, coercive equality with
+// ==.
+// assert.equal(actual, expected, message_opt);
+
+assert.equal = function equal(actual, expected, message) {
+ if (actual != expected) fail(actual, expected, message, '==', assert.equal);
+};
+
+// 6. The non-equality assertion tests for whether two objects are not equal
+// with != assert.notEqual(actual, expected, message_opt);
+
+assert.notEqual = function notEqual(actual, expected, message) {
+ if (actual == expected) {
+ fail(actual, expected, message, '!=', assert.notEqual);
+ }
+};
+
+// 7. The equivalence assertion tests a deep equality relation.
+// assert.deepEqual(actual, expected, message_opt);
+
+assert.deepEqual = function deepEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected)) {
+ fail(actual, expected, message, 'deepEqual', assert.deepEqual);
+ }
+};
+
+function _deepEqual(actual, expected) {
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
+ if (actual.length != expected.length) return false;
+
+ for (var i = 0; i < actual.length; i++) {
+ if (actual[i] !== expected[i]) return false;
+ }
+
+ return true;
+
+ // 7.2. If the expected value is a Date object, the actual value is
+ // equivalent if it is also a Date object that refers to the same time.
+ } else if (util.isDate(actual) && util.isDate(expected)) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3 If the expected value is a RegExp object, the actual value is
+ // equivalent if it is also a RegExp object with the same source and
+ // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
+ } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
+ return actual.source === expected.source &&
+ actual.global === expected.global &&
+ actual.multiline === expected.multiline &&
+ actual.lastIndex === expected.lastIndex &&
+ actual.ignoreCase === expected.ignoreCase;
+
+ // 7.4. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!util.isObject(actual) && !util.isObject(expected)) {
+ return actual == expected;
+
+ // 7.5 For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected);
+ }
+}
+
+function isArguments(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function objEquiv(a, b) {
+ if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
+ return false;
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ // if one is a primitive, the other must be same
+ if (util.isPrimitive(a) || util.isPrimitive(b)) {
+ return a === b;
+ }
+ var aIsArgs = isArguments(a),
+ bIsArgs = isArguments(b);
+ if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
+ return false;
+ if (aIsArgs) {
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return _deepEqual(a, b);
+ }
+ var ka = objectKeys(a),
+ kb = objectKeys(b),
+ key, i;
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!_deepEqual(a[key], b[key])) return false;
+ }
+ return true;
+}
+
+// 8. The non-equivalence assertion tests for any deep inequality.
+// assert.notDeepEqual(actual, expected, message_opt);
+
+assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected)) {
+ fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
+ }
+};
+
+// 9. The strict equality assertion tests strict equality, as determined by ===.
+// assert.strictEqual(actual, expected, message_opt);
+
+assert.strictEqual = function strictEqual(actual, expected, message) {
+ if (actual !== expected) {
+ fail(actual, expected, message, '===', assert.strictEqual);
+ }
+};
+
+// 10. The strict non-equality assertion tests for strict inequality, as
+// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
+
+assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
+ if (actual === expected) {
+ fail(actual, expected, message, '!==', assert.notStrictEqual);
+ }
+};
+
+function expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (Object.prototype.toString.call(expected) == '[object RegExp]') {
+ return expected.test(actual);
+ } else if (actual instanceof expected) {
+ return true;
+ } else if (expected.call({}, actual) === true) {
+ return true;
+ }
+
+ return false;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (util.isString(expected)) {
+ message = expected;
+ expected = null;
+ }
+
+ try {
+ block();
+ } catch (e) {
+ actual = e;
+ }
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail(actual, expected, 'Missing expected exception' + message);
+ }
+
+ if (!shouldThrow && expectedException(actual, expected)) {
+ fail(actual, expected, 'Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 11. Expected to throw an error:
+// assert.throws(block, Error_opt, message_opt);
+
+assert.throws = function(block, /*optional*/error, /*optional*/message) {
+ _throws.apply(this, [true].concat(pSlice.call(arguments)));
+};
+
+// EXTENSION! This is annoying to write outside this module.
+assert.doesNotThrow = function(block, /*optional*/message) {
+ _throws.apply(this, [false].concat(pSlice.call(arguments)));
+};
+
+assert.ifError = function(err) { if (err) {throw err;}};
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ if (hasOwn.call(obj, key)) keys.push(key);
+ }
+ return keys;
+};
+
+},{"util/":11}],9:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+},{}],10:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+},{}],11:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":10,"_process":14,"inherits":9}],12:[function(require,module,exports){
+
+},{}],13:[function(require,module,exports){
+(function (process){
+// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
+// backported and transplited with Babel, with backwards-compat fixes
+
+// 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.
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+ if (last === '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+ var resolvedPath = '',
+ resolvedAbsolute = false;
+
+ for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0) ? arguments[i] : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string') {
+ throw new TypeError('Arguments to path.resolve must be strings');
+ } else if (!path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+ }
+
+ // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+
+ // Normalize the path
+ resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+ var isAbsolute = exports.isAbsolute(path),
+ trailingSlash = substr(path, -1) === '/';
+
+ // Normalize the path
+ path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+// posix version
+exports.isAbsolute = function(path) {
+ return path.charAt(0) === '/';
+};
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ if (typeof p !== 'string') {
+ throw new TypeError('Arguments to path.join must be strings');
+ }
+ return p;
+ }).join('/'));
+};
+
+
+// path.relative(from, to)
+// posix version
+exports.relative = function(from, to) {
+ from = exports.resolve(from).substr(1);
+ to = exports.resolve(to).substr(1);
+
+ function trim(arr) {
+ var start = 0;
+ for (; start < arr.length; start++) {
+ if (arr[start] !== '') break;
+ }
+
+ var end = arr.length - 1;
+ for (; end >= 0; end--) {
+ if (arr[end] !== '') break;
+ }
+
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+
+ var fromParts = trim(from.split('/'));
+ var toParts = trim(to.split('/'));
+
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+
+ var outputParts = [];
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push('..');
+ }
+
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+ return outputParts.join('/');
+};
+
+exports.sep = '/';
+exports.delimiter = ':';
+
+exports.dirname = function (path) {
+ if (typeof path !== 'string') path = path + '';
+ if (path.length === 0) return '.';
+ var code = path.charCodeAt(0);
+ var hasRoot = code === 47 /*/*/;
+ var end = -1;
+ var matchedSlash = true;
+ for (var i = path.length - 1; i >= 1; --i) {
+ code = path.charCodeAt(i);
+ if (code === 47 /*/*/) {
+ if (!matchedSlash) {
+ end = i;
+ break;
+ }
+ } else {
+ // We saw the first non-path separator
+ matchedSlash = false;
+ }
+ }
+
+ if (end === -1) return hasRoot ? '/' : '.';
+ if (hasRoot && end === 1) {
+ // return '//';
+ // Backwards-compat fix:
+ return '/';
+ }
+ return path.slice(0, end);
+};
+
+function basename(path) {
+ if (typeof path !== 'string') path = path + '';
+
+ var start = 0;
+ var end = -1;
+ var matchedSlash = true;
+ var i;
+
+ for (i = path.length - 1; i >= 0; --i) {
+ if (path.charCodeAt(i) === 47 /*/*/) {
+ // If we reached a path separator that was not part of a set of path
+ // separators at the end of the string, stop now
+ if (!matchedSlash) {
+ start = i + 1;
+ break;
+ }
+ } else if (end === -1) {
+ // We saw the first non-path separator, mark this as the end of our
+ // path component
+ matchedSlash = false;
+ end = i + 1;
+ }
+ }
+
+ if (end === -1) return '';
+ return path.slice(start, end);
+}
+
+// Uses a mixed approach for backwards-compatibility, as ext behavior changed
+// in new Node.js versions, so only basename() above is backported here
+exports.basename = function (path, ext) {
+ var f = basename(path);
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+exports.extname = function (path) {
+ if (typeof path !== 'string') path = path + '';
+ var startDot = -1;
+ var startPart = 0;
+ var end = -1;
+ var matchedSlash = true;
+ // Track the state of characters (if any) we see before our first dot and
+ // after any path separator we find
+ var preDotState = 0;
+ for (var i = path.length - 1; i >= 0; --i) {
+ var code = path.charCodeAt(i);
+ if (code === 47 /*/*/) {
+ // If we reached a path separator that was not part of a set of path
+ // separators at the end of the string, stop now
+ if (!matchedSlash) {
+ startPart = i + 1;
+ break;
+ }
+ continue;
+ }
+ if (end === -1) {
+ // We saw the first non-path separator, mark this as the end of our
+ // extension
+ matchedSlash = false;
+ end = i + 1;
+ }
+ if (code === 46 /*.*/) {
+ // If this is our first dot, mark it as the start of our extension
+ if (startDot === -1)
+ startDot = i;
+ else if (preDotState !== 1)
+ preDotState = 1;
+ } else if (startDot !== -1) {
+ // We saw a non-dot and non-path separator before our dot, so we should
+ // have a good chance at having a non-empty extension
+ preDotState = -1;
+ }
+ }
+
+ if (startDot === -1 || end === -1 ||
+ // We saw a non-dot character immediately before the dot
+ preDotState === 0 ||
+ // The (right-most) trimmed path component is exactly '..'
+ preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
+ return '';
+ }
+ return path.slice(startDot, end);
+};
+
+function filter (xs, f) {
+ if (xs.filter) return xs.filter(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (f(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// String.prototype.substr - negative index don't work in IE8
+var substr = 'ab'.substr(-1) === 'b'
+ ? function (str, start, len) { return str.substr(start, len) }
+ : function (str, start, len) {
+ if (start < 0) start = str.length + start;
+ return str.substr(start, len);
+ }
+;
+
+}).call(this,require('_process'))
+},{"_process":14}],14:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],15:[function(require,module,exports){
+var unparse = require('escodegen').generate;
+
+module.exports = function (ast, vars) {
+ if (!vars) vars = {};
+ var FAIL = {};
+
+ var result = (function walk (node, scopeVars) {
+ if (node.type === 'Literal') {
+ return node.value;
+ }
+ else if (node.type === 'UnaryExpression'){
+ var val = walk(node.argument)
+ if (node.operator === '+') return +val
+ if (node.operator === '-') return -val
+ if (node.operator === '~') return ~val
+ if (node.operator === '!') return !val
+ return FAIL
+ }
+ else if (node.type === 'ArrayExpression') {
+ var xs = [];
+ for (var i = 0, l = node.elements.length; i < l; i++) {
+ var x = walk(node.elements[i]);
+ if (x === FAIL) return FAIL;
+ xs.push(x);
+ }
+ return xs;
+ }
+ else if (node.type === 'ObjectExpression') {
+ var obj = {};
+ for (var i = 0; i < node.properties.length; i++) {
+ var prop = node.properties[i];
+ var value = prop.value === null
+ ? prop.value
+ : walk(prop.value)
+ ;
+ if (value === FAIL) return FAIL;
+ obj[prop.key.value || prop.key.name] = value;
+ }
+ return obj;
+ }
+ else if (node.type === 'BinaryExpression' ||
+ node.type === 'LogicalExpression') {
+ var l = walk(node.left);
+ if (l === FAIL) return FAIL;
+ var r = walk(node.right);
+ if (r === FAIL) return FAIL;
+
+ var op = node.operator;
+ if (op === '==') return l == r;
+ if (op === '===') return l === r;
+ if (op === '!=') return l != r;
+ if (op === '!==') return l !== r;
+ if (op === '+') return l + r;
+ if (op === '-') return l - r;
+ if (op === '*') return l * r;
+ if (op === '/') return l / r;
+ if (op === '%') return l % r;
+ if (op === '<') return l < r;
+ if (op === '<=') return l <= r;
+ if (op === '>') return l > r;
+ if (op === '>=') return l >= r;
+ if (op === '|') return l | r;
+ if (op === '&') return l & r;
+ if (op === '^') return l ^ r;
+ if (op === '&&') return l && r;
+ if (op === '||') return l || r;
+
+ return FAIL;
+ }
+ else if (node.type === 'Identifier') {
+ if ({}.hasOwnProperty.call(vars, node.name)) {
+ return vars[node.name];
+ }
+ else return FAIL;
+ }
+ else if (node.type === 'ThisExpression') {
+ if ({}.hasOwnProperty.call(vars, 'this')) {
+ return vars['this'];
+ }
+ else return FAIL;
+ }
+ else if (node.type === 'CallExpression') {
+ var callee = walk(node.callee);
+ if (callee === FAIL) return FAIL;
+ if (typeof callee !== 'function') return FAIL;
+
+ var ctx = node.callee.object ? walk(node.callee.object) : FAIL;
+ if (ctx === FAIL) ctx = null;
+
+ var args = [];
+ for (var i = 0, l = node.arguments.length; i < l; i++) {
+ var x = walk(node.arguments[i]);
+ if (x === FAIL) return FAIL;
+ args.push(x);
+ }
+ return callee.apply(ctx, args);
+ }
+ else if (node.type === 'MemberExpression') {
+ var obj = walk(node.object);
+ // do not allow access to methods on Function
+ if((obj === FAIL) || (typeof obj == 'function')){
+ return FAIL;
+ }
+ if (node.property.type === 'Identifier') {
+ return obj[node.property.name];
+ }
+ var prop = walk(node.property);
+ if (prop === FAIL) return FAIL;
+ return obj[prop];
+ }
+ else if (node.type === 'ConditionalExpression') {
+ var val = walk(node.test)
+ if (val === FAIL) return FAIL;
+ return val ? walk(node.consequent) : walk(node.alternate)
+ }
+ else if (node.type === 'ExpressionStatement') {
+ var val = walk(node.expression)
+ if (val === FAIL) return FAIL;
+ return val;
+ }
+ else if (node.type === 'ReturnStatement') {
+ return walk(node.argument)
+ }
+ else if (node.type === 'FunctionExpression') {
+
+ var bodies = node.body.body;
+
+ // Create a "scope" for our arguments
+ var oldVars = {};
+ Object.keys(vars).forEach(function(element){
+ oldVars[element] = vars[element];
+ })
+
+ for(var i=0; i=48&&a<=57}function d(a){return"0123456789abcdefABCDEF".indexOf(a)>=0}function e(a){return"01234567".indexOf(a)>=0}function f(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279].indexOf(a)>=0}function g(a){return 10===a||13===a||8232===a||8233===a}function h(a){return 64==a||36===a||95===a||a>=65&&a<=90||a>=97&&a<=122||92===a||a>=128&&eb.NonAsciiIdentifierStart.test(String.fromCharCode(a))}function i(a){return 36===a||95===a||a>=65&&a<=90||a>=97&&a<=122||a>=48&&a<=57||92===a||a>=128&&eb.NonAsciiIdentifierPart.test(String.fromCharCode(a))}function j(a){switch(a){case"class":case"enum":case"export":case"extends":case"import":case"super":return!0;default:return!1}}function k(a){switch(a){case"implements":case"interface":case"package":case"private":case"protected":case"public":case"static":case"yield":case"let":return!0;default:return!1}}function l(a){return"eval"===a||"arguments"===a}function m(a){if(hb&&k(a))return!0;switch(a.length){case 2:return"if"===a||"in"===a||"do"===a;case 3:return"var"===a||"for"===a||"new"===a||"try"===a||"let"===a;case 4:return"this"===a||"else"===a||"case"===a||"void"===a||"with"===a||"enum"===a;case 5:return"while"===a||"break"===a||"catch"===a||"throw"===a||"const"===a||"yield"===a||"class"===a||"super"===a;case 6:return"return"===a||"typeof"===a||"delete"===a||"switch"===a||"export"===a||"import"===a;case 7:return"default"===a||"finally"===a||"extends"===a;case 8:return"function"===a||"continue"===a||"debugger"===a;case 10:return"instanceof"===a;default:return!1}}function n(a,c,d,e,f){var g;b("number"==typeof d,"Comment must have valid position"),ob.lastCommentStart>=d||(ob.lastCommentStart=d,g={type:a,value:c},pb.range&&(g.range=[d,e]),pb.loc&&(g.loc=f),pb.comments.push(g),pb.attachComment&&(pb.leadingComments.push(g),pb.trailingComments.push(g)))}function o(a){var b,c,d,e;for(b=ib-a,c={start:{line:jb,column:ib-kb-a}};ib=lb&&O({},db.UnexpectedToken,"ILLEGAL");else if(42===c){if(47===gb.charCodeAt(ib+1))return++ib,++ib,void(pb.comments&&(d=gb.slice(a+2,ib-2),b.end={line:jb,column:ib-kb},n("Block",d,a,ib,b)));++ib}else++ib;O({},db.UnexpectedToken,"ILLEGAL")}function q(){var a,b;for(b=0===ib;ib>>="===(d=gb.substr(ib,4))?(ib+=4,{type:$a.Punctuator,value:d,lineNumber:jb,lineStart:kb,start:e,end:ib}):">>>"===(c=d.substr(0,3))||"<<="===c||">>="===c?(ib+=3,{type:$a.Punctuator,value:c,lineNumber:jb,lineStart:kb,start:e,end:ib}):(b=c.substr(0,2),g===b[1]&&"+-<>&|".indexOf(g)>=0||"=>"===b?(ib+=2,{type:$a.Punctuator,value:b,lineNumber:jb,lineStart:kb,start:e,end:ib}):"<>=!+-*%&|^/".indexOf(g)>=0?(++ib,{type:$a.Punctuator,value:g,lineNumber:jb,lineStart:kb,start:e,end:ib}):void O({},db.UnexpectedToken,"ILLEGAL"))}function w(a){for(var b="";ib=0&&ib0&&(d=pb.tokens[pb.tokens.length-1],d.range[0]===a&&"Punctuator"===d.type&&("/"!==d.value&&"/="!==d.value||pb.tokens.pop())),pb.tokens.push({type:"RegularExpression",value:c.literal,range:[a,ib],loc:b})),c}function F(a){return a.type===$a.Identifier||a.type===$a.Keyword||a.type===$a.BooleanLiteral||a.type===$a.NullLiteral}function G(){var a,b;if(!(a=pb.tokens[pb.tokens.length-1]))return E();if("Punctuator"===a.type){if("]"===a.value)return v();if(")"===a.value)return b=pb.tokens[pb.openParenToken-1],!b||"Keyword"!==b.type||"if"!==b.value&&"while"!==b.value&&"for"!==b.value&&"with"!==b.value?v():E();if("}"===a.value){if(pb.tokens[pb.openCurlyToken-3]&&"Keyword"===pb.tokens[pb.openCurlyToken-3].type){if(!(b=pb.tokens[pb.openCurlyToken-4]))return v()}else{if(!pb.tokens[pb.openCurlyToken-4]||"Keyword"!==pb.tokens[pb.openCurlyToken-4].type)return v();if(!(b=pb.tokens[pb.openCurlyToken-5]))return E()}return ab.indexOf(b.value)>=0?v():E()}return E()}return"Keyword"===a.type?E():v()}function H(){var a;return q(),ib>=lb?{type:$a.EOF,lineNumber:jb,lineStart:kb,start:ib,end:ib}:(a=gb.charCodeAt(ib),h(a)?u():40===a||41===a||59===a?v():39===a||34===a?z():46===a?c(gb.charCodeAt(ib+1))?y():v():c(a)?y():pb.tokenize&&47===a?G():v())}function I(){var a,b,c;return q(),a={start:{line:jb,column:ib-kb}},b=H(),a.end={line:jb,column:ib-kb},b.type!==$a.EOF&&(c=gb.slice(b.start,b.end),pb.tokens.push({type:_a[b.type],value:c,range:[b.start,b.end],loc:a})),b}function J(){var a;return a=nb,ib=a.end,jb=a.lineNumber,kb=a.lineStart,nb=void 0!==pb.tokens?I():H(),ib=a.end,jb=a.lineNumber,kb=a.lineStart,a}function K(){var a,b,c;a=ib,b=jb,c=kb,nb=void 0!==pb.tokens?I():H(),ib=a,jb=b,kb=c}function L(a,b){this.line=a,this.column=b}function M(a,b,c,d){this.start=new L(a,b),this.end=new L(c,d)}function N(){var a,b,c,d;return a=ib,b=jb,c=kb,q(),d=jb!==b,ib=a,jb=b,kb=c,d}function O(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c>="===a||">>>="===a||"&="===a||"^="===a||"|="===a)}function W(){var a;if(59===gb.charCodeAt(ib)||T(";"))return void J();a=jb,q(),jb===a&&(nb.type===$a.EOF||T("}")||Q(nb))}function X(a){return a.type===bb.Identifier||a.type===bb.MemberExpression}function Y(){var a,b=[];for(a=nb,R("[");!T("]");)T(",")?(J(),b.push(null)):(b.push(pa()),T("]")||R(","));return J(),mb.markEnd(mb.createArrayExpression(b),a)}function Z(a,b){var c,d,e;return c=hb,e=nb,d=Qa(),b&&hb&&l(a[0].name)&&P(b,db.StrictParamName),hb=c,mb.markEnd(mb.createFunctionExpression(null,a,[],d),e)}function $(){var a,b;return b=nb,a=J(),a.type===$a.StringLiteral||a.type===$a.NumericLiteral?(hb&&a.octal&&P(a,db.StrictOctalLiteral),mb.markEnd(mb.createLiteral(a),b)):mb.markEnd(mb.createIdentifier(a.value),b)}function _(){var a,b,c,d,e,f;return a=nb,f=nb,a.type===$a.Identifier?(c=$(),"get"!==a.value||T(":")?"set"!==a.value||T(":")?(R(":"),d=pa(),mb.markEnd(mb.createProperty("init",c,d),f)):(b=$(),R("("),a=nb,a.type!==$a.Identifier?(R(")"),P(a,db.UnexpectedToken,a.value),d=Z([])):(e=[ta()],R(")"),d=Z(e,a)),mb.markEnd(mb.createProperty("set",b,d),f)):(b=$(),R("("),R(")"),d=Z([]),mb.markEnd(mb.createProperty("get",b,d),f))):a.type!==$a.EOF&&a.type!==$a.Punctuator?(b=$(),R(":"),d=pa(),mb.markEnd(mb.createProperty("init",b,d),f)):void Q(a)}function aa(){var a,b,c,d,e,f=[],g={},h=String;for(e=nb,R("{");!T("}");)a=_(),b=a.key.type===bb.Identifier?a.key.name:h(a.key.value),d="init"===a.kind?cb.Data:"get"===a.kind?cb.Get:cb.Set,c="$"+b,Object.prototype.hasOwnProperty.call(g,c)?(g[c]===cb.Data?hb&&d===cb.Data?P({},db.StrictDuplicateProperty):d!==cb.Data&&P({},db.AccessorDataProperty):d===cb.Data?P({},db.AccessorDataProperty):g[c]&d&&P({},db.AccessorGetSet),g[c]|=d):g[c]=d,f.push(a),T("}")||R(",");return R("}"),mb.markEnd(mb.createObjectExpression(f),e)}function ba(){var a;return R("("),a=qa(),R(")"),a}function ca(){var a,b,c,d;if(T("("))return ba();if(T("["))return Y();if(T("{"))return aa();if(a=nb.type,d=nb,a===$a.Identifier)c=mb.createIdentifier(J().value);else if(a===$a.StringLiteral||a===$a.NumericLiteral)hb&&nb.octal&&P(nb,db.StrictOctalLiteral),c=mb.createLiteral(J());else if(a===$a.Keyword){if(U("function"))return Ta();U("this")?(J(),c=mb.createThisExpression()):Q(J())}else a===$a.BooleanLiteral?(b=J(),b.value="true"===b.value,c=mb.createLiteral(b)):a===$a.NullLiteral?(b=J(),b.value=null,c=mb.createLiteral(b)):T("/")||T("/=")?(c=void 0!==pb.tokens?mb.createLiteral(E()):mb.createLiteral(D()),K()):Q(J());return mb.markEnd(c,d)}function da(){var a=[];if(R("("),!T(")"))for(;ib":case"<=":case">=":case"instanceof":c=7;break;case"in":c=b?7:0;break;case"<<":case">>":case">>>":c=8;break;case"+":case"-":c=9;break;case"*":case"/":case"%":c=11}return c}function na(){var a,b,c,d,e,f,g,h,i,j;if(a=nb,i=la(),d=nb,0===(e=ma(d,ob.allowIn)))return i;for(d.prec=e,J(),b=[a,nb],g=la(),f=[i,d,g];(e=ma(nb,ob.allowIn))>0;){for(;f.length>2&&e<=f[f.length-2].prec;)g=f.pop(),h=f.pop().value,i=f.pop(),c=mb.createBinaryExpression(h,i,g),b.pop(),a=b[b.length-1],mb.markEnd(c,a),f.push(c);d=J(),d.prec=e,f.push(d),b.push(nb),c=la(),f.push(c)}for(j=f.length-1,c=f[j],b.pop();j>1;)c=mb.createBinaryExpression(f[j-1].value,f[j-2],c),j-=2,a=b.pop(),mb.markEnd(c,a);return c}function oa(){var a,b,c,d,e;return e=nb,a=na(),T("?")&&(J(),b=ob.allowIn,ob.allowIn=!0,c=pa(),ob.allowIn=b,R(":"),d=pa(),a=mb.createConditionalExpression(a,c,d),mb.markEnd(a,e)),a}function pa(){var a,b,c,d,e;return a=nb,e=nb,d=b=oa(),V()&&(X(b)||P({},db.InvalidLHSInAssignment),hb&&b.type===bb.Identifier&&l(b.name)&&P(a,db.StrictLHSAssignment),a=J(),c=pa(),d=mb.markEnd(mb.createAssignmentExpression(a.value,b,c),e)),d}function qa(){var a,b=nb;if(a=pa(),T(",")){for(a=mb.createSequenceExpression([a]);ib0?1:0,kb=0,lb=gb.length,nb=null,ob={allowIn:!0,labelSet:{},inFunctionBody:!1,inIteration:!1,inSwitch:!1,lastCommentStart:-1},pb={},b=b||{},b.tokens=!0,pb.tokens=[],pb.tokenize=!0,pb.openParenToken=-1,pb.openCurlyToken=-1,pb.range="boolean"==typeof b.range&&b.range,pb.loc="boolean"==typeof b.loc&&b.loc,"boolean"==typeof b.comment&&b.comment&&(pb.comments=[]),"boolean"==typeof b.tolerant&&b.tolerant&&(pb.errors=[]);try{if(K(),nb.type===$a.EOF)return pb.tokens;for(J();nb.type!==$a.EOF;)try{J()}catch(e){if(nb,pb.errors){pb.errors.push(e);break}throw e}Xa(),d=pb.tokens,void 0!==pb.comments&&(d.comments=pb.comments),void 0!==pb.errors&&(d.errors=pb.errors)}catch(f){throw f}finally{pb={}}return d}function Za(a,b){var c,d;d=String,"string"==typeof a||a instanceof String||(a=d(a)),mb=fb,gb=a,ib=0,jb=gb.length>0?1:0,kb=0,lb=gb.length,nb=null,ob={allowIn:!0,labelSet:{},inFunctionBody:!1,inIteration:!1,inSwitch:!1,lastCommentStart:-1},pb={},void 0!==b&&(pb.range="boolean"==typeof b.range&&b.range,pb.loc="boolean"==typeof b.loc&&b.loc,pb.attachComment="boolean"==typeof b.attachComment&&b.attachComment,pb.loc&&null!==b.source&&void 0!==b.source&&(pb.source=d(b.source)),"boolean"==typeof b.tokens&&b.tokens&&(pb.tokens=[]),"boolean"==typeof b.comment&&b.comment&&(pb.comments=[]),"boolean"==typeof b.tolerant&&b.tolerant&&(pb.errors=[]),pb.attachComment&&(pb.range=!0,pb.comments=[],pb.bottomRightStack=[],pb.trailingComments=[],pb.leadingComments=[]));try{c=Wa(),void 0!==pb.comments&&(c.comments=pb.comments),void 0!==pb.tokens&&(Xa(),c.tokens=pb.tokens),void 0!==pb.errors&&(c.errors=pb.errors)}catch(e){throw e}finally{pb={}}return c}var $a,_a,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb,mb,nb,ob,pb;$a={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8,RegularExpression:9},_a={},_a[$a.BooleanLiteral]="Boolean",_a[$a.EOF]="",_a[$a.Identifier]="Identifier",_a[$a.Keyword]="Keyword",_a[$a.NullLiteral]="Null",_a[$a.NumericLiteral]="Numeric",_a[$a.Punctuator]="Punctuator",_a[$a.StringLiteral]="String",_a[$a.RegularExpression]="RegularExpression",ab=["(","{","[","in","typeof","instanceof","new","return","case","delete","throw","void","=","+=","-=","*=","/=","%=","<<=",">>=",">>>=","&=","|=","^=",",","+","-","*","/","%","++","--","<<",">>",">>>","&","|","^","!","~","&&","||","?",":","===","==",">=","<=","<",">","!=","!=="],bb={AssignmentExpression:"AssignmentExpression",ArrayExpression:"ArrayExpression",BlockStatement:"BlockStatement",BinaryExpression:"BinaryExpression",BreakStatement:"BreakStatement",CallExpression:"CallExpression",CatchClause:"CatchClause",ConditionalExpression:"ConditionalExpression",ContinueStatement:"ContinueStatement",DoWhileStatement:"DoWhileStatement",DebuggerStatement:"DebuggerStatement",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",ForStatement:"ForStatement",ForInStatement:"ForInStatement",FunctionDeclaration:"FunctionDeclaration",FunctionExpression:"FunctionExpression",Identifier:"Identifier",IfStatement:"IfStatement",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",NewExpression:"NewExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ReturnStatement:"ReturnStatement",SequenceExpression:"SequenceExpression",SwitchStatement:"SwitchStatement",SwitchCase:"SwitchCase",ThisExpression:"ThisExpression",ThrowStatement:"ThrowStatement",TryStatement:"TryStatement",UnaryExpression:"UnaryExpression",UpdateExpression:"UpdateExpression",VariableDeclaration:"VariableDeclaration",VariableDeclarator:"VariableDeclarator",WhileStatement:"WhileStatement",WithStatement:"WithStatement"},cb={Data:1,Get:2,Set:4},db={UnexpectedToken:"Unexpected token %0",UnexpectedNumber:"Unexpected number",UnexpectedString:"Unexpected string",UnexpectedIdentifier:"Unexpected identifier",UnexpectedReserved:"Unexpected reserved word",UnexpectedEOS:"Unexpected end of input",NewlineAfterThrow:"Illegal newline after throw",InvalidRegExp:"Invalid regular expression",UnterminatedRegExp:"Invalid regular expression: missing /",InvalidLHSInAssignment:"Invalid left-hand side in assignment",InvalidLHSInForIn:"Invalid left-hand side in for-in",MultipleDefaultsInSwitch:"More than one default clause in switch statement",NoCatchOrFinally:"Missing catch or finally after try",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared",IllegalContinue:"Illegal continue statement",IllegalBreak:"Illegal break statement",IllegalReturn:"Illegal return statement",StrictModeWith:"Strict mode code may not include a with statement",StrictCatchVariable:"Catch variable may not be eval or arguments in strict mode",StrictVarName:"Variable name may not be eval or arguments in strict mode",StrictParamName:"Parameter name eval or arguments is not allowed in strict mode",StrictParamDupe:"Strict mode function may not have duplicate parameter names",StrictFunctionName:"Function name may not be eval or arguments in strict mode",StrictOctalLiteral:"Octal literals are not allowed in strict mode.",StrictDelete:"Delete of an unqualified identifier in strict mode.",StrictDuplicateProperty:"Duplicate data property in object literal not allowed in strict mode",
+AccessorDataProperty:"Object literal may not have data and accessor property with the same name",AccessorGetSet:"Object literal may not have multiple get/set accessors with the same name",StrictLHSAssignment:"Assignment to eval or arguments is not allowed in strict mode",StrictLHSPostfix:"Postfix increment/decrement may not have eval or arguments operand in strict mode",StrictLHSPrefix:"Prefix increment/decrement may not have eval or arguments operand in strict mode",StrictReservedWord:"Use of future reserved word in strict mode"},eb={NonAsciiIdentifierStart:new RegExp("[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛰᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々-〇〡-〩〱-〵〸-〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]"),NonAsciiIdentifierPart:new RegExp("[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ̀-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ҃-҇Ҋ-ԧԱ-Ֆՙա-և֑-ׇֽֿׁׂׅׄא-תװ-ײؐ-ؚؠ-٩ٮ-ۓە-ۜ۟-۪ۨ-ۼۿܐ-݊ݍ-ޱ߀-ߵߺࠀ-࠭ࡀ-࡛ࢠࢢ-ࢬࣤ-ࣾऀ-ॣ०-९ॱ-ॷॹ-ॿঁ-ঃঅ-ঌএঐও-নপ-রলশ-হ়-ৄেৈো-ৎৗড়ঢ়য়-ৣ০-ৱਁ-ਃਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹ਼ਾ-ੂੇੈੋ-੍ੑਖ਼-ੜਫ਼੦-ੵઁ-ઃઅ-ઍએ-ઑઓ-નપ-રલળવ-હ઼-ૅે-ૉો-્ૐૠ-ૣ૦-૯ଁ-ଃଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହ଼-ୄେୈୋ-୍ୖୗଡ଼ଢ଼ୟ-ୣ୦-୯ୱஂஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹா-ூெ-ைொ-்ௐௗ௦-௯ఁ-ఃఅ-ఌఎ-ఐఒ-నప-ళవ-హఽ-ౄె-ైొ-్ౕౖౘౙౠ-ౣ౦-౯ಂಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ಼-ೄೆ-ೈೊ-್ೕೖೞೠ-ೣ೦-೯ೱೲംഃഅ-ഌഎ-ഐഒ-ഺഽ-ൄെ-ൈൊ-ൎൗൠ-ൣ൦-൯ൺ-ൿංඃඅ-ඖක-නඳ-රලව-ෆ්ා-ුූෘ-ෟෲෳก-ฺเ-๎๐-๙ກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ູົ-ຽເ-ໄໆ່-ໍ໐-໙ໜ-ໟༀ༘༙༠-༩༹༵༷༾-ཇཉ-ཬཱ-྄྆-ྗྙ-ྼ࿆က-၉ၐ-ႝႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ፝-፟ᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛰᜀ-ᜌᜎ-᜔ᜠ-᜴ᝀ-ᝓᝠ-ᝬᝮ-ᝰᝲᝳក-៓ៗៜ៝០-៩᠋-᠍᠐-᠙ᠠ-ᡷᢀ-ᢪᢰ-ᣵᤀ-ᤜᤠ-ᤫᤰ-᤻᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-ᨛᨠ-ᩞ᩠-᩿᩼-᪉᪐-᪙ᪧᬀ-ᭋ᭐-᭙᭫-᭳ᮀ-᯳ᰀ-᰷᱀-᱉ᱍ-ᱽ᳐-᳔᳒-ᳶᴀ-ᷦ᷼-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ‿⁀⁔ⁱⁿₐ-ₜ⃐-⃥⃜⃡-⃰ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ⵿-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⷠ-ⷿⸯ々-〇〡-〯〱-〵〸-〼ぁ-ゖ゙゚ゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-꙯ꙴ-꙽ꙿ-ꚗꚟ-꛱ꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠧꡀ-ꡳꢀ-꣄꣐-꣙꣠-ꣷꣻ꤀-꤭ꤰ-꥓ꥠ-ꥼꦀ-꧀ꧏ-꧙ꨀ-ꨶꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺꩻꪀ-ꫂꫛ-ꫝꫠ-ꫯꫲ-꫶ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯪ꯬꯭꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ︀-️︠-︦︳︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]")},fb={name:"SyntaxTree",processComment:function(a){var b,c;if(!(a.type===bb.Program&&a.body.length>0)){for(pb.trailingComments.length>0?pb.trailingComments[0].range[0]>=a.range[1]?(c=pb.trailingComments,pb.trailingComments=[]):pb.trailingComments.length=0:pb.bottomRightStack.length>0&&pb.bottomRightStack[pb.bottomRightStack.length-1].trailingComments&&pb.bottomRightStack[pb.bottomRightStack.length-1].trailingComments[0].range[0]>=a.range[1]&&(c=pb.bottomRightStack[pb.bottomRightStack.length-1].trailingComments,delete pb.bottomRightStack[pb.bottomRightStack.length-1].trailingComments);pb.bottomRightStack.length>0&&pb.bottomRightStack[pb.bottomRightStack.length-1].range[0]>=a.range[0];)b=pb.bottomRightStack.pop();b?b.leadingComments&&b.leadingComments[b.leadingComments.length-1].range[1]<=a.range[0]&&(a.leadingComments=b.leadingComments,delete b.leadingComments):pb.leadingComments.length>0&&pb.leadingComments[pb.leadingComments.length-1].range[1]<=a.range[0]&&(a.leadingComments=pb.leadingComments,pb.leadingComments=[]),c&&(a.trailingComments=c),pb.bottomRightStack.push(a)}},markEnd:function(a,b){return pb.range&&(a.range=[b.start,ib]),pb.loc&&(a.loc=new M(void 0===b.startLineNumber?b.lineNumber:b.startLineNumber,b.start-(void 0===b.startLineStart?b.lineStart:b.startLineStart),jb,ib-kb),this.postProcess(a)),pb.attachComment&&this.processComment(a),a},postProcess:function(a){return pb.source&&(a.loc.source=pb.source),a},createArrayExpression:function(a){return{type:bb.ArrayExpression,elements:a}},createAssignmentExpression:function(a,b,c){return{type:bb.AssignmentExpression,operator:a,left:b,right:c}},createBinaryExpression:function(a,b,c){return{type:"||"===a||"&&"===a?bb.LogicalExpression:bb.BinaryExpression,operator:a,left:b,right:c}},createBlockStatement:function(a){return{type:bb.BlockStatement,body:a}},createBreakStatement:function(a){return{type:bb.BreakStatement,label:a}},createCallExpression:function(a,b){return{type:bb.CallExpression,callee:a,arguments:b}},createCatchClause:function(a,b){return{type:bb.CatchClause,param:a,body:b}},createConditionalExpression:function(a,b,c){return{type:bb.ConditionalExpression,test:a,consequent:b,alternate:c}},createContinueStatement:function(a){return{type:bb.ContinueStatement,label:a}},createDebuggerStatement:function(){return{type:bb.DebuggerStatement}},createDoWhileStatement:function(a,b){return{type:bb.DoWhileStatement,body:a,test:b}},createEmptyStatement:function(){return{type:bb.EmptyStatement}},createExpressionStatement:function(a){return{type:bb.ExpressionStatement,expression:a}},createForStatement:function(a,b,c,d){return{type:bb.ForStatement,init:a,test:b,update:c,body:d}},createForInStatement:function(a,b,c){return{type:bb.ForInStatement,left:a,right:b,body:c,each:!1}},createFunctionDeclaration:function(a,b,c,d){return{type:bb.FunctionDeclaration,id:a,params:b,defaults:c,body:d,rest:null,generator:!1,expression:!1}},createFunctionExpression:function(a,b,c,d){return{type:bb.FunctionExpression,id:a,params:b,defaults:c,body:d,rest:null,generator:!1,expression:!1}},createIdentifier:function(a){return{type:bb.Identifier,name:a}},createIfStatement:function(a,b,c){return{type:bb.IfStatement,test:a,consequent:b,alternate:c}},createLabeledStatement:function(a,b){return{type:bb.LabeledStatement,label:a,body:b}},createLiteral:function(a){return{type:bb.Literal,value:a.value,raw:gb.slice(a.start,a.end)}},createMemberExpression:function(a,b,c){return{type:bb.MemberExpression,computed:"["===a,object:b,property:c}},createNewExpression:function(a,b){return{type:bb.NewExpression,callee:a,arguments:b}},createObjectExpression:function(a){return{type:bb.ObjectExpression,properties:a}},createPostfixExpression:function(a,b){return{type:bb.UpdateExpression,operator:a,argument:b,prefix:!1}},createProgram:function(a){return{type:bb.Program,body:a}},createProperty:function(a,b,c){return{type:bb.Property,key:b,value:c,kind:a}},createReturnStatement:function(a){return{type:bb.ReturnStatement,argument:a}},createSequenceExpression:function(a){return{type:bb.SequenceExpression,expressions:a}},createSwitchCase:function(a,b){return{type:bb.SwitchCase,test:a,consequent:b}},createSwitchStatement:function(a,b){return{type:bb.SwitchStatement,discriminant:a,cases:b}},createThisExpression:function(){return{type:bb.ThisExpression}},createThrowStatement:function(a){return{type:bb.ThrowStatement,argument:a}},createTryStatement:function(a,b,c,d){return{type:bb.TryStatement,block:a,guardedHandlers:b,handlers:c,finalizer:d}},createUnaryExpression:function(a,b){return"++"===a||"--"===a?{type:bb.UpdateExpression,operator:a,argument:b,prefix:!0}:{type:bb.UnaryExpression,operator:a,argument:b,prefix:!0}},createVariableDeclaration:function(a,b){return{type:bb.VariableDeclaration,declarations:a,kind:b}},createVariableDeclarator:function(a,b){return{type:bb.VariableDeclarator,id:a,init:b}},createWhileStatement:function(a,b){return{type:bb.WhileStatement,test:a,body:b}},createWithStatement:function(a,b){return{type:bb.WithStatement,object:a,body:b}}},a.version="1.2.2",a.tokenize=Ya,a.parse=Za,a.Syntax=function(){var a,b={};"function"==typeof Object.create&&(b=Object.create(null));for(a in bb)bb.hasOwnProperty(a)&&(b[a]=bb[a]);return"function"==typeof Object.freeze&&Object.freeze(b),b}()})},{}],1:[function(a,b,c){(function(d){var e=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,JSON_PATH:3,DOLLAR:4,PATH_COMPONENTS:5,LEADING_CHILD_MEMBER_EXPRESSION:6,PATH_COMPONENT:7,MEMBER_COMPONENT:8,SUBSCRIPT_COMPONENT:9,CHILD_MEMBER_COMPONENT:10,DESCENDANT_MEMBER_COMPONENT:11,DOT:12,MEMBER_EXPRESSION:13,DOT_DOT:14,STAR:15,IDENTIFIER:16,SCRIPT_EXPRESSION:17,INTEGER:18,END:19,CHILD_SUBSCRIPT_COMPONENT:20,DESCENDANT_SUBSCRIPT_COMPONENT:21,"[":22,SUBSCRIPT:23,"]":24,SUBSCRIPT_EXPRESSION:25,SUBSCRIPT_EXPRESSION_LIST:26,SUBSCRIPT_EXPRESSION_LISTABLE:27,",":28,STRING_LITERAL:29,ARRAY_SLICE:30,FILTER_EXPRESSION:31,QQ_STRING:32,Q_STRING:33,$accept:0,$end:1},terminals_:{2:"error",4:"DOLLAR",12:"DOT",14:"DOT_DOT",15:"STAR",16:"IDENTIFIER",17:"SCRIPT_EXPRESSION",18:"INTEGER",19:"END",22:"[",24:"]",28:",",30:"ARRAY_SLICE",31:"FILTER_EXPRESSION",32:"QQ_STRING",33:"Q_STRING"},productions_:[0,[3,1],[3,2],[3,1],[3,2],[5,1],[5,2],[7,1],[7,1],[8,1],[8,1],[10,2],[6,1],[11,2],[13,1],[13,1],[13,1],[13,1],[13,1],[9,1],[9,1],[20,3],[21,4],[23,1],[23,1],[26,1],[26,3],[27,1],[27,1],[27,1],[25,1],[25,1],[25,1],[29,1],[29,1]],performAction:function(a,b,d,e,f,g,h){e.ast||(e.ast=c,c.initialize());var i=g.length-1;switch(f){case 1:return e.ast.set({expression:{type:"root",value:g[i]}}),e.ast.unshift(),e.ast.yield();case 2:return e.ast.set({expression:{type:"root",value:g[i-1]}}),e.ast.unshift(),e.ast.yield();case 3:return e.ast.unshift(),e.ast.yield();case 4:return e.ast.set({operation:"member",scope:"child",expression:{type:"identifier",value:g[i-1]}}),e.ast.unshift(),e.ast.yield();case 5:case 6:break;case 7:e.ast.set({operation:"member"}),e.ast.push();break;case 8:e.ast.set({operation:"subscript"}),e.ast.push();break;case 9:e.ast.set({scope:"child"});break;case 10:e.ast.set({scope:"descendant"});break;case 11:break;case 12:e.ast.set({scope:"child",operation:"member"});break;case 13:break;case 14:e.ast.set({expression:{type:"wildcard",value:g[i]}});break;case 15:e.ast.set({expression:{type:"identifier",value:g[i]}});break;case 16:e.ast.set({expression:{type:"script_expression",value:g[i]}});break;case 17:e.ast.set({expression:{type:"numeric_literal",value:parseInt(g[i])}});break;case 18:break;case 19:e.ast.set({scope:"child"});break;case 20:e.ast.set({scope:"descendant"});break;case 21:case 22:case 23:break;case 24:g[i].length>1?e.ast.set({expression:{type:"union",value:g[i]}}):this.$=g[i];break;case 25:this.$=[g[i]];break;case 26:this.$=g[i-2].concat(g[i]);break;case 27:this.$={expression:{type:"numeric_literal",value:parseInt(g[i])}},e.ast.set(this.$);break;case 28:this.$={expression:{type:"string_literal",value:g[i]}},e.ast.set(this.$);break;case 29:this.$={expression:{type:"slice",value:g[i]}},e.ast.set(this.$);break;case 30:this.$={expression:{type:"wildcard",value:g[i]}},e.ast.set(this.$);break;case 31:this.$={expression:{type:"script_expression",value:g[i]}},e.ast.set(this.$);break;case 32:this.$={expression:{type:"filter_expression",value:g[i]}},e.ast.set(this.$);break;case 33:case 34:this.$=g[i]}},table:[{3:1,4:[1,2],6:3,13:4,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{1:[3]},{1:[2,1],5:10,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,3],5:21,7:11,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,12],12:[2,12],14:[2,12],22:[2,12]},{1:[2,14],12:[2,14],14:[2,14],22:[2,14]},{1:[2,15],12:[2,15],14:[2,15],22:[2,15]},{1:[2,16],12:[2,16],14:[2,16],22:[2,16]},{1:[2,17],12:[2,17],14:[2,17],22:[2,17]},{1:[2,18],12:[2,18],14:[2,18],22:[2,18]},{1:[2,2],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,5],12:[2,5],14:[2,5],22:[2,5]},{1:[2,7],12:[2,7],14:[2,7],22:[2,7]},{1:[2,8],12:[2,8],14:[2,8],22:[2,8]},{1:[2,9],12:[2,9],14:[2,9],22:[2,9]},{1:[2,10],12:[2,10],14:[2,10],22:[2,10]},{1:[2,19],12:[2,19],14:[2,19],22:[2,19]},{1:[2,20],12:[2,20],14:[2,20],22:[2,20]},{13:23,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9]},{13:24,15:[1,5],16:[1,6],17:[1,7],18:[1,8],19:[1,9],22:[1,25]},{15:[1,29],17:[1,30],18:[1,33],23:26,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{1:[2,4],7:22,8:12,9:13,10:14,11:15,12:[1,18],14:[1,19],20:16,21:17,22:[1,20]},{1:[2,6],12:[2,6],14:[2,6],22:[2,6]},{1:[2,11],12:[2,11],14:[2,11],22:[2,11]},{1:[2,13],12:[2,13],14:[2,13],22:[2,13]},{15:[1,29],17:[1,30],18:[1,33],23:38,25:27,26:28,27:32,29:34,30:[1,35],31:[1,31],32:[1,36],33:[1,37]},{24:[1,39]},{24:[2,23]},{24:[2,24],28:[1,40]},{24:[2,30]},{24:[2,31]},{24:[2,32]},{24:[2,25],28:[2,25]},{24:[2,27],28:[2,27]},{24:[2,28],28:[2,28]},{24:[2,29],28:[2,29]},{24:[2,33],28:[2,33]},{24:[2,34],28:[2,34]},{24:[1,41]},{1:[2,21],12:[2,21],14:[2,21],22:[2,21]},{18:[1,33],27:42,29:34,30:[1,35],32:[1,36],33:[1,37]},{1:[2,22],12:[2,22],14:[2,22],22:[2,22]},{24:[2,26],28:[2,26]}],defaultActions:{27:[2,23],29:[2,30],30:[2,31],31:[2,32]},parseError:function(a,b){if(!b.recoverable)throw new Error(a);this.trace(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||m,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0,l=2,m=1,n=f.slice.call(arguments,1);this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,void 0===this.lexer.yylloc&&(this.lexer.yylloc={});var o=this.lexer.yylloc;f.push(o);var p=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError?this.parseError=this.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var q,r,s,t,u,v,w,x,y,z={};;){if(s=d[d.length-1],this.defaultActions[s]?t=this.defaultActions[s]:(null!==q&&void 0!==q||(q=b()),t=g[s]&&g[s][q]),void 0===t||!t.length||!t[0]){var A="";y=[];for(v in g[s])this.terminals_[v]&&v>l&&y.push("'"+this.terminals_[v]+"'");A=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+y.join(", ")+", got '"+(this.terminals_[q]||q)+"'":"Parse error on line "+(i+1)+": Unexpected "+(q==m?"end of input":"'"+(this.terminals_[q]||q)+"'"),this.parseError(A,{text:this.lexer.match,token:this.terminals_[q]||q,line:this.lexer.yylineno,loc:o,expected:y})}if(t[0]instanceof Array&&t.length>1)throw new Error("Parse Error: multiple actions possible at state: "+s+", token: "+q);switch(t[0]){case 1:d.push(q),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(t[1]),q=null,r?(q=r,r=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,o=this.lexer.yylloc,k>0&&k--);break;case 2:if(w=this.productions_[t[1]][1],z.$=e[e.length-w],z._$={first_line:f[f.length-(w||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(w||1)].first_column,last_column:f[f.length-1].last_column},p&&(z._$.range=[f[f.length-(w||1)].range[0],f[f.length-1].range[1]]),void 0!==(u=this.performAction.apply(z,[h,j,i,this.yy,t[1],e,f].concat(n))))return u;w&&(d=d.slice(0,-1*w*2),e=e.slice(0,-1*w),f=f.slice(0,-1*w)),d.push(this.productions_[t[1]][0]),e.push(z.$),f.push(z._$),x=g[d[d.length-2]][d[d.length-1]],d.push(x);break;case 3:return!0}}return!0}},c={initialize:function(){this._nodes=[],this._node={},this._stash=[]},set:function(a){for(var b in a)this._node[b]=a[b];return this._node},node:function(a){return arguments.length&&(this._node=a),this._node},push:function(){this._nodes.push(this._node),this._node={}},unshift:function(){this._nodes.unshift(this._node),this._node={}},yield:function(){var a=this._nodes;return this.initialize(),a}},d=function(){return{EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];return this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a,a.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},test_match:function(a,b){var c,d,e;if(this.options.backtrack_lexer&&(e={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(e.yylloc.range=this.yylloc.range.slice(0))),d=a[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+a[0].length},this.yytext+=a[0],this.match+=a[0],this.matches=a,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(a[0].length),this.matched+=a[0],c=this.performAction.call(this,this.yy,this,b,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var f in e)this[f]=e[f];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d;this._more||(this.yytext="",this.match="");for(var e=this._currentRules(),f=0;fb[0].length)){if(b=c,d=f,this.options.backtrack_lexer){if(!1!==(a=this.test_match(c,e[f])))return a;if(this._backtrack){b=!1;continue}return!1}if(!this.options.flex)break}return b?!1!==(a=this.test_match(b,e[d]))&&a:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return a||this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},pushState:function(a){this.begin(a)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(a,b,c,d){switch(c){case 0:return 4;case 1:return 14;case 2:return 12;case 3:return 15;case 4:return 16;case 5:return 22;case 6:return 24;case 7:return 28;case 8:return 30;case 9:return 18;case 10:return b.yytext=b.yytext.substr(1,b.yyleng-2),32;case 11:return b.yytext=b.yytext.substr(1,b.yyleng-2),33;case 12:return 17;case 13:return 31}},rules:[/^(?:\$)/,/^(?:\.\.)/,/^(?:\.)/,/^(?:\*)/,/^(?:[a-zA-Z_]+[a-zA-Z0-9_]*)/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?:((-?(?:0|[1-9][0-9]*)))?\:((-?(?:0|[1-9][0-9]*)))?(\:((-?(?:0|[1-9][0-9]*)))?)?)/,/^(?:(-?(?:0|[1-9][0-9]*)))/,/^(?:"(?:\\["bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*")/,/^(?:'(?:\\['bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^'\\])*')/,/^(?:\(.+?\)(?=\]))/,/^(?:\?\(.+?\)(?=\]))/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}}}}();return b.lexer=d,a.prototype=b,b.Parser=a,new a}();void 0!==a&&void 0!==c&&(c.parser=e,c.Parser=e.Parser,c.parse=function(){return e.parse.apply(e,arguments)},c.main=function(b){b[1]||(console.log("Usage: "+b[0]+" FILE"),d.exit(1));var e=a("fs").readFileSync(a("path").normalize(b[1]),"utf8");return c.parser.parse(e)},void 0!==b&&a.main===b&&c.main(d.argv.slice(1)))}).call(this,a("_process"))},{_process:14,fs:12,path:13}],2:[function(a,b,c){b.exports={identifier:"[a-zA-Z_]+[a-zA-Z0-9_]*",integer:"-?(?:0|[1-9][0-9]*)",qq_string:'"(?:\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^"\\\\])*"',q_string:"'(?:\\\\['bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^'\\\\])*'"}},{}],3:[function(a,b,c){var d=a("./dict"),e=a("fs"),f={lex:{macros:{esc:"\\\\",int:d.integer},rules:[["\\$","return 'DOLLAR'"],["\\.\\.","return 'DOT_DOT'"],["\\.","return 'DOT'"],["\\*","return 'STAR'"],[d.identifier,"return 'IDENTIFIER'"],["\\[","return '['"],["\\]","return ']'"],[",","return ','"],["({int})?\\:({int})?(\\:({int})?)?","return 'ARRAY_SLICE'"],["{int}","return 'INTEGER'"],[d.qq_string,"yytext = yytext.substr(1,yyleng-2); return 'QQ_STRING';"],[d.q_string,"yytext = yytext.substr(1,yyleng-2); return 'Q_STRING';"],["\\(.+?\\)(?=\\])","return 'SCRIPT_EXPRESSION'"],["\\?\\(.+?\\)(?=\\])","return 'FILTER_EXPRESSION'"]]},start:"JSON_PATH",bnf:{JSON_PATH:[["DOLLAR",'yy.ast.set({ expression: { type: "root", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()'],["DOLLAR PATH_COMPONENTS",'yy.ast.set({ expression: { type: "root", value: $1 } }); yy.ast.unshift(); return yy.ast.yield()'],["LEADING_CHILD_MEMBER_EXPRESSION","yy.ast.unshift(); return yy.ast.yield()"],["LEADING_CHILD_MEMBER_EXPRESSION PATH_COMPONENTS",'yy.ast.set({ operation: "member", scope: "child", expression: { type: "identifier", value: $1 }}); yy.ast.unshift(); return yy.ast.yield()']],PATH_COMPONENTS:[["PATH_COMPONENT",""],["PATH_COMPONENTS PATH_COMPONENT",""]],PATH_COMPONENT:[["MEMBER_COMPONENT",'yy.ast.set({ operation: "member" }); yy.ast.push()'],["SUBSCRIPT_COMPONENT",'yy.ast.set({ operation: "subscript" }); yy.ast.push() ']],MEMBER_COMPONENT:[["CHILD_MEMBER_COMPONENT",'yy.ast.set({ scope: "child" })'],["DESCENDANT_MEMBER_COMPONENT",'yy.ast.set({ scope: "descendant" })']],CHILD_MEMBER_COMPONENT:[["DOT MEMBER_EXPRESSION",""]],LEADING_CHILD_MEMBER_EXPRESSION:[["MEMBER_EXPRESSION",'yy.ast.set({ scope: "child", operation: "member" })']],DESCENDANT_MEMBER_COMPONENT:[["DOT_DOT MEMBER_EXPRESSION",""]],MEMBER_EXPRESSION:[["STAR",'yy.ast.set({ expression: { type: "wildcard", value: $1 } })'],["IDENTIFIER",'yy.ast.set({ expression: { type: "identifier", value: $1 } })'],["SCRIPT_EXPRESSION",'yy.ast.set({ expression: { type: "script_expression", value: $1 } })'],["INTEGER",'yy.ast.set({ expression: { type: "numeric_literal", value: parseInt($1) } })'],["END",""]],SUBSCRIPT_COMPONENT:[["CHILD_SUBSCRIPT_COMPONENT",'yy.ast.set({ scope: "child" })'],["DESCENDANT_SUBSCRIPT_COMPONENT",'yy.ast.set({ scope: "descendant" })']],CHILD_SUBSCRIPT_COMPONENT:[["[ SUBSCRIPT ]",""]],DESCENDANT_SUBSCRIPT_COMPONENT:[["DOT_DOT [ SUBSCRIPT ]",""]],SUBSCRIPT:[["SUBSCRIPT_EXPRESSION",""],["SUBSCRIPT_EXPRESSION_LIST",'$1.length > 1? yy.ast.set({ expression: { type: "union", value: $1 } }) : $$ = $1']],SUBSCRIPT_EXPRESSION_LIST:[["SUBSCRIPT_EXPRESSION_LISTABLE","$$ = [$1]"],["SUBSCRIPT_EXPRESSION_LIST , SUBSCRIPT_EXPRESSION_LISTABLE","$$ = $1.concat($3)"]],SUBSCRIPT_EXPRESSION_LISTABLE:[["INTEGER",'$$ = { expression: { type: "numeric_literal", value: parseInt($1) } }; yy.ast.set($$)'],["STRING_LITERAL",'$$ = { expression: { type: "string_literal", value: $1 } }; yy.ast.set($$)'],["ARRAY_SLICE",'$$ = { expression: { type: "slice", value: $1 } }; yy.ast.set($$)']],SUBSCRIPT_EXPRESSION:[["STAR",'$$ = { expression: { type: "wildcard", value: $1 } }; yy.ast.set($$)'],["SCRIPT_EXPRESSION",'$$ = { expression: { type: "script_expression", value: $1 } }; yy.ast.set($$)'],["FILTER_EXPRESSION",'$$ = { expression: { type: "filter_expression", value: $1 } }; yy.ast.set($$)']],STRING_LITERAL:[["QQ_STRING","$$ = $1"],["Q_STRING","$$ = $1"]]}};e.readFileSync&&(f.moduleInclude=e.readFileSync(a.resolve("../include/module.js")),f.actionInclude=e.readFileSync(a.resolve("../include/action.js"))),b.exports=f},{"./dict":2,fs:12}],4:[function(a,b,c){function d(b,c,d){var e=a("./index"),f=m.parse(c).body[0].expression,g=j(f,{"@":b.value}),h=d.replace(/\{\{\s*value\s*\}\}/g,g),i=e.nodes(b.value,h);return i.forEach(function(a){a.path=b.path.concat(a.path.slice(1))}),i}function e(a){return Array.isArray(a)}function f(a){return a&&!(a instanceof Array)&&a instanceof Object}function g(a){return function(b,c,d,g){var h=b.value,i=b.path,j=[],k=function(b,h){e(b)?(b.forEach(function(a,b){j.length>=g||d(b,a,c)&&j.push({path:h.concat(b),value:a})}),b.forEach(function(b,c){j.length>=g||a&&k(b,h.concat(c))})):f(b)&&(this.keys(b).forEach(function(a){j.length>=g||d(a,b[a],c)&&j.push({path:h.concat(a),value:b[a]})}),this.keys(b).forEach(function(c){j.length>=g||a&&k(b[c],h.concat(c))}))}.bind(this);return k(h,i),j}}function h(a){return function(b,c,d){return this.descend(c,b.expression.value,a,d)}}function i(a){return function(b,c,d){return this.traverse(c,b.expression.value,a,d)}}function j(){try{return o.apply(this,arguments)}catch(a){}}function k(a){return a=a.filter(function(a){return a}),p(a,function(a){return a.path.map(function(a){return String(a).replace("-","--")}).join("-")})}function l(a){var b=String(a);return b.match(/^-?[0-9]+$/)?parseInt(b):null}var m=a("./aesprim"),n=a("./slice"),o=a("static-eval"),p=a("underscore").uniq,q=function(){return this.initialize.apply(this,arguments)};q.prototype.initialize=function(){this.traverse=g(!0),this.descend=g()},q.prototype.keys=Object.keys,q.prototype.resolve=function(a){var b=[a.operation,a.scope,a.expression.type].join("-"),c=this._fns[b];if(!c)throw new Error("couldn't resolve key: "+b);return c.bind(this)},q.prototype.register=function(a,b){if(!b instanceof Function)throw new Error("handler must be a function");this._fns[a]=b},q.prototype._fns={"member-child-identifier":function(a,b){var c=a.expression.value,d=b.value;if(d instanceof Object&&c in d)return[{value:d[c],path:b.path.concat(c)}]},"member-descendant-identifier":i(function(a,b,c){return a==c}),"subscript-child-numeric_literal":h(function(a,b,c){return a===c}),"member-child-numeric_literal":h(function(a,b,c){return String(a)===String(c)}),"subscript-descendant-numeric_literal":i(function(a,b,c){return a===c}),"member-child-wildcard":h(function(){return!0}),"member-descendant-wildcard":i(function(){return!0}),"subscript-descendant-wildcard":i(function(){return!0}),"subscript-child-wildcard":h(function(){return!0}),"subscript-child-slice":function(a,b){if(e(b.value)){var c=a.expression.value.split(":").map(l),d=b.value.map(function(a,c){return{value:a,path:b.path.concat(c)}});return n.apply(null,[d].concat(c))}},"subscript-child-union":function(a,b){var c=[];return a.expression.value.forEach(function(a){var d={operation:"subscript",scope:"child",expression:a.expression},e=this.resolve(d),f=e(d,b);f&&(c=c.concat(f))},this),k(c)},"subscript-descendant-union":function(b,c,d){var e=a(".."),f=this,g=[];return e.nodes(c,"$..*").slice(1).forEach(function(a){g.length>=d||b.expression.value.forEach(function(b){var c={operation:"subscript",scope:"child",expression:b.expression},d=f.resolve(c),e=d(c,a);g=g.concat(e)})}),k(g)},"subscript-child-filter_expression":function(a,b,c){var d=a.expression.value.slice(2,-1),e=m.parse(d).body[0].expression,f=function(a,b){return j(e,{"@":b})};return this.descend(b,null,f,c)},"subscript-descendant-filter_expression":function(a,b,c){var d=a.expression.value.slice(2,-1),e=m.parse(d).body[0].expression,f=function(a,b){return j(e,{"@":b})};return this.traverse(b,null,f,c)},"subscript-child-script_expression":function(a,b){return d(b,a.expression.value.slice(1,-1),"$[{{value}}]")},"member-child-script_expression":function(a,b){return d(b,a.expression.value.slice(1,-1),"$.{{value}}")},"member-descendant-script_expression":function(a,b){return d(b,a.expression.value.slice(1,-1),"$..value")}},q.prototype._fns["subscript-child-string_literal"]=q.prototype._fns["member-child-identifier"],q.prototype._fns["member-descendant-numeric_literal"]=q.prototype._fns["subscript-descendant-string_literal"]=q.prototype._fns["member-descendant-identifier"],b.exports=q},{"..":"jsonpath","./aesprim":"./aesprim","./index":5,"./slice":7,"static-eval":15,underscore:12}],5:[function(a,b,c){function d(a){return"[object String]"==Object.prototype.toString.call(a)}var e=a("assert"),f=a("./dict"),g=a("./parser"),h=a("./handlers"),i=function(){this.initialize.apply(this,arguments)};i.prototype.initialize=function(){this.parser=new g,this.handlers=new h},i.prototype.parse=function(a){return e.ok(d(a),"we need a path"),this.parser.parse(a)},i.prototype.parent=function(a,b){e.ok(a instanceof Object,"obj needs to be an object"),e.ok(b,"we need a path");var c=this.nodes(a,b)[0];c.path.pop();return this.value(a,c.path)},i.prototype.apply=function(a,b,c){e.ok(a instanceof Object,"obj needs to be an object"),e.ok(b,"we need a path"),e.equal(typeof c,"function","fn needs to be function");var d=this.nodes(a,b).sort(function(a,b){return b.path.length-a.path.length});return d.forEach(function(b){var d=b.path.pop(),e=this.value(a,this.stringify(b.path)),f=b.value=c.call(a,e[d]);e[d]=f},this),d},i.prototype.value=function(a,b,c){if(e.ok(a instanceof Object,"obj needs to be an object"),e.ok(b,"we need a path"),arguments.length>=3){var d=this.nodes(a,b).shift();if(!d)return this._vivify(a,b,c);var f=d.path.slice(-1).shift();this.parent(a,this.stringify(d.path))[f]=c}return this.query(a,this.stringify(b),1).shift()},i.prototype._vivify=function(a,b,c){var d=this;e.ok(a instanceof Object,"obj needs to be an object"),e.ok(b,"we need a path");var f=this.parser.parse(b).map(function(a){return a.expression.value}),g=function(b,c){var e=b.pop(),f=d.value(a,b);f||(g(b.concat(),"string"==typeof e?{}:[]),f=d.value(a,b)),f[e]=c};return g(f,c),this.query(a,b)[0]},i.prototype.query=function(a,b,c){return e.ok(a instanceof Object,"obj needs to be an object"),e.ok(d(b),"we need a path"),this.nodes(a,b,c).map(function(a){return a.value})},i.prototype.paths=function(a,b,c){return e.ok(a instanceof Object,"obj needs to be an object"),e.ok(b,"we need a path"),this.nodes(a,b,c).map(function(a){return a.path})},i.prototype.nodes=function(a,b,c){if(e.ok(a instanceof Object,"obj needs to be an object"),e.ok(b,"we need a path"),0===c)return[];var d=this.parser.parse(b),f=this.handlers,g=[{path:["$"],value:a}],h=[];return d.length&&"root"==d[0].expression.type&&d.shift(),d.length?(d.forEach(function(a,b){if(!(h.length>=c)){var e=f.resolve(a),i=[];g.forEach(function(f){if(!(h.length>=c)){var g=e(a,f,c);b==d.length-1?h=h.concat(g||[]):i=i.concat(g||[])}}),g=i}}),c?h.slice(0,c):h):g},
+i.prototype.stringify=function(a){e.ok(a,"we need a path");var b="$",c={"descendant-member":"..{{value}}","child-member":".{{value}}","descendant-subscript":"..[{{value}}]","child-subscript":"[{{value}}]"};return a=this._normalize(a),a.forEach(function(a){if("root"!=a.expression.type){var d,e=[a.scope,a.operation].join("-"),f=c[e];if(d="string_literal"==a.expression.type?JSON.stringify(a.expression.value):a.expression.value,!f)throw new Error("couldn't find template "+e);b+=f.replace(/{{value}}/,d)}}),b},i.prototype._normalize=function(a){if(e.ok(a,"we need a path"),"string"==typeof a)return this.parser.parse(a);if(Array.isArray(a)&&"string"==typeof a[0]){var b=[{expression:{type:"root",value:"$"}}];return a.forEach(function(a,c){if("$"!=a||0!==c)if("string"==typeof a&&a.match("^"+f.identifier+"$"))b.push({operation:"member",scope:"child",expression:{value:a,type:"identifier"}});else{var d="number"==typeof a?"numeric_literal":"string_literal";b.push({operation:"subscript",scope:"child",expression:{value:a,type:d}})}}),b}if(Array.isArray(a)&&"object"==typeof a[0])return a;throw new Error("couldn't understand path "+a)},i.Handlers=h,i.Parser=g;var j=new i;j.JSONPath=i,b.exports=j},{"./dict":2,"./handlers":4,"./parser":6,assert:8}],6:[function(a,b,c){var d=a("./grammar"),e=a("../generated/parser"),f=function(){var a=new e.Parser,b=a.parseError;return a.yy.parseError=function(){a.yy.ast&&a.yy.ast.initialize(),b.apply(a,arguments)},a};f.grammar=d,b.exports=f},{"../generated/parser":1,"./grammar":3}],7:[function(a,b,c){function d(a){return String(a).match(/^[0-9]+$/)?parseInt(a):Number.isFinite(a)?parseInt(a,10):0}b.exports=function(a,b,c,e){if("string"==typeof b)throw new Error("start cannot be a string");if("string"==typeof c)throw new Error("end cannot be a string");if("string"==typeof e)throw new Error("step cannot be a string");var f=a.length;if(0===e)throw new Error("step cannot be zero");if(e=e?d(e):1,b=b<0?f+b:b,c=c<0?f+c:c,b=d(0===b?0:b||(e>0?0:f-1)),c=d(0===c?0:c||(e>0?f:-1)),b=e>0?Math.max(0,b):Math.min(f,b),c=e>0?Math.min(c,f):Math.max(-1,c),e>0&&c<=b)return[];if(e<0&&b<=c)return[];for(var g=[],h=b;h!=c&&!(e<0&&h<=c||e>0&&h>=c);h+=e)g.push(a[h]);return g}},{}],8:[function(a,b,c){function d(a,b){return n.isUndefined(b)?""+b:n.isNumber(b)&&!isFinite(b)?b.toString():n.isFunction(b)||n.isRegExp(b)?b.toString():b}function e(a,b){return n.isString(a)?a.length=0;f--)if(g[f]!=h[f])return!1;for(f=g.length-1;f>=0;f--)if(e=g[f],!i(a[e],b[e]))return!1;return!0}function l(a,b){return!(!a||!b)&&("[object RegExp]"==Object.prototype.toString.call(b)?b.test(a):a instanceof b||!0===b.call({},a))}function m(a,b,c,d){var e;n.isString(c)&&(d=c,c=null);try{b()}catch(f){e=f}if(d=(c&&c.name?" ("+c.name+").":".")+(d?" "+d:"."),a&&!e&&g(e,c,"Missing expected exception"+d),!a&&l(e,c)&&g(e,c,"Got unwanted exception"+d),a&&e&&c&&!l(e,c)||!a&&e)throw e}var n=a("util/"),o=Array.prototype.slice,p=Object.prototype.hasOwnProperty,q=b.exports=h;q.AssertionError=function(a){this.name="AssertionError",this.actual=a.actual,this.expected=a.expected,this.operator=a.operator,a.message?(this.message=a.message,this.generatedMessage=!1):(this.message=f(this),this.generatedMessage=!0);var b=a.stackStartFunction||g;if(Error.captureStackTrace)Error.captureStackTrace(this,b);else{var c=new Error;if(c.stack){var d=c.stack,e=b.name,h=d.indexOf("\n"+e);if(h>=0){var i=d.indexOf("\n",h+1);d=d.substring(i+1)}this.stack=d}}},n.inherits(q.AssertionError,Error),q.fail=g,q.ok=h,q.equal=function(a,b,c){a!=b&&g(a,b,c,"==",q.equal)},q.notEqual=function(a,b,c){a==b&&g(a,b,c,"!=",q.notEqual)},q.deepEqual=function(a,b,c){i(a,b)||g(a,b,c,"deepEqual",q.deepEqual)},q.notDeepEqual=function(a,b,c){i(a,b)&&g(a,b,c,"notDeepEqual",q.notDeepEqual)},q.strictEqual=function(a,b,c){a!==b&&g(a,b,c,"===",q.strictEqual)},q.notStrictEqual=function(a,b,c){a===b&&g(a,b,c,"!==",q.notStrictEqual)},q.throws=function(a,b,c){m.apply(this,[!0].concat(o.call(arguments)))},q.doesNotThrow=function(a,b){m.apply(this,[!1].concat(o.call(arguments)))},q.ifError=function(a){if(a)throw a};var r=Object.keys||function(a){var b=[];for(var c in a)p.call(a,c)&&b.push(c);return b}},{"util/":11}],9:[function(a,b,c){"function"==typeof Object.create?b.exports=function(a,b){a.super_=b,a.prototype=Object.create(b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}})}:b.exports=function(a,b){a.super_=b;var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a}},{}],10:[function(a,b,c){b.exports=function(a){return a&&"object"==typeof a&&"function"==typeof a.copy&&"function"==typeof a.fill&&"function"==typeof a.readUInt8}},{}],11:[function(a,b,c){(function(b,d){function e(a,b){var d={seen:[],stylize:g};return arguments.length>=3&&(d.depth=arguments[2]),arguments.length>=4&&(d.colors=arguments[3]),p(b)?d.showHidden=b:b&&c._extend(d,b),v(d.showHidden)&&(d.showHidden=!1),v(d.depth)&&(d.depth=2),v(d.colors)&&(d.colors=!1),v(d.customInspect)&&(d.customInspect=!0),d.colors&&(d.stylize=f),i(d,a,d.depth)}function f(a,b){var c=e.styles[b];return c?"["+e.colors[c][0]+"m"+a+"["+e.colors[c][1]+"m":a}function g(a,b){return a}function h(a){var b={};return a.forEach(function(a,c){b[a]=!0}),b}function i(a,b,d){if(a.customInspect&&b&&A(b.inspect)&&b.inspect!==c.inspect&&(!b.constructor||b.constructor.prototype!==b)){var e=b.inspect(d,a);return t(e)||(e=i(a,e,d)),e}var f=j(a,b);if(f)return f;var g=Object.keys(b),p=h(g);if(a.showHidden&&(g=Object.getOwnPropertyNames(b)),z(b)&&(g.indexOf("message")>=0||g.indexOf("description")>=0))return k(b);if(0===g.length){if(A(b)){var q=b.name?": "+b.name:"";return a.stylize("[Function"+q+"]","special")}if(w(b))return a.stylize(RegExp.prototype.toString.call(b),"regexp");if(y(b))return a.stylize(Date.prototype.toString.call(b),"date");if(z(b))return k(b)}var r="",s=!1,u=["{","}"];if(o(b)&&(s=!0,u=["[","]"]),A(b)){r=" [Function"+(b.name?": "+b.name:"")+"]"}if(w(b)&&(r=" "+RegExp.prototype.toString.call(b)),y(b)&&(r=" "+Date.prototype.toUTCString.call(b)),z(b)&&(r=" "+k(b)),0===g.length&&(!s||0==b.length))return u[0]+r+u[1];if(d<0)return w(b)?a.stylize(RegExp.prototype.toString.call(b),"regexp"):a.stylize("[Object]","special");a.seen.push(b);var v;return v=s?l(a,b,d,p,g):g.map(function(c){return m(a,b,d,p,c,s)}),a.seen.pop(),n(v,r,u)}function j(a,b){if(v(b))return a.stylize("undefined","undefined");if(t(b)){var c="'"+JSON.stringify(b).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return a.stylize(c,"string")}return s(b)?a.stylize(""+b,"number"):p(b)?a.stylize(""+b,"boolean"):q(b)?a.stylize("null","null"):void 0}function k(a){return"["+Error.prototype.toString.call(a)+"]"}function l(a,b,c,d,e){for(var f=[],g=0,h=b.length;g-1&&(h=f?h.split("\n").map(function(a){return" "+a}).join("\n").substr(2):"\n"+h.split("\n").map(function(a){return" "+a}).join("\n"))):h=a.stylize("[Circular]","special")),v(g)){if(f&&e.match(/^\d+$/))return h;g=JSON.stringify(""+e),g.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(g=g.substr(1,g.length-2),g=a.stylize(g,"name")):(g=g.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),g=a.stylize(g,"string"))}return g+": "+h}function n(a,b,c){var d=0;return a.reduce(function(a,b){return d++,b.indexOf("\n")>=0&&d++,a+b.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60?c[0]+(""===b?"":b+"\n ")+" "+a.join(",\n ")+" "+c[1]:c[0]+b+" "+a.join(", ")+" "+c[1]}function o(a){return Array.isArray(a)}function p(a){return"boolean"==typeof a}function q(a){return null===a}function r(a){return null==a}function s(a){return"number"==typeof a}function t(a){return"string"==typeof a}function u(a){return"symbol"==typeof a}function v(a){return void 0===a}function w(a){return x(a)&&"[object RegExp]"===C(a)}function x(a){return"object"==typeof a&&null!==a}function y(a){return x(a)&&"[object Date]"===C(a)}function z(a){return x(a)&&("[object Error]"===C(a)||a instanceof Error)}function A(a){return"function"==typeof a}function B(a){return null===a||"boolean"==typeof a||"number"==typeof a||"string"==typeof a||"symbol"==typeof a||void 0===a}function C(a){return Object.prototype.toString.call(a)}function D(a){return a<10?"0"+a.toString(10):a.toString(10)}function E(){var a=new Date,b=[D(a.getHours()),D(a.getMinutes()),D(a.getSeconds())].join(":");return[a.getDate(),J[a.getMonth()],b].join(" ")}function F(a,b){return Object.prototype.hasOwnProperty.call(a,b)}var G=/%[sdj%]/g;c.format=function(a){if(!t(a)){for(var b=[],c=0;c=f)return a;switch(a){case"%s":return String(d[c++]);case"%d":return Number(d[c++]);case"%j":try{return JSON.stringify(d[c++])}catch(b){return"[Circular]"}default:return a}}),h=d[c];c=0;d--){var e=a[d];"."===e?a.splice(d,1):".."===e?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c--;c)a.unshift("..");return a}function d(a){"string"!=typeof a&&(a+="");var b,c=0,d=-1,e=!0;for(b=a.length-1;b>=0;--b)if(47===a.charCodeAt(b)){if(!e){c=b+1;break}}else-1===d&&(e=!1,d=b+1);return-1===d?"":a.slice(c,d)}function e(a,b){if(a.filter)return a.filter(b);for(var c=[],d=0;d=-1&&!d;f--){var g=f>=0?arguments[f]:a.cwd();if("string"!=typeof g)throw new TypeError("Arguments to path.resolve must be strings");g&&(c=g+"/"+c,d="/"===g.charAt(0))}return c=b(e(c.split("/"),function(a){return!!a}),!d).join("/"),(d?"/":"")+c||"."},c.normalize=function(a){var d=c.isAbsolute(a),g="/"===f(a,-1);return a=b(e(a.split("/"),function(a){return!!a}),!d).join("/"),a||d||(a="."),a&&g&&(a+="/"),(d?"/":"")+a},c.isAbsolute=function(a){return"/"===a.charAt(0)},c.join=function(){var a=Array.prototype.slice.call(arguments,0);return c.normalize(e(a,function(a,b){if("string"!=typeof a)throw new TypeError("Arguments to path.join must be strings");return a}).join("/"))},c.relative=function(a,b){function d(a){for(var b=0;b=0&&""===a[c];c--);return b>c?[]:a.slice(b,c-b+1)}a=c.resolve(a).substr(1),b=c.resolve(b).substr(1);for(var e=d(a.split("/")),f=d(b.split("/")),g=Math.min(e.length,f.length),h=g,i=0;i=1;--f)if(47===(b=a.charCodeAt(f))){if(!e){d=f;break}}else e=!1;return-1===d?c?"/":".":c&&1===d?"/":a.slice(0,d)},c.basename=function(a,b){var c=d(a);return b&&c.substr(-1*b.length)===b&&(c=c.substr(0,c.length-b.length)),c},c.extname=function(a){"string"!=typeof a&&(a+="");for(var b=-1,c=0,d=-1,e=!0,f=0,g=a.length-1;g>=0;--g){var h=a.charCodeAt(g);if(47!==h)-1===d&&(e=!1,d=g+1),46===h?-1===b?b=g:1!==f&&(f=1):-1!==b&&(f=-1);else if(!e){c=g+1;break}}return-1===b||-1===d||0===f||1===f&&b===d-1&&b===c+1?"":a.slice(b,d)};var f="b"==="ab".substr(-1)?function(a,b,c){return a.substr(b,c)}:function(a,b,c){return b<0&&(b=a.length+b),a.substr(b,c)}}).call(this,a("_process"))},{_process:14}],14:[function(a,b,c){function d(){throw new Error("setTimeout has not been defined")}function e(){throw new Error("clearTimeout has not been defined")}function f(a){if(l===setTimeout)return setTimeout(a,0);if((l===d||!l)&&setTimeout)return l=setTimeout,setTimeout(a,0);try{return l(a,0)}catch(b){try{return l.call(null,a,0)}catch(b){return l.call(this,a,0)}}}function g(a){if(m===clearTimeout)return clearTimeout(a);if((m===e||!m)&&clearTimeout)return m=clearTimeout,clearTimeout(a);try{return m(a)}catch(b){try{return m.call(null,a)}catch(b){return m.call(this,a)}}}function h(){q&&o&&(q=!1,o.length?p=o.concat(p):r=-1,p.length&&i())}function i(){if(!q){var a=f(h);q=!0;for(var b=p.length;b;){for(o=p,p=[];++r1)for(var c=1;c"===p?j>o:">="===p?j>=o:"|"===p?j|o:"&"===p?j&o:"^"===p?j^o:"&&"===p?j&&o:"||"===p?j||o:c}if("Identifier"===e.type)return{}.hasOwnProperty.call(b,e.name)?b[e.name]:c;if("ThisExpression"===e.type)return{}.hasOwnProperty.call(b,"this")?b.this:c;if("CallExpression"===e.type){var q=a(e.callee);if(q===c)return c;if("function"!=typeof q)return c;var r=e.callee.object?a(e.callee.object):c;r===c&&(r=null);for(var s=[],i=0,j=e.arguments.length;i 1? yy.ast.set({ expression: { type: "union", value: $1 } }) : $$ = $1' ] ],
+
+ SUBSCRIPT_EXPRESSION_LIST: [
+ [ 'SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = [$1]'],
+ [ 'SUBSCRIPT_EXPRESSION_LIST , SUBSCRIPT_EXPRESSION_LISTABLE', '$$ = $1.concat($3)' ] ],
+
+ SUBSCRIPT_EXPRESSION_LISTABLE: [
+ [ 'INTEGER', '$$ = { expression: { type: "numeric_literal", value: parseInt($1) } }; yy.ast.set($$)' ],
+ [ 'STRING_LITERAL', '$$ = { expression: { type: "string_literal", value: $1 } }; yy.ast.set($$)' ],
+ [ 'ARRAY_SLICE', '$$ = { expression: { type: "slice", value: $1 } }; yy.ast.set($$)' ] ],
+
+ SUBSCRIPT_EXPRESSION: [
+ [ 'STAR', '$$ = { expression: { type: "wildcard", value: $1 } }; yy.ast.set($$)' ],
+ [ 'SCRIPT_EXPRESSION', '$$ = { expression: { type: "script_expression", value: $1 } }; yy.ast.set($$)' ],
+ [ 'FILTER_EXPRESSION', '$$ = { expression: { type: "filter_expression", value: $1 } }; yy.ast.set($$)' ] ],
+
+ STRING_LITERAL: [
+ [ 'QQ_STRING', "$$ = $1" ],
+ [ 'Q_STRING', "$$ = $1" ] ]
+ }
+};
+if (fs.readFileSync) {
+ grammar.moduleInclude = fs.readFileSync(require.resolve("../include/module.js"));
+ grammar.actionInclude = fs.readFileSync(require.resolve("../include/action.js"));
+}
+
+module.exports = grammar;
diff --git a/node_modules/jsonpath/lib/handlers.js b/node_modules/jsonpath/lib/handlers.js
new file mode 100644
index 00000000..c00e6b02
--- /dev/null
+++ b/node_modules/jsonpath/lib/handlers.js
@@ -0,0 +1,260 @@
+var aesprim = require('./aesprim');
+var slice = require('./slice');
+var _evaluate = require('static-eval');
+var _uniq = require('underscore').uniq;
+
+var Handlers = function() {
+ return this.initialize.apply(this, arguments);
+}
+
+Handlers.prototype.initialize = function() {
+ this.traverse = traverser(true);
+ this.descend = traverser();
+}
+
+Handlers.prototype.keys = Object.keys;
+
+Handlers.prototype.resolve = function(component) {
+
+ var key = [ component.operation, component.scope, component.expression.type ].join('-');
+ var method = this._fns[key];
+
+ if (!method) throw new Error("couldn't resolve key: " + key);
+ return method.bind(this);
+};
+
+Handlers.prototype.register = function(key, handler) {
+
+ if (!handler instanceof Function) {
+ throw new Error("handler must be a function");
+ }
+
+ this._fns[key] = handler;
+};
+
+Handlers.prototype._fns = {
+
+ 'member-child-identifier': function(component, partial) {
+ var key = component.expression.value;
+ var value = partial.value;
+ if (value instanceof Object && key in value) {
+ return [ { value: value[key], path: partial.path.concat(key) } ]
+ }
+ },
+
+ 'member-descendant-identifier':
+ _traverse(function(key, value, ref) { return key == ref }),
+
+ 'subscript-child-numeric_literal':
+ _descend(function(key, value, ref) { return key === ref }),
+
+ 'member-child-numeric_literal':
+ _descend(function(key, value, ref) { return String(key) === String(ref) }),
+
+ 'subscript-descendant-numeric_literal':
+ _traverse(function(key, value, ref) { return key === ref }),
+
+ 'member-child-wildcard':
+ _descend(function() { return true }),
+
+ 'member-descendant-wildcard':
+ _traverse(function() { return true }),
+
+ 'subscript-descendant-wildcard':
+ _traverse(function() { return true }),
+
+ 'subscript-child-wildcard':
+ _descend(function() { return true }),
+
+ 'subscript-child-slice': function(component, partial) {
+ if (is_array(partial.value)) {
+ var args = component.expression.value.split(':').map(_parse_nullable_int);
+ var values = partial.value.map(function(v, i) { return { value: v, path: partial.path.concat(i) } });
+ return slice.apply(null, [values].concat(args));
+ }
+ },
+
+ 'subscript-child-union': function(component, partial) {
+ var results = [];
+ component.expression.value.forEach(function(component) {
+ var _component = { operation: 'subscript', scope: 'child', expression: component.expression };
+ var handler = this.resolve(_component);
+ var _results = handler(_component, partial);
+ if (_results) {
+ results = results.concat(_results);
+ }
+ }, this);
+
+ return unique(results);
+ },
+
+ 'subscript-descendant-union': function(component, partial, count) {
+
+ var jp = require('..');
+ var self = this;
+
+ var results = [];
+ var nodes = jp.nodes(partial, '$..*').slice(1);
+
+ nodes.forEach(function(node) {
+ if (results.length >= count) return;
+ component.expression.value.forEach(function(component) {
+ var _component = { operation: 'subscript', scope: 'child', expression: component.expression };
+ var handler = self.resolve(_component);
+ var _results = handler(_component, node);
+ results = results.concat(_results);
+ });
+ });
+
+ return unique(results);
+ },
+
+ 'subscript-child-filter_expression': function(component, partial, count) {
+
+ // slice out the expression from ?(expression)
+ var src = component.expression.value.slice(2, -1);
+ var ast = aesprim.parse(src).body[0].expression;
+
+ var passable = function(key, value) {
+ return evaluate(ast, { '@': value });
+ }
+
+ return this.descend(partial, null, passable, count);
+
+ },
+
+ 'subscript-descendant-filter_expression': function(component, partial, count) {
+
+ // slice out the expression from ?(expression)
+ var src = component.expression.value.slice(2, -1);
+ var ast = aesprim.parse(src).body[0].expression;
+
+ var passable = function(key, value) {
+ return evaluate(ast, { '@': value });
+ }
+
+ return this.traverse(partial, null, passable, count);
+ },
+
+ 'subscript-child-script_expression': function(component, partial) {
+ var exp = component.expression.value.slice(1, -1);
+ return eval_recurse(partial, exp, '$[{{value}}]');
+ },
+
+ 'member-child-script_expression': function(component, partial) {
+ var exp = component.expression.value.slice(1, -1);
+ return eval_recurse(partial, exp, '$.{{value}}');
+ },
+
+ 'member-descendant-script_expression': function(component, partial) {
+ var exp = component.expression.value.slice(1, -1);
+ return eval_recurse(partial, exp, '$..value');
+ }
+};
+
+Handlers.prototype._fns['subscript-child-string_literal'] =
+ Handlers.prototype._fns['member-child-identifier'];
+
+Handlers.prototype._fns['member-descendant-numeric_literal'] =
+ Handlers.prototype._fns['subscript-descendant-string_literal'] =
+ Handlers.prototype._fns['member-descendant-identifier'];
+
+function eval_recurse(partial, src, template) {
+
+ var jp = require('./index');
+ var ast = aesprim.parse(src).body[0].expression;
+ var value = evaluate(ast, { '@': partial.value });
+ var path = template.replace(/\{\{\s*value\s*\}\}/g, value);
+
+ var results = jp.nodes(partial.value, path);
+ results.forEach(function(r) {
+ r.path = partial.path.concat(r.path.slice(1));
+ });
+
+ return results;
+}
+
+function is_array(val) {
+ return Array.isArray(val);
+}
+
+function is_object(val) {
+ // is this a non-array, non-null object?
+ return val && !(val instanceof Array) && val instanceof Object;
+}
+
+function traverser(recurse) {
+
+ return function(partial, ref, passable, count) {
+
+ var value = partial.value;
+ var path = partial.path;
+
+ var results = [];
+
+ var descend = function(value, path) {
+
+ if (is_array(value)) {
+ value.forEach(function(element, index) {
+ if (results.length >= count) { return }
+ if (passable(index, element, ref)) {
+ results.push({ path: path.concat(index), value: element });
+ }
+ });
+ value.forEach(function(element, index) {
+ if (results.length >= count) { return }
+ if (recurse) {
+ descend(element, path.concat(index));
+ }
+ });
+ } else if (is_object(value)) {
+ this.keys(value).forEach(function(k) {
+ if (results.length >= count) { return }
+ if (passable(k, value[k], ref)) {
+ results.push({ path: path.concat(k), value: value[k] });
+ }
+ })
+ this.keys(value).forEach(function(k) {
+ if (results.length >= count) { return }
+ if (recurse) {
+ descend(value[k], path.concat(k));
+ }
+ });
+ }
+ }.bind(this);
+ descend(value, path);
+ return results;
+ }
+}
+
+function _descend(passable) {
+ return function(component, partial, count) {
+ return this.descend(partial, component.expression.value, passable, count);
+ }
+}
+
+function _traverse(passable) {
+ return function(component, partial, count) {
+ return this.traverse(partial, component.expression.value, passable, count);
+ }
+}
+
+function evaluate() {
+ try { return _evaluate.apply(this, arguments) }
+ catch (e) { }
+}
+
+function unique(results) {
+ results = results.filter(function(d) { return d })
+ return _uniq(
+ results,
+ function(r) { return r.path.map(function(c) { return String(c).replace('-', '--') }).join('-') }
+ );
+}
+
+function _parse_nullable_int(val) {
+ var sval = String(val);
+ return sval.match(/^-?[0-9]+$/) ? parseInt(sval) : null;
+}
+
+module.exports = Handlers;
diff --git a/node_modules/jsonpath/lib/index.js b/node_modules/jsonpath/lib/index.js
new file mode 100644
index 00000000..8f5a832a
--- /dev/null
+++ b/node_modules/jsonpath/lib/index.js
@@ -0,0 +1,249 @@
+var assert = require('assert');
+var dict = require('./dict');
+var Parser = require('./parser');
+var Handlers = require('./handlers');
+
+var JSONPath = function() {
+ this.initialize.apply(this, arguments);
+};
+
+JSONPath.prototype.initialize = function() {
+ this.parser = new Parser();
+ this.handlers = new Handlers();
+};
+
+JSONPath.prototype.parse = function(string) {
+ assert.ok(_is_string(string), "we need a path");
+ return this.parser.parse(string);
+};
+
+JSONPath.prototype.parent = function(obj, string) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ var node = this.nodes(obj, string)[0];
+ var key = node.path.pop(); /* jshint unused:false */
+ return this.value(obj, node.path);
+}
+
+JSONPath.prototype.apply = function(obj, string, fn) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+ assert.equal(typeof fn, "function", "fn needs to be function")
+
+ var nodes = this.nodes(obj, string).sort(function(a, b) {
+ // sort nodes so we apply from the bottom up
+ return b.path.length - a.path.length;
+ });
+
+ nodes.forEach(function(node) {
+ var key = node.path.pop();
+ var parent = this.value(obj, this.stringify(node.path));
+ var val = node.value = fn.call(obj, parent[key]);
+ parent[key] = val;
+ }, this);
+
+ return nodes;
+}
+
+JSONPath.prototype.value = function(obj, path, value) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(path, "we need a path");
+
+ if (arguments.length >= 3) {
+ var node = this.nodes(obj, path).shift();
+ if (!node) return this._vivify(obj, path, value);
+ var key = node.path.slice(-1).shift();
+ var parent = this.parent(obj, this.stringify(node.path));
+ parent[key] = value;
+ }
+ return this.query(obj, this.stringify(path), 1).shift();
+}
+
+JSONPath.prototype._vivify = function(obj, string, value) {
+
+ var self = this;
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ var path = this.parser.parse(string)
+ .map(function(component) { return component.expression.value });
+
+ var setValue = function(path, value) {
+ var key = path.pop();
+ var node = self.value(obj, path);
+ if (!node) {
+ setValue(path.concat(), typeof key === 'string' ? {} : []);
+ node = self.value(obj, path);
+ }
+ node[key] = value;
+ }
+ setValue(path, value);
+ return this.query(obj, string)[0];
+}
+
+JSONPath.prototype.query = function(obj, string, count) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(_is_string(string), "we need a path");
+
+ var results = this.nodes(obj, string, count)
+ .map(function(r) { return r.value });
+
+ return results;
+};
+
+JSONPath.prototype.paths = function(obj, string, count) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ var results = this.nodes(obj, string, count)
+ .map(function(r) { return r.path });
+
+ return results;
+};
+
+JSONPath.prototype.nodes = function(obj, string, count) {
+
+ assert.ok(obj instanceof Object, "obj needs to be an object");
+ assert.ok(string, "we need a path");
+
+ if (count === 0) return [];
+
+ var path = this.parser.parse(string);
+ var handlers = this.handlers;
+
+ var partials = [ { path: ['$'], value: obj } ];
+ var matches = [];
+
+ if (path.length && path[0].expression.type == 'root') path.shift();
+
+ if (!path.length) return partials;
+
+ path.forEach(function(component, index) {
+
+ if (matches.length >= count) return;
+ var handler = handlers.resolve(component);
+ var _partials = [];
+
+ partials.forEach(function(p) {
+
+ if (matches.length >= count) return;
+ var results = handler(component, p, count);
+
+ if (index == path.length - 1) {
+ // if we're through the components we're done
+ matches = matches.concat(results || []);
+ } else {
+ // otherwise accumulate and carry on through
+ _partials = _partials.concat(results || []);
+ }
+ });
+
+ partials = _partials;
+
+ });
+
+ return count ? matches.slice(0, count) : matches;
+};
+
+JSONPath.prototype.stringify = function(path) {
+
+ assert.ok(path, "we need a path");
+
+ var string = '$';
+
+ var templates = {
+ 'descendant-member': '..{{value}}',
+ 'child-member': '.{{value}}',
+ 'descendant-subscript': '..[{{value}}]',
+ 'child-subscript': '[{{value}}]'
+ };
+
+ path = this._normalize(path);
+
+ path.forEach(function(component) {
+
+ if (component.expression.type == 'root') return;
+
+ var key = [component.scope, component.operation].join('-');
+ var template = templates[key];
+ var value;
+
+ if (component.expression.type == 'string_literal') {
+ value = JSON.stringify(component.expression.value)
+ } else {
+ value = component.expression.value;
+ }
+
+ if (!template) throw new Error("couldn't find template " + key);
+
+ string += template.replace(/{{value}}/, value);
+ });
+
+ return string;
+}
+
+JSONPath.prototype._normalize = function(path) {
+
+ assert.ok(path, "we need a path");
+
+ if (typeof path == "string") {
+
+ return this.parser.parse(path);
+
+ } else if (Array.isArray(path) && typeof path[0] == "string") {
+
+ var _path = [ { expression: { type: "root", value: "$" } } ];
+
+ path.forEach(function(component, index) {
+
+ if (component == '$' && index === 0) return;
+
+ if (typeof component == "string" && component.match("^" + dict.identifier + "$")) {
+
+ _path.push({
+ operation: 'member',
+ scope: 'child',
+ expression: { value: component, type: 'identifier' }
+ });
+
+ } else {
+
+ var type = typeof component == "number" ?
+ 'numeric_literal' : 'string_literal';
+
+ _path.push({
+ operation: 'subscript',
+ scope: 'child',
+ expression: { value: component, type: type }
+ });
+ }
+ });
+
+ return _path;
+
+ } else if (Array.isArray(path) && typeof path[0] == "object") {
+
+ return path
+ }
+
+ throw new Error("couldn't understand path " + path);
+}
+
+function _is_string(obj) {
+ return Object.prototype.toString.call(obj) == '[object String]';
+}
+
+JSONPath.Handlers = Handlers;
+JSONPath.Parser = Parser;
+
+var instance = new JSONPath;
+instance.JSONPath = JSONPath;
+
+module.exports = instance;
diff --git a/node_modules/jsonpath/lib/parser.js b/node_modules/jsonpath/lib/parser.js
new file mode 100644
index 00000000..568ec43e
--- /dev/null
+++ b/node_modules/jsonpath/lib/parser.js
@@ -0,0 +1,21 @@
+var grammar = require('./grammar');
+var gparser = require('../generated/parser');
+
+var Parser = function() {
+
+ var parser = new gparser.Parser();
+
+ var _parseError = parser.parseError;
+ parser.yy.parseError = function() {
+ if (parser.yy.ast) {
+ parser.yy.ast.initialize();
+ }
+ _parseError.apply(parser, arguments);
+ }
+
+ return parser;
+
+};
+
+Parser.grammar = grammar;
+module.exports = Parser;
diff --git a/node_modules/jsonpath/lib/slice.js b/node_modules/jsonpath/lib/slice.js
new file mode 100644
index 00000000..530e21e8
--- /dev/null
+++ b/node_modules/jsonpath/lib/slice.js
@@ -0,0 +1,41 @@
+module.exports = function(arr, start, end, step) {
+
+ if (typeof start == 'string') throw new Error("start cannot be a string");
+ if (typeof end == 'string') throw new Error("end cannot be a string");
+ if (typeof step == 'string') throw new Error("step cannot be a string");
+
+ var len = arr.length;
+
+ if (step === 0) throw new Error("step cannot be zero");
+ step = step ? integer(step) : 1;
+
+ // normalize negative values
+ start = start < 0 ? len + start : start;
+ end = end < 0 ? len + end : end;
+
+ // default extents to extents
+ start = integer(start === 0 ? 0 : !start ? (step > 0 ? 0 : len - 1) : start);
+ end = integer(end === 0 ? 0 : !end ? (step > 0 ? len : -1) : end);
+
+ // clamp extents
+ start = step > 0 ? Math.max(0, start) : Math.min(len, start);
+ end = step > 0 ? Math.min(end, len) : Math.max(-1, end);
+
+ // return empty if extents are backwards
+ if (step > 0 && end <= start) return [];
+ if (step < 0 && start <= end) return [];
+
+ var result = [];
+
+ for (var i = start; i != end; i += step) {
+ if ((step < 0 && i <= end) || (step > 0 && i >= end)) break;
+ result.push(arr[i]);
+ }
+
+ return result;
+}
+
+function integer(val) {
+ return String(val).match(/^[0-9]+$/) ? parseInt(val) :
+ Number.isFinite(val) ? parseInt(val, 10) : 0;
+}
diff --git a/node_modules/jsonpath/node_modules/.bin/esparse b/node_modules/jsonpath/node_modules/.bin/esparse
new file mode 100644
index 00000000..735d8546
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/.bin/esparse
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../esprima/bin/esparse.js" "$@"
+ ret=$?
+else
+ node "$basedir/../esprima/bin/esparse.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/jsonpath/node_modules/.bin/esparse.cmd b/node_modules/jsonpath/node_modules/.bin/esparse.cmd
new file mode 100644
index 00000000..b8c6a634
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/.bin/esparse.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\esprima\bin\esparse.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/jsonpath/node_modules/.bin/esparse.ps1 b/node_modules/jsonpath/node_modules/.bin/esparse.ps1
new file mode 100644
index 00000000..567aea30
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/.bin/esparse.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../esprima/bin/esparse.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../esprima/bin/esparse.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/jsonpath/node_modules/.bin/esvalidate b/node_modules/jsonpath/node_modules/.bin/esvalidate
new file mode 100644
index 00000000..d278bc70
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/.bin/esvalidate
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../esprima/bin/esvalidate.js" "$@"
+ ret=$?
+else
+ node "$basedir/../esprima/bin/esvalidate.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/jsonpath/node_modules/.bin/esvalidate.cmd b/node_modules/jsonpath/node_modules/.bin/esvalidate.cmd
new file mode 100644
index 00000000..74859bdc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/.bin/esvalidate.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\esprima\bin\esvalidate.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/jsonpath/node_modules/.bin/esvalidate.ps1 b/node_modules/jsonpath/node_modules/.bin/esvalidate.ps1
new file mode 100644
index 00000000..b1ed174b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/.bin/esvalidate.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../esprima/bin/esvalidate.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../esprima/bin/esvalidate.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/jsonpath/node_modules/esprima/README.md b/node_modules/jsonpath/node_modules/esprima/README.md
new file mode 100644
index 00000000..e76d7640
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/README.md
@@ -0,0 +1,24 @@
+**Esprima** ([esprima.org](http://esprima.org), BSD license) is a high performance,
+standard-compliant [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
+parser written in ECMAScript (also popularly known as
+[JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript)).
+Esprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat),
+with the help of [many contributors](https://github.com/ariya/esprima/contributors).
+
+### Features
+
+- Full support for ECMAScript 5.1 ([ECMA-262](http://www.ecma-international.org/publications/standards/Ecma-262.htm))
+- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla
+[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)
+- Optional tracking of syntax node location (index-based and line-column)
+- Heavily tested (> 650 [unit tests](http://esprima.org/test/) with [full code coverage](http://esprima.org/test/coverage.html))
+- [Partial support](http://esprima.org/doc/es6.html) for ECMAScript 6
+
+Esprima serves as a **building block** for some JavaScript
+language tools, from [code instrumentation](http://esprima.org/demo/functiontrace.html)
+to [editor autocompletion](http://esprima.org/demo/autocomplete.html).
+
+Esprima runs on many popular web browsers, as well as other ECMAScript platforms such as
+[Rhino](http://www.mozilla.org/rhino), [Nashorn](http://openjdk.java.net/projects/nashorn/), and [Node.js](https://npmjs.org/package/esprima).
+
+For more information, check the web site [esprima.org](http://esprima.org).
diff --git a/node_modules/jsonpath/node_modules/esprima/esprima.js b/node_modules/jsonpath/node_modules/esprima/esprima.js
new file mode 100644
index 00000000..593021f5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/esprima.js
@@ -0,0 +1,3756 @@
+/*
+ Copyright (C) 2013 Ariya Hidayat
+ Copyright (C) 2013 Thaddee Tyl
+ Copyright (C) 2013 Mathias Bynens
+ Copyright (C) 2012 Ariya Hidayat
+ Copyright (C) 2012 Mathias Bynens
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Kris Kowal
+ Copyright (C) 2012 Yusuke Suzuki
+ Copyright (C) 2012 Arpad Borsos
+ Copyright (C) 2011 Ariya Hidayat
+
+ 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.
+
+ 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 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.
+*/
+
+/*jslint bitwise:true plusplus:true */
+/*global esprima:true, define:true, exports:true, window: true,
+throwErrorTolerant: true,
+throwError: true, generateStatement: true, peek: true,
+parseAssignmentExpression: true, parseBlock: true, parseExpression: true,
+parseFunctionDeclaration: true, parseFunctionExpression: true,
+parseFunctionSourceElements: true, parseVariableIdentifier: true,
+parseLeftHandSideExpression: true,
+parseUnaryExpression: true,
+parseStatement: true, parseSourceElement: true */
+
+(function (root, factory) {
+ 'use strict';
+
+ // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
+ // Rhino, and plain browser loading.
+
+ /* istanbul ignore next */
+ if (typeof define === 'function' && define.amd) {
+ define(['exports'], factory);
+ } else if (typeof exports !== 'undefined') {
+ factory(exports);
+ } else {
+ factory((root.esprima = {}));
+ }
+}(this, function (exports) {
+ 'use strict';
+
+ var Token,
+ TokenName,
+ FnExprTokens,
+ Syntax,
+ PropertyKind,
+ Messages,
+ Regex,
+ SyntaxTreeDelegate,
+ source,
+ strict,
+ index,
+ lineNumber,
+ lineStart,
+ length,
+ delegate,
+ lookahead,
+ state,
+ extra;
+
+ Token = {
+ BooleanLiteral: 1,
+ EOF: 2,
+ Identifier: 3,
+ Keyword: 4,
+ NullLiteral: 5,
+ NumericLiteral: 6,
+ Punctuator: 7,
+ StringLiteral: 8,
+ RegularExpression: 9
+ };
+
+ TokenName = {};
+ TokenName[Token.BooleanLiteral] = 'Boolean';
+ TokenName[Token.EOF] = '';
+ TokenName[Token.Identifier] = 'Identifier';
+ TokenName[Token.Keyword] = 'Keyword';
+ TokenName[Token.NullLiteral] = 'Null';
+ TokenName[Token.NumericLiteral] = 'Numeric';
+ TokenName[Token.Punctuator] = 'Punctuator';
+ TokenName[Token.StringLiteral] = 'String';
+ TokenName[Token.RegularExpression] = 'RegularExpression';
+
+ // A function following one of those tokens is an expression.
+ FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
+ 'return', 'case', 'delete', 'throw', 'void',
+ // assignment operators
+ '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=',
+ '&=', '|=', '^=', ',',
+ // binary/unary operators
+ '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
+ '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
+ '<=', '<', '>', '!=', '!=='];
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ ArrayExpression: 'ArrayExpression',
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ Program: 'Program',
+ Property: 'Property',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement'
+ };
+
+ PropertyKind = {
+ Data: 1,
+ Get: 2,
+ Set: 4
+ };
+
+ // Error messages should be identical to V8.
+ Messages = {
+ UnexpectedToken: 'Unexpected token %0',
+ UnexpectedNumber: 'Unexpected number',
+ UnexpectedString: 'Unexpected string',
+ UnexpectedIdentifier: 'Unexpected identifier',
+ UnexpectedReserved: 'Unexpected reserved word',
+ UnexpectedEOS: 'Unexpected end of input',
+ NewlineAfterThrow: 'Illegal newline after throw',
+ InvalidRegExp: 'Invalid regular expression',
+ UnterminatedRegExp: 'Invalid regular expression: missing /',
+ InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
+ InvalidLHSInForIn: 'Invalid left-hand side in for-in',
+ MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
+ NoCatchOrFinally: 'Missing catch or finally after try',
+ UnknownLabel: 'Undefined label \'%0\'',
+ Redeclaration: '%0 \'%1\' has already been declared',
+ IllegalContinue: 'Illegal continue statement',
+ IllegalBreak: 'Illegal break statement',
+ IllegalReturn: 'Illegal return statement',
+ StrictModeWith: 'Strict mode code may not include a with statement',
+ StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
+ StrictVarName: 'Variable name may not be eval or arguments in strict mode',
+ StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
+ StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
+ StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
+ StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
+ StrictDelete: 'Delete of an unqualified identifier in strict mode.',
+ StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode',
+ AccessorDataProperty: 'Object literal may not have data and accessor property with the same name',
+ AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name',
+ StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
+ StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictReservedWord: 'Use of future reserved word in strict mode'
+ };
+
+ // See also tools/generate-unicode-regex.py.
+ Regex = {
+ NonAsciiIdentifierStart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]'),
+ NonAsciiIdentifierPart: new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0\u08A2-\u08AC\u08E4-\u08FE\u0900-\u0963\u0966-\u096F\u0971-\u0977\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1D00-\u1DE6\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA697\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]')
+ };
+
+ // Ensure the condition is true, otherwise throw an error.
+ // This is only to have a better contract semantic, i.e. another safety net
+ // to catch a logic error. The condition shall be fulfilled in normal case.
+ // Do NOT use this to enforce a certain condition on any user input.
+
+ function assert(condition, message) {
+ /* istanbul ignore if */
+ if (!condition) {
+ throw new Error('ASSERT: ' + message);
+ }
+ }
+
+ function isDecimalDigit(ch) {
+ return (ch >= 48 && ch <= 57); // 0..9
+ }
+
+ function isHexDigit(ch) {
+ return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;
+ }
+
+ function isOctalDigit(ch) {
+ return '01234567'.indexOf(ch) >= 0;
+ }
+
+
+ // 7.2 White Space
+
+ function isWhiteSpace(ch) {
+ return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||
+ (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0);
+ }
+
+ // 7.3 Line Terminators
+
+ function isLineTerminator(ch) {
+ return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029);
+ }
+
+ // 7.6 Identifier Names and Identifiers
+
+ function isIdentifierStart(ch) {
+ return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)
+ (ch >= 0x41 && ch <= 0x5A) || // A..Z
+ (ch >= 0x61 && ch <= 0x7A) || // a..z
+ (ch === 0x5C) || // \ (backslash)
+ ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));
+ }
+
+ function isIdentifierPart(ch) {
+ return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore)
+ (ch >= 0x41 && ch <= 0x5A) || // A..Z
+ (ch >= 0x61 && ch <= 0x7A) || // a..z
+ (ch >= 0x30 && ch <= 0x39) || // 0..9
+ (ch === 0x5C) || // \ (backslash)
+ ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));
+ }
+
+ // 7.6.1.2 Future Reserved Words
+
+ function isFutureReservedWord(id) {
+ switch (id) {
+ case 'class':
+ case 'enum':
+ case 'export':
+ case 'extends':
+ case 'import':
+ case 'super':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isStrictModeReservedWord(id) {
+ switch (id) {
+ case 'implements':
+ case 'interface':
+ case 'package':
+ case 'private':
+ case 'protected':
+ case 'public':
+ case 'static':
+ case 'yield':
+ case 'let':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isRestrictedWord(id) {
+ return id === 'eval' || id === 'arguments';
+ }
+
+ // 7.6.1.1 Keywords
+
+ function isKeyword(id) {
+ if (strict && isStrictModeReservedWord(id)) {
+ return true;
+ }
+
+ // 'const' is specialized as Keyword in V8.
+ // 'yield' and 'let' are for compatiblity with SpiderMonkey and ES.next.
+ // Some others are from future reserved words.
+
+ switch (id.length) {
+ case 2:
+ return (id === 'if') || (id === 'in') || (id === 'do');
+ case 3:
+ return (id === 'var') || (id === 'for') || (id === 'new') ||
+ (id === 'try') || (id === 'let');
+ case 4:
+ return (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum');
+ case 5:
+ return (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') ||
+ (id === 'class') || (id === 'super');
+ case 6:
+ return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
+ (id === 'switch') || (id === 'export') || (id === 'import');
+ case 7:
+ return (id === 'default') || (id === 'finally') || (id === 'extends');
+ case 8:
+ return (id === 'function') || (id === 'continue') || (id === 'debugger');
+ case 10:
+ return (id === 'instanceof');
+ default:
+ return false;
+ }
+ }
+
+ // 7.4 Comments
+
+ function addComment(type, value, start, end, loc) {
+ var comment, attacher;
+
+ assert(typeof start === 'number', 'Comment must have valid position');
+
+ // Because the way the actual token is scanned, often the comments
+ // (if any) are skipped twice during the lexical analysis.
+ // Thus, we need to skip adding a comment if the comment array already
+ // handled it.
+ if (state.lastCommentStart >= start) {
+ return;
+ }
+ state.lastCommentStart = start;
+
+ comment = {
+ type: type,
+ value: value
+ };
+ if (extra.range) {
+ comment.range = [start, end];
+ }
+ if (extra.loc) {
+ comment.loc = loc;
+ }
+ extra.comments.push(comment);
+ if (extra.attachComment) {
+ extra.leadingComments.push(comment);
+ extra.trailingComments.push(comment);
+ }
+ }
+
+ function skipSingleLineComment(offset) {
+ var start, loc, ch, comment;
+
+ start = index - offset;
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart - offset
+ }
+ };
+
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ ++index;
+ if (isLineTerminator(ch)) {
+ if (extra.comments) {
+ comment = source.slice(start + offset, index - 1);
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart - 1
+ };
+ addComment('Line', comment, start, index - 1, loc);
+ }
+ if (ch === 13 && source.charCodeAt(index) === 10) {
+ ++index;
+ }
+ ++lineNumber;
+ lineStart = index;
+ return;
+ }
+ }
+
+ if (extra.comments) {
+ comment = source.slice(start + offset, index);
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+ addComment('Line', comment, start, index, loc);
+ }
+ }
+
+ function skipMultiLineComment() {
+ var start, loc, ch, comment;
+
+ if (extra.comments) {
+ start = index - 2;
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart - 2
+ }
+ };
+ }
+
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ if (isLineTerminator(ch)) {
+ if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {
+ ++index;
+ }
+ ++lineNumber;
+ ++index;
+ lineStart = index;
+ if (index >= length) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ } else if (ch === 0x2A) {
+ // Block comment ends with '*/'.
+ if (source.charCodeAt(index + 1) === 0x2F) {
+ ++index;
+ ++index;
+ if (extra.comments) {
+ comment = source.slice(start + 2, index - 2);
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+ addComment('Block', comment, start, index, loc);
+ }
+ return;
+ }
+ ++index;
+ } else {
+ ++index;
+ }
+ }
+
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ function skipComment() {
+ var ch, start;
+
+ start = (index === 0);
+ while (index < length) {
+ ch = source.charCodeAt(index);
+
+ if (isWhiteSpace(ch)) {
+ ++index;
+ } else if (isLineTerminator(ch)) {
+ ++index;
+ if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {
+ ++index;
+ }
+ ++lineNumber;
+ lineStart = index;
+ start = true;
+ } else if (ch === 0x2F) { // U+002F is '/'
+ ch = source.charCodeAt(index + 1);
+ if (ch === 0x2F) {
+ ++index;
+ ++index;
+ skipSingleLineComment(2);
+ start = true;
+ } else if (ch === 0x2A) { // U+002A is '*'
+ ++index;
+ ++index;
+ skipMultiLineComment();
+ } else {
+ break;
+ }
+ } else if (start && ch === 0x2D) { // U+002D is '-'
+ // U+003E is '>'
+ if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {
+ // '-->' is a single-line comment
+ index += 3;
+ skipSingleLineComment(3);
+ } else {
+ break;
+ }
+ } else if (ch === 0x3C) { // U+003C is '<'
+ if (source.slice(index + 1, index + 4) === '!--') {
+ ++index; // `<`
+ ++index; // `!`
+ ++index; // `-`
+ ++index; // `-`
+ skipSingleLineComment(4);
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ function scanHexEscape(prefix) {
+ var i, len, ch, code = 0;
+
+ len = (prefix === 'u') ? 4 : 2;
+ for (i = 0; i < len; ++i) {
+ if (index < length && isHexDigit(source[index])) {
+ ch = source[index++];
+ code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
+ } else {
+ return '';
+ }
+ }
+ return String.fromCharCode(code);
+ }
+
+ function getEscapedIdentifier() {
+ var ch, id;
+
+ ch = source.charCodeAt(index++);
+ id = String.fromCharCode(ch);
+
+ // '\u' (U+005C, U+0075) denotes an escaped character.
+ if (ch === 0x5C) {
+ if (source.charCodeAt(index) !== 0x75) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ ++index;
+ ch = scanHexEscape('u');
+ if (!ch || ch === '\\' || !isIdentifierStart(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ id = ch;
+ }
+
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ if (!isIdentifierPart(ch)) {
+ break;
+ }
+ ++index;
+ id += String.fromCharCode(ch);
+
+ // '\u' (U+005C, U+0075) denotes an escaped character.
+ if (ch === 0x5C) {
+ id = id.substr(0, id.length - 1);
+ if (source.charCodeAt(index) !== 0x75) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ ++index;
+ ch = scanHexEscape('u');
+ if (!ch || ch === '\\' || !isIdentifierPart(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ id += ch;
+ }
+ }
+
+ return id;
+ }
+
+ function getIdentifier() {
+ var start, ch;
+
+ start = index++;
+ while (index < length) {
+ ch = source.charCodeAt(index);
+ if (ch === 0x5C) {
+ // Blackslash (U+005C) marks Unicode escape sequence.
+ index = start;
+ return getEscapedIdentifier();
+ }
+ if (isIdentifierPart(ch)) {
+ ++index;
+ } else {
+ break;
+ }
+ }
+
+ return source.slice(start, index);
+ }
+
+ function scanIdentifier() {
+ var start, id, type;
+
+ start = index;
+
+ // Backslash (U+005C) starts an escaped character.
+ id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier();
+
+ // There is no keyword or literal with only one character.
+ // Thus, it must be an identifier.
+ if (id.length === 1) {
+ type = Token.Identifier;
+ } else if (isKeyword(id)) {
+ type = Token.Keyword;
+ } else if (id === 'null') {
+ type = Token.NullLiteral;
+ } else if (id === 'true' || id === 'false') {
+ type = Token.BooleanLiteral;
+ } else {
+ type = Token.Identifier;
+ }
+
+ return {
+ type: type,
+ value: id,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+
+ // 7.7 Punctuators
+
+ function scanPunctuator() {
+ var start = index,
+ code = source.charCodeAt(index),
+ code2,
+ ch1 = source[index],
+ ch2,
+ ch3,
+ ch4;
+
+ switch (code) {
+
+ // Check for most common single-character punctuators.
+ case 0x2E: // . dot
+ case 0x28: // ( open bracket
+ case 0x29: // ) close bracket
+ case 0x3B: // ; semicolon
+ case 0x2C: // , comma
+ case 0x7B: // { open curly brace
+ case 0x7D: // } close curly brace
+ case 0x5B: // [
+ case 0x5D: // ]
+ case 0x3A: // :
+ case 0x3F: // ?
+ case 0x7E: // ~
+ ++index;
+ if (extra.tokenize) {
+ if (code === 0x28) {
+ extra.openParenToken = extra.tokens.length;
+ } else if (code === 0x7B) {
+ extra.openCurlyToken = extra.tokens.length;
+ }
+ }
+ return {
+ type: Token.Punctuator,
+ value: String.fromCharCode(code),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+
+ default:
+ code2 = source.charCodeAt(index + 1);
+
+ // '=' (U+003D) marks an assignment or comparison operator.
+ if (code2 === 0x3D) {
+ switch (code) {
+ case 0x2B: // +
+ case 0x2D: // -
+ case 0x2F: // /
+ case 0x3C: // <
+ case 0x3E: // >
+ case 0x5E: // ^
+ case 0x7C: // |
+ case 0x25: // %
+ case 0x26: // &
+ case 0x2A: // *
+ index += 2;
+ return {
+ type: Token.Punctuator,
+ value: String.fromCharCode(code) + String.fromCharCode(code2),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+
+ case 0x21: // !
+ case 0x3D: // =
+ index += 2;
+
+ // !== and ===
+ if (source.charCodeAt(index) === 0x3D) {
+ ++index;
+ }
+ return {
+ type: Token.Punctuator,
+ value: source.slice(start, index),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+ }
+ }
+
+ // 4-character punctuator: >>>=
+
+ ch4 = source.substr(index, 4);
+
+ if (ch4 === '>>>=') {
+ index += 4;
+ return {
+ type: Token.Punctuator,
+ value: ch4,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // 3-character punctuators: === !== >>> <<= >>=
+
+ ch3 = ch4.substr(0, 3);
+
+ if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') {
+ index += 3;
+ return {
+ type: Token.Punctuator,
+ value: ch3,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // Other 2-character punctuators: ++ -- << >> && ||
+ ch2 = ch3.substr(0, 2);
+
+ if ((ch1 === ch2[1] && ('+-<>&|'.indexOf(ch1) >= 0)) || ch2 === '=>') {
+ index += 2;
+ return {
+ type: Token.Punctuator,
+ value: ch2,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // 1-character punctuators: < > = ! + - * % & | ^ /
+ if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
+ ++index;
+ return {
+ type: Token.Punctuator,
+ value: ch1,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ // 7.8.3 Numeric Literals
+
+ function scanHexLiteral(start) {
+ var number = '';
+
+ while (index < length) {
+ if (!isHexDigit(source[index])) {
+ break;
+ }
+ number += source[index++];
+ }
+
+ if (number.length === 0) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ if (isIdentifierStart(source.charCodeAt(index))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.NumericLiteral,
+ value: parseInt('0x' + number, 16),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ function scanOctalLiteral(start) {
+ var number = '0' + source[index++];
+ while (index < length) {
+ if (!isOctalDigit(source[index])) {
+ break;
+ }
+ number += source[index++];
+ }
+
+ if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.NumericLiteral,
+ value: parseInt(number, 8),
+ octal: true,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ function scanNumericLiteral() {
+ var number, start, ch;
+
+ ch = source[index];
+ assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
+ 'Numeric literal must start with a decimal digit or a decimal point');
+
+ start = index;
+ number = '';
+ if (ch !== '.') {
+ number = source[index++];
+ ch = source[index];
+
+ // Hex number starts with '0x'.
+ // Octal number starts with '0'.
+ if (number === '0') {
+ if (ch === 'x' || ch === 'X') {
+ ++index;
+ return scanHexLiteral(start);
+ }
+ if (isOctalDigit(ch)) {
+ return scanOctalLiteral(start);
+ }
+
+ // decimal number starts with '0' such as '09' is illegal.
+ if (ch && isDecimalDigit(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ }
+
+ while (isDecimalDigit(source.charCodeAt(index))) {
+ number += source[index++];
+ }
+ ch = source[index];
+ }
+
+ if (ch === '.') {
+ number += source[index++];
+ while (isDecimalDigit(source.charCodeAt(index))) {
+ number += source[index++];
+ }
+ ch = source[index];
+ }
+
+ if (ch === 'e' || ch === 'E') {
+ number += source[index++];
+
+ ch = source[index];
+ if (ch === '+' || ch === '-') {
+ number += source[index++];
+ }
+ if (isDecimalDigit(source.charCodeAt(index))) {
+ while (isDecimalDigit(source.charCodeAt(index))) {
+ number += source[index++];
+ }
+ } else {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ }
+
+ if (isIdentifierStart(source.charCodeAt(index))) {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.NumericLiteral,
+ value: parseFloat(number),
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ // 7.8.4 String Literals
+
+ function scanStringLiteral() {
+ var str = '', quote, start, ch, code, unescaped, restore, octal = false, startLineNumber, startLineStart;
+ startLineNumber = lineNumber;
+ startLineStart = lineStart;
+
+ quote = source[index];
+ assert((quote === '\'' || quote === '"'),
+ 'String literal must starts with a quote');
+
+ start = index;
+ ++index;
+
+ while (index < length) {
+ ch = source[index++];
+
+ if (ch === quote) {
+ quote = '';
+ break;
+ } else if (ch === '\\') {
+ ch = source[index++];
+ if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
+ switch (ch) {
+ case 'u':
+ case 'x':
+ restore = index;
+ unescaped = scanHexEscape(ch);
+ if (unescaped) {
+ str += unescaped;
+ } else {
+ index = restore;
+ str += ch;
+ }
+ break;
+ case 'n':
+ str += '\n';
+ break;
+ case 'r':
+ str += '\r';
+ break;
+ case 't':
+ str += '\t';
+ break;
+ case 'b':
+ str += '\b';
+ break;
+ case 'f':
+ str += '\f';
+ break;
+ case 'v':
+ str += '\x0B';
+ break;
+
+ default:
+ if (isOctalDigit(ch)) {
+ code = '01234567'.indexOf(ch);
+
+ // \0 is not octal escape sequence
+ if (code !== 0) {
+ octal = true;
+ }
+
+ if (index < length && isOctalDigit(source[index])) {
+ octal = true;
+ code = code * 8 + '01234567'.indexOf(source[index++]);
+
+ // 3 digits are only allowed when string starts
+ // with 0, 1, 2, 3
+ if ('0123'.indexOf(ch) >= 0 &&
+ index < length &&
+ isOctalDigit(source[index])) {
+ code = code * 8 + '01234567'.indexOf(source[index++]);
+ }
+ }
+ str += String.fromCharCode(code);
+ } else {
+ str += ch;
+ }
+ break;
+ }
+ } else {
+ ++lineNumber;
+ if (ch === '\r' && source[index] === '\n') {
+ ++index;
+ }
+ lineStart = index;
+ }
+ } else if (isLineTerminator(ch.charCodeAt(0))) {
+ break;
+ } else {
+ str += ch;
+ }
+ }
+
+ if (quote !== '') {
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+
+ return {
+ type: Token.StringLiteral,
+ value: str,
+ octal: octal,
+ startLineNumber: startLineNumber,
+ startLineStart: startLineStart,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ function testRegExp(pattern, flags) {
+ var value;
+ try {
+ value = new RegExp(pattern, flags);
+ } catch (e) {
+ throwError({}, Messages.InvalidRegExp);
+ }
+ return value;
+ }
+
+ function scanRegExpBody() {
+ var ch, str, classMarker, terminated, body;
+
+ ch = source[index];
+ assert(ch === '/', 'Regular expression literal must start with a slash');
+ str = source[index++];
+
+ classMarker = false;
+ terminated = false;
+ while (index < length) {
+ ch = source[index++];
+ str += ch;
+ if (ch === '\\') {
+ ch = source[index++];
+ // ECMA-262 7.8.5
+ if (isLineTerminator(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnterminatedRegExp);
+ }
+ str += ch;
+ } else if (isLineTerminator(ch.charCodeAt(0))) {
+ throwError({}, Messages.UnterminatedRegExp);
+ } else if (classMarker) {
+ if (ch === ']') {
+ classMarker = false;
+ }
+ } else {
+ if (ch === '/') {
+ terminated = true;
+ break;
+ } else if (ch === '[') {
+ classMarker = true;
+ }
+ }
+ }
+
+ if (!terminated) {
+ throwError({}, Messages.UnterminatedRegExp);
+ }
+
+ // Exclude leading and trailing slash.
+ body = str.substr(1, str.length - 2);
+ return {
+ value: body,
+ literal: str
+ };
+ }
+
+ function scanRegExpFlags() {
+ var ch, str, flags, restore;
+
+ str = '';
+ flags = '';
+ while (index < length) {
+ ch = source[index];
+ if (!isIdentifierPart(ch.charCodeAt(0))) {
+ break;
+ }
+
+ ++index;
+ if (ch === '\\' && index < length) {
+ ch = source[index];
+ if (ch === 'u') {
+ ++index;
+ restore = index;
+ ch = scanHexEscape('u');
+ if (ch) {
+ flags += ch;
+ for (str += '\\u'; restore < index; ++restore) {
+ str += source[restore];
+ }
+ } else {
+ index = restore;
+ flags += 'u';
+ str += '\\u';
+ }
+ throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');
+ } else {
+ str += '\\';
+ throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL');
+ }
+ } else {
+ flags += ch;
+ str += ch;
+ }
+ }
+
+ return {
+ value: flags,
+ literal: str
+ };
+ }
+
+ function scanRegExp() {
+ var start, body, flags, pattern, value;
+
+ lookahead = null;
+ skipComment();
+ start = index;
+
+ body = scanRegExpBody();
+ flags = scanRegExpFlags();
+ value = testRegExp(body.value, flags.value);
+
+ if (extra.tokenize) {
+ return {
+ type: Token.RegularExpression,
+ value: value,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: start,
+ end: index
+ };
+ }
+
+ return {
+ literal: body.literal + flags.literal,
+ value: value,
+ start: start,
+ end: index
+ };
+ }
+
+ function collectRegex() {
+ var pos, loc, regex, token;
+
+ skipComment();
+
+ pos = index;
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart
+ }
+ };
+
+ regex = scanRegExp();
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+
+ /* istanbul ignore next */
+ if (!extra.tokenize) {
+ // Pop the previous token, which is likely '/' or '/='
+ if (extra.tokens.length > 0) {
+ token = extra.tokens[extra.tokens.length - 1];
+ if (token.range[0] === pos && token.type === 'Punctuator') {
+ if (token.value === '/' || token.value === '/=') {
+ extra.tokens.pop();
+ }
+ }
+ }
+
+ extra.tokens.push({
+ type: 'RegularExpression',
+ value: regex.literal,
+ range: [pos, index],
+ loc: loc
+ });
+ }
+
+ return regex;
+ }
+
+ function isIdentifierName(token) {
+ return token.type === Token.Identifier ||
+ token.type === Token.Keyword ||
+ token.type === Token.BooleanLiteral ||
+ token.type === Token.NullLiteral;
+ }
+
+ function advanceSlash() {
+ var prevToken,
+ checkToken;
+ // Using the following algorithm:
+ // https://github.com/mozilla/sweet.js/wiki/design
+ prevToken = extra.tokens[extra.tokens.length - 1];
+ if (!prevToken) {
+ // Nothing before that: it cannot be a division.
+ return collectRegex();
+ }
+ if (prevToken.type === 'Punctuator') {
+ if (prevToken.value === ']') {
+ return scanPunctuator();
+ }
+ if (prevToken.value === ')') {
+ checkToken = extra.tokens[extra.openParenToken - 1];
+ if (checkToken &&
+ checkToken.type === 'Keyword' &&
+ (checkToken.value === 'if' ||
+ checkToken.value === 'while' ||
+ checkToken.value === 'for' ||
+ checkToken.value === 'with')) {
+ return collectRegex();
+ }
+ return scanPunctuator();
+ }
+ if (prevToken.value === '}') {
+ // Dividing a function by anything makes little sense,
+ // but we have to check for that.
+ if (extra.tokens[extra.openCurlyToken - 3] &&
+ extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') {
+ // Anonymous function.
+ checkToken = extra.tokens[extra.openCurlyToken - 4];
+ if (!checkToken) {
+ return scanPunctuator();
+ }
+ } else if (extra.tokens[extra.openCurlyToken - 4] &&
+ extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') {
+ // Named function.
+ checkToken = extra.tokens[extra.openCurlyToken - 5];
+ if (!checkToken) {
+ return collectRegex();
+ }
+ } else {
+ return scanPunctuator();
+ }
+ // checkToken determines whether the function is
+ // a declaration or an expression.
+ if (FnExprTokens.indexOf(checkToken.value) >= 0) {
+ // It is an expression.
+ return scanPunctuator();
+ }
+ // It is a declaration.
+ return collectRegex();
+ }
+ return collectRegex();
+ }
+ if (prevToken.type === 'Keyword') {
+ return collectRegex();
+ }
+ return scanPunctuator();
+ }
+
+ function advance() {
+ var ch;
+
+ skipComment();
+
+ if (index >= length) {
+ return {
+ type: Token.EOF,
+ lineNumber: lineNumber,
+ lineStart: lineStart,
+ start: index,
+ end: index
+ };
+ }
+
+ ch = source.charCodeAt(index);
+
+ if (isIdentifierStart(ch)) {
+ return scanIdentifier();
+ }
+
+ // Very common: ( and ) and ;
+ if (ch === 0x28 || ch === 0x29 || ch === 0x3B) {
+ return scanPunctuator();
+ }
+
+ // String literal starts with single quote (U+0027) or double quote (U+0022).
+ if (ch === 0x27 || ch === 0x22) {
+ return scanStringLiteral();
+ }
+
+
+ // Dot (.) U+002E can also start a floating-point number, hence the need
+ // to check the next character.
+ if (ch === 0x2E) {
+ if (isDecimalDigit(source.charCodeAt(index + 1))) {
+ return scanNumericLiteral();
+ }
+ return scanPunctuator();
+ }
+
+ if (isDecimalDigit(ch)) {
+ return scanNumericLiteral();
+ }
+
+ // Slash (/) U+002F can also start a regex.
+ if (extra.tokenize && ch === 0x2F) {
+ return advanceSlash();
+ }
+
+ return scanPunctuator();
+ }
+
+ function collectToken() {
+ var loc, token, range, value;
+
+ skipComment();
+ loc = {
+ start: {
+ line: lineNumber,
+ column: index - lineStart
+ }
+ };
+
+ token = advance();
+ loc.end = {
+ line: lineNumber,
+ column: index - lineStart
+ };
+
+ if (token.type !== Token.EOF) {
+ value = source.slice(token.start, token.end);
+ extra.tokens.push({
+ type: TokenName[token.type],
+ value: value,
+ range: [token.start, token.end],
+ loc: loc
+ });
+ }
+
+ return token;
+ }
+
+ function lex() {
+ var token;
+
+ token = lookahead;
+ index = token.end;
+ lineNumber = token.lineNumber;
+ lineStart = token.lineStart;
+
+ lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();
+
+ index = token.end;
+ lineNumber = token.lineNumber;
+ lineStart = token.lineStart;
+
+ return token;
+ }
+
+ function peek() {
+ var pos, line, start;
+
+ pos = index;
+ line = lineNumber;
+ start = lineStart;
+ lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance();
+ index = pos;
+ lineNumber = line;
+ lineStart = start;
+ }
+
+ function Position(line, column) {
+ this.line = line;
+ this.column = column;
+ }
+
+ function SourceLocation(startLine, startColumn, line, column) {
+ this.start = new Position(startLine, startColumn);
+ this.end = new Position(line, column);
+ }
+
+ SyntaxTreeDelegate = {
+
+ name: 'SyntaxTree',
+
+ processComment: function (node) {
+ var lastChild, trailingComments;
+
+ if (node.type === Syntax.Program) {
+ if (node.body.length > 0) {
+ return;
+ }
+ }
+
+ if (extra.trailingComments.length > 0) {
+ if (extra.trailingComments[0].range[0] >= node.range[1]) {
+ trailingComments = extra.trailingComments;
+ extra.trailingComments = [];
+ } else {
+ extra.trailingComments.length = 0;
+ }
+ } else {
+ if (extra.bottomRightStack.length > 0 &&
+ extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments &&
+ extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) {
+ trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
+ delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments;
+ }
+ }
+
+ // Eating the stack.
+ while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) {
+ lastChild = extra.bottomRightStack.pop();
+ }
+
+ if (lastChild) {
+ if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) {
+ node.leadingComments = lastChild.leadingComments;
+ delete lastChild.leadingComments;
+ }
+ } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) {
+ node.leadingComments = extra.leadingComments;
+ extra.leadingComments = [];
+ }
+
+
+ if (trailingComments) {
+ node.trailingComments = trailingComments;
+ }
+
+ extra.bottomRightStack.push(node);
+ },
+
+ markEnd: function (node, startToken) {
+ if (extra.range) {
+ node.range = [startToken.start, index];
+ }
+ if (extra.loc) {
+ node.loc = new SourceLocation(
+ startToken.startLineNumber === undefined ? startToken.lineNumber : startToken.startLineNumber,
+ startToken.start - (startToken.startLineStart === undefined ? startToken.lineStart : startToken.startLineStart),
+ lineNumber,
+ index - lineStart
+ );
+ this.postProcess(node);
+ }
+
+ if (extra.attachComment) {
+ this.processComment(node);
+ }
+ return node;
+ },
+
+ postProcess: function (node) {
+ if (extra.source) {
+ node.loc.source = extra.source;
+ }
+ return node;
+ },
+
+ createArrayExpression: function (elements) {
+ return {
+ type: Syntax.ArrayExpression,
+ elements: elements
+ };
+ },
+
+ createAssignmentExpression: function (operator, left, right) {
+ return {
+ type: Syntax.AssignmentExpression,
+ operator: operator,
+ left: left,
+ right: right
+ };
+ },
+
+ createBinaryExpression: function (operator, left, right) {
+ var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression :
+ Syntax.BinaryExpression;
+ return {
+ type: type,
+ operator: operator,
+ left: left,
+ right: right
+ };
+ },
+
+ createBlockStatement: function (body) {
+ return {
+ type: Syntax.BlockStatement,
+ body: body
+ };
+ },
+
+ createBreakStatement: function (label) {
+ return {
+ type: Syntax.BreakStatement,
+ label: label
+ };
+ },
+
+ createCallExpression: function (callee, args) {
+ return {
+ type: Syntax.CallExpression,
+ callee: callee,
+ 'arguments': args
+ };
+ },
+
+ createCatchClause: function (param, body) {
+ return {
+ type: Syntax.CatchClause,
+ param: param,
+ body: body
+ };
+ },
+
+ createConditionalExpression: function (test, consequent, alternate) {
+ return {
+ type: Syntax.ConditionalExpression,
+ test: test,
+ consequent: consequent,
+ alternate: alternate
+ };
+ },
+
+ createContinueStatement: function (label) {
+ return {
+ type: Syntax.ContinueStatement,
+ label: label
+ };
+ },
+
+ createDebuggerStatement: function () {
+ return {
+ type: Syntax.DebuggerStatement
+ };
+ },
+
+ createDoWhileStatement: function (body, test) {
+ return {
+ type: Syntax.DoWhileStatement,
+ body: body,
+ test: test
+ };
+ },
+
+ createEmptyStatement: function () {
+ return {
+ type: Syntax.EmptyStatement
+ };
+ },
+
+ createExpressionStatement: function (expression) {
+ return {
+ type: Syntax.ExpressionStatement,
+ expression: expression
+ };
+ },
+
+ createForStatement: function (init, test, update, body) {
+ return {
+ type: Syntax.ForStatement,
+ init: init,
+ test: test,
+ update: update,
+ body: body
+ };
+ },
+
+ createForInStatement: function (left, right, body) {
+ return {
+ type: Syntax.ForInStatement,
+ left: left,
+ right: right,
+ body: body,
+ each: false
+ };
+ },
+
+ createFunctionDeclaration: function (id, params, defaults, body) {
+ return {
+ type: Syntax.FunctionDeclaration,
+ id: id,
+ params: params,
+ defaults: defaults,
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ };
+ },
+
+ createFunctionExpression: function (id, params, defaults, body) {
+ return {
+ type: Syntax.FunctionExpression,
+ id: id,
+ params: params,
+ defaults: defaults,
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ };
+ },
+
+ createIdentifier: function (name) {
+ return {
+ type: Syntax.Identifier,
+ name: name
+ };
+ },
+
+ createIfStatement: function (test, consequent, alternate) {
+ return {
+ type: Syntax.IfStatement,
+ test: test,
+ consequent: consequent,
+ alternate: alternate
+ };
+ },
+
+ createLabeledStatement: function (label, body) {
+ return {
+ type: Syntax.LabeledStatement,
+ label: label,
+ body: body
+ };
+ },
+
+ createLiteral: function (token) {
+ return {
+ type: Syntax.Literal,
+ value: token.value,
+ raw: source.slice(token.start, token.end)
+ };
+ },
+
+ createMemberExpression: function (accessor, object, property) {
+ return {
+ type: Syntax.MemberExpression,
+ computed: accessor === '[',
+ object: object,
+ property: property
+ };
+ },
+
+ createNewExpression: function (callee, args) {
+ return {
+ type: Syntax.NewExpression,
+ callee: callee,
+ 'arguments': args
+ };
+ },
+
+ createObjectExpression: function (properties) {
+ return {
+ type: Syntax.ObjectExpression,
+ properties: properties
+ };
+ },
+
+ createPostfixExpression: function (operator, argument) {
+ return {
+ type: Syntax.UpdateExpression,
+ operator: operator,
+ argument: argument,
+ prefix: false
+ };
+ },
+
+ createProgram: function (body) {
+ return {
+ type: Syntax.Program,
+ body: body
+ };
+ },
+
+ createProperty: function (kind, key, value) {
+ return {
+ type: Syntax.Property,
+ key: key,
+ value: value,
+ kind: kind
+ };
+ },
+
+ createReturnStatement: function (argument) {
+ return {
+ type: Syntax.ReturnStatement,
+ argument: argument
+ };
+ },
+
+ createSequenceExpression: function (expressions) {
+ return {
+ type: Syntax.SequenceExpression,
+ expressions: expressions
+ };
+ },
+
+ createSwitchCase: function (test, consequent) {
+ return {
+ type: Syntax.SwitchCase,
+ test: test,
+ consequent: consequent
+ };
+ },
+
+ createSwitchStatement: function (discriminant, cases) {
+ return {
+ type: Syntax.SwitchStatement,
+ discriminant: discriminant,
+ cases: cases
+ };
+ },
+
+ createThisExpression: function () {
+ return {
+ type: Syntax.ThisExpression
+ };
+ },
+
+ createThrowStatement: function (argument) {
+ return {
+ type: Syntax.ThrowStatement,
+ argument: argument
+ };
+ },
+
+ createTryStatement: function (block, guardedHandlers, handlers, finalizer) {
+ return {
+ type: Syntax.TryStatement,
+ block: block,
+ guardedHandlers: guardedHandlers,
+ handlers: handlers,
+ finalizer: finalizer
+ };
+ },
+
+ createUnaryExpression: function (operator, argument) {
+ if (operator === '++' || operator === '--') {
+ return {
+ type: Syntax.UpdateExpression,
+ operator: operator,
+ argument: argument,
+ prefix: true
+ };
+ }
+ return {
+ type: Syntax.UnaryExpression,
+ operator: operator,
+ argument: argument,
+ prefix: true
+ };
+ },
+
+ createVariableDeclaration: function (declarations, kind) {
+ return {
+ type: Syntax.VariableDeclaration,
+ declarations: declarations,
+ kind: kind
+ };
+ },
+
+ createVariableDeclarator: function (id, init) {
+ return {
+ type: Syntax.VariableDeclarator,
+ id: id,
+ init: init
+ };
+ },
+
+ createWhileStatement: function (test, body) {
+ return {
+ type: Syntax.WhileStatement,
+ test: test,
+ body: body
+ };
+ },
+
+ createWithStatement: function (object, body) {
+ return {
+ type: Syntax.WithStatement,
+ object: object,
+ body: body
+ };
+ }
+ };
+
+ // Return true if there is a line terminator before the next token.
+
+ function peekLineTerminator() {
+ var pos, line, start, found;
+
+ pos = index;
+ line = lineNumber;
+ start = lineStart;
+ skipComment();
+ found = lineNumber !== line;
+ index = pos;
+ lineNumber = line;
+ lineStart = start;
+
+ return found;
+ }
+
+ // Throw an exception
+
+ function throwError(token, messageFormat) {
+ var error,
+ args = Array.prototype.slice.call(arguments, 2),
+ msg = messageFormat.replace(
+ /%(\d)/g,
+ function (whole, index) {
+ assert(index < args.length, 'Message reference must be in range');
+ return args[index];
+ }
+ );
+
+ if (typeof token.lineNumber === 'number') {
+ error = new Error('Line ' + token.lineNumber + ': ' + msg);
+ error.index = token.start;
+ error.lineNumber = token.lineNumber;
+ error.column = token.start - lineStart + 1;
+ } else {
+ error = new Error('Line ' + lineNumber + ': ' + msg);
+ error.index = index;
+ error.lineNumber = lineNumber;
+ error.column = index - lineStart + 1;
+ }
+
+ error.description = msg;
+ throw error;
+ }
+
+ function throwErrorTolerant() {
+ try {
+ throwError.apply(null, arguments);
+ } catch (e) {
+ if (extra.errors) {
+ extra.errors.push(e);
+ } else {
+ throw e;
+ }
+ }
+ }
+
+
+ // Throw an exception because of the token.
+
+ function throwUnexpected(token) {
+ if (token.type === Token.EOF) {
+ throwError(token, Messages.UnexpectedEOS);
+ }
+
+ if (token.type === Token.NumericLiteral) {
+ throwError(token, Messages.UnexpectedNumber);
+ }
+
+ if (token.type === Token.StringLiteral) {
+ throwError(token, Messages.UnexpectedString);
+ }
+
+ if (token.type === Token.Identifier) {
+ throwError(token, Messages.UnexpectedIdentifier);
+ }
+
+ if (token.type === Token.Keyword) {
+ if (isFutureReservedWord(token.value)) {
+ throwError(token, Messages.UnexpectedReserved);
+ } else if (strict && isStrictModeReservedWord(token.value)) {
+ throwErrorTolerant(token, Messages.StrictReservedWord);
+ return;
+ }
+ throwError(token, Messages.UnexpectedToken, token.value);
+ }
+
+ // BooleanLiteral, NullLiteral, or Punctuator.
+ throwError(token, Messages.UnexpectedToken, token.value);
+ }
+
+ // Expect the next token to match the specified punctuator.
+ // If not, an exception will be thrown.
+
+ function expect(value) {
+ var token = lex();
+ if (token.type !== Token.Punctuator || token.value !== value) {
+ throwUnexpected(token);
+ }
+ }
+
+ // Expect the next token to match the specified keyword.
+ // If not, an exception will be thrown.
+
+ function expectKeyword(keyword) {
+ var token = lex();
+ if (token.type !== Token.Keyword || token.value !== keyword) {
+ throwUnexpected(token);
+ }
+ }
+
+ // Return true if the next token matches the specified punctuator.
+
+ function match(value) {
+ return lookahead.type === Token.Punctuator && lookahead.value === value;
+ }
+
+ // Return true if the next token matches the specified keyword
+
+ function matchKeyword(keyword) {
+ return lookahead.type === Token.Keyword && lookahead.value === keyword;
+ }
+
+ // Return true if the next token is an assignment operator
+
+ function matchAssign() {
+ var op;
+
+ if (lookahead.type !== Token.Punctuator) {
+ return false;
+ }
+ op = lookahead.value;
+ return op === '=' ||
+ op === '*=' ||
+ op === '/=' ||
+ op === '%=' ||
+ op === '+=' ||
+ op === '-=' ||
+ op === '<<=' ||
+ op === '>>=' ||
+ op === '>>>=' ||
+ op === '&=' ||
+ op === '^=' ||
+ op === '|=';
+ }
+
+ function consumeSemicolon() {
+ var line;
+
+ // Catch the very common case first: immediately a semicolon (U+003B).
+ if (source.charCodeAt(index) === 0x3B || match(';')) {
+ lex();
+ return;
+ }
+
+ line = lineNumber;
+ skipComment();
+ if (lineNumber !== line) {
+ return;
+ }
+
+ if (lookahead.type !== Token.EOF && !match('}')) {
+ throwUnexpected(lookahead);
+ }
+ }
+
+ // Return true if provided expression is LeftHandSideExpression
+
+ function isLeftHandSide(expr) {
+ return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;
+ }
+
+ // 11.1.4 Array Initialiser
+
+ function parseArrayInitialiser() {
+ var elements = [], startToken;
+
+ startToken = lookahead;
+ expect('[');
+
+ while (!match(']')) {
+ if (match(',')) {
+ lex();
+ elements.push(null);
+ } else {
+ elements.push(parseAssignmentExpression());
+
+ if (!match(']')) {
+ expect(',');
+ }
+ }
+ }
+
+ lex();
+
+ return delegate.markEnd(delegate.createArrayExpression(elements), startToken);
+ }
+
+ // 11.1.5 Object Initialiser
+
+ function parsePropertyFunction(param, first) {
+ var previousStrict, body, startToken;
+
+ previousStrict = strict;
+ startToken = lookahead;
+ body = parseFunctionSourceElements();
+ if (first && strict && isRestrictedWord(param[0].name)) {
+ throwErrorTolerant(first, Messages.StrictParamName);
+ }
+ strict = previousStrict;
+ return delegate.markEnd(delegate.createFunctionExpression(null, param, [], body), startToken);
+ }
+
+ function parseObjectPropertyKey() {
+ var token, startToken;
+
+ startToken = lookahead;
+ token = lex();
+
+ // Note: This function is called only from parseObjectProperty(), where
+ // EOF and Punctuator tokens are already filtered out.
+
+ if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
+ if (strict && token.octal) {
+ throwErrorTolerant(token, Messages.StrictOctalLiteral);
+ }
+ return delegate.markEnd(delegate.createLiteral(token), startToken);
+ }
+
+ return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
+ }
+
+ function parseObjectProperty() {
+ var token, key, id, value, param, startToken;
+
+ token = lookahead;
+ startToken = lookahead;
+
+ if (token.type === Token.Identifier) {
+
+ id = parseObjectPropertyKey();
+
+ // Property Assignment: Getter and Setter.
+
+ if (token.value === 'get' && !match(':')) {
+ key = parseObjectPropertyKey();
+ expect('(');
+ expect(')');
+ value = parsePropertyFunction([]);
+ return delegate.markEnd(delegate.createProperty('get', key, value), startToken);
+ }
+ if (token.value === 'set' && !match(':')) {
+ key = parseObjectPropertyKey();
+ expect('(');
+ token = lookahead;
+ if (token.type !== Token.Identifier) {
+ expect(')');
+ throwErrorTolerant(token, Messages.UnexpectedToken, token.value);
+ value = parsePropertyFunction([]);
+ } else {
+ param = [ parseVariableIdentifier() ];
+ expect(')');
+ value = parsePropertyFunction(param, token);
+ }
+ return delegate.markEnd(delegate.createProperty('set', key, value), startToken);
+ }
+ expect(':');
+ value = parseAssignmentExpression();
+ return delegate.markEnd(delegate.createProperty('init', id, value), startToken);
+ }
+ if (token.type === Token.EOF || token.type === Token.Punctuator) {
+ throwUnexpected(token);
+ } else {
+ key = parseObjectPropertyKey();
+ expect(':');
+ value = parseAssignmentExpression();
+ return delegate.markEnd(delegate.createProperty('init', key, value), startToken);
+ }
+ }
+
+ function parseObjectInitialiser() {
+ var properties = [], property, name, key, kind, map = {}, toString = String, startToken;
+
+ startToken = lookahead;
+
+ expect('{');
+
+ while (!match('}')) {
+ property = parseObjectProperty();
+
+ if (property.key.type === Syntax.Identifier) {
+ name = property.key.name;
+ } else {
+ name = toString(property.key.value);
+ }
+ kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;
+
+ key = '$' + name;
+ if (Object.prototype.hasOwnProperty.call(map, key)) {
+ if (map[key] === PropertyKind.Data) {
+ if (strict && kind === PropertyKind.Data) {
+ throwErrorTolerant({}, Messages.StrictDuplicateProperty);
+ } else if (kind !== PropertyKind.Data) {
+ throwErrorTolerant({}, Messages.AccessorDataProperty);
+ }
+ } else {
+ if (kind === PropertyKind.Data) {
+ throwErrorTolerant({}, Messages.AccessorDataProperty);
+ } else if (map[key] & kind) {
+ throwErrorTolerant({}, Messages.AccessorGetSet);
+ }
+ }
+ map[key] |= kind;
+ } else {
+ map[key] = kind;
+ }
+
+ properties.push(property);
+
+ if (!match('}')) {
+ expect(',');
+ }
+ }
+
+ expect('}');
+
+ return delegate.markEnd(delegate.createObjectExpression(properties), startToken);
+ }
+
+ // 11.1.6 The Grouping Operator
+
+ function parseGroupExpression() {
+ var expr;
+
+ expect('(');
+
+ expr = parseExpression();
+
+ expect(')');
+
+ return expr;
+ }
+
+
+ // 11.1 Primary Expressions
+
+ function parsePrimaryExpression() {
+ var type, token, expr, startToken;
+
+ if (match('(')) {
+ return parseGroupExpression();
+ }
+
+ if (match('[')) {
+ return parseArrayInitialiser();
+ }
+
+ if (match('{')) {
+ return parseObjectInitialiser();
+ }
+
+ type = lookahead.type;
+ startToken = lookahead;
+
+ if (type === Token.Identifier) {
+ expr = delegate.createIdentifier(lex().value);
+ } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
+ if (strict && lookahead.octal) {
+ throwErrorTolerant(lookahead, Messages.StrictOctalLiteral);
+ }
+ expr = delegate.createLiteral(lex());
+ } else if (type === Token.Keyword) {
+ if (matchKeyword('function')) {
+ return parseFunctionExpression();
+ }
+ if (matchKeyword('this')) {
+ lex();
+ expr = delegate.createThisExpression();
+ } else {
+ throwUnexpected(lex());
+ }
+ } else if (type === Token.BooleanLiteral) {
+ token = lex();
+ token.value = (token.value === 'true');
+ expr = delegate.createLiteral(token);
+ } else if (type === Token.NullLiteral) {
+ token = lex();
+ token.value = null;
+ expr = delegate.createLiteral(token);
+ } else if (match('/') || match('/=')) {
+ if (typeof extra.tokens !== 'undefined') {
+ expr = delegate.createLiteral(collectRegex());
+ } else {
+ expr = delegate.createLiteral(scanRegExp());
+ }
+ peek();
+ } else {
+ throwUnexpected(lex());
+ }
+
+ return delegate.markEnd(expr, startToken);
+ }
+
+ // 11.2 Left-Hand-Side Expressions
+
+ function parseArguments() {
+ var args = [];
+
+ expect('(');
+
+ if (!match(')')) {
+ while (index < length) {
+ args.push(parseAssignmentExpression());
+ if (match(')')) {
+ break;
+ }
+ expect(',');
+ }
+ }
+
+ expect(')');
+
+ return args;
+ }
+
+ function parseNonComputedProperty() {
+ var token, startToken;
+
+ startToken = lookahead;
+ token = lex();
+
+ if (!isIdentifierName(token)) {
+ throwUnexpected(token);
+ }
+
+ return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
+ }
+
+ function parseNonComputedMember() {
+ expect('.');
+
+ return parseNonComputedProperty();
+ }
+
+ function parseComputedMember() {
+ var expr;
+
+ expect('[');
+
+ expr = parseExpression();
+
+ expect(']');
+
+ return expr;
+ }
+
+ function parseNewExpression() {
+ var callee, args, startToken;
+
+ startToken = lookahead;
+ expectKeyword('new');
+ callee = parseLeftHandSideExpression();
+ args = match('(') ? parseArguments() : [];
+
+ return delegate.markEnd(delegate.createNewExpression(callee, args), startToken);
+ }
+
+ function parseLeftHandSideExpressionAllowCall() {
+ var previousAllowIn, expr, args, property, startToken;
+
+ startToken = lookahead;
+
+ previousAllowIn = state.allowIn;
+ state.allowIn = true;
+ expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
+ state.allowIn = previousAllowIn;
+
+ for (;;) {
+ if (match('.')) {
+ property = parseNonComputedMember();
+ expr = delegate.createMemberExpression('.', expr, property);
+ } else if (match('(')) {
+ args = parseArguments();
+ expr = delegate.createCallExpression(expr, args);
+ } else if (match('[')) {
+ property = parseComputedMember();
+ expr = delegate.createMemberExpression('[', expr, property);
+ } else {
+ break;
+ }
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ function parseLeftHandSideExpression() {
+ var previousAllowIn, expr, property, startToken;
+
+ startToken = lookahead;
+
+ previousAllowIn = state.allowIn;
+ expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
+ state.allowIn = previousAllowIn;
+
+ while (match('.') || match('[')) {
+ if (match('[')) {
+ property = parseComputedMember();
+ expr = delegate.createMemberExpression('[', expr, property);
+ } else {
+ property = parseNonComputedMember();
+ expr = delegate.createMemberExpression('.', expr, property);
+ }
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ // 11.3 Postfix Expressions
+
+ function parsePostfixExpression() {
+ var expr, token, startToken = lookahead;
+
+ expr = parseLeftHandSideExpressionAllowCall();
+
+ if (lookahead.type === Token.Punctuator) {
+ if ((match('++') || match('--')) && !peekLineTerminator()) {
+ // 11.3.1, 11.3.2
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
+ throwErrorTolerant({}, Messages.StrictLHSPostfix);
+ }
+
+ if (!isLeftHandSide(expr)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
+ }
+
+ token = lex();
+ expr = delegate.markEnd(delegate.createPostfixExpression(token.value, expr), startToken);
+ }
+ }
+
+ return expr;
+ }
+
+ // 11.4 Unary Operators
+
+ function parseUnaryExpression() {
+ var token, expr, startToken;
+
+ if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
+ expr = parsePostfixExpression();
+ } else if (match('++') || match('--')) {
+ startToken = lookahead;
+ token = lex();
+ expr = parseUnaryExpression();
+ // 11.4.4, 11.4.5
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
+ throwErrorTolerant({}, Messages.StrictLHSPrefix);
+ }
+
+ if (!isLeftHandSide(expr)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
+ }
+
+ expr = delegate.createUnaryExpression(token.value, expr);
+ expr = delegate.markEnd(expr, startToken);
+ } else if (match('+') || match('-') || match('~') || match('!')) {
+ startToken = lookahead;
+ token = lex();
+ expr = parseUnaryExpression();
+ expr = delegate.createUnaryExpression(token.value, expr);
+ expr = delegate.markEnd(expr, startToken);
+ } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
+ startToken = lookahead;
+ token = lex();
+ expr = parseUnaryExpression();
+ expr = delegate.createUnaryExpression(token.value, expr);
+ expr = delegate.markEnd(expr, startToken);
+ if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {
+ throwErrorTolerant({}, Messages.StrictDelete);
+ }
+ } else {
+ expr = parsePostfixExpression();
+ }
+
+ return expr;
+ }
+
+ function binaryPrecedence(token, allowIn) {
+ var prec = 0;
+
+ if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
+ return 0;
+ }
+
+ switch (token.value) {
+ case '||':
+ prec = 1;
+ break;
+
+ case '&&':
+ prec = 2;
+ break;
+
+ case '|':
+ prec = 3;
+ break;
+
+ case '^':
+ prec = 4;
+ break;
+
+ case '&':
+ prec = 5;
+ break;
+
+ case '==':
+ case '!=':
+ case '===':
+ case '!==':
+ prec = 6;
+ break;
+
+ case '<':
+ case '>':
+ case '<=':
+ case '>=':
+ case 'instanceof':
+ prec = 7;
+ break;
+
+ case 'in':
+ prec = allowIn ? 7 : 0;
+ break;
+
+ case '<<':
+ case '>>':
+ case '>>>':
+ prec = 8;
+ break;
+
+ case '+':
+ case '-':
+ prec = 9;
+ break;
+
+ case '*':
+ case '/':
+ case '%':
+ prec = 11;
+ break;
+
+ default:
+ break;
+ }
+
+ return prec;
+ }
+
+ // 11.5 Multiplicative Operators
+ // 11.6 Additive Operators
+ // 11.7 Bitwise Shift Operators
+ // 11.8 Relational Operators
+ // 11.9 Equality Operators
+ // 11.10 Binary Bitwise Operators
+ // 11.11 Binary Logical Operators
+
+ function parseBinaryExpression() {
+ var marker, markers, expr, token, prec, stack, right, operator, left, i;
+
+ marker = lookahead;
+ left = parseUnaryExpression();
+
+ token = lookahead;
+ prec = binaryPrecedence(token, state.allowIn);
+ if (prec === 0) {
+ return left;
+ }
+ token.prec = prec;
+ lex();
+
+ markers = [marker, lookahead];
+ right = parseUnaryExpression();
+
+ stack = [left, token, right];
+
+ while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) {
+
+ // Reduce: make a binary expression from the three topmost entries.
+ while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
+ right = stack.pop();
+ operator = stack.pop().value;
+ left = stack.pop();
+ expr = delegate.createBinaryExpression(operator, left, right);
+ markers.pop();
+ marker = markers[markers.length - 1];
+ delegate.markEnd(expr, marker);
+ stack.push(expr);
+ }
+
+ // Shift.
+ token = lex();
+ token.prec = prec;
+ stack.push(token);
+ markers.push(lookahead);
+ expr = parseUnaryExpression();
+ stack.push(expr);
+ }
+
+ // Final reduce to clean-up the stack.
+ i = stack.length - 1;
+ expr = stack[i];
+ markers.pop();
+ while (i > 1) {
+ expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
+ i -= 2;
+ marker = markers.pop();
+ delegate.markEnd(expr, marker);
+ }
+
+ return expr;
+ }
+
+
+ // 11.12 Conditional Operator
+
+ function parseConditionalExpression() {
+ var expr, previousAllowIn, consequent, alternate, startToken;
+
+ startToken = lookahead;
+
+ expr = parseBinaryExpression();
+
+ if (match('?')) {
+ lex();
+ previousAllowIn = state.allowIn;
+ state.allowIn = true;
+ consequent = parseAssignmentExpression();
+ state.allowIn = previousAllowIn;
+ expect(':');
+ alternate = parseAssignmentExpression();
+
+ expr = delegate.createConditionalExpression(expr, consequent, alternate);
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ // 11.13 Assignment Operators
+
+ function parseAssignmentExpression() {
+ var token, left, right, node, startToken;
+
+ token = lookahead;
+ startToken = lookahead;
+
+ node = left = parseConditionalExpression();
+
+ if (matchAssign()) {
+ // LeftHandSideExpression
+ if (!isLeftHandSide(left)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
+ }
+
+ // 11.13.1
+ if (strict && left.type === Syntax.Identifier && isRestrictedWord(left.name)) {
+ throwErrorTolerant(token, Messages.StrictLHSAssignment);
+ }
+
+ token = lex();
+ right = parseAssignmentExpression();
+ node = delegate.markEnd(delegate.createAssignmentExpression(token.value, left, right), startToken);
+ }
+
+ return node;
+ }
+
+ // 11.14 Comma Operator
+
+ function parseExpression() {
+ var expr, startToken = lookahead;
+
+ expr = parseAssignmentExpression();
+
+ if (match(',')) {
+ expr = delegate.createSequenceExpression([ expr ]);
+
+ while (index < length) {
+ if (!match(',')) {
+ break;
+ }
+ lex();
+ expr.expressions.push(parseAssignmentExpression());
+ }
+
+ delegate.markEnd(expr, startToken);
+ }
+
+ return expr;
+ }
+
+ // 12.1 Block
+
+ function parseStatementList() {
+ var list = [],
+ statement;
+
+ while (index < length) {
+ if (match('}')) {
+ break;
+ }
+ statement = parseSourceElement();
+ if (typeof statement === 'undefined') {
+ break;
+ }
+ list.push(statement);
+ }
+
+ return list;
+ }
+
+ function parseBlock() {
+ var block, startToken;
+
+ startToken = lookahead;
+ expect('{');
+
+ block = parseStatementList();
+
+ expect('}');
+
+ return delegate.markEnd(delegate.createBlockStatement(block), startToken);
+ }
+
+ // 12.2 Variable Statement
+
+ function parseVariableIdentifier() {
+ var token, startToken;
+
+ startToken = lookahead;
+ token = lex();
+
+ if (token.type !== Token.Identifier) {
+ throwUnexpected(token);
+ }
+
+ return delegate.markEnd(delegate.createIdentifier(token.value), startToken);
+ }
+
+ function parseVariableDeclaration(kind) {
+ var init = null, id, startToken;
+
+ startToken = lookahead;
+ id = parseVariableIdentifier();
+
+ // 12.2.1
+ if (strict && isRestrictedWord(id.name)) {
+ throwErrorTolerant({}, Messages.StrictVarName);
+ }
+
+ if (kind === 'const') {
+ expect('=');
+ init = parseAssignmentExpression();
+ } else if (match('=')) {
+ lex();
+ init = parseAssignmentExpression();
+ }
+
+ return delegate.markEnd(delegate.createVariableDeclarator(id, init), startToken);
+ }
+
+ function parseVariableDeclarationList(kind) {
+ var list = [];
+
+ do {
+ list.push(parseVariableDeclaration(kind));
+ if (!match(',')) {
+ break;
+ }
+ lex();
+ } while (index < length);
+
+ return list;
+ }
+
+ function parseVariableStatement() {
+ var declarations;
+
+ expectKeyword('var');
+
+ declarations = parseVariableDeclarationList();
+
+ consumeSemicolon();
+
+ return delegate.createVariableDeclaration(declarations, 'var');
+ }
+
+ // kind may be `const` or `let`
+ // Both are experimental and not in the specification yet.
+ // see http://wiki.ecmascript.org/doku.php?id=harmony:const
+ // and http://wiki.ecmascript.org/doku.php?id=harmony:let
+ function parseConstLetDeclaration(kind) {
+ var declarations, startToken;
+
+ startToken = lookahead;
+
+ expectKeyword(kind);
+
+ declarations = parseVariableDeclarationList(kind);
+
+ consumeSemicolon();
+
+ return delegate.markEnd(delegate.createVariableDeclaration(declarations, kind), startToken);
+ }
+
+ // 12.3 Empty Statement
+
+ function parseEmptyStatement() {
+ expect(';');
+ return delegate.createEmptyStatement();
+ }
+
+ // 12.4 Expression Statement
+
+ function parseExpressionStatement() {
+ var expr = parseExpression();
+ consumeSemicolon();
+ return delegate.createExpressionStatement(expr);
+ }
+
+ // 12.5 If statement
+
+ function parseIfStatement() {
+ var test, consequent, alternate;
+
+ expectKeyword('if');
+
+ expect('(');
+
+ test = parseExpression();
+
+ expect(')');
+
+ consequent = parseStatement();
+
+ if (matchKeyword('else')) {
+ lex();
+ alternate = parseStatement();
+ } else {
+ alternate = null;
+ }
+
+ return delegate.createIfStatement(test, consequent, alternate);
+ }
+
+ // 12.6 Iteration Statements
+
+ function parseDoWhileStatement() {
+ var body, test, oldInIteration;
+
+ expectKeyword('do');
+
+ oldInIteration = state.inIteration;
+ state.inIteration = true;
+
+ body = parseStatement();
+
+ state.inIteration = oldInIteration;
+
+ expectKeyword('while');
+
+ expect('(');
+
+ test = parseExpression();
+
+ expect(')');
+
+ if (match(';')) {
+ lex();
+ }
+
+ return delegate.createDoWhileStatement(body, test);
+ }
+
+ function parseWhileStatement() {
+ var test, body, oldInIteration;
+
+ expectKeyword('while');
+
+ expect('(');
+
+ test = parseExpression();
+
+ expect(')');
+
+ oldInIteration = state.inIteration;
+ state.inIteration = true;
+
+ body = parseStatement();
+
+ state.inIteration = oldInIteration;
+
+ return delegate.createWhileStatement(test, body);
+ }
+
+ function parseForVariableDeclaration() {
+ var token, declarations, startToken;
+
+ startToken = lookahead;
+ token = lex();
+ declarations = parseVariableDeclarationList();
+
+ return delegate.markEnd(delegate.createVariableDeclaration(declarations, token.value), startToken);
+ }
+
+ function parseForStatement() {
+ var init, test, update, left, right, body, oldInIteration;
+
+ init = test = update = null;
+
+ expectKeyword('for');
+
+ expect('(');
+
+ if (match(';')) {
+ lex();
+ } else {
+ if (matchKeyword('var') || matchKeyword('let')) {
+ state.allowIn = false;
+ init = parseForVariableDeclaration();
+ state.allowIn = true;
+
+ if (init.declarations.length === 1 && matchKeyword('in')) {
+ lex();
+ left = init;
+ right = parseExpression();
+ init = null;
+ }
+ } else {
+ state.allowIn = false;
+ init = parseExpression();
+ state.allowIn = true;
+
+ if (matchKeyword('in')) {
+ // LeftHandSideExpression
+ if (!isLeftHandSide(init)) {
+ throwErrorTolerant({}, Messages.InvalidLHSInForIn);
+ }
+
+ lex();
+ left = init;
+ right = parseExpression();
+ init = null;
+ }
+ }
+
+ if (typeof left === 'undefined') {
+ expect(';');
+ }
+ }
+
+ if (typeof left === 'undefined') {
+
+ if (!match(';')) {
+ test = parseExpression();
+ }
+ expect(';');
+
+ if (!match(')')) {
+ update = parseExpression();
+ }
+ }
+
+ expect(')');
+
+ oldInIteration = state.inIteration;
+ state.inIteration = true;
+
+ body = parseStatement();
+
+ state.inIteration = oldInIteration;
+
+ return (typeof left === 'undefined') ?
+ delegate.createForStatement(init, test, update, body) :
+ delegate.createForInStatement(left, right, body);
+ }
+
+ // 12.7 The continue statement
+
+ function parseContinueStatement() {
+ var label = null, key;
+
+ expectKeyword('continue');
+
+ // Optimize the most common form: 'continue;'.
+ if (source.charCodeAt(index) === 0x3B) {
+ lex();
+
+ if (!state.inIteration) {
+ throwError({}, Messages.IllegalContinue);
+ }
+
+ return delegate.createContinueStatement(null);
+ }
+
+ if (peekLineTerminator()) {
+ if (!state.inIteration) {
+ throwError({}, Messages.IllegalContinue);
+ }
+
+ return delegate.createContinueStatement(null);
+ }
+
+ if (lookahead.type === Token.Identifier) {
+ label = parseVariableIdentifier();
+
+ key = '$' + label.name;
+ if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
+ throwError({}, Messages.UnknownLabel, label.name);
+ }
+ }
+
+ consumeSemicolon();
+
+ if (label === null && !state.inIteration) {
+ throwError({}, Messages.IllegalContinue);
+ }
+
+ return delegate.createContinueStatement(label);
+ }
+
+ // 12.8 The break statement
+
+ function parseBreakStatement() {
+ var label = null, key;
+
+ expectKeyword('break');
+
+ // Catch the very common case first: immediately a semicolon (U+003B).
+ if (source.charCodeAt(index) === 0x3B) {
+ lex();
+
+ if (!(state.inIteration || state.inSwitch)) {
+ throwError({}, Messages.IllegalBreak);
+ }
+
+ return delegate.createBreakStatement(null);
+ }
+
+ if (peekLineTerminator()) {
+ if (!(state.inIteration || state.inSwitch)) {
+ throwError({}, Messages.IllegalBreak);
+ }
+
+ return delegate.createBreakStatement(null);
+ }
+
+ if (lookahead.type === Token.Identifier) {
+ label = parseVariableIdentifier();
+
+ key = '$' + label.name;
+ if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
+ throwError({}, Messages.UnknownLabel, label.name);
+ }
+ }
+
+ consumeSemicolon();
+
+ if (label === null && !(state.inIteration || state.inSwitch)) {
+ throwError({}, Messages.IllegalBreak);
+ }
+
+ return delegate.createBreakStatement(label);
+ }
+
+ // 12.9 The return statement
+
+ function parseReturnStatement() {
+ var argument = null;
+
+ expectKeyword('return');
+
+ if (!state.inFunctionBody) {
+ throwErrorTolerant({}, Messages.IllegalReturn);
+ }
+
+ // 'return' followed by a space and an identifier is very common.
+ if (source.charCodeAt(index) === 0x20) {
+ if (isIdentifierStart(source.charCodeAt(index + 1))) {
+ argument = parseExpression();
+ consumeSemicolon();
+ return delegate.createReturnStatement(argument);
+ }
+ }
+
+ if (peekLineTerminator()) {
+ return delegate.createReturnStatement(null);
+ }
+
+ if (!match(';')) {
+ if (!match('}') && lookahead.type !== Token.EOF) {
+ argument = parseExpression();
+ }
+ }
+
+ consumeSemicolon();
+
+ return delegate.createReturnStatement(argument);
+ }
+
+ // 12.10 The with statement
+
+ function parseWithStatement() {
+ var object, body;
+
+ if (strict) {
+ // TODO(ikarienator): Should we update the test cases instead?
+ skipComment();
+ throwErrorTolerant({}, Messages.StrictModeWith);
+ }
+
+ expectKeyword('with');
+
+ expect('(');
+
+ object = parseExpression();
+
+ expect(')');
+
+ body = parseStatement();
+
+ return delegate.createWithStatement(object, body);
+ }
+
+ // 12.10 The swith statement
+
+ function parseSwitchCase() {
+ var test, consequent = [], statement, startToken;
+
+ startToken = lookahead;
+ if (matchKeyword('default')) {
+ lex();
+ test = null;
+ } else {
+ expectKeyword('case');
+ test = parseExpression();
+ }
+ expect(':');
+
+ while (index < length) {
+ if (match('}') || matchKeyword('default') || matchKeyword('case')) {
+ break;
+ }
+ statement = parseStatement();
+ consequent.push(statement);
+ }
+
+ return delegate.markEnd(delegate.createSwitchCase(test, consequent), startToken);
+ }
+
+ function parseSwitchStatement() {
+ var discriminant, cases, clause, oldInSwitch, defaultFound;
+
+ expectKeyword('switch');
+
+ expect('(');
+
+ discriminant = parseExpression();
+
+ expect(')');
+
+ expect('{');
+
+ cases = [];
+
+ if (match('}')) {
+ lex();
+ return delegate.createSwitchStatement(discriminant, cases);
+ }
+
+ oldInSwitch = state.inSwitch;
+ state.inSwitch = true;
+ defaultFound = false;
+
+ while (index < length) {
+ if (match('}')) {
+ break;
+ }
+ clause = parseSwitchCase();
+ if (clause.test === null) {
+ if (defaultFound) {
+ throwError({}, Messages.MultipleDefaultsInSwitch);
+ }
+ defaultFound = true;
+ }
+ cases.push(clause);
+ }
+
+ state.inSwitch = oldInSwitch;
+
+ expect('}');
+
+ return delegate.createSwitchStatement(discriminant, cases);
+ }
+
+ // 12.13 The throw statement
+
+ function parseThrowStatement() {
+ var argument;
+
+ expectKeyword('throw');
+
+ if (peekLineTerminator()) {
+ throwError({}, Messages.NewlineAfterThrow);
+ }
+
+ argument = parseExpression();
+
+ consumeSemicolon();
+
+ return delegate.createThrowStatement(argument);
+ }
+
+ // 12.14 The try statement
+
+ function parseCatchClause() {
+ var param, body, startToken;
+
+ startToken = lookahead;
+ expectKeyword('catch');
+
+ expect('(');
+ if (match(')')) {
+ throwUnexpected(lookahead);
+ }
+
+ param = parseVariableIdentifier();
+ // 12.14.1
+ if (strict && isRestrictedWord(param.name)) {
+ throwErrorTolerant({}, Messages.StrictCatchVariable);
+ }
+
+ expect(')');
+ body = parseBlock();
+ return delegate.markEnd(delegate.createCatchClause(param, body), startToken);
+ }
+
+ function parseTryStatement() {
+ var block, handlers = [], finalizer = null;
+
+ expectKeyword('try');
+
+ block = parseBlock();
+
+ if (matchKeyword('catch')) {
+ handlers.push(parseCatchClause());
+ }
+
+ if (matchKeyword('finally')) {
+ lex();
+ finalizer = parseBlock();
+ }
+
+ if (handlers.length === 0 && !finalizer) {
+ throwError({}, Messages.NoCatchOrFinally);
+ }
+
+ return delegate.createTryStatement(block, [], handlers, finalizer);
+ }
+
+ // 12.15 The debugger statement
+
+ function parseDebuggerStatement() {
+ expectKeyword('debugger');
+
+ consumeSemicolon();
+
+ return delegate.createDebuggerStatement();
+ }
+
+ // 12 Statements
+
+ function parseStatement() {
+ var type = lookahead.type,
+ expr,
+ labeledBody,
+ key,
+ startToken;
+
+ if (type === Token.EOF) {
+ throwUnexpected(lookahead);
+ }
+
+ if (type === Token.Punctuator && lookahead.value === '{') {
+ return parseBlock();
+ }
+
+ startToken = lookahead;
+
+ if (type === Token.Punctuator) {
+ switch (lookahead.value) {
+ case ';':
+ return delegate.markEnd(parseEmptyStatement(), startToken);
+ case '(':
+ return delegate.markEnd(parseExpressionStatement(), startToken);
+ default:
+ break;
+ }
+ }
+
+ if (type === Token.Keyword) {
+ switch (lookahead.value) {
+ case 'break':
+ return delegate.markEnd(parseBreakStatement(), startToken);
+ case 'continue':
+ return delegate.markEnd(parseContinueStatement(), startToken);
+ case 'debugger':
+ return delegate.markEnd(parseDebuggerStatement(), startToken);
+ case 'do':
+ return delegate.markEnd(parseDoWhileStatement(), startToken);
+ case 'for':
+ return delegate.markEnd(parseForStatement(), startToken);
+ case 'function':
+ return delegate.markEnd(parseFunctionDeclaration(), startToken);
+ case 'if':
+ return delegate.markEnd(parseIfStatement(), startToken);
+ case 'return':
+ return delegate.markEnd(parseReturnStatement(), startToken);
+ case 'switch':
+ return delegate.markEnd(parseSwitchStatement(), startToken);
+ case 'throw':
+ return delegate.markEnd(parseThrowStatement(), startToken);
+ case 'try':
+ return delegate.markEnd(parseTryStatement(), startToken);
+ case 'var':
+ return delegate.markEnd(parseVariableStatement(), startToken);
+ case 'while':
+ return delegate.markEnd(parseWhileStatement(), startToken);
+ case 'with':
+ return delegate.markEnd(parseWithStatement(), startToken);
+ default:
+ break;
+ }
+ }
+
+ expr = parseExpression();
+
+ // 12.12 Labelled Statements
+ if ((expr.type === Syntax.Identifier) && match(':')) {
+ lex();
+
+ key = '$' + expr.name;
+ if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) {
+ throwError({}, Messages.Redeclaration, 'Label', expr.name);
+ }
+
+ state.labelSet[key] = true;
+ labeledBody = parseStatement();
+ delete state.labelSet[key];
+ return delegate.markEnd(delegate.createLabeledStatement(expr, labeledBody), startToken);
+ }
+
+ consumeSemicolon();
+
+ return delegate.markEnd(delegate.createExpressionStatement(expr), startToken);
+ }
+
+ // 13 Function Definition
+
+ function parseFunctionSourceElements() {
+ var sourceElement, sourceElements = [], token, directive, firstRestricted,
+ oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, startToken;
+
+ startToken = lookahead;
+ expect('{');
+
+ while (index < length) {
+ if (lookahead.type !== Token.StringLiteral) {
+ break;
+ }
+ token = lookahead;
+
+ sourceElement = parseSourceElement();
+ sourceElements.push(sourceElement);
+ if (sourceElement.expression.type !== Syntax.Literal) {
+ // this is not directive
+ break;
+ }
+ directive = source.slice(token.start + 1, token.end - 1);
+ if (directive === 'use strict') {
+ strict = true;
+ if (firstRestricted) {
+ throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
+ }
+ } else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+
+ oldLabelSet = state.labelSet;
+ oldInIteration = state.inIteration;
+ oldInSwitch = state.inSwitch;
+ oldInFunctionBody = state.inFunctionBody;
+
+ state.labelSet = {};
+ state.inIteration = false;
+ state.inSwitch = false;
+ state.inFunctionBody = true;
+
+ while (index < length) {
+ if (match('}')) {
+ break;
+ }
+ sourceElement = parseSourceElement();
+ if (typeof sourceElement === 'undefined') {
+ break;
+ }
+ sourceElements.push(sourceElement);
+ }
+
+ expect('}');
+
+ state.labelSet = oldLabelSet;
+ state.inIteration = oldInIteration;
+ state.inSwitch = oldInSwitch;
+ state.inFunctionBody = oldInFunctionBody;
+
+ return delegate.markEnd(delegate.createBlockStatement(sourceElements), startToken);
+ }
+
+ function parseParams(firstRestricted) {
+ var param, params = [], token, stricted, paramSet, key, message;
+ expect('(');
+
+ if (!match(')')) {
+ paramSet = {};
+ while (index < length) {
+ token = lookahead;
+ param = parseVariableIdentifier();
+ key = '$' + token.value;
+ if (strict) {
+ if (isRestrictedWord(token.value)) {
+ stricted = token;
+ message = Messages.StrictParamName;
+ }
+ if (Object.prototype.hasOwnProperty.call(paramSet, key)) {
+ stricted = token;
+ message = Messages.StrictParamDupe;
+ }
+ } else if (!firstRestricted) {
+ if (isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictParamName;
+ } else if (isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictReservedWord;
+ } else if (Object.prototype.hasOwnProperty.call(paramSet, key)) {
+ firstRestricted = token;
+ message = Messages.StrictParamDupe;
+ }
+ }
+ params.push(param);
+ paramSet[key] = true;
+ if (match(')')) {
+ break;
+ }
+ expect(',');
+ }
+ }
+
+ expect(')');
+
+ return {
+ params: params,
+ stricted: stricted,
+ firstRestricted: firstRestricted,
+ message: message
+ };
+ }
+
+ function parseFunctionDeclaration() {
+ var id, params = [], body, token, stricted, tmp, firstRestricted, message, previousStrict, startToken;
+
+ startToken = lookahead;
+
+ expectKeyword('function');
+ token = lookahead;
+ id = parseVariableIdentifier();
+ if (strict) {
+ if (isRestrictedWord(token.value)) {
+ throwErrorTolerant(token, Messages.StrictFunctionName);
+ }
+ } else {
+ if (isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictFunctionName;
+ } else if (isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictReservedWord;
+ }
+ }
+
+ tmp = parseParams(firstRestricted);
+ params = tmp.params;
+ stricted = tmp.stricted;
+ firstRestricted = tmp.firstRestricted;
+ if (tmp.message) {
+ message = tmp.message;
+ }
+
+ previousStrict = strict;
+ body = parseFunctionSourceElements();
+ if (strict && firstRestricted) {
+ throwError(firstRestricted, message);
+ }
+ if (strict && stricted) {
+ throwErrorTolerant(stricted, message);
+ }
+ strict = previousStrict;
+
+ return delegate.markEnd(delegate.createFunctionDeclaration(id, params, [], body), startToken);
+ }
+
+ function parseFunctionExpression() {
+ var token, id = null, stricted, firstRestricted, message, tmp, params = [], body, previousStrict, startToken;
+
+ startToken = lookahead;
+ expectKeyword('function');
+
+ if (!match('(')) {
+ token = lookahead;
+ id = parseVariableIdentifier();
+ if (strict) {
+ if (isRestrictedWord(token.value)) {
+ throwErrorTolerant(token, Messages.StrictFunctionName);
+ }
+ } else {
+ if (isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictFunctionName;
+ } else if (isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = Messages.StrictReservedWord;
+ }
+ }
+ }
+
+ tmp = parseParams(firstRestricted);
+ params = tmp.params;
+ stricted = tmp.stricted;
+ firstRestricted = tmp.firstRestricted;
+ if (tmp.message) {
+ message = tmp.message;
+ }
+
+ previousStrict = strict;
+ body = parseFunctionSourceElements();
+ if (strict && firstRestricted) {
+ throwError(firstRestricted, message);
+ }
+ if (strict && stricted) {
+ throwErrorTolerant(stricted, message);
+ }
+ strict = previousStrict;
+
+ return delegate.markEnd(delegate.createFunctionExpression(id, params, [], body), startToken);
+ }
+
+ // 14 Program
+
+ function parseSourceElement() {
+ if (lookahead.type === Token.Keyword) {
+ switch (lookahead.value) {
+ case 'const':
+ case 'let':
+ return parseConstLetDeclaration(lookahead.value);
+ case 'function':
+ return parseFunctionDeclaration();
+ default:
+ return parseStatement();
+ }
+ }
+
+ if (lookahead.type !== Token.EOF) {
+ return parseStatement();
+ }
+ }
+
+ function parseSourceElements() {
+ var sourceElement, sourceElements = [], token, directive, firstRestricted;
+
+ while (index < length) {
+ token = lookahead;
+ if (token.type !== Token.StringLiteral) {
+ break;
+ }
+
+ sourceElement = parseSourceElement();
+ sourceElements.push(sourceElement);
+ if (sourceElement.expression.type !== Syntax.Literal) {
+ // this is not directive
+ break;
+ }
+ directive = source.slice(token.start + 1, token.end - 1);
+ if (directive === 'use strict') {
+ strict = true;
+ if (firstRestricted) {
+ throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
+ }
+ } else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+
+ while (index < length) {
+ sourceElement = parseSourceElement();
+ /* istanbul ignore if */
+ if (typeof sourceElement === 'undefined') {
+ break;
+ }
+ sourceElements.push(sourceElement);
+ }
+ return sourceElements;
+ }
+
+ function parseProgram() {
+ var body, startToken;
+
+ skipComment();
+ peek();
+ startToken = lookahead;
+ strict = false;
+
+ body = parseSourceElements();
+ return delegate.markEnd(delegate.createProgram(body), startToken);
+ }
+
+ function filterTokenLocation() {
+ var i, entry, token, tokens = [];
+
+ for (i = 0; i < extra.tokens.length; ++i) {
+ entry = extra.tokens[i];
+ token = {
+ type: entry.type,
+ value: entry.value
+ };
+ if (extra.range) {
+ token.range = entry.range;
+ }
+ if (extra.loc) {
+ token.loc = entry.loc;
+ }
+ tokens.push(token);
+ }
+
+ extra.tokens = tokens;
+ }
+
+ function tokenize(code, options) {
+ var toString,
+ token,
+ tokens;
+
+ toString = String;
+ if (typeof code !== 'string' && !(code instanceof String)) {
+ code = toString(code);
+ }
+
+ delegate = SyntaxTreeDelegate;
+ source = code;
+ index = 0;
+ lineNumber = (source.length > 0) ? 1 : 0;
+ lineStart = 0;
+ length = source.length;
+ lookahead = null;
+ state = {
+ allowIn: true,
+ labelSet: {},
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ lastCommentStart: -1
+ };
+
+ extra = {};
+
+ // Options matching.
+ options = options || {};
+
+ // Of course we collect tokens here.
+ options.tokens = true;
+ extra.tokens = [];
+ extra.tokenize = true;
+ // The following two fields are necessary to compute the Regex tokens.
+ extra.openParenToken = -1;
+ extra.openCurlyToken = -1;
+
+ extra.range = (typeof options.range === 'boolean') && options.range;
+ extra.loc = (typeof options.loc === 'boolean') && options.loc;
+
+ if (typeof options.comment === 'boolean' && options.comment) {
+ extra.comments = [];
+ }
+ if (typeof options.tolerant === 'boolean' && options.tolerant) {
+ extra.errors = [];
+ }
+
+ try {
+ peek();
+ if (lookahead.type === Token.EOF) {
+ return extra.tokens;
+ }
+
+ token = lex();
+ while (lookahead.type !== Token.EOF) {
+ try {
+ token = lex();
+ } catch (lexError) {
+ token = lookahead;
+ if (extra.errors) {
+ extra.errors.push(lexError);
+ // We have to break on the first error
+ // to avoid infinite loops.
+ break;
+ } else {
+ throw lexError;
+ }
+ }
+ }
+
+ filterTokenLocation();
+ tokens = extra.tokens;
+ if (typeof extra.comments !== 'undefined') {
+ tokens.comments = extra.comments;
+ }
+ if (typeof extra.errors !== 'undefined') {
+ tokens.errors = extra.errors;
+ }
+ } catch (e) {
+ throw e;
+ } finally {
+ extra = {};
+ }
+ return tokens;
+ }
+
+ function parse(code, options) {
+ var program, toString;
+
+ toString = String;
+ if (typeof code !== 'string' && !(code instanceof String)) {
+ code = toString(code);
+ }
+
+ delegate = SyntaxTreeDelegate;
+ source = code;
+ index = 0;
+ lineNumber = (source.length > 0) ? 1 : 0;
+ lineStart = 0;
+ length = source.length;
+ lookahead = null;
+ state = {
+ allowIn: true,
+ labelSet: {},
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ lastCommentStart: -1
+ };
+
+ extra = {};
+ if (typeof options !== 'undefined') {
+ extra.range = (typeof options.range === 'boolean') && options.range;
+ extra.loc = (typeof options.loc === 'boolean') && options.loc;
+ extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment;
+
+ if (extra.loc && options.source !== null && options.source !== undefined) {
+ extra.source = toString(options.source);
+ }
+
+ if (typeof options.tokens === 'boolean' && options.tokens) {
+ extra.tokens = [];
+ }
+ if (typeof options.comment === 'boolean' && options.comment) {
+ extra.comments = [];
+ }
+ if (typeof options.tolerant === 'boolean' && options.tolerant) {
+ extra.errors = [];
+ }
+ if (extra.attachComment) {
+ extra.range = true;
+ extra.comments = [];
+ extra.bottomRightStack = [];
+ extra.trailingComments = [];
+ extra.leadingComments = [];
+ }
+ }
+
+ try {
+ program = parseProgram();
+ if (typeof extra.comments !== 'undefined') {
+ program.comments = extra.comments;
+ }
+ if (typeof extra.tokens !== 'undefined') {
+ filterTokenLocation();
+ program.tokens = extra.tokens;
+ }
+ if (typeof extra.errors !== 'undefined') {
+ program.errors = extra.errors;
+ }
+ } catch (e) {
+ throw e;
+ } finally {
+ extra = {};
+ }
+
+ return program;
+ }
+
+ // Sync with *.json manifests.
+ exports.version = '1.2.2';
+
+ exports.tokenize = tokenize;
+
+ exports.parse = parse;
+
+ // Deep copy.
+ /* istanbul ignore next */
+ exports.Syntax = (function () {
+ var name, types = {};
+
+ if (typeof Object.create === 'function') {
+ types = Object.create(null);
+ }
+
+ for (name in Syntax) {
+ if (Syntax.hasOwnProperty(name)) {
+ types[name] = Syntax[name];
+ }
+ }
+
+ if (typeof Object.freeze === 'function') {
+ Object.freeze(types);
+ }
+
+ return types;
+ }());
+
+}));
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/jsonpath/node_modules/esprima/package.json b/node_modules/jsonpath/node_modules/esprima/package.json
new file mode 100644
index 00000000..9f3a4001
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/package.json
@@ -0,0 +1,107 @@
+{
+ "_from": "esprima@1.2.2",
+ "_id": "esprima@1.2.2",
+ "_inBundle": false,
+ "_integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=",
+ "_location": "/jsonpath/esprima",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "esprima@1.2.2",
+ "name": "esprima",
+ "escapedName": "esprima",
+ "rawSpec": "1.2.2",
+ "saveSpec": null,
+ "fetchSpec": "1.2.2"
+ },
+ "_requiredBy": [
+ "/jsonpath"
+ ],
+ "_resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
+ "_shasum": "76a0fd66fcfe154fd292667dc264019750b1657b",
+ "_spec": "esprima@1.2.2",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\jsonpath",
+ "author": {
+ "name": "Ariya Hidayat",
+ "email": "ariya.hidayat@gmail.com"
+ },
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "bugs": {
+ "url": "http://issues.esprima.org"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "ECMAScript parsing infrastructure for multipurpose analysis",
+ "devDependencies": {
+ "complexity-report": "~0.6.1",
+ "eslint": "~0.4.3",
+ "istanbul": "~0.2.6",
+ "jscs": "~1.2.4",
+ "jslint": "~0.1.9",
+ "json-diff": "~0.3.1",
+ "optimist": "~0.6.0",
+ "regenerate": "~0.5.4",
+ "unicode-6.3.0": "~0.1.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "files": [
+ "bin",
+ "test/run.js",
+ "test/runner.js",
+ "test/test.js",
+ "test/compat.js",
+ "test/reflect.js",
+ "esprima.js"
+ ],
+ "homepage": "http://esprima.org",
+ "keywords": [
+ "ast",
+ "ecmascript",
+ "javascript",
+ "parser",
+ "syntax"
+ ],
+ "licenses": [
+ {
+ "type": "BSD",
+ "url": "http://github.com/ariya/esprima/raw/master/LICENSE.BSD"
+ }
+ ],
+ "main": "esprima.js",
+ "maintainers": [
+ {
+ "name": "Ariya Hidayat",
+ "email": "ariya.hidayat@gmail.com",
+ "url": "http://ariya.ofilabs.com"
+ }
+ ],
+ "name": "esprima",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/ariya/esprima.git"
+ },
+ "scripts": {
+ "analyze-complexity": "node tools/list-complexity.js",
+ "analyze-coverage": "node node_modules/istanbul/lib/cli.js cover test/runner.js",
+ "benchmark": "node test/benchmarks.js",
+ "benchmark-quick": "node test/benchmarks.js quick",
+ "check-complexity": "node node_modules/complexity-report/src/cli.js --maxcc 14 --silent -l -w esprima.js",
+ "check-coverage": "node node_modules/istanbul/lib/cli.js check-coverage --statement 100 --branch 100 --function 100",
+ "check-version": "node tools/check-version.js",
+ "complexity": "npm run-script analyze-complexity && npm run-script check-complexity",
+ "coverage": "npm run-script analyze-coverage && npm run-script check-coverage",
+ "eslint": "node node_modules/eslint/bin/eslint.js esprima.js",
+ "generate-regex": "node tools/generate-identifier-regex.js",
+ "jscs": "node node_modules/.bin/jscs esprima.js",
+ "jslint": "node node_modules/jslint/bin/jslint.js esprima.js",
+ "lint": "npm run-script check-version && npm run-script eslint && npm run-script jscs && npm run-script jslint",
+ "test": "npm run-script lint && node test/run.js && npm run-script coverage && npm run-script complexity"
+ },
+ "version": "1.2.2"
+}
diff --git a/node_modules/jsonpath/node_modules/esprima/test/compat.js b/node_modules/jsonpath/node_modules/esprima/test/compat.js
new file mode 100644
index 00000000..d9b05240
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/test/compat.js
@@ -0,0 +1,241 @@
+/*
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2011 Ariya Hidayat
+
+ 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.
+
+ 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 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.
+*/
+
+/*jslint node: true */
+/*global document: true, window:true, esprima: true, testReflect: true */
+
+var runTests;
+
+function getContext(esprima, reportCase, reportFailure) {
+ 'use strict';
+
+ var Reflect, Pattern;
+
+ // Maps Mozilla Reflect object to our Esprima parser.
+ Reflect = {
+ parse: function (code) {
+ var result;
+
+ reportCase(code);
+
+ try {
+ result = esprima.parse(code);
+ } catch (error) {
+ result = error;
+ }
+
+ return result;
+ }
+ };
+
+ // This is used by Reflect test suite to match a syntax tree.
+ Pattern = function (obj) {
+ var pattern;
+
+ // Poor man's deep object cloning.
+ pattern = JSON.parse(JSON.stringify(obj));
+
+ // Special handling for regular expression literal since we need to
+ // convert it to a string literal, otherwise it will be decoded
+ // as object "{}" and the regular expression would be lost.
+ if (obj.type && obj.type === 'Literal') {
+ if (obj.value instanceof RegExp) {
+ pattern = {
+ type: obj.type,
+ value: obj.value.toString()
+ };
+ }
+ }
+
+ // Special handling for branch statement because SpiderMonkey
+ // prefers to put the 'alternate' property before 'consequent'.
+ if (obj.type && obj.type === 'IfStatement') {
+ pattern = {
+ type: pattern.type,
+ test: pattern.test,
+ consequent: pattern.consequent,
+ alternate: pattern.alternate
+ };
+ }
+
+ // Special handling for do while statement because SpiderMonkey
+ // prefers to put the 'test' property before 'body'.
+ if (obj.type && obj.type === 'DoWhileStatement') {
+ pattern = {
+ type: pattern.type,
+ body: pattern.body,
+ test: pattern.test
+ };
+ }
+
+ function adjustRegexLiteralAndRaw(key, value) {
+ if (key === 'value' && value instanceof RegExp) {
+ value = value.toString();
+ } else if (key === 'raw' && typeof value === "string") {
+ // Ignore Esprima-specific 'raw' property.
+ return undefined;
+ }
+ return value;
+ }
+
+ if (obj.type && (obj.type === 'Program')) {
+ pattern.assert = function (tree) {
+ var actual, expected;
+ actual = JSON.stringify(tree, adjustRegexLiteralAndRaw, 4);
+ expected = JSON.stringify(obj, null, 4);
+
+ if (expected !== actual) {
+ reportFailure(expected, actual);
+ }
+ };
+ }
+
+ return pattern;
+ };
+
+ return {
+ Reflect: Reflect,
+ Pattern: Pattern
+ };
+}
+
+if (typeof window !== 'undefined') {
+ // Run all tests in a browser environment.
+ runTests = function () {
+ 'use strict';
+
+ var total = 0,
+ failures = 0;
+
+ function setText(el, str) {
+ if (typeof el.innerText === 'string') {
+ el.innerText = str;
+ } else {
+ el.textContent = str;
+ }
+ }
+
+ function reportCase(code) {
+ var report, e;
+ report = document.getElementById('report');
+ e = document.createElement('pre');
+ e.setAttribute('class', 'code');
+ setText(e, code);
+ report.appendChild(e);
+ total += 1;
+ }
+
+ function reportFailure(expected, actual) {
+ var report, e;
+
+ failures += 1;
+
+ report = document.getElementById('report');
+
+ e = document.createElement('p');
+ setText(e, 'Expected');
+ report.appendChild(e);
+
+ e = document.createElement('pre');
+ e.setAttribute('class', 'expected');
+ setText(e, expected);
+ report.appendChild(e);
+
+ e = document.createElement('p');
+ setText(e, 'Actual');
+ report.appendChild(e);
+
+ e = document.createElement('pre');
+ e.setAttribute('class', 'actual');
+ setText(e, actual);
+ report.appendChild(e);
+ }
+
+ setText(document.getElementById('version'), esprima.version);
+
+ window.setTimeout(function () {
+ var tick, context = getContext(esprima, reportCase, reportFailure);
+
+ tick = new Date();
+ testReflect(context.Reflect, context.Pattern);
+ tick = (new Date()) - tick;
+
+ if (failures > 0) {
+ document.getElementById('status').className = 'alert-box alert';
+ setText(document.getElementById('status'), total + ' tests. ' +
+ 'Failures: ' + failures + '. ' + tick + ' ms');
+ } else {
+ document.getElementById('status').className = 'alert-box success';
+ setText(document.getElementById('status'), total + ' tests. ' +
+ 'No failure. ' + tick + ' ms');
+ }
+ }, 11);
+ };
+} else {
+ (function (global) {
+ 'use strict';
+ var esprima = require('../esprima'),
+ tick,
+ total = 0,
+ failures = [],
+ header,
+ current,
+ context;
+
+ function reportCase(code) {
+ total += 1;
+ current = code;
+ }
+
+ function reportFailure(expected, actual) {
+ failures.push({
+ source: current,
+ expected: expected.toString(),
+ actual: actual.toString()
+ });
+ }
+
+ context = getContext(esprima, reportCase, reportFailure);
+
+ tick = new Date();
+ require('./reflect').testReflect(context.Reflect, context.Pattern);
+ tick = (new Date()) - tick;
+
+ header = total + ' tests. ' + failures.length + ' failures. ' +
+ tick + ' ms';
+ if (failures.length) {
+ console.error(header);
+ failures.forEach(function (failure) {
+ console.error(failure.source + ': Expected\n ' +
+ failure.expected.split('\n').join('\n ') +
+ '\nto match\n ' + failure.actual);
+ });
+ } else {
+ console.log(header);
+ }
+ process.exit(failures.length === 0 ? 0 : 1);
+ }(this));
+}
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/jsonpath/node_modules/esprima/test/reflect.js b/node_modules/jsonpath/node_modules/esprima/test/reflect.js
new file mode 100644
index 00000000..dba1ba8f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/test/reflect.js
@@ -0,0 +1,422 @@
+// This is modified from Mozilla Reflect.parse test suite (the file is located
+// at js/src/tests/js1_8_5/extensions/reflect-parse.js in the source tree).
+//
+// Some notable changes:
+// * Removed unsupported features (destructuring, let, comprehensions...).
+// * Removed tests for E4X (ECMAScript for XML).
+// * Removed everything related to builder.
+// * Enclosed every 'Pattern' construct with a scope.
+// * Tweaked some expected tree to remove generator field.
+// * Removed the test for bug 632030 and bug 632024.
+
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+(function (exports) {
+
+function testReflect(Reflect, Pattern) {
+
+function program(elts) { return Pattern({ type: "Program", body: elts }) }
+function exprStmt(expr) { return Pattern({ type: "ExpressionStatement", expression: expr }) }
+function throwStmt(expr) { return Pattern({ type: "ThrowStatement", argument: expr }) }
+function returnStmt(expr) { return Pattern({ type: "ReturnStatement", argument: expr }) }
+function yieldExpr(expr) { return Pattern({ type: "YieldExpression", argument: expr }) }
+function lit(val) { return Pattern({ type: "Literal", value: val }) }
+var thisExpr = Pattern({ type: "ThisExpression" });
+function funDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: [],
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ }) }
+function genFunDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration",
+ id: id,
+ params: params,
+ defaults: [],
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ }) }
+function declarator(id, init) { return Pattern({ type: "VariableDeclarator", id: id, init: init }) }
+function varDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "var" }) }
+function letDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "let" }) }
+function constDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "const" }) }
+function ident(name) { return Pattern({ type: "Identifier", name: name }) }
+function dotExpr(obj, id) { return Pattern({ type: "MemberExpression", computed: false, object: obj, property: id }) }
+function memExpr(obj, id) { return Pattern({ type: "MemberExpression", computed: true, object: obj, property: id }) }
+function forStmt(init, test, update, body) { return Pattern({ type: "ForStatement", init: init, test: test, update: update, body: body }) }
+function forInStmt(lhs, rhs, body) { return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body, each: false }) }
+function forEachInStmt(lhs, rhs, body) { return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body, each: true }) }
+function breakStmt(lab) { return Pattern({ type: "BreakStatement", label: lab }) }
+function continueStmt(lab) { return Pattern({ type: "ContinueStatement", label: lab }) }
+function blockStmt(body) { return Pattern({ type: "BlockStatement", body: body }) }
+var emptyStmt = Pattern({ type: "EmptyStatement" });
+function ifStmt(test, cons, alt) { return Pattern({ type: "IfStatement", test: test, alternate: alt, consequent: cons }) }
+function labStmt(lab, stmt) { return Pattern({ type: "LabeledStatement", label: lab, body: stmt }) }
+function withStmt(obj, stmt) { return Pattern({ type: "WithStatement", object: obj, body: stmt }) }
+function whileStmt(test, stmt) { return Pattern({ type: "WhileStatement", test: test, body: stmt }) }
+function doStmt(stmt, test) { return Pattern({ type: "DoWhileStatement", test: test, body: stmt }) }
+function switchStmt(disc, cases) { return Pattern({ type: "SwitchStatement", discriminant: disc, cases: cases }) }
+function caseClause(test, stmts) { return Pattern({ type: "SwitchCase", test: test, consequent: stmts }) }
+function defaultClause(stmts) { return Pattern({ type: "SwitchCase", test: null, consequent: stmts }) }
+function catchClause(id, guard, body) { if (guard) { return Pattern({ type: "GuardedCatchClause", param: id, guard: guard, body: body }) } else { return Pattern({ type: "CatchClause", param: id, body: body }) } }
+function tryStmt(body, guarded, catches, fin) { return Pattern({ type: "TryStatement", block: body, guardedHandlers: guarded, handlers: catches, finalizer: fin }) }
+function letStmt(head, body) { return Pattern({ type: "LetStatement", head: head, body: body }) }
+function funExpr(id, args, body, gen) { return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ defaults: [],
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ }) }
+function genFunExpr(id, args, body) { return Pattern({ type: "FunctionExpression",
+ id: id,
+ params: args,
+ defaults: [],
+ body: body,
+ rest: null,
+ generator: false,
+ expression: false
+ }) }
+
+function unExpr(op, arg) { return Pattern({ type: "UnaryExpression", operator: op, argument: arg, prefix: true }) }
+function binExpr(op, left, right) { return Pattern({ type: "BinaryExpression", operator: op, left: left, right: right }) }
+function aExpr(op, left, right) { return Pattern({ type: "AssignmentExpression", operator: op, left: left, right: right }) }
+function updExpr(op, arg, prefix) { return Pattern({ type: "UpdateExpression", operator: op, argument: arg, prefix: prefix }) }
+function logExpr(op, left, right) { return Pattern({ type: "LogicalExpression", operator: op, left: left, right: right }) }
+
+function condExpr(test, cons, alt) { return Pattern({ type: "ConditionalExpression", test: test, consequent: cons, alternate: alt }) }
+function seqExpr(exprs) { return Pattern({ type: "SequenceExpression", expressions: exprs }) }
+function newExpr(callee, args) { return Pattern({ type: "NewExpression", callee: callee, arguments: args }) }
+function callExpr(callee, args) { return Pattern({ type: "CallExpression", callee: callee, arguments: args }) }
+function arrExpr(elts) { return Pattern({ type: "ArrayExpression", elements: elts }) }
+function objExpr(elts) { return Pattern({ type: "ObjectExpression", properties: elts }) }
+function objProp(key, value, kind) { return Pattern({ type: "Property", key: key, value: value, kind: kind }) }
+
+function arrPatt(elts) { return Pattern({ type: "ArrayPattern", elements: elts }) }
+function objPatt(elts) { return Pattern({ type: "ObjectPattern", properties: elts }) }
+
+function localSrc(src) { return "(function(){ " + src + " })" }
+function localPatt(patt) { return program([exprStmt(funExpr(null, [], blockStmt([patt])))]) }
+function blockSrc(src) { return "(function(){ { " + src + " } })" }
+function blockPatt(patt) { return program([exprStmt(funExpr(null, [], blockStmt([blockStmt([patt])])))]) }
+
+function assertBlockStmt(src, patt) {
+ blockPatt(patt).assert(Reflect.parse(blockSrc(src)));
+}
+
+function assertBlockExpr(src, patt) {
+ assertBlockStmt(src, exprStmt(patt));
+}
+
+function assertBlockDecl(src, patt, builder) {
+ blockPatt(patt).assert(Reflect.parse(blockSrc(src), {builder: builder}));
+}
+
+function assertLocalStmt(src, patt) {
+ localPatt(patt).assert(Reflect.parse(localSrc(src)));
+}
+
+function assertLocalExpr(src, patt) {
+ assertLocalStmt(src, exprStmt(patt));
+}
+
+function assertLocalDecl(src, patt) {
+ localPatt(patt).assert(Reflect.parse(localSrc(src)));
+}
+
+function assertGlobalStmt(src, patt, builder) {
+ program([patt]).assert(Reflect.parse(src, {builder: builder}));
+}
+
+function assertGlobalExpr(src, patt, builder) {
+ program([exprStmt(patt)]).assert(Reflect.parse(src, {builder: builder}));
+ //assertStmt(src, exprStmt(patt));
+}
+
+function assertGlobalDecl(src, patt) {
+ program([patt]).assert(Reflect.parse(src));
+}
+
+function assertProg(src, patt) {
+ program(patt).assert(Reflect.parse(src));
+}
+
+function assertStmt(src, patt) {
+ assertLocalStmt(src, patt);
+ assertGlobalStmt(src, patt);
+ assertBlockStmt(src, patt);
+}
+
+function assertExpr(src, patt) {
+ assertLocalExpr(src, patt);
+ assertGlobalExpr(src, patt);
+ assertBlockExpr(src, patt);
+}
+
+function assertDecl(src, patt) {
+ assertLocalDecl(src, patt);
+ assertGlobalDecl(src, patt);
+ assertBlockDecl(src, patt);
+}
+
+function assertError(src, errorType) {
+ try {
+ Reflect.parse(src);
+ } catch (e) {
+ return;
+ }
+ throw new Error("expected " + errorType.name + " for " + uneval(src));
+}
+
+
+// general tests
+
+// NB: These are useful but for now jit-test doesn't do I/O reliably.
+
+//program(_).assert(Reflect.parse(snarf('data/flapjax.txt')));
+//program(_).assert(Reflect.parse(snarf('data/jquery-1.4.2.txt')));
+//program(_).assert(Reflect.parse(snarf('data/prototype.js')));
+//program(_).assert(Reflect.parse(snarf('data/dojo.js.uncompressed.js')));
+//program(_).assert(Reflect.parse(snarf('data/mootools-1.2.4-core-nc.js')));
+
+
+// declarations
+
+assertDecl("var x = 1, y = 2, z = 3",
+ varDecl([declarator(ident("x"), lit(1)),
+ declarator(ident("y"), lit(2)),
+ declarator(ident("z"), lit(3))]));
+assertDecl("var x, y, z",
+ varDecl([declarator(ident("x"), null),
+ declarator(ident("y"), null),
+ declarator(ident("z"), null)]));
+assertDecl("function foo() { }",
+ funDecl(ident("foo"), [], blockStmt([])));
+assertDecl("function foo() { return 42 }",
+ funDecl(ident("foo"), [], blockStmt([returnStmt(lit(42))])));
+
+
+// Bug 591437: rebound args have their defs turned into uses
+assertDecl("function f(a) { function a() { } }",
+ funDecl(ident("f"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))])));
+assertDecl("function f(a,b,c) { function b() { } }",
+ funDecl(ident("f"), [ident("a"),ident("b"),ident("c")], blockStmt([funDecl(ident("b"), [], blockStmt([]))])));
+
+// expressions
+
+assertExpr("true", lit(true));
+assertExpr("false", lit(false));
+assertExpr("42", lit(42));
+assertExpr("(/asdf/)", lit(/asdf/));
+assertExpr("this", thisExpr);
+assertExpr("foo", ident("foo"));
+assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar")));
+assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar")));
+assertExpr("(function(){})", funExpr(null, [], blockStmt([])));
+assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([])));
+assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([])));
+assertExpr("(++x)", updExpr("++", ident("x"), true));
+assertExpr("(x++)", updExpr("++", ident("x"), false));
+assertExpr("(+x)", unExpr("+", ident("x")));
+assertExpr("(-x)", unExpr("-", ident("x")));
+assertExpr("(!x)", unExpr("!", ident("x")));
+assertExpr("(~x)", unExpr("~", ident("x")));
+assertExpr("(delete x)", unExpr("delete", ident("x")));
+assertExpr("(typeof x)", unExpr("typeof", ident("x")));
+assertExpr("(void x)", unExpr("void", ident("x")));
+assertExpr("(x == y)", binExpr("==", ident("x"), ident("y")));
+assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y")));
+assertExpr("(x === y)", binExpr("===", ident("x"), ident("y")));
+assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y")));
+assertExpr("(x < y)", binExpr("<", ident("x"), ident("y")));
+assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y")));
+assertExpr("(x > y)", binExpr(">", ident("x"), ident("y")));
+assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y")));
+assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y")));
+assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y")));
+assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y")));
+assertExpr("(x + y)", binExpr("+", ident("x"), ident("y")));
+assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z")));
+assertExpr("(x - y)", binExpr("-", ident("x"), ident("y")));
+assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z")));
+assertExpr("(x * y)", binExpr("*", ident("x"), ident("y")));
+assertExpr("(x / y)", binExpr("/", ident("x"), ident("y")));
+assertExpr("(x % y)", binExpr("%", ident("x"), ident("y")));
+assertExpr("(x | y)", binExpr("|", ident("x"), ident("y")));
+assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y")));
+assertExpr("(x & y)", binExpr("&", ident("x"), ident("y")));
+assertExpr("(x in y)", binExpr("in", ident("x"), ident("y")));
+assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y")));
+assertExpr("(x = y)", aExpr("=", ident("x"), ident("y")));
+assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y")));
+assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y")));
+assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y")));
+assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y")));
+assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y")));
+assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y")));
+assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y")));
+assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y")));
+assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y")));
+assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y")));
+assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y")));
+assertExpr("(x || y)", logExpr("||", ident("x"), ident("y")));
+assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y")));
+assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z")))
+assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z")));
+assertExpr("(x,y)", seqExpr([ident("x"),ident("y")]))
+assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")]))
+assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")]));
+assertExpr("(new Object)", newExpr(ident("Object"), []));
+assertExpr("(new Object())", newExpr(ident("Object"), []));
+assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)]));
+assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)]));
+assertExpr("(String())", callExpr(ident("String"), []));
+assertExpr("(String(42))", callExpr(ident("String"), [lit(42)]));
+assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)]));
+assertExpr("[]", arrExpr([]));
+assertExpr("[1]", arrExpr([lit(1)]));
+assertExpr("[1,2]", arrExpr([lit(1),lit(2)]));
+assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)]));
+assertExpr("[1,,2,3]", arrExpr([lit(1),,lit(2),lit(3)]));
+assertExpr("[1,,,2,3]", arrExpr([lit(1),,,lit(2),lit(3)]));
+assertExpr("[1,,,2,,3]", arrExpr([lit(1),,,lit(2),,lit(3)]));
+assertExpr("[1,,,2,,,3]", arrExpr([lit(1),,,lit(2),,,lit(3)]));
+assertExpr("[,1,2,3]", arrExpr([,lit(1),lit(2),lit(3)]));
+assertExpr("[,,1,2,3]", arrExpr([,,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3]", arrExpr([,,,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3,]", arrExpr([,,,lit(1),lit(2),lit(3)]));
+assertExpr("[,,,1,2,3,,]", arrExpr([,,,lit(1),lit(2),lit(3),undefined]));
+assertExpr("[,,,1,2,3,,,]", arrExpr([,,,lit(1),lit(2),lit(3),undefined,undefined]));
+assertExpr("[,,,,,]", arrExpr([undefined,undefined,undefined,undefined,undefined]));
+assertExpr("({})", objExpr([]));
+assertExpr("({x:1})", objExpr([objProp(ident("x"), lit(1), "init")]));
+assertExpr("({x:1, y:2})", objExpr([objProp(ident("x"), lit(1), "init"),
+ objProp(ident("y"), lit(2), "init")]));
+assertExpr("({x:1, y:2, z:3})", objExpr([objProp(ident("x"), lit(1), "init"),
+ objProp(ident("y"), lit(2), "init"),
+ objProp(ident("z"), lit(3), "init") ]));
+assertExpr("({x:1, 'y':2, z:3})", objExpr([objProp(ident("x"), lit(1), "init"),
+ objProp(lit("y"), lit(2), "init"),
+ objProp(ident("z"), lit(3), "init") ]));
+assertExpr("({'x':1, 'y':2, z:3})", objExpr([objProp(lit("x"), lit(1), "init"),
+ objProp(lit("y"), lit(2), "init"),
+ objProp(ident("z"), lit(3), "init") ]));
+assertExpr("({'x':1, 'y':2, 3:3})", objExpr([objProp(lit("x"), lit(1), "init"),
+ objProp(lit("y"), lit(2), "init"),
+ objProp(lit(3), lit(3), "init") ]));
+
+// Bug 571617: eliminate constant-folding
+assertExpr("2 + 3", binExpr("+", lit(2), lit(3)));
+
+// Bug 632026: constant-folding
+assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a"))));
+
+// Bug 632056: constant-folding
+program([exprStmt(ident("f")),
+ ifStmt(lit(1),
+ funDecl(ident("f"), [], blockStmt([])),
+ null)]).assert(Reflect.parse("f; if (1) function f(){}"));
+
+// statements
+
+assertStmt("throw 42", throwStmt(lit(42)));
+assertStmt("for (;;) break", forStmt(null, null, null, breakStmt(null)));
+assertStmt("for (x; y; z) break", forStmt(ident("x"), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (var x; y; z) break", forStmt(varDecl([declarator(ident("x"), null)]), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (var x = 42; y; z) break", forStmt(varDecl([declarator(ident("x"), lit(42))]), ident("y"), ident("z"), breakStmt(null)));
+assertStmt("for (x; ; z) break", forStmt(ident("x"), null, ident("z"), breakStmt(null)));
+assertStmt("for (var x; ; z) break", forStmt(varDecl([declarator(ident("x"), null)]), null, ident("z"), breakStmt(null)));
+assertStmt("for (var x = 42; ; z) break", forStmt(varDecl([declarator(ident("x"), lit(42))]), null, ident("z"), breakStmt(null)));
+assertStmt("for (x; y; ) break", forStmt(ident("x"), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x; y; ) break", forStmt(varDecl([declarator(ident("x"), null)]), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x = 42; y; ) break", forStmt(varDecl([declarator(ident("x"),lit(42))]), ident("y"), null, breakStmt(null)));
+assertStmt("for (var x in y) break", forInStmt(varDecl([declarator(ident("x"),null)]), ident("y"), breakStmt(null)));
+assertStmt("for (x in y) break", forInStmt(ident("x"), ident("y"), breakStmt(null)));
+assertStmt("{ }", blockStmt([]));
+assertStmt("{ throw 1; throw 2; throw 3; }", blockStmt([ throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]));
+assertStmt(";", emptyStmt);
+assertStmt("if (foo) throw 42;", ifStmt(ident("foo"), throwStmt(lit(42)), null));
+assertStmt("if (foo) throw 42; else true;", ifStmt(ident("foo"), throwStmt(lit(42)), exprStmt(lit(true))));
+assertStmt("if (foo) { throw 1; throw 2; throw 3; }",
+ ifStmt(ident("foo"),
+ blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
+ null));
+assertStmt("if (foo) { throw 1; throw 2; throw 3; } else true;",
+ ifStmt(ident("foo"),
+ blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
+ exprStmt(lit(true))));
+assertStmt("foo: for(;;) break foo;", labStmt(ident("foo"), forStmt(null, null, null, breakStmt(ident("foo")))));
+assertStmt("foo: for(;;) continue foo;", labStmt(ident("foo"), forStmt(null, null, null, continueStmt(ident("foo")))));
+assertStmt("with (obj) { }", withStmt(ident("obj"), blockStmt([])));
+assertStmt("with (obj) { obj; }", withStmt(ident("obj"), blockStmt([exprStmt(ident("obj"))])));
+assertStmt("while (foo) { }", whileStmt(ident("foo"), blockStmt([])));
+assertStmt("while (foo) { foo; }", whileStmt(ident("foo"), blockStmt([exprStmt(ident("foo"))])));
+assertStmt("do { } while (foo);", doStmt(blockStmt([]), ident("foo")));
+assertStmt("do { foo; } while (foo)", doStmt(blockStmt([exprStmt(ident("foo"))]), ident("foo")));
+assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; }",
+ switchStmt(ident("foo"),
+ [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
+ caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
+ defaultClause([ exprStmt(lit(3)) ]) ]));
+assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; case 42: 42; }",
+ switchStmt(ident("foo"),
+ [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
+ caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
+ defaultClause([ exprStmt(lit(3)) ]),
+ caseClause(lit(42), [ exprStmt(lit(42)) ]) ]));
+assertStmt("try { } catch (e) { }",
+ tryStmt(blockStmt([]),
+ [],
+ [ catchClause(ident("e"), null, blockStmt([])) ],
+ null));
+assertStmt("try { } catch (e) { } finally { }",
+ tryStmt(blockStmt([]),
+ [],
+ [ catchClause(ident("e"), null, blockStmt([])) ],
+ blockStmt([])));
+assertStmt("try { } finally { }",
+ tryStmt(blockStmt([]),
+ [],
+ [],
+ blockStmt([])));
+
+// redeclarations (TOK_NAME nodes with lexdef)
+
+assertStmt("function f() { function g() { } function g() { } }",
+ funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
+ funDecl(ident("g"), [], blockStmt([]))])));
+
+assertStmt("function f() { function g() { } function g() { return 42 } }",
+ funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
+ funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))])));
+
+assertStmt("function f() { var x = 42; var x = 43; }",
+ funDecl(ident("f"), [], blockStmt([varDecl([declarator(ident("x"),lit(42))]),
+ varDecl([declarator(ident("x"),lit(43))])])));
+
+// getters and setters
+
+ assertExpr("({ get x() { return 42 } })",
+ objExpr([ objProp(ident("x"),
+ funExpr(null, [], blockStmt([returnStmt(lit(42))])),
+ "get" ) ]));
+ assertExpr("({ set x(v) { return 42 } })",
+ objExpr([ objProp(ident("x"),
+ funExpr(null, [ident("v")], blockStmt([returnStmt(lit(42))])),
+ "set" ) ]));
+
+}
+
+exports.testReflect = testReflect;
+
+}(typeof exports === 'undefined' ? this : exports));
diff --git a/node_modules/jsonpath/node_modules/esprima/test/run.js b/node_modules/jsonpath/node_modules/esprima/test/run.js
new file mode 100644
index 00000000..0f08f157
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/test/run.js
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2012 Yusuke Suzuki
+ Copyright (C) 2012 Ariya Hidayat
+
+ 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.
+
+ 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 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.
+*/
+
+/*jslint node:true */
+
+(function () {
+ 'use strict';
+
+ var child = require('child_process'),
+ nodejs = '"' + process.execPath + '"',
+ ret = 0,
+ suites,
+ index;
+
+ suites = [
+ 'runner',
+ 'compat',
+ 'parselibs'
+ ];
+
+ function nextTest() {
+ var suite = suites[index];
+
+ if (index < suites.length) {
+ child.exec(nodejs + ' ./test/' + suite + '.js', function (err, stdout, stderr) {
+ if (stdout) {
+ process.stdout.write(suite + ': ' + stdout);
+ }
+ if (stderr) {
+ process.stderr.write(suite + ': ' + stderr);
+ }
+ if (err) {
+ ret = err.code;
+ }
+ index += 1;
+ nextTest();
+ });
+ } else {
+ process.exit(ret);
+ }
+ }
+
+ index = 0;
+ nextTest();
+}());
diff --git a/node_modules/jsonpath/node_modules/esprima/test/runner.js b/node_modules/jsonpath/node_modules/esprima/test/runner.js
new file mode 100644
index 00000000..fe71f3db
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/test/runner.js
@@ -0,0 +1,495 @@
+/*
+ Copyright (C) 2012 Ariya Hidayat
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Yusuke Suzuki
+ Copyright (C) 2012 Arpad Borsos
+ Copyright (C) 2011 Ariya Hidayat
+ Copyright (C) 2011 Yusuke Suzuki
+ Copyright (C) 2011 Arpad Borsos
+
+ 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.
+
+ 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 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.
+*/
+
+/*jslint browser:true node:true */
+/*global esprima:true, testFixture:true */
+
+var runTests;
+
+// Special handling for regular expression literal since we need to
+// convert it to a string literal, otherwise it will be decoded
+// as object "{}" and the regular expression would be lost.
+function adjustRegexLiteral(key, value) {
+ 'use strict';
+ if (key === 'value' && value instanceof RegExp) {
+ value = value.toString();
+ }
+ return value;
+}
+
+function NotMatchingError(expected, actual) {
+ 'use strict';
+ Error.call(this, 'Expected ');
+ this.expected = expected;
+ this.actual = actual;
+}
+NotMatchingError.prototype = new Error();
+
+function errorToObject(e) {
+ 'use strict';
+ var msg = e.toString();
+
+ // Opera 9.64 produces an non-standard string in toString().
+ if (msg.substr(0, 6) !== 'Error:') {
+ if (typeof e.message === 'string') {
+ msg = 'Error: ' + e.message;
+ }
+ }
+
+ return {
+ index: e.index,
+ lineNumber: e.lineNumber,
+ column: e.column,
+ message: msg
+ };
+}
+
+function sortedObject(o) {
+ if (o === null) {
+ return o;
+ }
+ if (o instanceof Array) {
+ return o.map(sortedObject);
+ }
+ if (typeof o !== 'object') {
+ return o;
+ }
+ if (o instanceof RegExp) {
+ return o;
+ }
+ var keys = Object.keys(o);
+ var result = {
+ range: undefined,
+ loc: undefined
+ };
+ keys.forEach(function (key) {
+ if (o.hasOwnProperty(key)){
+ result[key] = sortedObject(o[key]);
+ }
+ });
+ return result;
+}
+
+function hasAttachedComment(syntax) {
+ var key;
+ for (key in syntax) {
+ if (key === 'leadingComments' || key === 'trailingComments') {
+ return true;
+ }
+ if (typeof syntax[key] === 'object' && syntax[key] !== null) {
+ if (hasAttachedComment(syntax[key])) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+function testParse(esprima, code, syntax) {
+ 'use strict';
+ var expected, tree, actual, options, StringObject, i, len, err;
+
+ // alias, so that JSLint does not complain.
+ StringObject = String;
+
+ options = {
+ comment: (typeof syntax.comments !== 'undefined'),
+ range: true,
+ loc: true,
+ tokens: (typeof syntax.tokens !== 'undefined'),
+ raw: true,
+ tolerant: (typeof syntax.errors !== 'undefined'),
+ source: null
+ };
+
+ if (options.comment) {
+ options.attachComment = hasAttachedComment(syntax);
+ }
+
+ if (typeof syntax.tokens !== 'undefined') {
+ if (syntax.tokens.length > 0) {
+ options.range = (typeof syntax.tokens[0].range !== 'undefined');
+ options.loc = (typeof syntax.tokens[0].loc !== 'undefined');
+ }
+ }
+
+ if (typeof syntax.comments !== 'undefined') {
+ if (syntax.comments.length > 0) {
+ options.range = (typeof syntax.comments[0].range !== 'undefined');
+ options.loc = (typeof syntax.comments[0].loc !== 'undefined');
+ }
+ }
+
+ if (options.loc) {
+ options.source = syntax.loc.source;
+ }
+
+ syntax = sortedObject(syntax);
+ expected = JSON.stringify(syntax, null, 4);
+ try {
+ // Some variations of the options.
+ tree = esprima.parse(code, { tolerant: options.tolerant });
+ tree = esprima.parse(code, { tolerant: options.tolerant, range: true });
+ tree = esprima.parse(code, { tolerant: options.tolerant, loc: true });
+
+ tree = esprima.parse(code, options);
+ tree = (options.comment || options.tokens || options.tolerant) ? tree : tree.body[0];
+
+ if (options.tolerant) {
+ for (i = 0, len = tree.errors.length; i < len; i += 1) {
+ tree.errors[i] = errorToObject(tree.errors[i]);
+ }
+ }
+ tree = sortedObject(tree);
+ actual = JSON.stringify(tree, adjustRegexLiteral, 4);
+
+ // Only to ensure that there is no error when using string object.
+ esprima.parse(new StringObject(code), options);
+
+ } catch (e) {
+ throw new NotMatchingError(expected, e.toString());
+ }
+ if (expected !== actual) {
+ throw new NotMatchingError(expected, actual);
+ }
+
+ function filter(key, value) {
+ if (key === 'value' && value instanceof RegExp) {
+ value = value.toString();
+ }
+ return (key === 'loc' || key === 'range') ? undefined : value;
+ }
+
+ if (options.tolerant) {
+ return;
+ }
+
+
+ // Check again without any location info.
+ options.range = false;
+ options.loc = false;
+ syntax = sortedObject(syntax);
+ expected = JSON.stringify(syntax, filter, 4);
+ try {
+ tree = esprima.parse(code, options);
+ tree = (options.comment || options.tokens) ? tree : tree.body[0];
+
+ if (options.tolerant) {
+ for (i = 0, len = tree.errors.length; i < len; i += 1) {
+ tree.errors[i] = errorToObject(tree.errors[i]);
+ }
+ }
+ tree = sortedObject(tree);
+ actual = JSON.stringify(tree, filter, 4);
+ } catch (e) {
+ throw new NotMatchingError(expected, e.toString());
+ }
+ if (expected !== actual) {
+ throw new NotMatchingError(expected, actual);
+ }
+}
+
+function testTokenize(esprima, code, tokens) {
+ 'use strict';
+ var options, expected, actual, tree;
+
+ options = {
+ comment: true,
+ tolerant: true,
+ loc: true,
+ range: true
+ };
+
+ expected = JSON.stringify(tokens, null, 4);
+
+ try {
+ tree = esprima.tokenize(code, options);
+ actual = JSON.stringify(tree, null, 4);
+ } catch (e) {
+ throw new NotMatchingError(expected, e.toString());
+ }
+ if (expected !== actual) {
+ throw new NotMatchingError(expected, actual);
+ }
+}
+
+function testError(esprima, code, exception) {
+ 'use strict';
+ var i, options, expected, actual, err, handleInvalidRegexFlag, tokenize;
+
+ // Different parsing options should give the same error.
+ options = [
+ {},
+ { comment: true },
+ { raw: true },
+ { raw: true, comment: true }
+ ];
+
+ // If handleInvalidRegexFlag is true, an invalid flag in a regular expression
+ // will throw an exception. In some old version V8, this is not the case
+ // and hence handleInvalidRegexFlag is false.
+ handleInvalidRegexFlag = false;
+ try {
+ 'test'.match(new RegExp('[a-z]', 'x'));
+ } catch (e) {
+ handleInvalidRegexFlag = true;
+ }
+
+ exception.description = exception.message.replace(/Error: Line [0-9]+: /, '');
+
+ if (exception.tokenize) {
+ tokenize = true;
+ exception.tokenize = undefined;
+ }
+ expected = JSON.stringify(exception);
+
+ for (i = 0; i < options.length; i += 1) {
+
+ try {
+ if (tokenize) {
+ esprima.tokenize(code, options[i])
+ } else {
+ esprima.parse(code, options[i]);
+ }
+ } catch (e) {
+ err = errorToObject(e);
+ err.description = e.description;
+ actual = JSON.stringify(err);
+ }
+
+ if (expected !== actual) {
+
+ // Compensate for old V8 which does not handle invalid flag.
+ if (exception.message.indexOf('Invalid regular expression') > 0) {
+ if (typeof actual === 'undefined' && !handleInvalidRegexFlag) {
+ return;
+ }
+ }
+
+ throw new NotMatchingError(expected, actual);
+ }
+
+ }
+}
+
+function testAPI(esprima, code, result) {
+ 'use strict';
+ var expected, res, actual;
+
+ expected = JSON.stringify(result.result, null, 4);
+ try {
+ if (typeof result.property !== 'undefined') {
+ res = esprima[result.property];
+ } else {
+ res = esprima[result.call].apply(esprima, result.args);
+ }
+ actual = JSON.stringify(res, adjustRegexLiteral, 4);
+ } catch (e) {
+ throw new NotMatchingError(expected, e.toString());
+ }
+ if (expected !== actual) {
+ throw new NotMatchingError(expected, actual);
+ }
+}
+
+function runTest(esprima, code, result) {
+ 'use strict';
+ if (result.hasOwnProperty('lineNumber')) {
+ testError(esprima, code, result);
+ } else if (result.hasOwnProperty('result')) {
+ testAPI(esprima, code, result);
+ } else if (result instanceof Array) {
+ testTokenize(esprima, code, result);
+ } else {
+ testParse(esprima, code, result);
+ }
+}
+
+if (typeof window !== 'undefined') {
+ // Run all tests in a browser environment.
+ runTests = function () {
+ 'use strict';
+ var total = 0,
+ failures = 0,
+ category,
+ fixture,
+ source,
+ tick,
+ expected,
+ index,
+ len;
+
+ function setText(el, str) {
+ if (typeof el.innerText === 'string') {
+ el.innerText = str;
+ } else {
+ el.textContent = str;
+ }
+ }
+
+ function startCategory(category) {
+ var report, e;
+ report = document.getElementById('report');
+ e = document.createElement('h4');
+ setText(e, category);
+ report.appendChild(e);
+ }
+
+ function reportSuccess(code) {
+ var report, e;
+ report = document.getElementById('report');
+ e = document.createElement('pre');
+ e.setAttribute('class', 'code');
+ setText(e, code);
+ report.appendChild(e);
+ }
+
+ function reportFailure(code, expected, actual) {
+ var report, e;
+
+ report = document.getElementById('report');
+
+ e = document.createElement('p');
+ setText(e, 'Code:');
+ report.appendChild(e);
+
+ e = document.createElement('pre');
+ e.setAttribute('class', 'code');
+ setText(e, code);
+ report.appendChild(e);
+
+ e = document.createElement('p');
+ setText(e, 'Expected');
+ report.appendChild(e);
+
+ e = document.createElement('pre');
+ e.setAttribute('class', 'expected');
+ setText(e, expected);
+ report.appendChild(e);
+
+ e = document.createElement('p');
+ setText(e, 'Actual');
+ report.appendChild(e);
+
+ e = document.createElement('pre');
+ e.setAttribute('class', 'actual');
+ setText(e, actual);
+ report.appendChild(e);
+ }
+
+ setText(document.getElementById('version'), esprima.version);
+
+ tick = new Date();
+ for (category in testFixture) {
+ if (testFixture.hasOwnProperty(category)) {
+ startCategory(category);
+ fixture = testFixture[category];
+ for (source in fixture) {
+ if (fixture.hasOwnProperty(source)) {
+ expected = fixture[source];
+ total += 1;
+ try {
+ runTest(esprima, source, expected);
+ reportSuccess(source, JSON.stringify(expected, null, 4));
+ } catch (e) {
+ failures += 1;
+ reportFailure(source, e.expected, e.actual);
+ }
+ }
+ }
+ }
+ }
+ tick = (new Date()) - tick;
+
+ if (failures > 0) {
+ document.getElementById('status').className = 'alert-box alert';
+ setText(document.getElementById('status'), total + ' tests. ' +
+ 'Failures: ' + failures + '. ' + tick + ' ms.');
+ } else {
+ document.getElementById('status').className = 'alert-box success';
+ setText(document.getElementById('status'), total + ' tests. ' +
+ 'No failure. ' + tick + ' ms.');
+ }
+ };
+} else {
+ (function () {
+ 'use strict';
+
+ var esprima = require('../esprima'),
+ vm = require('vm'),
+ fs = require('fs'),
+ diff = require('json-diff').diffString,
+ total = 0,
+ failures = [],
+ tick = new Date(),
+ expected,
+ header;
+
+ vm.runInThisContext(fs.readFileSync(__dirname + '/test.js', 'utf-8'));
+
+ Object.keys(testFixture).forEach(function (category) {
+ Object.keys(testFixture[category]).forEach(function (source) {
+ total += 1;
+ expected = testFixture[category][source];
+ try {
+ runTest(esprima, source, expected);
+ } catch (e) {
+ e.source = source;
+ failures.push(e);
+ }
+ });
+ });
+ tick = (new Date()) - tick;
+
+ header = total + ' tests. ' + failures.length + ' failures. ' +
+ tick + ' ms';
+ if (failures.length) {
+ console.error(header);
+ failures.forEach(function (failure) {
+ try {
+ var expectedObject = JSON.parse(failure.expected);
+ var actualObject = JSON.parse(failure.actual);
+
+ console.error(failure.source + ': Expected\n ' +
+ failure.expected.split('\n').join('\n ') +
+ '\nto match\n ' + failure.actual + '\nDiff:\n' +
+ diff(expectedObject, actualObject));
+ } catch (ex) {
+ console.error(failure.source + ': Expected\n ' +
+ failure.expected.split('\n').join('\n ') +
+ '\nto match\n ' + failure.actual);
+ }
+ });
+ } else {
+ console.log(header);
+ }
+ process.exit(failures.length === 0 ? 0 : 1);
+ }());
+}
diff --git a/node_modules/jsonpath/node_modules/esprima/test/test.js b/node_modules/jsonpath/node_modules/esprima/test/test.js
new file mode 100644
index 00000000..2e5831c2
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/esprima/test/test.js
@@ -0,0 +1,25241 @@
+/*
+ Copyright (C) 2013 Mathias Bynens
+ Copyright (C) 2012 Ariya Hidayat
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Yusuke Suzuki
+ Copyright (C) 2012 Arpad Borsos
+ Copyright (C) 2011 Ariya Hidayat
+ Copyright (C) 2011 Yusuke Suzuki
+ Copyright (C) 2011 Arpad Borsos
+
+ 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.
+
+ 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 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 testFixture = {
+
+ 'Primary Expression': {
+
+ 'this\n': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'ThisExpression',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 0 }
+ }
+ }],
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 0 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'this',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ }]
+ },
+
+ 'null\n': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: null,
+ raw: 'null',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 0 }
+ }
+ }],
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 0 }
+ },
+ tokens: [{
+ type: 'Null',
+ value: 'null',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ }]
+ },
+
+ '\n 42\n\n': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [5, 9],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 4, column: 0 }
+ }
+ }],
+ range: [5, 9],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 4, column: 0 }
+ },
+ tokens: [{
+ type: 'Numeric',
+ value: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ }]
+ },
+
+ '(1 + 2 ) * 3': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [1, 2],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [1, 6],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [11, 12],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ }
+
+ },
+
+ 'Grouping Operator': {
+
+ '(1) + (2 ) + 3': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [1, 2],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+
+ '4 + 5 << (6)': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '<<',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Literal',
+ value: 4,
+ raw: '4',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 5,
+ raw: '5',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 6,
+ raw: '6',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ }
+
+ },
+
+ 'Array Initializer': {
+
+ 'x = []': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ }],
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ },
+ tokens: [{
+ type: 'Identifier',
+ value: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [2, 3],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '[',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: ']',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ }]
+ },
+
+ 'x = [ ]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x = [ 42 ]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [{
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [6, 8],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 8 }
+ }
+ }],
+ range: [4, 10],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+
+ 'x = [ 42, ]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [{
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [6, 8],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 8 }
+ }
+ }],
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'x = [ ,, 42 ]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [
+ null,
+ null,
+ {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [9, 11],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 11 }
+ }
+ }],
+ range: [4, 13],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ 'x = [ 1, 2, 3, ]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [{
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ }, {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ }],
+ range: [4, 16],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ 'x = [ 1, 2,, 3, ]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [{
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ }, null, {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ range: [4, 17],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+
+ '日本語 = []': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: '日本語',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [6, 8],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ 'T\u203F = []': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'T\u203F',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'T\u200C = []': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'T\u200C',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'T\u200D = []': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'T\u200D',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '\u2163\u2161 = []': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: '\u2163\u2161',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '\u2163\u2161\u200A=\u2009[]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: '\u2163\u2161',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ }
+
+ },
+
+ 'Object Initializer': {
+
+ 'x = {}': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [],
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x = { }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x = { answer: 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'answer',
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [14, 16],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ kind: 'init',
+ range: [6, 16],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ range: [4, 18],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ },
+
+ 'x = { if: 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'if',
+ range: [6, 8],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ kind: 'init',
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ }],
+ range: [4, 14],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ 'x = { true: 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'true',
+ range: [6, 10],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [12, 14],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ kind: 'init',
+ range: [6, 14],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ range: [4, 16],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ 'x = { false: 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'false',
+ range: [6, 11],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [13, 15],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ kind: 'init',
+ range: [6, 15],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ range: [4, 17],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+
+ 'x = { null: 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'null',
+ range: [6, 10],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [12, 14],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ kind: 'init',
+ range: [6, 14],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ range: [4, 16],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ 'x = { "answer": 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: 'answer',
+ raw: '"answer"',
+ range: [6, 14],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [16, 18],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ kind: 'init',
+ range: [6, 18],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ range: [4, 20],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+
+ 'x = { x: 1, x: 2 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [
+ {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ kind: 'init',
+ range: [6, 10],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'x',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ kind: 'init',
+ range: [12, 16],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 16 }
+ }
+ }
+ ],
+ range: [4, 18],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ },
+
+ 'x = { get width() { return m_width } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'width',
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ReturnStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'm_width',
+ range: [27, 34],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [20, 35],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ kind: 'get',
+ range: [6, 36],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ range: [4, 38],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ },
+
+ 'x = { get undef() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'undef',
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [18, 20],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 20],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ kind: 'get',
+ range: [6, 20],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 20 }
+ }
+ }],
+ range: [4, 22],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ 'x = { get if() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'if',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ kind: 'get',
+ range: [6, 17],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ range: [4, 19],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ },
+
+ 'x = { get true() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'true',
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [17, 19],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [17, 19],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ kind: 'get',
+ range: [6, 19],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ range: [4, 21],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ 'x = { get false() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'false',
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [18, 20],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 20],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ kind: 'get',
+ range: [6, 20],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 20 }
+ }
+ }],
+ range: [4, 22],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ 'x = { get null() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'null',
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [17, 19],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [17, 19],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ kind: 'get',
+ range: [6, 19],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ range: [4, 21],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ 'x = { get "undef"() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: 'undef',
+ raw: '"undef"',
+ range: [10, 17],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [20, 22],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [20, 22],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ kind: 'get',
+ range: [6, 22],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 22 }
+ }
+ }],
+ range: [4, 24],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+
+ 'x = { get 10() {} }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: 10,
+ raw: '10',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ kind: 'get',
+ range: [6, 17],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ range: [4, 19],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ },
+
+ 'x = { set width(w) { m_width = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'width',
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_width',
+ range: [21, 28],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [31, 32],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [21, 32],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [21, 33],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [19, 34],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [19, 34],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ kind: 'set',
+ range: [6, 34],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ range: [4, 36],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+
+ 'x = { set if(w) { m_if = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'if',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_if',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [25, 26],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [18, 26],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [18, 27],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 27 }
+ }
+ }],
+ range: [16, 28],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [16, 28],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ kind: 'set',
+ range: [6, 28],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ range: [4, 30],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [0, 30],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [0, 30],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 30 }
+ }
+ },
+
+ 'x = { set true(w) { m_true = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'true',
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_true',
+ range: [20, 26],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [29, 30],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [20, 30],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [20, 31],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ range: [18, 32],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 32],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ kind: 'set',
+ range: [6, 32],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 32 }
+ }
+ }],
+ range: [4, 34],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+
+ 'x = { set false(w) { m_false = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'false',
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_false',
+ range: [21, 28],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [31, 32],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [21, 32],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [21, 33],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [19, 34],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [19, 34],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ kind: 'set',
+ range: [6, 34],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ range: [4, 36],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+
+ 'x = { set null(w) { m_null = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'null',
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_null',
+ range: [20, 26],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [29, 30],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [20, 30],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [20, 31],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ range: [18, 32],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 32],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ kind: 'set',
+ range: [6, 32],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 32 }
+ }
+ }],
+ range: [4, 34],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+
+ 'x = { set "null"(w) { m_null = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: 'null',
+ raw: '"null"',
+ range: [10, 16],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_null',
+ range: [22, 28],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [31, 32],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [22, 32],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [22, 33],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [20, 34],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [20, 34],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ kind: 'set',
+ range: [6, 34],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ range: [4, 36],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+
+ 'x = { set 10(w) { m_null = w } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: 10,
+ raw: '10',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'w',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_null',
+ range: [18, 24],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'w',
+ range: [27, 28],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [18, 28],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [18, 29],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ range: [16, 30],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [16, 30],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ kind: 'set',
+ range: [6, 30],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 30 }
+ }
+ }],
+ range: [4, 32],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 32 }
+ }
+ },
+
+ 'x = { get: 42 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'get',
+ range: [6, 9],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [11, 13],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ kind: 'init',
+ range: [6, 13],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 13 }
+ }
+ }],
+ range: [4, 15],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+
+ 'x = { set: 43 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'set',
+ range: [6, 9],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 43,
+ raw: '43',
+ range: [11, 13],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ kind: 'init',
+ range: [6, 13],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 13 }
+ }
+ }],
+ range: [4, 15],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+
+ 'x = { __proto__: 2 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: '__proto__',
+ range: [6, 15],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ kind: 'init',
+ range: [6, 18],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ range: [4, 20],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+
+ 'x = {"__proto__": 2 }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: '__proto__',
+ raw: '"__proto__"',
+ range: [5, 16],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ kind: 'init',
+ range: [5, 19],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ range: [4, 21],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ 'x = { get width() { return m_width }, set width(width) { m_width = width; } }': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'width',
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ReturnStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'm_width',
+ range: [27, 34],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [20, 35],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ kind: 'get',
+ range: [6, 36],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 36 }
+ }
+ }, {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'width',
+ range: [42, 47],
+ loc: {
+ start: { line: 1, column: 42 },
+ end: { line: 1, column: 47 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'width',
+ range: [48, 53],
+ loc: {
+ start: { line: 1, column: 48 },
+ end: { line: 1, column: 53 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'm_width',
+ range: [57, 64],
+ loc: {
+ start: { line: 1, column: 57 },
+ end: { line: 1, column: 64 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'width',
+ range: [67, 72],
+ loc: {
+ start: { line: 1, column: 67 },
+ end: { line: 1, column: 72 }
+ }
+ },
+ range: [57, 72],
+ loc: {
+ start: { line: 1, column: 57 },
+ end: { line: 1, column: 72 }
+ }
+ },
+ range: [57, 73],
+ loc: {
+ start: { line: 1, column: 57 },
+ end: { line: 1, column: 73 }
+ }
+ }],
+ range: [55, 75],
+ loc: {
+ start: { line: 1, column: 55 },
+ end: { line: 1, column: 75 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [55, 75],
+ loc: {
+ start: { line: 1, column: 55 },
+ end: { line: 1, column: 75 }
+ }
+ },
+ kind: 'set',
+ range: [38, 75],
+ loc: {
+ start: { line: 1, column: 38 },
+ end: { line: 1, column: 75 }
+ }
+ }],
+ range: [4, 77],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 77 }
+ }
+ },
+ range: [0, 77],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 77 }
+ }
+ },
+ range: [0, 77],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 77 }
+ }
+ }
+
+
+ },
+
+ 'Comments': {
+
+ '/* block comment */ 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [20, 22],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [20, 22],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ '42 /* block comment 1 */ /* block comment 2 */': {
+ "type": "Program",
+ "body": [
+ {
+ "type": "ExpressionStatement",
+ "expression": {
+ "type": "Literal",
+ "value": 42,
+ "raw": "42",
+ "range": [
+ 0,
+ 2
+ ],
+ "trailingComments": [
+ {
+ "type": "Block",
+ "value": " block comment 1 ",
+ "range": [
+ 3,
+ 24
+ ]
+ },
+ {
+ "type": "Block",
+ "value": " block comment 2 ",
+ "range": [
+ 25,
+ 46
+ ]
+ }
+ ]
+ },
+ "range": [
+ 0,
+ 46
+ ]
+ }
+ ],
+ "range": [
+ 0,
+ 46
+ ],
+ "comments": [
+ {
+ "type": "Block",
+ "value": " block comment 1 ",
+ "range": [
+ 3,
+ 24
+ ]
+ },
+ {
+ "type": "Block",
+ "value": " block comment 2 ",
+ "range": [
+ 25,
+ 46
+ ]
+ }
+ ],
+ "tokens": [
+ {
+ "type": "Numeric",
+ "range": [
+ 0,
+ 2
+ ],
+ "value": "42"
+ }
+ ]
+ },
+
+ 'var p1;/* block comment 1 */ /* block comment 2 */': {
+ "range": [
+ 0,
+ 7
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 7
+ }
+ },
+ "type": "Program",
+ "body": [
+ {
+ "range": [
+ 0,
+ 7
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 7
+ }
+ },
+ "type": "VariableDeclaration",
+ "declarations": [
+ {
+ "range": [
+ 4,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 4
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ },
+ "type": "VariableDeclarator",
+ "id": {
+ "range": [
+ 4,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 4
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ },
+ "type": "Identifier",
+ "name": "p1"
+ },
+ "init": null
+ }
+ ],
+ "kind": "var",
+ "trailingComments": [
+ {
+ "range": [
+ 7,
+ 28
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 7
+ },
+ "end": {
+ "line": 1,
+ "column": 28
+ }
+ },
+ "type": "Block",
+ "value": " block comment 1 "
+ },
+ {
+ "range": [
+ 29,
+ 50
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 29
+ },
+ "end": {
+ "line": 1,
+ "column": 50
+ }
+ },
+ "type": "Block",
+ "value": " block comment 2 "
+ }
+ ]
+ }
+ ],
+ "comments": [
+ {
+ "range": [
+ 7,
+ 28
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 7
+ },
+ "end": {
+ "line": 1,
+ "column": 28
+ }
+ },
+ "type": "Block",
+ "value": " block comment 1 "
+ },
+ {
+ "range": [
+ 29,
+ 50
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 29
+ },
+ "end": {
+ "line": 1,
+ "column": 50
+ }
+ },
+ "type": "Block",
+ "value": " block comment 2 "
+ }
+ ],
+ "tokens": [
+ {
+ "range": [
+ 0,
+ 3
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 3
+ }
+ },
+ "type": "Keyword",
+ "value": "var"
+ },
+ {
+ "range": [
+ 4,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 4
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ },
+ "type": "Identifier",
+ "value": "p1"
+ },
+ {
+ "range": [
+ 6,
+ 7
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 6
+ },
+ "end": {
+ "line": 1,
+ "column": 7
+ }
+ },
+ "type": "Punctuator",
+ "value": ";"
+ }
+ ]
+ },
+
+ '/*42*/': {
+ "range": [
+ 6,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 6
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ },
+ "type": "Program",
+ "body": [],
+ "leadingComments": [
+ {
+ "range": [
+ 0,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ },
+ "type": "Block",
+ "value": "42"
+ }
+ ],
+ "comments": [
+ {
+ "range": [
+ 0,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ },
+ "type": "Block",
+ "value": "42"
+ }
+ ],
+ "tokens": []
+ },
+
+ '(a + /* assignmenr */b ) * c': {
+ "type": "Program",
+ "body": [
+ {
+ "type": "ExpressionStatement",
+ "expression": {
+ "type": "BinaryExpression",
+ "operator": "*",
+ "left": {
+ "type": "BinaryExpression",
+ "operator": "+",
+ "left": {
+ "type": "Identifier",
+ "name": "a",
+ "range": [
+ 1,
+ 2
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 2
+ }
+ }
+ },
+ "right": {
+ "type": "Identifier",
+ "name": "b",
+ "range": [
+ 21,
+ 22
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 21
+ },
+ "end": {
+ "line": 1,
+ "column": 22
+ }
+ },
+ "leadingComments": [
+ {
+ "type": "Block",
+ "value": " assignmenr ",
+ "range": [
+ 5,
+ 21
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 5
+ },
+ "end": {
+ "line": 1,
+ "column": 21
+ }
+ }
+ }
+ ]
+ },
+ "range": [
+ 1,
+ 22
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 22
+ }
+ }
+ },
+ "right": {
+ "type": "Identifier",
+ "name": "c",
+ "range": [
+ 27,
+ 28
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 27
+ },
+ "end": {
+ "line": 1,
+ "column": 28
+ }
+ }
+ },
+ "range": [
+ 0,
+ 28
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 28
+ }
+ }
+ },
+ "range": [
+ 0,
+ 28
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 28
+ }
+ }
+ }
+ ],
+ "range": [
+ 0,
+ 28
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 28
+ }
+ },
+ "comments": [
+ {
+ "type": "Block",
+ "value": " assignmenr ",
+ "range": [
+ 5,
+ 21
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 5
+ },
+ "end": {
+ "line": 1,
+ "column": 21
+ }
+ }
+ }
+ ]
+ },
+
+ '/* assignmenr */\n a = b': {
+ "type": "Program",
+ "body": [
+ {
+ "type": "ExpressionStatement",
+ "expression": {
+ "type": "AssignmentExpression",
+ "operator": "=",
+ "left": {
+ "type": "Identifier",
+ "name": "a",
+ "range": [
+ 18,
+ 19
+ ],
+ "loc": {
+ "start": {
+ "line": 2,
+ "column": 1
+ },
+ "end": {
+ "line": 2,
+ "column": 2
+ }
+ }
+ },
+ "right": {
+ "type": "Identifier",
+ "name": "b",
+ "range": [
+ 22,
+ 23
+ ],
+ "loc": {
+ "start": {
+ "line": 2,
+ "column": 5
+ },
+ "end": {
+ "line": 2,
+ "column": 6
+ }
+ }
+ },
+ "range": [
+ 18,
+ 23
+ ],
+ "loc": {
+ "start": {
+ "line": 2,
+ "column": 1
+ },
+ "end": {
+ "line": 2,
+ "column": 6
+ }
+ }
+ },
+ "range": [
+ 18,
+ 23
+ ],
+ "loc": {
+ "start": {
+ "line": 2,
+ "column": 1
+ },
+ "end": {
+ "line": 2,
+ "column": 6
+ }
+ },
+ "leadingComments": [
+ {
+ "type": "Block",
+ "value": " assignmenr ",
+ "range": [
+ 0,
+ 16
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 16
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "range": [
+ 18,
+ 23
+ ],
+ "loc": {
+ "start": {
+ "line": 2,
+ "column": 1
+ },
+ "end": {
+ "line": 2,
+ "column": 6
+ }
+ },
+ "comments": [
+ {
+ "type": "Block",
+ "value": " assignmenr ",
+ "range": [
+ 0,
+ 16
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 16
+ }
+ }
+ }
+ ]
+ },
+
+ '42 /*The*/ /*Answer*/': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ },
+ comments: [{
+ type: 'Block',
+ value: 'The',
+ range: [3, 10],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 10 }
+ }
+ }, {
+ type: 'Block',
+ value: 'Answer',
+ range: [11, 21],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 21 }
+ }
+ }]
+ },
+
+ '42 /*the*/ /*answer*/': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2]
+ },
+ range: [0, 21]
+ }],
+ range: [0, 21],
+ comments: [{
+ type: 'Block',
+ value: 'the',
+ range: [3, 10]
+ }, {
+ type: 'Block',
+ value: 'answer',
+ range: [11, 21]
+ }]
+ },
+
+ '42 /* the * answer */': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ '42 /* The * answer */': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' The * answer ',
+ range: [3, 21],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 21 }
+ }
+ }]
+ },
+
+ '/* multiline\ncomment\nshould\nbe\nignored */ 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [42, 44],
+ loc: {
+ start: { line: 5, column: 11 },
+ end: { line: 5, column: 13 }
+ }
+ },
+ range: [42, 44],
+ loc: {
+ start: { line: 5, column: 11 },
+ end: { line: 5, column: 13 }
+ }
+ },
+
+ '/*a\r\nb*/ 42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [9, 11],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [9, 11],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: 'a\r\nb',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ }],
+ range: [9, 11],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ comments: [{
+ type: 'Block',
+ value: 'a\r\nb',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ },
+
+ '/*a\rb*/ 42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ comments: [{
+ type: 'Block',
+ value: 'a\rb',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ },
+
+ '/*a\nb*/ 42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: 'a\nb',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ }],
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ comments: [{
+ type: 'Block',
+ value: 'a\nb',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ },
+
+ '/*a\nc*/ 42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: 'a\nc',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ }],
+ range: [8, 10],
+ loc: {
+ start: { line: 2, column: 4 },
+ end: { line: 2, column: 6 }
+ },
+ comments: [{
+ type: 'Block',
+ value: 'a\nc',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ }]
+ },
+
+ '// one\\n': {
+ type: 'Program',
+ body: [],
+ range: [8, 8],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 8 }
+ },
+ leadingComments: [{
+ type: 'Line',
+ value: ' one\\n',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ }],
+ comments: [{
+ type: 'Line',
+ value: ' one\\n',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ }]
+ },
+
+ '// line comment\n42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [16, 18],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ },
+ range: [16, 18],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ },
+
+ '42 // line comment': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ },
+ trailingComments: [{
+ type: 'Line',
+ value: ' line comment',
+ range: [3, 18],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 18 }
+ }
+ }]
+ },
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' line comment',
+ range: [3, 18],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 18 }
+ }
+ }]
+ },
+
+ '// Hello, world!\n42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [17, 19],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ },
+ range: [17, 19],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ },
+ leadingComments: [{
+ type: 'Line',
+ value: ' Hello, world!',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }]
+ }],
+ range: [17, 19],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' Hello, world!',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }]
+ },
+
+ '// Hello, world!\n': {
+ type: 'Program',
+ body: [],
+ range: [17, 17],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 0 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' Hello, world!',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }]
+ },
+
+ '// Hallo, world!\n': {
+ type: 'Program',
+ body: [],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 0 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' Hallo, world!',
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }]
+ },
+
+ '//\n42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [3, 5],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ },
+ range: [3, 5],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ },
+ leadingComments: [{
+ type: 'Line',
+ value: '',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ }]
+ }],
+ range: [3, 5],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ },
+ comments: [{
+ type: 'Line',
+ value: '',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ }]
+ },
+
+ '//': {
+ type: 'Program',
+ body: [],
+ range: [2, 2],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 2 }
+ },
+ comments: [{
+ type: 'Line',
+ value: '',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ }]
+ },
+
+ '// ': {
+ type: 'Program',
+ body: [],
+ range: [3, 3],
+ comments: [{
+ type: 'Line',
+ value: ' ',
+ range: [0, 3]
+ }]
+ },
+
+ '/**/42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: '',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ }]
+ }],
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ },
+ comments: [{
+ type: 'Block',
+ value: '',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ }]
+ },
+
+ '42/**/': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ },
+ trailingComments: [{
+ type: 'Block',
+ value: '',
+ range: [2, 6],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 6 }
+ }
+ }]
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ }],
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ },
+ comments: [{
+ type: 'Block',
+ value: '',
+ range: [2, 6],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 6 }
+ }
+ }]
+ },
+
+ '// Hello, world!\n\n// Another hello\n42': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [37, 39],
+ loc: {
+ start: { line: 4, column: 0 },
+ end: { line: 4, column: 2 }
+ }
+ },
+ range: [37, 39],
+ loc: {
+ start: { line: 4, column: 0 },
+ end: { line: 4, column: 2 }
+ },
+ leadingComments: [{
+ type: 'Line',
+ value: ' Hello, world!',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }, {
+ type: 'Line',
+ value: ' Another hello',
+ range: [18, 36],
+ loc: {
+ start: { line: 3, column: 0 },
+ end: { line: 3, column: 18 }
+ }
+ }]
+ }],
+ range: [37, 39],
+ loc: {
+ start: { line: 4, column: 0 },
+ end: { line: 4, column: 2 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' Hello, world!',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }, {
+ type: 'Line',
+ value: ' Another hello',
+ range: [18, 36],
+ loc: {
+ start: { line: 3, column: 0 },
+ end: { line: 3, column: 18 }
+ }
+ }]
+ },
+
+ 'if (x) { doThat() // Some comment\n }': {
+ type: 'Program',
+ body: [{
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ consequent: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [9, 15],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ 'arguments': [],
+ range: [9, 17],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 17 }
+ },
+ trailingComments: [{
+ type: 'Line',
+ value: ' Some comment',
+ range: [18, 33],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 33 }
+ }
+ }]
+ },
+ range: [9, 35],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 2, column: 1 }
+ }
+ }],
+ range: [7, 36],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 2, column: 2 }
+ }
+ },
+ alternate: null,
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ }],
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 2 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' Some comment',
+ range: [18, 33],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 33 }
+ }
+ }]
+ },
+
+ 'if (x) { // Some comment\ndoThat(); }': {
+ type: 'Program',
+ body: [{
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ consequent: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [25, 31],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ 'arguments': [],
+ range: [25, 33],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+ range: [25, 34],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 9 }
+ },
+ leadingComments: [{
+ type: 'Line',
+ value: ' Some comment',
+ range: [9, 24],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 24 }
+ }
+ }]
+ }],
+ range: [7, 36],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 2, column: 11 }
+ }
+ },
+ alternate: null,
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 11 }
+ }
+ }],
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 11 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' Some comment',
+ range: [9, 24],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 24 }
+ }
+ }]
+ },
+
+ 'if (x) { /* Some comment */ doThat() }': {
+ type: 'Program',
+ body: [{
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ consequent: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [28, 34],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ 'arguments': [],
+ range: [28, 36],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [28, 37],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 37 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: ' Some comment ',
+ range: [9, 27],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 27 }
+ }
+ }]
+ }],
+ range: [7, 38],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ alternate: null,
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' Some comment ',
+ range: [9, 27],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 27 }
+ }
+ }]
+ },
+
+ 'if (x) { doThat() /* Some comment */ }': {
+ type: 'Program',
+ body: [{
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ consequent: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [9, 15],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ 'arguments': [],
+ range: [9, 17],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 17 }
+ },
+ trailingComments: [{
+ type: 'Block',
+ value: ' Some comment ',
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ }]
+ },
+ range: [9, 37],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 37 }
+ }
+ }],
+ range: [7, 38],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ alternate: null,
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' Some comment ',
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ }]
+ },
+
+ 'switch (answer) { case 42: /* perfect */ bingo() }': {
+ type: 'Program',
+ body: [{
+ type: 'SwitchStatement',
+ discriminant: {
+ type: 'Identifier',
+ name: 'answer',
+ range: [8, 14],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ cases: [{
+ type: 'SwitchCase',
+ test: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [23, 25],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ consequent: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'bingo',
+ range: [41, 46],
+ loc: {
+ start: { line: 1, column: 41 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ 'arguments': [],
+ range: [41, 48],
+ loc: {
+ start: { line: 1, column: 41 },
+ end: { line: 1, column: 48 }
+ }
+ },
+ range: [41, 49],
+ loc: {
+ start: { line: 1, column: 41 },
+ end: { line: 1, column: 49 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: ' perfect ',
+ range: [27, 40],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 40 }
+ }
+ }]
+ }],
+ range: [18, 49],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 49 }
+ }
+ }],
+ range: [0, 50],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 50 }
+ }
+ }],
+ range: [0, 50],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 50 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' perfect ',
+ range: [27, 40],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 40 }
+ }
+ }]
+ },
+
+ 'switch (answer) { case 42: bingo() /* perfect */ }': {
+ type: 'Program',
+ body: [{
+ type: 'SwitchStatement',
+ discriminant: {
+ type: 'Identifier',
+ name: 'answer',
+ range: [8, 14],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ cases: [{
+ type: 'SwitchCase',
+ test: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [23, 25],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ consequent: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'bingo',
+ range: [27, 32],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ 'arguments': [],
+ range: [27, 34],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 34 }
+ },
+ trailingComments: [{
+ type: 'Block',
+ value: ' perfect ',
+ range: [35, 48],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 48 }
+ }
+ }]
+ },
+ range: [27, 49],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 49 }
+ }
+ }],
+ range: [18, 49],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 49 }
+ }
+ }],
+ range: [0, 50],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 50 }
+ }
+ }],
+ range: [0, 50],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 50 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' perfect ',
+ range: [35, 48],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 48 }
+ }
+ }]
+ },
+
+ '/* header */ (function(){ var version = 1; }).call(this)': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'version',
+ range: [30, 37],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [40, 41],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [30, 41],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ kind: 'var',
+ range: [26, 42],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 42 }
+ }
+ }],
+ range: [24, 44],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 44 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 44],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 44 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'call',
+ range: [46, 50],
+ loc: {
+ start: { line: 1, column: 46 },
+ end: { line: 1, column: 50 }
+ }
+ },
+ range: [13, 50],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 50 }
+ }
+ },
+ 'arguments': [{
+ type: 'ThisExpression',
+ range: [51, 55],
+ loc: {
+ start: { line: 1, column: 51 },
+ end: { line: 1, column: 55 }
+ }
+ }],
+ range: [13, 56],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 56 }
+ }
+ },
+ range: [13, 56],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 56 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: ' header ',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ }]
+ }],
+ range: [13, 56],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 56 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' header ',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ }]
+ },
+
+ '(function(){ var version = 1; /* sync */ }).call(this)': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'version',
+ range: [17, 24],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [27, 28],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [17, 28],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ kind: 'var',
+ range: [13, 29],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 29 }
+ },
+ trailingComments: [{
+ type: 'Block',
+ value: ' sync ',
+ range: [30, 40],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 40 }
+ }
+ }]
+ }],
+ range: [11, 42],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 42],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'call',
+ range: [44, 48],
+ loc: {
+ start: { line: 1, column: 44 },
+ end: { line: 1, column: 48 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: ' sync ',
+ range: [30, 40],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 40 }
+ }
+ }]
+ },
+ range: [0, 48],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 48 }
+ }
+ },
+ 'arguments': [{
+ type: 'ThisExpression',
+ range: [49, 53],
+ loc: {
+ start: { line: 1, column: 49 },
+ end: { line: 1, column: 53 }
+ }
+ }],
+ range: [0, 54],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 54 }
+ }
+ },
+ range: [0, 54],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 54 }
+ }
+ }],
+ range: [0, 54],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 54 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' sync ',
+ range: [30, 40],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 40 }
+ }
+ }]
+ },
+
+ 'function f() { /* infinite */ while (true) { } /* bar */ var each; }': {
+ type: 'Program',
+ body: [{
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [37, 41],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [43, 46],
+ loc: {
+ start: { line: 1, column: 43 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [30, 46],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 46 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: ' infinite ',
+ range: [15, 29],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ trailingComments: [{
+ type: 'Block',
+ value: ' bar ',
+ range: [47, 56],
+ loc: {
+ start: { line: 1, column: 47 },
+ end: { line: 1, column: 56 }
+ }
+ }]
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'each',
+ range: [61, 65],
+ loc: {
+ start: { line: 1, column: 61 },
+ end: { line: 1, column: 65 }
+ }
+ },
+ init: null,
+ range: [61, 65],
+ loc: {
+ start: { line: 1, column: 61 },
+ end: { line: 1, column: 65 }
+ }
+ }],
+ kind: 'var',
+ range: [57, 66],
+ loc: {
+ start: { line: 1, column: 57 },
+ end: { line: 1, column: 66 }
+ },
+ leadingComments: [{
+ type: 'Block',
+ value: ' bar ',
+ range: [47, 56],
+ loc: {
+ start: { line: 1, column: 47 },
+ end: { line: 1, column: 56 }
+ }
+ }]
+ }],
+ range: [13, 68],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 68 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 68],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 68 }
+ }
+ }],
+ range: [0, 68],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 68 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' infinite ',
+ range: [15, 29],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 29 }
+ }
+ }, {
+ type: 'Block',
+ value: ' bar ',
+ range: [47, 56],
+ loc: {
+ start: { line: 1, column: 47 },
+ end: { line: 1, column: 56 }
+ }
+ }]
+ },
+
+ ' comment': {
+ type: 'Program',
+ body: [],
+ range: [11, 11],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 11 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' comment',
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ }]
+ },
+
+ ' comment': {
+ type: 'Program',
+ body: [],
+ range: [14, 14],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 14 }
+ },
+ comments: [{
+ type: 'Line',
+ value: ' comment',
+ range: [3, 14],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 14 }
+ }
+ }]
+ },
+
+ ' \t /* block comment */ --> comment': {
+ type: 'Program',
+ body: [],
+ range: [35, 35],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 35 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' block comment ',
+ range: [3, 22],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 22 }
+ }
+ }, {
+ type: 'Line',
+ value: ' comment',
+ range: [24, 35],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 35 }
+ }
+ }]
+ },
+
+ '/* block comment */--> comment': {
+ type: 'Program',
+ body: [],
+ range: [30, 30],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 30 }
+ },
+ comments: [{
+ type: 'Block',
+ value: ' block comment ',
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ }, {
+ type: 'Line',
+ value: ' comment',
+ range: [19, 30],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 30 }
+ }
+ }]
+ },
+
+ '/* not comment*/; i-->0': {
+ type: 'Program',
+ body: [{
+ type: 'EmptyStatement',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '>',
+ left: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'i',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ prefix: false,
+ range: [18, 21],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ range: [18, 23],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ range: [18, 23],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 23 }
+ }
+ }],
+ range: [16, 23],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 23 }
+ },
+ tokens: [{
+ type: 'Punctuator',
+ value: ';',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'i',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '--',
+ range: [19, 21],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 21 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '>',
+ range: [21, 22],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 22 }
+ }
+ }, {
+ type: 'Numeric',
+ value: '0',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ }]
+
+ },
+
+ 'while (i-->0) {}': {
+ type: 'WhileStatement',
+ test: {
+ type: 'BinaryExpression',
+ operator: '>',
+ left: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'i',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ prefix: false,
+ range: [7, 10],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [11, 12],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [7, 12],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [14, 16],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }
+ },
+
+ 'Numeric Literals': {
+
+ '0': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+
+ '42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+
+ '3': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [0, 1]
+ },
+ range: [0, 1]
+ }],
+ range: [0, 1],
+ tokens: [{
+ type: 'Numeric',
+ value: '3',
+ range: [0, 1]
+ }]
+ },
+
+ '5': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 5,
+ raw: '5',
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ }],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ },
+ tokens: [{
+ type: 'Numeric',
+ value: '5',
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ }]
+ },
+
+ '.14': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0.14,
+ raw: '.14',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ '3.14159': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 3.14159,
+ raw: '3.14159',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '6.02214179e+23': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 6.02214179e+23,
+ raw: '6.02214179e+23',
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ '1.492417830e-10': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 1.49241783e-10,
+ raw: '1.492417830e-10',
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+
+ '0x0': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0,
+ raw: '0x0',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ '0x0;': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0,
+ raw: '0x0',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+
+ '0e+100 ': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0,
+ raw: '0e+100',
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '0e+100': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0,
+ raw: '0e+100',
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ '0xabc': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0xabc,
+ raw: '0xabc',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ '0xdef': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0xdef,
+ raw: '0xdef',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ '0X1A': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0x1A,
+ raw: '0X1A',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+
+ '0x10': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0x10,
+ raw: '0x10',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+
+ '0x100': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0x100,
+ raw: '0x100',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ '0X04': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0X04,
+ raw: '0X04',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+
+ '02': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 2,
+ raw: '02',
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+
+ '012': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 10,
+ raw: '012',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ '0012': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 10,
+ raw: '0012',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ }
+
+ },
+
+ 'String Literals': {
+
+ '"Hello"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello',
+ raw: '"Hello"',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '"\\n\\r\\t\\v\\b\\f\\\\\\\'\\"\\0"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: '\n\r\t\x0B\b\f\\\'"\x00',
+ raw: '"\\n\\r\\t\\v\\b\\f\\\\\\\'\\"\\0"',
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ '"\\u0061"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'a',
+ raw: '"\\u0061"',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ '"\\x61"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'a',
+ raw: '"\\x61"',
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ '"\\u00"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'u00',
+ raw: '"\\u00"',
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ '"\\xt"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'xt',
+ raw: '"\\xt"',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ '"Hello\\nworld"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\nworld',
+ raw: '"Hello\\nworld"',
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ '"Hello\\\nworld"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Helloworld',
+ raw: '"Hello\\\nworld"',
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ },
+
+ '"Hello\\02World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\u0002World',
+ raw: '"Hello\\02World"',
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+
+ '"Hello\\012World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\u000AWorld',
+ raw: '"Hello\\012World"',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '"Hello\\122World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\122World',
+ raw: '"Hello\\122World"',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '"Hello\\0122World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\u000A2World',
+ raw: '"Hello\\0122World"',
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+
+ '"Hello\\312World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\u00CAWorld',
+ raw: '"Hello\\312World"',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '"Hello\\412World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\412World',
+ raw: '"Hello\\412World"',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '"Hello\\812World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello812World',
+ raw: '"Hello\\812World"',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '"Hello\\712World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\712World',
+ raw: '"Hello\\712World"',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '"Hello\\0World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\u0000World',
+ raw: '"Hello\\0World"',
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ '"Hello\\\r\nworld"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Helloworld',
+ raw: '"Hello\\\r\nworld"',
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ },
+
+ '"Hello\\1World"': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'Hello\u0001World',
+ raw: '"Hello\\1World"',
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ }
+ },
+
+ 'Regular Expression Literals': {
+
+ 'var x = /[a-z]/i': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: '/[a-z]/i',
+ raw: '/[a-z]/i',
+ range: [8, 16],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [4, 16],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'RegularExpression',
+ value: '/[a-z]/i',
+ range: [8, 16],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 16 }
+ }
+ }]
+ },
+
+ 'var x = /[x-z]/i': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5]
+ },
+ init: {
+ type: 'Literal',
+ value: '/[x-z]/i',
+ raw: '/[x-z]/i',
+ range: [8, 16]
+ },
+ range: [4, 16]
+ }],
+ kind: 'var',
+ range: [0, 16]
+ }],
+ range: [0, 16],
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ range: [0, 3]
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ range: [4, 5]
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [6, 7]
+ }, {
+ type: 'RegularExpression',
+ value: '/[x-z]/i',
+ range: [8, 16]
+ }]
+ },
+
+ 'var x = /[a-c]/i': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: '/[a-c]/i',
+ raw: '/[a-c]/i',
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ kind: 'var',
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'RegularExpression',
+ value: '/[a-c]/i',
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 16 }
+ }
+ }]
+ },
+
+ 'var x = /[P QR]/i': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: '/[P QR]/i',
+ raw: '/[P QR]/i',
+ range: [8, 17],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [4, 17],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'RegularExpression',
+ value: '/[P QR]/i',
+ range: [8, 17],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 17 }
+ }
+ }]
+ },
+
+ 'var x = /[\\]/]/': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: new RegExp('[\\]/]').toString(),
+ raw: '/[\\]/]/',
+ range: [8, 15],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [4, 15],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'RegularExpression',
+ value: '/[\\]/]/',
+ range: [8, 15],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 15 }
+ }
+ }]
+ },
+
+ 'var x = /foo\\/bar/': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: '/foo\\/bar/',
+ raw: '/foo\\/bar/',
+ range: [8, 18],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [4, 18],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'RegularExpression',
+ value: '/foo\\/bar/',
+ range: [8, 18],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 18 }
+ }
+ }]
+ },
+
+ 'var x = /=([^=\\s])+/g': {
+ type: 'Program',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: '/=([^=\\s])+/g',
+ raw: '/=([^=\\s])+/g',
+ range: [8, 21],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [4, 21],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ },
+ tokens: [{
+ type: 'Keyword',
+ value: 'var',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }, {
+ type: 'Identifier',
+ value: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'Punctuator',
+ value: '=',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'RegularExpression',
+ value: '/=([^=\\s])+/g',
+ range: [8, 21],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 21 }
+ }
+ }]
+ },
+
+ 'var x = /42/g.test': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Literal',
+ value: '/42/g',
+ raw: '/42/g',
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'test',
+ range: [14, 18],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [8, 18],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [4, 18],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ }
+
+ },
+
+ 'Left-Hand-Side Expression': {
+
+ 'new Button': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'Button',
+ range: [4, 10],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+
+ 'new Button()': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'Button',
+ range: [4, 10],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+
+ 'new new foo': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [8, 11],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ 'arguments': [],
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'new new foo()': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [8, 11],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ 'arguments': [],
+ range: [4, 13],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ 'new foo().bar()': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [10, 13],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ },
+
+ 'new foo[bar]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: true,
+ object: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [8, 11],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [4, 12],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+
+ 'new foo.bar()': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [8, 11],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ '( new foo).bar()': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [6, 9],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ 'arguments': [],
+ range: [2, 9],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [11, 14],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ 'foo(bar, baz)': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'bar',
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 'baz',
+ range: [9, 12],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 12 }
+ }
+ }],
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ '( foo )()': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [5, 8],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ 'arguments': [],
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ 'universe.milkyway': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'milkyway',
+ range: [9, 17],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+
+ 'universe.milkyway.solarsystem': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'milkyway',
+ range: [9, 17],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'solarsystem',
+ range: [18, 29],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+
+ 'universe.milkyway.solarsystem.Earth': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'milkyway',
+ range: [9, 17],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'solarsystem',
+ range: [18, 29],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'Earth',
+ range: [30, 35],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [0, 35],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [0, 35],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 35 }
+ }
+ },
+
+ 'universe[galaxyName, otherUselessName]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: true,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'SequenceExpression',
+ expressions: [{
+ type: 'Identifier',
+ name: 'galaxyName',
+ range: [9, 19],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 19 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 'otherUselessName',
+ range: [21, 37],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 37 }
+ }
+ }],
+ range: [9, 37],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ },
+
+ 'universe[galaxyName]': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: true,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'galaxyName',
+ range: [9, 19],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+
+ 'universe[42].galaxies': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'MemberExpression',
+ computed: true,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [9, 11],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'galaxies',
+ range: [13, 21],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ 'universe(42).galaxies': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ 'arguments': [{
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [9, 11],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 11 }
+ }
+ }],
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'galaxies',
+ range: [13, 21],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ 'universe(42).galaxies(14, 3, 77).milkyway': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'CallExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ 'arguments': [{
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [9, 11],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 11 }
+ }
+ }],
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'galaxies',
+ range: [13, 21],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ 'arguments': [{
+ type: 'Literal',
+ value: 14,
+ raw: '14',
+ range: [22, 24],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 24 }
+ }
+ }, {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [26, 27],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 27 }
+ }
+ }, {
+ type: 'Literal',
+ value: 77,
+ raw: '77',
+ range: [29, 31],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'milkyway',
+ range: [33, 41],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [0, 41],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [0, 41],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 41 }
+ }
+ },
+
+ 'earth.asia.Indonesia.prepareForElection(2014)': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'earth',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'asia',
+ range: [6, 10],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'Indonesia',
+ range: [11, 20],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'prepareForElection',
+ range: [21, 39],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ range: [0, 39],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ 'arguments': [{
+ type: 'Literal',
+ value: 2014,
+ raw: '2014',
+ range: [40, 44],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 44 }
+ }
+ }],
+ range: [0, 45],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 45 }
+ }
+ },
+ range: [0, 45],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 45 }
+ }
+ },
+
+ 'universe.if': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'if',
+ range: [9, 11],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'universe.true': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'true',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ 'universe.false': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'false',
+ range: [9, 14],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ 'universe.null': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'MemberExpression',
+ computed: false,
+ object: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ property: {
+ type: 'Identifier',
+ name: 'null',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }
+
+ },
+
+ 'Postfix Expressions': {
+
+ 'x++': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ prefix: false,
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ 'x--': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ prefix: false,
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ 'eval++': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ prefix: false,
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'eval--': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ prefix: false,
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'arguments++': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ prefix: false,
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'arguments--': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ prefix: false,
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ }
+
+ },
+
+ 'Unary Operators': {
+
+ '++x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [2, 3],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ prefix: true,
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ '--x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [2, 3],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ prefix: true,
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+
+ '++eval': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [2, 6],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ prefix: true,
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ '--eval': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [2, 6],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ prefix: true,
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ '++arguments': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [2, 11],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ prefix: true,
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ '--arguments': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [2, 11],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ prefix: true,
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ '+x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: '+',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [1, 2],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ prefix: true,
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+
+ '-x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: '-',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [1, 2],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ prefix: true,
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+
+ '~x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: '~',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [1, 2],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ prefix: true,
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+
+ '!x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: '!',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [1, 2],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ prefix: true,
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ },
+
+ 'void x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: 'void',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ prefix: true,
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'delete x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: 'delete',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ prefix: true,
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ 'typeof x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: 'typeof',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ prefix: true,
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ }
+
+ },
+
+ 'Multiplicative Operators': {
+
+ 'x * y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x / y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '/',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x % y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '%',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ }
+
+ },
+
+ 'Additive Operators': {
+
+ 'x + y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x - y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ '"use strict" + 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ }
+
+ },
+
+ 'Bitwise Shift Operator': {
+
+ 'x << y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '<<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x >> y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '>>',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x >>> y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '>>>',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ }
+
+ },
+
+ 'Relational Operators': {
+
+ 'x < y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x > y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '>',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x <= y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '<=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x >= y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '>=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x in y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: 'in',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x instanceof y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: 'instanceof',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ 'x < y < z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ }
+
+ },
+
+ 'Equality Operators': {
+
+ 'x == y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '==',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x != y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '!=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x === y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '===',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x !== y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '!==',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ }
+
+ },
+
+ 'Binary Bitwise Operators': {
+
+ 'x & y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '&',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x ^ y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '^',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'x | y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ }
+
+ },
+
+ 'Binary Expressions': {
+
+ 'x + y + z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x - y + z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x + y - z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x - y - z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x + y * z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x + y / z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '/',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x - y % z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '%',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x * y * z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x * y / z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '/',
+ left: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x * y % z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '%',
+ left: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x % y * z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'BinaryExpression',
+ operator: '%',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x << y << z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '<<',
+ left: {
+ type: 'BinaryExpression',
+ operator: '<<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'x | y | z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x & y & z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '&',
+ left: {
+ type: 'BinaryExpression',
+ operator: '&',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x ^ y ^ z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '^',
+ left: {
+ type: 'BinaryExpression',
+ operator: '^',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x & y | z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'BinaryExpression',
+ operator: '&',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x | y ^ z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '^',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x | y & z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '&',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ }
+
+ },
+
+ 'Binary Logical Operators': {
+
+ 'x || y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '||',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x && y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '&&',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'x || y || z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '||',
+ left: {
+ type: 'LogicalExpression',
+ operator: '||',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'x && y && z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '&&',
+ left: {
+ type: 'LogicalExpression',
+ operator: '&&',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'x || y && z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '||',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'LogicalExpression',
+ operator: '&&',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [5, 11],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'x || y ^ z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '||',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '^',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [5, 10],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ }
+
+ },
+
+ 'Conditional Operator': {
+
+ 'y ? 1 : 2': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'ConditionalExpression',
+ test: {
+ type: 'Identifier',
+ name: 'y',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ consequent: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ alternate: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x && y ? 1 : 2': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'ConditionalExpression',
+ test: {
+ type: 'LogicalExpression',
+ operator: '&&',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ consequent: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ alternate: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ 'x = (0) ? 1 : 2' : {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [ 0, 1 ],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'ConditionalExpression',
+ test: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [ 5, 6 ],
+ loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 6 } }
+ },
+ consequent: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [ 10, 11 ],
+ loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 11 } }
+ },
+ alternate: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [ 14, 15 ],
+ loc: { start: { line: 1, column: 14 }, end: { line: 1, column: 15 } }
+ },
+ range: [ 4, 15 ],
+ loc: { start: { line: 1, column: 4 }, end: { line: 1, column: 15 } }
+ },
+ range: [ 0, 15 ],
+ loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 15 } }
+ },
+ range: [ 0, 15 ],
+ loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 15 } }
+ }
+ },
+
+ 'Assignment Operators': {
+
+ 'x = 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'eval = 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [7, 9],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'arguments = 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [12, 14],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ 'x *= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '*=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x /= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '/=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x %= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '%=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x += 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '+=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x -= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '-=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x <<= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '<<=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [6, 8],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ 'x >>= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '>>=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [6, 8],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ 'x >>>= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '>>>=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [7, 9],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'x &= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '&=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x ^= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '^=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ 'x |= 42': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '|=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [5, 7],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ }
+
+ },
+
+ 'Complex Expression': {
+
+ 'a || b && c | d ^ e & f == g < h >>> i + j * k': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'LogicalExpression',
+ operator: '||',
+ left: {
+ type: 'Identifier',
+ name: 'a',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'LogicalExpression',
+ operator: '&&',
+ left: {
+ type: 'Identifier',
+ name: 'b',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '|',
+ left: {
+ type: 'Identifier',
+ name: 'c',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '^',
+ left: {
+ type: 'Identifier',
+ name: 'd',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '&',
+ left: {
+ type: 'Identifier',
+ name: 'e',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '==',
+ left: {
+ type: 'Identifier',
+ name: 'f',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'g',
+ range: [27, 28],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '>>>',
+ left: {
+ type: 'Identifier',
+ name: 'h',
+ range: [31, 32],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'i',
+ range: [37, 38],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'j',
+ range: [41, 42],
+ loc: {
+ start: { line: 1, column: 41 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'k',
+ range: [45, 46],
+ loc: {
+ start: { line: 1, column: 45 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [41, 46],
+ loc: {
+ start: { line: 1, column: 41 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [37, 46],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [31, 46],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [27, 46],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [22, 46],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [18, 46],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [14, 46],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [10, 46],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [5, 46],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [0, 46],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ range: [0, 46],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 46 }
+ }
+ }
+
+ },
+
+ 'Block': {
+
+ '{ foo }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [2, 5],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [2, 6],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 6 }
+ }
+ }],
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '{ doThis(); doThat(); }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThis',
+ range: [2, 8],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ 'arguments': [],
+ range: [2, 10],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [2, 11],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 11 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [12, 18],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ 'arguments': [],
+ range: [12, 20],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [12, 21],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ },
+
+ '{}': {
+ type: 'BlockStatement',
+ body: [],
+ range: [0, 2],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 2 }
+ }
+ }
+
+ },
+
+ 'Variable Statement': {
+
+ 'var x': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: null,
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ 'var x, y;': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: null,
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'y',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ init: null,
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'var x = 42': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [8, 10],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [4, 10],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 10 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+
+ 'var eval = 42, arguments = 42': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [4, 8],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [11, 13],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [4, 13],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [15, 24],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [27, 29],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [15, 29],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+
+ 'var x = 14, y = 3, z = 1977': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 14,
+ raw: '14',
+ range: [8, 10],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [4, 10],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 10 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'y',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [12, 17],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 17 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'z',
+ range: [19, 20],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 1977,
+ raw: '1977',
+ range: [23, 27],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [19, 27],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 27 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 27],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 27 }
+ }
+ },
+
+ 'var implements, interface, package': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'implements',
+ range: [4, 14],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ init: null,
+ range: [4, 14],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 14 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'interface',
+ range: [16, 25],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ init: null,
+ range: [16, 25],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 25 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'package',
+ range: [27, 34],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ init: null,
+ range: [27, 34],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+
+ 'var private, protected, public, static': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'private',
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ init: null,
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'protected',
+ range: [13, 22],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ init: null,
+ range: [13, 22],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 22 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'public',
+ range: [24, 30],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ init: null,
+ range: [24, 30],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 30 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'static',
+ range: [32, 38],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ init: null,
+ range: [32, 38],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ }
+
+ },
+
+ 'Let Statement': {
+
+ 'let x': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: null,
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }],
+ kind: 'let',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+
+ '{ let x }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ init: null,
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ }],
+ kind: 'let',
+ range: [2, 8],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 8 }
+ }
+ }],
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ '{ let x = 42 }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ }],
+ kind: 'let',
+ range: [2, 13],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 13 }
+ }
+ }],
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ '{ let x = 14, y = 3, z = 1977 }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 14,
+ raw: '14',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'y',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [14, 19],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 19 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'z',
+ range: [21, 22],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 1977,
+ raw: '1977',
+ range: [25, 29],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [21, 29],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ kind: 'let',
+ range: [2, 30],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 30 }
+ }
+ }],
+ range: [0, 31],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 31 }
+ }
+ }
+
+ },
+
+ 'Const Statement': {
+
+ 'const x = 42': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ }],
+ kind: 'const',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+
+ '{ const x = 42 }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [12, 14],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [8, 14],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ kind: 'const',
+ range: [2, 15],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+
+ '{ const x = 14, y = 3, z = 1977 }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 14,
+ raw: '14',
+ range: [12, 14],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [8, 14],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 14 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'y',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [20, 21],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [16, 21],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 21 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'z',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 1977,
+ raw: '1977',
+ range: [27, 31],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [23, 31],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ kind: 'const',
+ range: [2, 32],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 32 }
+ }
+ }],
+ range: [0, 33],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 33 }
+ }
+ }
+
+ },
+
+ 'Empty Statement': {
+
+ ';': {
+ type: 'EmptyStatement',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ }
+
+ },
+
+ 'Expression Statement': {
+
+ 'x': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+
+ 'x, y': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'SequenceExpression',
+ expressions: [{
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 'y',
+ range: [3, 4],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 4 }
+ }
+ }],
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+
+ '\\u0061': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'a',
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ },
+
+ 'a\\u0061': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'aa',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '\\u0061a': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'aa',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+
+ '\\u0061a ': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'aa',
+ range: [0, 7],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ }
+ },
+
+ 'If Statement': {
+
+ 'if (morning) goodMorning()': {
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'morning',
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ consequent: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'goodMorning',
+ range: [13, 24],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ 'arguments': [],
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ alternate: null,
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ }
+ },
+
+ 'if (morning) (function(){})': {
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'morning',
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ consequent: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [24, 26],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 26],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [13, 27],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ alternate: null,
+ range: [0, 27],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 27 }
+ }
+ },
+
+ 'if (morning) var x = 0;': {
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'morning',
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ consequent: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [21, 22],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [17, 22],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 22 }
+ }
+ }],
+ kind: 'var',
+ range: [13, 23],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ alternate: null,
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ },
+
+ 'if (morning) function a(){}': {
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'morning',
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ consequent: {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'a',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [25, 27],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [13, 27],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ alternate: null,
+ range: [0, 27],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 27 }
+ }
+ },
+
+ 'if (morning) goodMorning(); else goodDay()': {
+ type: 'IfStatement',
+ test: {
+ type: 'Identifier',
+ name: 'morning',
+ range: [4, 11],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ consequent: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'goodMorning',
+ range: [13, 24],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ 'arguments': [],
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [13, 27],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ alternate: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'goodDay',
+ range: [33, 40],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 40 }
+ }
+ },
+ 'arguments': [],
+ range: [33, 42],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ range: [33, 42],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ range: [0, 42],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 42 }
+ }
+ },
+
+ 'if (true) that()\n; else;': {
+ type: "IfStatement",
+ test: {
+ type: "Literal",
+ value: true,
+ raw: "true",
+ range: [4, 8],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ consequent: {
+ type: "ExpressionStatement",
+ expression: {
+ type: "CallExpression",
+ callee: {
+ type: "Identifier",
+ name: "that",
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ "arguments": [],
+ range: [10, 16],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [10, 18],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 2, column: 1 }
+ }
+ },
+ alternate: {
+ type: "EmptyStatement",
+ range: [23, 24],
+ loc: {
+ start: { line: 2, column: 6 },
+ end: { line: 2, column: 7 }
+ }
+ },
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 7 }
+ }
+ },
+
+ 'if (true) that(); else;': {
+ type: "IfStatement",
+ test: {
+ type: "Literal",
+ value: true,
+ raw: "true",
+ range: [4, 8],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ consequent: {
+ type: "ExpressionStatement",
+ expression: {
+ type: "CallExpression",
+ callee: {
+ type: "Identifier",
+ name: "that",
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ "arguments": [],
+ range: [10, 16],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [10, 17],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ alternate: {
+ type: "EmptyStatement",
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ }
+
+ },
+
+ 'Iteration Statements': {
+
+ 'do keep(); while (true)': {
+ type: 'DoWhileStatement',
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'keep',
+ range: [3, 7],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ 'arguments': [],
+ range: [3, 9],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [3, 10],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ },
+
+ 'do keep(); while (true);': {
+ type: 'DoWhileStatement',
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'keep',
+ range: [3, 7],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ 'arguments': [],
+ range: [3, 9],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [3, 10],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+
+ 'do { x++; y--; } while (x < 10)': {
+ type: 'DoWhileStatement',
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ prefix: false,
+ range: [5, 8],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [5, 9],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 9 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'y',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ prefix: false,
+ range: [10, 13],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ range: [3, 16],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ test: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 10,
+ raw: '10',
+ range: [28, 30],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [24, 30],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [0, 31],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 31 }
+ }
+ },
+
+ '{ do { } while (false) false }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'DoWhileStatement',
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [5, 8],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ test: {
+ type: 'Literal',
+ value: false,
+ raw: 'false',
+ range: [16, 21],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [2, 22],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 22 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: false,
+ raw: 'false',
+ range: [23, 28],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [23, 29],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ range: [0, 30],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 30 }
+ }
+ },
+
+ 'do that();while (true)': {
+ type: "DoWhileStatement",
+ body: {
+ type: "ExpressionStatement",
+ expression: {
+ type: "CallExpression",
+ callee: {
+ type: "Identifier",
+ name: "that",
+ range: [3, 7],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ "arguments": [],
+ range: [3, 9],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [3, 10],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ test: {
+ type: "Literal",
+ value: true,
+ raw: "true",
+ range: [17, 21],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ 'do that()\n;while (true)': {
+ type: "DoWhileStatement",
+ body: {
+ type: "ExpressionStatement",
+ expression: {
+ type: "CallExpression",
+ callee: {
+ type: "Identifier",
+ name: "that",
+ range: [3, 7],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ "arguments": [],
+ range: [3, 9],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [3, 11],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 2, column: 1 }
+ }
+ },
+ test: {
+ type: "Literal",
+ value: true,
+ raw: "true",
+ range: [18, 22],
+ loc: {
+ start: { line: 2, column: 8 },
+ end: { line: 2, column: 12 }
+ }
+ },
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 13 }
+ }
+ },
+
+ 'while (true) doSomething()': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doSomething',
+ range: [13, 24],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ 'arguments': [],
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ }
+ },
+
+ 'while (x < 10) { x++; y--; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 10,
+ raw: '10',
+ range: [11, 13],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [7, 13],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ prefix: false,
+ range: [17, 20],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [17, 21],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 21 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'y',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ prefix: false,
+ range: [22, 25],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [22, 26],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 26 }
+ }
+ }],
+ range: [15, 28],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [0, 28],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 28 }
+ }
+ },
+
+ 'for(;;);': {
+ type: 'ForStatement',
+ init: null,
+ test: null,
+ update: null,
+ body: {
+ type: 'EmptyStatement',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ 'for(;;){}': {
+ type: 'ForStatement',
+ init: null,
+ test: null,
+ update: null,
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [7, 9],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+
+ 'for(x = 0;;);': {
+ type: 'ForStatement',
+ init: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ test: null,
+ update: null,
+ body: {
+ type: 'EmptyStatement',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ 'for(var x = 0;;);': {
+ type: 'ForStatement',
+ init: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ }],
+ kind: 'var',
+ range: [4, 13],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ test: null,
+ update: null,
+ body: {
+ type: 'EmptyStatement',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+
+ 'for(let x = 0;;);': {
+ type: 'ForStatement',
+ init: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ }],
+ kind: 'let',
+ range: [4, 13],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ test: null,
+ update: null,
+ body: {
+ type: 'EmptyStatement',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ },
+
+ 'for(var x = 0, y = 1;;);': {
+ type: 'ForStatement',
+ init: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [12, 13],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'y',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [19, 20],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [15, 20],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 20 }
+ }
+ }],
+ kind: 'var',
+ range: [4, 20],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ test: null,
+ update: null,
+ body: {
+ type: 'EmptyStatement',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+
+ 'for(x = 0; x < 42;);': {
+ type: 'ForStatement',
+ init: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ test: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [11, 12],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [11, 17],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ update: null,
+ body: {
+ type: 'EmptyStatement',
+ range: [19, 20],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+
+ 'for(x = 0; x < 42; x++);': {
+ type: 'ForStatement',
+ init: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ test: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [11, 12],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [11, 17],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ update: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [19, 20],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ prefix: false,
+ range: [19, 22],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ body: {
+ type: 'EmptyStatement',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+
+ 'for(x = 0; x < 42; x++) process(x);': {
+ type: 'ForStatement',
+ init: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ test: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [11, 12],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [15, 17],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ range: [11, 17],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ update: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [19, 20],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ prefix: false,
+ range: [19, 22],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'process',
+ range: [24, 31],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'x',
+ range: [32, 33],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [24, 34],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [24, 35],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [0, 35],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 35 }
+ }
+ },
+
+ 'for(x in list) process(x);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'list',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'process',
+ range: [15, 22],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'x',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ }],
+ range: [15, 25],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [15, 26],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ each: false,
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ }
+ },
+
+ 'for (var x in list) process(x);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ init: null,
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ }],
+ kind: 'var',
+ range: [5, 10],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'list',
+ range: [14, 18],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'process',
+ range: [20, 27],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'x',
+ range: [28, 29],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ range: [20, 30],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [20, 31],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ each: false,
+ range: [0, 31],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 31 }
+ }
+ },
+
+ 'for (var x = 42 in list) process(x);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [13, 15],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [9, 15],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ kind: 'var',
+ range: [5, 15],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'list',
+ range: [19, 23],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'process',
+ range: [25, 32],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'x',
+ range: [33, 34],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ range: [25, 35],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [25, 36],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ each: false,
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+
+ 'for (let x in list) process(x);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ init: null,
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ }],
+ kind: 'let',
+ range: [5, 10],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'list',
+ range: [14, 18],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'process',
+ range: [20, 27],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'x',
+ range: [28, 29],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ range: [20, 30],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [20, 31],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ each: false,
+ range: [0, 31],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 31 }
+ }
+ },
+
+ 'for (var x = y = z in q);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ init: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'y',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [13, 18],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [9, 18],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ kind: 'var',
+ range: [5, 18],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'q',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ body: {
+ type: 'EmptyStatement',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ each: false,
+ range: [0, 25],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 25 }
+ }
+ },
+
+ 'for (var a = b = c = (d in e) in z);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'a',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ init: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'b',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ right: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'c',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: 'in',
+ left: {
+ type: 'Identifier',
+ name: 'd',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'e',
+ range: [27, 28],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [22, 28],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [17, 29],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [13, 29],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [9, 29],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ kind: 'var',
+ range: [5, 29],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [33, 34],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ body: {
+ type: 'EmptyStatement',
+ range: [35, 36],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ each: false,
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+
+ 'for (var i = function() { return 10 in [] } in list) process(x);': {
+ type: 'ForInStatement',
+ left: {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'i',
+ range: [9, 10],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ init: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ReturnStatement',
+ argument: {
+ type: 'BinaryExpression',
+ operator: 'in',
+ left: {
+ type: 'Literal',
+ value: 10,
+ raw: '10',
+ range: [33, 35],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [39, 41],
+ loc: {
+ start: { line: 1, column: 39 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [33, 41],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [26, 42],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 42 }
+ }
+ }],
+ range: [24, 43],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [13, 43],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ range: [9, 43],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 43 }
+ }
+ }],
+ kind: 'var',
+ range: [5, 43],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'list',
+ range: [47, 51],
+ loc: {
+ start: { line: 1, column: 47 },
+ end: { line: 1, column: 51 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'process',
+ range: [53, 60],
+ loc: {
+ start: { line: 1, column: 53 },
+ end: { line: 1, column: 60 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'x',
+ range: [61, 62],
+ loc: {
+ start: { line: 1, column: 61 },
+ end: { line: 1, column: 62 }
+ }
+ }],
+ range: [53, 63],
+ loc: {
+ start: { line: 1, column: 53 },
+ end: { line: 1, column: 63 }
+ }
+ },
+ range: [53, 64],
+ loc: {
+ start: { line: 1, column: 53 },
+ end: { line: 1, column: 64 }
+ }
+ },
+ each: false,
+ range: [0, 64],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 64 }
+ }
+ }
+
+ },
+
+ 'continue statement': {
+
+ 'while (true) { continue; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ContinueStatement',
+ label: null,
+ range: [15, 24],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 24 }
+ }
+ }
+ ],
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ }
+ },
+
+ 'while (true) { continue }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ContinueStatement',
+ label: null,
+ range: [15, 24],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 24 }
+ }
+ }
+ ],
+ range: [13, 25],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [0, 25],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 25 }
+ }
+ },
+
+ 'done: while (true) { continue done }': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [13, 17],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ContinueStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [30, 34],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [21, 35],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 35 }
+ }
+ }
+ ],
+ range: [19, 36],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [6, 36],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ }
+ },
+
+ 'done: while (true) { continue done; }': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [13, 17],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ContinueStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [30, 34],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [21, 35],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 35 }
+ }
+ }
+ ],
+ range: [19, 37],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ range: [6, 37],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ range: [0, 37],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 37 }
+ }
+ },
+
+ '__proto__: while (true) { continue __proto__; }': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: '__proto__',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ContinueStatement',
+ label: {
+ type: 'Identifier',
+ name: '__proto__',
+ range: [35, 44],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 44 }
+ }
+ },
+ range: [26, 45],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 45 }
+ }
+ }],
+ range: [24, 47],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 47 }
+ }
+ },
+ range: [11, 47],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 47 }
+ }
+ },
+ range: [0, 47],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 47 }
+ }
+ }
+
+ },
+
+ 'break statement': {
+
+ 'while (true) { break }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'BreakStatement',
+ label: null,
+ range: [15, 21],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 21 }
+ }
+ }
+ ],
+ range: [13, 22],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ 'done: while (true) { break done }': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [13, 17],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'BreakStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [27, 31],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [21, 32],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 32 }
+ }
+ }
+ ],
+ range: [19, 33],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ range: [6, 33],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ range: [0, 33],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 33 }
+ }
+ },
+
+ 'done: while (true) { break done; }': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [13, 17],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'BreakStatement',
+ label: {
+ type: 'Identifier',
+ name: 'done',
+ range: [27, 31],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [21, 32],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 32 }
+ }
+ }
+ ],
+ range: [19, 34],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [6, 34],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+
+ '__proto__: while (true) { break __proto__; }': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: '__proto__',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'BreakStatement',
+ label: {
+ type: 'Identifier',
+ name: '__proto__',
+ range: [32, 41],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [26, 42],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 42 }
+ }
+ }],
+ range: [24, 44],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 44 }
+ }
+ },
+ range: [11, 44],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 44 }
+ }
+ },
+ range: [0, 44],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 44 }
+ }
+ }
+
+ },
+
+ 'return statement': {
+
+ '(function(){ return })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: null,
+ range: [13, 20],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 20 }
+ }
+ }
+ ],
+ range: [11, 21],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 21],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ },
+
+ '(function(){ return; })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: null,
+ range: [13, 20],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 20 }
+ }
+ }
+ ],
+ range: [11, 22],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 22],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ },
+
+ '(function(){ return x; })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [20, 21],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [13, 22],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 22 }
+ }
+ }
+ ],
+ range: [11, 24],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 24],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [0, 25],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 25 }
+ }
+ },
+
+ '(function(){ return x * y })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [20, 21],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [20, 25],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [13, 26],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 26 }
+ }
+ }
+ ],
+ range: [11, 27],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 27],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [0, 28],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 28 }
+ }
+ }
+ },
+
+ 'with statement': {
+
+ 'with (x) foo = bar': {
+ type: 'WithStatement',
+ object: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [9, 12],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [15, 18],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [9, 18],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [9, 18],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ },
+
+ 'with (x) foo = bar;': {
+ type: 'WithStatement',
+ object: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [9, 12],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [15, 18],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [9, 18],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [9, 19],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ },
+
+ 'with (x) { foo = bar }': {
+ type: 'WithStatement',
+ object: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [11, 14],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'bar',
+ range: [17, 20],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [11, 20],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [11, 21],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [9, 22],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ }
+ }
+
+ },
+
+ 'switch statement': {
+
+ 'switch (x) {}': {
+ type: 'SwitchStatement',
+ discriminant: {
+ type: 'Identifier',
+ name: 'x',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ cases:[],
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ },
+
+ 'switch (answer) { case 42: hi(); break; }': {
+ type: 'SwitchStatement',
+ discriminant: {
+ type: 'Identifier',
+ name: 'answer',
+ range: [8, 14],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ cases: [{
+ type: 'SwitchCase',
+ test: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [23, 25],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ consequent: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'hi',
+ range: [27, 29],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ 'arguments': [],
+ range: [27, 31],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [27, 32],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 32 }
+ }
+ }, {
+ type: 'BreakStatement',
+ label: null,
+ range: [33, 39],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 39 }
+ }
+ }],
+ range: [18, 39],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 39 }
+ }
+ }],
+ range: [0, 41],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 41 }
+ }
+ },
+
+ 'switch (answer) { case 42: hi(); break; default: break }': {
+ type: 'SwitchStatement',
+ discriminant: {
+ type: 'Identifier',
+ name: 'answer',
+ range: [8, 14],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ cases: [{
+ type: 'SwitchCase',
+ test: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [23, 25],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ consequent: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'hi',
+ range: [27, 29],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ 'arguments': [],
+ range: [27, 31],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [27, 32],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 32 }
+ }
+ }, {
+ type: 'BreakStatement',
+ label: null,
+ range: [33, 39],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 39 }
+ }
+ }],
+ range: [18, 39],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 39 }
+ }
+ }, {
+ type: 'SwitchCase',
+ test: null,
+ consequent: [{
+ type: 'BreakStatement',
+ label: null,
+ range: [49, 55],
+ loc: {
+ start: { line: 1, column: 49 },
+ end: { line: 1, column: 55 }
+ }
+ }],
+ range: [40, 55],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 55 }
+ }
+ }],
+ range: [0, 56],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 56 }
+ }
+ }
+
+ },
+
+ 'Labelled Statements': {
+
+ 'start: for (;;) break start': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: 'start',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ body: {
+ type: 'ForStatement',
+ init: null,
+ test: null,
+ update: null,
+ body: {
+ type: 'BreakStatement',
+ label: {
+ type: 'Identifier',
+ name: 'start',
+ range: [22, 27],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [16, 27],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [7, 27],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [0, 27],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 27 }
+ }
+ },
+
+ 'start: while (true) break start': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: 'start',
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ body: {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [14, 18],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ body: {
+ type: 'BreakStatement',
+ label: {
+ type: 'Identifier',
+ name: 'start',
+ range: [26, 31],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [20, 31],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [7, 31],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [0, 31],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 31 }
+ }
+ },
+
+ '__proto__: test': {
+ type: 'LabeledStatement',
+ label: {
+ type: 'Identifier',
+ name: '__proto__',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ body: {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'test',
+ range: [11, 15],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [11, 15],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ range: [0, 15],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 15 }
+ }
+ }
+
+ },
+
+ 'throw statement': {
+
+ 'throw x;': {
+ type: 'ThrowStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ range: [0, 8],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 8 }
+ }
+ },
+
+ 'throw x * y': {
+ type: 'ThrowStatement',
+ argument: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [6, 11],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ range: [0, 11],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 11 }
+ }
+ },
+
+ 'throw { message: "Error" }': {
+ type: 'ThrowStatement',
+ argument: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'message',
+ range: [8, 15],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 'Error',
+ raw: '"Error"',
+ range: [17, 24],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ kind: 'init',
+ range: [8, 24],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 24 }
+ }
+ }],
+ range: [6, 26],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ }
+ }
+
+ },
+
+ 'try statement': {
+
+ 'try { } catch (e) { }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'e',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [18, 21],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ range: [8, 21],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ finalizer: null,
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ }
+ },
+
+ 'try { } catch (eval) { }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [15, 19],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [21, 24],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [8, 24],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 24 }
+ }
+ }],
+ finalizer: null,
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+
+ 'try { } catch (arguments) { }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [15, 24],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [26, 29],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [8, 29],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ finalizer: null,
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+
+ 'try { } catch (e) { say(e) }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'e',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'say',
+ range: [20, 23],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'e',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ }],
+ range: [20, 26],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [20, 27],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 27 }
+ }
+ }],
+ range: [18, 28],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [8, 28],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ finalizer: null,
+ range: [0, 28],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 28 }
+ }
+ },
+
+ 'try { } finally { cleanup(stuff) }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [4, 7],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [],
+ finalizer: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'cleanup',
+ range: [18, 25],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'stuff',
+ range: [26, 31],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ range: [18, 32],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [18, 33],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [16, 34],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+
+ 'try { doThat(); } catch (e) { say(e) }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ 'arguments': [],
+ range: [6, 14],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [6, 15],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ range: [4, 17],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'e',
+ range: [25, 26],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'say',
+ range: [30, 33],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'e',
+ range: [34, 35],
+ loc: {
+ start: { line: 1, column: 34 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ range: [30, 36],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [30, 37],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 37 }
+ }
+ }],
+ range: [28, 38],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [18, 38],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ finalizer: null,
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ },
+
+ 'try { doThat(); } catch (e) { say(e) } finally { cleanup(stuff) }': {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'doThat',
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ 'arguments': [],
+ range: [6, 14],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ range: [6, 15],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 15 }
+ }
+ }],
+ range: [4, 17],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'e',
+ range: [25, 26],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'say',
+ range: [30, 33],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'e',
+ range: [34, 35],
+ loc: {
+ start: { line: 1, column: 34 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ range: [30, 36],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [30, 37],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 37 }
+ }
+ }],
+ range: [28, 38],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [18, 38],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ finalizer: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'cleanup',
+ range: [49, 56],
+ loc: {
+ start: { line: 1, column: 49 },
+ end: { line: 1, column: 56 }
+ }
+ },
+ 'arguments': [{
+ type: 'Identifier',
+ name: 'stuff',
+ range: [57, 62],
+ loc: {
+ start: { line: 1, column: 57 },
+ end: { line: 1, column: 62 }
+ }
+ }],
+ range: [49, 63],
+ loc: {
+ start: { line: 1, column: 49 },
+ end: { line: 1, column: 63 }
+ }
+ },
+ range: [49, 64],
+ loc: {
+ start: { line: 1, column: 49 },
+ end: { line: 1, column: 64 }
+ }
+ }],
+ range: [47, 65],
+ loc: {
+ start: { line: 1, column: 47 },
+ end: { line: 1, column: 65 }
+ }
+ },
+ range: [0, 65],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 65 }
+ }
+ }
+
+ },
+
+ 'debugger statement': {
+
+ 'debugger;': {
+ type: 'DebuggerStatement',
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 }
+ }
+ }
+
+ },
+
+ 'Function Definition': {
+
+ 'function hello() { sayHi(); }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'hello',
+ range: [9, 14],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'sayHi',
+ range: [19, 24],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ 'arguments': [],
+ range: [19, 26],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [19, 27],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 27 }
+ }
+ }],
+ range: [17, 29],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+
+ 'function eval() { }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [16, 19],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ }
+ },
+
+ 'function arguments() { }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [9, 18],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [21, 24],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ }
+ },
+
+ 'function test(t, t) { }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'test',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 't',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 't',
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [20, 23],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ },
+
+ '(function test(t, t) { })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'test',
+ range: [10, 14],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 't',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 't',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [21, 24],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 24],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [0, 25],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 25 }
+ }
+ },
+
+ 'function eval() { function inner() { "use strict" } }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'inner',
+ range: [27, 32],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '\"use strict\"',
+ range: [37, 49],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 49 }
+ }
+ },
+ range: [37, 50],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 50 }
+ }
+ }],
+ range: [35, 51],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 51 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [18, 51],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 51 }
+ }
+ }],
+ range: [16, 53],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 53 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 53],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 53 }
+ }
+ },
+
+ 'function hello(a) { sayHi(); }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'hello',
+ range: [9, 14],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'a',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'sayHi',
+ range: [20, 25],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ 'arguments': [],
+ range: [20, 27],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [20, 28],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ range: [18, 30],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 30],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 30 }
+ }
+ },
+
+ 'function hello(a, b) { sayHi(); }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'hello',
+ range: [9, 14],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'a',
+ range: [15, 16],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 16 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 'b',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'sayHi',
+ range: [23, 28],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ 'arguments': [],
+ range: [23, 30],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [23, 31],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ range: [21, 33],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 33],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 33 }
+ }
+ },
+
+ 'var hi = function() { sayHi() };': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'hi',
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ init: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'sayHi',
+ range: [22, 27],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ 'arguments': [],
+ range: [22, 29],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [22, 30],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 30 }
+ }
+ }],
+ range: [20, 31],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [9, 31],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [4, 31],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 32 }
+ }
+ },
+
+ 'var hi = function eval() { };': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'hi',
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ init: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [25, 28],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [9, 28],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [4, 28],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+
+ 'var hi = function arguments() { };': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'hi',
+ range: [4, 6],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ init: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [18, 27],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [30, 33],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [9, 33],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ range: [4, 33],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ }
+ },
+
+ 'var hello = function hi() { sayHi() };': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'hello',
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ init: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'hi',
+ range: [21, 23],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'sayHi',
+ range: [28, 33],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ 'arguments': [],
+ range: [28, 35],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [28, 36],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ range: [26, 37],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [12, 37],
+ loc: {
+ start: { line: 1, column: 12 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ range: [4, 37],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 37 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ },
+
+ '(function(){})': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [11, 13],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 13],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [0, 14],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 14 }
+ }
+ },
+
+ 'function universe(__proto__) { }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'universe',
+ range: [9, 17],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: '__proto__',
+ range: [18, 27],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 27 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [29, 32],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 32 }
+ }
+ },
+
+ 'function test() { "use strict" + 42; }': {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'test',
+ range: [9, 13],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [18, 30],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [33, 35],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [18, 35],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ range: [16, 38],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ }
+ }
+
+ },
+
+ 'Automatic semicolon insertion': {
+
+ '{ x\n++y }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'x',
+ range: [2, 3],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [2, 4],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 2, column: 0 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'y',
+ range: [6, 7],
+ loc: {
+ start: { line: 2, column: 2 },
+ end: { line: 2, column: 3 }
+ }
+ },
+ prefix: true,
+ range: [4, 7],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ },
+ range: [4, 8],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 4 }
+ }
+ }],
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+
+ '{ x\n--y }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'x',
+ range: [2, 3],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [2, 4],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 2, column: 0 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'y',
+ range: [6, 7],
+ loc: {
+ start: { line: 2, column: 2 },
+ end: { line: 2, column: 3 }
+ }
+ },
+ prefix: true,
+ range: [4, 7],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 3 }
+ }
+ },
+ range: [4, 8],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 4 }
+ }
+ }],
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+
+ 'var x /* comment */;': {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: null,
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ }],
+ kind: 'var',
+ range: [0, 20],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 20 }
+ }
+ },
+
+ '{ var x = 14, y = 3\nz; }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [6, 7],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 7 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 14,
+ raw: '14',
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [6, 12],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 12 }
+ }
+ }, {
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'y',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ init: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ range: [14, 19],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ kind: 'var',
+ range: [2, 20],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 2, column: 0 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'z',
+ range: [20, 21],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 1 }
+ }
+ },
+ range: [20, 22],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ }],
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 4 }
+ }
+ },
+
+ 'while (true) { continue\nthere; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ContinueStatement',
+ label: null,
+ range: [15, 23],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 23 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'there',
+ range: [24, 29],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+ range: [24, 30],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [13, 32],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 2, column: 8 }
+ }
+ },
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+
+ 'while (true) { continue // Comment\nthere; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ContinueStatement',
+ label: null,
+ range: [15, 23],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 23 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'there',
+ range: [35, 40],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+ range: [35, 41],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [13, 43],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 2, column: 8 }
+ }
+ },
+ range: [0, 43],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+
+ 'while (true) { continue /* Multiline\nComment */there; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ContinueStatement',
+ label: null,
+ range: [15, 23],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 23 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'there',
+ range: [47, 52],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 15 }
+ }
+ },
+ range: [47, 53],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 16 }
+ }
+ }],
+ range: [13, 55],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 2, column: 18 }
+ }
+ },
+ range: [0, 55],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 18 }
+ }
+ },
+
+ 'while (true) { break\nthere; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'BreakStatement',
+ label: null,
+ range: [15, 20],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 20 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'there',
+ range: [21, 26],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+ range: [21, 27],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [13, 29],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 2, column: 8 }
+ }
+ },
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+
+ 'while (true) { break // Comment\nthere; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'BreakStatement',
+ label: null,
+ range: [15, 20],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 20 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'there',
+ range: [32, 37],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+ range: [32, 38],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [13, 40],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 2, column: 8 }
+ }
+ },
+ range: [0, 40],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+
+ 'while (true) { break /* Multiline\nComment */there; }': {
+ type: 'WhileStatement',
+ test: {
+ type: 'Literal',
+ value: true,
+ raw: 'true',
+ range: [7, 11],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 11 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'BreakStatement',
+ label: null,
+ range: [15, 20],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 20 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'there',
+ range: [44, 49],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 15 }
+ }
+ },
+ range: [44, 50],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 16 }
+ }
+ }],
+ range: [13, 52],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 2, column: 18 }
+ }
+ },
+ range: [0, 52],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 18 }
+ }
+ },
+
+ '(function(){ return\nx; })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: null,
+ range: [13, 19],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'x',
+ range: [20, 21],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 1 }
+ }
+ },
+ range: [20, 22],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ }
+ ],
+ range: [11, 24],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 2, column: 4 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 24],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 2, column: 4 }
+ }
+ },
+ range: [0, 25],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+
+ '(function(){ return // Comment\nx; })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: null,
+ range: [13, 19],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'x',
+ range: [31, 32],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 1 }
+ }
+ },
+ range: [31, 33],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 2 }
+ }
+ }
+ ],
+ range: [11, 35],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 2, column: 4 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 35],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 2, column: 4 }
+ }
+ },
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+
+ '(function(){ return/* Multiline\nComment */x; })': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ReturnStatement',
+ argument: null,
+ range: [13, 19],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'x',
+ range: [42, 43],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 11 }
+ }
+ },
+ range: [42, 44],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 12 }
+ }
+ }
+ ],
+ range: [11, 46],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 2, column: 14 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 46],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 2, column: 14 }
+ }
+ },
+ range: [0, 47],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 15 }
+ }
+ },
+
+ '{ throw error\nerror; }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ThrowStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'error',
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [2, 14],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 2, column: 0 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'error',
+ range: [14, 19],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+ range: [14, 20],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+
+ '{ throw error// Comment\nerror; }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ThrowStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'error',
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [2, 24],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 2, column: 0 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'error',
+ range: [24, 29],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 5 }
+ }
+ },
+ range: [24, 30],
+ loc: {
+ start: { line: 2, column: 0 },
+ end: { line: 2, column: 6 }
+ }
+ }],
+ range: [0, 32],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 8 }
+ }
+ },
+
+ '{ throw error/* Multiline\nComment */error; }': {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ThrowStatement',
+ argument: {
+ type: 'Identifier',
+ name: 'error',
+ range: [8, 13],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 13 }
+ }
+ },
+ range: [2, 36],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 2, column: 10 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'error',
+ range: [36, 41],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 15 }
+ }
+ },
+ range: [36, 42],
+ loc: {
+ start: { line: 2, column: 10 },
+ end: { line: 2, column: 16 }
+ }
+ }],
+ range: [0, 44],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 2, column: 18 }
+ }
+ }
+
+ },
+
+ 'Directive Prolog': {
+
+ '(function () { \'use\\x20strict\'; with (i); }())': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '\'use\\x20strict\'',
+ range: [15, 30],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ range: [15, 31],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 31 }
+ }
+ }, {
+ type: 'WithStatement',
+ object: {
+ type: 'Identifier',
+ name: 'i',
+ range: [38, 39],
+ loc: {
+ start: { line: 1, column: 38 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ body: {
+ type: 'EmptyStatement',
+ range: [40, 41],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [32, 41],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ range: [13, 43],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 43],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ 'arguments': [],
+ range: [1, 45],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 45 }
+ }
+ },
+ range: [0, 46],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 46 }
+ }
+ },
+
+ '(function () { \'use\\nstrict\'; with (i); }())': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use\nstrict',
+ raw: '\'use\\nstrict\'',
+ range: [15, 28],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ range: [15, 29],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 29 }
+ }
+ }, {
+ type: 'WithStatement',
+ object: {
+ type: 'Identifier',
+ name: 'i',
+ range: [36, 37],
+ loc: {
+ start: { line: 1, column: 36 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ body: {
+ type: 'EmptyStatement',
+ range: [38, 39],
+ loc: {
+ start: { line: 1, column: 38 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ range: [30, 39],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 39 }
+ }
+ }],
+ range: [13, 41],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 41],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ 'arguments': [],
+ range: [1, 43],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ range: [0, 44],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 44 }
+ }
+ }
+
+ },
+
+ 'Whitespace': {
+
+ 'new\x20\x09\x0B\x0C\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFFa': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'NewExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'a',
+ range: [25, 26],
+ loc: {
+ start: {line: 1, column: 25},
+ end: {line: 1, column: 26}
+ }
+ },
+ arguments: [],
+ range: [0, 26],
+ loc: {
+ start: {line: 1, column: 0},
+ end: {line: 1, column: 26}
+ }
+ },
+ range: [0, 26],
+ loc: {
+ start: {line: 1, column: 0},
+ end: {line: 1, column: 26}
+ }
+ },
+
+ '{0\x0A1\x0D2\u20283\u20294}': {
+ type: 'BlockStatement',
+ body: [
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [1, 2],
+ loc: {
+ start: {line: 1, column: 1},
+ end: {line: 1, column: 2}
+ }
+ },
+ range: [1, 3],
+ loc: {
+ start: {line: 1, column: 1},
+ end: {line: 2, column: 0}
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [3, 4],
+ loc: {
+ start: {line: 2, column: 0},
+ end: {line: 2, column: 1}
+ }
+ },
+ range: [3, 5],
+ loc: {
+ start: {line: 2, column: 0},
+ end: {line: 3, column: 0}
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [5, 6],
+ loc: {
+ start: {line: 3, column: 0},
+ end: {line: 3, column: 1}
+ }
+ },
+ range: [5, 7],
+ loc: {
+ start: {line: 3, column: 0},
+ end: {line: 4, column: 0}
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [7, 8],
+ loc: {
+ start: {line: 4, column: 0},
+ end: {line: 4, column: 1}
+ }
+ },
+ range: [7, 9],
+ loc: {
+ start: {line: 4, column: 0},
+ end: {line: 5, column: 0}
+ }
+ },
+ {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 4,
+ raw: '4',
+ range: [9, 10],
+ loc: {
+ start: {line: 5, column: 0},
+ end: {line: 5, column: 1}
+ }
+ },
+ range: [9, 10],
+ loc: {
+ start: {line: 5, column: 0},
+ end: {line: 5, column: 1}
+ }
+ }
+ ],
+ range: [0, 11],
+ loc: {
+ start: {line: 1, column: 0},
+ end: {line: 5, column: 2}
+ }
+ }
+
+ },
+
+ 'Source elements': {
+
+ '': {
+ type: 'Program',
+ body: [],
+ range: [0, 0],
+ loc: {
+ start: { line: 0, column: 0 },
+ end: { line: 0, column: 0 }
+ },
+ tokens: []
+ }
+ },
+
+ 'Source option': {
+ 'x + y - z': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '-',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 },
+ source: '42.js'
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'y',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 },
+ source: '42.js'
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 },
+ source: '42.js'
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'z',
+ range: [8, 9],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 9 },
+ source: '42.js'
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 },
+ source: '42.js'
+ }
+ },
+ range: [0, 9],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 9 },
+ source: '42.js'
+ }
+ },
+
+ 'a + (b < (c * d)) + e': {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'BinaryExpression',
+ operator: '+',
+ left: {
+ type: 'Identifier',
+ name: 'a',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 },
+ source: '42.js'
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '<',
+ left: {
+ type: 'Identifier',
+ name: 'b',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 },
+ source: '42.js'
+ }
+ },
+ right: {
+ type: 'BinaryExpression',
+ operator: '*',
+ left: {
+ type: 'Identifier',
+ name: 'c',
+ range: [10, 11],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 11 },
+ source: '42.js'
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'd',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 },
+ source: '42.js'
+ }
+ },
+ range: [10, 15],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 15 },
+ source: '42.js'
+ }
+ },
+ range: [5, 16],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 16 },
+ source: '42.js'
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 },
+ source: '42.js'
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'e',
+ range: [20, 21],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 21 },
+ source: '42.js'
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 },
+ source: '42.js'
+ }
+ },
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 },
+ source: '42.js'
+ }
+ }
+
+ },
+
+
+ 'Invalid syntax': {
+
+ '{': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '}': {
+ index: 0,
+ lineNumber: 1,
+ column: 1,
+ message: 'Error: Line 1: Unexpected token }'
+ },
+
+ '3ea': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3in []': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3e': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3e+': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3e-': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3x': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3x0': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '0x': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '09': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '018': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '01a': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3in[]': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '0x3in[]': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '"Hello\nWorld"': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'x\\': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'x\\u005c': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'x\\u002a': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'var x = /(s/g': {
+ index: 13,
+ lineNumber: 1,
+ column: 14,
+ message: 'Error: Line 1: Invalid regular expression'
+ },
+
+ 'a\\u': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '\\ua': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '/': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ '/test': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ '/test\n/': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ 'var x = /[a-z]/\\ux': {
+ index: 17,
+ lineNumber: 1,
+ column: 18,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'var x = /[a-z\n]/\\ux': {
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ 'var x = /[a-z]/\\\\ux': {
+ index: 16,
+ lineNumber: 1,
+ column: 17,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'var x = /[P QR]/\\\\u0067': {
+ index: 17,
+ lineNumber: 1,
+ column: 18,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '3 = 4': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ 'func() = 4': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '(1 + 1) = 10': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '1++': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '1--': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '++1': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '--1': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ 'for((1 + 1) in list) process(x);': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Invalid left-hand side in for-in'
+ },
+
+ '[': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '[,': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '1 + {': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '1 + { t:t ': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '1 + { t:t,': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'var x = /\n/': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ 'var x = "\n': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'var if = 42': {
+ index: 4,
+ lineNumber: 1,
+ column: 5,
+ message: 'Error: Line 1: Unexpected token if'
+ },
+
+ 'i #= 42': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'i + 2 = 42': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '+i = 42': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ },
+
+ '1 + (': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '\n\n\n{': {
+ index: 4,
+ lineNumber: 4,
+ column: 2,
+ message: 'Error: Line 4: Unexpected end of input'
+ },
+
+ '\n/* Some multiline\ncomment */\n)': {
+ index: 30,
+ lineNumber: 4,
+ column: 1,
+ message: 'Error: Line 4: Unexpected token )'
+ },
+
+ '{ set 1 }': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Unexpected number'
+ },
+
+ '{ get 2 }': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Unexpected number'
+ },
+
+ '({ set: s(if) { } })': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Unexpected token if'
+ },
+
+ '({ set s(.) { } })': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token .'
+ },
+
+ '({ set s() { } })': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token )'
+ },
+
+ '({ set: s() { } })': {
+ index: 12,
+ lineNumber: 1,
+ column: 13,
+ message: 'Error: Line 1: Unexpected token {'
+ },
+
+ '({ set: s(a, b) { } })': {
+ index: 16,
+ lineNumber: 1,
+ column: 17,
+ message: 'Error: Line 1: Unexpected token {'
+ },
+
+ '({ get: g(d) { } })': {
+ index: 13,
+ lineNumber: 1,
+ column: 14,
+ message: 'Error: Line 1: Unexpected token {'
+ },
+
+ '({ get i() { }, i: 42 })': {
+ index: 21,
+ lineNumber: 1,
+ column: 22,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ },
+
+ '({ i: 42, get i() { } })': {
+ index: 21,
+ lineNumber: 1,
+ column: 22,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ },
+
+ '({ set i(x) { }, i: 42 })': {
+ index: 22,
+ lineNumber: 1,
+ column: 23,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ },
+
+ '({ i: 42, set i(x) { } })': {
+ index: 22,
+ lineNumber: 1,
+ column: 23,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ },
+
+ '({ get i() { }, get i() { } })': {
+ index: 27,
+ lineNumber: 1,
+ column: 28,
+ message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name'
+ },
+
+ '({ set i(x) { }, set i(x) { } })': {
+ index: 29,
+ lineNumber: 1,
+ column: 30,
+ message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name'
+ },
+
+ 'function t(if) { }': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Unexpected token if'
+ },
+
+ 'function t(true) { }': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Unexpected token true'
+ },
+
+ 'function t(false) { }': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Unexpected token false'
+ },
+
+ 'function t(null) { }': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Unexpected token null'
+ },
+
+ 'function null() { }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token null'
+ },
+
+ 'function true() { }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token true'
+ },
+
+ 'function false() { }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token false'
+ },
+
+ 'function if() { }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token if'
+ },
+
+ 'a b;': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected identifier'
+ },
+
+ 'if.a;': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token .'
+ },
+
+ 'a if;': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token if'
+ },
+
+ 'a class;': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected reserved word'
+ },
+
+ 'break\n': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Illegal break statement'
+ },
+
+ 'break 1;': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Unexpected number'
+ },
+
+ 'continue\n': {
+ index: 8,
+ lineNumber: 1,
+ column: 9,
+ message: 'Error: Line 1: Illegal continue statement'
+ },
+
+ 'continue 2;': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected number'
+ },
+
+ 'throw': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'throw;': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Unexpected token ;'
+ },
+
+ 'throw\n': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Illegal newline after throw'
+ },
+
+ 'for (var i, i2 in {});': {
+ index: 15,
+ lineNumber: 1,
+ column: 16,
+ message: 'Error: Line 1: Unexpected token in'
+ },
+
+ 'for ((i in {}));': {
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Unexpected token )'
+ },
+
+ 'for (i + 1 in {});': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Invalid left-hand side in for-in'
+ },
+
+ 'for (+i in {});': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Invalid left-hand side in for-in'
+ },
+
+ 'if(false)': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'if(false) doThis(); else': {
+ index: 24,
+ lineNumber: 1,
+ column: 25,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'do': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'while(false)': {
+ index: 12,
+ lineNumber: 1,
+ column: 13,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'for(;;)': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'with(x)': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'try { }': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Missing catch or finally after try'
+ },
+
+ 'try {} catch (42) {} ': {
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Unexpected number'
+ },
+
+ 'try {} catch (answer()) {} ': {
+ index: 20,
+ lineNumber: 1,
+ column: 21,
+ message: 'Error: Line 1: Unexpected token ('
+ },
+
+ 'try {} catch (-x) {} ': {
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Unexpected token -'
+ },
+
+
+ '\u203F = 10': {
+ index: 0,
+ lineNumber: 1,
+ column: 1,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'const x = 12, y;': {
+ index: 15,
+ lineNumber: 1,
+ column: 16,
+ message: 'Error: Line 1: Unexpected token ;'
+ },
+
+ 'const x, y = 12;': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected token ,'
+ },
+
+ 'const x;': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected token ;'
+ },
+
+ 'if(true) let a = 1;': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token let'
+ },
+
+ 'if(true) const a = 1;': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token const'
+ },
+
+ 'switch (c) { default: default: }': {
+ index: 30,
+ lineNumber: 1,
+ column: 31,
+ message: 'Error: Line 1: More than one default clause in switch statement'
+ },
+
+ 'new X()."s"': {
+ index: 8,
+ lineNumber: 1,
+ column: 9,
+ message: 'Error: Line 1: Unexpected string'
+ },
+
+ '/*': {
+ index: 2,
+ lineNumber: 1,
+ column: 3,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '/*\n\n\n': {
+ index: 5,
+ lineNumber: 4,
+ column: 1,
+ message: 'Error: Line 4: Unexpected token ILLEGAL'
+ },
+
+ '/**': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '/*\n\n*': {
+ index: 5,
+ lineNumber: 3,
+ column: 2,
+ message: 'Error: Line 3: Unexpected token ILLEGAL'
+ },
+
+ '/*hello': {
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '/*hello *': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '\n]': {
+ index: 1,
+ lineNumber: 2,
+ column: 1,
+ message: 'Error: Line 2: Unexpected token ]'
+ },
+
+ '\r]': {
+ index: 1,
+ lineNumber: 2,
+ column: 1,
+ message: 'Error: Line 2: Unexpected token ]'
+ },
+
+ '\r\n]': {
+ index: 2,
+ lineNumber: 2,
+ column: 1,
+ message: 'Error: Line 2: Unexpected token ]'
+ },
+
+ '\n\r]': {
+ index: 2,
+ lineNumber: 3,
+ column: 1,
+ message: 'Error: Line 3: Unexpected token ]'
+ },
+
+ '//\r\n]': {
+ index: 4,
+ lineNumber: 2,
+ column: 1,
+ message: 'Error: Line 2: Unexpected token ]'
+ },
+
+ '//\n\r]': {
+ index: 4,
+ lineNumber: 3,
+ column: 1,
+ message: 'Error: Line 3: Unexpected token ]'
+ },
+
+ '/a\\\n/': {
+ index: 4,
+ lineNumber: 1,
+ column: 5,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ '//\r \n]': {
+ index: 5,
+ lineNumber: 3,
+ column: 1,
+ message: 'Error: Line 3: Unexpected token ]'
+ },
+
+ '/*\r\n*/]': {
+ index: 6,
+ lineNumber: 2,
+ column: 3,
+ message: 'Error: Line 2: Unexpected token ]'
+ },
+
+ '/*\n\r*/]': {
+ index: 6,
+ lineNumber: 3,
+ column: 3,
+ message: 'Error: Line 3: Unexpected token ]'
+ },
+
+ '/*\r \n*/]': {
+ index: 7,
+ lineNumber: 3,
+ column: 3,
+ message: 'Error: Line 3: Unexpected token ]'
+ },
+
+ '\\\\': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '\\u005c': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+
+ '\\x': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '\\u0000': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '\u200C = []': {
+ index: 0,
+ lineNumber: 1,
+ column: 1,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '\u200D = []': {
+ index: 0,
+ lineNumber: 1,
+ column: 1,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '"\\': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ '"\\u': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected token ILLEGAL'
+ },
+
+ 'try { } catch() {}': {
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Unexpected token )'
+ },
+
+ 'return': {
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Illegal return statement'
+ },
+
+ 'break': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Illegal break statement'
+ },
+
+ 'continue': {
+ index: 8,
+ lineNumber: 1,
+ column: 9,
+ message: 'Error: Line 1: Illegal continue statement'
+ },
+
+ 'switch (x) { default: continue; }': {
+ index: 31,
+ lineNumber: 1,
+ column: 32,
+ message: 'Error: Line 1: Illegal continue statement'
+ },
+
+ 'do { x } *': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token *'
+ },
+
+ 'while (true) { break x; }': {
+ index: 22,
+ lineNumber: 1,
+ column: 23,
+ message: 'Error: Line 1: Undefined label \'x\''
+ },
+
+ 'while (true) { continue x; }': {
+ index: 25,
+ lineNumber: 1,
+ column: 26,
+ message: 'Error: Line 1: Undefined label \'x\''
+ },
+
+ 'x: while (true) { (function () { break x; }); }': {
+ index: 40,
+ lineNumber: 1,
+ column: 41,
+ message: 'Error: Line 1: Undefined label \'x\''
+ },
+
+ 'x: while (true) { (function () { continue x; }); }': {
+ index: 43,
+ lineNumber: 1,
+ column: 44,
+ message: 'Error: Line 1: Undefined label \'x\''
+ },
+
+ 'x: while (true) { (function () { break; }); }': {
+ index: 39,
+ lineNumber: 1,
+ column: 40,
+ message: 'Error: Line 1: Illegal break statement'
+ },
+
+ 'x: while (true) { (function () { continue; }); }': {
+ index: 42,
+ lineNumber: 1,
+ column: 43,
+ message: 'Error: Line 1: Illegal continue statement'
+ },
+
+ 'x: while (true) { x: while (true) { } }': {
+ index: 20,
+ lineNumber: 1,
+ column: 21,
+ message: 'Error: Line 1: Label \'x\' has already been declared'
+ },
+
+ '(function () { \'use strict\'; delete i; }())': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Delete of an unqualified identifier in strict mode.'
+ },
+
+ '(function () { \'use strict\'; with (i); }())': {
+ index: 29,
+ lineNumber: 1,
+ column: 30,
+ message: 'Error: Line 1: Strict mode code may not include a with statement'
+ },
+
+ 'function hello() {\'use strict\'; ({ i: 42, i: 42 }) }': {
+ index: 47,
+ lineNumber: 1,
+ column: 48,
+ message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ({ hasOwnProperty: 42, hasOwnProperty: 42 }) }': {
+ index: 73,
+ lineNumber: 1,
+ column: 74,
+ message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; var eval = 10; }': {
+ index: 40,
+ lineNumber: 1,
+ column: 41,
+ message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; var arguments = 10; }': {
+ index: 45,
+ lineNumber: 1,
+ column: 46,
+ message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; try { } catch (eval) { } }': {
+ index: 51,
+ lineNumber: 1,
+ column: 52,
+ message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; try { } catch (arguments) { } }': {
+ index: 56,
+ lineNumber: 1,
+ column: 57,
+ message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; eval = 10; }': {
+ index: 32,
+ lineNumber: 1,
+ column: 33,
+ message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; arguments = 10; }': {
+ index: 32,
+ lineNumber: 1,
+ column: 33,
+ message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ++eval; }': {
+ index: 38,
+ lineNumber: 1,
+ column: 39,
+ message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; --eval; }': {
+ index: 38,
+ lineNumber: 1,
+ column: 39,
+ message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ++arguments; }': {
+ index: 43,
+ lineNumber: 1,
+ column: 44,
+ message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; --arguments; }': {
+ index: 43,
+ lineNumber: 1,
+ column: 44,
+ message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; eval++; }': {
+ index: 36,
+ lineNumber: 1,
+ column: 37,
+ message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; eval--; }': {
+ index: 36,
+ lineNumber: 1,
+ column: 37,
+ message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; arguments++; }': {
+ index: 41,
+ lineNumber: 1,
+ column: 42,
+ message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; arguments--; }': {
+ index: 41,
+ lineNumber: 1,
+ column: 42,
+ message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; function eval() { } }': {
+ index: 41,
+ lineNumber: 1,
+ column: 42,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; function arguments() { } }': {
+ index: 41,
+ lineNumber: 1,
+ column: 42,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function eval() {\'use strict\'; }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function arguments() {\'use strict\'; }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; (function eval() { }()) }': {
+ index: 42,
+ lineNumber: 1,
+ column: 43,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; (function arguments() { }()) }': {
+ index: 42,
+ lineNumber: 1,
+ column: 43,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ '(function eval() {\'use strict\'; })()': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ '(function arguments() {\'use strict\'; })()': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ({ s: function eval() { } }); }': {
+ index: 47,
+ lineNumber: 1,
+ column: 48,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ '(function package() {\'use strict\'; })()': {
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ({ i: 10, set s(eval) { } }); }': {
+ index: 48,
+ lineNumber: 1,
+ column: 49,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ({ set s(eval) { } }); }': {
+ index: 41,
+ lineNumber: 1,
+ column: 42,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello() {\'use strict\'; ({ s: function s(eval) { } }); }': {
+ index: 49,
+ lineNumber: 1,
+ column: 50,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello(eval) {\'use strict\';}': {
+ index: 15,
+ lineNumber: 1,
+ column: 16,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello(arguments) {\'use strict\';}': {
+ index: 15,
+ lineNumber: 1,
+ column: 16,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello() { \'use strict\'; function inner(eval) {} }': {
+ index: 48,
+ lineNumber: 1,
+ column: 49,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function hello() { \'use strict\'; function inner(arguments) {} }': {
+ index: 48,
+ lineNumber: 1,
+ column: 49,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ ' "\\1"; \'use strict\';': {
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { \'use strict\'; "\\1"; }': {
+ index: 33,
+ lineNumber: 1,
+ column: 34,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { \'use strict\'; 021; }': {
+ index: 33,
+ lineNumber: 1,
+ column: 34,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { \'use strict\'; ({ "\\1": 42 }); }': {
+ index: 36,
+ lineNumber: 1,
+ column: 37,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { \'use strict\'; ({ 021: 42 }); }': {
+ index: 36,
+ lineNumber: 1,
+ column: 37,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { "octal directive\\1"; "use strict"; }': {
+ index: 19,
+ lineNumber: 1,
+ column: 20,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { "octal directive\\1"; "octal directive\\2"; "use strict"; }': {
+ index: 19,
+ lineNumber: 1,
+ column: 20,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { "use strict"; function inner() { "octal directive\\1"; } }': {
+ index: 52,
+ lineNumber: 1,
+ column: 53,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ },
+
+ 'function hello() { "use strict"; var implements; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var interface; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var package; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var private; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var protected; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var public; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var static; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var yield; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello() { "use strict"; var let; }': {
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function hello(static) { "use strict"; }': {
+ index: 15,
+ lineNumber: 1,
+ column: 16,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function static() { "use strict"; }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function eval(a) { "use strict"; }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'function arguments(a) { "use strict"; }': {
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ },
+
+ 'var yield': {
+ index: 4,
+ lineNumber: 1,
+ column: 5,
+ message: 'Error: Line 1: Unexpected token yield'
+ },
+
+ 'var let': {
+ index: 4,
+ lineNumber: 1,
+ column: 5,
+ message: 'Error: Line 1: Unexpected token let'
+ },
+
+ '"use strict"; function static() { }': {
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function a(t, t) { "use strict"; }': {
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ },
+
+ 'function a(eval) { "use strict"; }': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ 'function a(package) { "use strict"; }': {
+ index: 11,
+ lineNumber: 1,
+ column: 12,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ 'function a() { "use strict"; function b(t, t) { }; }': {
+ index: 43,
+ lineNumber: 1,
+ column: 44,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ },
+
+ '(function a(t, t) { "use strict"; })': {
+ index: 15,
+ lineNumber: 1,
+ column: 16,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ },
+
+ 'function a() { "use strict"; (function b(t, t) { }); }': {
+ index: 44,
+ lineNumber: 1,
+ column: 45,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ },
+
+ '(function a(eval) { "use strict"; })': {
+ index: 12,
+ lineNumber: 1,
+ column: 13,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ },
+
+ '(function a(package) { "use strict"; })': {
+ index: 12,
+ lineNumber: 1,
+ column: 13,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ },
+
+ '__proto__: __proto__: 42;': {
+ index: 21,
+ lineNumber: 1,
+ column: 22,
+ message: 'Error: Line 1: Label \'__proto__\' has already been declared'
+ },
+
+ '"use strict"; function t(__proto__, __proto__) { }': {
+ index: 36,
+ lineNumber: 1,
+ column: 37,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ },
+
+ '"use strict"; x = { __proto__: 42, __proto__: 43 }': {
+ index: 48,
+ lineNumber: 1,
+ column: 49,
+ message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
+ },
+
+ '"use strict"; x = { get __proto__() { }, __proto__: 43 }': {
+ index: 54,
+ lineNumber: 1,
+ column: 55,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ },
+
+ 'var': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'let': {
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'const': {
+ index: 5,
+ lineNumber: 1,
+ column: 6,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ '{ ; ; ': {
+ index: 8,
+ lineNumber: 1,
+ column: 9,
+ message: 'Error: Line 1: Unexpected end of input'
+ },
+
+ 'function t() { ; ; ': {
+ index: 21,
+ lineNumber: 1,
+ column: 22,
+ message: 'Error: Line 1: Unexpected end of input'
+ }
+
+ },
+
+ 'Tokenize': {
+ 'tokenize(/42/)': [
+ {
+ "type": "Identifier",
+ "value": "tokenize",
+ "range": [
+ 0,
+ 8
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 8
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 8,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 8
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ },
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 9,
+ 13
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 9
+ },
+ "end": {
+ "line": 1,
+ "column": 13
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 13,
+ 14
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 13
+ },
+ "end": {
+ "line": 1,
+ "column": 14
+ }
+ }
+ }
+ ],
+
+ 'if (false) { /42/ }': [
+ {
+ "type": "Keyword",
+ "value": "if",
+ "range": [
+ 0,
+ 2
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 2
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 3,
+ 4
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 3
+ },
+ "end": {
+ "line": 1,
+ "column": 4
+ }
+ }
+ },
+ {
+ "type": "Boolean",
+ "value": "false",
+ "range": [
+ 4,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 4
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 9,
+ 10
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 9
+ },
+ "end": {
+ "line": 1,
+ "column": 10
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "{",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ },
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 13,
+ 17
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 13
+ },
+ "end": {
+ "line": 1,
+ "column": 17
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "}",
+ "range": [
+ 18,
+ 19
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 18
+ },
+ "end": {
+ "line": 1,
+ "column": 19
+ }
+ }
+ }
+ ],
+
+ 'with (false) /42/': [
+ {
+ "type": "Keyword",
+ "value": "with",
+ "range": [
+ 0,
+ 4
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 4
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 5,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 5
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ }
+ },
+ {
+ "type": "Boolean",
+ "value": "false",
+ "range": [
+ 6,
+ 11
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 6
+ },
+ "end": {
+ "line": 1,
+ "column": 11
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ },
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 13,
+ 17
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 13
+ },
+ "end": {
+ "line": 1,
+ "column": 17
+ }
+ }
+ }
+ ],
+
+ '(false) /42/': [
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 0,
+ 1
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 1
+ }
+ }
+ },
+ {
+ "type": "Boolean",
+ "value": "false",
+ "range": [
+ 1,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 6,
+ 7
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 6
+ },
+ "end": {
+ "line": 1,
+ "column": 7
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "/",
+ "range": [
+ 8,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 8
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ },
+ {
+ "type": "Numeric",
+ "value": "42",
+ "range": [
+ 9,
+ 11
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 9
+ },
+ "end": {
+ "line": 1,
+ "column": 11
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "/",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ }
+ ],
+
+ 'function f(){} /42/': [
+ {
+ "type": "Keyword",
+ "value": "function",
+ "range": [
+ 0,
+ 8
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 8
+ }
+ }
+ },
+ {
+ "type": "Identifier",
+ "value": "f",
+ "range": [
+ 9,
+ 10
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 9
+ },
+ "end": {
+ "line": 1,
+ "column": 10
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 10,
+ 11
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 10
+ },
+ "end": {
+ "line": 1,
+ "column": 11
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "{",
+ "range": [
+ 12,
+ 13
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 12
+ },
+ "end": {
+ "line": 1,
+ "column": 13
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "}",
+ "range": [
+ 13,
+ 14
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 13
+ },
+ "end": {
+ "line": 1,
+ "column": 14
+ }
+ }
+ },
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 15,
+ 19
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 15
+ },
+ "end": {
+ "line": 1,
+ "column": 19
+ }
+ }
+ }
+ ],
+
+ 'function(){} /42': [
+ {
+ "type": "Keyword",
+ "value": "function",
+ "range": [
+ 0,
+ 8
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 8
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 8,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 8
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 9,
+ 10
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 9
+ },
+ "end": {
+ "line": 1,
+ "column": 10
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "{",
+ "range": [
+ 10,
+ 11
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 10
+ },
+ "end": {
+ "line": 1,
+ "column": 11
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "}",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "/",
+ "range": [
+ 13,
+ 14
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 13
+ },
+ "end": {
+ "line": 1,
+ "column": 14
+ }
+ }
+ },
+ {
+ "type": "Numeric",
+ "value": "42",
+ "range": [
+ 14,
+ 16
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 14
+ },
+ "end": {
+ "line": 1,
+ "column": 16
+ }
+ }
+ }
+ ],
+
+ '{} /42': [
+ {
+ "type": "Punctuator",
+ "value": "{",
+ "range": [
+ 0,
+ 1
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 1
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "}",
+ "range": [
+ 1,
+ 2
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 2
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "/",
+ "range": [
+ 3,
+ 4
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 3
+ },
+ "end": {
+ "line": 1,
+ "column": 4
+ }
+ }
+ },
+ {
+ "type": "Numeric",
+ "value": "42",
+ "range": [
+ 4,
+ 6
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 4
+ },
+ "end": {
+ "line": 1,
+ "column": 6
+ }
+ }
+ }
+ ],
+
+ '[function(){} /42]': [
+ {
+ "type": "Punctuator",
+ "value": "[",
+ "range": [
+ 0,
+ 1
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 1
+ }
+ }
+ },
+ {
+ "type": "Keyword",
+ "value": "function",
+ "range": [
+ 1,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 9,
+ 10
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 9
+ },
+ "end": {
+ "line": 1,
+ "column": 10
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 10,
+ 11
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 10
+ },
+ "end": {
+ "line": 1,
+ "column": 11
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "{",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "}",
+ "range": [
+ 12,
+ 13
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 12
+ },
+ "end": {
+ "line": 1,
+ "column": 13
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "/",
+ "range": [
+ 14,
+ 15
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 14
+ },
+ "end": {
+ "line": 1,
+ "column": 15
+ }
+ }
+ },
+ {
+ "type": "Numeric",
+ "value": "42",
+ "range": [
+ 15,
+ 17
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 15
+ },
+ "end": {
+ "line": 1,
+ "column": 17
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "]",
+ "range": [
+ 17,
+ 18
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 17
+ },
+ "end": {
+ "line": 1,
+ "column": 18
+ }
+ }
+ }
+ ],
+
+ ';function f(){} /42/': [
+ {
+ "type": "Punctuator",
+ "value": ";",
+ "range": [
+ 0,
+ 1
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 1
+ }
+ }
+ },
+ {
+ "type": "Keyword",
+ "value": "function",
+ "range": [
+ 1,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ },
+ {
+ "type": "Identifier",
+ "value": "f",
+ "range": [
+ 10,
+ 11
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 10
+ },
+ "end": {
+ "line": 1,
+ "column": 11
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "(",
+ "range": [
+ 11,
+ 12
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 11
+ },
+ "end": {
+ "line": 1,
+ "column": 12
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": ")",
+ "range": [
+ 12,
+ 13
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 12
+ },
+ "end": {
+ "line": 1,
+ "column": 13
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "{",
+ "range": [
+ 13,
+ 14
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 13
+ },
+ "end": {
+ "line": 1,
+ "column": 14
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "}",
+ "range": [
+ 14,
+ 15
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 14
+ },
+ "end": {
+ "line": 1,
+ "column": 15
+ }
+ }
+ },
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 16,
+ 20
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 16
+ },
+ "end": {
+ "line": 1,
+ "column": 20
+ }
+ }
+ }
+ ],
+
+ 'void /42/': [
+ {
+ "type": "Keyword",
+ "value": "void",
+ "range": [
+ 0,
+ 4
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 4
+ }
+ }
+ },
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 5,
+ 9
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 5
+ },
+ "end": {
+ "line": 1,
+ "column": 9
+ }
+ }
+ }
+ ],
+
+ '/42/': [
+ {
+ "type": "RegularExpression",
+ "value": "/42/",
+ "range": [
+ 0,
+ 4
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 4
+ }
+ }
+ }
+ ],
+
+ 'foo[/42]': [
+ {
+ "type": "Identifier",
+ "value": "foo",
+ "range": [
+ 0,
+ 3
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 3
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "[",
+ "range": [
+ 3,
+ 4
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 3
+ },
+ "end": {
+ "line": 1,
+ "column": 4
+ }
+ }
+ }
+ ],
+
+ '[a] / b': [
+ {
+ "type": "Punctuator",
+ "value": "[",
+ "range": [
+ 0,
+ 1
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 1
+ }
+ }
+ },
+ {
+ "type": "Identifier",
+ "value": "a",
+ "range": [
+ 1,
+ 2
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 1
+ },
+ "end": {
+ "line": 1,
+ "column": 2
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "]",
+ "range": [
+ 2,
+ 3
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 2
+ },
+ "end": {
+ "line": 1,
+ "column": 3
+ }
+ }
+ },
+ {
+ "type": "Punctuator",
+ "value": "/",
+ "range": [
+ 4,
+ 5
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 4
+ },
+ "end": {
+ "line": 1,
+ "column": 5
+ }
+ }
+ },
+ {
+ "type": "Identifier",
+ "value": "b",
+ "range": [
+ 6,
+ 7
+ ],
+ "loc": {
+ "start": {
+ "line": 1,
+ "column": 6
+ },
+ "end": {
+ "line": 1,
+ "column": 7
+ }
+ }
+ }
+ ],
+
+ '': [],
+
+ '/42': {
+ tokenize: true,
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ },
+
+ 'foo[/42': {
+ tokenize: true,
+ index: 7,
+ lineNumber: 1,
+ column: 8,
+ message: 'Error: Line 1: Invalid regular expression: missing /'
+ }
+
+ },
+
+ 'API': {
+ 'parse()': {
+ call: 'parse',
+ args: [],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'undefined'
+ }
+ }]
+ }
+ },
+
+ 'parse(null)': {
+ call: 'parse',
+ args: [null],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: null,
+ raw: 'null'
+ }
+ }]
+ }
+ },
+
+ 'parse(42)': {
+ call: 'parse',
+ args: [42],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42'
+ }
+ }]
+ }
+ },
+
+ 'parse(true)': {
+ call: 'parse',
+ args: [true],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: true,
+ raw: 'true'
+ }
+ }]
+ }
+ },
+
+ 'parse(undefined)': {
+ call: 'parse',
+ args: [void 0],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'undefined'
+ }
+ }]
+ }
+ },
+
+ 'parse(new String("test"))': {
+ call: 'parse',
+ args: [new String('test')],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Identifier',
+ name: 'test'
+ }
+ }]
+ }
+ },
+
+ 'parse(new Number(42))': {
+ call: 'parse',
+ args: [new Number(42)],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 42,
+ raw: '42'
+ }
+ }]
+ }
+ },
+
+ 'parse(new Boolean(true))': {
+ call: 'parse',
+ args: [new Boolean(true)],
+ result: {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: true,
+ raw: 'true'
+ }
+ }]
+ }
+ },
+
+ 'Syntax': {
+ property: 'Syntax',
+ result: {
+ AssignmentExpression: 'AssignmentExpression',
+ ArrayExpression: 'ArrayExpression',
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ Program: 'Program',
+ Property: 'Property',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement'
+ }
+ },
+
+ 'tokenize()': {
+ call: 'tokenize',
+ args: [],
+ result: [{
+ type: 'Identifier',
+ value: 'undefined'
+ }]
+ },
+
+ 'tokenize(null)': {
+ call: 'tokenize',
+ args: [null],
+ result: [{
+ type: 'Null',
+ value: 'null'
+ }]
+ },
+
+ 'tokenize(42)': {
+ call: 'tokenize',
+ args: [42],
+ result: [{
+ type: 'Numeric',
+ value: '42'
+ }]
+ },
+
+ 'tokenize(true)': {
+ call: 'tokenize',
+ args: [true],
+ result: [{
+ type: 'Boolean',
+ value: 'true'
+ }]
+ },
+
+ 'tokenize(undefined)': {
+ call: 'tokenize',
+ args: [void 0],
+ result: [{
+ type: 'Identifier',
+ value: 'undefined'
+ }]
+ },
+
+ 'tokenize(new String("test"))': {
+ call: 'tokenize',
+ args: [new String('test')],
+ result: [{
+ type: 'Identifier',
+ value: 'test'
+ }]
+ },
+
+ 'tokenize(new Number(42))': {
+ call: 'tokenize',
+ args: [new Number(42)],
+ result: [{
+ type: 'Numeric',
+ value: '42'
+ }]
+ },
+
+ 'tokenize(new Boolean(true))': {
+ call: 'tokenize',
+ args: [new Boolean(true)],
+ result: [{
+ type: 'Boolean',
+ value: 'true'
+ }]
+ }
+ },
+
+ 'Tolerant parse': {
+ 'return': {
+ type: 'Program',
+ body: [{
+ type: 'ReturnStatement',
+ 'argument': null,
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ }
+ }],
+ range: [0, 6],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 6 }
+ },
+ errors: [{
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Illegal return statement'
+ }]
+ },
+
+ '(function () { \'use strict\'; with (i); }())': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '\'use strict\'',
+ range: [15, 27],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [15, 28],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 28 }
+ }
+ }, {
+ type: 'WithStatement',
+ object: {
+ type: 'Identifier',
+ name: 'i',
+ range: [35, 36],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ body: {
+ type: 'EmptyStatement',
+ range: [37, 38],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [29, 38],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ range: [13, 40],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 40 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 40],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 40 }
+ }
+ },
+ 'arguments': [],
+ range: [1, 42],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ range: [0, 43],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 43 }
+ }
+ }],
+ range: [0, 43],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 43 }
+ },
+ errors: [{
+ index: 29,
+ lineNumber: 1,
+ column: 30,
+ message: 'Error: Line 1: Strict mode code may not include a with statement'
+ }]
+ },
+
+ '(function () { \'use strict\'; 021 }())': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'CallExpression',
+ callee: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '\'use strict\'',
+ range: [15, 27],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [15, 28],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 28 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 17,
+ raw: "021",
+ range: [29, 32],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ range: [29, 33],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [13, 34],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [1, 34],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ 'arguments': [],
+ range: [1, 36],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [0, 37],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 37 }
+ }
+ }],
+ range: [0, 37],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 37 }
+ },
+ errors: [{
+ index: 29,
+ lineNumber: 1,
+ column: 30,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ }]
+ },
+
+ '"use strict"; delete x': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UnaryExpression',
+ operator: 'delete',
+ argument: {
+ type: 'Identifier',
+ name: 'x',
+ range: [21, 22],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ prefix: true,
+ range: [14, 22],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [14, 22],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 22 }
+ }
+ }],
+ range: [0, 22],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 22 }
+ },
+ errors: [{
+ index: 22,
+ lineNumber: 1,
+ column: 23,
+ message: 'Error: Line 1: Delete of an unqualified identifier in strict mode.'
+ }]
+ },
+
+ '"use strict"; try {} catch (eval) {}': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [18, 20],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [28, 32],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [34, 36],
+ loc: {
+ start: { line: 1, column: 34 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [21, 36],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ finalizer: null,
+ range: [14, 36],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ },
+ errors: [{
+ index: 32,
+ lineNumber: 1,
+ column: 33,
+ message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; try {} catch (arguments) {}': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'TryStatement',
+ block: {
+ type: 'BlockStatement',
+ body: [],
+ range: [18, 20],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ guardedHandlers: [],
+ handlers: [{
+ type: 'CatchClause',
+ param: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [28, 37],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [39, 41],
+ loc: {
+ start: { line: 1, column: 39 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ range: [21, 41],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ finalizer: null,
+ range: [14, 41],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ range: [0, 41],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 41 }
+ },
+ errors: [{
+ index: 37,
+ lineNumber: 1,
+ column: 38,
+ message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; var eval;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ init: null,
+ range: [18, 22],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 22 }
+ }
+ }],
+ kind: 'var',
+ range: [14, 23],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 23 }
+ }
+ }],
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ },
+ errors: [{
+ index: 22,
+ lineNumber: 1,
+ column: 23,
+ message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; var arguments;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [18, 27],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ init: null,
+ range: [18, 27],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 27 }
+ }
+ }],
+ kind: 'var',
+ range: [14, 28],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ range: [0, 28],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 28 }
+ },
+ errors: [{
+ index: 27,
+ lineNumber: 1,
+ column: 28,
+ message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; eval = 0;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [14, 18],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [21, 22],
+ loc: {
+ start: { line: 1, column: 21 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [14, 22],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 22 }
+ }
+ },
+ range: [14, 23],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 23 }
+ }
+ }],
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ },
+ errors: [{
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+ '"use strict"; eval++;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [14, 18],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ prefix: false,
+ range: [14, 20],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [14, 21],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ },
+ errors: [{
+ index: 18,
+ lineNumber: 1,
+ column: 19,
+ message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
+ }]
+ },
+
+ '"use strict"; --eval;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [16, 20],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ prefix: true,
+ range: [14, 20],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 20 }
+ }
+ },
+ range: [14, 21],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 21 }
+ }
+ }],
+ range: [0, 21],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 21 }
+ },
+ errors: [{
+ index: 20,
+ lineNumber: 1,
+ column: 21,
+ message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
+ }]
+ },
+
+ '"use strict"; arguments = 0;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [14, 23],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 0,
+ raw: '0',
+ range: [26, 27],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [14, 27],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ range: [14, 28],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 28 }
+ }
+ }],
+ range: [0, 28],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 28 }
+ },
+ errors: [{
+ index: 14,
+ lineNumber: 1,
+ column: 15,
+ message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+ '"use strict"; arguments--;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [14, 23],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ prefix: false,
+ range: [14, 25],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [14, 26],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 26 }
+ }
+ }],
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ },
+ errors: [{
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
+ }]
+ },
+
+ '"use strict"; ++arguments;': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [16, 25],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ prefix: true,
+ range: [14, 25],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ range: [14, 26],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 26 }
+ }
+ }],
+ range: [0, 26],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 26 }
+ },
+ errors: [{
+ index: 25,
+ lineNumber: 1,
+ column: 26,
+ message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
+ }]
+ },
+
+
+ '"use strict";x={y:1,y:1}': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [13, 14],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'y',
+ range: [16, 17],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 17 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ kind: 'init',
+ range: [16, 19],
+ loc: {
+ start: { line: 1, column: 16 },
+ end: { line: 1, column: 19 }
+ }
+ }, {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'y',
+ range: [20, 21],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 21 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [22, 23],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ kind: 'init',
+ range: [20, 23],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 23 }
+ }
+ }],
+ range: [15, 24],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [13, 24],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ range: [13, 24],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 24 }
+ }
+ }],
+ range: [0, 24],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 24 }
+ },
+ errors: [{
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
+ }]
+ },
+
+ '"use strict"; function eval() {};': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [23, 27],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [30, 32],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 32],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 32 }
+ }
+ }, {
+ type: 'EmptyStatement',
+ range: [32, 33],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 33 }
+ }
+ }],
+ range: [0, 33],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 33 }
+ },
+ errors: [{
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; function arguments() {};': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [23, 32],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [35, 37],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 37],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 37 }
+ }
+ }, {
+ type: 'EmptyStatement',
+ range: [37, 38],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ },
+ errors: [{
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; function interface() {};': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'interface',
+ range: [23, 32],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 32 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [35, 37],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 37 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 37],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 37 }
+ }
+ }, {
+ type: 'EmptyStatement',
+ range: [37, 38],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 38 }
+ }
+ }],
+ range: [0, 38],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 38 }
+ },
+ errors: [{
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ }]
+ },
+
+ '"use strict"; (function eval() {});': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'eval',
+ range: [24, 28],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 28 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [31, 33],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 33],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ range: [14, 35],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ range: [0, 35],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 35 }
+ },
+ errors: [{
+ index: 24,
+ lineNumber: 1,
+ column: 25,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; (function arguments() {});': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'arguments',
+ range: [24, 33],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [36, 38],
+ loc: {
+ start: { line: 1, column: 36 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 38],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [14, 40],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 40 }
+ }
+ }],
+ range: [0, 40],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 40 }
+ },
+ errors: [{
+ index: 24,
+ lineNumber: 1,
+ column: 25,
+ message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
+ }]
+ },
+
+ '"use strict"; (function interface() {});': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'interface',
+ range: [24, 33],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [36, 38],
+ loc: {
+ start: { line: 1, column: 36 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 38],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [14, 40],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 40 }
+ }
+ }],
+ range: [0, 40],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 40 }
+ },
+ errors: [{
+ index: 24,
+ lineNumber: 1,
+ column: 25,
+ message: 'Error: Line 1: Use of future reserved word in strict mode'
+ }]
+ },
+
+ '"use strict"; function f(eval) {};': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'eval',
+ range: [25, 29],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 29 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [31, 33],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 33 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 33],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 33 }
+ }
+ }, {
+ type: 'EmptyStatement',
+ range: [33, 34],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ range: [0, 34],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 34 }
+ },
+ errors: [{
+ index: 25,
+ lineNumber: 1,
+ column: 26,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+ '"use strict"; function f(arguments) {};': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'arguments',
+ range: [25, 34],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [36, 38],
+ loc: {
+ start: { line: 1, column: 36 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 38],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 38 }
+ }
+ }, {
+ type: 'EmptyStatement',
+ range: [38, 39],
+ loc: {
+ start: { line: 1, column: 38 },
+ end: { line: 1, column: 39 }
+ }
+ }],
+ range: [0, 39],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 39 }
+ },
+ errors: [{
+ index: 25,
+ lineNumber: 1,
+ column: 26,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+ '"use strict"; function f(foo, foo) {};': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [23, 24],
+ loc: {
+ start: { line: 1, column: 23 },
+ end: { line: 1, column: 24 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'foo',
+ range: [25, 28],
+ loc: {
+ start: { line: 1, column: 25 },
+ end: { line: 1, column: 28 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 'foo',
+ range: [31, 34],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [36, 38],
+ loc: {
+ start: { line: 1, column: 36 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [14, 38],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 38 }
+ }
+ }, {
+ type: 'EmptyStatement',
+ range: [38, 39],
+ loc: {
+ start: { line: 1, column: 38 },
+ end: { line: 1, column: 39 }
+ }
+ }],
+ range: [0, 39],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 39 }
+ },
+ errors: [{
+ index: 31,
+ lineNumber: 1,
+ column: 32,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ }]
+ },
+
+ '"use strict"; (function f(eval) {});': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'eval',
+ range: [26, 30],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 30 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [32, 34],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 34],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ range: [14, 36],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ },
+ errors: [{
+ index: 26,
+ lineNumber: 1,
+ column: 27,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+
+ '"use strict"; (function f(arguments) {});': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'arguments',
+ range: [26, 35],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [37, 39],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 39],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ range: [14, 41],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ range: [0, 41],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 41 }
+ },
+ errors: [{
+ index: 26,
+ lineNumber: 1,
+ column: 27,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+ '"use strict"; (function f(foo, foo) {});': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'FunctionExpression',
+ id: {
+ type: 'Identifier',
+ name: 'f',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ params: [{
+ type: 'Identifier',
+ name: 'foo',
+ range: [26, 29],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 29 }
+ }
+ }, {
+ type: 'Identifier',
+ name: 'foo',
+ range: [32, 35],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 35 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [37, 39],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [15, 39],
+ loc: {
+ start: { line: 1, column: 15 },
+ end: { line: 1, column: 39 }
+ }
+ },
+ range: [14, 41],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ range: [0, 41],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 41 }
+ },
+ errors: [{
+ index: 32,
+ lineNumber: 1,
+ column: 33,
+ message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
+ }]
+ },
+
+ '"use strict"; x = { set f(eval) {} }' : {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Identifier',
+ name: 'x',
+ range: [14, 15],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 15 }
+ }
+ },
+ right: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'f',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ value : {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'eval',
+ range: [26, 30],
+ loc: {
+ start: { line: 1, column: 26 },
+ end: { line: 1, column: 30 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [32, 34],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [32, 34],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ kind: 'set',
+ range: [20, 34],
+ loc: {
+ start: { line: 1, column: 20 },
+ end: { line: 1, column: 34 }
+ }
+ }],
+ range: [18, 36],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [14, 36],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ range: [14, 36],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 36 }
+ }
+ }],
+ range: [0, 36],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 36 }
+ },
+ errors: [{
+ index: 26,
+ lineNumber: 1,
+ column: 27,
+ message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
+ }]
+ },
+
+ 'function hello() { "octal directive\\1"; "use strict"; }': {
+ type: 'Program',
+ body: [{
+ type: 'FunctionDeclaration',
+ id: {
+ type: 'Identifier',
+ name: 'hello',
+ range: [9, 14],
+ loc: {
+ start: { line: 1, column: 9 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'octal directive\u0001',
+ raw: '"octal directive\\1"',
+ range: [19, 38],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ range: [19, 39],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 39 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [40, 52],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 52 }
+ }
+ },
+ range: [40, 53],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 53 }
+ }
+ }],
+ range: [17, 55],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 55 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [0, 55],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 55 }
+ }
+ }],
+ range: [0, 55],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 55 }
+ },
+ errors: [{
+ index: 19,
+ lineNumber: 1,
+ column: 20,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ }]
+ },
+
+ '"\\1"; \'use strict\';': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: '\u0001',
+ raw: '"\\1"',
+ range: [0, 4],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 4 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ }, {
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '\'use strict\'',
+ range: [6, 18],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [6, 19],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 19 }
+ }
+ }],
+ range: [0, 19],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 19 }
+ },
+ errors: [{
+ index: 0,
+ lineNumber: 1,
+ column: 1,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ }]
+ },
+
+ '"use strict"; var x = { 014: 3}': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ init: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Literal',
+ value: 12,
+ raw: '014',
+ range: [24, 27],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 27 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [29, 30],
+ loc: {
+ start: { line: 1, column: 29 },
+ end: { line: 1, column: 30 }
+ }
+ },
+ kind: 'init',
+ range: [24, 30],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 30 }
+ }
+ }],
+ range: [22, 31],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 31 }
+ }
+ },
+ range: [18, 31],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ kind: 'var',
+ range: [14, 31],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ range: [0, 31],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 31 }
+ },
+ errors: [{
+ index: 24,
+ lineNumber: 1,
+ column: 25,
+ message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
+ }]
+ },
+
+ '"use strict"; var x = { get i() {}, get i() {} }': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ init: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'i',
+ range: [28, 29],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [32, 34],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [32, 34],
+ loc: {
+ start: { line: 1, column: 32 },
+ end: { line: 1, column: 34 }
+ }
+ },
+ kind: 'get',
+ range: [24, 34],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 34 }
+ }
+ }, {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'i',
+ range: [40, 41],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [44, 46],
+ loc: {
+ start: { line: 1, column: 44 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [44, 46],
+ loc: {
+ start: { line: 1, column: 44 },
+ end: { line: 1, column: 46 }
+ }
+ },
+ kind: 'get',
+ range: [36, 46],
+ loc: {
+ start: { line: 1, column: 36 },
+ end: { line: 1, column: 46 }
+ }
+ }],
+ range: [22, 48],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 48 }
+ }
+ },
+ range: [18, 48],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 48 }
+ }
+ }],
+ kind: 'var',
+ range: [14, 48],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 48 }
+ }
+ }],
+ range: [0, 48],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 48 }
+ },
+ errors: [{
+ index: 46,
+ lineNumber: 1,
+ column: 47,
+ message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name'
+ }]
+ },
+
+ '"use strict"; var x = { i: 42, get i() {} }': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ init: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'i',
+ range: [24, 25],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 25 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [27, 29],
+ loc: {
+ start: { line: 1, column: 27 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ kind: 'init',
+ range: [24, 29],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 29 }
+ }
+ }, {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'i',
+ range: [35, 36],
+ loc: {
+ start: { line: 1, column: 35 },
+ end: { line: 1, column: 36 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [39, 41],
+ loc: {
+ start: { line: 1, column: 39 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [39, 41],
+ loc: {
+ start: { line: 1, column: 39 },
+ end: { line: 1, column: 41 }
+ }
+ },
+ kind: 'get',
+ range: [31, 41],
+ loc: {
+ start: { line: 1, column: 31 },
+ end: { line: 1, column: 41 }
+ }
+ }],
+ range: [22, 43],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 43 }
+ }
+ },
+ range: [18, 43],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 43 }
+ }
+ }],
+ kind: 'var',
+ range: [14, 43],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 43 }
+ }
+ }],
+ range: [0, 43],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 43 }
+ },
+ errors: [{
+ index: 41,
+ lineNumber: 1,
+ column: 42,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ }]
+ },
+
+ '"use strict"; var x = { set i(x) {}, i: 42 }': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'Literal',
+ value: 'use strict',
+ raw: '"use strict"',
+ range: [0, 12],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ range: [0, 13],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 13 }
+ }
+ }, {
+ type: 'VariableDeclaration',
+ declarations: [{
+ type: 'VariableDeclarator',
+ id: {
+ type: 'Identifier',
+ name: 'x',
+ range: [18, 19],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 19 }
+ }
+ },
+ init: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'i',
+ range: [28, 29],
+ loc: {
+ start: { line: 1, column: 28 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [{
+ type: 'Identifier',
+ name: 'x',
+ range: [30, 31],
+ loc: {
+ start: { line: 1, column: 30 },
+ end: { line: 1, column: 31 }
+ }
+ }],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [33, 35],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [33, 35],
+ loc: {
+ start: { line: 1, column: 33 },
+ end: { line: 1, column: 35 }
+ }
+ },
+ kind: 'set',
+ range: [24, 35],
+ loc: {
+ start: { line: 1, column: 24 },
+ end: { line: 1, column: 35 }
+ }
+ }, {
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 'i',
+ range: [37, 38],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 38 }
+ }
+ },
+ value: {
+ type: 'Literal',
+ value: 42,
+ raw: '42',
+ range: [40, 42],
+ loc: {
+ start: { line: 1, column: 40 },
+ end: { line: 1, column: 42 }
+ }
+ },
+ kind: 'init',
+ range: [37, 42],
+ loc: {
+ start: { line: 1, column: 37 },
+ end: { line: 1, column: 42 }
+ }
+ }],
+ range: [22, 44],
+ loc: {
+ start: { line: 1, column: 22 },
+ end: { line: 1, column: 44 }
+ }
+ },
+ range: [18, 44],
+ loc: {
+ start: { line: 1, column: 18 },
+ end: { line: 1, column: 44 }
+ }
+ }],
+ kind: 'var',
+ range: [14, 44],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 44 }
+ }
+ }],
+ range: [0, 44],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 44 }
+ },
+ errors: [{
+ index: 42,
+ lineNumber: 1,
+ column: 43,
+ message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
+ }]
+
+
+ },
+
+ '({ set s() { } })': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'ObjectExpression',
+ properties: [{
+ type: 'Property',
+ key: {
+ type: 'Identifier',
+ name: 's',
+ range: [7, 8],
+ loc: {
+ start: { line: 1, column: 7 },
+ end: { line: 1, column: 8 }
+ }
+ },
+ value: {
+ type: 'FunctionExpression',
+ id: null,
+ params: [],
+ defaults: [],
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [11, 14],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ rest: null,
+ generator: false,
+ expression: false,
+ range: [11, 14],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 14 }
+ }
+ },
+ kind: 'set',
+ range: [3, 14],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 14 }
+ }
+ }],
+ range: [1, 16],
+ loc: {
+ start: { line: 1, column: 1 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ }
+ }],
+ range: [0, 17],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 17 }
+ },
+ errors: [{
+ index: 9,
+ lineNumber: 1,
+ column: 10,
+ message: 'Error: Line 1: Unexpected token )'
+ }]
+ },
+
+ 'foo("bar") = baz': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'CallExpression',
+ callee: {
+ type: 'Identifier',
+ name: 'foo',
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ 'arguments': [{
+ type: 'Literal',
+ value: 'bar',
+ raw: '"bar"',
+ range: [4, 9],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 9 }
+ }
+ }],
+ range: [0, 10],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ right: {
+ type: 'Identifier',
+ name: 'baz',
+ range: [13, 16],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ },
+ errors: [{
+ index: 10,
+ lineNumber: 1,
+ column: 11,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ }]
+ },
+
+ '1 = 2': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'AssignmentExpression',
+ operator: '=',
+ left: {
+ type: 'Literal',
+ value: 1,
+ raw: '1',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ right: {
+ type: 'Literal',
+ value: 2,
+ raw: '2',
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ }
+ }],
+ range: [0, 5],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 5 }
+ },
+ errors: [{
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ }]
+ },
+
+ '3++': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '++',
+ argument: {
+ type: 'Literal',
+ value: 3,
+ raw: '3',
+ range: [0, 1],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 1 }
+ }
+ },
+ prefix: false,
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }],
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ },
+ errors: [{
+ index: 1,
+ lineNumber: 1,
+ column: 2,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ }]
+ },
+
+ '--4': {
+ type: 'Program',
+ body: [{
+ type: 'ExpressionStatement',
+ expression: {
+ type: 'UpdateExpression',
+ operator: '--',
+ argument: {
+ type: 'Literal',
+ value: 4,
+ raw: '4',
+ range: [2, 3],
+ loc: {
+ start: { line: 1, column: 2 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ prefix: true,
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ },
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ }
+ }],
+ range: [0, 3],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 3 }
+ },
+ errors: [{
+ index: 3,
+ lineNumber: 1,
+ column: 4,
+ message: 'Error: Line 1: Invalid left-hand side in assignment'
+ }]
+ },
+
+ 'for (5 in []) {}': {
+ type: 'Program',
+ body: [{
+ type: 'ForInStatement',
+ left: {
+ type: 'Literal',
+ value: 5,
+ raw: '5',
+ range: [5, 6],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 6 }
+ }
+ },
+ right: {
+ type: 'ArrayExpression',
+ elements: [],
+ range: [10, 12],
+ loc: {
+ start: { line: 1, column: 10 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ body: {
+ type: 'BlockStatement',
+ body: [],
+ range: [14, 16],
+ loc: {
+ start: { line: 1, column: 14 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ each: false,
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ }
+ }],
+ range: [0, 16],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 16 }
+ },
+ errors: [{
+ index: 6,
+ lineNumber: 1,
+ column: 7,
+ message: 'Error: Line 1: Invalid left-hand side in for-in'
+ }]
+ },
+
+ 'var x = /[P QR]/\\g': {
+ type: "Program",
+ body: [{
+ type: "VariableDeclaration",
+ declarations: [{
+ type: "VariableDeclarator",
+ id: {
+ type: "Identifier",
+ name: "x",
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: "Literal",
+ value: "/[P QR]/g",
+ raw: "/[P QR]/\\g",
+ range: [8, 18],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ range: [4, 18],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ kind: "var",
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ }
+ }],
+ range: [0, 18],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 18 }
+ },
+ errors: [{
+ index: 17,
+ lineNumber: 1,
+ column: 18,
+ message: "Error: Line 1: Unexpected token ILLEGAL"
+ }]
+ },
+
+ 'var x = /[P QR]/\\\\u0067': {
+ type: "Program",
+ body: [{
+ type: "VariableDeclaration",
+ declarations: [{
+ type: "VariableDeclarator",
+ id: {
+ type: "Identifier",
+ name: "x",
+ range: [4, 5],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 5 }
+ }
+ },
+ init: {
+ type: "Literal",
+ value: "/[P QR]/g",
+ raw: "/[P QR]/\\\\u0067",
+ range: [8, 23],
+ loc: {
+ start: { line: 1, column: 8 },
+ end: { line: 1, column: 23 }
+ }
+ },
+ range: [4, 23],
+ loc: {
+ start: { line: 1, column: 4 },
+ end: { line: 1, column: 23 }
+ }
+ }],
+ kind: "var",
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ }
+ }],
+ range: [0, 23],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 23 }
+ },
+ errors: [{
+ index: 17,
+ lineNumber: 1,
+ column: 18,
+ message: "Error: Line 1: Unexpected token ILLEGAL"
+ }, {
+ index: 23,
+ lineNumber: 1,
+ column: 24,
+ message: "Error: Line 1: Unexpected token ILLEGAL"
+ }]
+ }
+
+ }
+};
diff --git a/node_modules/jsonpath/node_modules/underscore/LICENSE b/node_modules/jsonpath/node_modules/underscore/LICENSE
new file mode 100644
index 00000000..8c223625
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative
+Reporters & Editors
+
+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/jsonpath/node_modules/underscore/README.md b/node_modules/jsonpath/node_modules/underscore/README.md
new file mode 100644
index 00000000..890269cd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/README.md
@@ -0,0 +1,28 @@
+ __
+ /\ \ __
+ __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____
+ /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\
+ \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\
+ \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/
+ \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/
+ \ \____/
+ \/___/
+
+Underscore.js is a utility-belt library for JavaScript that provides
+support for the usual functional suspects (each, map, reduce, filter...)
+without extending any core JavaScript objects.
+
+For Docs, License, Tests, and pre-packed downloads, see:
+https://underscorejs.org
+
+For support and questions, please use
+[the gitter channel](https://gitter.im/jashkenas/underscore)
+or [stackoverflow](https://stackoverflow.com/search?q=underscore.js)
+
+Underscore is an open-sourced component of DocumentCloud:
+https://github.com/documentcloud
+
+Many thanks to our contributors:
+https://github.com/jashkenas/underscore/contributors
+
+This project adheres to a [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_apply.js b/node_modules/jsonpath/node_modules/underscore/amd/_apply.js
new file mode 100644
index 00000000..fb33b2cd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_apply.js
@@ -0,0 +1,7 @@
+define(['./_setup', './_unmethodize'], function (_setup, _unmethodize) {
+
+ var apply = _unmethodize(_setup.apply);
+
+ return apply;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_applyProperty.js b/node_modules/jsonpath/node_modules/underscore/amd/_applyProperty.js
new file mode 100644
index 00000000..33189055
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_applyProperty.js
@@ -0,0 +1,14 @@
+define(function () {
+
+ // Internal helper that wraps an `iteratee` to call it with the
+ // property of a closed-over `object`. Useful when iterating over
+ // an array of keys of `object`.
+ function applyProperty(iteratee, object) {
+ return function(key) {
+ return iteratee(object[key], key, object);
+ };
+ }
+
+ return applyProperty;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_arrayAccessors.js b/node_modules/jsonpath/node_modules/underscore/amd/_arrayAccessors.js
new file mode 100644
index 00000000..83afca79
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_arrayAccessors.js
@@ -0,0 +1,11 @@
+define(['exports', './concat', './join', './slice'], function (exports, concat, join, slice) {
+
+
+
+ exports.concat = concat;
+ exports.join = join;
+ exports.slice = slice;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_arrayMutators.js b/node_modules/jsonpath/node_modules/underscore/amd/_arrayMutators.js
new file mode 100644
index 00000000..448efe31
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_arrayMutators.js
@@ -0,0 +1,15 @@
+define(['exports', './pop', './push', './reverse', './shift', './sort', './splice', './unshift'], function (exports, pop, push, reverse, shift, sort, splice, unshift) {
+
+
+
+ exports.pop = pop;
+ exports.push = push;
+ exports.reverse = reverse;
+ exports.shift = shift;
+ exports.sort = sort;
+ exports.splice = splice;
+ exports.unshift = unshift;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_baseCreate.js b/node_modules/jsonpath/node_modules/underscore/amd/_baseCreate.js
new file mode 100644
index 00000000..34ae6def
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_baseCreate.js
@@ -0,0 +1,21 @@
+define(['./isObject', './_setup'], function (isObject, _setup) {
+
+ // Create a naked function reference for surrogate-prototype-swapping.
+ function ctor() {
+ return function(){};
+ }
+
+ // An internal function for creating a new object that inherits from another.
+ function baseCreate(prototype) {
+ if (!isObject(prototype)) return {};
+ if (_setup.nativeCreate) return _setup.nativeCreate(prototype);
+ var Ctor = ctor();
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+ }
+
+ return baseCreate;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_baseIteratee.js b/node_modules/jsonpath/node_modules/underscore/amd/_baseIteratee.js
new file mode 100644
index 00000000..bde4207e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_baseIteratee.js
@@ -0,0 +1,15 @@
+define(['./isObject', './identity', './isFunction', './isArray', './matcher', './property', './_optimizeCb'], function (isObject, identity, isFunction, isArray, matcher, property, _optimizeCb) {
+
+ // An internal function to generate callbacks that can be applied to each
+ // element in a collection, returning the desired result — either `_.identity`,
+ // an arbitrary callback, a property matcher, or a property accessor.
+ function baseIteratee(value, context, argCount) {
+ if (value == null) return identity;
+ if (isFunction(value)) return _optimizeCb(value, context, argCount);
+ if (isObject(value) && !isArray(value)) return matcher(value);
+ return property(value);
+ }
+
+ return baseIteratee;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_binarySearch.js b/node_modules/jsonpath/node_modules/underscore/amd/_binarySearch.js
new file mode 100644
index 00000000..f8f02e66
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_binarySearch.js
@@ -0,0 +1,17 @@
+define(['./_getLength'], function (_getLength) {
+
+ // Iteratively cut `array` in half to figure out the index at which `obj` should
+ // be inserted so as to maintain the order defined by `compare`.
+ function binarySearch(array, obj, iteratee, compare) {
+ var value = iteratee(obj);
+ var low = 0, high = _getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (compare(iteratee(array[mid]), value)) low = mid + 1; else high = mid;
+ }
+ return low;
+ }
+
+ return binarySearch;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_bindCb.js b/node_modules/jsonpath/node_modules/underscore/amd/_bindCb.js
new file mode 100644
index 00000000..fb50f1cd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_bindCb.js
@@ -0,0 +1,14 @@
+define(function () {
+
+ // Internal function that returns a bound version of the passed-in callback, to
+ // be repeatedly applied in other Underscore functions.
+ function bindCb(func, context) {
+ if (context === void 0) return func;
+ return function() {
+ return func.apply(context, arguments);
+ };
+ }
+
+ return bindCb;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_bindCb4.js b/node_modules/jsonpath/node_modules/underscore/amd/_bindCb4.js
new file mode 100644
index 00000000..58fd6270
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_bindCb4.js
@@ -0,0 +1,17 @@
+define(function () {
+
+ // In Firefox, `Function.prototype.call` is faster than
+ // `Function.prototype.apply`. In the optimized variant of
+ // `bindCb` below, we exploit the fact that no Underscore
+ // function passes more than four arguments to a callback.
+ // **NOT general enough for use outside of Underscore.**
+ function bindCb4(func, context) {
+ if (context === void 0) return func;
+ return function(a1, a2, a3, a4) {
+ return func.call(context, a1, a2, a3, a4);
+ };
+ }
+
+ return bindCb4;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_byValue.js b/node_modules/jsonpath/node_modules/underscore/amd/_byValue.js
new file mode 100644
index 00000000..ebfdd21f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_byValue.js
@@ -0,0 +1,11 @@
+define(function () {
+
+ // Internal wrapper to enable match-by-value mode in `linearSearch`.
+ function byValue(value) {
+ if (!(this instanceof byValue)) return new byValue(value);
+ this.value = value;
+ }
+
+ return byValue;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_cb.js b/node_modules/jsonpath/node_modules/underscore/amd/_cb.js
new file mode 100644
index 00000000..6544623b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_cb.js
@@ -0,0 +1,12 @@
+define(['./underscore', './_baseIteratee', './iteratee'], function (underscore, _baseIteratee, iteratee) {
+
+ // The function we call internally to generate a callback. It invokes
+ // `_.iteratee` if overridden, otherwise `baseIteratee`.
+ function cb(value, context, argCount) {
+ if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context);
+ return _baseIteratee(value, context, argCount);
+ }
+
+ return cb;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_chainResult.js b/node_modules/jsonpath/node_modules/underscore/amd/_chainResult.js
new file mode 100644
index 00000000..f9e3002d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_chainResult.js
@@ -0,0 +1,10 @@
+define(['./underscore'], function (underscore) {
+
+ // Helper function to continue chaining intermediate results.
+ function chainResult(instance, obj) {
+ return instance._chain ? underscore(obj).chain() : obj;
+ }
+
+ return chainResult;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_collectNonEnumProps.js b/node_modules/jsonpath/node_modules/underscore/amd/_collectNonEnumProps.js
new file mode 100644
index 00000000..32d9f5ce
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_collectNonEnumProps.js
@@ -0,0 +1,42 @@
+define(['./_setup', './isFunction', './_has'], function (_setup, isFunction, _has) {
+
+ // Internal helper to create a simple lookup structure.
+ // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+ // circular imports. `emulatedSet` is a one-off solution that only works for
+ // arrays of strings.
+ function emulatedSet(keys) {
+ var hash = {};
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+ return {
+ contains: function(key) { return hash[key]; },
+ push: function(key) {
+ hash[key] = true;
+ return keys.push(key);
+ }
+ };
+ }
+
+ // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+ // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+ // needed.
+ function collectNonEnumProps(obj, keys) {
+ keys = emulatedSet(keys);
+ var nonEnumIdx = _setup.nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = isFunction(constructor) && constructor.prototype || _setup.ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = _setup.nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+ keys.push(prop);
+ }
+ }
+ }
+
+ return collectNonEnumProps;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_createAssigner.js b/node_modules/jsonpath/node_modules/underscore/amd/_createAssigner.js
new file mode 100644
index 00000000..deb5902d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_createAssigner.js
@@ -0,0 +1,24 @@
+define(function () {
+
+ // An internal function for creating assigner functions.
+ function createAssigner(keysFunc, defaults) {
+ return function(obj) {
+ var length = arguments.length;
+ if (defaults) obj = Object(obj);
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+ }
+
+ return createAssigner;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_createEscaper.js b/node_modules/jsonpath/node_modules/underscore/amd/_createEscaper.js
new file mode 100644
index 00000000..385ad84e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_createEscaper.js
@@ -0,0 +1,21 @@
+define(['./keys'], function (keys) {
+
+ // Internal helper to generate functions for escaping and unescaping strings
+ // to/from HTML interpolation.
+ function createEscaper(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+ }
+
+ return createEscaper;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_createIndexFinder.js b/node_modules/jsonpath/node_modules/underscore/amd/_createIndexFinder.js
new file mode 100644
index 00000000..d58305c0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_createIndexFinder.js
@@ -0,0 +1,30 @@
+define(['./_setup', './_getLength', './isNaN'], function (_setup, _getLength, _isNaN) {
+
+ // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = _getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+ }
+
+ return createIndexFinder;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_createPredicateIndexFinder.js b/node_modules/jsonpath/node_modules/underscore/amd/_createPredicateIndexFinder.js
new file mode 100644
index 00000000..27635f2e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_createPredicateIndexFinder.js
@@ -0,0 +1,18 @@
+define(['./_cb', './_getLength'], function (_cb, _getLength) {
+
+ // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+ function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = _cb(predicate, context);
+ var length = _getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+ }
+
+ return createPredicateIndexFinder;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_createReduce.js b/node_modules/jsonpath/node_modules/underscore/amd/_createReduce.js
new file mode 100644
index 00000000..f7f3f3c5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_createReduce.js
@@ -0,0 +1,30 @@
+define(['./keys', './_optimizeCb', './_isArrayLike'], function (keys, _optimizeCb, _isArrayLike) {
+
+ // Internal helper to create a reducing function, iterating left or right.
+ function createReduce(dir) {
+ // Wrap code that reassigns argument variables in a separate function than
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+ var reducer = function(obj, iteratee, memo, initial) {
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ if (!initial) {
+ memo = obj[_keys ? _keys[index] : index];
+ index += dir;
+ }
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = _keys ? _keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ };
+
+ return function(obj, iteratee, memo, context) {
+ var initial = arguments.length >= 3;
+ return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial);
+ };
+ }
+
+ return createReduce;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_createSizePropertyCheck.js b/node_modules/jsonpath/node_modules/underscore/amd/_createSizePropertyCheck.js
new file mode 100644
index 00000000..83ce2c43
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_createSizePropertyCheck.js
@@ -0,0 +1,13 @@
+define(['./_setup'], function (_setup) {
+
+ // Common internal logic for `isArrayLike` and `isBufferLike`.
+ function createSizePropertyCheck(getSizeProperty) {
+ return function(collection) {
+ var sizeProperty = getSizeProperty(collection);
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX;
+ }
+ }
+
+ return createSizePropertyCheck;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_deepGet.js b/node_modules/jsonpath/node_modules/underscore/amd/_deepGet.js
new file mode 100644
index 00000000..e0751085
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_deepGet.js
@@ -0,0 +1,15 @@
+define(function () {
+
+ // Internal function to obtain a nested property in `obj` along `path`.
+ function deepGet(obj, path) {
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ if (obj == null) return void 0;
+ obj = obj[path[i]];
+ }
+ return length ? obj : void 0;
+ }
+
+ return deepGet;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_escapeMap.js b/node_modules/jsonpath/node_modules/underscore/amd/_escapeMap.js
new file mode 100644
index 00000000..584873e8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_escapeMap.js
@@ -0,0 +1,15 @@
+define(function () {
+
+ // Internal list of HTML entities for escaping.
+ var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+
+ return escapeMap;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_executeBound.js b/node_modules/jsonpath/node_modules/underscore/amd/_executeBound.js
new file mode 100644
index 00000000..b25707fc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_executeBound.js
@@ -0,0 +1,16 @@
+define(['./isObject', './_baseCreate'], function (isObject, _baseCreate) {
+
+ // Internal function to execute `sourceFunc` bound to `context` with optional
+ // `args`. Determines whether to execute a function as a constructor or as a
+ // normal function.
+ function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = _baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (isObject(result)) return result;
+ return self;
+ }
+
+ return executeBound;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_extremum.js b/node_modules/jsonpath/node_modules/underscore/amd/_extremum.js
new file mode 100644
index 00000000..3a3e90e5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_extremum.js
@@ -0,0 +1,35 @@
+define(['./identity', './_cb', './find'], function (identity, _cb, find) {
+
+ // The general algorithm behind `_.min` and `_.max`. `compare` should return
+ // `true` if its first argument is more extreme than (i.e., should be preferred
+ // over) its second argument, `false` otherwise. `iteratee` and `context`, like
+ // in other collection functions, let you map the actual values in `collection`
+ // to the values to `compare`. `decide` is an optional customization point
+ // which is only present for historical reasons; please don't use it, as it will
+ // likely be removed in the future.
+ function extremum(collection, compare, iteratee, context, decide) {
+ decide || (decide = identity);
+ // `extremum` is essentially a combined map+reduce with **two** accumulators:
+ // `result` and `iterResult`, respectively the unmapped and the mapped version
+ // corresponding to the same element.
+ var result, iterResult;
+ iteratee = _cb(iteratee, context);
+ var first = true;
+ find(collection, function(value, key) {
+ var iterValue = iteratee(value, key, collection);
+ if (first || compare(iterValue, iterResult)) {
+ result = value;
+ iterResult = iterValue;
+ first = false;
+ }
+ });
+ // `extremum` normally returns an unmapped element from `collection`. However,
+ // `_.min` and `_.max` forcibly return a number even if there is no element
+ // that maps to a numeric value. Passing both accumulators through `decide`
+ // before returning enables this behavior.
+ return decide(result, iterResult);
+ }
+
+ return extremum;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_flatten.js b/node_modules/jsonpath/node_modules/underscore/amd/_flatten.js
new file mode 100644
index 00000000..624df2f5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_flatten.js
@@ -0,0 +1,32 @@
+define(['./isArray', './_getLength', './_isArrayLike', './isArguments'], function (isArray, _getLength, _isArrayLike, isArguments) {
+
+ // Internal implementation of a recursive `flatten` function.
+ function flatten(input, depth, strict, output) {
+ output = output || [];
+ if (!depth && depth !== 0) {
+ depth = Infinity;
+ } else if (depth <= 0) {
+ return output.concat(input);
+ }
+ var idx = output.length;
+ for (var i = 0, length = _getLength(input); i < length; i++) {
+ var value = input[i];
+ if (_isArrayLike(value) && (isArray(value) || isArguments(value))) {
+ // Flatten current level of array or arguments object.
+ if (depth > 1) {
+ flatten(value, depth - 1, strict, output);
+ idx = output.length;
+ } else {
+ var j = 0, len = value.length;
+ while (j < len) output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+ }
+
+ return flatten;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_forceNumericMinMax.js b/node_modules/jsonpath/node_modules/underscore/amd/_forceNumericMinMax.js
new file mode 100644
index 00000000..6e47fa8a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_forceNumericMinMax.js
@@ -0,0 +1,16 @@
+define(['exports', './isNaN'], function (exports, _isNaN) {
+
+ // Internal `extremum` return value adapter for `_.min` and `_.max`.
+ // Ensures that a number is returned even if no element of the
+ // collection maps to a numeric value.
+ function decideNumeric(fallback) {
+ return function(result, iterResult) {
+ return _isNaN(+iterResult) ? fallback : result;
+ }
+ }
+
+ exports.decideNumeric = decideNumeric;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_getByteLength.js b/node_modules/jsonpath/node_modules/underscore/amd/_getByteLength.js
new file mode 100644
index 00000000..c6d9974a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_getByteLength.js
@@ -0,0 +1,8 @@
+define(['./_shallowProperty'], function (_shallowProperty) {
+
+ // Internal helper to obtain the `byteLength` property of an object.
+ var getByteLength = _shallowProperty('byteLength');
+
+ return getByteLength;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_getLength.js b/node_modules/jsonpath/node_modules/underscore/amd/_getLength.js
new file mode 100644
index 00000000..f889b985
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_getLength.js
@@ -0,0 +1,8 @@
+define(['./_shallowProperty'], function (_shallowProperty) {
+
+ // Internal helper to obtain the `length` property of an object.
+ var getLength = _shallowProperty('length');
+
+ return getLength;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_greater.js b/node_modules/jsonpath/node_modules/underscore/amd/_greater.js
new file mode 100644
index 00000000..04ce570e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_greater.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // A version of the `>` operator that can be passed around as a function.
+ function greater(left, right) {
+ return left > right;
+ }
+
+ return greater;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_group.js b/node_modules/jsonpath/node_modules/underscore/amd/_group.js
new file mode 100644
index 00000000..d9805520
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_group.js
@@ -0,0 +1,18 @@
+define(['./_cb', './each'], function (_cb, each) {
+
+ // An internal function used for aggregate "group by" operations.
+ function group(behavior, partition) {
+ return function(obj, iteratee, context) {
+ var result = partition ? [[], []] : {};
+ iteratee = _cb(iteratee, context);
+ each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+ }
+
+ return group;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_has.js b/node_modules/jsonpath/node_modules/underscore/amd/_has.js
new file mode 100644
index 00000000..983f0602
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_has.js
@@ -0,0 +1,10 @@
+define(['./_setup'], function (_setup) {
+
+ // Internal function to check whether `key` is an own property name of `obj`.
+ function has(obj, key) {
+ return obj != null && _setup.hasOwnProperty.call(obj, key);
+ }
+
+ return has;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_hasObjectTag.js b/node_modules/jsonpath/node_modules/underscore/amd/_hasObjectTag.js
new file mode 100644
index 00000000..bb9bee63
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_hasObjectTag.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var hasObjectTag = _tagTester('Object');
+
+ return hasObjectTag;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_isArrayLike.js b/node_modules/jsonpath/node_modules/underscore/amd/_isArrayLike.js
new file mode 100644
index 00000000..6866b2ae
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_isArrayLike.js
@@ -0,0 +1,11 @@
+define(['./_getLength', './_createSizePropertyCheck'], function (_getLength, _createSizePropertyCheck) {
+
+ // Internal helper for collection methods to determine whether a collection
+ // should be iterated as an array or as an object.
+ // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+ var isArrayLike = _createSizePropertyCheck(_getLength);
+
+ return isArrayLike;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_isBufferLike.js b/node_modules/jsonpath/node_modules/underscore/amd/_isBufferLike.js
new file mode 100644
index 00000000..813641d8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_isBufferLike.js
@@ -0,0 +1,9 @@
+define(['./_createSizePropertyCheck', './_getByteLength'], function (_createSizePropertyCheck, _getByteLength) {
+
+ // Internal helper to determine whether we should spend extensive checks against
+ // `ArrayBuffer` et al.
+ var isBufferLike = _createSizePropertyCheck(_getByteLength);
+
+ return isBufferLike;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_keyInObj.js b/node_modules/jsonpath/node_modules/underscore/amd/_keyInObj.js
new file mode 100644
index 00000000..ba269d98
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_keyInObj.js
@@ -0,0 +1,11 @@
+define(function () {
+
+ // Internal `_.pick` helper function to determine whether `key` is an enumerable
+ // property name of `obj`.
+ function keyInObj(value, key, obj) {
+ return key in obj;
+ }
+
+ return keyInObj;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_less.js b/node_modules/jsonpath/node_modules/underscore/amd/_less.js
new file mode 100644
index 00000000..699822ce
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_less.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // A version of the `<` operator that can be passed around as a function.
+ function less(left, right) {
+ return left < right;
+ }
+
+ return less;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_lessEqual.js b/node_modules/jsonpath/node_modules/underscore/amd/_lessEqual.js
new file mode 100644
index 00000000..094a1594
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_lessEqual.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // A version of the `<=` operator that can be passed around as a function.
+ function lessEqual(left, right) {
+ return left <= right;
+ }
+
+ return lessEqual;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_linearSearch.js b/node_modules/jsonpath/node_modules/underscore/amd/_linearSearch.js
new file mode 100644
index 00000000..2de887f9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_linearSearch.js
@@ -0,0 +1,31 @@
+define(['./_getLength', './isFunction'], function (_getLength, isFunction) {
+
+ // Internal function for linearly iterating over arrays.
+ function linearSearch(array, predicate, dir, start) {
+ var target, length = _getLength(array);
+ dir || (dir = 1);
+ start = (
+ start == null ? (dir > 0 ? 0 : length - 1) :
+ start < 0 ? (dir > 0 ? Math.max(0, start + length) : start + length) :
+ dir > 0 ? start : Math.min(start, length - 1)
+ );
+ // As a special case, in order to elide the `predicate` invocation on every
+ // loop iteration, we allow the caller to pass a value that should be found by
+ // strict equality comparison. This is somewhat like a rudimentary iteratee
+ // shorthand. It is used in `_.indexof` and `_.lastIndexOf`.
+ if (!isFunction(predicate)) {
+ target = predicate && predicate.value;
+ predicate = false;
+ }
+ for (; start >= 0 && start < length; start += dir) {
+ if (
+ predicate ? predicate(array[start], start, array) :
+ array[start] === target
+ ) return start;
+ }
+ return -1;
+ }
+
+ return linearSearch;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_mapReduce.js b/node_modules/jsonpath/node_modules/underscore/amd/_mapReduce.js
new file mode 100644
index 00000000..9bc9bd7c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_mapReduce.js
@@ -0,0 +1,5 @@
+define(function () {
+
+
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_methodFingerprint.js b/node_modules/jsonpath/node_modules/underscore/amd/_methodFingerprint.js
new file mode 100644
index 00000000..170aef3e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_methodFingerprint.js
@@ -0,0 +1,44 @@
+define(['exports', './isFunction', './_getLength', './allKeys'], function (exports, isFunction, _getLength, allKeys) {
+
+ // Since the regular `Object.prototype.toString` type tests don't work for
+ // some types in IE 11, we use a fingerprinting heuristic instead, based
+ // on the methods. It's not great, but it's the best we got.
+ // The fingerprint method lists are defined below.
+ function ie11fingerprint(methods) {
+ var length = _getLength(methods);
+ return function(obj) {
+ if (obj == null) return false;
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
+ var keys = allKeys(obj);
+ if (_getLength(keys)) return false;
+ for (var i = 0; i < length; i++) {
+ if (!isFunction(obj[methods[i]])) return false;
+ }
+ // If we are testing against `WeakMap`, we need to ensure that
+ // `obj` doesn't have a `forEach` method in order to distinguish
+ // it from a regular `Map`.
+ return methods !== weakMapMethods || !isFunction(obj[forEachName]);
+ };
+ }
+
+ // In the interest of compact minification, we write
+ // each string in the fingerprints only once.
+ var forEachName = 'forEach',
+ hasName = 'has',
+ commonInit = ['clear', 'delete'],
+ mapTail = ['get', hasName, 'set'];
+
+ // `Map`, `WeakMap` and `Set` each have slightly different
+ // combinations of the above sublists.
+ var mapMethods = commonInit.concat(forEachName, mapTail),
+ weakMapMethods = commonInit.concat(mapTail),
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+ exports.ie11fingerprint = ie11fingerprint;
+ exports.mapMethods = mapMethods;
+ exports.setMethods = setMethods;
+ exports.weakMapMethods = weakMapMethods;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_optimizeCb.js b/node_modules/jsonpath/node_modules/underscore/amd/_optimizeCb.js
new file mode 100644
index 00000000..0ed8c681
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_optimizeCb.js
@@ -0,0 +1,27 @@
+define(function () {
+
+ // Internal function that returns an efficient (for current engines) version
+ // of the passed-in callback, to be repeatedly applied in other Underscore
+ // functions.
+ function optimizeCb(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ // The 2-argument case is omitted because we’re not using it.
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+ }
+
+ return optimizeCb;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_push.js b/node_modules/jsonpath/node_modules/underscore/amd/_push.js
new file mode 100644
index 00000000..64ad32a4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_push.js
@@ -0,0 +1,7 @@
+define(['./_setup', './_unmethodize'], function (_setup, _unmethodize) {
+
+ var push = _unmethodize(_setup.ArrayProto.push);
+
+ return push;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_pusher.js b/node_modules/jsonpath/node_modules/underscore/amd/_pusher.js
new file mode 100644
index 00000000..e4a5b39b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_pusher.js
@@ -0,0 +1,13 @@
+define(function () {
+
+ // Internal helper to generate a callback that will append
+ // its first argument to the closed-over `array`.
+ function pusher(array) {
+ return function(arg) {
+ array.push(arg);
+ };
+ }
+
+ return pusher;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_sequence.js b/node_modules/jsonpath/node_modules/underscore/amd/_sequence.js
new file mode 100644
index 00000000..437bcd77
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_sequence.js
@@ -0,0 +1,18 @@
+define(function () {
+
+ function sequence(iteratee, start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+ var rest = (stop - start) % step;
+ stop += (rest && step - rest);
+ for ( ; start != stop ; start += step) if (iteratee(start)) return start;
+ }
+
+ return sequence;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_setup.js b/node_modules/jsonpath/node_modules/underscore/amd/_setup.js
new file mode 100644
index 00000000..a6b42fa4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_setup.js
@@ -0,0 +1,70 @@
+define(['exports'], function (exports) {
+
+ // Current version.
+ var VERSION = '1.12.1';
+
+ // Establish the root object, `window` (`self`) in the browser, `global`
+ // on the server, or `this` in some virtual machines. We use `self`
+ // instead of `window` for `WebWorker` support.
+ var root = typeof self == 'object' && self.self === self && self ||
+ typeof global == 'object' && global.global === global && global ||
+ Function('return this')() ||
+ {};
+
+ // Save bytes in the minified (but not gzipped) version:
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+ var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+ // Create quick reference variables for speed access to core prototypes.
+ var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+ // Modern feature detection.
+ var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+ supportsDataView = typeof DataView !== 'undefined';
+
+ // All **ECMAScript 5+** native function implementations that we hope to use
+ // are declared here.
+ var nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeCreate = Object.create,
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+ // Create references to these builtin functions because we override them.
+ var _isNaN = isNaN,
+ _isFinite = isFinite;
+
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+ // The largest integer that can be represented exactly.
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+ exports.ArrayProto = ArrayProto;
+ exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX;
+ exports.ObjProto = ObjProto;
+ exports.SymbolProto = SymbolProto;
+ exports.VERSION = VERSION;
+ exports._isFinite = _isFinite;
+ exports._isNaN = _isNaN;
+ exports.hasEnumBug = hasEnumBug;
+ exports.hasOwnProperty = hasOwnProperty;
+ exports.nativeCreate = nativeCreate;
+ exports.nativeIsArray = nativeIsArray;
+ exports.nativeIsView = nativeIsView;
+ exports.nativeKeys = nativeKeys;
+ exports.nonEnumerableProps = nonEnumerableProps;
+ exports.push = push;
+ exports.root = root;
+ exports.slice = slice;
+ exports.supportsArrayBuffer = supportsArrayBuffer;
+ exports.supportsDataView = supportsDataView;
+ exports.toString = toString;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_shallowProperty.js b/node_modules/jsonpath/node_modules/underscore/amd/_shallowProperty.js
new file mode 100644
index 00000000..e0ca2269
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_shallowProperty.js
@@ -0,0 +1,12 @@
+define(function () {
+
+ // Internal helper to generate a function to obtain property `key` from `obj`.
+ function shallowProperty(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+ }
+
+ return shallowProperty;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_slice.js b/node_modules/jsonpath/node_modules/underscore/amd/_slice.js
new file mode 100644
index 00000000..b3fc7ecd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_slice.js
@@ -0,0 +1,7 @@
+define(['./_setup', './_unmethodize'], function (_setup, _unmethodize) {
+
+ var slice = _unmethodize(_setup.ArrayProto.slice);
+
+ return slice;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_strictEqual.js b/node_modules/jsonpath/node_modules/underscore/amd/_strictEqual.js
new file mode 100644
index 00000000..9da036cd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_strictEqual.js
@@ -0,0 +1,9 @@
+define(function () {
+
+ function strictEqual(left, right) {
+ return left === right;
+ }
+
+ return strictEqual;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_stringTagBug.js b/node_modules/jsonpath/node_modules/underscore/amd/_stringTagBug.js
new file mode 100644
index 00000000..c4ec5b1e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_stringTagBug.js
@@ -0,0 +1,16 @@
+define(['exports', './_setup', './_hasObjectTag'], function (exports, _setup, _hasObjectTag) {
+
+ // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+ // In IE 11, the most common among them, this problem also applies to
+ // `Map`, `WeakMap` and `Set`.
+ var hasStringTagBug = (
+ _setup.supportsDataView && _hasObjectTag(new DataView(new ArrayBuffer(8)))
+ ),
+ isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map));
+
+ exports.hasStringTagBug = hasStringTagBug;
+ exports.isIE11 = isIE11;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_tagTester.js b/node_modules/jsonpath/node_modules/underscore/amd/_tagTester.js
new file mode 100644
index 00000000..6b1f09eb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_tagTester.js
@@ -0,0 +1,13 @@
+define(['./_setup'], function (_setup) {
+
+ // Internal function for creating a `toString`-based type tester.
+ function tagTester(name) {
+ var tag = '[object ' + name + ']';
+ return function(obj) {
+ return _setup.toString.call(obj) === tag;
+ };
+ }
+
+ return tagTester;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_toBufferView.js b/node_modules/jsonpath/node_modules/underscore/amd/_toBufferView.js
new file mode 100644
index 00000000..e9464a32
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_toBufferView.js
@@ -0,0 +1,15 @@
+define(['./_getByteLength'], function (_getByteLength) {
+
+ // Internal function to wrap or shallow-copy an ArrayBuffer,
+ // typed array or DataView to a new view, reusing the buffer.
+ function toBufferView(bufferSource) {
+ return new Uint8Array(
+ bufferSource.buffer || bufferSource,
+ bufferSource.byteOffset || 0,
+ _getByteLength(bufferSource)
+ );
+ }
+
+ return toBufferView;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_toPath.js b/node_modules/jsonpath/node_modules/underscore/amd/_toPath.js
new file mode 100644
index 00000000..e692cfd9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_toPath.js
@@ -0,0 +1,11 @@
+define(['./underscore', './toPath'], function (underscore, toPath$1) {
+
+ // Internal wrapper for `_.toPath` to enable minification.
+ // Similar to `cb` for `_.iteratee`.
+ function toPath(path) {
+ return underscore.toPath(path);
+ }
+
+ return toPath;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_unescapeMap.js b/node_modules/jsonpath/node_modules/underscore/amd/_unescapeMap.js
new file mode 100644
index 00000000..cd8391c5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_unescapeMap.js
@@ -0,0 +1,8 @@
+define(['./_escapeMap', './invert'], function (_escapeMap, invert) {
+
+ // Internal list of HTML entities for unescaping.
+ var unescapeMap = invert(_escapeMap);
+
+ return unescapeMap;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_unmethodize.js b/node_modules/jsonpath/node_modules/underscore/amd/_unmethodize.js
new file mode 100644
index 00000000..9eadf9e5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_unmethodize.js
@@ -0,0 +1,9 @@
+define(['./_bindCb', './_setup'], function (_bindCb, _setup) {
+
+ function unmethodize(method) {
+ return _bindCb(_setup.call, method);
+ }
+
+ return unmethodize;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayAccessor.js b/node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayAccessor.js
new file mode 100644
index 00000000..21f62e52
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayAccessor.js
@@ -0,0 +1,15 @@
+define(['./_setup', './restArguments'], function (_setup, restArguments) {
+
+ // Internal function to wrap `Array.prototype` methods that return a
+ // new value so they can be directly invoked as standalone functions.
+ // Works for `concat`, `slice` and `join`.
+ function wrapArrayAccessor(name) {
+ var method = _setup.ArrayProto[name];
+ return restArguments(function(array, args) {
+ return array == null ? array : method.apply(array, args);
+ });
+ }
+
+ return wrapArrayAccessor;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayMutator.js b/node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayMutator.js
new file mode 100644
index 00000000..9e2ad354
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/_wrapArrayMutator.js
@@ -0,0 +1,28 @@
+define(['exports', './_setup', './_getLength', './identity', './restArguments'], function (exports, _setup, _getLength, identity, restArguments) {
+
+ // Internal function to work around a bug in IE < 9. See
+ // https://github.com/jashkenas/underscore/issues/397.
+ function removeGhostHead(array) {
+ if (!_getLength(array)) delete array[0];
+ return array;
+ }
+
+ // Internal function to wrap `Array.prototype` methods that modify
+ // the context in place so they can be directly invoked as standalone
+ // functions. Works for `pop`, `push`, `reverse`, `shift`, `sort`,
+ // `splice` and `unshift`.
+ function wrapArrayMutator(name, fixup) {
+ var method = _setup.ArrayProto[name];
+ fixup || (fixup = identity);
+ return restArguments(function(array, args) {
+ if (array != null) method.apply(array, args);
+ return fixup(array);
+ });
+ }
+
+ exports.default = wrapArrayMutator;
+ exports.removeGhostHead = removeGhostHead;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/after.js b/node_modules/jsonpath/node_modules/underscore/amd/after.js
new file mode 100644
index 00000000..69b73c69
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/after.js
@@ -0,0 +1,14 @@
+define(function () {
+
+ // Returns a function that will only be executed on and after the Nth call.
+ function after(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+
+ return after;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/allKeys.js b/node_modules/jsonpath/node_modules/underscore/amd/allKeys.js
new file mode 100644
index 00000000..1be84f1c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/allKeys.js
@@ -0,0 +1,15 @@
+define(['./isObject', './_setup', './_collectNonEnumProps'], function (isObject, _setup, _collectNonEnumProps) {
+
+ // Retrieve all the enumerable property names of an object.
+ function allKeys(obj) {
+ if (!isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
+ return keys;
+ }
+
+ return allKeys;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/before.js b/node_modules/jsonpath/node_modules/underscore/amd/before.js
new file mode 100644
index 00000000..bd856c69
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/before.js
@@ -0,0 +1,18 @@
+define(function () {
+
+ // Returns a function that will only be executed up to (but not including) the
+ // Nth call.
+ function before(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+ }
+
+ return before;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/bind.js b/node_modules/jsonpath/node_modules/underscore/amd/bind.js
new file mode 100644
index 00000000..95d413cf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/bind.js
@@ -0,0 +1,15 @@
+define(['./isFunction', './_executeBound', './restArguments'], function (isFunction, _executeBound, restArguments) {
+
+ // Create a function bound to a given object (assigning `this`, and arguments,
+ // optionally).
+ var bind = restArguments(function(func, context, args) {
+ if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
+ var bound = restArguments(function(callArgs) {
+ return _executeBound(func, bound, context, this, args.concat(callArgs));
+ });
+ return bound;
+ });
+
+ return bind;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/bindAll.js b/node_modules/jsonpath/node_modules/underscore/amd/bindAll.js
new file mode 100644
index 00000000..ff9fe1b4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/bindAll.js
@@ -0,0 +1,19 @@
+define(['./_flatten', './restArguments', './bind'], function (_flatten, restArguments, bind) {
+
+ // Bind a number of an object's methods to that object. Remaining arguments
+ // are the method names to be bound. Useful for ensuring that all callbacks
+ // defined on an object belong to it.
+ var bindAll = restArguments(function(obj, keys) {
+ keys = _flatten(keys, false, false);
+ var index = keys.length;
+ if (index < 1) throw new Error('bindAll must be passed function names');
+ while (index--) {
+ var key = keys[index];
+ obj[key] = bind(obj[key], obj);
+ }
+ return obj;
+ });
+
+ return bindAll;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/chain.js b/node_modules/jsonpath/node_modules/underscore/amd/chain.js
new file mode 100644
index 00000000..ba42101d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/chain.js
@@ -0,0 +1,12 @@
+define(['./underscore'], function (underscore) {
+
+ // Start chaining a wrapped Underscore object.
+ function chain(obj) {
+ var instance = underscore(obj);
+ instance._chain = true;
+ return instance;
+ }
+
+ return chain;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/chunk.js b/node_modules/jsonpath/node_modules/underscore/amd/chunk.js
new file mode 100644
index 00000000..ed4e0865
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/chunk.js
@@ -0,0 +1,17 @@
+define(['./_setup'], function (_setup) {
+
+ // Chunk a single array into multiple arrays, each containing `count` or fewer
+ // items.
+ function chunk(array, count) {
+ if (count == null || count < 1) return [];
+ var result = [];
+ var i = 0, length = array.length;
+ while (i < length) {
+ result.push(_setup.slice.call(array, i, i += count));
+ }
+ return result;
+ }
+
+ return chunk;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/clone.js b/node_modules/jsonpath/node_modules/underscore/amd/clone.js
new file mode 100644
index 00000000..1a196300
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/clone.js
@@ -0,0 +1,11 @@
+define(['./isObject', './isArray', './extend'], function (isObject, isArray, extend) {
+
+ // Create a (shallow-cloned) duplicate of an object.
+ function clone(obj) {
+ if (!isObject(obj)) return obj;
+ return isArray(obj) ? obj.slice() : extend({}, obj);
+ }
+
+ return clone;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/compact.js b/node_modules/jsonpath/node_modules/underscore/amd/compact.js
new file mode 100644
index 00000000..202433b4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/compact.js
@@ -0,0 +1,10 @@
+define(['./filter'], function (filter) {
+
+ // Trim out all falsy values from an array.
+ function compact(array) {
+ return filter(array, Boolean);
+ }
+
+ return compact;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/compose.js b/node_modules/jsonpath/node_modules/underscore/amd/compose.js
new file mode 100644
index 00000000..93d8c36e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/compose.js
@@ -0,0 +1,18 @@
+define(function () {
+
+ // Returns a function that is the composition of a list of functions, each
+ // consuming the return value of the function that follows.
+ function compose() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+ }
+
+ return compose;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/concat.js b/node_modules/jsonpath/node_modules/underscore/amd/concat.js
new file mode 100644
index 00000000..6a475f48
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/concat.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var concat = _unmethodize(_setup.ArrayProto.concat);
+
+ return concat;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/constant.js b/node_modules/jsonpath/node_modules/underscore/amd/constant.js
new file mode 100644
index 00000000..6d3ac2cf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/constant.js
@@ -0,0 +1,12 @@
+define(function () {
+
+ // Predicate-generating function. Often useful outside of Underscore.
+ function constant(value) {
+ return function() {
+ return value;
+ };
+ }
+
+ return constant;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/contains.js b/node_modules/jsonpath/node_modules/underscore/amd/contains.js
new file mode 100644
index 00000000..578b0501
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/contains.js
@@ -0,0 +1,12 @@
+define(['./_isArrayLike', './values', './indexOf'], function (_isArrayLike, values, indexOf) {
+
+ // Determine if the array or object contains a given item (using `===`).
+ function contains(obj, item, fromIndex, guard) {
+ if (!_isArrayLike(obj)) obj = values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return indexOf(obj, item, fromIndex) >= 0;
+ }
+
+ return contains;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/countBy.js b/node_modules/jsonpath/node_modules/underscore/amd/countBy.js
new file mode 100644
index 00000000..8a505de7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/countBy.js
@@ -0,0 +1,12 @@
+define(['./_has', './_group'], function (_has, _group) {
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ var countBy = _group(function(result, value, key) {
+ if (_has(result, key)) result[key]++; else result[key] = 1;
+ });
+
+ return countBy;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/create.js b/node_modules/jsonpath/node_modules/underscore/amd/create.js
new file mode 100644
index 00000000..d5e28136
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/create.js
@@ -0,0 +1,14 @@
+define(['./_baseCreate', './extendOwn'], function (_baseCreate, extendOwn) {
+
+ // Creates an object that inherits from the given prototype object.
+ // If additional properties are provided then they will be added to the
+ // created object.
+ function create(prototype, props) {
+ var result = _baseCreate(prototype);
+ if (props) extendOwn(result, props);
+ return result;
+ }
+
+ return create;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/debounce.js b/node_modules/jsonpath/node_modules/underscore/amd/debounce.js
new file mode 100644
index 00000000..1d88168f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/debounce.js
@@ -0,0 +1,43 @@
+define(['./restArguments', './now'], function (restArguments, now) {
+
+ // When a sequence of calls of the returned function ends, the argument
+ // function is triggered. The end of a sequence is defined by the `wait`
+ // parameter. If `immediate` is passed, the argument function will be
+ // triggered at the beginning of the sequence instead of at the end.
+ function debounce(func, wait, immediate) {
+ var timeout, previous, args, result, context;
+
+ var later = function() {
+ var passed = now() - previous;
+ if (wait > passed) {
+ timeout = setTimeout(later, wait - passed);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ // This check is needed because `func` can recursively invoke `debounced`.
+ if (!timeout) args = context = null;
+ }
+ };
+
+ var debounced = restArguments(function(_args) {
+ context = this;
+ args = _args;
+ previous = now();
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ if (immediate) result = func.apply(context, args);
+ }
+ return result;
+ });
+
+ debounced.cancel = function() {
+ clearTimeout(timeout);
+ timeout = args = context = null;
+ };
+
+ return debounced;
+ }
+
+ return debounce;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/defaults.js b/node_modules/jsonpath/node_modules/underscore/amd/defaults.js
new file mode 100644
index 00000000..6903faac
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/defaults.js
@@ -0,0 +1,8 @@
+define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) {
+
+ // Fill in a given object with default properties.
+ var defaults = _createAssigner(allKeys, true);
+
+ return defaults;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/defer.js b/node_modules/jsonpath/node_modules/underscore/amd/defer.js
new file mode 100644
index 00000000..f0e28eea
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/defer.js
@@ -0,0 +1,9 @@
+define(['./underscore', './partial', './delay'], function (underscore, partial, delay) {
+
+ // Defers a function, scheduling it to run after the current call stack has
+ // cleared.
+ var defer = partial(delay, underscore, 1);
+
+ return defer;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/delay.js b/node_modules/jsonpath/node_modules/underscore/amd/delay.js
new file mode 100644
index 00000000..715d24d7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/delay.js
@@ -0,0 +1,13 @@
+define(['./restArguments'], function (restArguments) {
+
+ // Delays a function for the given number of milliseconds, and then calls
+ // it with the arguments supplied.
+ var delay = restArguments(function(func, wait, args) {
+ return setTimeout(function() {
+ return func.apply(null, args);
+ }, wait);
+ });
+
+ return delay;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/difference.js b/node_modules/jsonpath/node_modules/underscore/amd/difference.js
new file mode 100644
index 00000000..8e4c51ab
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/difference.js
@@ -0,0 +1,14 @@
+define(['./_flatten', './restArguments', './filter', './contains'], function (_flatten, restArguments, filter, contains) {
+
+ // Take the difference between one array and a number of other arrays.
+ // Only the elements present in just the first array will remain.
+ var difference = restArguments(function(array, rest) {
+ rest = _flatten(rest, true, true);
+ return filter(array, function(value){
+ return !contains(rest, value);
+ });
+ });
+
+ return difference;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/each.js b/node_modules/jsonpath/node_modules/underscore/amd/each.js
new file mode 100644
index 00000000..7abead74
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/each.js
@@ -0,0 +1,25 @@
+define(['./keys', './_optimizeCb', './_isArrayLike'], function (keys, _optimizeCb, _isArrayLike) {
+
+ // The cornerstone for collection functions, an `each`
+ // implementation, aka `forEach`.
+ // Handles raw objects in addition to array-likes. Treats all
+ // sparse array-likes as if they were dense.
+ function each(obj, iteratee, context) {
+ iteratee = _optimizeCb(iteratee, context);
+ var i, length;
+ if (_isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var _keys = keys(obj);
+ for (i = 0, length = _keys.length; i < length; i++) {
+ iteratee(obj[_keys[i]], _keys[i], obj);
+ }
+ }
+ return obj;
+ }
+
+ return each;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/escape.js b/node_modules/jsonpath/node_modules/underscore/amd/escape.js
new file mode 100644
index 00000000..6714d122
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/escape.js
@@ -0,0 +1,8 @@
+define(['./_createEscaper', './_escapeMap'], function (_createEscaper, _escapeMap) {
+
+ // Function for escaping strings to HTML interpolation.
+ var _escape = _createEscaper(_escapeMap);
+
+ return _escape;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/every.js b/node_modules/jsonpath/node_modules/underscore/amd/every.js
new file mode 100644
index 00000000..261e1f03
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/every.js
@@ -0,0 +1,17 @@
+define(['./keys', './_cb', './_isArrayLike'], function (keys, _cb, _isArrayLike) {
+
+ // Determine whether all of the elements pass a truth test.
+ function every(obj, predicate, context) {
+ predicate = _cb(predicate, context);
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+ }
+
+ return every;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/extend.js b/node_modules/jsonpath/node_modules/underscore/amd/extend.js
new file mode 100644
index 00000000..35d87616
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/extend.js
@@ -0,0 +1,8 @@
+define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) {
+
+ // Extend a given object with all the properties in passed-in object(s).
+ var extend = _createAssigner(allKeys);
+
+ return extend;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/extendOwn.js b/node_modules/jsonpath/node_modules/underscore/amd/extendOwn.js
new file mode 100644
index 00000000..2e1e4b5d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/extendOwn.js
@@ -0,0 +1,10 @@
+define(['./_createAssigner', './keys'], function (_createAssigner, keys) {
+
+ // Assigns a given object with all the own properties in the passed-in
+ // object(s).
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ var extendOwn = _createAssigner(keys);
+
+ return extendOwn;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/filter.js b/node_modules/jsonpath/node_modules/underscore/amd/filter.js
new file mode 100644
index 00000000..a7675687
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/filter.js
@@ -0,0 +1,15 @@
+define(['./_cb', './each'], function (_cb, each) {
+
+ // Return all the elements that pass a truth test.
+ function filter(obj, predicate, context) {
+ var results = [];
+ predicate = _cb(predicate, context);
+ each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+ }
+
+ return filter;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/find.js b/node_modules/jsonpath/node_modules/underscore/amd/find.js
new file mode 100644
index 00000000..586518d0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/find.js
@@ -0,0 +1,12 @@
+define(['./_isArrayLike', './findIndex', './findKey'], function (_isArrayLike, findIndex, findKey) {
+
+ // Return the first value which passes a truth test.
+ function find(obj, predicate, context) {
+ var keyFinder = _isArrayLike(obj) ? findIndex : findKey;
+ var key = keyFinder(obj, predicate, context);
+ if (key !== void 0 && key !== -1) return obj[key];
+ }
+
+ return find;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/findIndex.js b/node_modules/jsonpath/node_modules/underscore/amd/findIndex.js
new file mode 100644
index 00000000..90d4cf3f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/findIndex.js
@@ -0,0 +1,8 @@
+define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) {
+
+ // Returns the first index on an array-like that passes a truth test.
+ var findIndex = _createPredicateIndexFinder(1);
+
+ return findIndex;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/findKey.js b/node_modules/jsonpath/node_modules/underscore/amd/findKey.js
new file mode 100644
index 00000000..38446c10
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/findKey.js
@@ -0,0 +1,15 @@
+define(['./keys', './_cb'], function (keys, _cb) {
+
+ // Returns the first key on an object that passes a truth test.
+ function findKey(obj, predicate, context) {
+ predicate = _cb(predicate, context);
+ var _keys = keys(obj), key;
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ key = _keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+ }
+
+ return findKey;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/findLastIndex.js b/node_modules/jsonpath/node_modules/underscore/amd/findLastIndex.js
new file mode 100644
index 00000000..f3e78a06
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/findLastIndex.js
@@ -0,0 +1,8 @@
+define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) {
+
+ // Returns the last index on an array-like that passes a truth test.
+ var findLastIndex = _createPredicateIndexFinder(-1);
+
+ return findLastIndex;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/findWhere.js b/node_modules/jsonpath/node_modules/underscore/amd/findWhere.js
new file mode 100644
index 00000000..d0fbba0e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/findWhere.js
@@ -0,0 +1,11 @@
+define(['./matcher', './find'], function (matcher, find) {
+
+ // Convenience version of a common use case of `_.find`: getting the first
+ // object containing specific `key:value` pairs.
+ function findWhere(obj, attrs) {
+ return find(obj, matcher(attrs));
+ }
+
+ return findWhere;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/first.js b/node_modules/jsonpath/node_modules/underscore/amd/first.js
new file mode 100644
index 00000000..96c5a56a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/first.js
@@ -0,0 +1,13 @@
+define(['./initial'], function (initial) {
+
+ // Get the first element of an array. Passing **n** will return the first N
+ // values in the array. The **guard** check allows it to work with `_.map`.
+ function first(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[0];
+ return initial(array, array.length - n);
+ }
+
+ return first;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/flatten.js b/node_modules/jsonpath/node_modules/underscore/amd/flatten.js
new file mode 100644
index 00000000..7d2891aa
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/flatten.js
@@ -0,0 +1,11 @@
+define(['./_flatten'], function (_flatten) {
+
+ // Flatten out an array, either recursively (by default), or up to `depth`.
+ // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+ function flatten(array, depth) {
+ return _flatten(array, depth, false);
+ }
+
+ return flatten;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/functions.js b/node_modules/jsonpath/node_modules/underscore/amd/functions.js
new file mode 100644
index 00000000..b929883b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/functions.js
@@ -0,0 +1,14 @@
+define(['./isFunction'], function (isFunction) {
+
+ // Return a sorted list of the function names available on the object.
+ function functions(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+ }
+
+ return functions;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/get.js b/node_modules/jsonpath/node_modules/underscore/amd/get.js
new file mode 100644
index 00000000..21f16c9f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/get.js
@@ -0,0 +1,14 @@
+define(['./_deepGet', './_toPath', './isUndefined'], function (_deepGet, _toPath, isUndefined) {
+
+ // Get the value of the (deep) property on `path` from `object`.
+ // If any property in `path` does not exist or if the value is
+ // `undefined`, return `defaultValue` instead.
+ // The `path` is normalized through `_.toPath`.
+ function get(object, path, defaultValue) {
+ var value = _deepGet(object, _toPath(path));
+ return isUndefined(value) ? defaultValue : value;
+ }
+
+ return get;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/groupBy.js b/node_modules/jsonpath/node_modules/underscore/amd/groupBy.js
new file mode 100644
index 00000000..6c3c1bd3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/groupBy.js
@@ -0,0 +1,11 @@
+define(['./_has', './_group'], function (_has, _group) {
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ var groupBy = _group(function(result, value, key) {
+ if (_has(result, key)) result[key].push(value); else result[key] = [value];
+ });
+
+ return groupBy;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/has.js b/node_modules/jsonpath/node_modules/underscore/amd/has.js
new file mode 100644
index 00000000..a81ec08f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/has.js
@@ -0,0 +1,19 @@
+define(['./_has', './_toPath'], function (_has, _toPath) {
+
+ // Shortcut function for checking if an object has a given property directly on
+ // itself (in other words, not on a prototype). Unlike the internal `has`
+ // function, this public version can also traverse nested properties.
+ function has(obj, path) {
+ path = _toPath(path);
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ var key = path[i];
+ if (!_has(obj, key)) return false;
+ obj = obj[key];
+ }
+ return !!length;
+ }
+
+ return has;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/identity.js b/node_modules/jsonpath/node_modules/underscore/amd/identity.js
new file mode 100644
index 00000000..fee04583
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/identity.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // Keep the identity function around for default iteratees.
+ function identity(value) {
+ return value;
+ }
+
+ return identity;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/index-default.js b/node_modules/jsonpath/node_modules/underscore/amd/index-default.js
new file mode 100644
index 00000000..b53cfd9b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/index-default.js
@@ -0,0 +1,12 @@
+define(['./mixin', './index'], function (mixin, index) {
+
+ // Default Export
+
+ // Add all of the Underscore functions to the wrapper object.
+ var _ = mixin(index);
+ // Legacy Node.js API.
+ _._ = _;
+
+ return _;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/index.js b/node_modules/jsonpath/node_modules/underscore/amd/index.js
new file mode 100644
index 00000000..81df6f56
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/index.js
@@ -0,0 +1,154 @@
+define(['exports', './isObject', './_setup', './identity', './isFunction', './isArray', './keys', './extendOwn', './isMatch', './matcher', './toPath', './property', './iteratee', './isNumber', './isNaN', './isArguments', './each', './allKeys', './invert', './after', './before', './restArguments', './bind', './bindAll', './chain', './chunk', './extend', './clone', './filter', './compact', './compose', './constant', './values', './sortedIndex', './findIndex', './indexOf', './contains', './countBy', './create', './now', './debounce', './defaults', './partial', './delay', './defer', './difference', './escape', './every', './findKey', './find', './findLastIndex', './findWhere', './initial', './first', './flatten', './functions', './isUndefined', './get', './groupBy', './has', './isNull', './isBoolean', './isElement', './isString', './isDate', './isRegExp', './isError', './isSymbol', './isArrayBuffer', './isDataView', './isFinite', './isTypedArray', './isEmpty', './isEqual', './isMap', './isWeakMap', './isSet', './isWeakSet', './pairs', './tap', './mapObject', './noop', './propertyOf', './times', './random', './unescape', './templateSettings', './template', './result', './uniqueId', './memoize', './throttle', './wrap', './negate', './once', './lastIndexOf', './map', './reduce', './reduceRight', './reject', './some', './invoke', './pluck', './where', './max', './min', './sample', './shuffle', './sortBy', './indexBy', './partition', './toArray', './size', './pick', './omit', './rest', './last', './without', './uniq', './union', './intersection', './unzip', './zip', './object', './range', './mixin', './underscore-array-methods'], function (exports, isObject, _setup, identity, isFunction, isArray, keys, extendOwn, isMatch, matcher, toPath$1, property, iteratee, isNumber, _isNaN, isArguments, each, allKeys, invert, after, before, restArguments, bind, bindAll, chain, chunk, extend, clone, filter, compact, compose, constant, values, sortedIndex, findIndex, indexOf, contains, countBy, create, now, debounce, defaults, partial, delay, defer, difference, _escape, every, findKey, find, findLastIndex, findWhere, initial, first, flatten, functions, isUndefined, get, groupBy, has, isNull, isBoolean, isElement, isString, isDate, isRegExp, isError, isSymbol, isArrayBuffer, isDataView, _isFinite, isTypedArray, isEmpty, isEqual, isMap, isWeakMap, isSet, isWeakSet, pairs, tap, mapObject, noop, propertyOf, times, random, _unescape, templateSettings, template, result, uniqueId, memoize, throttle, wrap, negate, once, lastIndexOf, map, reduce, reduceRight, reject, some, invoke, pluck, where, max, min, sample, shuffle, sortBy, indexBy, partition, toArray, size, pick, omit, rest, last, without, uniq, union, intersection, unzip, zip, object, range, mixin, underscoreArrayMethods) {
+
+ // Named Exports
+
+ exports.isObject = isObject;
+ exports.VERSION = _setup.VERSION;
+ exports.identity = identity;
+ exports.isFunction = isFunction;
+ exports.isArray = isArray;
+ exports.keys = keys;
+ exports.assign = extendOwn;
+ exports.extendOwn = extendOwn;
+ exports.isMatch = isMatch;
+ exports.matcher = matcher;
+ exports.matches = matcher;
+ exports.toPath = toPath$1;
+ exports.property = property;
+ exports.iteratee = iteratee;
+ exports.isNumber = isNumber;
+ exports.isNaN = _isNaN;
+ exports.isArguments = isArguments;
+ exports.each = each;
+ exports.forEach = each;
+ exports.allKeys = allKeys;
+ exports.invert = invert;
+ exports.after = after;
+ exports.before = before;
+ exports.restArguments = restArguments;
+ exports.bind = bind;
+ exports.bindAll = bindAll;
+ exports.chain = chain;
+ exports.chunk = chunk;
+ exports.extend = extend;
+ exports.clone = clone;
+ exports.filter = filter;
+ exports.select = filter;
+ exports.compact = compact;
+ exports.compose = compose;
+ exports.constant = constant;
+ exports.values = values;
+ exports.sortedIndex = sortedIndex;
+ exports.findIndex = findIndex;
+ exports.indexOf = indexOf;
+ exports.contains = contains;
+ exports.include = contains;
+ exports.includes = contains;
+ exports.countBy = countBy;
+ exports.create = create;
+ exports.now = now;
+ exports.debounce = debounce;
+ exports.defaults = defaults;
+ exports.partial = partial;
+ exports.delay = delay;
+ exports.defer = defer;
+ exports.difference = difference;
+ exports.escape = _escape;
+ exports.all = every;
+ exports.every = every;
+ exports.findKey = findKey;
+ exports.detect = find;
+ exports.find = find;
+ exports.findLastIndex = findLastIndex;
+ exports.findWhere = findWhere;
+ exports.initial = initial;
+ exports.first = first;
+ exports.head = first;
+ exports.take = first;
+ exports.flatten = flatten;
+ exports.functions = functions;
+ exports.methods = functions;
+ exports.isUndefined = isUndefined;
+ exports.get = get;
+ exports.groupBy = groupBy;
+ exports.has = has;
+ exports.isNull = isNull;
+ exports.isBoolean = isBoolean;
+ exports.isElement = isElement;
+ exports.isString = isString;
+ exports.isDate = isDate;
+ exports.isRegExp = isRegExp;
+ exports.isError = isError;
+ exports.isSymbol = isSymbol;
+ exports.isArrayBuffer = isArrayBuffer;
+ exports.isDataView = isDataView;
+ exports.isFinite = _isFinite;
+ exports.isTypedArray = isTypedArray;
+ exports.isEmpty = isEmpty;
+ exports.isEqual = isEqual;
+ exports.isMap = isMap;
+ exports.isWeakMap = isWeakMap;
+ exports.isSet = isSet;
+ exports.isWeakSet = isWeakSet;
+ exports.pairs = pairs;
+ exports.tap = tap;
+ exports.mapObject = mapObject;
+ exports.noop = noop;
+ exports.propertyOf = propertyOf;
+ exports.times = times;
+ exports.random = random;
+ exports.unescape = _unescape;
+ exports.templateSettings = templateSettings;
+ exports.template = template;
+ exports.result = result;
+ exports.uniqueId = uniqueId;
+ exports.memoize = memoize;
+ exports.throttle = throttle;
+ exports.wrap = wrap;
+ exports.negate = negate;
+ exports.once = once;
+ exports.lastIndexOf = lastIndexOf;
+ exports.collect = map;
+ exports.map = map;
+ exports.foldl = reduce;
+ exports.inject = reduce;
+ exports.reduce = reduce;
+ exports.foldr = reduceRight;
+ exports.reduceRight = reduceRight;
+ exports.reject = reject;
+ exports.any = some;
+ exports.some = some;
+ exports.invoke = invoke;
+ exports.pluck = pluck;
+ exports.where = where;
+ exports.max = max;
+ exports.min = min;
+ exports.sample = sample;
+ exports.shuffle = shuffle;
+ exports.sortBy = sortBy;
+ exports.indexBy = indexBy;
+ exports.partition = partition;
+ exports.toArray = toArray;
+ exports.size = size;
+ exports.pick = pick;
+ exports.omit = omit;
+ exports.drop = rest;
+ exports.rest = rest;
+ exports.tail = rest;
+ exports.last = last;
+ exports.without = without;
+ exports.uniq = uniq;
+ exports.unique = uniq;
+ exports.union = union;
+ exports.intersection = intersection;
+ exports.transpose = unzip;
+ exports.unzip = unzip;
+ exports.zip = zip;
+ exports.object = object;
+ exports.range = range;
+ exports.mixin = mixin;
+ exports.default = underscoreArrayMethods;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/indexBy.js b/node_modules/jsonpath/node_modules/underscore/amd/indexBy.js
new file mode 100644
index 00000000..dacc792a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/indexBy.js
@@ -0,0 +1,11 @@
+define(['./_group'], function (_group) {
+
+ // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+ // when you know that your index values will be unique.
+ var indexBy = _group(function(result, value, key) {
+ result[key] = value;
+ });
+
+ return indexBy;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/indexOf.js b/node_modules/jsonpath/node_modules/underscore/amd/indexOf.js
new file mode 100644
index 00000000..6941d600
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/indexOf.js
@@ -0,0 +1,11 @@
+define(['./_createIndexFinder', './sortedIndex', './findIndex'], function (_createIndexFinder, sortedIndex, findIndex) {
+
+ // Return the position of the first occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ var indexOf = _createIndexFinder(1, findIndex, sortedIndex);
+
+ return indexOf;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/initial.js b/node_modules/jsonpath/node_modules/underscore/amd/initial.js
new file mode 100644
index 00000000..ca73c1a4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/initial.js
@@ -0,0 +1,12 @@
+define(['./_setup'], function (_setup) {
+
+ // Returns everything but the last entry of the array. Especially useful on
+ // the arguments object. Passing **n** will return all the values in
+ // the array, excluding the last N.
+ function initial(array, n, guard) {
+ return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+ }
+
+ return initial;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/intersection.js b/node_modules/jsonpath/node_modules/underscore/amd/intersection.js
new file mode 100644
index 00000000..8592d750
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/intersection.js
@@ -0,0 +1,22 @@
+define(['./_getLength', './contains'], function (_getLength, contains) {
+
+ // Produce an array that contains every item shared between all the
+ // passed-in arrays.
+ function intersection(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = _getLength(array); i < length; i++) {
+ var item = array[i];
+ if (contains(result, item)) continue;
+ var j;
+ for (j = 1; j < argsLength; j++) {
+ if (!contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+ }
+
+ return intersection;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/invert.js b/node_modules/jsonpath/node_modules/underscore/amd/invert.js
new file mode 100644
index 00000000..446b8cb7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/invert.js
@@ -0,0 +1,15 @@
+define(['./keys'], function (keys) {
+
+ // Invert the keys and values of an object. The values must be serializable.
+ function invert(obj) {
+ var result = {};
+ var _keys = keys(obj);
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ result[obj[_keys[i]]] = _keys[i];
+ }
+ return result;
+ }
+
+ return invert;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/invoke.js b/node_modules/jsonpath/node_modules/underscore/amd/invoke.js
new file mode 100644
index 00000000..236dbc5e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/invoke.js
@@ -0,0 +1,28 @@
+define(['./isFunction', './_deepGet', './_toPath', './restArguments', './map'], function (isFunction, _deepGet, _toPath, restArguments, map) {
+
+ // Invoke a method (with arguments) on every item in a collection.
+ var invoke = restArguments(function(obj, path, args) {
+ var contextPath, func;
+ if (isFunction(path)) {
+ func = path;
+ } else {
+ path = _toPath(path);
+ contextPath = path.slice(0, -1);
+ path = path[path.length - 1];
+ }
+ return map(obj, function(context) {
+ var method = func;
+ if (!method) {
+ if (contextPath && contextPath.length) {
+ context = _deepGet(context, contextPath);
+ }
+ if (context == null) return void 0;
+ method = context[path];
+ }
+ return method == null ? method : method.apply(context, args);
+ });
+ });
+
+ return invoke;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isArguments.js b/node_modules/jsonpath/node_modules/underscore/amd/isArguments.js
new file mode 100644
index 00000000..c4448f4d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isArguments.js
@@ -0,0 +1,19 @@
+define(['./_tagTester', './_has'], function (_tagTester, _has) {
+
+ var isArguments = _tagTester('Arguments');
+
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
+ // there isn't any inspectable "Arguments" type.
+ (function() {
+ if (!isArguments(arguments)) {
+ isArguments = function(obj) {
+ return _has(obj, 'callee');
+ };
+ }
+ }());
+
+ var isArguments$1 = isArguments;
+
+ return isArguments$1;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isArray.js b/node_modules/jsonpath/node_modules/underscore/amd/isArray.js
new file mode 100644
index 00000000..ef305850
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isArray.js
@@ -0,0 +1,9 @@
+define(['./_setup', './_tagTester'], function (_setup, _tagTester) {
+
+ // Is a given value an array?
+ // Delegates to ECMA5's native `Array.isArray`.
+ var isArray = _setup.nativeIsArray || _tagTester('Array');
+
+ return isArray;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isArrayBuffer.js b/node_modules/jsonpath/node_modules/underscore/amd/isArrayBuffer.js
new file mode 100644
index 00000000..e739aa89
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isArrayBuffer.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isArrayBuffer = _tagTester('ArrayBuffer');
+
+ return isArrayBuffer;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isBoolean.js b/node_modules/jsonpath/node_modules/underscore/amd/isBoolean.js
new file mode 100644
index 00000000..e3f1d8b1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isBoolean.js
@@ -0,0 +1,10 @@
+define(['./_setup'], function (_setup) {
+
+ // Is a given value a boolean?
+ function isBoolean(obj) {
+ return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]';
+ }
+
+ return isBoolean;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isDataView.js b/node_modules/jsonpath/node_modules/underscore/amd/isDataView.js
new file mode 100644
index 00000000..3f7e985b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isDataView.js
@@ -0,0 +1,15 @@
+define(['./_tagTester', './isFunction', './_stringTagBug', './isArrayBuffer'], function (_tagTester, isFunction, _stringTagBug, isArrayBuffer) {
+
+ var isDataView = _tagTester('DataView');
+
+ // In IE 10 - Edge 13, we need a different heuristic
+ // to determine whether an object is a `DataView`.
+ function ie10IsDataView(obj) {
+ return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);
+ }
+
+ var isDataView$1 = (_stringTagBug.hasStringTagBug ? ie10IsDataView : isDataView);
+
+ return isDataView$1;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isDate.js b/node_modules/jsonpath/node_modules/underscore/amd/isDate.js
new file mode 100644
index 00000000..8a84bcde
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isDate.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isDate = _tagTester('Date');
+
+ return isDate;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isElement.js b/node_modules/jsonpath/node_modules/underscore/amd/isElement.js
new file mode 100644
index 00000000..f1812e1e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isElement.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // Is a given value a DOM element?
+ function isElement(obj) {
+ return !!(obj && obj.nodeType === 1);
+ }
+
+ return isElement;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isEmpty.js b/node_modules/jsonpath/node_modules/underscore/amd/isEmpty.js
new file mode 100644
index 00000000..dac18d45
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isEmpty.js
@@ -0,0 +1,18 @@
+define(['./isArray', './keys', './_getLength', './isArguments', './isString'], function (isArray, keys, _getLength, isArguments, isString) {
+
+ // Is a given array, string, or object empty?
+ // An "empty" object has no enumerable own-properties.
+ function isEmpty(obj) {
+ if (obj == null) return true;
+ // Skip the more expensive `toString`-based type checks if `obj` has no
+ // `.length`.
+ var length = _getLength(obj);
+ if (typeof length == 'number' && (
+ isArray(obj) || isString(obj) || isArguments(obj)
+ )) return length === 0;
+ return _getLength(keys(obj)) === 0;
+ }
+
+ return isEmpty;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isEqual.js b/node_modules/jsonpath/node_modules/underscore/amd/isEqual.js
new file mode 100644
index 00000000..c802d6bf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isEqual.js
@@ -0,0 +1,133 @@
+define(['./_setup', './isFunction', './_has', './keys', './underscore', './_getByteLength', './_stringTagBug', './_toBufferView', './isDataView', './isTypedArray'], function (_setup, isFunction, _has, keys, underscore, _getByteLength, _stringTagBug, _toBufferView, isDataView, isTypedArray) {
+
+ // We use this string twice, so give it a name for minification.
+ var tagDataView = '[object DataView]';
+
+ // Internal recursive comparison function for `_.isEqual`.
+ function eq(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // `null` or `undefined` only equal to itself (strict comparison).
+ if (a == null || b == null) return false;
+ // `NaN`s are equivalent, but non-reflexive.
+ if (a !== a) return b !== b;
+ // Exhaust primitive checks
+ var type = typeof a;
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+ return deepEq(a, b, aStack, bStack);
+ }
+
+ // Internal recursive comparison function for `_.isEqual`.
+ function deepEq(a, b, aStack, bStack) {
+ // Unwrap any wrapped objects.
+ if (a instanceof underscore) a = a._wrapped;
+ if (b instanceof underscore) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = _setup.toString.call(a);
+ if (className !== _setup.toString.call(b)) return false;
+ // Work around a bug in IE 10 - Edge 13.
+ if (_stringTagBug.hasStringTagBug && className == '[object Object]' && isDataView(a)) {
+ if (!isDataView(b)) return false;
+ className = tagDataView;
+ }
+ switch (className) {
+ // These types are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN.
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ case '[object Symbol]':
+ return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b);
+ case '[object ArrayBuffer]':
+ case tagDataView:
+ // Coerce to typed array so we can fall through.
+ return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack);
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays && isTypedArray(a)) {
+ var byteLength = _getByteLength(a);
+ if (byteLength !== _getByteLength(b)) return false;
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+ areArrays = true;
+ }
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
+ isFunction(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var _keys = keys(a), key;
+ length = _keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = _keys[length];
+ if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+ }
+
+ // Perform a deep comparison to check if two objects are equal.
+ function isEqual(a, b) {
+ return eq(a, b);
+ }
+
+ return isEqual;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isError.js b/node_modules/jsonpath/node_modules/underscore/amd/isError.js
new file mode 100644
index 00000000..dd349a82
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isError.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isError = _tagTester('Error');
+
+ return isError;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isFinite.js b/node_modules/jsonpath/node_modules/underscore/amd/isFinite.js
new file mode 100644
index 00000000..b2a8d182
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isFinite.js
@@ -0,0 +1,10 @@
+define(['./_setup', './isSymbol'], function (_setup, isSymbol) {
+
+ // Is a given object a finite number?
+ function isFinite(obj) {
+ return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj));
+ }
+
+ return isFinite;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isFunction.js b/node_modules/jsonpath/node_modules/underscore/amd/isFunction.js
new file mode 100644
index 00000000..894effb6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isFunction.js
@@ -0,0 +1,18 @@
+define(['./_setup', './_tagTester'], function (_setup, _tagTester) {
+
+ var isFunction = _tagTester('Function');
+
+ // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+ // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+ var nodelist = _setup.root.document && _setup.root.document.childNodes;
+ if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+ isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+ }
+
+ var isFunction$1 = isFunction;
+
+ return isFunction$1;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isMap.js b/node_modules/jsonpath/node_modules/underscore/amd/isMap.js
new file mode 100644
index 00000000..6db6962a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isMap.js
@@ -0,0 +1,7 @@
+define(['./_tagTester', './_methodFingerprint', './_stringTagBug'], function (_tagTester, _methodFingerprint, _stringTagBug) {
+
+ var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map');
+
+ return isMap;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isMatch.js b/node_modules/jsonpath/node_modules/underscore/amd/isMatch.js
new file mode 100644
index 00000000..c3864783
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isMatch.js
@@ -0,0 +1,17 @@
+define(['./keys'], function (keys) {
+
+ // Returns whether an object has a given set of `key:value` pairs.
+ function isMatch(object, attrs) {
+ var _keys = keys(attrs), length = _keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = _keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+ }
+
+ return isMatch;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isNaN.js b/node_modules/jsonpath/node_modules/underscore/amd/isNaN.js
new file mode 100644
index 00000000..01bf22de
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isNaN.js
@@ -0,0 +1,10 @@
+define(['./_setup', './isNumber'], function (_setup, isNumber) {
+
+ // Is the given value `NaN`?
+ function isNaN(obj) {
+ return isNumber(obj) && _setup._isNaN(obj);
+ }
+
+ return isNaN;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isNull.js b/node_modules/jsonpath/node_modules/underscore/amd/isNull.js
new file mode 100644
index 00000000..c8b7bc60
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isNull.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // Is a given value equal to null?
+ function isNull(obj) {
+ return obj === null;
+ }
+
+ return isNull;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isNumber.js b/node_modules/jsonpath/node_modules/underscore/amd/isNumber.js
new file mode 100644
index 00000000..a5d0152c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isNumber.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isNumber = _tagTester('Number');
+
+ return isNumber;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isObject.js b/node_modules/jsonpath/node_modules/underscore/amd/isObject.js
new file mode 100644
index 00000000..0bed42c3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isObject.js
@@ -0,0 +1,11 @@
+define(function () {
+
+ // Is a given variable an object?
+ function isObject(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ }
+
+ return isObject;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isRegExp.js b/node_modules/jsonpath/node_modules/underscore/amd/isRegExp.js
new file mode 100644
index 00000000..b1d5adeb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isRegExp.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isRegExp = _tagTester('RegExp');
+
+ return isRegExp;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isSet.js b/node_modules/jsonpath/node_modules/underscore/amd/isSet.js
new file mode 100644
index 00000000..ce51786c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isSet.js
@@ -0,0 +1,7 @@
+define(['./_tagTester', './_methodFingerprint', './_stringTagBug'], function (_tagTester, _methodFingerprint, _stringTagBug) {
+
+ var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set');
+
+ return isSet;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isString.js b/node_modules/jsonpath/node_modules/underscore/amd/isString.js
new file mode 100644
index 00000000..dd8d9e2f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isString.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isString = _tagTester('String');
+
+ return isString;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isSymbol.js b/node_modules/jsonpath/node_modules/underscore/amd/isSymbol.js
new file mode 100644
index 00000000..b2ebc620
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isSymbol.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isSymbol = _tagTester('Symbol');
+
+ return isSymbol;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isTypedArray.js b/node_modules/jsonpath/node_modules/underscore/amd/isTypedArray.js
new file mode 100644
index 00000000..83da9a25
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isTypedArray.js
@@ -0,0 +1,16 @@
+define(['./_setup', './_isBufferLike', './constant', './isDataView'], function (_setup, _isBufferLike, constant, isDataView) {
+
+ // Is a given value a typed array?
+ var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+ function isTypedArray(obj) {
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+ // Otherwise, fall back on the above regular expression.
+ return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) :
+ _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj));
+ }
+
+ var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false);
+
+ return isTypedArray$1;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isUndefined.js b/node_modules/jsonpath/node_modules/underscore/amd/isUndefined.js
new file mode 100644
index 00000000..2372b0cf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isUndefined.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // Is a given variable undefined?
+ function isUndefined(obj) {
+ return obj === void 0;
+ }
+
+ return isUndefined;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isWeakMap.js b/node_modules/jsonpath/node_modules/underscore/amd/isWeakMap.js
new file mode 100644
index 00000000..4196e2df
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isWeakMap.js
@@ -0,0 +1,7 @@
+define(['./_tagTester', './_methodFingerprint', './_stringTagBug'], function (_tagTester, _methodFingerprint, _stringTagBug) {
+
+ var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap');
+
+ return isWeakMap;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/isWeakSet.js b/node_modules/jsonpath/node_modules/underscore/amd/isWeakSet.js
new file mode 100644
index 00000000..a7258525
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/isWeakSet.js
@@ -0,0 +1,7 @@
+define(['./_tagTester'], function (_tagTester) {
+
+ var isWeakSet = _tagTester('WeakSet');
+
+ return isWeakSet;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/iteratee.js b/node_modules/jsonpath/node_modules/underscore/amd/iteratee.js
new file mode 100644
index 00000000..52a1d6f7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/iteratee.js
@@ -0,0 +1,13 @@
+define(['./underscore', './_baseIteratee'], function (underscore, _baseIteratee) {
+
+ // External wrapper for our callback generator. Users may customize
+ // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+ // This abstraction hides the internal-only `argCount` argument.
+ function iteratee(value, context) {
+ return _baseIteratee(value, context, Infinity);
+ }
+ underscore.iteratee = iteratee;
+
+ return iteratee;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/join.js b/node_modules/jsonpath/node_modules/underscore/amd/join.js
new file mode 100644
index 00000000..4c06c826
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/join.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var join = _unmethodize(_setup.ArrayProto.join);
+
+ return join;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/keys.js b/node_modules/jsonpath/node_modules/underscore/amd/keys.js
new file mode 100644
index 00000000..6db6bf4c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/keys.js
@@ -0,0 +1,17 @@
+define(['./isObject', './_setup', './_has', './_collectNonEnumProps'], function (isObject, _setup, _has, _collectNonEnumProps) {
+
+ // Retrieve the names of an object's own properties.
+ // Delegates to **ECMAScript 5**'s native `Object.keys`.
+ function keys(obj) {
+ if (!isObject(obj)) return [];
+ if (_setup.nativeKeys) return _setup.nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (_has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
+ return keys;
+ }
+
+ return keys;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/last.js b/node_modules/jsonpath/node_modules/underscore/amd/last.js
new file mode 100644
index 00000000..dfe3df2e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/last.js
@@ -0,0 +1,13 @@
+define(['./rest'], function (rest) {
+
+ // Get the last element of an array. Passing **n** will return the last N
+ // values in the array.
+ function last(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[array.length - 1];
+ return rest(array, Math.max(0, array.length - n));
+ }
+
+ return last;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/lastIndexOf.js b/node_modules/jsonpath/node_modules/underscore/amd/lastIndexOf.js
new file mode 100644
index 00000000..236d739a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/lastIndexOf.js
@@ -0,0 +1,9 @@
+define(['./_createIndexFinder', './findLastIndex'], function (_createIndexFinder, findLastIndex) {
+
+ // Return the position of the last occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ var lastIndexOf = _createIndexFinder(-1, findLastIndex);
+
+ return lastIndexOf;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/map.js b/node_modules/jsonpath/node_modules/underscore/amd/map.js
new file mode 100644
index 00000000..b759bf8d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/map.js
@@ -0,0 +1,18 @@
+define(['./keys', './_cb', './_isArrayLike'], function (keys, _cb, _isArrayLike) {
+
+ // Return the results of applying the iteratee to each element.
+ function map(obj, iteratee, context) {
+ iteratee = _cb(iteratee, context);
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ }
+
+ return map;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/mapObject.js b/node_modules/jsonpath/node_modules/underscore/amd/mapObject.js
new file mode 100644
index 00000000..b9ddb216
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/mapObject.js
@@ -0,0 +1,19 @@
+define(['./keys', './_cb'], function (keys, _cb) {
+
+ // Returns the results of applying the `iteratee` to each element of `obj`.
+ // In contrast to `_.map` it returns an object.
+ function mapObject(obj, iteratee, context) {
+ iteratee = _cb(iteratee, context);
+ var _keys = keys(obj),
+ length = _keys.length,
+ results = {};
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ }
+
+ return mapObject;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/matcher.js b/node_modules/jsonpath/node_modules/underscore/amd/matcher.js
new file mode 100644
index 00000000..e5c85789
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/matcher.js
@@ -0,0 +1,14 @@
+define(['./extendOwn', './isMatch'], function (extendOwn, isMatch) {
+
+ // Returns a predicate for checking whether an object has a given set of
+ // `key:value` pairs.
+ function matcher(attrs) {
+ attrs = extendOwn({}, attrs);
+ return function(obj) {
+ return isMatch(obj, attrs);
+ };
+ }
+
+ return matcher;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/max.js b/node_modules/jsonpath/node_modules/underscore/amd/max.js
new file mode 100644
index 00000000..6a77e86b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/max.js
@@ -0,0 +1,30 @@
+define(['./_cb', './_isArrayLike', './each', './values'], function (_cb, _isArrayLike, each, values) {
+
+ // Return the maximum element (or element-based computation).
+ function max(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = _isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = _cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ }
+
+ return max;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/memoize.js b/node_modules/jsonpath/node_modules/underscore/amd/memoize.js
new file mode 100644
index 00000000..ae3d473a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/memoize.js
@@ -0,0 +1,17 @@
+define(['./_has'], function (_has) {
+
+ // Memoize an expensive function by storing its results.
+ function memoize(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!_has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+ }
+
+ return memoize;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/min.js b/node_modules/jsonpath/node_modules/underscore/amd/min.js
new file mode 100644
index 00000000..5c2673b9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/min.js
@@ -0,0 +1,30 @@
+define(['./_cb', './_isArrayLike', './each', './values'], function (_cb, _isArrayLike, each, values) {
+
+ // Return the minimum element (or element-based computation).
+ function min(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = _isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = _cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ }
+
+ return min;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/mixin.js b/node_modules/jsonpath/node_modules/underscore/amd/mixin.js
new file mode 100644
index 00000000..54ecd821
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/mixin.js
@@ -0,0 +1,18 @@
+define(['./_setup', './underscore', './_chainResult', './each', './functions'], function (_setup, underscore, _chainResult, each, functions) {
+
+ // Add your own custom functions to the Underscore object.
+ function mixin(obj) {
+ each(functions(obj), function(name) {
+ var func = underscore[name] = obj[name];
+ underscore.prototype[name] = function() {
+ var args = [this._wrapped];
+ _setup.push.apply(args, arguments);
+ return _chainResult(this, func.apply(underscore, args));
+ };
+ });
+ return underscore;
+ }
+
+ return mixin;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/negate.js b/node_modules/jsonpath/node_modules/underscore/amd/negate.js
new file mode 100644
index 00000000..420113d3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/negate.js
@@ -0,0 +1,12 @@
+define(function () {
+
+ // Returns a negated version of the passed-in predicate.
+ function negate(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+ }
+
+ return negate;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/noop.js b/node_modules/jsonpath/node_modules/underscore/amd/noop.js
new file mode 100644
index 00000000..df96fc52
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/noop.js
@@ -0,0 +1,8 @@
+define(function () {
+
+ // Predicate-generating function. Often useful outside of Underscore.
+ function noop(){}
+
+ return noop;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/now.js b/node_modules/jsonpath/node_modules/underscore/amd/now.js
new file mode 100644
index 00000000..a59807a5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/now.js
@@ -0,0 +1,10 @@
+define(function () {
+
+ // A (possibly faster) way to get the current timestamp as an integer.
+ var now = Date.now || function() {
+ return new Date().getTime();
+ };
+
+ return now;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/object.js b/node_modules/jsonpath/node_modules/underscore/amd/object.js
new file mode 100644
index 00000000..02862521
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/object.js
@@ -0,0 +1,20 @@
+define(['./_getLength'], function (_getLength) {
+
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+ function object(list, values) {
+ var result = {};
+ for (var i = 0, length = _getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ }
+
+ return object;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/omit.js b/node_modules/jsonpath/node_modules/underscore/amd/omit.js
new file mode 100644
index 00000000..4d040251
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/omit.js
@@ -0,0 +1,20 @@
+define(['./isFunction', './_flatten', './restArguments', './contains', './negate', './map', './pick'], function (isFunction, _flatten, restArguments, contains, negate, map, pick) {
+
+ // Return a copy of the object without the disallowed properties.
+ var omit = restArguments(function(obj, keys) {
+ var iteratee = keys[0], context;
+ if (isFunction(iteratee)) {
+ iteratee = negate(iteratee);
+ if (keys.length > 1) context = keys[1];
+ } else {
+ keys = map(_flatten(keys, false, false), String);
+ iteratee = function(value, key) {
+ return !contains(keys, key);
+ };
+ }
+ return pick(obj, iteratee, context);
+ });
+
+ return omit;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/once.js b/node_modules/jsonpath/node_modules/underscore/amd/once.js
new file mode 100644
index 00000000..44d85357
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/once.js
@@ -0,0 +1,9 @@
+define(['./before', './partial'], function (before, partial) {
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ var once = partial(before, 2);
+
+ return once;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/pairs.js b/node_modules/jsonpath/node_modules/underscore/amd/pairs.js
new file mode 100644
index 00000000..47576813
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/pairs.js
@@ -0,0 +1,17 @@
+define(['./keys'], function (keys) {
+
+ // Convert an object into a list of `[key, value]` pairs.
+ // The opposite of `_.object` with one argument.
+ function pairs(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [_keys[i], obj[_keys[i]]];
+ }
+ return pairs;
+ }
+
+ return pairs;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/partial.js b/node_modules/jsonpath/node_modules/underscore/amd/partial.js
new file mode 100644
index 00000000..1ecb68f5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/partial.js
@@ -0,0 +1,25 @@
+define(['./underscore', './_executeBound', './restArguments'], function (underscore, _executeBound, restArguments) {
+
+ // Partially apply a function by creating a version that has had some of its
+ // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+ // as a placeholder by default, allowing any combination of arguments to be
+ // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+ var partial = restArguments(function(func, boundArgs) {
+ var placeholder = partial.placeholder;
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return _executeBound(func, bound, this, this, args);
+ };
+ return bound;
+ });
+
+ partial.placeholder = underscore;
+
+ return partial;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/partition.js b/node_modules/jsonpath/node_modules/underscore/amd/partition.js
new file mode 100644
index 00000000..a87e5fb9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/partition.js
@@ -0,0 +1,11 @@
+define(['./_group'], function (_group) {
+
+ // Split a collection into two arrays: one whose elements all pass the given
+ // truth test, and one whose elements all do not pass the truth test.
+ var partition = _group(function(result, value, pass) {
+ result[pass ? 0 : 1].push(value);
+ }, true);
+
+ return partition;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/pick.js b/node_modules/jsonpath/node_modules/underscore/amd/pick.js
new file mode 100644
index 00000000..1b9a8c45
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/pick.js
@@ -0,0 +1,25 @@
+define(['./isFunction', './_optimizeCb', './_flatten', './_keyInObj', './allKeys', './restArguments'], function (isFunction, _optimizeCb, _flatten, _keyInObj, allKeys, restArguments) {
+
+ // Return a copy of the object only containing the allowed properties.
+ var pick = restArguments(function(obj, keys) {
+ var result = {}, iteratee = keys[0];
+ if (obj == null) return result;
+ if (isFunction(iteratee)) {
+ if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]);
+ keys = allKeys(obj);
+ } else {
+ iteratee = _keyInObj;
+ keys = _flatten(keys, false, false);
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+ });
+
+ return pick;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/pluck.js b/node_modules/jsonpath/node_modules/underscore/amd/pluck.js
new file mode 100644
index 00000000..7d8a76dc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/pluck.js
@@ -0,0 +1,10 @@
+define(['./property', './map'], function (property, map) {
+
+ // Convenience version of a common use case of `_.map`: fetching a property.
+ function pluck(obj, key) {
+ return map(obj, property(key));
+ }
+
+ return pluck;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/pop.js b/node_modules/jsonpath/node_modules/underscore/amd/pop.js
new file mode 100644
index 00000000..bb0deb7c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/pop.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var pop = _unmethodize(_setup.ArrayProto.pop);
+
+ return pop;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/property.js b/node_modules/jsonpath/node_modules/underscore/amd/property.js
new file mode 100644
index 00000000..94c6ccca
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/property.js
@@ -0,0 +1,14 @@
+define(['./_deepGet', './_toPath'], function (_deepGet, _toPath) {
+
+ // Creates a function that, when passed an object, will traverse that object’s
+ // properties down the given `path`, specified as an array of keys or indices.
+ function property(path) {
+ path = _toPath(path);
+ return function(obj) {
+ return _deepGet(obj, path);
+ };
+ }
+
+ return property;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/propertyOf.js b/node_modules/jsonpath/node_modules/underscore/amd/propertyOf.js
new file mode 100644
index 00000000..40a7f7cd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/propertyOf.js
@@ -0,0 +1,13 @@
+define(['./get', './noop'], function (get, noop) {
+
+ // Generates a function for a given object that returns a given property.
+ function propertyOf(obj) {
+ if (obj == null) return noop;
+ return function(path) {
+ return get(obj, path);
+ };
+ }
+
+ return propertyOf;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/push.js b/node_modules/jsonpath/node_modules/underscore/amd/push.js
new file mode 100644
index 00000000..8b35ef37
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/push.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var push = _unmethodize(_setup.ArrayProto.push);
+
+ return push;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/random.js b/node_modules/jsonpath/node_modules/underscore/amd/random.js
new file mode 100644
index 00000000..ba82815c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/random.js
@@ -0,0 +1,14 @@
+define(function () {
+
+ // Return a random integer between `min` and `max` (inclusive).
+ function random(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+ }
+
+ return random;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/range.js b/node_modules/jsonpath/node_modules/underscore/amd/range.js
new file mode 100644
index 00000000..47eb9edc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/range.js
@@ -0,0 +1,27 @@
+define(function () {
+
+ // Generate an integer Array containing an arithmetic progression. A port of
+ // the native Python `range()` function. See
+ // [the Python documentation](https://docs.python.org/library/functions.html#range).
+ function range(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+ }
+
+ return range;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/reduce.js b/node_modules/jsonpath/node_modules/underscore/amd/reduce.js
new file mode 100644
index 00000000..2aae8cae
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/reduce.js
@@ -0,0 +1,9 @@
+define(['./_createReduce'], function (_createReduce) {
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`.
+ var reduce = _createReduce(1);
+
+ return reduce;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/reduceRight.js b/node_modules/jsonpath/node_modules/underscore/amd/reduceRight.js
new file mode 100644
index 00000000..ccb17392
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/reduceRight.js
@@ -0,0 +1,8 @@
+define(['./_createReduce'], function (_createReduce) {
+
+ // The right-associative version of reduce, also known as `foldr`.
+ var reduceRight = _createReduce(-1);
+
+ return reduceRight;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/reject.js b/node_modules/jsonpath/node_modules/underscore/amd/reject.js
new file mode 100644
index 00000000..8ede16ca
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/reject.js
@@ -0,0 +1,10 @@
+define(['./_cb', './filter', './negate'], function (_cb, filter, negate) {
+
+ // Return all the elements for which a truth test fails.
+ function reject(obj, predicate, context) {
+ return filter(obj, negate(_cb(predicate)), context);
+ }
+
+ return reject;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/rest.js b/node_modules/jsonpath/node_modules/underscore/amd/rest.js
new file mode 100644
index 00000000..ecf6b74a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/rest.js
@@ -0,0 +1,12 @@
+define(['./_setup'], function (_setup) {
+
+ // Returns everything but the first entry of the `array`. Especially useful on
+ // the `arguments` object. Passing an **n** will return the rest N values in the
+ // `array`.
+ function rest(array, n, guard) {
+ return _setup.slice.call(array, n == null || guard ? 1 : n);
+ }
+
+ return rest;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/restArguments.js b/node_modules/jsonpath/node_modules/underscore/amd/restArguments.js
new file mode 100644
index 00000000..dd712748
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/restArguments.js
@@ -0,0 +1,33 @@
+define(function () {
+
+ // Some functions take a variable number of arguments, or a few expected
+ // arguments at the beginning and then a variable number of values to operate
+ // on. This helper accumulates all remaining arguments past the function’s
+ // argument length (or an explicit `startIndex`), into an array that becomes
+ // the last argument. Similar to ES6’s "rest parameter".
+ function restArguments(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0),
+ rest = Array(length),
+ index = 0;
+ for (; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ var args = Array(startIndex + 1);
+ for (index = 0; index < startIndex; index++) {
+ args[index] = arguments[index];
+ }
+ args[startIndex] = rest;
+ return func.apply(this, args);
+ };
+ }
+
+ return restArguments;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/result.js b/node_modules/jsonpath/node_modules/underscore/amd/result.js
new file mode 100644
index 00000000..093a9113
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/result.js
@@ -0,0 +1,25 @@
+define(['./isFunction', './_toPath'], function (isFunction, _toPath) {
+
+ // Traverses the children of `obj` along `path`. If a child is a function, it
+ // is invoked with its parent as context. Returns the value of the final
+ // child, or `fallback` if any child is undefined.
+ function result(obj, path, fallback) {
+ path = _toPath(path);
+ var length = path.length;
+ if (!length) {
+ return isFunction(fallback) ? fallback.call(obj) : fallback;
+ }
+ for (var i = 0; i < length; i++) {
+ var prop = obj == null ? void 0 : obj[path[i]];
+ if (prop === void 0) {
+ prop = fallback;
+ i = length; // Ensure we don't continue iterating.
+ }
+ obj = isFunction(prop) ? prop.call(obj) : prop;
+ }
+ return obj;
+ }
+
+ return result;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/reverse.js b/node_modules/jsonpath/node_modules/underscore/amd/reverse.js
new file mode 100644
index 00000000..3584c82e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/reverse.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var reverse = _unmethodize(_setup.ArrayProto.reverse);
+
+ return reverse;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/sample.js b/node_modules/jsonpath/node_modules/underscore/amd/sample.js
new file mode 100644
index 00000000..f60d3107
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/sample.js
@@ -0,0 +1,27 @@
+define(['./_getLength', './_isArrayLike', './clone', './values', './random'], function (_getLength, _isArrayLike, clone, values, random) {
+
+ // Sample **n** random values from a collection using the modern version of the
+ // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+ // If **n** is not specified, returns a single random element.
+ // The internal `guard` argument allows it to work with `_.map`.
+ function sample(obj, n, guard) {
+ if (n == null || guard) {
+ if (!_isArrayLike(obj)) obj = values(obj);
+ return obj[random(obj.length - 1)];
+ }
+ var sample = _isArrayLike(obj) ? clone(obj) : values(obj);
+ var length = _getLength(sample);
+ n = Math.max(Math.min(n, length), 0);
+ var last = length - 1;
+ for (var index = 0; index < n; index++) {
+ var rand = random(index, last);
+ var temp = sample[index];
+ sample[index] = sample[rand];
+ sample[rand] = temp;
+ }
+ return sample.slice(0, n);
+ }
+
+ return sample;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/shift.js b/node_modules/jsonpath/node_modules/underscore/amd/shift.js
new file mode 100644
index 00000000..8cebf657
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/shift.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var shift = _unmethodize(_setup.ArrayProto.shift);
+
+ return shift;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/shuffle.js b/node_modules/jsonpath/node_modules/underscore/amd/shuffle.js
new file mode 100644
index 00000000..ff14021b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/shuffle.js
@@ -0,0 +1,10 @@
+define(['./sample'], function (sample) {
+
+ // Shuffle a collection.
+ function shuffle(obj) {
+ return sample(obj, Infinity);
+ }
+
+ return shuffle;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/size.js b/node_modules/jsonpath/node_modules/underscore/amd/size.js
new file mode 100644
index 00000000..9b68784f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/size.js
@@ -0,0 +1,11 @@
+define(['./keys', './_isArrayLike'], function (keys, _isArrayLike) {
+
+ // Return the number of elements in a collection.
+ function size(obj) {
+ if (obj == null) return 0;
+ return _isArrayLike(obj) ? obj.length : keys(obj).length;
+ }
+
+ return size;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/slice.js b/node_modules/jsonpath/node_modules/underscore/amd/slice.js
new file mode 100644
index 00000000..17c28a7a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/slice.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var slice = _unmethodize(_setup.ArrayProto.slice);
+
+ return slice;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/some.js b/node_modules/jsonpath/node_modules/underscore/amd/some.js
new file mode 100644
index 00000000..a71138f0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/some.js
@@ -0,0 +1,17 @@
+define(['./keys', './_cb', './_isArrayLike'], function (keys, _cb, _isArrayLike) {
+
+ // Determine if at least one element in the object passes a truth test.
+ function some(obj, predicate, context) {
+ predicate = _cb(predicate, context);
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+ }
+
+ return some;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/sort.js b/node_modules/jsonpath/node_modules/underscore/amd/sort.js
new file mode 100644
index 00000000..e63d4a13
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/sort.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var sort = _unmethodize(_setup.ArrayProto.sort);
+
+ return sort;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/sortBy.js b/node_modules/jsonpath/node_modules/underscore/amd/sortBy.js
new file mode 100644
index 00000000..b652609f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/sortBy.js
@@ -0,0 +1,26 @@
+define(['./_cb', './map', './pluck'], function (_cb, map, pluck) {
+
+ // Sort the object's values by a criterion produced by an iteratee.
+ function sortBy(obj, iteratee, context) {
+ var index = 0;
+ iteratee = _cb(iteratee, context);
+ return pluck(map(obj, function(value, key, list) {
+ return {
+ value: value,
+ index: index++,
+ criteria: iteratee(value, key, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+ }
+
+ return sortBy;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/sortedIndex.js b/node_modules/jsonpath/node_modules/underscore/amd/sortedIndex.js
new file mode 100644
index 00000000..83aac9ec
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/sortedIndex.js
@@ -0,0 +1,18 @@
+define(['./_cb', './_getLength'], function (_cb, _getLength) {
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ function sortedIndex(array, obj, iteratee, context) {
+ iteratee = _cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = _getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+ }
+
+ return sortedIndex;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/sortedLastIndex.js b/node_modules/jsonpath/node_modules/underscore/amd/sortedLastIndex.js
new file mode 100644
index 00000000..2edef086
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/sortedLastIndex.js
@@ -0,0 +1,11 @@
+define(['./_binarySearch', './_cb', './_lessEqual'], function (_binarySearch, _cb, _lessEqual) {
+
+ // Use an iteratee to figure out the greatest index at which an object should be
+ // inserted so as to maintain order. Uses binary search.
+ function sortedLastIndex(array, obj, iteratee, context) {
+ return _binarySearch(array, obj, _cb(iteratee, context), _lessEqual);
+ }
+
+ return sortedLastIndex;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/splice.js b/node_modules/jsonpath/node_modules/underscore/amd/splice.js
new file mode 100644
index 00000000..0b84c971
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/splice.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var splice = _unmethodize(_setup.ArrayProto.splice);
+
+ return splice;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/tap.js b/node_modules/jsonpath/node_modules/underscore/amd/tap.js
new file mode 100644
index 00000000..8605d102
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/tap.js
@@ -0,0 +1,13 @@
+define(function () {
+
+ // Invokes `interceptor` with the `obj` and then returns `obj`.
+ // The primary purpose of this method is to "tap into" a method chain, in
+ // order to perform operations on intermediate results within the chain.
+ function tap(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ }
+
+ return tap;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/template.js b/node_modules/jsonpath/node_modules/underscore/amd/template.js
new file mode 100644
index 00000000..db22949e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/template.js
@@ -0,0 +1,95 @@
+define(['./underscore', './defaults', './templateSettings'], function (underscore, defaults, templateSettings) {
+
+ // When customizing `_.templateSettings`, if you don't want to define an
+ // interpolation, evaluation or escaping regex, we need one that is
+ // guaranteed not to match.
+ var noMatch = /(.)^/;
+
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+ function escapeChar(match) {
+ return '\\' + escapes[match];
+ }
+
+ var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+ // JavaScript micro-templating, similar to John Resig's implementation.
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
+ // and correctly escapes quotes within interpolated code.
+ // NB: `oldSettings` only exists for backwards compatibility.
+ function template(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = defaults({}, settings, underscore.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offset.
+ return match;
+ });
+ source += "';\n";
+
+ var argument = settings.variable;
+ if (argument) {
+ if (!bareIdentifier.test(argument)) throw new Error(argument);
+ } else {
+ // If a variable is not specified, place data values in local scope.
+ source = 'with(obj||{}){\n' + source + '}\n';
+ argument = 'obj';
+ }
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ var render;
+ try {
+ render = new Function(argument, '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, underscore);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+ }
+
+ return template;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/templateSettings.js b/node_modules/jsonpath/node_modules/underscore/amd/templateSettings.js
new file mode 100644
index 00000000..94abcb53
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/templateSettings.js
@@ -0,0 +1,13 @@
+define(['./underscore'], function (underscore) {
+
+ // By default, Underscore uses ERB-style template delimiters. Change the
+ // following template settings to use alternative delimiters.
+ var templateSettings = underscore.templateSettings = {
+ evaluate: /<%([\s\S]+?)%>/g,
+ interpolate: /<%=([\s\S]+?)%>/g,
+ escape: /<%-([\s\S]+?)%>/g
+ };
+
+ return templateSettings;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/throttle.js b/node_modules/jsonpath/node_modules/underscore/amd/throttle.js
new file mode 100644
index 00000000..555100ab
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/throttle.js
@@ -0,0 +1,51 @@
+define(['./now'], function (now) {
+
+ // Returns a function, that, when invoked, will only be triggered at most once
+ // during a given window of time. Normally, the throttled function will run
+ // as much as it can, without ever going more than once per `wait` duration;
+ // but if you'd like to disable the execution on the leading edge, pass
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
+ function throttle(func, wait, options) {
+ var timeout, context, args, result;
+ var previous = 0;
+ if (!options) options = {};
+
+ var later = function() {
+ previous = options.leading === false ? 0 : now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+
+ var throttled = function() {
+ var _now = now();
+ if (!previous && options.leading === false) previous = _now;
+ var remaining = wait - (_now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = _now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+
+ throttled.cancel = function() {
+ clearTimeout(timeout);
+ previous = 0;
+ timeout = context = args = null;
+ };
+
+ return throttled;
+ }
+
+ return throttle;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/times.js b/node_modules/jsonpath/node_modules/underscore/amd/times.js
new file mode 100644
index 00000000..d70145d3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/times.js
@@ -0,0 +1,13 @@
+define(['./_optimizeCb'], function (_optimizeCb) {
+
+ // Run a function **n** times.
+ function times(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = _optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+ }
+
+ return times;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/toArray.js b/node_modules/jsonpath/node_modules/underscore/amd/toArray.js
new file mode 100644
index 00000000..d58dc963
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/toArray.js
@@ -0,0 +1,18 @@
+define(['./_setup', './identity', './isArray', './_isArrayLike', './values', './isString', './map'], function (_setup, identity, isArray, _isArrayLike, values, isString, map) {
+
+ // Safely create a real, live array from anything iterable.
+ var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+ function toArray(obj) {
+ if (!obj) return [];
+ if (isArray(obj)) return _setup.slice.call(obj);
+ if (isString(obj)) {
+ // Keep surrogate pair characters together.
+ return obj.match(reStrSymbol);
+ }
+ if (_isArrayLike(obj)) return map(obj, identity);
+ return values(obj);
+ }
+
+ return toArray;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/toPath.js b/node_modules/jsonpath/node_modules/underscore/amd/toPath.js
new file mode 100644
index 00000000..e4ebc2dc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/toPath.js
@@ -0,0 +1,12 @@
+define(['./isArray', './underscore'], function (isArray, underscore) {
+
+ // Normalize a (deep) property `path` to array.
+ // Like `_.iteratee`, this function can be customized.
+ function toPath(path) {
+ return isArray(path) ? path : [path];
+ }
+ underscore.toPath = toPath;
+
+ return toPath;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/toString.js b/node_modules/jsonpath/node_modules/underscore/amd/toString.js
new file mode 100644
index 00000000..d12cafe1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/toString.js
@@ -0,0 +1,11 @@
+define(['./value'], function (value) {
+
+ // Provide an unwrapping proxy for automatic string coercion in engine
+ // operations such as JSON stringification.
+ function toString(wrapper) {
+ return String(value(wrapper));
+ }
+
+ return toString;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/underscore-array-methods.js b/node_modules/jsonpath/node_modules/underscore/amd/underscore-array-methods.js
new file mode 100644
index 00000000..c87ad244
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/underscore-array-methods.js
@@ -0,0 +1,30 @@
+define(['./_setup', './underscore', './_chainResult', './each'], function (_setup, underscore, _chainResult, each) {
+
+ // Add all mutator `Array` functions to the wrapper.
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = _setup.ArrayProto[name];
+ underscore.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) {
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+ delete obj[0];
+ }
+ }
+ return _chainResult(this, obj);
+ };
+ });
+
+ // Add all accessor `Array` functions to the wrapper.
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = _setup.ArrayProto[name];
+ underscore.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) obj = method.apply(obj, arguments);
+ return _chainResult(this, obj);
+ };
+ });
+
+ return underscore;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/underscore.js b/node_modules/jsonpath/node_modules/underscore/amd/underscore.js
new file mode 100644
index 00000000..03492abf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/underscore.js
@@ -0,0 +1,29 @@
+define(['./_setup'], function (_setup) {
+
+ // If Underscore is called as a function, it returns a wrapped object that can
+ // be used OO-style. This wrapper holds altered versions of all functions added
+ // through `_.mixin`. Wrapped objects may be chained.
+ function _(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+ }
+
+ _.VERSION = _setup.VERSION;
+
+ // Extracts the result from a wrapped and chained object.
+ _.prototype.value = function() {
+ return this._wrapped;
+ };
+
+ // Provide unwrapping proxies for some methods used in engine operations
+ // such as arithmetic and JSON stringification.
+ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+ _.prototype.toString = function() {
+ return String(this._wrapped);
+ };
+
+ return _;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/unescape.js b/node_modules/jsonpath/node_modules/underscore/amd/unescape.js
new file mode 100644
index 00000000..b48d4447
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/unescape.js
@@ -0,0 +1,8 @@
+define(['./_createEscaper', './_unescapeMap'], function (_createEscaper, _unescapeMap) {
+
+ // Function for unescaping strings from HTML interpolation.
+ var _unescape = _createEscaper(_unescapeMap);
+
+ return _unescape;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/union.js b/node_modules/jsonpath/node_modules/underscore/amd/union.js
new file mode 100644
index 00000000..eaf0233b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/union.js
@@ -0,0 +1,11 @@
+define(['./_flatten', './restArguments', './uniq'], function (_flatten, restArguments, uniq) {
+
+ // Produce an array that contains the union: each distinct element from all of
+ // the passed-in arrays.
+ var union = restArguments(function(arrays) {
+ return uniq(_flatten(arrays, true, true));
+ });
+
+ return union;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/uniq.js b/node_modules/jsonpath/node_modules/underscore/amd/uniq.js
new file mode 100644
index 00000000..a14d0db6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/uniq.js
@@ -0,0 +1,37 @@
+define(['./_cb', './_getLength', './contains', './isBoolean'], function (_cb, _getLength, contains, isBoolean) {
+
+ // Produce a duplicate-free version of the array. If the array has already
+ // been sorted, you have the option of using a faster algorithm.
+ // The faster algorithm will not work with an iteratee if the iteratee
+ // is not a one-to-one function, so providing an iteratee will disable
+ // the faster algorithm.
+ function uniq(array, isSorted, iteratee, context) {
+ if (!isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = _cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = _getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted && !iteratee) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ return uniq;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/uniqueId.js b/node_modules/jsonpath/node_modules/underscore/amd/uniqueId.js
new file mode 100644
index 00000000..4c99d645
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/uniqueId.js
@@ -0,0 +1,13 @@
+define(function () {
+
+ // Generate a unique integer id (unique within the entire client session).
+ // Useful for temporary DOM ids.
+ var idCounter = 0;
+ function uniqueId(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+ }
+
+ return uniqueId;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/unshift.js b/node_modules/jsonpath/node_modules/underscore/amd/unshift.js
new file mode 100644
index 00000000..b1dce0f1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/unshift.js
@@ -0,0 +1,7 @@
+define(['./_unmethodize', './_setup'], function (_unmethodize, _setup) {
+
+ var unshift = _unmethodize(_setup.ArrayProto.unshift);
+
+ return unshift;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/unzip.js b/node_modules/jsonpath/node_modules/underscore/amd/unzip.js
new file mode 100644
index 00000000..47410c97
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/unzip.js
@@ -0,0 +1,17 @@
+define(['./_getLength', './pluck', './max'], function (_getLength, pluck, max) {
+
+ // Complement of zip. Unzip accepts an array of arrays and groups
+ // each array's elements on shared indices.
+ function unzip(array) {
+ var length = array && max(array, _getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = pluck(array, index);
+ }
+ return result;
+ }
+
+ return unzip;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/value.js b/node_modules/jsonpath/node_modules/underscore/amd/value.js
new file mode 100644
index 00000000..a117fcd0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/value.js
@@ -0,0 +1,13 @@
+define(function () {
+
+ // Extract the result from a wrapped (and possibly chained) object.
+ // This function is also aliased as `valueOf` and `toJSON`, which provide
+ // unwrapping proxies for some methods used in engine operations such as
+ // arithmetic and JSON stringification.
+ function value(wrapper) {
+ return wrapper._wrapped || wrapper;
+ }
+
+ return value;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/values.js b/node_modules/jsonpath/node_modules/underscore/amd/values.js
new file mode 100644
index 00000000..f42830ab
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/values.js
@@ -0,0 +1,16 @@
+define(['./keys'], function (keys) {
+
+ // Retrieve the values of an object's properties.
+ function values(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[_keys[i]];
+ }
+ return values;
+ }
+
+ return values;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/where.js b/node_modules/jsonpath/node_modules/underscore/amd/where.js
new file mode 100644
index 00000000..c4da9fee
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/where.js
@@ -0,0 +1,11 @@
+define(['./matcher', './filter'], function (matcher, filter) {
+
+ // Convenience version of a common use case of `_.filter`: selecting only
+ // objects containing specific `key:value` pairs.
+ function where(obj, attrs) {
+ return filter(obj, matcher(attrs));
+ }
+
+ return where;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/without.js b/node_modules/jsonpath/node_modules/underscore/amd/without.js
new file mode 100644
index 00000000..eb0ac62e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/without.js
@@ -0,0 +1,10 @@
+define(['./restArguments', './difference'], function (restArguments, difference) {
+
+ // Return a version of the array that does not contain the specified value(s).
+ var without = restArguments(function(array, otherArrays) {
+ return difference(array, otherArrays);
+ });
+
+ return without;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/wrap.js b/node_modules/jsonpath/node_modules/underscore/amd/wrap.js
new file mode 100644
index 00000000..25f19952
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/wrap.js
@@ -0,0 +1,12 @@
+define(['./partial'], function (partial) {
+
+ // Returns the first function passed as an argument to the second,
+ // allowing you to adjust arguments, run code before and after, and
+ // conditionally execute the original function.
+ function wrap(func, wrapper) {
+ return partial(wrapper, func);
+ }
+
+ return wrap;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/amd/zip.js b/node_modules/jsonpath/node_modules/underscore/amd/zip.js
new file mode 100644
index 00000000..25e61fe3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/amd/zip.js
@@ -0,0 +1,9 @@
+define(['./restArguments', './unzip'], function (restArguments, unzip) {
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ var zip = restArguments(unzip);
+
+ return zip;
+
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_apply.js b/node_modules/jsonpath/node_modules/underscore/cjs/_apply.js
new file mode 100644
index 00000000..a4b57f35
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_apply.js
@@ -0,0 +1,6 @@
+var _setup = require('./_setup.js');
+var _unmethodize = require('./_unmethodize.js');
+
+var apply = _unmethodize(_setup.apply);
+
+module.exports = apply;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_applyProperty.js b/node_modules/jsonpath/node_modules/underscore/cjs/_applyProperty.js
new file mode 100644
index 00000000..5da303fd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_applyProperty.js
@@ -0,0 +1,10 @@
+// Internal helper that wraps an `iteratee` to call it with the
+// property of a closed-over `object`. Useful when iterating over
+// an array of keys of `object`.
+function applyProperty(iteratee, object) {
+ return function(key) {
+ return iteratee(object[key], key, object);
+ };
+}
+
+module.exports = applyProperty;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_arrayAccessors.js b/node_modules/jsonpath/node_modules/underscore/cjs/_arrayAccessors.js
new file mode 100644
index 00000000..4b7ade88
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_arrayAccessors.js
@@ -0,0 +1,11 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var concat = require('./concat.js');
+var join = require('./join.js');
+var slice = require('./slice.js');
+
+
+
+exports.concat = concat;
+exports.join = join;
+exports.slice = slice;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_arrayMutators.js b/node_modules/jsonpath/node_modules/underscore/cjs/_arrayMutators.js
new file mode 100644
index 00000000..903409c9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_arrayMutators.js
@@ -0,0 +1,19 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var pop = require('./pop.js');
+var push = require('./push.js');
+var reverse = require('./reverse.js');
+var shift = require('./shift.js');
+var sort = require('./sort.js');
+var splice = require('./splice.js');
+var unshift = require('./unshift.js');
+
+
+
+exports.pop = pop;
+exports.push = push;
+exports.reverse = reverse;
+exports.shift = shift;
+exports.sort = sort;
+exports.splice = splice;
+exports.unshift = unshift;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_baseCreate.js b/node_modules/jsonpath/node_modules/underscore/cjs/_baseCreate.js
new file mode 100644
index 00000000..aacc4f47
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_baseCreate.js
@@ -0,0 +1,20 @@
+var isObject = require('./isObject.js');
+var _setup = require('./_setup.js');
+
+// Create a naked function reference for surrogate-prototype-swapping.
+function ctor() {
+ return function(){};
+}
+
+// An internal function for creating a new object that inherits from another.
+function baseCreate(prototype) {
+ if (!isObject(prototype)) return {};
+ if (_setup.nativeCreate) return _setup.nativeCreate(prototype);
+ var Ctor = ctor();
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+}
+
+module.exports = baseCreate;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_baseIteratee.js b/node_modules/jsonpath/node_modules/underscore/cjs/_baseIteratee.js
new file mode 100644
index 00000000..0fd24d3b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_baseIteratee.js
@@ -0,0 +1,19 @@
+var isObject = require('./isObject.js');
+var identity = require('./identity.js');
+var isFunction = require('./isFunction.js');
+var isArray = require('./isArray.js');
+var matcher = require('./matcher.js');
+var property = require('./property.js');
+var _optimizeCb = require('./_optimizeCb.js');
+
+// An internal function to generate callbacks that can be applied to each
+// element in a collection, returning the desired result — either `_.identity`,
+// an arbitrary callback, a property matcher, or a property accessor.
+function baseIteratee(value, context, argCount) {
+ if (value == null) return identity;
+ if (isFunction(value)) return _optimizeCb(value, context, argCount);
+ if (isObject(value) && !isArray(value)) return matcher(value);
+ return property(value);
+}
+
+module.exports = baseIteratee;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_binarySearch.js b/node_modules/jsonpath/node_modules/underscore/cjs/_binarySearch.js
new file mode 100644
index 00000000..48eb030a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_binarySearch.js
@@ -0,0 +1,15 @@
+var _getLength = require('./_getLength.js');
+
+// Iteratively cut `array` in half to figure out the index at which `obj` should
+// be inserted so as to maintain the order defined by `compare`.
+function binarySearch(array, obj, iteratee, compare) {
+ var value = iteratee(obj);
+ var low = 0, high = _getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (compare(iteratee(array[mid]), value)) low = mid + 1; else high = mid;
+ }
+ return low;
+}
+
+module.exports = binarySearch;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_bindCb.js b/node_modules/jsonpath/node_modules/underscore/cjs/_bindCb.js
new file mode 100644
index 00000000..3c1de2f1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_bindCb.js
@@ -0,0 +1,10 @@
+// Internal function that returns a bound version of the passed-in callback, to
+// be repeatedly applied in other Underscore functions.
+function bindCb(func, context) {
+ if (context === void 0) return func;
+ return function() {
+ return func.apply(context, arguments);
+ };
+}
+
+module.exports = bindCb;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_bindCb4.js b/node_modules/jsonpath/node_modules/underscore/cjs/_bindCb4.js
new file mode 100644
index 00000000..75febd0b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_bindCb4.js
@@ -0,0 +1,13 @@
+// In Firefox, `Function.prototype.call` is faster than
+// `Function.prototype.apply`. In the optimized variant of
+// `bindCb` below, we exploit the fact that no Underscore
+// function passes more than four arguments to a callback.
+// **NOT general enough for use outside of Underscore.**
+function bindCb4(func, context) {
+ if (context === void 0) return func;
+ return function(a1, a2, a3, a4) {
+ return func.call(context, a1, a2, a3, a4);
+ };
+}
+
+module.exports = bindCb4;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_byValue.js b/node_modules/jsonpath/node_modules/underscore/cjs/_byValue.js
new file mode 100644
index 00000000..d801b55b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_byValue.js
@@ -0,0 +1,7 @@
+// Internal wrapper to enable match-by-value mode in `linearSearch`.
+function byValue(value) {
+ if (!(this instanceof byValue)) return new byValue(value);
+ this.value = value;
+}
+
+module.exports = byValue;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_cb.js b/node_modules/jsonpath/node_modules/underscore/cjs/_cb.js
new file mode 100644
index 00000000..8b5d3898
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_cb.js
@@ -0,0 +1,12 @@
+var underscore = require('./underscore.js');
+var _baseIteratee = require('./_baseIteratee.js');
+var iteratee = require('./iteratee.js');
+
+// The function we call internally to generate a callback. It invokes
+// `_.iteratee` if overridden, otherwise `baseIteratee`.
+function cb(value, context, argCount) {
+ if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context);
+ return _baseIteratee(value, context, argCount);
+}
+
+module.exports = cb;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_chainResult.js b/node_modules/jsonpath/node_modules/underscore/cjs/_chainResult.js
new file mode 100644
index 00000000..8670e3d8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_chainResult.js
@@ -0,0 +1,8 @@
+var underscore = require('./underscore.js');
+
+// Helper function to continue chaining intermediate results.
+function chainResult(instance, obj) {
+ return instance._chain ? underscore(obj).chain() : obj;
+}
+
+module.exports = chainResult;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_collectNonEnumProps.js b/node_modules/jsonpath/node_modules/underscore/cjs/_collectNonEnumProps.js
new file mode 100644
index 00000000..dade935e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_collectNonEnumProps.js
@@ -0,0 +1,42 @@
+var _setup = require('./_setup.js');
+var isFunction = require('./isFunction.js');
+var _has = require('./_has.js');
+
+// Internal helper to create a simple lookup structure.
+// `collectNonEnumProps` used to depend on `_.contains`, but this led to
+// circular imports. `emulatedSet` is a one-off solution that only works for
+// arrays of strings.
+function emulatedSet(keys) {
+ var hash = {};
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+ return {
+ contains: function(key) { return hash[key]; },
+ push: function(key) {
+ hash[key] = true;
+ return keys.push(key);
+ }
+ };
+}
+
+// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+// needed.
+function collectNonEnumProps(obj, keys) {
+ keys = emulatedSet(keys);
+ var nonEnumIdx = _setup.nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = isFunction(constructor) && constructor.prototype || _setup.ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = _setup.nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+ keys.push(prop);
+ }
+ }
+}
+
+module.exports = collectNonEnumProps;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_createAssigner.js b/node_modules/jsonpath/node_modules/underscore/cjs/_createAssigner.js
new file mode 100644
index 00000000..13fa0ddf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_createAssigner.js
@@ -0,0 +1,20 @@
+// An internal function for creating assigner functions.
+function createAssigner(keysFunc, defaults) {
+ return function(obj) {
+ var length = arguments.length;
+ if (defaults) obj = Object(obj);
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+}
+
+module.exports = createAssigner;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_createEscaper.js b/node_modules/jsonpath/node_modules/underscore/cjs/_createEscaper.js
new file mode 100644
index 00000000..c3b7ac4a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_createEscaper.js
@@ -0,0 +1,19 @@
+var keys = require('./keys.js');
+
+// Internal helper to generate functions for escaping and unescaping strings
+// to/from HTML interpolation.
+function createEscaper(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+}
+
+module.exports = createEscaper;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_createIndexFinder.js b/node_modules/jsonpath/node_modules/underscore/cjs/_createIndexFinder.js
new file mode 100644
index 00000000..5c1ecfdc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_createIndexFinder.js
@@ -0,0 +1,30 @@
+var _setup = require('./_setup.js');
+var _getLength = require('./_getLength.js');
+var _isNaN = require('./isNaN.js');
+
+// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = _getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+}
+
+module.exports = createIndexFinder;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_createPredicateIndexFinder.js b/node_modules/jsonpath/node_modules/underscore/cjs/_createPredicateIndexFinder.js
new file mode 100644
index 00000000..e954419c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_createPredicateIndexFinder.js
@@ -0,0 +1,17 @@
+var _cb = require('./_cb.js');
+var _getLength = require('./_getLength.js');
+
+// Internal function to generate `_.findIndex` and `_.findLastIndex`.
+function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = _cb(predicate, context);
+ var length = _getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+}
+
+module.exports = createPredicateIndexFinder;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_createReduce.js b/node_modules/jsonpath/node_modules/underscore/cjs/_createReduce.js
new file mode 100644
index 00000000..525b28ac
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_createReduce.js
@@ -0,0 +1,30 @@
+var keys = require('./keys.js');
+var _optimizeCb = require('./_optimizeCb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+
+// Internal helper to create a reducing function, iterating left or right.
+function createReduce(dir) {
+ // Wrap code that reassigns argument variables in a separate function than
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+ var reducer = function(obj, iteratee, memo, initial) {
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ if (!initial) {
+ memo = obj[_keys ? _keys[index] : index];
+ index += dir;
+ }
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = _keys ? _keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ };
+
+ return function(obj, iteratee, memo, context) {
+ var initial = arguments.length >= 3;
+ return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial);
+ };
+}
+
+module.exports = createReduce;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_createSizePropertyCheck.js b/node_modules/jsonpath/node_modules/underscore/cjs/_createSizePropertyCheck.js
new file mode 100644
index 00000000..72711297
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_createSizePropertyCheck.js
@@ -0,0 +1,11 @@
+var _setup = require('./_setup.js');
+
+// Common internal logic for `isArrayLike` and `isBufferLike`.
+function createSizePropertyCheck(getSizeProperty) {
+ return function(collection) {
+ var sizeProperty = getSizeProperty(collection);
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX;
+ }
+}
+
+module.exports = createSizePropertyCheck;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_deepGet.js b/node_modules/jsonpath/node_modules/underscore/cjs/_deepGet.js
new file mode 100644
index 00000000..90170589
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_deepGet.js
@@ -0,0 +1,11 @@
+// Internal function to obtain a nested property in `obj` along `path`.
+function deepGet(obj, path) {
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ if (obj == null) return void 0;
+ obj = obj[path[i]];
+ }
+ return length ? obj : void 0;
+}
+
+module.exports = deepGet;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_escapeMap.js b/node_modules/jsonpath/node_modules/underscore/cjs/_escapeMap.js
new file mode 100644
index 00000000..821501ed
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_escapeMap.js
@@ -0,0 +1,11 @@
+// Internal list of HTML entities for escaping.
+var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+};
+
+module.exports = escapeMap;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_executeBound.js b/node_modules/jsonpath/node_modules/underscore/cjs/_executeBound.js
new file mode 100644
index 00000000..e94227e6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_executeBound.js
@@ -0,0 +1,15 @@
+var isObject = require('./isObject.js');
+var _baseCreate = require('./_baseCreate.js');
+
+// Internal function to execute `sourceFunc` bound to `context` with optional
+// `args`. Determines whether to execute a function as a constructor or as a
+// normal function.
+function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = _baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (isObject(result)) return result;
+ return self;
+}
+
+module.exports = executeBound;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_extremum.js b/node_modules/jsonpath/node_modules/underscore/cjs/_extremum.js
new file mode 100644
index 00000000..4545c6d7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_extremum.js
@@ -0,0 +1,35 @@
+var identity = require('./identity.js');
+var _cb = require('./_cb.js');
+var find = require('./find.js');
+
+// The general algorithm behind `_.min` and `_.max`. `compare` should return
+// `true` if its first argument is more extreme than (i.e., should be preferred
+// over) its second argument, `false` otherwise. `iteratee` and `context`, like
+// in other collection functions, let you map the actual values in `collection`
+// to the values to `compare`. `decide` is an optional customization point
+// which is only present for historical reasons; please don't use it, as it will
+// likely be removed in the future.
+function extremum(collection, compare, iteratee, context, decide) {
+ decide || (decide = identity);
+ // `extremum` is essentially a combined map+reduce with **two** accumulators:
+ // `result` and `iterResult`, respectively the unmapped and the mapped version
+ // corresponding to the same element.
+ var result, iterResult;
+ iteratee = _cb(iteratee, context);
+ var first = true;
+ find(collection, function(value, key) {
+ var iterValue = iteratee(value, key, collection);
+ if (first || compare(iterValue, iterResult)) {
+ result = value;
+ iterResult = iterValue;
+ first = false;
+ }
+ });
+ // `extremum` normally returns an unmapped element from `collection`. However,
+ // `_.min` and `_.max` forcibly return a number even if there is no element
+ // that maps to a numeric value. Passing both accumulators through `decide`
+ // before returning enables this behavior.
+ return decide(result, iterResult);
+}
+
+module.exports = extremum;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_flatten.js b/node_modules/jsonpath/node_modules/underscore/cjs/_flatten.js
new file mode 100644
index 00000000..6859d993
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_flatten.js
@@ -0,0 +1,33 @@
+var isArray = require('./isArray.js');
+var _getLength = require('./_getLength.js');
+var _isArrayLike = require('./_isArrayLike.js');
+var isArguments = require('./isArguments.js');
+
+// Internal implementation of a recursive `flatten` function.
+function flatten(input, depth, strict, output) {
+ output = output || [];
+ if (!depth && depth !== 0) {
+ depth = Infinity;
+ } else if (depth <= 0) {
+ return output.concat(input);
+ }
+ var idx = output.length;
+ for (var i = 0, length = _getLength(input); i < length; i++) {
+ var value = input[i];
+ if (_isArrayLike(value) && (isArray(value) || isArguments(value))) {
+ // Flatten current level of array or arguments object.
+ if (depth > 1) {
+ flatten(value, depth - 1, strict, output);
+ idx = output.length;
+ } else {
+ var j = 0, len = value.length;
+ while (j < len) output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+}
+
+module.exports = flatten;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_forceNumericMinMax.js b/node_modules/jsonpath/node_modules/underscore/cjs/_forceNumericMinMax.js
new file mode 100644
index 00000000..d2b4d73a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_forceNumericMinMax.js
@@ -0,0 +1,14 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var _isNaN = require('./isNaN.js');
+
+// Internal `extremum` return value adapter for `_.min` and `_.max`.
+// Ensures that a number is returned even if no element of the
+// collection maps to a numeric value.
+function decideNumeric(fallback) {
+ return function(result, iterResult) {
+ return _isNaN(+iterResult) ? fallback : result;
+ }
+}
+
+exports.decideNumeric = decideNumeric;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_getByteLength.js b/node_modules/jsonpath/node_modules/underscore/cjs/_getByteLength.js
new file mode 100644
index 00000000..49acd7f8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_getByteLength.js
@@ -0,0 +1,6 @@
+var _shallowProperty = require('./_shallowProperty.js');
+
+// Internal helper to obtain the `byteLength` property of an object.
+var getByteLength = _shallowProperty('byteLength');
+
+module.exports = getByteLength;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_getLength.js b/node_modules/jsonpath/node_modules/underscore/cjs/_getLength.js
new file mode 100644
index 00000000..1ad70920
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_getLength.js
@@ -0,0 +1,6 @@
+var _shallowProperty = require('./_shallowProperty.js');
+
+// Internal helper to obtain the `length` property of an object.
+var getLength = _shallowProperty('length');
+
+module.exports = getLength;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_greater.js b/node_modules/jsonpath/node_modules/underscore/cjs/_greater.js
new file mode 100644
index 00000000..549071de
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_greater.js
@@ -0,0 +1,6 @@
+// A version of the `>` operator that can be passed around as a function.
+function greater(left, right) {
+ return left > right;
+}
+
+module.exports = greater;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_group.js b/node_modules/jsonpath/node_modules/underscore/cjs/_group.js
new file mode 100644
index 00000000..cb1f5a85
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_group.js
@@ -0,0 +1,17 @@
+var _cb = require('./_cb.js');
+var each = require('./each.js');
+
+// An internal function used for aggregate "group by" operations.
+function group(behavior, partition) {
+ return function(obj, iteratee, context) {
+ var result = partition ? [[], []] : {};
+ iteratee = _cb(iteratee, context);
+ each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+}
+
+module.exports = group;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_has.js b/node_modules/jsonpath/node_modules/underscore/cjs/_has.js
new file mode 100644
index 00000000..6540346b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_has.js
@@ -0,0 +1,8 @@
+var _setup = require('./_setup.js');
+
+// Internal function to check whether `key` is an own property name of `obj`.
+function has(obj, key) {
+ return obj != null && _setup.hasOwnProperty.call(obj, key);
+}
+
+module.exports = has;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_hasObjectTag.js b/node_modules/jsonpath/node_modules/underscore/cjs/_hasObjectTag.js
new file mode 100644
index 00000000..fb714528
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_hasObjectTag.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var hasObjectTag = _tagTester('Object');
+
+module.exports = hasObjectTag;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_isArrayLike.js b/node_modules/jsonpath/node_modules/underscore/cjs/_isArrayLike.js
new file mode 100644
index 00000000..683dede1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_isArrayLike.js
@@ -0,0 +1,10 @@
+var _getLength = require('./_getLength.js');
+var _createSizePropertyCheck = require('./_createSizePropertyCheck.js');
+
+// Internal helper for collection methods to determine whether a collection
+// should be iterated as an array or as an object.
+// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+var isArrayLike = _createSizePropertyCheck(_getLength);
+
+module.exports = isArrayLike;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_isBufferLike.js b/node_modules/jsonpath/node_modules/underscore/cjs/_isBufferLike.js
new file mode 100644
index 00000000..bf919aa8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_isBufferLike.js
@@ -0,0 +1,8 @@
+var _createSizePropertyCheck = require('./_createSizePropertyCheck.js');
+var _getByteLength = require('./_getByteLength.js');
+
+// Internal helper to determine whether we should spend extensive checks against
+// `ArrayBuffer` et al.
+var isBufferLike = _createSizePropertyCheck(_getByteLength);
+
+module.exports = isBufferLike;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_keyInObj.js b/node_modules/jsonpath/node_modules/underscore/cjs/_keyInObj.js
new file mode 100644
index 00000000..12adc826
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_keyInObj.js
@@ -0,0 +1,7 @@
+// Internal `_.pick` helper function to determine whether `key` is an enumerable
+// property name of `obj`.
+function keyInObj(value, key, obj) {
+ return key in obj;
+}
+
+module.exports = keyInObj;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_less.js b/node_modules/jsonpath/node_modules/underscore/cjs/_less.js
new file mode 100644
index 00000000..b73118dd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_less.js
@@ -0,0 +1,6 @@
+// A version of the `<` operator that can be passed around as a function.
+function less(left, right) {
+ return left < right;
+}
+
+module.exports = less;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_lessEqual.js b/node_modules/jsonpath/node_modules/underscore/cjs/_lessEqual.js
new file mode 100644
index 00000000..f4042bdb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_lessEqual.js
@@ -0,0 +1,6 @@
+// A version of the `<=` operator that can be passed around as a function.
+function lessEqual(left, right) {
+ return left <= right;
+}
+
+module.exports = lessEqual;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_linearSearch.js b/node_modules/jsonpath/node_modules/underscore/cjs/_linearSearch.js
new file mode 100644
index 00000000..6bd170bd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_linearSearch.js
@@ -0,0 +1,30 @@
+var _getLength = require('./_getLength.js');
+var isFunction = require('./isFunction.js');
+
+// Internal function for linearly iterating over arrays.
+function linearSearch(array, predicate, dir, start) {
+ var target, length = _getLength(array);
+ dir || (dir = 1);
+ start = (
+ start == null ? (dir > 0 ? 0 : length - 1) :
+ start < 0 ? (dir > 0 ? Math.max(0, start + length) : start + length) :
+ dir > 0 ? start : Math.min(start, length - 1)
+ );
+ // As a special case, in order to elide the `predicate` invocation on every
+ // loop iteration, we allow the caller to pass a value that should be found by
+ // strict equality comparison. This is somewhat like a rudimentary iteratee
+ // shorthand. It is used in `_.indexof` and `_.lastIndexOf`.
+ if (!isFunction(predicate)) {
+ target = predicate && predicate.value;
+ predicate = false;
+ }
+ for (; start >= 0 && start < length; start += dir) {
+ if (
+ predicate ? predicate(array[start], start, array) :
+ array[start] === target
+ ) return start;
+ }
+ return -1;
+}
+
+module.exports = linearSearch;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_mapReduce.js b/node_modules/jsonpath/node_modules/underscore/cjs/_mapReduce.js
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_mapReduce.js
@@ -0,0 +1 @@
+
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_methodFingerprint.js b/node_modules/jsonpath/node_modules/underscore/cjs/_methodFingerprint.js
new file mode 100644
index 00000000..52d0891d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_methodFingerprint.js
@@ -0,0 +1,44 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var isFunction = require('./isFunction.js');
+var _getLength = require('./_getLength.js');
+var allKeys = require('./allKeys.js');
+
+// Since the regular `Object.prototype.toString` type tests don't work for
+// some types in IE 11, we use a fingerprinting heuristic instead, based
+// on the methods. It's not great, but it's the best we got.
+// The fingerprint method lists are defined below.
+function ie11fingerprint(methods) {
+ var length = _getLength(methods);
+ return function(obj) {
+ if (obj == null) return false;
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
+ var keys = allKeys(obj);
+ if (_getLength(keys)) return false;
+ for (var i = 0; i < length; i++) {
+ if (!isFunction(obj[methods[i]])) return false;
+ }
+ // If we are testing against `WeakMap`, we need to ensure that
+ // `obj` doesn't have a `forEach` method in order to distinguish
+ // it from a regular `Map`.
+ return methods !== weakMapMethods || !isFunction(obj[forEachName]);
+ };
+}
+
+// In the interest of compact minification, we write
+// each string in the fingerprints only once.
+var forEachName = 'forEach',
+ hasName = 'has',
+ commonInit = ['clear', 'delete'],
+ mapTail = ['get', hasName, 'set'];
+
+// `Map`, `WeakMap` and `Set` each have slightly different
+// combinations of the above sublists.
+var mapMethods = commonInit.concat(forEachName, mapTail),
+ weakMapMethods = commonInit.concat(mapTail),
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+exports.ie11fingerprint = ie11fingerprint;
+exports.mapMethods = mapMethods;
+exports.setMethods = setMethods;
+exports.weakMapMethods = weakMapMethods;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_optimizeCb.js b/node_modules/jsonpath/node_modules/underscore/cjs/_optimizeCb.js
new file mode 100644
index 00000000..e6c25386
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_optimizeCb.js
@@ -0,0 +1,23 @@
+// Internal function that returns an efficient (for current engines) version
+// of the passed-in callback, to be repeatedly applied in other Underscore
+// functions.
+function optimizeCb(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ // The 2-argument case is omitted because we’re not using it.
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+}
+
+module.exports = optimizeCb;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_push.js b/node_modules/jsonpath/node_modules/underscore/cjs/_push.js
new file mode 100644
index 00000000..6d6162e4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_push.js
@@ -0,0 +1,6 @@
+var _setup = require('./_setup.js');
+var _unmethodize = require('./_unmethodize.js');
+
+var push = _unmethodize(_setup.ArrayProto.push);
+
+module.exports = push;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_pusher.js b/node_modules/jsonpath/node_modules/underscore/cjs/_pusher.js
new file mode 100644
index 00000000..6e885a29
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_pusher.js
@@ -0,0 +1,9 @@
+// Internal helper to generate a callback that will append
+// its first argument to the closed-over `array`.
+function pusher(array) {
+ return function(arg) {
+ array.push(arg);
+ };
+}
+
+module.exports = pusher;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_sequence.js b/node_modules/jsonpath/node_modules/underscore/cjs/_sequence.js
new file mode 100644
index 00000000..55fa3b35
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_sequence.js
@@ -0,0 +1,14 @@
+function sequence(iteratee, start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+ var rest = (stop - start) % step;
+ stop += (rest && step - rest);
+ for ( ; start != stop ; start += step) if (iteratee(start)) return start;
+}
+
+module.exports = sequence;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_setup.js b/node_modules/jsonpath/node_modules/underscore/cjs/_setup.js
new file mode 100644
index 00000000..63835bdb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_setup.js
@@ -0,0 +1,66 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+// Current version.
+var VERSION = '1.12.1';
+
+// Establish the root object, `window` (`self`) in the browser, `global`
+// on the server, or `this` in some virtual machines. We use `self`
+// instead of `window` for `WebWorker` support.
+var root = typeof self == 'object' && self.self === self && self ||
+ typeof global == 'object' && global.global === global && global ||
+ Function('return this')() ||
+ {};
+
+// Save bytes in the minified (but not gzipped) version:
+var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+// Create quick reference variables for speed access to core prototypes.
+var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+// Modern feature detection.
+var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+ supportsDataView = typeof DataView !== 'undefined';
+
+// All **ECMAScript 5+** native function implementations that we hope to use
+// are declared here.
+var nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeCreate = Object.create,
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+// Create references to these builtin functions because we override them.
+var _isNaN = isNaN,
+ _isFinite = isFinite;
+
+// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+// The largest integer that can be represented exactly.
+var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+exports.ArrayProto = ArrayProto;
+exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX;
+exports.ObjProto = ObjProto;
+exports.SymbolProto = SymbolProto;
+exports.VERSION = VERSION;
+exports._isFinite = _isFinite;
+exports._isNaN = _isNaN;
+exports.hasEnumBug = hasEnumBug;
+exports.hasOwnProperty = hasOwnProperty;
+exports.nativeCreate = nativeCreate;
+exports.nativeIsArray = nativeIsArray;
+exports.nativeIsView = nativeIsView;
+exports.nativeKeys = nativeKeys;
+exports.nonEnumerableProps = nonEnumerableProps;
+exports.push = push;
+exports.root = root;
+exports.slice = slice;
+exports.supportsArrayBuffer = supportsArrayBuffer;
+exports.supportsDataView = supportsDataView;
+exports.toString = toString;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_shallowProperty.js b/node_modules/jsonpath/node_modules/underscore/cjs/_shallowProperty.js
new file mode 100644
index 00000000..aabdc625
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_shallowProperty.js
@@ -0,0 +1,8 @@
+// Internal helper to generate a function to obtain property `key` from `obj`.
+function shallowProperty(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+}
+
+module.exports = shallowProperty;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_slice.js b/node_modules/jsonpath/node_modules/underscore/cjs/_slice.js
new file mode 100644
index 00000000..0c428f34
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_slice.js
@@ -0,0 +1,6 @@
+var _setup = require('./_setup.js');
+var _unmethodize = require('./_unmethodize.js');
+
+var slice = _unmethodize(_setup.ArrayProto.slice);
+
+module.exports = slice;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_strictEqual.js b/node_modules/jsonpath/node_modules/underscore/cjs/_strictEqual.js
new file mode 100644
index 00000000..d4700dec
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_strictEqual.js
@@ -0,0 +1,5 @@
+function strictEqual(left, right) {
+ return left === right;
+}
+
+module.exports = strictEqual;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_stringTagBug.js b/node_modules/jsonpath/node_modules/underscore/cjs/_stringTagBug.js
new file mode 100644
index 00000000..b5b21caf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_stringTagBug.js
@@ -0,0 +1,15 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var _setup = require('./_setup.js');
+var _hasObjectTag = require('./_hasObjectTag.js');
+
+// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+// In IE 11, the most common among them, this problem also applies to
+// `Map`, `WeakMap` and `Set`.
+var hasStringTagBug = (
+ _setup.supportsDataView && _hasObjectTag(new DataView(new ArrayBuffer(8)))
+ ),
+ isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map));
+
+exports.hasStringTagBug = hasStringTagBug;
+exports.isIE11 = isIE11;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_tagTester.js b/node_modules/jsonpath/node_modules/underscore/cjs/_tagTester.js
new file mode 100644
index 00000000..2578e9b6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_tagTester.js
@@ -0,0 +1,11 @@
+var _setup = require('./_setup.js');
+
+// Internal function for creating a `toString`-based type tester.
+function tagTester(name) {
+ var tag = '[object ' + name + ']';
+ return function(obj) {
+ return _setup.toString.call(obj) === tag;
+ };
+}
+
+module.exports = tagTester;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_toBufferView.js b/node_modules/jsonpath/node_modules/underscore/cjs/_toBufferView.js
new file mode 100644
index 00000000..3ad4e881
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_toBufferView.js
@@ -0,0 +1,13 @@
+var _getByteLength = require('./_getByteLength.js');
+
+// Internal function to wrap or shallow-copy an ArrayBuffer,
+// typed array or DataView to a new view, reusing the buffer.
+function toBufferView(bufferSource) {
+ return new Uint8Array(
+ bufferSource.buffer || bufferSource,
+ bufferSource.byteOffset || 0,
+ _getByteLength(bufferSource)
+ );
+}
+
+module.exports = toBufferView;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_toPath.js b/node_modules/jsonpath/node_modules/underscore/cjs/_toPath.js
new file mode 100644
index 00000000..33f1fa7c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_toPath.js
@@ -0,0 +1,10 @@
+var underscore = require('./underscore.js');
+require('./toPath.js');
+
+// Internal wrapper for `_.toPath` to enable minification.
+// Similar to `cb` for `_.iteratee`.
+function toPath(path) {
+ return underscore.toPath(path);
+}
+
+module.exports = toPath;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_unescapeMap.js b/node_modules/jsonpath/node_modules/underscore/cjs/_unescapeMap.js
new file mode 100644
index 00000000..eee9845e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_unescapeMap.js
@@ -0,0 +1,7 @@
+var _escapeMap = require('./_escapeMap.js');
+var invert = require('./invert.js');
+
+// Internal list of HTML entities for unescaping.
+var unescapeMap = invert(_escapeMap);
+
+module.exports = unescapeMap;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_unmethodize.js b/node_modules/jsonpath/node_modules/underscore/cjs/_unmethodize.js
new file mode 100644
index 00000000..291dc5b6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_unmethodize.js
@@ -0,0 +1,8 @@
+var _bindCb = require('./_bindCb.js');
+var _setup = require('./_setup.js');
+
+function unmethodize(method) {
+ return _bindCb(_setup.call, method);
+}
+
+module.exports = unmethodize;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayAccessor.js b/node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayAccessor.js
new file mode 100644
index 00000000..ed0c12a8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayAccessor.js
@@ -0,0 +1,14 @@
+var _setup = require('./_setup.js');
+var restArguments = require('./restArguments.js');
+
+// Internal function to wrap `Array.prototype` methods that return a
+// new value so they can be directly invoked as standalone functions.
+// Works for `concat`, `slice` and `join`.
+function wrapArrayAccessor(name) {
+ var method = _setup.ArrayProto[name];
+ return restArguments(function(array, args) {
+ return array == null ? array : method.apply(array, args);
+ });
+}
+
+module.exports = wrapArrayAccessor;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayMutator.js b/node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayMutator.js
new file mode 100644
index 00000000..fec14012
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/_wrapArrayMutator.js
@@ -0,0 +1,29 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var _setup = require('./_setup.js');
+var _getLength = require('./_getLength.js');
+var identity = require('./identity.js');
+var restArguments = require('./restArguments.js');
+
+// Internal function to work around a bug in IE < 9. See
+// https://github.com/jashkenas/underscore/issues/397.
+function removeGhostHead(array) {
+ if (!_getLength(array)) delete array[0];
+ return array;
+}
+
+// Internal function to wrap `Array.prototype` methods that modify
+// the context in place so they can be directly invoked as standalone
+// functions. Works for `pop`, `push`, `reverse`, `shift`, `sort`,
+// `splice` and `unshift`.
+function wrapArrayMutator(name, fixup) {
+ var method = _setup.ArrayProto[name];
+ fixup || (fixup = identity);
+ return restArguments(function(array, args) {
+ if (array != null) method.apply(array, args);
+ return fixup(array);
+ });
+}
+
+exports.default = wrapArrayMutator;
+exports.removeGhostHead = removeGhostHead;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/after.js b/node_modules/jsonpath/node_modules/underscore/cjs/after.js
new file mode 100644
index 00000000..c047e20b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/after.js
@@ -0,0 +1,10 @@
+// Returns a function that will only be executed on and after the Nth call.
+function after(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+}
+
+module.exports = after;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/allKeys.js b/node_modules/jsonpath/node_modules/underscore/cjs/allKeys.js
new file mode 100644
index 00000000..1eb5e842
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/allKeys.js
@@ -0,0 +1,15 @@
+var isObject = require('./isObject.js');
+var _setup = require('./_setup.js');
+var _collectNonEnumProps = require('./_collectNonEnumProps.js');
+
+// Retrieve all the enumerable property names of an object.
+function allKeys(obj) {
+ if (!isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
+ return keys;
+}
+
+module.exports = allKeys;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/before.js b/node_modules/jsonpath/node_modules/underscore/cjs/before.js
new file mode 100644
index 00000000..714a31e3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/before.js
@@ -0,0 +1,14 @@
+// Returns a function that will only be executed up to (but not including) the
+// Nth call.
+function before(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+}
+
+module.exports = before;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/bind.js b/node_modules/jsonpath/node_modules/underscore/cjs/bind.js
new file mode 100644
index 00000000..5fbf408d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/bind.js
@@ -0,0 +1,15 @@
+var isFunction = require('./isFunction.js');
+var _executeBound = require('./_executeBound.js');
+var restArguments = require('./restArguments.js');
+
+// Create a function bound to a given object (assigning `this`, and arguments,
+// optionally).
+var bind = restArguments(function(func, context, args) {
+ if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
+ var bound = restArguments(function(callArgs) {
+ return _executeBound(func, bound, context, this, args.concat(callArgs));
+ });
+ return bound;
+});
+
+module.exports = bind;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/bindAll.js b/node_modules/jsonpath/node_modules/underscore/cjs/bindAll.js
new file mode 100644
index 00000000..6afabdf5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/bindAll.js
@@ -0,0 +1,19 @@
+var _flatten = require('./_flatten.js');
+var restArguments = require('./restArguments.js');
+var bind = require('./bind.js');
+
+// Bind a number of an object's methods to that object. Remaining arguments
+// are the method names to be bound. Useful for ensuring that all callbacks
+// defined on an object belong to it.
+var bindAll = restArguments(function(obj, keys) {
+ keys = _flatten(keys, false, false);
+ var index = keys.length;
+ if (index < 1) throw new Error('bindAll must be passed function names');
+ while (index--) {
+ var key = keys[index];
+ obj[key] = bind(obj[key], obj);
+ }
+ return obj;
+});
+
+module.exports = bindAll;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/chain.js b/node_modules/jsonpath/node_modules/underscore/cjs/chain.js
new file mode 100644
index 00000000..07e35eaf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/chain.js
@@ -0,0 +1,10 @@
+var underscore = require('./underscore.js');
+
+// Start chaining a wrapped Underscore object.
+function chain(obj) {
+ var instance = underscore(obj);
+ instance._chain = true;
+ return instance;
+}
+
+module.exports = chain;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/chunk.js b/node_modules/jsonpath/node_modules/underscore/cjs/chunk.js
new file mode 100644
index 00000000..3e10d88e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/chunk.js
@@ -0,0 +1,15 @@
+var _setup = require('./_setup.js');
+
+// Chunk a single array into multiple arrays, each containing `count` or fewer
+// items.
+function chunk(array, count) {
+ if (count == null || count < 1) return [];
+ var result = [];
+ var i = 0, length = array.length;
+ while (i < length) {
+ result.push(_setup.slice.call(array, i, i += count));
+ }
+ return result;
+}
+
+module.exports = chunk;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/clone.js b/node_modules/jsonpath/node_modules/underscore/cjs/clone.js
new file mode 100644
index 00000000..91b3e5b8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/clone.js
@@ -0,0 +1,11 @@
+var isObject = require('./isObject.js');
+var isArray = require('./isArray.js');
+var extend = require('./extend.js');
+
+// Create a (shallow-cloned) duplicate of an object.
+function clone(obj) {
+ if (!isObject(obj)) return obj;
+ return isArray(obj) ? obj.slice() : extend({}, obj);
+}
+
+module.exports = clone;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/compact.js b/node_modules/jsonpath/node_modules/underscore/cjs/compact.js
new file mode 100644
index 00000000..8fd210e1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/compact.js
@@ -0,0 +1,8 @@
+var filter = require('./filter.js');
+
+// Trim out all falsy values from an array.
+function compact(array) {
+ return filter(array, Boolean);
+}
+
+module.exports = compact;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/compose.js b/node_modules/jsonpath/node_modules/underscore/cjs/compose.js
new file mode 100644
index 00000000..f95f8905
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/compose.js
@@ -0,0 +1,14 @@
+// Returns a function that is the composition of a list of functions, each
+// consuming the return value of the function that follows.
+function compose() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+}
+
+module.exports = compose;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/concat.js b/node_modules/jsonpath/node_modules/underscore/cjs/concat.js
new file mode 100644
index 00000000..b2b0fc7d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/concat.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var concat = _unmethodize(_setup.ArrayProto.concat);
+
+module.exports = concat;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/constant.js b/node_modules/jsonpath/node_modules/underscore/cjs/constant.js
new file mode 100644
index 00000000..0b2904b2
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/constant.js
@@ -0,0 +1,8 @@
+// Predicate-generating function. Often useful outside of Underscore.
+function constant(value) {
+ return function() {
+ return value;
+ };
+}
+
+module.exports = constant;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/contains.js b/node_modules/jsonpath/node_modules/underscore/cjs/contains.js
new file mode 100644
index 00000000..bfe13415
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/contains.js
@@ -0,0 +1,12 @@
+var _isArrayLike = require('./_isArrayLike.js');
+var values = require('./values.js');
+var indexOf = require('./indexOf.js');
+
+// Determine if the array or object contains a given item (using `===`).
+function contains(obj, item, fromIndex, guard) {
+ if (!_isArrayLike(obj)) obj = values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return indexOf(obj, item, fromIndex) >= 0;
+}
+
+module.exports = contains;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/countBy.js b/node_modules/jsonpath/node_modules/underscore/cjs/countBy.js
new file mode 100644
index 00000000..21a80594
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/countBy.js
@@ -0,0 +1,11 @@
+var _has = require('./_has.js');
+var _group = require('./_group.js');
+
+// Counts instances of an object that group by a certain criterion. Pass
+// either a string attribute to count by, or a function that returns the
+// criterion.
+var countBy = _group(function(result, value, key) {
+ if (_has(result, key)) result[key]++; else result[key] = 1;
+});
+
+module.exports = countBy;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/create.js b/node_modules/jsonpath/node_modules/underscore/cjs/create.js
new file mode 100644
index 00000000..68332186
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/create.js
@@ -0,0 +1,13 @@
+var _baseCreate = require('./_baseCreate.js');
+var extendOwn = require('./extendOwn.js');
+
+// Creates an object that inherits from the given prototype object.
+// If additional properties are provided then they will be added to the
+// created object.
+function create(prototype, props) {
+ var result = _baseCreate(prototype);
+ if (props) extendOwn(result, props);
+ return result;
+}
+
+module.exports = create;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/debounce.js b/node_modules/jsonpath/node_modules/underscore/cjs/debounce.js
new file mode 100644
index 00000000..517086c2
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/debounce.js
@@ -0,0 +1,42 @@
+var restArguments = require('./restArguments.js');
+var now = require('./now.js');
+
+// When a sequence of calls of the returned function ends, the argument
+// function is triggered. The end of a sequence is defined by the `wait`
+// parameter. If `immediate` is passed, the argument function will be
+// triggered at the beginning of the sequence instead of at the end.
+function debounce(func, wait, immediate) {
+ var timeout, previous, args, result, context;
+
+ var later = function() {
+ var passed = now() - previous;
+ if (wait > passed) {
+ timeout = setTimeout(later, wait - passed);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ // This check is needed because `func` can recursively invoke `debounced`.
+ if (!timeout) args = context = null;
+ }
+ };
+
+ var debounced = restArguments(function(_args) {
+ context = this;
+ args = _args;
+ previous = now();
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ if (immediate) result = func.apply(context, args);
+ }
+ return result;
+ });
+
+ debounced.cancel = function() {
+ clearTimeout(timeout);
+ timeout = args = context = null;
+ };
+
+ return debounced;
+}
+
+module.exports = debounce;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/defaults.js b/node_modules/jsonpath/node_modules/underscore/cjs/defaults.js
new file mode 100644
index 00000000..180cdd14
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/defaults.js
@@ -0,0 +1,7 @@
+var _createAssigner = require('./_createAssigner.js');
+var allKeys = require('./allKeys.js');
+
+// Fill in a given object with default properties.
+var defaults = _createAssigner(allKeys, true);
+
+module.exports = defaults;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/defer.js b/node_modules/jsonpath/node_modules/underscore/cjs/defer.js
new file mode 100644
index 00000000..1a390643
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/defer.js
@@ -0,0 +1,9 @@
+var underscore = require('./underscore.js');
+var partial = require('./partial.js');
+var delay = require('./delay.js');
+
+// Defers a function, scheduling it to run after the current call stack has
+// cleared.
+var defer = partial(delay, underscore, 1);
+
+module.exports = defer;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/delay.js b/node_modules/jsonpath/node_modules/underscore/cjs/delay.js
new file mode 100644
index 00000000..49b5387e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/delay.js
@@ -0,0 +1,11 @@
+var restArguments = require('./restArguments.js');
+
+// Delays a function for the given number of milliseconds, and then calls
+// it with the arguments supplied.
+var delay = restArguments(function(func, wait, args) {
+ return setTimeout(function() {
+ return func.apply(null, args);
+ }, wait);
+});
+
+module.exports = delay;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/difference.js b/node_modules/jsonpath/node_modules/underscore/cjs/difference.js
new file mode 100644
index 00000000..506b2f4d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/difference.js
@@ -0,0 +1,15 @@
+var _flatten = require('./_flatten.js');
+var restArguments = require('./restArguments.js');
+var filter = require('./filter.js');
+var contains = require('./contains.js');
+
+// Take the difference between one array and a number of other arrays.
+// Only the elements present in just the first array will remain.
+var difference = restArguments(function(array, rest) {
+ rest = _flatten(rest, true, true);
+ return filter(array, function(value){
+ return !contains(rest, value);
+ });
+});
+
+module.exports = difference;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/each.js b/node_modules/jsonpath/node_modules/underscore/cjs/each.js
new file mode 100644
index 00000000..453a5379
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/each.js
@@ -0,0 +1,25 @@
+var keys = require('./keys.js');
+var _optimizeCb = require('./_optimizeCb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+
+// The cornerstone for collection functions, an `each`
+// implementation, aka `forEach`.
+// Handles raw objects in addition to array-likes. Treats all
+// sparse array-likes as if they were dense.
+function each(obj, iteratee, context) {
+ iteratee = _optimizeCb(iteratee, context);
+ var i, length;
+ if (_isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var _keys = keys(obj);
+ for (i = 0, length = _keys.length; i < length; i++) {
+ iteratee(obj[_keys[i]], _keys[i], obj);
+ }
+ }
+ return obj;
+}
+
+module.exports = each;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/escape.js b/node_modules/jsonpath/node_modules/underscore/cjs/escape.js
new file mode 100644
index 00000000..0f29ef8a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/escape.js
@@ -0,0 +1,7 @@
+var _createEscaper = require('./_createEscaper.js');
+var _escapeMap = require('./_escapeMap.js');
+
+// Function for escaping strings to HTML interpolation.
+var _escape = _createEscaper(_escapeMap);
+
+module.exports = _escape;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/every.js b/node_modules/jsonpath/node_modules/underscore/cjs/every.js
new file mode 100644
index 00000000..1ddbdb38
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/every.js
@@ -0,0 +1,17 @@
+var keys = require('./keys.js');
+var _cb = require('./_cb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+
+// Determine whether all of the elements pass a truth test.
+function every(obj, predicate, context) {
+ predicate = _cb(predicate, context);
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+}
+
+module.exports = every;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/extend.js b/node_modules/jsonpath/node_modules/underscore/cjs/extend.js
new file mode 100644
index 00000000..7c5511c5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/extend.js
@@ -0,0 +1,7 @@
+var _createAssigner = require('./_createAssigner.js');
+var allKeys = require('./allKeys.js');
+
+// Extend a given object with all the properties in passed-in object(s).
+var extend = _createAssigner(allKeys);
+
+module.exports = extend;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/extendOwn.js b/node_modules/jsonpath/node_modules/underscore/cjs/extendOwn.js
new file mode 100644
index 00000000..337195a8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/extendOwn.js
@@ -0,0 +1,9 @@
+var _createAssigner = require('./_createAssigner.js');
+var keys = require('./keys.js');
+
+// Assigns a given object with all the own properties in the passed-in
+// object(s).
+// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+var extendOwn = _createAssigner(keys);
+
+module.exports = extendOwn;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/filter.js b/node_modules/jsonpath/node_modules/underscore/cjs/filter.js
new file mode 100644
index 00000000..ba1a0634
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/filter.js
@@ -0,0 +1,14 @@
+var _cb = require('./_cb.js');
+var each = require('./each.js');
+
+// Return all the elements that pass a truth test.
+function filter(obj, predicate, context) {
+ var results = [];
+ predicate = _cb(predicate, context);
+ each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+}
+
+module.exports = filter;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/find.js b/node_modules/jsonpath/node_modules/underscore/cjs/find.js
new file mode 100644
index 00000000..03728b46
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/find.js
@@ -0,0 +1,12 @@
+var _isArrayLike = require('./_isArrayLike.js');
+var findIndex = require('./findIndex.js');
+var findKey = require('./findKey.js');
+
+// Return the first value which passes a truth test.
+function find(obj, predicate, context) {
+ var keyFinder = _isArrayLike(obj) ? findIndex : findKey;
+ var key = keyFinder(obj, predicate, context);
+ if (key !== void 0 && key !== -1) return obj[key];
+}
+
+module.exports = find;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/findIndex.js b/node_modules/jsonpath/node_modules/underscore/cjs/findIndex.js
new file mode 100644
index 00000000..e5a1fecd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/findIndex.js
@@ -0,0 +1,6 @@
+var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js');
+
+// Returns the first index on an array-like that passes a truth test.
+var findIndex = _createPredicateIndexFinder(1);
+
+module.exports = findIndex;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/findKey.js b/node_modules/jsonpath/node_modules/underscore/cjs/findKey.js
new file mode 100644
index 00000000..56b8a094
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/findKey.js
@@ -0,0 +1,14 @@
+var keys = require('./keys.js');
+var _cb = require('./_cb.js');
+
+// Returns the first key on an object that passes a truth test.
+function findKey(obj, predicate, context) {
+ predicate = _cb(predicate, context);
+ var _keys = keys(obj), key;
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ key = _keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+}
+
+module.exports = findKey;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/findLastIndex.js b/node_modules/jsonpath/node_modules/underscore/cjs/findLastIndex.js
new file mode 100644
index 00000000..c9165cba
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/findLastIndex.js
@@ -0,0 +1,6 @@
+var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js');
+
+// Returns the last index on an array-like that passes a truth test.
+var findLastIndex = _createPredicateIndexFinder(-1);
+
+module.exports = findLastIndex;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/findWhere.js b/node_modules/jsonpath/node_modules/underscore/cjs/findWhere.js
new file mode 100644
index 00000000..29d0b387
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/findWhere.js
@@ -0,0 +1,10 @@
+var matcher = require('./matcher.js');
+var find = require('./find.js');
+
+// Convenience version of a common use case of `_.find`: getting the first
+// object containing specific `key:value` pairs.
+function findWhere(obj, attrs) {
+ return find(obj, matcher(attrs));
+}
+
+module.exports = findWhere;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/first.js b/node_modules/jsonpath/node_modules/underscore/cjs/first.js
new file mode 100644
index 00000000..82b68463
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/first.js
@@ -0,0 +1,11 @@
+var initial = require('./initial.js');
+
+// Get the first element of an array. Passing **n** will return the first N
+// values in the array. The **guard** check allows it to work with `_.map`.
+function first(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[0];
+ return initial(array, array.length - n);
+}
+
+module.exports = first;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/flatten.js b/node_modules/jsonpath/node_modules/underscore/cjs/flatten.js
new file mode 100644
index 00000000..b8878390
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/flatten.js
@@ -0,0 +1,9 @@
+var _flatten = require('./_flatten.js');
+
+// Flatten out an array, either recursively (by default), or up to `depth`.
+// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+function flatten(array, depth) {
+ return _flatten(array, depth, false);
+}
+
+module.exports = flatten;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/functions.js b/node_modules/jsonpath/node_modules/underscore/cjs/functions.js
new file mode 100644
index 00000000..f9afb43b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/functions.js
@@ -0,0 +1,12 @@
+var isFunction = require('./isFunction.js');
+
+// Return a sorted list of the function names available on the object.
+function functions(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+}
+
+module.exports = functions;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/get.js b/node_modules/jsonpath/node_modules/underscore/cjs/get.js
new file mode 100644
index 00000000..aee8d299
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/get.js
@@ -0,0 +1,14 @@
+var _deepGet = require('./_deepGet.js');
+var _toPath = require('./_toPath.js');
+var isUndefined = require('./isUndefined.js');
+
+// Get the value of the (deep) property on `path` from `object`.
+// If any property in `path` does not exist or if the value is
+// `undefined`, return `defaultValue` instead.
+// The `path` is normalized through `_.toPath`.
+function get(object, path, defaultValue) {
+ var value = _deepGet(object, _toPath(path));
+ return isUndefined(value) ? defaultValue : value;
+}
+
+module.exports = get;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/groupBy.js b/node_modules/jsonpath/node_modules/underscore/cjs/groupBy.js
new file mode 100644
index 00000000..4f3276a1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/groupBy.js
@@ -0,0 +1,10 @@
+var _has = require('./_has.js');
+var _group = require('./_group.js');
+
+// Groups the object's values by a criterion. Pass either a string attribute
+// to group by, or a function that returns the criterion.
+var groupBy = _group(function(result, value, key) {
+ if (_has(result, key)) result[key].push(value); else result[key] = [value];
+});
+
+module.exports = groupBy;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/has.js b/node_modules/jsonpath/node_modules/underscore/cjs/has.js
new file mode 100644
index 00000000..26c123d1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/has.js
@@ -0,0 +1,18 @@
+var _has = require('./_has.js');
+var _toPath = require('./_toPath.js');
+
+// Shortcut function for checking if an object has a given property directly on
+// itself (in other words, not on a prototype). Unlike the internal `has`
+// function, this public version can also traverse nested properties.
+function has(obj, path) {
+ path = _toPath(path);
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ var key = path[i];
+ if (!_has(obj, key)) return false;
+ obj = obj[key];
+ }
+ return !!length;
+}
+
+module.exports = has;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/identity.js b/node_modules/jsonpath/node_modules/underscore/cjs/identity.js
new file mode 100644
index 00000000..d65566a1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/identity.js
@@ -0,0 +1,6 @@
+// Keep the identity function around for default iteratees.
+function identity(value) {
+ return value;
+}
+
+module.exports = identity;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/index-default.js b/node_modules/jsonpath/node_modules/underscore/cjs/index-default.js
new file mode 100644
index 00000000..a833ee2b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/index-default.js
@@ -0,0 +1,11 @@
+var mixin = require('./mixin.js');
+var index = require('./index.js');
+
+// Default Export
+
+// Add all of the Underscore functions to the wrapper object.
+var _ = mixin(index);
+// Legacy Node.js API.
+_._ = _;
+
+module.exports = _;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/index.js b/node_modules/jsonpath/node_modules/underscore/cjs/index.js
new file mode 100644
index 00000000..fb746772
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/index.js
@@ -0,0 +1,277 @@
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var isObject = require('./isObject.js');
+var _setup = require('./_setup.js');
+var identity = require('./identity.js');
+var isFunction = require('./isFunction.js');
+var isArray = require('./isArray.js');
+var keys = require('./keys.js');
+var extendOwn = require('./extendOwn.js');
+var isMatch = require('./isMatch.js');
+var matcher = require('./matcher.js');
+var toPath$1 = require('./toPath.js');
+var property = require('./property.js');
+var iteratee = require('./iteratee.js');
+var isNumber = require('./isNumber.js');
+var _isNaN = require('./isNaN.js');
+var isArguments = require('./isArguments.js');
+var each = require('./each.js');
+var allKeys = require('./allKeys.js');
+var invert = require('./invert.js');
+var after = require('./after.js');
+var before = require('./before.js');
+var restArguments = require('./restArguments.js');
+var bind = require('./bind.js');
+var bindAll = require('./bindAll.js');
+var chain = require('./chain.js');
+var chunk = require('./chunk.js');
+var extend = require('./extend.js');
+var clone = require('./clone.js');
+var filter = require('./filter.js');
+var compact = require('./compact.js');
+var compose = require('./compose.js');
+var constant = require('./constant.js');
+var values = require('./values.js');
+var sortedIndex = require('./sortedIndex.js');
+var findIndex = require('./findIndex.js');
+var indexOf = require('./indexOf.js');
+var contains = require('./contains.js');
+var countBy = require('./countBy.js');
+var create = require('./create.js');
+var now = require('./now.js');
+var debounce = require('./debounce.js');
+var defaults = require('./defaults.js');
+var partial = require('./partial.js');
+var delay = require('./delay.js');
+var defer = require('./defer.js');
+var difference = require('./difference.js');
+var _escape = require('./escape.js');
+var every = require('./every.js');
+var findKey = require('./findKey.js');
+var find = require('./find.js');
+var findLastIndex = require('./findLastIndex.js');
+var findWhere = require('./findWhere.js');
+var initial = require('./initial.js');
+var first = require('./first.js');
+var flatten = require('./flatten.js');
+var functions = require('./functions.js');
+var isUndefined = require('./isUndefined.js');
+var get = require('./get.js');
+var groupBy = require('./groupBy.js');
+var has = require('./has.js');
+var isNull = require('./isNull.js');
+var isBoolean = require('./isBoolean.js');
+var isElement = require('./isElement.js');
+var isString = require('./isString.js');
+var isDate = require('./isDate.js');
+var isRegExp = require('./isRegExp.js');
+var isError = require('./isError.js');
+var isSymbol = require('./isSymbol.js');
+var isArrayBuffer = require('./isArrayBuffer.js');
+var isDataView = require('./isDataView.js');
+var _isFinite = require('./isFinite.js');
+var isTypedArray = require('./isTypedArray.js');
+var isEmpty = require('./isEmpty.js');
+var isEqual = require('./isEqual.js');
+var isMap = require('./isMap.js');
+var isWeakMap = require('./isWeakMap.js');
+var isSet = require('./isSet.js');
+var isWeakSet = require('./isWeakSet.js');
+var pairs = require('./pairs.js');
+var tap = require('./tap.js');
+var mapObject = require('./mapObject.js');
+var noop = require('./noop.js');
+var propertyOf = require('./propertyOf.js');
+var times = require('./times.js');
+var random = require('./random.js');
+var _unescape = require('./unescape.js');
+var templateSettings = require('./templateSettings.js');
+var template = require('./template.js');
+var result = require('./result.js');
+var uniqueId = require('./uniqueId.js');
+var memoize = require('./memoize.js');
+var throttle = require('./throttle.js');
+var wrap = require('./wrap.js');
+var negate = require('./negate.js');
+var once = require('./once.js');
+var lastIndexOf = require('./lastIndexOf.js');
+var map = require('./map.js');
+var reduce = require('./reduce.js');
+var reduceRight = require('./reduceRight.js');
+var reject = require('./reject.js');
+var some = require('./some.js');
+var invoke = require('./invoke.js');
+var pluck = require('./pluck.js');
+var where = require('./where.js');
+var max = require('./max.js');
+var min = require('./min.js');
+var sample = require('./sample.js');
+var shuffle = require('./shuffle.js');
+var sortBy = require('./sortBy.js');
+var indexBy = require('./indexBy.js');
+var partition = require('./partition.js');
+var toArray = require('./toArray.js');
+var size = require('./size.js');
+var pick = require('./pick.js');
+var omit = require('./omit.js');
+var rest = require('./rest.js');
+var last = require('./last.js');
+var without = require('./without.js');
+var uniq = require('./uniq.js');
+var union = require('./union.js');
+var intersection = require('./intersection.js');
+var unzip = require('./unzip.js');
+var zip = require('./zip.js');
+var object = require('./object.js');
+var range = require('./range.js');
+var mixin = require('./mixin.js');
+var underscoreArrayMethods = require('./underscore-array-methods.js');
+
+// Named Exports
+
+exports.isObject = isObject;
+exports.VERSION = _setup.VERSION;
+exports.identity = identity;
+exports.isFunction = isFunction;
+exports.isArray = isArray;
+exports.keys = keys;
+exports.assign = extendOwn;
+exports.extendOwn = extendOwn;
+exports.isMatch = isMatch;
+exports.matcher = matcher;
+exports.matches = matcher;
+exports.toPath = toPath$1;
+exports.property = property;
+exports.iteratee = iteratee;
+exports.isNumber = isNumber;
+exports.isNaN = _isNaN;
+exports.isArguments = isArguments;
+exports.each = each;
+exports.forEach = each;
+exports.allKeys = allKeys;
+exports.invert = invert;
+exports.after = after;
+exports.before = before;
+exports.restArguments = restArguments;
+exports.bind = bind;
+exports.bindAll = bindAll;
+exports.chain = chain;
+exports.chunk = chunk;
+exports.extend = extend;
+exports.clone = clone;
+exports.filter = filter;
+exports.select = filter;
+exports.compact = compact;
+exports.compose = compose;
+exports.constant = constant;
+exports.values = values;
+exports.sortedIndex = sortedIndex;
+exports.findIndex = findIndex;
+exports.indexOf = indexOf;
+exports.contains = contains;
+exports.include = contains;
+exports.includes = contains;
+exports.countBy = countBy;
+exports.create = create;
+exports.now = now;
+exports.debounce = debounce;
+exports.defaults = defaults;
+exports.partial = partial;
+exports.delay = delay;
+exports.defer = defer;
+exports.difference = difference;
+exports.escape = _escape;
+exports.all = every;
+exports.every = every;
+exports.findKey = findKey;
+exports.detect = find;
+exports.find = find;
+exports.findLastIndex = findLastIndex;
+exports.findWhere = findWhere;
+exports.initial = initial;
+exports.first = first;
+exports.head = first;
+exports.take = first;
+exports.flatten = flatten;
+exports.functions = functions;
+exports.methods = functions;
+exports.isUndefined = isUndefined;
+exports.get = get;
+exports.groupBy = groupBy;
+exports.has = has;
+exports.isNull = isNull;
+exports.isBoolean = isBoolean;
+exports.isElement = isElement;
+exports.isString = isString;
+exports.isDate = isDate;
+exports.isRegExp = isRegExp;
+exports.isError = isError;
+exports.isSymbol = isSymbol;
+exports.isArrayBuffer = isArrayBuffer;
+exports.isDataView = isDataView;
+exports.isFinite = _isFinite;
+exports.isTypedArray = isTypedArray;
+exports.isEmpty = isEmpty;
+exports.isEqual = isEqual;
+exports.isMap = isMap;
+exports.isWeakMap = isWeakMap;
+exports.isSet = isSet;
+exports.isWeakSet = isWeakSet;
+exports.pairs = pairs;
+exports.tap = tap;
+exports.mapObject = mapObject;
+exports.noop = noop;
+exports.propertyOf = propertyOf;
+exports.times = times;
+exports.random = random;
+exports.unescape = _unescape;
+exports.templateSettings = templateSettings;
+exports.template = template;
+exports.result = result;
+exports.uniqueId = uniqueId;
+exports.memoize = memoize;
+exports.throttle = throttle;
+exports.wrap = wrap;
+exports.negate = negate;
+exports.once = once;
+exports.lastIndexOf = lastIndexOf;
+exports.collect = map;
+exports.map = map;
+exports.foldl = reduce;
+exports.inject = reduce;
+exports.reduce = reduce;
+exports.foldr = reduceRight;
+exports.reduceRight = reduceRight;
+exports.reject = reject;
+exports.any = some;
+exports.some = some;
+exports.invoke = invoke;
+exports.pluck = pluck;
+exports.where = where;
+exports.max = max;
+exports.min = min;
+exports.sample = sample;
+exports.shuffle = shuffle;
+exports.sortBy = sortBy;
+exports.indexBy = indexBy;
+exports.partition = partition;
+exports.toArray = toArray;
+exports.size = size;
+exports.pick = pick;
+exports.omit = omit;
+exports.drop = rest;
+exports.rest = rest;
+exports.tail = rest;
+exports.last = last;
+exports.without = without;
+exports.uniq = uniq;
+exports.unique = uniq;
+exports.union = union;
+exports.intersection = intersection;
+exports.transpose = unzip;
+exports.unzip = unzip;
+exports.zip = zip;
+exports.object = object;
+exports.range = range;
+exports.mixin = mixin;
+exports.default = underscoreArrayMethods;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/indexBy.js b/node_modules/jsonpath/node_modules/underscore/cjs/indexBy.js
new file mode 100644
index 00000000..89ff21af
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/indexBy.js
@@ -0,0 +1,9 @@
+var _group = require('./_group.js');
+
+// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+// when you know that your index values will be unique.
+var indexBy = _group(function(result, value, key) {
+ result[key] = value;
+});
+
+module.exports = indexBy;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/indexOf.js b/node_modules/jsonpath/node_modules/underscore/cjs/indexOf.js
new file mode 100644
index 00000000..1367d8b0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/indexOf.js
@@ -0,0 +1,11 @@
+var _createIndexFinder = require('./_createIndexFinder.js');
+var sortedIndex = require('./sortedIndex.js');
+var findIndex = require('./findIndex.js');
+
+// Return the position of the first occurrence of an item in an array,
+// or -1 if the item is not included in the array.
+// If the array is large and already in sort order, pass `true`
+// for **isSorted** to use binary search.
+var indexOf = _createIndexFinder(1, findIndex, sortedIndex);
+
+module.exports = indexOf;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/initial.js b/node_modules/jsonpath/node_modules/underscore/cjs/initial.js
new file mode 100644
index 00000000..9db2cd28
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/initial.js
@@ -0,0 +1,10 @@
+var _setup = require('./_setup.js');
+
+// Returns everything but the last entry of the array. Especially useful on
+// the arguments object. Passing **n** will return all the values in
+// the array, excluding the last N.
+function initial(array, n, guard) {
+ return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+}
+
+module.exports = initial;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/intersection.js b/node_modules/jsonpath/node_modules/underscore/cjs/intersection.js
new file mode 100644
index 00000000..e28fe2fd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/intersection.js
@@ -0,0 +1,21 @@
+var _getLength = require('./_getLength.js');
+var contains = require('./contains.js');
+
+// Produce an array that contains every item shared between all the
+// passed-in arrays.
+function intersection(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = _getLength(array); i < length; i++) {
+ var item = array[i];
+ if (contains(result, item)) continue;
+ var j;
+ for (j = 1; j < argsLength; j++) {
+ if (!contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+}
+
+module.exports = intersection;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/invert.js b/node_modules/jsonpath/node_modules/underscore/cjs/invert.js
new file mode 100644
index 00000000..a0c51506
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/invert.js
@@ -0,0 +1,13 @@
+var keys = require('./keys.js');
+
+// Invert the keys and values of an object. The values must be serializable.
+function invert(obj) {
+ var result = {};
+ var _keys = keys(obj);
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ result[obj[_keys[i]]] = _keys[i];
+ }
+ return result;
+}
+
+module.exports = invert;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/invoke.js b/node_modules/jsonpath/node_modules/underscore/cjs/invoke.js
new file mode 100644
index 00000000..826d925a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/invoke.js
@@ -0,0 +1,30 @@
+var isFunction = require('./isFunction.js');
+var _deepGet = require('./_deepGet.js');
+var _toPath = require('./_toPath.js');
+var restArguments = require('./restArguments.js');
+var map = require('./map.js');
+
+// Invoke a method (with arguments) on every item in a collection.
+var invoke = restArguments(function(obj, path, args) {
+ var contextPath, func;
+ if (isFunction(path)) {
+ func = path;
+ } else {
+ path = _toPath(path);
+ contextPath = path.slice(0, -1);
+ path = path[path.length - 1];
+ }
+ return map(obj, function(context) {
+ var method = func;
+ if (!method) {
+ if (contextPath && contextPath.length) {
+ context = _deepGet(context, contextPath);
+ }
+ if (context == null) return void 0;
+ method = context[path];
+ }
+ return method == null ? method : method.apply(context, args);
+ });
+});
+
+module.exports = invoke;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isArguments.js b/node_modules/jsonpath/node_modules/underscore/cjs/isArguments.js
new file mode 100644
index 00000000..8b33b111
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isArguments.js
@@ -0,0 +1,18 @@
+var _tagTester = require('./_tagTester.js');
+var _has = require('./_has.js');
+
+var isArguments = _tagTester('Arguments');
+
+// Define a fallback version of the method in browsers (ahem, IE < 9), where
+// there isn't any inspectable "Arguments" type.
+(function() {
+ if (!isArguments(arguments)) {
+ isArguments = function(obj) {
+ return _has(obj, 'callee');
+ };
+ }
+}());
+
+var isArguments$1 = isArguments;
+
+module.exports = isArguments$1;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isArray.js b/node_modules/jsonpath/node_modules/underscore/cjs/isArray.js
new file mode 100644
index 00000000..abcdad3a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isArray.js
@@ -0,0 +1,8 @@
+var _setup = require('./_setup.js');
+var _tagTester = require('./_tagTester.js');
+
+// Is a given value an array?
+// Delegates to ECMA5's native `Array.isArray`.
+var isArray = _setup.nativeIsArray || _tagTester('Array');
+
+module.exports = isArray;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isArrayBuffer.js b/node_modules/jsonpath/node_modules/underscore/cjs/isArrayBuffer.js
new file mode 100644
index 00000000..c69523f3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isArrayBuffer.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isArrayBuffer = _tagTester('ArrayBuffer');
+
+module.exports = isArrayBuffer;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isBoolean.js b/node_modules/jsonpath/node_modules/underscore/cjs/isBoolean.js
new file mode 100644
index 00000000..29b82d81
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isBoolean.js
@@ -0,0 +1,8 @@
+var _setup = require('./_setup.js');
+
+// Is a given value a boolean?
+function isBoolean(obj) {
+ return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]';
+}
+
+module.exports = isBoolean;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isDataView.js b/node_modules/jsonpath/node_modules/underscore/cjs/isDataView.js
new file mode 100644
index 00000000..d70af105
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isDataView.js
@@ -0,0 +1,16 @@
+var _tagTester = require('./_tagTester.js');
+var isFunction = require('./isFunction.js');
+var _stringTagBug = require('./_stringTagBug.js');
+var isArrayBuffer = require('./isArrayBuffer.js');
+
+var isDataView = _tagTester('DataView');
+
+// In IE 10 - Edge 13, we need a different heuristic
+// to determine whether an object is a `DataView`.
+function ie10IsDataView(obj) {
+ return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);
+}
+
+var isDataView$1 = (_stringTagBug.hasStringTagBug ? ie10IsDataView : isDataView);
+
+module.exports = isDataView$1;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isDate.js b/node_modules/jsonpath/node_modules/underscore/cjs/isDate.js
new file mode 100644
index 00000000..e342bc90
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isDate.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isDate = _tagTester('Date');
+
+module.exports = isDate;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isElement.js b/node_modules/jsonpath/node_modules/underscore/cjs/isElement.js
new file mode 100644
index 00000000..13b63ccf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isElement.js
@@ -0,0 +1,6 @@
+// Is a given value a DOM element?
+function isElement(obj) {
+ return !!(obj && obj.nodeType === 1);
+}
+
+module.exports = isElement;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isEmpty.js b/node_modules/jsonpath/node_modules/underscore/cjs/isEmpty.js
new file mode 100644
index 00000000..a76d756b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isEmpty.js
@@ -0,0 +1,20 @@
+var isArray = require('./isArray.js');
+var keys = require('./keys.js');
+var _getLength = require('./_getLength.js');
+var isArguments = require('./isArguments.js');
+var isString = require('./isString.js');
+
+// Is a given array, string, or object empty?
+// An "empty" object has no enumerable own-properties.
+function isEmpty(obj) {
+ if (obj == null) return true;
+ // Skip the more expensive `toString`-based type checks if `obj` has no
+ // `.length`.
+ var length = _getLength(obj);
+ if (typeof length == 'number' && (
+ isArray(obj) || isString(obj) || isArguments(obj)
+ )) return length === 0;
+ return _getLength(keys(obj)) === 0;
+}
+
+module.exports = isEmpty;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isEqual.js b/node_modules/jsonpath/node_modules/underscore/cjs/isEqual.js
new file mode 100644
index 00000000..3f896c41
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isEqual.js
@@ -0,0 +1,140 @@
+var _setup = require('./_setup.js');
+var isFunction = require('./isFunction.js');
+var _has = require('./_has.js');
+var keys = require('./keys.js');
+var underscore = require('./underscore.js');
+var _getByteLength = require('./_getByteLength.js');
+var _stringTagBug = require('./_stringTagBug.js');
+var _toBufferView = require('./_toBufferView.js');
+var isDataView = require('./isDataView.js');
+var isTypedArray = require('./isTypedArray.js');
+
+// We use this string twice, so give it a name for minification.
+var tagDataView = '[object DataView]';
+
+// Internal recursive comparison function for `_.isEqual`.
+function eq(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // `null` or `undefined` only equal to itself (strict comparison).
+ if (a == null || b == null) return false;
+ // `NaN`s are equivalent, but non-reflexive.
+ if (a !== a) return b !== b;
+ // Exhaust primitive checks
+ var type = typeof a;
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+ return deepEq(a, b, aStack, bStack);
+}
+
+// Internal recursive comparison function for `_.isEqual`.
+function deepEq(a, b, aStack, bStack) {
+ // Unwrap any wrapped objects.
+ if (a instanceof underscore) a = a._wrapped;
+ if (b instanceof underscore) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = _setup.toString.call(a);
+ if (className !== _setup.toString.call(b)) return false;
+ // Work around a bug in IE 10 - Edge 13.
+ if (_stringTagBug.hasStringTagBug && className == '[object Object]' && isDataView(a)) {
+ if (!isDataView(b)) return false;
+ className = tagDataView;
+ }
+ switch (className) {
+ // These types are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN.
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ case '[object Symbol]':
+ return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b);
+ case '[object ArrayBuffer]':
+ case tagDataView:
+ // Coerce to typed array so we can fall through.
+ return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack);
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays && isTypedArray(a)) {
+ var byteLength = _getByteLength(a);
+ if (byteLength !== _getByteLength(b)) return false;
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+ areArrays = true;
+ }
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
+ isFunction(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var _keys = keys(a), key;
+ length = _keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = _keys[length];
+ if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+}
+
+// Perform a deep comparison to check if two objects are equal.
+function isEqual(a, b) {
+ return eq(a, b);
+}
+
+module.exports = isEqual;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isError.js b/node_modules/jsonpath/node_modules/underscore/cjs/isError.js
new file mode 100644
index 00000000..a2df9142
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isError.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isError = _tagTester('Error');
+
+module.exports = isError;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isFinite.js b/node_modules/jsonpath/node_modules/underscore/cjs/isFinite.js
new file mode 100644
index 00000000..5359c3a6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isFinite.js
@@ -0,0 +1,9 @@
+var _setup = require('./_setup.js');
+var isSymbol = require('./isSymbol.js');
+
+// Is a given object a finite number?
+function isFinite(obj) {
+ return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj));
+}
+
+module.exports = isFinite;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isFunction.js b/node_modules/jsonpath/node_modules/underscore/cjs/isFunction.js
new file mode 100644
index 00000000..43f94d9c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isFunction.js
@@ -0,0 +1,17 @@
+var _setup = require('./_setup.js');
+var _tagTester = require('./_tagTester.js');
+
+var isFunction = _tagTester('Function');
+
+// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+var nodelist = _setup.root.document && _setup.root.document.childNodes;
+if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+ isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+}
+
+var isFunction$1 = isFunction;
+
+module.exports = isFunction$1;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isMap.js b/node_modules/jsonpath/node_modules/underscore/cjs/isMap.js
new file mode 100644
index 00000000..38b81ca7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isMap.js
@@ -0,0 +1,7 @@
+var _tagTester = require('./_tagTester.js');
+var _methodFingerprint = require('./_methodFingerprint.js');
+var _stringTagBug = require('./_stringTagBug.js');
+
+var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map');
+
+module.exports = isMap;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isMatch.js b/node_modules/jsonpath/node_modules/underscore/cjs/isMatch.js
new file mode 100644
index 00000000..7b6c5000
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isMatch.js
@@ -0,0 +1,15 @@
+var keys = require('./keys.js');
+
+// Returns whether an object has a given set of `key:value` pairs.
+function isMatch(object, attrs) {
+ var _keys = keys(attrs), length = _keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = _keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+}
+
+module.exports = isMatch;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isNaN.js b/node_modules/jsonpath/node_modules/underscore/cjs/isNaN.js
new file mode 100644
index 00000000..f6ade7e8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isNaN.js
@@ -0,0 +1,9 @@
+var _setup = require('./_setup.js');
+var isNumber = require('./isNumber.js');
+
+// Is the given value `NaN`?
+function isNaN(obj) {
+ return isNumber(obj) && _setup._isNaN(obj);
+}
+
+module.exports = isNaN;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isNull.js b/node_modules/jsonpath/node_modules/underscore/cjs/isNull.js
new file mode 100644
index 00000000..43705a42
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isNull.js
@@ -0,0 +1,6 @@
+// Is a given value equal to null?
+function isNull(obj) {
+ return obj === null;
+}
+
+module.exports = isNull;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isNumber.js b/node_modules/jsonpath/node_modules/underscore/cjs/isNumber.js
new file mode 100644
index 00000000..52d5b448
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isNumber.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isNumber = _tagTester('Number');
+
+module.exports = isNumber;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isObject.js b/node_modules/jsonpath/node_modules/underscore/cjs/isObject.js
new file mode 100644
index 00000000..10f6aef7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isObject.js
@@ -0,0 +1,7 @@
+// Is a given variable an object?
+function isObject(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+}
+
+module.exports = isObject;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isRegExp.js b/node_modules/jsonpath/node_modules/underscore/cjs/isRegExp.js
new file mode 100644
index 00000000..3026bab9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isRegExp.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isRegExp = _tagTester('RegExp');
+
+module.exports = isRegExp;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isSet.js b/node_modules/jsonpath/node_modules/underscore/cjs/isSet.js
new file mode 100644
index 00000000..3a468090
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isSet.js
@@ -0,0 +1,7 @@
+var _tagTester = require('./_tagTester.js');
+var _methodFingerprint = require('./_methodFingerprint.js');
+var _stringTagBug = require('./_stringTagBug.js');
+
+var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set');
+
+module.exports = isSet;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isString.js b/node_modules/jsonpath/node_modules/underscore/cjs/isString.js
new file mode 100644
index 00000000..c7c38874
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isString.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isString = _tagTester('String');
+
+module.exports = isString;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isSymbol.js b/node_modules/jsonpath/node_modules/underscore/cjs/isSymbol.js
new file mode 100644
index 00000000..140a54ef
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isSymbol.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isSymbol = _tagTester('Symbol');
+
+module.exports = isSymbol;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isTypedArray.js b/node_modules/jsonpath/node_modules/underscore/cjs/isTypedArray.js
new file mode 100644
index 00000000..99e7b3fb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isTypedArray.js
@@ -0,0 +1,17 @@
+var _setup = require('./_setup.js');
+var _isBufferLike = require('./_isBufferLike.js');
+var constant = require('./constant.js');
+var isDataView = require('./isDataView.js');
+
+// Is a given value a typed array?
+var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+function isTypedArray(obj) {
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+ // Otherwise, fall back on the above regular expression.
+ return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) :
+ _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj));
+}
+
+var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false);
+
+module.exports = isTypedArray$1;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isUndefined.js b/node_modules/jsonpath/node_modules/underscore/cjs/isUndefined.js
new file mode 100644
index 00000000..e59c968b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isUndefined.js
@@ -0,0 +1,6 @@
+// Is a given variable undefined?
+function isUndefined(obj) {
+ return obj === void 0;
+}
+
+module.exports = isUndefined;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isWeakMap.js b/node_modules/jsonpath/node_modules/underscore/cjs/isWeakMap.js
new file mode 100644
index 00000000..203d9b8a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isWeakMap.js
@@ -0,0 +1,7 @@
+var _tagTester = require('./_tagTester.js');
+var _methodFingerprint = require('./_methodFingerprint.js');
+var _stringTagBug = require('./_stringTagBug.js');
+
+var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap');
+
+module.exports = isWeakMap;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/isWeakSet.js b/node_modules/jsonpath/node_modules/underscore/cjs/isWeakSet.js
new file mode 100644
index 00000000..06104ea6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/isWeakSet.js
@@ -0,0 +1,5 @@
+var _tagTester = require('./_tagTester.js');
+
+var isWeakSet = _tagTester('WeakSet');
+
+module.exports = isWeakSet;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/iteratee.js b/node_modules/jsonpath/node_modules/underscore/cjs/iteratee.js
new file mode 100644
index 00000000..52b52758
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/iteratee.js
@@ -0,0 +1,12 @@
+var underscore = require('./underscore.js');
+var _baseIteratee = require('./_baseIteratee.js');
+
+// External wrapper for our callback generator. Users may customize
+// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+// This abstraction hides the internal-only `argCount` argument.
+function iteratee(value, context) {
+ return _baseIteratee(value, context, Infinity);
+}
+underscore.iteratee = iteratee;
+
+module.exports = iteratee;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/join.js b/node_modules/jsonpath/node_modules/underscore/cjs/join.js
new file mode 100644
index 00000000..76d8ee2a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/join.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var join = _unmethodize(_setup.ArrayProto.join);
+
+module.exports = join;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/keys.js b/node_modules/jsonpath/node_modules/underscore/cjs/keys.js
new file mode 100644
index 00000000..9caff250
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/keys.js
@@ -0,0 +1,18 @@
+var isObject = require('./isObject.js');
+var _setup = require('./_setup.js');
+var _has = require('./_has.js');
+var _collectNonEnumProps = require('./_collectNonEnumProps.js');
+
+// Retrieve the names of an object's own properties.
+// Delegates to **ECMAScript 5**'s native `Object.keys`.
+function keys(obj) {
+ if (!isObject(obj)) return [];
+ if (_setup.nativeKeys) return _setup.nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (_has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
+ return keys;
+}
+
+module.exports = keys;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/last.js b/node_modules/jsonpath/node_modules/underscore/cjs/last.js
new file mode 100644
index 00000000..9a9ff6d1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/last.js
@@ -0,0 +1,11 @@
+var rest = require('./rest.js');
+
+// Get the last element of an array. Passing **n** will return the last N
+// values in the array.
+function last(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[array.length - 1];
+ return rest(array, Math.max(0, array.length - n));
+}
+
+module.exports = last;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/lastIndexOf.js b/node_modules/jsonpath/node_modules/underscore/cjs/lastIndexOf.js
new file mode 100644
index 00000000..5cd5143c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/lastIndexOf.js
@@ -0,0 +1,8 @@
+var _createIndexFinder = require('./_createIndexFinder.js');
+var findLastIndex = require('./findLastIndex.js');
+
+// Return the position of the last occurrence of an item in an array,
+// or -1 if the item is not included in the array.
+var lastIndexOf = _createIndexFinder(-1, findLastIndex);
+
+module.exports = lastIndexOf;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/map.js b/node_modules/jsonpath/node_modules/underscore/cjs/map.js
new file mode 100644
index 00000000..b78d1c94
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/map.js
@@ -0,0 +1,18 @@
+var keys = require('./keys.js');
+var _cb = require('./_cb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+
+// Return the results of applying the iteratee to each element.
+function map(obj, iteratee, context) {
+ iteratee = _cb(iteratee, context);
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+}
+
+module.exports = map;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/mapObject.js b/node_modules/jsonpath/node_modules/underscore/cjs/mapObject.js
new file mode 100644
index 00000000..a890dfdf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/mapObject.js
@@ -0,0 +1,18 @@
+var keys = require('./keys.js');
+var _cb = require('./_cb.js');
+
+// Returns the results of applying the `iteratee` to each element of `obj`.
+// In contrast to `_.map` it returns an object.
+function mapObject(obj, iteratee, context) {
+ iteratee = _cb(iteratee, context);
+ var _keys = keys(obj),
+ length = _keys.length,
+ results = {};
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+}
+
+module.exports = mapObject;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/matcher.js b/node_modules/jsonpath/node_modules/underscore/cjs/matcher.js
new file mode 100644
index 00000000..579f8a8d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/matcher.js
@@ -0,0 +1,13 @@
+var extendOwn = require('./extendOwn.js');
+var isMatch = require('./isMatch.js');
+
+// Returns a predicate for checking whether an object has a given set of
+// `key:value` pairs.
+function matcher(attrs) {
+ attrs = extendOwn({}, attrs);
+ return function(obj) {
+ return isMatch(obj, attrs);
+ };
+}
+
+module.exports = matcher;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/max.js b/node_modules/jsonpath/node_modules/underscore/cjs/max.js
new file mode 100644
index 00000000..2e86ae58
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/max.js
@@ -0,0 +1,31 @@
+var _cb = require('./_cb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+var each = require('./each.js');
+var values = require('./values.js');
+
+// Return the maximum element (or element-based computation).
+function max(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = _isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = _cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+}
+
+module.exports = max;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/memoize.js b/node_modules/jsonpath/node_modules/underscore/cjs/memoize.js
new file mode 100644
index 00000000..9d5b4e2d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/memoize.js
@@ -0,0 +1,15 @@
+var _has = require('./_has.js');
+
+// Memoize an expensive function by storing its results.
+function memoize(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!_has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+}
+
+module.exports = memoize;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/min.js b/node_modules/jsonpath/node_modules/underscore/cjs/min.js
new file mode 100644
index 00000000..680fdfb8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/min.js
@@ -0,0 +1,31 @@
+var _cb = require('./_cb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+var each = require('./each.js');
+var values = require('./values.js');
+
+// Return the minimum element (or element-based computation).
+function min(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = _isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = _cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+}
+
+module.exports = min;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/mixin.js b/node_modules/jsonpath/node_modules/underscore/cjs/mixin.js
new file mode 100644
index 00000000..fdd61a36
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/mixin.js
@@ -0,0 +1,20 @@
+var _setup = require('./_setup.js');
+var underscore = require('./underscore.js');
+var _chainResult = require('./_chainResult.js');
+var each = require('./each.js');
+var functions = require('./functions.js');
+
+// Add your own custom functions to the Underscore object.
+function mixin(obj) {
+ each(functions(obj), function(name) {
+ var func = underscore[name] = obj[name];
+ underscore.prototype[name] = function() {
+ var args = [this._wrapped];
+ _setup.push.apply(args, arguments);
+ return _chainResult(this, func.apply(underscore, args));
+ };
+ });
+ return underscore;
+}
+
+module.exports = mixin;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/negate.js b/node_modules/jsonpath/node_modules/underscore/cjs/negate.js
new file mode 100644
index 00000000..d4a22ed4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/negate.js
@@ -0,0 +1,8 @@
+// Returns a negated version of the passed-in predicate.
+function negate(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+}
+
+module.exports = negate;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/noop.js b/node_modules/jsonpath/node_modules/underscore/cjs/noop.js
new file mode 100644
index 00000000..4d355ba5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/noop.js
@@ -0,0 +1,4 @@
+// Predicate-generating function. Often useful outside of Underscore.
+function noop(){}
+
+module.exports = noop;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/now.js b/node_modules/jsonpath/node_modules/underscore/cjs/now.js
new file mode 100644
index 00000000..746e66e6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/now.js
@@ -0,0 +1,6 @@
+// A (possibly faster) way to get the current timestamp as an integer.
+var now = Date.now || function() {
+ return new Date().getTime();
+};
+
+module.exports = now;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/object.js b/node_modules/jsonpath/node_modules/underscore/cjs/object.js
new file mode 100644
index 00000000..583b3208
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/object.js
@@ -0,0 +1,18 @@
+var _getLength = require('./_getLength.js');
+
+// Converts lists into objects. Pass either a single array of `[key, value]`
+// pairs, or two parallel arrays of the same length -- one of keys, and one of
+// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+function object(list, values) {
+ var result = {};
+ for (var i = 0, length = _getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+}
+
+module.exports = object;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/omit.js b/node_modules/jsonpath/node_modules/underscore/cjs/omit.js
new file mode 100644
index 00000000..58fb3634
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/omit.js
@@ -0,0 +1,24 @@
+var isFunction = require('./isFunction.js');
+var _flatten = require('./_flatten.js');
+var restArguments = require('./restArguments.js');
+var contains = require('./contains.js');
+var negate = require('./negate.js');
+var map = require('./map.js');
+var pick = require('./pick.js');
+
+// Return a copy of the object without the disallowed properties.
+var omit = restArguments(function(obj, keys) {
+ var iteratee = keys[0], context;
+ if (isFunction(iteratee)) {
+ iteratee = negate(iteratee);
+ if (keys.length > 1) context = keys[1];
+ } else {
+ keys = map(_flatten(keys, false, false), String);
+ iteratee = function(value, key) {
+ return !contains(keys, key);
+ };
+ }
+ return pick(obj, iteratee, context);
+});
+
+module.exports = omit;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/once.js b/node_modules/jsonpath/node_modules/underscore/cjs/once.js
new file mode 100644
index 00000000..94689c13
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/once.js
@@ -0,0 +1,8 @@
+var before = require('./before.js');
+var partial = require('./partial.js');
+
+// Returns a function that will be executed at most one time, no matter how
+// often you call it. Useful for lazy initialization.
+var once = partial(before, 2);
+
+module.exports = once;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/pairs.js b/node_modules/jsonpath/node_modules/underscore/cjs/pairs.js
new file mode 100644
index 00000000..399243e0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/pairs.js
@@ -0,0 +1,15 @@
+var keys = require('./keys.js');
+
+// Convert an object into a list of `[key, value]` pairs.
+// The opposite of `_.object` with one argument.
+function pairs(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [_keys[i], obj[_keys[i]]];
+ }
+ return pairs;
+}
+
+module.exports = pairs;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/partial.js b/node_modules/jsonpath/node_modules/underscore/cjs/partial.js
new file mode 100644
index 00000000..8b7f914b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/partial.js
@@ -0,0 +1,25 @@
+var underscore = require('./underscore.js');
+var _executeBound = require('./_executeBound.js');
+var restArguments = require('./restArguments.js');
+
+// Partially apply a function by creating a version that has had some of its
+// arguments pre-filled, without changing its dynamic `this` context. `_` acts
+// as a placeholder by default, allowing any combination of arguments to be
+// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+var partial = restArguments(function(func, boundArgs) {
+ var placeholder = partial.placeholder;
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return _executeBound(func, bound, this, this, args);
+ };
+ return bound;
+});
+
+partial.placeholder = underscore;
+
+module.exports = partial;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/partition.js b/node_modules/jsonpath/node_modules/underscore/cjs/partition.js
new file mode 100644
index 00000000..294786fe
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/partition.js
@@ -0,0 +1,9 @@
+var _group = require('./_group.js');
+
+// Split a collection into two arrays: one whose elements all pass the given
+// truth test, and one whose elements all do not pass the truth test.
+var partition = _group(function(result, value, pass) {
+ result[pass ? 0 : 1].push(value);
+}, true);
+
+module.exports = partition;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/pick.js b/node_modules/jsonpath/node_modules/underscore/cjs/pick.js
new file mode 100644
index 00000000..0fe3684b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/pick.js
@@ -0,0 +1,28 @@
+var isFunction = require('./isFunction.js');
+var _optimizeCb = require('./_optimizeCb.js');
+var _flatten = require('./_flatten.js');
+var _keyInObj = require('./_keyInObj.js');
+var allKeys = require('./allKeys.js');
+var restArguments = require('./restArguments.js');
+
+// Return a copy of the object only containing the allowed properties.
+var pick = restArguments(function(obj, keys) {
+ var result = {}, iteratee = keys[0];
+ if (obj == null) return result;
+ if (isFunction(iteratee)) {
+ if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]);
+ keys = allKeys(obj);
+ } else {
+ iteratee = _keyInObj;
+ keys = _flatten(keys, false, false);
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+});
+
+module.exports = pick;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/pluck.js b/node_modules/jsonpath/node_modules/underscore/cjs/pluck.js
new file mode 100644
index 00000000..b6f8c5d5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/pluck.js
@@ -0,0 +1,9 @@
+var property = require('./property.js');
+var map = require('./map.js');
+
+// Convenience version of a common use case of `_.map`: fetching a property.
+function pluck(obj, key) {
+ return map(obj, property(key));
+}
+
+module.exports = pluck;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/pop.js b/node_modules/jsonpath/node_modules/underscore/cjs/pop.js
new file mode 100644
index 00000000..37ae4454
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/pop.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var pop = _unmethodize(_setup.ArrayProto.pop);
+
+module.exports = pop;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/property.js b/node_modules/jsonpath/node_modules/underscore/cjs/property.js
new file mode 100644
index 00000000..e7b069d6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/property.js
@@ -0,0 +1,13 @@
+var _deepGet = require('./_deepGet.js');
+var _toPath = require('./_toPath.js');
+
+// Creates a function that, when passed an object, will traverse that object’s
+// properties down the given `path`, specified as an array of keys or indices.
+function property(path) {
+ path = _toPath(path);
+ return function(obj) {
+ return _deepGet(obj, path);
+ };
+}
+
+module.exports = property;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/propertyOf.js b/node_modules/jsonpath/node_modules/underscore/cjs/propertyOf.js
new file mode 100644
index 00000000..54fc0541
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/propertyOf.js
@@ -0,0 +1,12 @@
+var get = require('./get.js');
+var noop = require('./noop.js');
+
+// Generates a function for a given object that returns a given property.
+function propertyOf(obj) {
+ if (obj == null) return noop;
+ return function(path) {
+ return get(obj, path);
+ };
+}
+
+module.exports = propertyOf;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/push.js b/node_modules/jsonpath/node_modules/underscore/cjs/push.js
new file mode 100644
index 00000000..7972ea1d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/push.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var push = _unmethodize(_setup.ArrayProto.push);
+
+module.exports = push;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/random.js b/node_modules/jsonpath/node_modules/underscore/cjs/random.js
new file mode 100644
index 00000000..cb9a0abc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/random.js
@@ -0,0 +1,10 @@
+// Return a random integer between `min` and `max` (inclusive).
+function random(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+}
+
+module.exports = random;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/range.js b/node_modules/jsonpath/node_modules/underscore/cjs/range.js
new file mode 100644
index 00000000..7a5a2413
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/range.js
@@ -0,0 +1,23 @@
+// Generate an integer Array containing an arithmetic progression. A port of
+// the native Python `range()` function. See
+// [the Python documentation](https://docs.python.org/library/functions.html#range).
+function range(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+}
+
+module.exports = range;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/reduce.js b/node_modules/jsonpath/node_modules/underscore/cjs/reduce.js
new file mode 100644
index 00000000..170b1b09
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/reduce.js
@@ -0,0 +1,7 @@
+var _createReduce = require('./_createReduce.js');
+
+// **Reduce** builds up a single result from a list of values, aka `inject`,
+// or `foldl`.
+var reduce = _createReduce(1);
+
+module.exports = reduce;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/reduceRight.js b/node_modules/jsonpath/node_modules/underscore/cjs/reduceRight.js
new file mode 100644
index 00000000..52413d79
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/reduceRight.js
@@ -0,0 +1,6 @@
+var _createReduce = require('./_createReduce.js');
+
+// The right-associative version of reduce, also known as `foldr`.
+var reduceRight = _createReduce(-1);
+
+module.exports = reduceRight;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/reject.js b/node_modules/jsonpath/node_modules/underscore/cjs/reject.js
new file mode 100644
index 00000000..e911bd64
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/reject.js
@@ -0,0 +1,10 @@
+var _cb = require('./_cb.js');
+var filter = require('./filter.js');
+var negate = require('./negate.js');
+
+// Return all the elements for which a truth test fails.
+function reject(obj, predicate, context) {
+ return filter(obj, negate(_cb(predicate)), context);
+}
+
+module.exports = reject;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/rest.js b/node_modules/jsonpath/node_modules/underscore/cjs/rest.js
new file mode 100644
index 00000000..4ce76623
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/rest.js
@@ -0,0 +1,10 @@
+var _setup = require('./_setup.js');
+
+// Returns everything but the first entry of the `array`. Especially useful on
+// the `arguments` object. Passing an **n** will return the rest N values in the
+// `array`.
+function rest(array, n, guard) {
+ return _setup.slice.call(array, n == null || guard ? 1 : n);
+}
+
+module.exports = rest;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/restArguments.js b/node_modules/jsonpath/node_modules/underscore/cjs/restArguments.js
new file mode 100644
index 00000000..b292cb4c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/restArguments.js
@@ -0,0 +1,29 @@
+// Some functions take a variable number of arguments, or a few expected
+// arguments at the beginning and then a variable number of values to operate
+// on. This helper accumulates all remaining arguments past the function’s
+// argument length (or an explicit `startIndex`), into an array that becomes
+// the last argument. Similar to ES6’s "rest parameter".
+function restArguments(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0),
+ rest = Array(length),
+ index = 0;
+ for (; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ var args = Array(startIndex + 1);
+ for (index = 0; index < startIndex; index++) {
+ args[index] = arguments[index];
+ }
+ args[startIndex] = rest;
+ return func.apply(this, args);
+ };
+}
+
+module.exports = restArguments;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/result.js b/node_modules/jsonpath/node_modules/underscore/cjs/result.js
new file mode 100644
index 00000000..7bd3fb65
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/result.js
@@ -0,0 +1,24 @@
+var isFunction = require('./isFunction.js');
+var _toPath = require('./_toPath.js');
+
+// Traverses the children of `obj` along `path`. If a child is a function, it
+// is invoked with its parent as context. Returns the value of the final
+// child, or `fallback` if any child is undefined.
+function result(obj, path, fallback) {
+ path = _toPath(path);
+ var length = path.length;
+ if (!length) {
+ return isFunction(fallback) ? fallback.call(obj) : fallback;
+ }
+ for (var i = 0; i < length; i++) {
+ var prop = obj == null ? void 0 : obj[path[i]];
+ if (prop === void 0) {
+ prop = fallback;
+ i = length; // Ensure we don't continue iterating.
+ }
+ obj = isFunction(prop) ? prop.call(obj) : prop;
+ }
+ return obj;
+}
+
+module.exports = result;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/reverse.js b/node_modules/jsonpath/node_modules/underscore/cjs/reverse.js
new file mode 100644
index 00000000..582234f6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/reverse.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var reverse = _unmethodize(_setup.ArrayProto.reverse);
+
+module.exports = reverse;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/sample.js b/node_modules/jsonpath/node_modules/underscore/cjs/sample.js
new file mode 100644
index 00000000..261e16b1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/sample.js
@@ -0,0 +1,29 @@
+var _getLength = require('./_getLength.js');
+var _isArrayLike = require('./_isArrayLike.js');
+var clone = require('./clone.js');
+var values = require('./values.js');
+var random = require('./random.js');
+
+// Sample **n** random values from a collection using the modern version of the
+// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+// If **n** is not specified, returns a single random element.
+// The internal `guard` argument allows it to work with `_.map`.
+function sample(obj, n, guard) {
+ if (n == null || guard) {
+ if (!_isArrayLike(obj)) obj = values(obj);
+ return obj[random(obj.length - 1)];
+ }
+ var sample = _isArrayLike(obj) ? clone(obj) : values(obj);
+ var length = _getLength(sample);
+ n = Math.max(Math.min(n, length), 0);
+ var last = length - 1;
+ for (var index = 0; index < n; index++) {
+ var rand = random(index, last);
+ var temp = sample[index];
+ sample[index] = sample[rand];
+ sample[rand] = temp;
+ }
+ return sample.slice(0, n);
+}
+
+module.exports = sample;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/shift.js b/node_modules/jsonpath/node_modules/underscore/cjs/shift.js
new file mode 100644
index 00000000..579738b7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/shift.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var shift = _unmethodize(_setup.ArrayProto.shift);
+
+module.exports = shift;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/shuffle.js b/node_modules/jsonpath/node_modules/underscore/cjs/shuffle.js
new file mode 100644
index 00000000..2694917e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/shuffle.js
@@ -0,0 +1,8 @@
+var sample = require('./sample.js');
+
+// Shuffle a collection.
+function shuffle(obj) {
+ return sample(obj, Infinity);
+}
+
+module.exports = shuffle;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/size.js b/node_modules/jsonpath/node_modules/underscore/cjs/size.js
new file mode 100644
index 00000000..42f7d46c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/size.js
@@ -0,0 +1,10 @@
+var keys = require('./keys.js');
+var _isArrayLike = require('./_isArrayLike.js');
+
+// Return the number of elements in a collection.
+function size(obj) {
+ if (obj == null) return 0;
+ return _isArrayLike(obj) ? obj.length : keys(obj).length;
+}
+
+module.exports = size;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/slice.js b/node_modules/jsonpath/node_modules/underscore/cjs/slice.js
new file mode 100644
index 00000000..a31bcfe7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/slice.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var slice = _unmethodize(_setup.ArrayProto.slice);
+
+module.exports = slice;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/some.js b/node_modules/jsonpath/node_modules/underscore/cjs/some.js
new file mode 100644
index 00000000..646b0ac7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/some.js
@@ -0,0 +1,17 @@
+var keys = require('./keys.js');
+var _cb = require('./_cb.js');
+var _isArrayLike = require('./_isArrayLike.js');
+
+// Determine if at least one element in the object passes a truth test.
+function some(obj, predicate, context) {
+ predicate = _cb(predicate, context);
+ var _keys = !_isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+}
+
+module.exports = some;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/sort.js b/node_modules/jsonpath/node_modules/underscore/cjs/sort.js
new file mode 100644
index 00000000..5e2ead19
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/sort.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var sort = _unmethodize(_setup.ArrayProto.sort);
+
+module.exports = sort;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/sortBy.js b/node_modules/jsonpath/node_modules/underscore/cjs/sortBy.js
new file mode 100644
index 00000000..feee5e47
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/sortBy.js
@@ -0,0 +1,26 @@
+var _cb = require('./_cb.js');
+var map = require('./map.js');
+var pluck = require('./pluck.js');
+
+// Sort the object's values by a criterion produced by an iteratee.
+function sortBy(obj, iteratee, context) {
+ var index = 0;
+ iteratee = _cb(iteratee, context);
+ return pluck(map(obj, function(value, key, list) {
+ return {
+ value: value,
+ index: index++,
+ criteria: iteratee(value, key, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+}
+
+module.exports = sortBy;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/sortedIndex.js b/node_modules/jsonpath/node_modules/underscore/cjs/sortedIndex.js
new file mode 100644
index 00000000..1f261713
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/sortedIndex.js
@@ -0,0 +1,17 @@
+var _cb = require('./_cb.js');
+var _getLength = require('./_getLength.js');
+
+// Use a comparator function to figure out the smallest index at which
+// an object should be inserted so as to maintain order. Uses binary search.
+function sortedIndex(array, obj, iteratee, context) {
+ iteratee = _cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = _getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+}
+
+module.exports = sortedIndex;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/sortedLastIndex.js b/node_modules/jsonpath/node_modules/underscore/cjs/sortedLastIndex.js
new file mode 100644
index 00000000..9145aff1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/sortedLastIndex.js
@@ -0,0 +1,11 @@
+var _binarySearch = require('./_binarySearch.js');
+var _cb = require('./_cb.js');
+var _lessEqual = require('./_lessEqual.js');
+
+// Use an iteratee to figure out the greatest index at which an object should be
+// inserted so as to maintain order. Uses binary search.
+function sortedLastIndex(array, obj, iteratee, context) {
+ return _binarySearch(array, obj, _cb(iteratee, context), _lessEqual);
+}
+
+module.exports = sortedLastIndex;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/splice.js b/node_modules/jsonpath/node_modules/underscore/cjs/splice.js
new file mode 100644
index 00000000..f93786df
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/splice.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var splice = _unmethodize(_setup.ArrayProto.splice);
+
+module.exports = splice;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/tap.js b/node_modules/jsonpath/node_modules/underscore/cjs/tap.js
new file mode 100644
index 00000000..3dc681f8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/tap.js
@@ -0,0 +1,9 @@
+// Invokes `interceptor` with the `obj` and then returns `obj`.
+// The primary purpose of this method is to "tap into" a method chain, in
+// order to perform operations on intermediate results within the chain.
+function tap(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+}
+
+module.exports = tap;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/template.js b/node_modules/jsonpath/node_modules/underscore/cjs/template.js
new file mode 100644
index 00000000..0c2b3f92
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/template.js
@@ -0,0 +1,95 @@
+var underscore = require('./underscore.js');
+var defaults = require('./defaults.js');
+require('./templateSettings.js');
+
+// When customizing `_.templateSettings`, if you don't want to define an
+// interpolation, evaluation or escaping regex, we need one that is
+// guaranteed not to match.
+var noMatch = /(.)^/;
+
+// Certain characters need to be escaped so that they can be put into a
+// string literal.
+var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+};
+
+var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+function escapeChar(match) {
+ return '\\' + escapes[match];
+}
+
+var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+// JavaScript micro-templating, similar to John Resig's implementation.
+// Underscore templating handles arbitrary delimiters, preserves whitespace,
+// and correctly escapes quotes within interpolated code.
+// NB: `oldSettings` only exists for backwards compatibility.
+function template(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = defaults({}, settings, underscore.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offset.
+ return match;
+ });
+ source += "';\n";
+
+ var argument = settings.variable;
+ if (argument) {
+ if (!bareIdentifier.test(argument)) throw new Error(argument);
+ } else {
+ // If a variable is not specified, place data values in local scope.
+ source = 'with(obj||{}){\n' + source + '}\n';
+ argument = 'obj';
+ }
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ var render;
+ try {
+ render = new Function(argument, '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, underscore);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+}
+
+module.exports = template;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/templateSettings.js b/node_modules/jsonpath/node_modules/underscore/cjs/templateSettings.js
new file mode 100644
index 00000000..4b557989
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/templateSettings.js
@@ -0,0 +1,11 @@
+var underscore = require('./underscore.js');
+
+// By default, Underscore uses ERB-style template delimiters. Change the
+// following template settings to use alternative delimiters.
+var templateSettings = underscore.templateSettings = {
+ evaluate: /<%([\s\S]+?)%>/g,
+ interpolate: /<%=([\s\S]+?)%>/g,
+ escape: /<%-([\s\S]+?)%>/g
+};
+
+module.exports = templateSettings;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/throttle.js b/node_modules/jsonpath/node_modules/underscore/cjs/throttle.js
new file mode 100644
index 00000000..3b013d92
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/throttle.js
@@ -0,0 +1,49 @@
+var now = require('./now.js');
+
+// Returns a function, that, when invoked, will only be triggered at most once
+// during a given window of time. Normally, the throttled function will run
+// as much as it can, without ever going more than once per `wait` duration;
+// but if you'd like to disable the execution on the leading edge, pass
+// `{leading: false}`. To disable execution on the trailing edge, ditto.
+function throttle(func, wait, options) {
+ var timeout, context, args, result;
+ var previous = 0;
+ if (!options) options = {};
+
+ var later = function() {
+ previous = options.leading === false ? 0 : now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+
+ var throttled = function() {
+ var _now = now();
+ if (!previous && options.leading === false) previous = _now;
+ var remaining = wait - (_now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = _now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+
+ throttled.cancel = function() {
+ clearTimeout(timeout);
+ previous = 0;
+ timeout = context = args = null;
+ };
+
+ return throttled;
+}
+
+module.exports = throttle;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/times.js b/node_modules/jsonpath/node_modules/underscore/cjs/times.js
new file mode 100644
index 00000000..0a36b794
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/times.js
@@ -0,0 +1,11 @@
+var _optimizeCb = require('./_optimizeCb.js');
+
+// Run a function **n** times.
+function times(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = _optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+}
+
+module.exports = times;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/toArray.js b/node_modules/jsonpath/node_modules/underscore/cjs/toArray.js
new file mode 100644
index 00000000..77413919
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/toArray.js
@@ -0,0 +1,22 @@
+var _setup = require('./_setup.js');
+var identity = require('./identity.js');
+var isArray = require('./isArray.js');
+var _isArrayLike = require('./_isArrayLike.js');
+var values = require('./values.js');
+var isString = require('./isString.js');
+var map = require('./map.js');
+
+// Safely create a real, live array from anything iterable.
+var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+function toArray(obj) {
+ if (!obj) return [];
+ if (isArray(obj)) return _setup.slice.call(obj);
+ if (isString(obj)) {
+ // Keep surrogate pair characters together.
+ return obj.match(reStrSymbol);
+ }
+ if (_isArrayLike(obj)) return map(obj, identity);
+ return values(obj);
+}
+
+module.exports = toArray;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/toPath.js b/node_modules/jsonpath/node_modules/underscore/cjs/toPath.js
new file mode 100644
index 00000000..58a3ed04
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/toPath.js
@@ -0,0 +1,11 @@
+var isArray = require('./isArray.js');
+var underscore = require('./underscore.js');
+
+// Normalize a (deep) property `path` to array.
+// Like `_.iteratee`, this function can be customized.
+function toPath(path) {
+ return isArray(path) ? path : [path];
+}
+underscore.toPath = toPath;
+
+module.exports = toPath;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/toString.js b/node_modules/jsonpath/node_modules/underscore/cjs/toString.js
new file mode 100644
index 00000000..882a044d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/toString.js
@@ -0,0 +1,9 @@
+var value = require('./value.js');
+
+// Provide an unwrapping proxy for automatic string coercion in engine
+// operations such as JSON stringification.
+function toString(wrapper) {
+ return String(value(wrapper));
+}
+
+module.exports = toString;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/underscore-array-methods.js b/node_modules/jsonpath/node_modules/underscore/cjs/underscore-array-methods.js
new file mode 100644
index 00000000..6fff0985
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/underscore-array-methods.js
@@ -0,0 +1,31 @@
+var _setup = require('./_setup.js');
+var underscore = require('./underscore.js');
+var _chainResult = require('./_chainResult.js');
+var each = require('./each.js');
+
+// Add all mutator `Array` functions to the wrapper.
+each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = _setup.ArrayProto[name];
+ underscore.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) {
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+ delete obj[0];
+ }
+ }
+ return _chainResult(this, obj);
+ };
+});
+
+// Add all accessor `Array` functions to the wrapper.
+each(['concat', 'join', 'slice'], function(name) {
+ var method = _setup.ArrayProto[name];
+ underscore.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) obj = method.apply(obj, arguments);
+ return _chainResult(this, obj);
+ };
+});
+
+module.exports = underscore;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/underscore.js b/node_modules/jsonpath/node_modules/underscore/cjs/underscore.js
new file mode 100644
index 00000000..d3cf8091
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/underscore.js
@@ -0,0 +1,27 @@
+var _setup = require('./_setup.js');
+
+// If Underscore is called as a function, it returns a wrapped object that can
+// be used OO-style. This wrapper holds altered versions of all functions added
+// through `_.mixin`. Wrapped objects may be chained.
+function _(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+}
+
+_.VERSION = _setup.VERSION;
+
+// Extracts the result from a wrapped and chained object.
+_.prototype.value = function() {
+ return this._wrapped;
+};
+
+// Provide unwrapping proxies for some methods used in engine operations
+// such as arithmetic and JSON stringification.
+_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+_.prototype.toString = function() {
+ return String(this._wrapped);
+};
+
+module.exports = _;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/unescape.js b/node_modules/jsonpath/node_modules/underscore/cjs/unescape.js
new file mode 100644
index 00000000..2d5a5975
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/unescape.js
@@ -0,0 +1,7 @@
+var _createEscaper = require('./_createEscaper.js');
+var _unescapeMap = require('./_unescapeMap.js');
+
+// Function for unescaping strings from HTML interpolation.
+var _unescape = _createEscaper(_unescapeMap);
+
+module.exports = _unescape;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/union.js b/node_modules/jsonpath/node_modules/underscore/cjs/union.js
new file mode 100644
index 00000000..0a76243d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/union.js
@@ -0,0 +1,11 @@
+var _flatten = require('./_flatten.js');
+var restArguments = require('./restArguments.js');
+var uniq = require('./uniq.js');
+
+// Produce an array that contains the union: each distinct element from all of
+// the passed-in arrays.
+var union = restArguments(function(arrays) {
+ return uniq(_flatten(arrays, true, true));
+});
+
+module.exports = union;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/uniq.js b/node_modules/jsonpath/node_modules/underscore/cjs/uniq.js
new file mode 100644
index 00000000..1d56aa98
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/uniq.js
@@ -0,0 +1,38 @@
+var _cb = require('./_cb.js');
+var _getLength = require('./_getLength.js');
+var contains = require('./contains.js');
+var isBoolean = require('./isBoolean.js');
+
+// Produce a duplicate-free version of the array. If the array has already
+// been sorted, you have the option of using a faster algorithm.
+// The faster algorithm will not work with an iteratee if the iteratee
+// is not a one-to-one function, so providing an iteratee will disable
+// the faster algorithm.
+function uniq(array, isSorted, iteratee, context) {
+ if (!isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = _cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = _getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted && !iteratee) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+}
+
+module.exports = uniq;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/uniqueId.js b/node_modules/jsonpath/node_modules/underscore/cjs/uniqueId.js
new file mode 100644
index 00000000..e639e837
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/uniqueId.js
@@ -0,0 +1,9 @@
+// Generate a unique integer id (unique within the entire client session).
+// Useful for temporary DOM ids.
+var idCounter = 0;
+function uniqueId(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+}
+
+module.exports = uniqueId;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/unshift.js b/node_modules/jsonpath/node_modules/underscore/cjs/unshift.js
new file mode 100644
index 00000000..03de1206
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/unshift.js
@@ -0,0 +1,6 @@
+var _unmethodize = require('./_unmethodize.js');
+var _setup = require('./_setup.js');
+
+var unshift = _unmethodize(_setup.ArrayProto.unshift);
+
+module.exports = unshift;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/unzip.js b/node_modules/jsonpath/node_modules/underscore/cjs/unzip.js
new file mode 100644
index 00000000..ab36b6a4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/unzip.js
@@ -0,0 +1,17 @@
+var _getLength = require('./_getLength.js');
+var pluck = require('./pluck.js');
+var max = require('./max.js');
+
+// Complement of zip. Unzip accepts an array of arrays and groups
+// each array's elements on shared indices.
+function unzip(array) {
+ var length = array && max(array, _getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = pluck(array, index);
+ }
+ return result;
+}
+
+module.exports = unzip;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/value.js b/node_modules/jsonpath/node_modules/underscore/cjs/value.js
new file mode 100644
index 00000000..323b67e6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/value.js
@@ -0,0 +1,9 @@
+// Extract the result from a wrapped (and possibly chained) object.
+// This function is also aliased as `valueOf` and `toJSON`, which provide
+// unwrapping proxies for some methods used in engine operations such as
+// arithmetic and JSON stringification.
+function value(wrapper) {
+ return wrapper._wrapped || wrapper;
+}
+
+module.exports = value;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/values.js b/node_modules/jsonpath/node_modules/underscore/cjs/values.js
new file mode 100644
index 00000000..393c8b7a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/values.js
@@ -0,0 +1,14 @@
+var keys = require('./keys.js');
+
+// Retrieve the values of an object's properties.
+function values(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[_keys[i]];
+ }
+ return values;
+}
+
+module.exports = values;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/where.js b/node_modules/jsonpath/node_modules/underscore/cjs/where.js
new file mode 100644
index 00000000..c629039f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/where.js
@@ -0,0 +1,10 @@
+var matcher = require('./matcher.js');
+var filter = require('./filter.js');
+
+// Convenience version of a common use case of `_.filter`: selecting only
+// objects containing specific `key:value` pairs.
+function where(obj, attrs) {
+ return filter(obj, matcher(attrs));
+}
+
+module.exports = where;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/without.js b/node_modules/jsonpath/node_modules/underscore/cjs/without.js
new file mode 100644
index 00000000..5eaa4cdb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/without.js
@@ -0,0 +1,9 @@
+var restArguments = require('./restArguments.js');
+var difference = require('./difference.js');
+
+// Return a version of the array that does not contain the specified value(s).
+var without = restArguments(function(array, otherArrays) {
+ return difference(array, otherArrays);
+});
+
+module.exports = without;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/wrap.js b/node_modules/jsonpath/node_modules/underscore/cjs/wrap.js
new file mode 100644
index 00000000..e95d5a7f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/wrap.js
@@ -0,0 +1,10 @@
+var partial = require('./partial.js');
+
+// Returns the first function passed as an argument to the second,
+// allowing you to adjust arguments, run code before and after, and
+// conditionally execute the original function.
+function wrap(func, wrapper) {
+ return partial(wrapper, func);
+}
+
+module.exports = wrap;
diff --git a/node_modules/jsonpath/node_modules/underscore/cjs/zip.js b/node_modules/jsonpath/node_modules/underscore/cjs/zip.js
new file mode 100644
index 00000000..70cbd3b1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/cjs/zip.js
@@ -0,0 +1,8 @@
+var restArguments = require('./restArguments.js');
+var unzip = require('./unzip.js');
+
+// Zip together multiple lists into a single array -- elements that share
+// an index go together.
+var zip = restArguments(unzip);
+
+module.exports = zip;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/.eslintrc b/node_modules/jsonpath/node_modules/underscore/modules/.eslintrc
new file mode 100644
index 00000000..b0802cb0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/.eslintrc
@@ -0,0 +1,12 @@
+{
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module",
+ },
+ "plugins": [
+ "import"
+ ],
+ "extends": [
+ "plugin:import/errors"
+ ]
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_baseCreate.js b/node_modules/jsonpath/node_modules/underscore/modules/_baseCreate.js
new file mode 100644
index 00000000..032a9728
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_baseCreate.js
@@ -0,0 +1,18 @@
+import isObject from './isObject.js';
+import { nativeCreate } from './_setup.js';
+
+// Create a naked function reference for surrogate-prototype-swapping.
+function ctor() {
+ return function(){};
+}
+
+// An internal function for creating a new object that inherits from another.
+export default function baseCreate(prototype) {
+ if (!isObject(prototype)) return {};
+ if (nativeCreate) return nativeCreate(prototype);
+ var Ctor = ctor();
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_baseIteratee.js b/node_modules/jsonpath/node_modules/underscore/modules/_baseIteratee.js
new file mode 100644
index 00000000..c276ebec
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_baseIteratee.js
@@ -0,0 +1,17 @@
+import identity from './identity.js';
+import isFunction from './isFunction.js';
+import isObject from './isObject.js';
+import isArray from './isArray.js';
+import matcher from './matcher.js';
+import property from './property.js';
+import optimizeCb from './_optimizeCb.js';
+
+// An internal function to generate callbacks that can be applied to each
+// element in a collection, returning the desired result — either `_.identity`,
+// an arbitrary callback, a property matcher, or a property accessor.
+export default function baseIteratee(value, context, argCount) {
+ if (value == null) return identity;
+ if (isFunction(value)) return optimizeCb(value, context, argCount);
+ if (isObject(value) && !isArray(value)) return matcher(value);
+ return property(value);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_cb.js b/node_modules/jsonpath/node_modules/underscore/modules/_cb.js
new file mode 100644
index 00000000..9b8b5557
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_cb.js
@@ -0,0 +1,10 @@
+import _ from './underscore.js';
+import baseIteratee from './_baseIteratee.js';
+import iteratee from './iteratee.js';
+
+// The function we call internally to generate a callback. It invokes
+// `_.iteratee` if overridden, otherwise `baseIteratee`.
+export default function cb(value, context, argCount) {
+ if (_.iteratee !== iteratee) return _.iteratee(value, context);
+ return baseIteratee(value, context, argCount);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_chainResult.js b/node_modules/jsonpath/node_modules/underscore/modules/_chainResult.js
new file mode 100644
index 00000000..b786520c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_chainResult.js
@@ -0,0 +1,6 @@
+import _ from './underscore.js';
+
+// Helper function to continue chaining intermediate results.
+export default function chainResult(instance, obj) {
+ return instance._chain ? _(obj).chain() : obj;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_collectNonEnumProps.js b/node_modules/jsonpath/node_modules/underscore/modules/_collectNonEnumProps.js
new file mode 100644
index 00000000..18a2af07
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_collectNonEnumProps.js
@@ -0,0 +1,40 @@
+import { nonEnumerableProps, ObjProto } from './_setup.js';
+import isFunction from './isFunction.js';
+import has from './_has.js';
+
+// Internal helper to create a simple lookup structure.
+// `collectNonEnumProps` used to depend on `_.contains`, but this led to
+// circular imports. `emulatedSet` is a one-off solution that only works for
+// arrays of strings.
+function emulatedSet(keys) {
+ var hash = {};
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+ return {
+ contains: function(key) { return hash[key]; },
+ push: function(key) {
+ hash[key] = true;
+ return keys.push(key);
+ }
+ };
+}
+
+// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+// needed.
+export default function collectNonEnumProps(obj, keys) {
+ keys = emulatedSet(keys);
+ var nonEnumIdx = nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = isFunction(constructor) && constructor.prototype || ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+ keys.push(prop);
+ }
+ }
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_createAssigner.js b/node_modules/jsonpath/node_modules/underscore/modules/_createAssigner.js
new file mode 100644
index 00000000..b1023931
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_createAssigner.js
@@ -0,0 +1,18 @@
+// An internal function for creating assigner functions.
+export default function createAssigner(keysFunc, defaults) {
+ return function(obj) {
+ var length = arguments.length;
+ if (defaults) obj = Object(obj);
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_createEscaper.js b/node_modules/jsonpath/node_modules/underscore/modules/_createEscaper.js
new file mode 100644
index 00000000..3828b56f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_createEscaper.js
@@ -0,0 +1,17 @@
+import keys from './keys.js';
+
+// Internal helper to generate functions for escaping and unescaping strings
+// to/from HTML interpolation.
+export default function createEscaper(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_createIndexFinder.js b/node_modules/jsonpath/node_modules/underscore/modules/_createIndexFinder.js
new file mode 100644
index 00000000..eadedef0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_createIndexFinder.js
@@ -0,0 +1,28 @@
+import getLength from './_getLength.js';
+import { slice } from './_setup.js';
+import isNaN from './isNaN.js';
+
+// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+export default function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(slice.call(array, i, length), isNaN);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_createPredicateIndexFinder.js b/node_modules/jsonpath/node_modules/underscore/modules/_createPredicateIndexFinder.js
new file mode 100644
index 00000000..c0659485
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_createPredicateIndexFinder.js
@@ -0,0 +1,15 @@
+import cb from './_cb.js';
+import getLength from './_getLength.js';
+
+// Internal function to generate `_.findIndex` and `_.findLastIndex`.
+export default function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = cb(predicate, context);
+ var length = getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_createReduce.js b/node_modules/jsonpath/node_modules/underscore/modules/_createReduce.js
new file mode 100644
index 00000000..20f4ee11
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_createReduce.js
@@ -0,0 +1,28 @@
+import isArrayLike from './_isArrayLike.js';
+import keys from './keys.js';
+import optimizeCb from './_optimizeCb.js';
+
+// Internal helper to create a reducing function, iterating left or right.
+export default function createReduce(dir) {
+ // Wrap code that reassigns argument variables in a separate function than
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+ var reducer = function(obj, iteratee, memo, initial) {
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ if (!initial) {
+ memo = obj[_keys ? _keys[index] : index];
+ index += dir;
+ }
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = _keys ? _keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ };
+
+ return function(obj, iteratee, memo, context) {
+ var initial = arguments.length >= 3;
+ return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_createSizePropertyCheck.js b/node_modules/jsonpath/node_modules/underscore/modules/_createSizePropertyCheck.js
new file mode 100644
index 00000000..cc38007b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_createSizePropertyCheck.js
@@ -0,0 +1,9 @@
+import { MAX_ARRAY_INDEX } from './_setup.js';
+
+// Common internal logic for `isArrayLike` and `isBufferLike`.
+export default function createSizePropertyCheck(getSizeProperty) {
+ return function(collection) {
+ var sizeProperty = getSizeProperty(collection);
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+ }
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_deepGet.js b/node_modules/jsonpath/node_modules/underscore/modules/_deepGet.js
new file mode 100644
index 00000000..42bbec31
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_deepGet.js
@@ -0,0 +1,9 @@
+// Internal function to obtain a nested property in `obj` along `path`.
+export default function deepGet(obj, path) {
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ if (obj == null) return void 0;
+ obj = obj[path[i]];
+ }
+ return length ? obj : void 0;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_escapeMap.js b/node_modules/jsonpath/node_modules/underscore/modules/_escapeMap.js
new file mode 100644
index 00000000..cc9d615f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_escapeMap.js
@@ -0,0 +1,9 @@
+// Internal list of HTML entities for escaping.
+export default {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+};
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_executeBound.js b/node_modules/jsonpath/node_modules/underscore/modules/_executeBound.js
new file mode 100644
index 00000000..f54fa780
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_executeBound.js
@@ -0,0 +1,13 @@
+import baseCreate from './_baseCreate.js';
+import isObject from './isObject.js';
+
+// Internal function to execute `sourceFunc` bound to `context` with optional
+// `args`. Determines whether to execute a function as a constructor or as a
+// normal function.
+export default function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (isObject(result)) return result;
+ return self;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_flatten.js b/node_modules/jsonpath/node_modules/underscore/modules/_flatten.js
new file mode 100644
index 00000000..1767a8b8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_flatten.js
@@ -0,0 +1,31 @@
+import getLength from './_getLength.js';
+import isArrayLike from './_isArrayLike.js';
+import isArray from './isArray.js';
+import isArguments from './isArguments.js';
+
+// Internal implementation of a recursive `flatten` function.
+export default function flatten(input, depth, strict, output) {
+ output = output || [];
+ if (!depth && depth !== 0) {
+ depth = Infinity;
+ } else if (depth <= 0) {
+ return output.concat(input);
+ }
+ var idx = output.length;
+ for (var i = 0, length = getLength(input); i < length; i++) {
+ var value = input[i];
+ if (isArrayLike(value) && (isArray(value) || isArguments(value))) {
+ // Flatten current level of array or arguments object.
+ if (depth > 1) {
+ flatten(value, depth - 1, strict, output);
+ idx = output.length;
+ } else {
+ var j = 0, len = value.length;
+ while (j < len) output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_getByteLength.js b/node_modules/jsonpath/node_modules/underscore/modules/_getByteLength.js
new file mode 100644
index 00000000..11e45287
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_getByteLength.js
@@ -0,0 +1,4 @@
+import shallowProperty from './_shallowProperty.js';
+
+// Internal helper to obtain the `byteLength` property of an object.
+export default shallowProperty('byteLength');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_getLength.js b/node_modules/jsonpath/node_modules/underscore/modules/_getLength.js
new file mode 100644
index 00000000..090b156b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_getLength.js
@@ -0,0 +1,4 @@
+import shallowProperty from './_shallowProperty.js';
+
+// Internal helper to obtain the `length` property of an object.
+export default shallowProperty('length');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_group.js b/node_modules/jsonpath/node_modules/underscore/modules/_group.js
new file mode 100644
index 00000000..8fdd9857
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_group.js
@@ -0,0 +1,15 @@
+import cb from './_cb.js';
+import each from './each.js';
+
+// An internal function used for aggregate "group by" operations.
+export default function group(behavior, partition) {
+ return function(obj, iteratee, context) {
+ var result = partition ? [[], []] : {};
+ iteratee = cb(iteratee, context);
+ each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_has.js b/node_modules/jsonpath/node_modules/underscore/modules/_has.js
new file mode 100644
index 00000000..06361812
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_has.js
@@ -0,0 +1,6 @@
+import { hasOwnProperty } from './_setup.js';
+
+// Internal function to check whether `key` is an own property name of `obj`.
+export default function has(obj, key) {
+ return obj != null && hasOwnProperty.call(obj, key);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_hasObjectTag.js b/node_modules/jsonpath/node_modules/underscore/modules/_hasObjectTag.js
new file mode 100644
index 00000000..85db78c1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_hasObjectTag.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('Object');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_isArrayLike.js b/node_modules/jsonpath/node_modules/underscore/modules/_isArrayLike.js
new file mode 100644
index 00000000..a87fe488
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_isArrayLike.js
@@ -0,0 +1,8 @@
+import createSizePropertyCheck from './_createSizePropertyCheck.js';
+import getLength from './_getLength.js';
+
+// Internal helper for collection methods to determine whether a collection
+// should be iterated as an array or as an object.
+// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+export default createSizePropertyCheck(getLength);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_isBufferLike.js b/node_modules/jsonpath/node_modules/underscore/modules/_isBufferLike.js
new file mode 100644
index 00000000..8cab6ee0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_isBufferLike.js
@@ -0,0 +1,6 @@
+import createSizePropertyCheck from './_createSizePropertyCheck.js';
+import getByteLength from './_getByteLength.js';
+
+// Internal helper to determine whether we should spend extensive checks against
+// `ArrayBuffer` et al.
+export default createSizePropertyCheck(getByteLength);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_keyInObj.js b/node_modules/jsonpath/node_modules/underscore/modules/_keyInObj.js
new file mode 100644
index 00000000..f72a8514
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_keyInObj.js
@@ -0,0 +1,5 @@
+// Internal `_.pick` helper function to determine whether `key` is an enumerable
+// property name of `obj`.
+export default function keyInObj(value, key, obj) {
+ return key in obj;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_methodFingerprint.js b/node_modules/jsonpath/node_modules/underscore/modules/_methodFingerprint.js
new file mode 100644
index 00000000..a1ebff33
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_methodFingerprint.js
@@ -0,0 +1,37 @@
+import getLength from './_getLength.js';
+import isFunction from './isFunction.js';
+import allKeys from './allKeys.js';
+
+// Since the regular `Object.prototype.toString` type tests don't work for
+// some types in IE 11, we use a fingerprinting heuristic instead, based
+// on the methods. It's not great, but it's the best we got.
+// The fingerprint method lists are defined below.
+export function ie11fingerprint(methods) {
+ var length = getLength(methods);
+ return function(obj) {
+ if (obj == null) return false;
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
+ var keys = allKeys(obj);
+ if (getLength(keys)) return false;
+ for (var i = 0; i < length; i++) {
+ if (!isFunction(obj[methods[i]])) return false;
+ }
+ // If we are testing against `WeakMap`, we need to ensure that
+ // `obj` doesn't have a `forEach` method in order to distinguish
+ // it from a regular `Map`.
+ return methods !== weakMapMethods || !isFunction(obj[forEachName]);
+ };
+}
+
+// In the interest of compact minification, we write
+// each string in the fingerprints only once.
+var forEachName = 'forEach',
+ hasName = 'has',
+ commonInit = ['clear', 'delete'],
+ mapTail = ['get', hasName, 'set'];
+
+// `Map`, `WeakMap` and `Set` each have slightly different
+// combinations of the above sublists.
+export var mapMethods = commonInit.concat(forEachName, mapTail),
+ weakMapMethods = commonInit.concat(mapTail),
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_optimizeCb.js b/node_modules/jsonpath/node_modules/underscore/modules/_optimizeCb.js
new file mode 100644
index 00000000..59e40e66
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_optimizeCb.js
@@ -0,0 +1,21 @@
+// Internal function that returns an efficient (for current engines) version
+// of the passed-in callback, to be repeatedly applied in other Underscore
+// functions.
+export default function optimizeCb(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ // The 2-argument case is omitted because we’re not using it.
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_setup.js b/node_modules/jsonpath/node_modules/underscore/modules/_setup.js
new file mode 100644
index 00000000..cb61e769
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_setup.js
@@ -0,0 +1,43 @@
+// Current version.
+export var VERSION = '1.12.1';
+
+// Establish the root object, `window` (`self`) in the browser, `global`
+// on the server, or `this` in some virtual machines. We use `self`
+// instead of `window` for `WebWorker` support.
+export var root = typeof self == 'object' && self.self === self && self ||
+ typeof global == 'object' && global.global === global && global ||
+ Function('return this')() ||
+ {};
+
+// Save bytes in the minified (but not gzipped) version:
+export var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+export var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+// Create quick reference variables for speed access to core prototypes.
+export var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+// Modern feature detection.
+export var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+ supportsDataView = typeof DataView !== 'undefined';
+
+// All **ECMAScript 5+** native function implementations that we hope to use
+// are declared here.
+export var nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeCreate = Object.create,
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+// Create references to these builtin functions because we override them.
+export var _isNaN = isNaN,
+ _isFinite = isFinite;
+
+// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+export var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+export var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+// The largest integer that can be represented exactly.
+export var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_shallowProperty.js b/node_modules/jsonpath/node_modules/underscore/modules/_shallowProperty.js
new file mode 100644
index 00000000..00bf0902
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_shallowProperty.js
@@ -0,0 +1,6 @@
+// Internal helper to generate a function to obtain property `key` from `obj`.
+export default function shallowProperty(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_stringTagBug.js b/node_modules/jsonpath/node_modules/underscore/modules/_stringTagBug.js
new file mode 100644
index 00000000..c85dd85e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_stringTagBug.js
@@ -0,0 +1,10 @@
+import { supportsDataView } from './_setup.js';
+import hasObjectTag from './_hasObjectTag.js';
+
+// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+// In IE 11, the most common among them, this problem also applies to
+// `Map`, `WeakMap` and `Set`.
+export var hasStringTagBug = (
+ supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+ ),
+ isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_tagTester.js b/node_modules/jsonpath/node_modules/underscore/modules/_tagTester.js
new file mode 100644
index 00000000..8d417dde
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_tagTester.js
@@ -0,0 +1,9 @@
+import { toString } from './_setup.js';
+
+// Internal function for creating a `toString`-based type tester.
+export default function tagTester(name) {
+ var tag = '[object ' + name + ']';
+ return function(obj) {
+ return toString.call(obj) === tag;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_toBufferView.js b/node_modules/jsonpath/node_modules/underscore/modules/_toBufferView.js
new file mode 100644
index 00000000..dd646a52
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_toBufferView.js
@@ -0,0 +1,11 @@
+import getByteLength from './_getByteLength.js';
+
+// Internal function to wrap or shallow-copy an ArrayBuffer,
+// typed array or DataView to a new view, reusing the buffer.
+export default function toBufferView(bufferSource) {
+ return new Uint8Array(
+ bufferSource.buffer || bufferSource,
+ bufferSource.byteOffset || 0,
+ getByteLength(bufferSource)
+ );
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_toPath.js b/node_modules/jsonpath/node_modules/underscore/modules/_toPath.js
new file mode 100644
index 00000000..fad51504
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_toPath.js
@@ -0,0 +1,8 @@
+import _ from './underscore.js';
+import './toPath.js';
+
+// Internal wrapper for `_.toPath` to enable minification.
+// Similar to `cb` for `_.iteratee`.
+export default function toPath(path) {
+ return _.toPath(path);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/_unescapeMap.js b/node_modules/jsonpath/node_modules/underscore/modules/_unescapeMap.js
new file mode 100644
index 00000000..af35e3d7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/_unescapeMap.js
@@ -0,0 +1,5 @@
+import invert from './invert.js';
+import escapeMap from './_escapeMap.js';
+
+// Internal list of HTML entities for unescaping.
+export default invert(escapeMap);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/after.js b/node_modules/jsonpath/node_modules/underscore/modules/after.js
new file mode 100644
index 00000000..863e8b51
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/after.js
@@ -0,0 +1,8 @@
+// Returns a function that will only be executed on and after the Nth call.
+export default function after(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/allKeys.js b/node_modules/jsonpath/node_modules/underscore/modules/allKeys.js
new file mode 100644
index 00000000..489cead5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/allKeys.js
@@ -0,0 +1,13 @@
+import isObject from './isObject.js';
+import { hasEnumBug } from './_setup.js';
+import collectNonEnumProps from './_collectNonEnumProps.js';
+
+// Retrieve all the enumerable property names of an object.
+export default function allKeys(obj) {
+ if (!isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/before.js b/node_modules/jsonpath/node_modules/underscore/modules/before.js
new file mode 100644
index 00000000..74ec2448
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/before.js
@@ -0,0 +1,12 @@
+// Returns a function that will only be executed up to (but not including) the
+// Nth call.
+export default function before(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/bind.js b/node_modules/jsonpath/node_modules/underscore/modules/bind.js
new file mode 100644
index 00000000..c172e345
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/bind.js
@@ -0,0 +1,13 @@
+import restArguments from './restArguments.js';
+import isFunction from './isFunction.js';
+import executeBound from './_executeBound.js';
+
+// Create a function bound to a given object (assigning `this`, and arguments,
+// optionally).
+export default restArguments(function(func, context, args) {
+ if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
+ var bound = restArguments(function(callArgs) {
+ return executeBound(func, bound, context, this, args.concat(callArgs));
+ });
+ return bound;
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/bindAll.js b/node_modules/jsonpath/node_modules/underscore/modules/bindAll.js
new file mode 100644
index 00000000..da51aebd
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/bindAll.js
@@ -0,0 +1,17 @@
+import restArguments from './restArguments.js';
+import flatten from './_flatten.js';
+import bind from './bind.js';
+
+// Bind a number of an object's methods to that object. Remaining arguments
+// are the method names to be bound. Useful for ensuring that all callbacks
+// defined on an object belong to it.
+export default restArguments(function(obj, keys) {
+ keys = flatten(keys, false, false);
+ var index = keys.length;
+ if (index < 1) throw new Error('bindAll must be passed function names');
+ while (index--) {
+ var key = keys[index];
+ obj[key] = bind(obj[key], obj);
+ }
+ return obj;
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/chain.js b/node_modules/jsonpath/node_modules/underscore/modules/chain.js
new file mode 100644
index 00000000..d9dcf057
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/chain.js
@@ -0,0 +1,8 @@
+import _ from './underscore.js';
+
+// Start chaining a wrapped Underscore object.
+export default function chain(obj) {
+ var instance = _(obj);
+ instance._chain = true;
+ return instance;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/chunk.js b/node_modules/jsonpath/node_modules/underscore/modules/chunk.js
new file mode 100644
index 00000000..5e01af5d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/chunk.js
@@ -0,0 +1,13 @@
+import { slice } from './_setup.js';
+
+// Chunk a single array into multiple arrays, each containing `count` or fewer
+// items.
+export default function chunk(array, count) {
+ if (count == null || count < 1) return [];
+ var result = [];
+ var i = 0, length = array.length;
+ while (i < length) {
+ result.push(slice.call(array, i, i += count));
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/clone.js b/node_modules/jsonpath/node_modules/underscore/modules/clone.js
new file mode 100644
index 00000000..b74689b5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/clone.js
@@ -0,0 +1,9 @@
+import isObject from './isObject.js';
+import isArray from './isArray.js';
+import extend from './extend.js';
+
+// Create a (shallow-cloned) duplicate of an object.
+export default function clone(obj) {
+ if (!isObject(obj)) return obj;
+ return isArray(obj) ? obj.slice() : extend({}, obj);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/compact.js b/node_modules/jsonpath/node_modules/underscore/modules/compact.js
new file mode 100644
index 00000000..d5d519e3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/compact.js
@@ -0,0 +1,6 @@
+import filter from './filter.js';
+
+// Trim out all falsy values from an array.
+export default function compact(array) {
+ return filter(array, Boolean);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/compose.js b/node_modules/jsonpath/node_modules/underscore/modules/compose.js
new file mode 100644
index 00000000..0d2584c8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/compose.js
@@ -0,0 +1,12 @@
+// Returns a function that is the composition of a list of functions, each
+// consuming the return value of the function that follows.
+export default function compose() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/constant.js b/node_modules/jsonpath/node_modules/underscore/modules/constant.js
new file mode 100644
index 00000000..6cfd92ce
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/constant.js
@@ -0,0 +1,6 @@
+// Predicate-generating function. Often useful outside of Underscore.
+export default function constant(value) {
+ return function() {
+ return value;
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/contains.js b/node_modules/jsonpath/node_modules/underscore/modules/contains.js
new file mode 100644
index 00000000..11cf64d6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/contains.js
@@ -0,0 +1,10 @@
+import isArrayLike from './_isArrayLike.js';
+import values from './values.js';
+import indexOf from './indexOf.js';
+
+// Determine if the array or object contains a given item (using `===`).
+export default function contains(obj, item, fromIndex, guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return indexOf(obj, item, fromIndex) >= 0;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/countBy.js b/node_modules/jsonpath/node_modules/underscore/modules/countBy.js
new file mode 100644
index 00000000..5d4cc7d9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/countBy.js
@@ -0,0 +1,9 @@
+import group from './_group.js';
+import has from './_has.js';
+
+// Counts instances of an object that group by a certain criterion. Pass
+// either a string attribute to count by, or a function that returns the
+// criterion.
+export default group(function(result, value, key) {
+ if (has(result, key)) result[key]++; else result[key] = 1;
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/create.js b/node_modules/jsonpath/node_modules/underscore/modules/create.js
new file mode 100644
index 00000000..353e5a50
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/create.js
@@ -0,0 +1,11 @@
+import baseCreate from './_baseCreate.js';
+import extendOwn from './extendOwn.js';
+
+// Creates an object that inherits from the given prototype object.
+// If additional properties are provided then they will be added to the
+// created object.
+export default function create(prototype, props) {
+ var result = baseCreate(prototype);
+ if (props) extendOwn(result, props);
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/debounce.js b/node_modules/jsonpath/node_modules/underscore/modules/debounce.js
new file mode 100644
index 00000000..76e3ae82
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/debounce.js
@@ -0,0 +1,40 @@
+import restArguments from './restArguments.js';
+import now from './now.js';
+
+// When a sequence of calls of the returned function ends, the argument
+// function is triggered. The end of a sequence is defined by the `wait`
+// parameter. If `immediate` is passed, the argument function will be
+// triggered at the beginning of the sequence instead of at the end.
+export default function debounce(func, wait, immediate) {
+ var timeout, previous, args, result, context;
+
+ var later = function() {
+ var passed = now() - previous;
+ if (wait > passed) {
+ timeout = setTimeout(later, wait - passed);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ // This check is needed because `func` can recursively invoke `debounced`.
+ if (!timeout) args = context = null;
+ }
+ };
+
+ var debounced = restArguments(function(_args) {
+ context = this;
+ args = _args;
+ previous = now();
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ if (immediate) result = func.apply(context, args);
+ }
+ return result;
+ });
+
+ debounced.cancel = function() {
+ clearTimeout(timeout);
+ timeout = args = context = null;
+ };
+
+ return debounced;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/defaults.js b/node_modules/jsonpath/node_modules/underscore/modules/defaults.js
new file mode 100644
index 00000000..48016cca
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/defaults.js
@@ -0,0 +1,5 @@
+import createAssigner from './_createAssigner.js';
+import allKeys from './allKeys.js';
+
+// Fill in a given object with default properties.
+export default createAssigner(allKeys, true);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/defer.js b/node_modules/jsonpath/node_modules/underscore/modules/defer.js
new file mode 100644
index 00000000..19c85fd5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/defer.js
@@ -0,0 +1,7 @@
+import partial from './partial.js';
+import delay from './delay.js';
+import _ from './underscore.js';
+
+// Defers a function, scheduling it to run after the current call stack has
+// cleared.
+export default partial(delay, _, 1);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/delay.js b/node_modules/jsonpath/node_modules/underscore/modules/delay.js
new file mode 100644
index 00000000..c144a846
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/delay.js
@@ -0,0 +1,9 @@
+import restArguments from './restArguments.js';
+
+// Delays a function for the given number of milliseconds, and then calls
+// it with the arguments supplied.
+export default restArguments(function(func, wait, args) {
+ return setTimeout(function() {
+ return func.apply(null, args);
+ }, wait);
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/difference.js b/node_modules/jsonpath/node_modules/underscore/modules/difference.js
new file mode 100644
index 00000000..c769923d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/difference.js
@@ -0,0 +1,13 @@
+import restArguments from './restArguments.js';
+import flatten from './_flatten.js';
+import filter from './filter.js';
+import contains from './contains.js';
+
+// Take the difference between one array and a number of other arrays.
+// Only the elements present in just the first array will remain.
+export default restArguments(function(array, rest) {
+ rest = flatten(rest, true, true);
+ return filter(array, function(value){
+ return !contains(rest, value);
+ });
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/each.js b/node_modules/jsonpath/node_modules/underscore/modules/each.js
new file mode 100644
index 00000000..d0502009
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/each.js
@@ -0,0 +1,23 @@
+import optimizeCb from './_optimizeCb.js';
+import isArrayLike from './_isArrayLike.js';
+import keys from './keys.js';
+
+// The cornerstone for collection functions, an `each`
+// implementation, aka `forEach`.
+// Handles raw objects in addition to array-likes. Treats all
+// sparse array-likes as if they were dense.
+export default function each(obj, iteratee, context) {
+ iteratee = optimizeCb(iteratee, context);
+ var i, length;
+ if (isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var _keys = keys(obj);
+ for (i = 0, length = _keys.length; i < length; i++) {
+ iteratee(obj[_keys[i]], _keys[i], obj);
+ }
+ }
+ return obj;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/escape.js b/node_modules/jsonpath/node_modules/underscore/modules/escape.js
new file mode 100644
index 00000000..2bcb68f0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/escape.js
@@ -0,0 +1,5 @@
+import createEscaper from './_createEscaper.js';
+import escapeMap from './_escapeMap.js';
+
+// Function for escaping strings to HTML interpolation.
+export default createEscaper(escapeMap);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/every.js b/node_modules/jsonpath/node_modules/underscore/modules/every.js
new file mode 100644
index 00000000..9bc1408b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/every.js
@@ -0,0 +1,15 @@
+import cb from './_cb.js';
+import isArrayLike from './_isArrayLike.js';
+import keys from './keys.js';
+
+// Determine whether all of the elements pass a truth test.
+export default function every(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/extend.js b/node_modules/jsonpath/node_modules/underscore/modules/extend.js
new file mode 100644
index 00000000..e22032b4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/extend.js
@@ -0,0 +1,5 @@
+import createAssigner from './_createAssigner.js';
+import allKeys from './allKeys.js';
+
+// Extend a given object with all the properties in passed-in object(s).
+export default createAssigner(allKeys);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/extendOwn.js b/node_modules/jsonpath/node_modules/underscore/modules/extendOwn.js
new file mode 100644
index 00000000..5338451d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/extendOwn.js
@@ -0,0 +1,7 @@
+import createAssigner from './_createAssigner.js';
+import keys from './keys.js';
+
+// Assigns a given object with all the own properties in the passed-in
+// object(s).
+// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+export default createAssigner(keys);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/filter.js b/node_modules/jsonpath/node_modules/underscore/modules/filter.js
new file mode 100644
index 00000000..d1701125
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/filter.js
@@ -0,0 +1,12 @@
+import cb from './_cb.js';
+import each from './each.js';
+
+// Return all the elements that pass a truth test.
+export default function filter(obj, predicate, context) {
+ var results = [];
+ predicate = cb(predicate, context);
+ each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/find.js b/node_modules/jsonpath/node_modules/underscore/modules/find.js
new file mode 100644
index 00000000..d1f4d280
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/find.js
@@ -0,0 +1,10 @@
+import isArrayLike from './_isArrayLike.js';
+import findIndex from './findIndex.js';
+import findKey from './findKey.js';
+
+// Return the first value which passes a truth test.
+export default function find(obj, predicate, context) {
+ var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+ var key = keyFinder(obj, predicate, context);
+ if (key !== void 0 && key !== -1) return obj[key];
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/findIndex.js b/node_modules/jsonpath/node_modules/underscore/modules/findIndex.js
new file mode 100644
index 00000000..b2c87f51
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/findIndex.js
@@ -0,0 +1,4 @@
+import createPredicateIndexFinder from './_createPredicateIndexFinder.js';
+
+// Returns the first index on an array-like that passes a truth test.
+export default createPredicateIndexFinder(1);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/findKey.js b/node_modules/jsonpath/node_modules/underscore/modules/findKey.js
new file mode 100644
index 00000000..e80f1c11
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/findKey.js
@@ -0,0 +1,12 @@
+import cb from './_cb.js';
+import keys from './keys.js';
+
+// Returns the first key on an object that passes a truth test.
+export default function findKey(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = keys(obj), key;
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ key = _keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/findLastIndex.js b/node_modules/jsonpath/node_modules/underscore/modules/findLastIndex.js
new file mode 100644
index 00000000..58f26a73
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/findLastIndex.js
@@ -0,0 +1,4 @@
+import createPredicateIndexFinder from './_createPredicateIndexFinder.js';
+
+// Returns the last index on an array-like that passes a truth test.
+export default createPredicateIndexFinder(-1);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/findWhere.js b/node_modules/jsonpath/node_modules/underscore/modules/findWhere.js
new file mode 100644
index 00000000..6e8bce9e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/findWhere.js
@@ -0,0 +1,8 @@
+import find from './find.js';
+import matcher from './matcher.js';
+
+// Convenience version of a common use case of `_.find`: getting the first
+// object containing specific `key:value` pairs.
+export default function findWhere(obj, attrs) {
+ return find(obj, matcher(attrs));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/first.js b/node_modules/jsonpath/node_modules/underscore/modules/first.js
new file mode 100644
index 00000000..3b6685e1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/first.js
@@ -0,0 +1,9 @@
+import initial from './initial.js';
+
+// Get the first element of an array. Passing **n** will return the first N
+// values in the array. The **guard** check allows it to work with `_.map`.
+export default function first(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[0];
+ return initial(array, array.length - n);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/flatten.js b/node_modules/jsonpath/node_modules/underscore/modules/flatten.js
new file mode 100644
index 00000000..a5f2b512
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/flatten.js
@@ -0,0 +1,7 @@
+import _flatten from './_flatten.js';
+
+// Flatten out an array, either recursively (by default), or up to `depth`.
+// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+export default function flatten(array, depth) {
+ return _flatten(array, depth, false);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/functions.js b/node_modules/jsonpath/node_modules/underscore/modules/functions.js
new file mode 100644
index 00000000..a16e5683
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/functions.js
@@ -0,0 +1,10 @@
+import isFunction from './isFunction.js';
+
+// Return a sorted list of the function names available on the object.
+export default function functions(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/get.js b/node_modules/jsonpath/node_modules/underscore/modules/get.js
new file mode 100644
index 00000000..6987abe6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/get.js
@@ -0,0 +1,12 @@
+import toPath from './_toPath.js';
+import deepGet from './_deepGet.js';
+import isUndefined from './isUndefined.js';
+
+// Get the value of the (deep) property on `path` from `object`.
+// If any property in `path` does not exist or if the value is
+// `undefined`, return `defaultValue` instead.
+// The `path` is normalized through `_.toPath`.
+export default function get(object, path, defaultValue) {
+ var value = deepGet(object, toPath(path));
+ return isUndefined(value) ? defaultValue : value;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/groupBy.js b/node_modules/jsonpath/node_modules/underscore/modules/groupBy.js
new file mode 100644
index 00000000..2670958d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/groupBy.js
@@ -0,0 +1,8 @@
+import group from './_group.js';
+import has from './_has.js';
+
+// Groups the object's values by a criterion. Pass either a string attribute
+// to group by, or a function that returns the criterion.
+export default group(function(result, value, key) {
+ if (has(result, key)) result[key].push(value); else result[key] = [value];
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/has.js b/node_modules/jsonpath/node_modules/underscore/modules/has.js
new file mode 100644
index 00000000..72326463
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/has.js
@@ -0,0 +1,16 @@
+import _has from './_has.js';
+import toPath from './_toPath.js';
+
+// Shortcut function for checking if an object has a given property directly on
+// itself (in other words, not on a prototype). Unlike the internal `has`
+// function, this public version can also traverse nested properties.
+export default function has(obj, path) {
+ path = toPath(path);
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ var key = path[i];
+ if (!_has(obj, key)) return false;
+ obj = obj[key];
+ }
+ return !!length;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/identity.js b/node_modules/jsonpath/node_modules/underscore/modules/identity.js
new file mode 100644
index 00000000..6df631c1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/identity.js
@@ -0,0 +1,4 @@
+// Keep the identity function around for default iteratees.
+export default function identity(value) {
+ return value;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/index-all.js b/node_modules/jsonpath/node_modules/underscore/modules/index-all.js
new file mode 100644
index 00000000..dd2cbc1d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/index-all.js
@@ -0,0 +1,18 @@
+// ESM Exports
+// ===========
+// This module is the package entry point for ES module users. In other words,
+// it is the module they are interfacing with when they import from the whole
+// package instead of from a submodule, like this:
+//
+// ```js
+// import { map } from 'underscore';
+// ```
+//
+// The difference with `./index-default`, which is the package entry point for
+// CommonJS, AMD and UMD users, is purely technical. In ES modules, named and
+// default exports are considered to be siblings, so when you have a default
+// export, its properties are not automatically available as named exports. For
+// this reason, we re-export the named exports in addition to providing the same
+// default export as in `./index-default`.
+export { default } from './index-default.js';
+export * from './index.js';
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/index-default.js b/node_modules/jsonpath/node_modules/underscore/modules/index-default.js
new file mode 100644
index 00000000..d3a2b1e8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/index-default.js
@@ -0,0 +1,27 @@
+// Default Export
+// ==============
+// In this module, we mix our bundled exports into the `_` object and export
+// the result. This is analogous to setting `module.exports = _` in CommonJS.
+// Hence, this module is also the entry point of our UMD bundle and the package
+// entry point for CommonJS and AMD users. In other words, this is (the source
+// of) the module you are interfacing with when you do any of the following:
+//
+// ```js
+// // CommonJS
+// var _ = require('underscore');
+//
+// // AMD
+// define(['underscore'], function(_) {...});
+//
+// // UMD in the browser
+// // _ is available as a global variable
+// ```
+import * as allExports from './index.js';
+import { mixin } from './index.js';
+
+// Add all of the Underscore functions to the wrapper object.
+var _ = mixin(allExports);
+// Legacy Node.js API.
+_._ = _;
+// Export the Underscore API.
+export default _;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/index.js b/node_modules/jsonpath/node_modules/underscore/modules/index.js
new file mode 100644
index 00000000..dd607faa
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/index.js
@@ -0,0 +1,200 @@
+// Named Exports
+// =============
+
+// Underscore.js 1.12.1
+// https://underscorejs.org
+// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+
+// Baseline setup.
+export { VERSION } from './_setup.js';
+export { default as restArguments } from './restArguments.js';
+
+// Object Functions
+// ----------------
+// Our most fundamental functions operate on any JavaScript object.
+// Most functions in Underscore depend on at least one function in this section.
+
+// A group of functions that check the types of core JavaScript values.
+// These are often informally referred to as the "isType" functions.
+export { default as isObject } from './isObject.js';
+export { default as isNull } from './isNull.js';
+export { default as isUndefined } from './isUndefined.js';
+export { default as isBoolean } from './isBoolean.js';
+export { default as isElement } from './isElement.js';
+export { default as isString } from './isString.js';
+export { default as isNumber } from './isNumber.js';
+export { default as isDate } from './isDate.js';
+export { default as isRegExp } from './isRegExp.js';
+export { default as isError } from './isError.js';
+export { default as isSymbol } from './isSymbol.js';
+export { default as isArrayBuffer } from './isArrayBuffer.js';
+export { default as isDataView } from './isDataView.js';
+export { default as isArray } from './isArray.js';
+export { default as isFunction } from './isFunction.js';
+export { default as isArguments } from './isArguments.js';
+export { default as isFinite } from './isFinite.js';
+export { default as isNaN } from './isNaN.js';
+export { default as isTypedArray } from './isTypedArray.js';
+export { default as isEmpty } from './isEmpty.js';
+export { default as isMatch } from './isMatch.js';
+export { default as isEqual } from './isEqual.js';
+export { default as isMap } from './isMap.js';
+export { default as isWeakMap } from './isWeakMap.js';
+export { default as isSet } from './isSet.js';
+export { default as isWeakSet } from './isWeakSet.js';
+
+// Functions that treat an object as a dictionary of key-value pairs.
+export { default as keys } from './keys.js';
+export { default as allKeys } from './allKeys.js';
+export { default as values } from './values.js';
+export { default as pairs } from './pairs.js';
+export { default as invert } from './invert.js';
+export { default as functions,
+ default as methods } from './functions.js';
+export { default as extend } from './extend.js';
+export { default as extendOwn,
+ default as assign } from './extendOwn.js';
+export { default as defaults } from './defaults.js';
+export { default as create } from './create.js';
+export { default as clone } from './clone.js';
+export { default as tap } from './tap.js';
+export { default as get } from './get.js';
+export { default as has } from './has.js';
+export { default as mapObject } from './mapObject.js';
+
+// Utility Functions
+// -----------------
+// A bit of a grab bag: Predicate-generating functions for use with filters and
+// loops, string escaping and templating, create random numbers and unique ids,
+// and functions that facilitate Underscore's chaining and iteration conventions.
+export { default as identity } from './identity.js';
+export { default as constant } from './constant.js';
+export { default as noop } from './noop.js';
+export { default as toPath } from './toPath.js';
+export { default as property } from './property.js';
+export { default as propertyOf } from './propertyOf.js';
+export { default as matcher,
+ default as matches } from './matcher.js';
+export { default as times } from './times.js';
+export { default as random } from './random.js';
+export { default as now } from './now.js';
+export { default as escape } from './escape.js';
+export { default as unescape } from './unescape.js';
+export { default as templateSettings } from './templateSettings.js';
+export { default as template } from './template.js';
+export { default as result } from './result.js';
+export { default as uniqueId } from './uniqueId.js';
+export { default as chain } from './chain.js';
+export { default as iteratee } from './iteratee.js';
+
+// Function (ahem) Functions
+// -------------------------
+// These functions take a function as an argument and return a new function
+// as the result. Also known as higher-order functions.
+export { default as partial } from './partial.js';
+export { default as bind } from './bind.js';
+export { default as bindAll } from './bindAll.js';
+export { default as memoize } from './memoize.js';
+export { default as delay } from './delay.js';
+export { default as defer } from './defer.js';
+export { default as throttle } from './throttle.js';
+export { default as debounce } from './debounce.js';
+export { default as wrap } from './wrap.js';
+export { default as negate } from './negate.js';
+export { default as compose } from './compose.js';
+export { default as after } from './after.js';
+export { default as before } from './before.js';
+export { default as once } from './once.js';
+
+// Finders
+// -------
+// Functions that extract (the position of) a single element from an object
+// or array based on some criterion.
+export { default as findKey } from './findKey.js';
+export { default as findIndex } from './findIndex.js';
+export { default as findLastIndex } from './findLastIndex.js';
+export { default as sortedIndex } from './sortedIndex.js';
+export { default as indexOf } from './indexOf.js';
+export { default as lastIndexOf } from './lastIndexOf.js';
+export { default as find,
+ default as detect } from './find.js';
+export { default as findWhere } from './findWhere.js';
+
+// Collection Functions
+// --------------------
+// Functions that work on any collection of elements: either an array, or
+// an object of key-value pairs.
+export { default as each,
+ default as forEach } from './each.js';
+export { default as map,
+ default as collect } from './map.js';
+export { default as reduce,
+ default as foldl,
+ default as inject } from './reduce.js';
+export { default as reduceRight,
+ default as foldr } from './reduceRight.js';
+export { default as filter,
+ default as select } from './filter.js';
+export { default as reject } from './reject.js';
+export { default as every,
+ default as all } from './every.js';
+export { default as some,
+ default as any } from './some.js';
+export { default as contains,
+ default as includes,
+ default as include } from './contains.js';
+export { default as invoke } from './invoke.js';
+export { default as pluck } from './pluck.js';
+export { default as where } from './where.js';
+export { default as max } from './max.js';
+export { default as min } from './min.js';
+export { default as shuffle } from './shuffle.js';
+export { default as sample } from './sample.js';
+export { default as sortBy } from './sortBy.js';
+export { default as groupBy } from './groupBy.js';
+export { default as indexBy } from './indexBy.js';
+export { default as countBy } from './countBy.js';
+export { default as partition } from './partition.js';
+export { default as toArray } from './toArray.js';
+export { default as size } from './size.js';
+
+// `_.pick` and `_.omit` are actually object functions, but we put
+// them here in order to create a more natural reading order in the
+// monolithic build as they depend on `_.contains`.
+export { default as pick } from './pick.js';
+export { default as omit } from './omit.js';
+
+// Array Functions
+// ---------------
+// Functions that operate on arrays (and array-likes) only, because they’re
+// expressed in terms of operations on an ordered list of values.
+export { default as first,
+ default as head,
+ default as take } from './first.js';
+export { default as initial } from './initial.js';
+export { default as last } from './last.js';
+export { default as rest,
+ default as tail,
+ default as drop } from './rest.js';
+export { default as compact } from './compact.js';
+export { default as flatten } from './flatten.js';
+export { default as without } from './without.js';
+export { default as uniq,
+ default as unique } from './uniq.js';
+export { default as union } from './union.js';
+export { default as intersection } from './intersection.js';
+export { default as difference } from './difference.js';
+export { default as unzip,
+ default as transpose } from './unzip.js';
+export { default as zip } from './zip.js';
+export { default as object } from './object.js';
+export { default as range } from './range.js';
+export { default as chunk } from './chunk.js';
+
+// OOP
+// ---
+// These modules support the "object-oriented" calling style. See also
+// `underscore.js` and `index-default.js`.
+export { default as mixin } from './mixin.js';
+export { default } from './underscore-array-methods.js';
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/indexBy.js b/node_modules/jsonpath/node_modules/underscore/modules/indexBy.js
new file mode 100644
index 00000000..8fb81ea0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/indexBy.js
@@ -0,0 +1,7 @@
+import group from './_group.js';
+
+// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+// when you know that your index values will be unique.
+export default group(function(result, value, key) {
+ result[key] = value;
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/indexOf.js b/node_modules/jsonpath/node_modules/underscore/modules/indexOf.js
new file mode 100644
index 00000000..a926ba5a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/indexOf.js
@@ -0,0 +1,9 @@
+import sortedIndex from './sortedIndex.js';
+import findIndex from './findIndex.js';
+import createIndexFinder from './_createIndexFinder.js';
+
+// Return the position of the first occurrence of an item in an array,
+// or -1 if the item is not included in the array.
+// If the array is large and already in sort order, pass `true`
+// for **isSorted** to use binary search.
+export default createIndexFinder(1, findIndex, sortedIndex);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/initial.js b/node_modules/jsonpath/node_modules/underscore/modules/initial.js
new file mode 100644
index 00000000..0b991dcc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/initial.js
@@ -0,0 +1,8 @@
+import { slice } from './_setup.js';
+
+// Returns everything but the last entry of the array. Especially useful on
+// the arguments object. Passing **n** will return all the values in
+// the array, excluding the last N.
+export default function initial(array, n, guard) {
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/intersection.js b/node_modules/jsonpath/node_modules/underscore/modules/intersection.js
new file mode 100644
index 00000000..60d1df40
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/intersection.js
@@ -0,0 +1,19 @@
+import getLength from './_getLength.js';
+import contains from './contains.js';
+
+// Produce an array that contains every item shared between all the
+// passed-in arrays.
+export default function intersection(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var item = array[i];
+ if (contains(result, item)) continue;
+ var j;
+ for (j = 1; j < argsLength; j++) {
+ if (!contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/invert.js b/node_modules/jsonpath/node_modules/underscore/modules/invert.js
new file mode 100644
index 00000000..898b16a0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/invert.js
@@ -0,0 +1,11 @@
+import keys from './keys.js';
+
+// Invert the keys and values of an object. The values must be serializable.
+export default function invert(obj) {
+ var result = {};
+ var _keys = keys(obj);
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ result[obj[_keys[i]]] = _keys[i];
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/invoke.js b/node_modules/jsonpath/node_modules/underscore/modules/invoke.js
new file mode 100644
index 00000000..b18af887
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/invoke.js
@@ -0,0 +1,28 @@
+import restArguments from './restArguments.js';
+import isFunction from './isFunction.js';
+import map from './map.js';
+import deepGet from './_deepGet.js';
+import toPath from './_toPath.js';
+
+// Invoke a method (with arguments) on every item in a collection.
+export default restArguments(function(obj, path, args) {
+ var contextPath, func;
+ if (isFunction(path)) {
+ func = path;
+ } else {
+ path = toPath(path);
+ contextPath = path.slice(0, -1);
+ path = path[path.length - 1];
+ }
+ return map(obj, function(context) {
+ var method = func;
+ if (!method) {
+ if (contextPath && contextPath.length) {
+ context = deepGet(context, contextPath);
+ }
+ if (context == null) return void 0;
+ method = context[path];
+ }
+ return method == null ? method : method.apply(context, args);
+ });
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isArguments.js b/node_modules/jsonpath/node_modules/underscore/modules/isArguments.js
new file mode 100644
index 00000000..61582bf8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isArguments.js
@@ -0,0 +1,16 @@
+import tagTester from './_tagTester.js';
+import has from './_has.js';
+
+var isArguments = tagTester('Arguments');
+
+// Define a fallback version of the method in browsers (ahem, IE < 9), where
+// there isn't any inspectable "Arguments" type.
+(function() {
+ if (!isArguments(arguments)) {
+ isArguments = function(obj) {
+ return has(obj, 'callee');
+ };
+ }
+}());
+
+export default isArguments;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isArray.js b/node_modules/jsonpath/node_modules/underscore/modules/isArray.js
new file mode 100644
index 00000000..7ead47d7
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isArray.js
@@ -0,0 +1,6 @@
+import { nativeIsArray } from './_setup.js';
+import tagTester from './_tagTester.js';
+
+// Is a given value an array?
+// Delegates to ECMA5's native `Array.isArray`.
+export default nativeIsArray || tagTester('Array');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isArrayBuffer.js b/node_modules/jsonpath/node_modules/underscore/modules/isArrayBuffer.js
new file mode 100644
index 00000000..867ba4b2
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isArrayBuffer.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('ArrayBuffer');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isBoolean.js b/node_modules/jsonpath/node_modules/underscore/modules/isBoolean.js
new file mode 100644
index 00000000..3dddf2c1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isBoolean.js
@@ -0,0 +1,6 @@
+import { toString } from './_setup.js';
+
+// Is a given value a boolean?
+export default function isBoolean(obj) {
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isDataView.js b/node_modules/jsonpath/node_modules/underscore/modules/isDataView.js
new file mode 100644
index 00000000..e607856a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isDataView.js
@@ -0,0 +1,14 @@
+import tagTester from './_tagTester.js';
+import isFunction from './isFunction.js';
+import isArrayBuffer from './isArrayBuffer.js';
+import { hasStringTagBug } from './_stringTagBug.js';
+
+var isDataView = tagTester('DataView');
+
+// In IE 10 - Edge 13, we need a different heuristic
+// to determine whether an object is a `DataView`.
+function ie10IsDataView(obj) {
+ return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);
+}
+
+export default (hasStringTagBug ? ie10IsDataView : isDataView);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isDate.js b/node_modules/jsonpath/node_modules/underscore/modules/isDate.js
new file mode 100644
index 00000000..25e1d1c3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isDate.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('Date');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isElement.js b/node_modules/jsonpath/node_modules/underscore/modules/isElement.js
new file mode 100644
index 00000000..4ab415a8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isElement.js
@@ -0,0 +1,4 @@
+// Is a given value a DOM element?
+export default function isElement(obj) {
+ return !!(obj && obj.nodeType === 1);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isEmpty.js b/node_modules/jsonpath/node_modules/underscore/modules/isEmpty.js
new file mode 100644
index 00000000..718ef4a6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isEmpty.js
@@ -0,0 +1,18 @@
+import getLength from './_getLength.js';
+import isArray from './isArray.js';
+import isString from './isString.js';
+import isArguments from './isArguments.js';
+import keys from './keys.js';
+
+// Is a given array, string, or object empty?
+// An "empty" object has no enumerable own-properties.
+export default function isEmpty(obj) {
+ if (obj == null) return true;
+ // Skip the more expensive `toString`-based type checks if `obj` has no
+ // `.length`.
+ var length = getLength(obj);
+ if (typeof length == 'number' && (
+ isArray(obj) || isString(obj) || isArguments(obj)
+ )) return length === 0;
+ return getLength(keys(obj)) === 0;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isEqual.js b/node_modules/jsonpath/node_modules/underscore/modules/isEqual.js
new file mode 100644
index 00000000..5285c55a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isEqual.js
@@ -0,0 +1,138 @@
+import _ from './underscore.js';
+import { toString, SymbolProto } from './_setup.js';
+import getByteLength from './_getByteLength.js';
+import isTypedArray from './isTypedArray.js';
+import isFunction from './isFunction.js';
+import { hasStringTagBug } from './_stringTagBug.js';
+import isDataView from './isDataView.js';
+import keys from './keys.js';
+import has from './_has.js';
+import toBufferView from './_toBufferView.js';
+
+// We use this string twice, so give it a name for minification.
+var tagDataView = '[object DataView]';
+
+// Internal recursive comparison function for `_.isEqual`.
+function eq(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // `null` or `undefined` only equal to itself (strict comparison).
+ if (a == null || b == null) return false;
+ // `NaN`s are equivalent, but non-reflexive.
+ if (a !== a) return b !== b;
+ // Exhaust primitive checks
+ var type = typeof a;
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+ return deepEq(a, b, aStack, bStack);
+}
+
+// Internal recursive comparison function for `_.isEqual`.
+function deepEq(a, b, aStack, bStack) {
+ // Unwrap any wrapped objects.
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className !== toString.call(b)) return false;
+ // Work around a bug in IE 10 - Edge 13.
+ if (hasStringTagBug && className == '[object Object]' && isDataView(a)) {
+ if (!isDataView(b)) return false;
+ className = tagDataView;
+ }
+ switch (className) {
+ // These types are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN.
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ case '[object Symbol]':
+ return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+ case '[object ArrayBuffer]':
+ case tagDataView:
+ // Coerce to typed array so we can fall through.
+ return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays && isTypedArray(a)) {
+ var byteLength = getByteLength(a);
+ if (byteLength !== getByteLength(b)) return false;
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+ areArrays = true;
+ }
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
+ isFunction(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var _keys = keys(a), key;
+ length = _keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = _keys[length];
+ if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+}
+
+// Perform a deep comparison to check if two objects are equal.
+export default function isEqual(a, b) {
+ return eq(a, b);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isError.js b/node_modules/jsonpath/node_modules/underscore/modules/isError.js
new file mode 100644
index 00000000..178fa3ec
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isError.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('Error');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isFinite.js b/node_modules/jsonpath/node_modules/underscore/modules/isFinite.js
new file mode 100644
index 00000000..fbeb79ef
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isFinite.js
@@ -0,0 +1,7 @@
+import { _isFinite } from './_setup.js';
+import isSymbol from './isSymbol.js';
+
+// Is a given object a finite number?
+export default function isFinite(obj) {
+ return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isFunction.js b/node_modules/jsonpath/node_modules/underscore/modules/isFunction.js
new file mode 100644
index 00000000..35c41be0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isFunction.js
@@ -0,0 +1,15 @@
+import tagTester from './_tagTester.js';
+import { root } from './_setup.js';
+
+var isFunction = tagTester('Function');
+
+// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+var nodelist = root.document && root.document.childNodes;
+if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+ isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+}
+
+export default isFunction;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isMap.js b/node_modules/jsonpath/node_modules/underscore/modules/isMap.js
new file mode 100644
index 00000000..1e9f0954
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isMap.js
@@ -0,0 +1,5 @@
+import tagTester from './_tagTester.js';
+import { isIE11 } from './_stringTagBug.js';
+import { ie11fingerprint, mapMethods } from './_methodFingerprint.js';
+
+export default isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isMatch.js b/node_modules/jsonpath/node_modules/underscore/modules/isMatch.js
new file mode 100644
index 00000000..81e43d95
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isMatch.js
@@ -0,0 +1,13 @@
+import keys from './keys.js';
+
+// Returns whether an object has a given set of `key:value` pairs.
+export default function isMatch(object, attrs) {
+ var _keys = keys(attrs), length = _keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = _keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isNaN.js b/node_modules/jsonpath/node_modules/underscore/modules/isNaN.js
new file mode 100644
index 00000000..9fa7afee
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isNaN.js
@@ -0,0 +1,7 @@
+import { _isNaN } from './_setup.js';
+import isNumber from './isNumber.js';
+
+// Is the given value `NaN`?
+export default function isNaN(obj) {
+ return isNumber(obj) && _isNaN(obj);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isNull.js b/node_modules/jsonpath/node_modules/underscore/modules/isNull.js
new file mode 100644
index 00000000..e729c2ee
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isNull.js
@@ -0,0 +1,4 @@
+// Is a given value equal to null?
+export default function isNull(obj) {
+ return obj === null;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isNumber.js b/node_modules/jsonpath/node_modules/underscore/modules/isNumber.js
new file mode 100644
index 00000000..627d8d4d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isNumber.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('Number');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isObject.js b/node_modules/jsonpath/node_modules/underscore/modules/isObject.js
new file mode 100644
index 00000000..73230f00
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isObject.js
@@ -0,0 +1,5 @@
+// Is a given variable an object?
+export default function isObject(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isRegExp.js b/node_modules/jsonpath/node_modules/underscore/modules/isRegExp.js
new file mode 100644
index 00000000..ef64d1e8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isRegExp.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('RegExp');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isSet.js b/node_modules/jsonpath/node_modules/underscore/modules/isSet.js
new file mode 100644
index 00000000..0e8b6ca6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isSet.js
@@ -0,0 +1,5 @@
+import tagTester from './_tagTester.js';
+import { isIE11 } from './_stringTagBug.js';
+import { ie11fingerprint, setMethods } from './_methodFingerprint.js';
+
+export default isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isString.js b/node_modules/jsonpath/node_modules/underscore/modules/isString.js
new file mode 100644
index 00000000..f02707d3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isString.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('String');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isSymbol.js b/node_modules/jsonpath/node_modules/underscore/modules/isSymbol.js
new file mode 100644
index 00000000..de4050d5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isSymbol.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('Symbol');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isTypedArray.js b/node_modules/jsonpath/node_modules/underscore/modules/isTypedArray.js
new file mode 100644
index 00000000..a65c917e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isTypedArray.js
@@ -0,0 +1,15 @@
+import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js';
+import isDataView from './isDataView.js';
+import constant from './constant.js';
+import isBufferLike from './_isBufferLike.js';
+
+// Is a given value a typed array?
+var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+function isTypedArray(obj) {
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+ // Otherwise, fall back on the above regular expression.
+ return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :
+ isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+}
+
+export default supportsArrayBuffer ? isTypedArray : constant(false);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isUndefined.js b/node_modules/jsonpath/node_modules/underscore/modules/isUndefined.js
new file mode 100644
index 00000000..eddf88f1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isUndefined.js
@@ -0,0 +1,4 @@
+// Is a given variable undefined?
+export default function isUndefined(obj) {
+ return obj === void 0;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isWeakMap.js b/node_modules/jsonpath/node_modules/underscore/modules/isWeakMap.js
new file mode 100644
index 00000000..729ca474
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isWeakMap.js
@@ -0,0 +1,5 @@
+import tagTester from './_tagTester.js';
+import { isIE11 } from './_stringTagBug.js';
+import { ie11fingerprint, weakMapMethods } from './_methodFingerprint.js';
+
+export default isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/isWeakSet.js b/node_modules/jsonpath/node_modules/underscore/modules/isWeakSet.js
new file mode 100644
index 00000000..5331048e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/isWeakSet.js
@@ -0,0 +1,3 @@
+import tagTester from './_tagTester.js';
+
+export default tagTester('WeakSet');
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/iteratee.js b/node_modules/jsonpath/node_modules/underscore/modules/iteratee.js
new file mode 100644
index 00000000..9057701b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/iteratee.js
@@ -0,0 +1,10 @@
+import _ from './underscore.js';
+import baseIteratee from './_baseIteratee.js';
+
+// External wrapper for our callback generator. Users may customize
+// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+// This abstraction hides the internal-only `argCount` argument.
+export default function iteratee(value, context) {
+ return baseIteratee(value, context, Infinity);
+}
+_.iteratee = iteratee;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/keys.js b/node_modules/jsonpath/node_modules/underscore/modules/keys.js
new file mode 100644
index 00000000..f5b596cf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/keys.js
@@ -0,0 +1,16 @@
+import isObject from './isObject.js';
+import { nativeKeys, hasEnumBug } from './_setup.js';
+import has from './_has.js';
+import collectNonEnumProps from './_collectNonEnumProps.js';
+
+// Retrieve the names of an object's own properties.
+// Delegates to **ECMAScript 5**'s native `Object.keys`.
+export default function keys(obj) {
+ if (!isObject(obj)) return [];
+ if (nativeKeys) return nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/last.js b/node_modules/jsonpath/node_modules/underscore/modules/last.js
new file mode 100644
index 00000000..3f30ebc1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/last.js
@@ -0,0 +1,9 @@
+import rest from './rest.js';
+
+// Get the last element of an array. Passing **n** will return the last N
+// values in the array.
+export default function last(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[array.length - 1];
+ return rest(array, Math.max(0, array.length - n));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/lastIndexOf.js b/node_modules/jsonpath/node_modules/underscore/modules/lastIndexOf.js
new file mode 100644
index 00000000..bcacf495
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/lastIndexOf.js
@@ -0,0 +1,6 @@
+import findLastIndex from './findLastIndex.js';
+import createIndexFinder from './_createIndexFinder.js';
+
+// Return the position of the last occurrence of an item in an array,
+// or -1 if the item is not included in the array.
+export default createIndexFinder(-1, findLastIndex);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/map.js b/node_modules/jsonpath/node_modules/underscore/modules/map.js
new file mode 100644
index 00000000..a2e51216
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/map.js
@@ -0,0 +1,16 @@
+import cb from './_cb.js';
+import isArrayLike from './_isArrayLike.js';
+import keys from './keys.js';
+
+// Return the results of applying the iteratee to each element.
+export default function map(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/mapObject.js b/node_modules/jsonpath/node_modules/underscore/modules/mapObject.js
new file mode 100644
index 00000000..2b44d286
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/mapObject.js
@@ -0,0 +1,16 @@
+import cb from './_cb.js';
+import keys from './keys.js';
+
+// Returns the results of applying the `iteratee` to each element of `obj`.
+// In contrast to `_.map` it returns an object.
+export default function mapObject(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = keys(obj),
+ length = _keys.length,
+ results = {};
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/matcher.js b/node_modules/jsonpath/node_modules/underscore/modules/matcher.js
new file mode 100644
index 00000000..245fa944
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/matcher.js
@@ -0,0 +1,11 @@
+import extendOwn from './extendOwn.js';
+import isMatch from './isMatch.js';
+
+// Returns a predicate for checking whether an object has a given set of
+// `key:value` pairs.
+export default function matcher(attrs) {
+ attrs = extendOwn({}, attrs);
+ return function(obj) {
+ return isMatch(obj, attrs);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/max.js b/node_modules/jsonpath/node_modules/underscore/modules/max.js
new file mode 100644
index 00000000..9873b35d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/max.js
@@ -0,0 +1,29 @@
+import isArrayLike from './_isArrayLike.js';
+import values from './values.js';
+import cb from './_cb.js';
+import each from './each.js';
+
+// Return the maximum element (or element-based computation).
+export default function max(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/memoize.js b/node_modules/jsonpath/node_modules/underscore/modules/memoize.js
new file mode 100644
index 00000000..50c55f53
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/memoize.js
@@ -0,0 +1,13 @@
+import has from './_has.js';
+
+// Memoize an expensive function by storing its results.
+export default function memoize(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/min.js b/node_modules/jsonpath/node_modules/underscore/modules/min.js
new file mode 100644
index 00000000..32f92a06
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/min.js
@@ -0,0 +1,29 @@
+import isArrayLike from './_isArrayLike.js';
+import values from './values.js';
+import cb from './_cb.js';
+import each from './each.js';
+
+// Return the minimum element (or element-based computation).
+export default function min(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/mixin.js b/node_modules/jsonpath/node_modules/underscore/modules/mixin.js
new file mode 100644
index 00000000..352a76ad
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/mixin.js
@@ -0,0 +1,18 @@
+import _ from './underscore.js';
+import each from './each.js';
+import functions from './functions.js';
+import { push } from './_setup.js';
+import chainResult from './_chainResult.js';
+
+// Add your own custom functions to the Underscore object.
+export default function mixin(obj) {
+ each(functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return chainResult(this, func.apply(_, args));
+ };
+ });
+ return _;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/negate.js b/node_modules/jsonpath/node_modules/underscore/modules/negate.js
new file mode 100644
index 00000000..172c7d65
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/negate.js
@@ -0,0 +1,6 @@
+// Returns a negated version of the passed-in predicate.
+export default function negate(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/noop.js b/node_modules/jsonpath/node_modules/underscore/modules/noop.js
new file mode 100644
index 00000000..9746addc
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/noop.js
@@ -0,0 +1,2 @@
+// Predicate-generating function. Often useful outside of Underscore.
+export default function noop(){}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/now.js b/node_modules/jsonpath/node_modules/underscore/modules/now.js
new file mode 100644
index 00000000..3ab6b3f4
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/now.js
@@ -0,0 +1,4 @@
+// A (possibly faster) way to get the current timestamp as an integer.
+export default Date.now || function() {
+ return new Date().getTime();
+};
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/object.js b/node_modules/jsonpath/node_modules/underscore/modules/object.js
new file mode 100644
index 00000000..d983f8f6
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/object.js
@@ -0,0 +1,16 @@
+import getLength from './_getLength.js';
+
+// Converts lists into objects. Pass either a single array of `[key, value]`
+// pairs, or two parallel arrays of the same length -- one of keys, and one of
+// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+export default function object(list, values) {
+ var result = {};
+ for (var i = 0, length = getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/omit.js b/node_modules/jsonpath/node_modules/underscore/modules/omit.js
new file mode 100644
index 00000000..f7233cf3
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/omit.js
@@ -0,0 +1,22 @@
+import restArguments from './restArguments.js';
+import isFunction from './isFunction.js';
+import negate from './negate.js';
+import map from './map.js';
+import flatten from './_flatten.js';
+import contains from './contains.js';
+import pick from './pick.js';
+
+// Return a copy of the object without the disallowed properties.
+export default restArguments(function(obj, keys) {
+ var iteratee = keys[0], context;
+ if (isFunction(iteratee)) {
+ iteratee = negate(iteratee);
+ if (keys.length > 1) context = keys[1];
+ } else {
+ keys = map(flatten(keys, false, false), String);
+ iteratee = function(value, key) {
+ return !contains(keys, key);
+ };
+ }
+ return pick(obj, iteratee, context);
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/once.js b/node_modules/jsonpath/node_modules/underscore/modules/once.js
new file mode 100644
index 00000000..e7e41ac2
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/once.js
@@ -0,0 +1,6 @@
+import partial from './partial.js';
+import before from './before.js';
+
+// Returns a function that will be executed at most one time, no matter how
+// often you call it. Useful for lazy initialization.
+export default partial(before, 2);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/pairs.js b/node_modules/jsonpath/node_modules/underscore/modules/pairs.js
new file mode 100644
index 00000000..0e4af7bb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/pairs.js
@@ -0,0 +1,13 @@
+import keys from './keys.js';
+
+// Convert an object into a list of `[key, value]` pairs.
+// The opposite of `_.object` with one argument.
+export default function pairs(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [_keys[i], obj[_keys[i]]];
+ }
+ return pairs;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/partial.js b/node_modules/jsonpath/node_modules/underscore/modules/partial.js
new file mode 100644
index 00000000..4a4a4685
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/partial.js
@@ -0,0 +1,24 @@
+import restArguments from './restArguments.js';
+import executeBound from './_executeBound.js';
+import _ from './underscore.js';
+
+// Partially apply a function by creating a version that has had some of its
+// arguments pre-filled, without changing its dynamic `this` context. `_` acts
+// as a placeholder by default, allowing any combination of arguments to be
+// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+var partial = restArguments(function(func, boundArgs) {
+ var placeholder = partial.placeholder;
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return executeBound(func, bound, this, this, args);
+ };
+ return bound;
+});
+
+partial.placeholder = _;
+export default partial;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/partition.js b/node_modules/jsonpath/node_modules/underscore/modules/partition.js
new file mode 100644
index 00000000..bf63c0de
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/partition.js
@@ -0,0 +1,7 @@
+import group from './_group.js';
+
+// Split a collection into two arrays: one whose elements all pass the given
+// truth test, and one whose elements all do not pass the truth test.
+export default group(function(result, value, pass) {
+ result[pass ? 0 : 1].push(value);
+}, true);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/pick.js b/node_modules/jsonpath/node_modules/underscore/modules/pick.js
new file mode 100644
index 00000000..29858a04
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/pick.js
@@ -0,0 +1,26 @@
+import restArguments from './restArguments.js';
+import isFunction from './isFunction.js';
+import optimizeCb from './_optimizeCb.js';
+import allKeys from './allKeys.js';
+import keyInObj from './_keyInObj.js';
+import flatten from './_flatten.js';
+
+// Return a copy of the object only containing the allowed properties.
+export default restArguments(function(obj, keys) {
+ var result = {}, iteratee = keys[0];
+ if (obj == null) return result;
+ if (isFunction(iteratee)) {
+ if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+ keys = allKeys(obj);
+ } else {
+ iteratee = keyInObj;
+ keys = flatten(keys, false, false);
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/pluck.js b/node_modules/jsonpath/node_modules/underscore/modules/pluck.js
new file mode 100644
index 00000000..45a35338
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/pluck.js
@@ -0,0 +1,7 @@
+import map from './map.js';
+import property from './property.js';
+
+// Convenience version of a common use case of `_.map`: fetching a property.
+export default function pluck(obj, key) {
+ return map(obj, property(key));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/property.js b/node_modules/jsonpath/node_modules/underscore/modules/property.js
new file mode 100644
index 00000000..48538668
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/property.js
@@ -0,0 +1,11 @@
+import deepGet from './_deepGet.js';
+import toPath from './_toPath.js';
+
+// Creates a function that, when passed an object, will traverse that object’s
+// properties down the given `path`, specified as an array of keys or indices.
+export default function property(path) {
+ path = toPath(path);
+ return function(obj) {
+ return deepGet(obj, path);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/propertyOf.js b/node_modules/jsonpath/node_modules/underscore/modules/propertyOf.js
new file mode 100644
index 00000000..0bf36f89
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/propertyOf.js
@@ -0,0 +1,10 @@
+import noop from './noop.js';
+import get from './get.js';
+
+// Generates a function for a given object that returns a given property.
+export default function propertyOf(obj) {
+ if (obj == null) return noop;
+ return function(path) {
+ return get(obj, path);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/random.js b/node_modules/jsonpath/node_modules/underscore/modules/random.js
new file mode 100644
index 00000000..d861b60f
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/random.js
@@ -0,0 +1,8 @@
+// Return a random integer between `min` and `max` (inclusive).
+export default function random(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/range.js b/node_modules/jsonpath/node_modules/underscore/modules/range.js
new file mode 100644
index 00000000..9c7c6b87
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/range.js
@@ -0,0 +1,21 @@
+// Generate an integer Array containing an arithmetic progression. A port of
+// the native Python `range()` function. See
+// [the Python documentation](https://docs.python.org/library/functions.html#range).
+export default function range(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/reduce.js b/node_modules/jsonpath/node_modules/underscore/modules/reduce.js
new file mode 100644
index 00000000..951eaa3e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/reduce.js
@@ -0,0 +1,5 @@
+import createReduce from './_createReduce.js';
+
+// **Reduce** builds up a single result from a list of values, aka `inject`,
+// or `foldl`.
+export default createReduce(1);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/reduceRight.js b/node_modules/jsonpath/node_modules/underscore/modules/reduceRight.js
new file mode 100644
index 00000000..2e8e23ae
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/reduceRight.js
@@ -0,0 +1,4 @@
+import createReduce from './_createReduce.js';
+
+// The right-associative version of reduce, also known as `foldr`.
+export default createReduce(-1);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/reject.js b/node_modules/jsonpath/node_modules/underscore/modules/reject.js
new file mode 100644
index 00000000..ba4c841d
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/reject.js
@@ -0,0 +1,8 @@
+import filter from './filter.js';
+import negate from './negate.js';
+import cb from './_cb.js';
+
+// Return all the elements for which a truth test fails.
+export default function reject(obj, predicate, context) {
+ return filter(obj, negate(cb(predicate)), context);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/rest.js b/node_modules/jsonpath/node_modules/underscore/modules/rest.js
new file mode 100644
index 00000000..776b5555
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/rest.js
@@ -0,0 +1,8 @@
+import { slice } from './_setup.js';
+
+// Returns everything but the first entry of the `array`. Especially useful on
+// the `arguments` object. Passing an **n** will return the rest N values in the
+// `array`.
+export default function rest(array, n, guard) {
+ return slice.call(array, n == null || guard ? 1 : n);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/restArguments.js b/node_modules/jsonpath/node_modules/underscore/modules/restArguments.js
new file mode 100644
index 00000000..d12057eb
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/restArguments.js
@@ -0,0 +1,27 @@
+// Some functions take a variable number of arguments, or a few expected
+// arguments at the beginning and then a variable number of values to operate
+// on. This helper accumulates all remaining arguments past the function’s
+// argument length (or an explicit `startIndex`), into an array that becomes
+// the last argument. Similar to ES6’s "rest parameter".
+export default function restArguments(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0),
+ rest = Array(length),
+ index = 0;
+ for (; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ var args = Array(startIndex + 1);
+ for (index = 0; index < startIndex; index++) {
+ args[index] = arguments[index];
+ }
+ args[startIndex] = rest;
+ return func.apply(this, args);
+ };
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/result.js b/node_modules/jsonpath/node_modules/underscore/modules/result.js
new file mode 100644
index 00000000..30c4e200
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/result.js
@@ -0,0 +1,22 @@
+import isFunction from './isFunction.js';
+import toPath from './_toPath.js';
+
+// Traverses the children of `obj` along `path`. If a child is a function, it
+// is invoked with its parent as context. Returns the value of the final
+// child, or `fallback` if any child is undefined.
+export default function result(obj, path, fallback) {
+ path = toPath(path);
+ var length = path.length;
+ if (!length) {
+ return isFunction(fallback) ? fallback.call(obj) : fallback;
+ }
+ for (var i = 0; i < length; i++) {
+ var prop = obj == null ? void 0 : obj[path[i]];
+ if (prop === void 0) {
+ prop = fallback;
+ i = length; // Ensure we don't continue iterating.
+ }
+ obj = isFunction(prop) ? prop.call(obj) : prop;
+ }
+ return obj;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/sample.js b/node_modules/jsonpath/node_modules/underscore/modules/sample.js
new file mode 100644
index 00000000..3a78104c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/sample.js
@@ -0,0 +1,27 @@
+import isArrayLike from './_isArrayLike.js';
+import clone from './clone.js';
+import values from './values.js';
+import getLength from './_getLength.js';
+import random from './random.js';
+
+// Sample **n** random values from a collection using the modern version of the
+// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+// If **n** is not specified, returns a single random element.
+// The internal `guard` argument allows it to work with `_.map`.
+export default function sample(obj, n, guard) {
+ if (n == null || guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ return obj[random(obj.length - 1)];
+ }
+ var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+ var length = getLength(sample);
+ n = Math.max(Math.min(n, length), 0);
+ var last = length - 1;
+ for (var index = 0; index < n; index++) {
+ var rand = random(index, last);
+ var temp = sample[index];
+ sample[index] = sample[rand];
+ sample[rand] = temp;
+ }
+ return sample.slice(0, n);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/shuffle.js b/node_modules/jsonpath/node_modules/underscore/modules/shuffle.js
new file mode 100644
index 00000000..907b87a0
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/shuffle.js
@@ -0,0 +1,6 @@
+import sample from './sample.js';
+
+// Shuffle a collection.
+export default function shuffle(obj) {
+ return sample(obj, Infinity);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/size.js b/node_modules/jsonpath/node_modules/underscore/modules/size.js
new file mode 100644
index 00000000..4ce37148
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/size.js
@@ -0,0 +1,8 @@
+import isArrayLike from './_isArrayLike.js';
+import keys from './keys.js';
+
+// Return the number of elements in a collection.
+export default function size(obj) {
+ if (obj == null) return 0;
+ return isArrayLike(obj) ? obj.length : keys(obj).length;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/some.js b/node_modules/jsonpath/node_modules/underscore/modules/some.js
new file mode 100644
index 00000000..ac09c078
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/some.js
@@ -0,0 +1,15 @@
+import cb from './_cb.js';
+import isArrayLike from './_isArrayLike.js';
+import keys from './keys.js';
+
+// Determine if at least one element in the object passes a truth test.
+export default function some(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/sortBy.js b/node_modules/jsonpath/node_modules/underscore/modules/sortBy.js
new file mode 100644
index 00000000..bca494bf
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/sortBy.js
@@ -0,0 +1,24 @@
+import cb from './_cb.js';
+import pluck from './pluck.js';
+import map from './map.js';
+
+// Sort the object's values by a criterion produced by an iteratee.
+export default function sortBy(obj, iteratee, context) {
+ var index = 0;
+ iteratee = cb(iteratee, context);
+ return pluck(map(obj, function(value, key, list) {
+ return {
+ value: value,
+ index: index++,
+ criteria: iteratee(value, key, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/sortedIndex.js b/node_modules/jsonpath/node_modules/underscore/modules/sortedIndex.js
new file mode 100644
index 00000000..09ead4aa
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/sortedIndex.js
@@ -0,0 +1,15 @@
+import cb from './_cb.js';
+import getLength from './_getLength.js';
+
+// Use a comparator function to figure out the smallest index at which
+// an object should be inserted so as to maintain order. Uses binary search.
+export default function sortedIndex(array, obj, iteratee, context) {
+ iteratee = cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/tap.js b/node_modules/jsonpath/node_modules/underscore/modules/tap.js
new file mode 100644
index 00000000..47537916
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/tap.js
@@ -0,0 +1,7 @@
+// Invokes `interceptor` with the `obj` and then returns `obj`.
+// The primary purpose of this method is to "tap into" a method chain, in
+// order to perform operations on intermediate results within the chain.
+export default function tap(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/template.js b/node_modules/jsonpath/node_modules/underscore/modules/template.js
new file mode 100644
index 00000000..f7e98eda
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/template.js
@@ -0,0 +1,93 @@
+import defaults from './defaults.js';
+import _ from './underscore.js';
+import './templateSettings.js';
+
+// When customizing `_.templateSettings`, if you don't want to define an
+// interpolation, evaluation or escaping regex, we need one that is
+// guaranteed not to match.
+var noMatch = /(.)^/;
+
+// Certain characters need to be escaped so that they can be put into a
+// string literal.
+var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+};
+
+var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+function escapeChar(match) {
+ return '\\' + escapes[match];
+}
+
+var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+// JavaScript micro-templating, similar to John Resig's implementation.
+// Underscore templating handles arbitrary delimiters, preserves whitespace,
+// and correctly escapes quotes within interpolated code.
+// NB: `oldSettings` only exists for backwards compatibility.
+export default function template(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offset.
+ return match;
+ });
+ source += "';\n";
+
+ var argument = settings.variable;
+ if (argument) {
+ if (!bareIdentifier.test(argument)) throw new Error(argument);
+ } else {
+ // If a variable is not specified, place data values in local scope.
+ source = 'with(obj||{}){\n' + source + '}\n';
+ argument = 'obj';
+ }
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ var render;
+ try {
+ render = new Function(argument, '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/templateSettings.js b/node_modules/jsonpath/node_modules/underscore/modules/templateSettings.js
new file mode 100644
index 00000000..4a02f76a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/templateSettings.js
@@ -0,0 +1,9 @@
+import _ from './underscore.js';
+
+// By default, Underscore uses ERB-style template delimiters. Change the
+// following template settings to use alternative delimiters.
+export default _.templateSettings = {
+ evaluate: /<%([\s\S]+?)%>/g,
+ interpolate: /<%=([\s\S]+?)%>/g,
+ escape: /<%-([\s\S]+?)%>/g
+};
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/throttle.js b/node_modules/jsonpath/node_modules/underscore/modules/throttle.js
new file mode 100644
index 00000000..7ab97408
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/throttle.js
@@ -0,0 +1,47 @@
+import now from './now.js';
+
+// Returns a function, that, when invoked, will only be triggered at most once
+// during a given window of time. Normally, the throttled function will run
+// as much as it can, without ever going more than once per `wait` duration;
+// but if you'd like to disable the execution on the leading edge, pass
+// `{leading: false}`. To disable execution on the trailing edge, ditto.
+export default function throttle(func, wait, options) {
+ var timeout, context, args, result;
+ var previous = 0;
+ if (!options) options = {};
+
+ var later = function() {
+ previous = options.leading === false ? 0 : now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+
+ var throttled = function() {
+ var _now = now();
+ if (!previous && options.leading === false) previous = _now;
+ var remaining = wait - (_now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = _now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+
+ throttled.cancel = function() {
+ clearTimeout(timeout);
+ previous = 0;
+ timeout = context = args = null;
+ };
+
+ return throttled;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/times.js b/node_modules/jsonpath/node_modules/underscore/modules/times.js
new file mode 100644
index 00000000..ab1960d5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/times.js
@@ -0,0 +1,9 @@
+import optimizeCb from './_optimizeCb.js';
+
+// Run a function **n** times.
+export default function times(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/toArray.js b/node_modules/jsonpath/node_modules/underscore/modules/toArray.js
new file mode 100644
index 00000000..00730e61
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/toArray.js
@@ -0,0 +1,20 @@
+import isArray from './isArray.js';
+import { slice } from './_setup.js';
+import isString from './isString.js';
+import isArrayLike from './_isArrayLike.js';
+import map from './map.js';
+import identity from './identity.js';
+import values from './values.js';
+
+// Safely create a real, live array from anything iterable.
+var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+export default function toArray(obj) {
+ if (!obj) return [];
+ if (isArray(obj)) return slice.call(obj);
+ if (isString(obj)) {
+ // Keep surrogate pair characters together.
+ return obj.match(reStrSymbol);
+ }
+ if (isArrayLike(obj)) return map(obj, identity);
+ return values(obj);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/toPath.js b/node_modules/jsonpath/node_modules/underscore/modules/toPath.js
new file mode 100644
index 00000000..7d72d1ff
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/toPath.js
@@ -0,0 +1,9 @@
+import _ from './underscore.js';
+import isArray from './isArray.js';
+
+// Normalize a (deep) property `path` to array.
+// Like `_.iteratee`, this function can be customized.
+export default function toPath(path) {
+ return isArray(path) ? path : [path];
+}
+_.toPath = toPath;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/underscore-array-methods.js b/node_modules/jsonpath/node_modules/underscore/modules/underscore-array-methods.js
new file mode 100644
index 00000000..ca7c382b
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/underscore-array-methods.js
@@ -0,0 +1,31 @@
+import _ from './underscore.js';
+import each from './each.js';
+import { ArrayProto } from './_setup.js';
+import chainResult from './_chainResult.js';
+
+// Add all mutator `Array` functions to the wrapper.
+each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) {
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+ delete obj[0];
+ }
+ }
+ return chainResult(this, obj);
+ };
+});
+
+// Add all accessor `Array` functions to the wrapper.
+each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) obj = method.apply(obj, arguments);
+ return chainResult(this, obj);
+ };
+});
+
+export default _;
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/underscore.js b/node_modules/jsonpath/node_modules/underscore/modules/underscore.js
new file mode 100644
index 00000000..6029e2a1
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/underscore.js
@@ -0,0 +1,25 @@
+import { VERSION } from './_setup.js';
+
+// If Underscore is called as a function, it returns a wrapped object that can
+// be used OO-style. This wrapper holds altered versions of all functions added
+// through `_.mixin`. Wrapped objects may be chained.
+export default function _(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+}
+
+_.VERSION = VERSION;
+
+// Extracts the result from a wrapped and chained object.
+_.prototype.value = function() {
+ return this._wrapped;
+};
+
+// Provide unwrapping proxies for some methods used in engine operations
+// such as arithmetic and JSON stringification.
+_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+_.prototype.toString = function() {
+ return String(this._wrapped);
+};
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/unescape.js b/node_modules/jsonpath/node_modules/underscore/modules/unescape.js
new file mode 100644
index 00000000..4edefcc8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/unescape.js
@@ -0,0 +1,5 @@
+import createEscaper from './_createEscaper.js';
+import unescapeMap from './_unescapeMap.js';
+
+// Function for unescaping strings from HTML interpolation.
+export default createEscaper(unescapeMap);
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/union.js b/node_modules/jsonpath/node_modules/underscore/modules/union.js
new file mode 100644
index 00000000..aa108be9
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/union.js
@@ -0,0 +1,9 @@
+import restArguments from './restArguments.js';
+import uniq from './uniq.js';
+import flatten from './_flatten.js';
+
+// Produce an array that contains the union: each distinct element from all of
+// the passed-in arrays.
+export default restArguments(function(arrays) {
+ return uniq(flatten(arrays, true, true));
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/uniq.js b/node_modules/jsonpath/node_modules/underscore/modules/uniq.js
new file mode 100644
index 00000000..ee4c8a31
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/uniq.js
@@ -0,0 +1,36 @@
+import isBoolean from './isBoolean.js';
+import cb from './_cb.js';
+import getLength from './_getLength.js';
+import contains from './contains.js';
+
+// Produce a duplicate-free version of the array. If the array has already
+// been sorted, you have the option of using a faster algorithm.
+// The faster algorithm will not work with an iteratee if the iteratee
+// is not a one-to-one function, so providing an iteratee will disable
+// the faster algorithm.
+export default function uniq(array, isSorted, iteratee, context) {
+ if (!isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted && !iteratee) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/uniqueId.js b/node_modules/jsonpath/node_modules/underscore/modules/uniqueId.js
new file mode 100644
index 00000000..20f321a8
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/uniqueId.js
@@ -0,0 +1,7 @@
+// Generate a unique integer id (unique within the entire client session).
+// Useful for temporary DOM ids.
+var idCounter = 0;
+export default function uniqueId(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/unzip.js b/node_modules/jsonpath/node_modules/underscore/modules/unzip.js
new file mode 100644
index 00000000..c657a6a5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/unzip.js
@@ -0,0 +1,15 @@
+import max from './max.js';
+import getLength from './_getLength.js';
+import pluck from './pluck.js';
+
+// Complement of zip. Unzip accepts an array of arrays and groups
+// each array's elements on shared indices.
+export default function unzip(array) {
+ var length = array && max(array, getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = pluck(array, index);
+ }
+ return result;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/values.js b/node_modules/jsonpath/node_modules/underscore/modules/values.js
new file mode 100644
index 00000000..9591de3e
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/values.js
@@ -0,0 +1,12 @@
+import keys from './keys.js';
+
+// Retrieve the values of an object's properties.
+export default function values(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[_keys[i]];
+ }
+ return values;
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/where.js b/node_modules/jsonpath/node_modules/underscore/modules/where.js
new file mode 100644
index 00000000..645f8cb2
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/where.js
@@ -0,0 +1,8 @@
+import filter from './filter.js';
+import matcher from './matcher.js';
+
+// Convenience version of a common use case of `_.filter`: selecting only
+// objects containing specific `key:value` pairs.
+export default function where(obj, attrs) {
+ return filter(obj, matcher(attrs));
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/without.js b/node_modules/jsonpath/node_modules/underscore/modules/without.js
new file mode 100644
index 00000000..7790e0fa
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/without.js
@@ -0,0 +1,7 @@
+import restArguments from './restArguments.js';
+import difference from './difference.js';
+
+// Return a version of the array that does not contain the specified value(s).
+export default restArguments(function(array, otherArrays) {
+ return difference(array, otherArrays);
+});
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/wrap.js b/node_modules/jsonpath/node_modules/underscore/modules/wrap.js
new file mode 100644
index 00000000..b2b3fd41
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/wrap.js
@@ -0,0 +1,8 @@
+import partial from './partial.js';
+
+// Returns the first function passed as an argument to the second,
+// allowing you to adjust arguments, run code before and after, and
+// conditionally execute the original function.
+export default function wrap(func, wrapper) {
+ return partial(wrapper, func);
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/modules/zip.js b/node_modules/jsonpath/node_modules/underscore/modules/zip.js
new file mode 100644
index 00000000..ae43cb37
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/modules/zip.js
@@ -0,0 +1,6 @@
+import restArguments from './restArguments.js';
+import unzip from './unzip.js';
+
+// Zip together multiple lists into a single array -- elements that share
+// an index go together.
+export default restArguments(unzip);
diff --git a/node_modules/jsonpath/node_modules/underscore/package.json b/node_modules/jsonpath/node_modules/underscore/package.json
new file mode 100644
index 00000000..2dc03659
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/package.json
@@ -0,0 +1,107 @@
+{
+ "_from": "underscore@1.12.1",
+ "_id": "underscore@1.12.1",
+ "_inBundle": false,
+ "_integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
+ "_location": "/jsonpath/underscore",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "underscore@1.12.1",
+ "name": "underscore",
+ "escapedName": "underscore",
+ "rawSpec": "1.12.1",
+ "saveSpec": null,
+ "fetchSpec": "1.12.1"
+ },
+ "_requiredBy": [
+ "/jsonpath"
+ ],
+ "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "_shasum": "7bb8cc9b3d397e201cf8553336d262544ead829e",
+ "_spec": "underscore@1.12.1",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\jsonpath",
+ "author": {
+ "name": "Jeremy Ashkenas",
+ "email": "jeremy@documentcloud.org"
+ },
+ "bugs": {
+ "url": "https://github.com/jashkenas/underscore/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "JavaScript's functional programming helper library.",
+ "devDependencies": {
+ "coveralls": "^2.11.2",
+ "docco": "^0.8.0",
+ "eslint": "^6.8.0",
+ "eslint-plugin-import": "^2.20.1",
+ "glob": "^7.1.6",
+ "gzip-size-cli": "^1.0.0",
+ "husky": "^4.2.3",
+ "karma": "^0.13.13",
+ "karma-qunit": "~2.0.1",
+ "karma-sauce-launcher": "^1.2.0",
+ "nyc": "^2.1.3",
+ "pretty-bytes-cli": "^1.0.0",
+ "qunit": "^2.10.0",
+ "rollup": "^1.32.1",
+ "terser": "^4.6.13"
+ },
+ "files": [
+ "underscore.js",
+ "underscore.js.map",
+ "underscore-min.js",
+ "underscore-min.js.map",
+ "underscore-esm.js",
+ "underscore-esm.js.map",
+ "underscore-esm-min.js",
+ "underscore-esm-min.js.map",
+ "modules/",
+ "amd/",
+ "cjs/"
+ ],
+ "homepage": "https://underscorejs.org",
+ "husky": {
+ "hooks": {
+ "pre-commit": "npm run bundle && git add underscore.js underscore.js.map underscore-esm.js underscore-esm.js.map",
+ "post-commit": "git reset underscore.js underscore.js.map underscore-esm.js underscore-esm.js.map"
+ }
+ },
+ "keywords": [
+ "util",
+ "functional",
+ "server",
+ "client",
+ "browser"
+ ],
+ "license": "MIT",
+ "main": "underscore.js",
+ "module": "modules/index-all.js",
+ "name": "underscore",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/jashkenas/underscore.git"
+ },
+ "scripts": {
+ "build": "npm run bundle && npm run build-umd && npm run build-esm",
+ "build-esm": "npm run minify-esm -- --source-map content=underscore-esm.js.map --source-map-url \" \" -o underscore-esm-min.js",
+ "build-umd": "npm run minify-umd -- --source-map content=underscore.js.map --source-map-url \" \" -o underscore-min.js",
+ "bundle": "rollup --config && eslint underscore.js",
+ "bundle-treeshake": "cd test-treeshake && rollup --config",
+ "coverage": "nyc npm run test-node && nyc report",
+ "coveralls": "nyc npm run test-node && nyc report --reporter=text-lcov | coveralls",
+ "doc": "docco underscore-esm.js && docco modules/*.js -c docco.css -t docs/linked-esm.jst",
+ "lint": "eslint modules/*.js test/*.js",
+ "minify-esm": "terser underscore-esm.js -c \"evaluate=false\" --comments \"/ .*/\" -m",
+ "minify-umd": "terser underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m",
+ "prepare-tests": "npm run bundle && npm run bundle-treeshake",
+ "prepublishOnly": "npm run build && npm run doc",
+ "test": "npm run lint && npm run test-node",
+ "test-browser": "npm run prepare-tests && npm i karma-phantomjs-launcher && karma start",
+ "test-node": "npm run prepare-tests && qunit test/",
+ "weight": "npm run bundle && npm run minify-umd | gzip-size | pretty-bytes"
+ },
+ "version": "1.12.1"
+}
diff --git a/node_modules/jsonpath/node_modules/underscore/underscore-esm-min.js b/node_modules/jsonpath/node_modules/underscore/underscore-esm-min.js
new file mode 100644
index 00000000..9ba55357
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/underscore-esm-min.js
@@ -0,0 +1,5 @@
+// Underscore.js 1.12.1
+// https://underscorejs.org
+// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+var VERSION="1.12.1",root="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},ArrayProto=Array.prototype,ObjProto=Object.prototype,SymbolProto="undefined"!=typeof Symbol?Symbol.prototype:null,push=ArrayProto.push,slice=ArrayProto.slice,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty,supportsArrayBuffer="undefined"!=typeof ArrayBuffer,supportsDataView="undefined"!=typeof DataView,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeCreate=Object.create,nativeIsView=supportsArrayBuffer&&ArrayBuffer.isView,_isNaN=isNaN,_isFinite=isFinite,hasEnumBug=!{toString:null}.propertyIsEnumerable("toString"),nonEnumerableProps=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],MAX_ARRAY_INDEX=Math.pow(2,53)-1;function restArguments(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;i=0&&n<=MAX_ARRAY_INDEX}}function shallowProperty(e){return function(t){return null==t?void 0:t[e]}}var getByteLength=shallowProperty("byteLength"),isBufferLike=createSizePropertyCheck(getByteLength),typedArrayPattern=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function isTypedArray(e){return nativeIsView?nativeIsView(e)&&!isDataView$1(e):isBufferLike(e)&&typedArrayPattern.test(toString.call(e))}var isTypedArray$1=supportsArrayBuffer?isTypedArray:constant(!1),getLength=shallowProperty("length");function emulatedSet(e){for(var t={},n=e.length,r=0;r":">",'"':""","'":"'","`":"`"},_escape=createEscaper(escapeMap),unescapeMap=invert(escapeMap),_unescape=createEscaper(unescapeMap),templateSettings=_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},noMatch=/(.)^/,escapes={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},escapeRegExp=/\\|'|\r|\n|\u2028|\u2029/g;function escapeChar(e){return"\\"+escapes[e]}var bareIdentifier=/^\s*(\w|\$)+\s*$/;function template(e,t,n){!t&&n&&(t=n),t=defaults({},t,_.templateSettings);var r=RegExp([(t.escape||noMatch).source,(t.interpolate||noMatch).source,(t.evaluate||noMatch).source].join("|")+"|$","g"),i=0,a="__p+='";e.replace(r,(function(t,n,r,u,o){return a+=e.slice(i,o).replace(escapeRegExp,escapeChar),i=o+t.length,n?a+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?a+="'+\n((__t=("+r+"))==null?'':__t)+\n'":u&&(a+="';\n"+u+"\n__p+='"),t})),a+="';\n";var u,o=t.variable;if(o){if(!bareIdentifier.test(o))throw new Error(o)}else a="with(obj||{}){\n"+a+"}\n",o="obj";a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{u=new Function(o,"_",a)}catch(e){throw e.source=a,e}var s=function(e){return u.call(this,e,_)};return s.source="function("+o+"){\n"+a+"}",s}function result(e,t,n){var r=(t=toPath$1(t)).length;if(!r)return isFunction$1(n)?n.call(e):n;for(var i=0;i1)flatten(o,t-1,n,r),i=r.length;else for(var s=0,c=o.length;st?(r&&(clearTimeout(r),r=null),o=c,u=e.apply(i,a),r||(i=a=null)):r||!1===n.trailing||(r=setTimeout(s,f)),u};return c.cancel=function(){clearTimeout(r),o=0,r=i=a=null},c}function debounce(e,t,n){var r,i,a,u,o,s=function(){var c=now()-i;t>c?r=setTimeout(s,t-c):(r=null,n||(u=e.apply(o,a)),r||(a=o=null))},c=restArguments((function(c){return o=this,a=c,i=now(),r||(r=setTimeout(s,t),n&&(u=e.apply(o,a))),u}));return c.cancel=function(){clearTimeout(r),r=a=o=null},c}function wrap(e,t){return partial(t,e)}function negate(e){return function(){return!e.apply(this,arguments)}}function compose(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}function after(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}function before(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}var once=partial(before,2);function findKey(e,t,n){t=cb(t,n);for(var r,i=keys(e),a=0,u=i.length;a0?0:i-1;a>=0&&a0?u=a>=0?a:Math.max(a+o,u):o=a>=0?Math.min(a+1,o):a+o+1;else if(n&&a&&o)return r[a=n(r,i)]===i?a:-1;if(i!=i)return(a=t(slice.call(r,u,o),isNaN$1))>=0?a+u:-1;for(a=e>0?u:o-1;a>=0&&a0?0:u-1;for(i||(r=t[a?a[o]:o],o+=e);o>=0&&o=3;return t(e,optimizeCb(n,i,4),r,a)}}var reduce=createReduce(1),reduceRight=createReduce(-1);function filter(e,t,n){var r=[];return t=cb(t,n),each(e,(function(e,n,i){t(e,n,i)&&r.push(e)})),r}function reject(e,t,n){return filter(e,negate(cb(t)),n)}function every(e,t,n){t=cb(t,n);for(var r=!isArrayLike(e)&&keys(e),i=(r||e).length,a=0;a=0}var invoke=restArguments((function(e,t,n){var r,i;return isFunction$1(t)?i=t:(t=toPath$1(t),r=t.slice(0,-1),t=t[t.length-1]),map(e,(function(e){var a=i;if(!a){if(r&&r.length&&(e=deepGet(e,r)),null==e)return;a=e[t]}return null==a?a:a.apply(e,n)}))}));function pluck(e,t){return map(e,property(t))}function where(e,t){return filter(e,matcher(t))}function max(e,t,n){var r,i,a=-1/0,u=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;oa&&(a=r);else t=cb(t,n),each(e,(function(e,n,r){((i=t(e,n,r))>u||i===-1/0&&a===-1/0)&&(a=e,u=i)}));return a}function min(e,t,n){var r,i,a=1/0,u=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;or||void 0===n)return 1;if(n1&&(r=optimizeCb(r,t[1])),t=allKeys(e)):(r=keyInObj,t=flatten(t,!1,!1),e=Object(e));for(var i=0,a=t.length;i1&&(n=t[1])):(t=map(flatten(t,!1,!1),String),r=function(e,n){return!contains(t,n)}),pick(e,r,n)}));function initial(e,t,n){return slice.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}function first(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:initial(e,e.length-t)}function rest(e,t,n){return slice.call(e,null==t||n?1:t)}function last(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:rest(e,Math.max(0,e.length-t))}function compact(e){return filter(e,Boolean)}function flatten$1(e,t){return flatten(e,t,!1)}var difference=restArguments((function(e,t){return t=flatten(t,!0,!0),filter(e,(function(e){return!contains(t,e)}))})),without=restArguments((function(e,t){return difference(e,t)}));function uniq(e,t,n,r){isBoolean(t)||(r=n,n=t,t=!1),null!=n&&(n=cb(n,r));for(var i=[],a=[],u=0,o=getLength(e);u","\"","'","`","_escape","unescapeMap","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","template","text","settings","oldSettings","offset","render","argument","variable","Error","e","data","fallback","idCounter","uniqueId","prefix","id","chain","instance","_chain","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","debounce","immediate","passed","debounced","_args","wrap","wrapper","negate","predicate","compose","start","after","before","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","findWhere","each","createReduce","reducer","initial","reduce","reduceRight","filter","list","reject","every","some","fromIndex","guard","invoke","contextPath","method","pluck","where","computed","lastComputed","v","sample","last","rand","temp","shuffle","sortBy","criteria","left","right","group","behavior","partition","groupBy","indexBy","countBy","pass","reStrSymbol","toArray","size","keyInObj","pick","omit","first","compact","Boolean","_flatten","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","intersection","argsLength","unzip","zip","range","stop","step","ceil","chunk","count","chainResult","mixin","allExports"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/jsonpath/node_modules/underscore/underscore-esm.js b/node_modules/jsonpath/node_modules/underscore/underscore-esm.js
new file mode 100644
index 00000000..e24744a5
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/underscore-esm.js
@@ -0,0 +1,2026 @@
+// Underscore.js 1.12.1
+// https://underscorejs.org
+// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+
+// Current version.
+var VERSION = '1.12.1';
+
+// Establish the root object, `window` (`self`) in the browser, `global`
+// on the server, or `this` in some virtual machines. We use `self`
+// instead of `window` for `WebWorker` support.
+var root = typeof self == 'object' && self.self === self && self ||
+ typeof global == 'object' && global.global === global && global ||
+ Function('return this')() ||
+ {};
+
+// Save bytes in the minified (but not gzipped) version:
+var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+// Create quick reference variables for speed access to core prototypes.
+var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+// Modern feature detection.
+var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+ supportsDataView = typeof DataView !== 'undefined';
+
+// All **ECMAScript 5+** native function implementations that we hope to use
+// are declared here.
+var nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeCreate = Object.create,
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+// Create references to these builtin functions because we override them.
+var _isNaN = isNaN,
+ _isFinite = isFinite;
+
+// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+// The largest integer that can be represented exactly.
+var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+// Some functions take a variable number of arguments, or a few expected
+// arguments at the beginning and then a variable number of values to operate
+// on. This helper accumulates all remaining arguments past the function’s
+// argument length (or an explicit `startIndex`), into an array that becomes
+// the last argument. Similar to ES6’s "rest parameter".
+function restArguments(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0),
+ rest = Array(length),
+ index = 0;
+ for (; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ var args = Array(startIndex + 1);
+ for (index = 0; index < startIndex; index++) {
+ args[index] = arguments[index];
+ }
+ args[startIndex] = rest;
+ return func.apply(this, args);
+ };
+}
+
+// Is a given variable an object?
+function isObject(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+}
+
+// Is a given value equal to null?
+function isNull(obj) {
+ return obj === null;
+}
+
+// Is a given variable undefined?
+function isUndefined(obj) {
+ return obj === void 0;
+}
+
+// Is a given value a boolean?
+function isBoolean(obj) {
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+}
+
+// Is a given value a DOM element?
+function isElement(obj) {
+ return !!(obj && obj.nodeType === 1);
+}
+
+// Internal function for creating a `toString`-based type tester.
+function tagTester(name) {
+ var tag = '[object ' + name + ']';
+ return function(obj) {
+ return toString.call(obj) === tag;
+ };
+}
+
+var isString = tagTester('String');
+
+var isNumber = tagTester('Number');
+
+var isDate = tagTester('Date');
+
+var isRegExp = tagTester('RegExp');
+
+var isError = tagTester('Error');
+
+var isSymbol = tagTester('Symbol');
+
+var isArrayBuffer = tagTester('ArrayBuffer');
+
+var isFunction = tagTester('Function');
+
+// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+var nodelist = root.document && root.document.childNodes;
+if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+ isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+}
+
+var isFunction$1 = isFunction;
+
+var hasObjectTag = tagTester('Object');
+
+// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+// In IE 11, the most common among them, this problem also applies to
+// `Map`, `WeakMap` and `Set`.
+var hasStringTagBug = (
+ supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+ ),
+ isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+var isDataView = tagTester('DataView');
+
+// In IE 10 - Edge 13, we need a different heuristic
+// to determine whether an object is a `DataView`.
+function ie10IsDataView(obj) {
+ return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+}
+
+var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+// Is a given value an array?
+// Delegates to ECMA5's native `Array.isArray`.
+var isArray = nativeIsArray || tagTester('Array');
+
+// Internal function to check whether `key` is an own property name of `obj`.
+function has(obj, key) {
+ return obj != null && hasOwnProperty.call(obj, key);
+}
+
+var isArguments = tagTester('Arguments');
+
+// Define a fallback version of the method in browsers (ahem, IE < 9), where
+// there isn't any inspectable "Arguments" type.
+(function() {
+ if (!isArguments(arguments)) {
+ isArguments = function(obj) {
+ return has(obj, 'callee');
+ };
+ }
+}());
+
+var isArguments$1 = isArguments;
+
+// Is a given object a finite number?
+function isFinite$1(obj) {
+ return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+}
+
+// Is the given value `NaN`?
+function isNaN$1(obj) {
+ return isNumber(obj) && _isNaN(obj);
+}
+
+// Predicate-generating function. Often useful outside of Underscore.
+function constant(value) {
+ return function() {
+ return value;
+ };
+}
+
+// Common internal logic for `isArrayLike` and `isBufferLike`.
+function createSizePropertyCheck(getSizeProperty) {
+ return function(collection) {
+ var sizeProperty = getSizeProperty(collection);
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+ }
+}
+
+// Internal helper to generate a function to obtain property `key` from `obj`.
+function shallowProperty(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+}
+
+// Internal helper to obtain the `byteLength` property of an object.
+var getByteLength = shallowProperty('byteLength');
+
+// Internal helper to determine whether we should spend extensive checks against
+// `ArrayBuffer` et al.
+var isBufferLike = createSizePropertyCheck(getByteLength);
+
+// Is a given value a typed array?
+var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+function isTypedArray(obj) {
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+ // Otherwise, fall back on the above regular expression.
+ return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+ isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+}
+
+var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+// Internal helper to obtain the `length` property of an object.
+var getLength = shallowProperty('length');
+
+// Internal helper to create a simple lookup structure.
+// `collectNonEnumProps` used to depend on `_.contains`, but this led to
+// circular imports. `emulatedSet` is a one-off solution that only works for
+// arrays of strings.
+function emulatedSet(keys) {
+ var hash = {};
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+ return {
+ contains: function(key) { return hash[key]; },
+ push: function(key) {
+ hash[key] = true;
+ return keys.push(key);
+ }
+ };
+}
+
+// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+// needed.
+function collectNonEnumProps(obj, keys) {
+ keys = emulatedSet(keys);
+ var nonEnumIdx = nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+ keys.push(prop);
+ }
+ }
+}
+
+// Retrieve the names of an object's own properties.
+// Delegates to **ECMAScript 5**'s native `Object.keys`.
+function keys(obj) {
+ if (!isObject(obj)) return [];
+ if (nativeKeys) return nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+}
+
+// Is a given array, string, or object empty?
+// An "empty" object has no enumerable own-properties.
+function isEmpty(obj) {
+ if (obj == null) return true;
+ // Skip the more expensive `toString`-based type checks if `obj` has no
+ // `.length`.
+ var length = getLength(obj);
+ if (typeof length == 'number' && (
+ isArray(obj) || isString(obj) || isArguments$1(obj)
+ )) return length === 0;
+ return getLength(keys(obj)) === 0;
+}
+
+// Returns whether an object has a given set of `key:value` pairs.
+function isMatch(object, attrs) {
+ var _keys = keys(attrs), length = _keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = _keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+}
+
+// If Underscore is called as a function, it returns a wrapped object that can
+// be used OO-style. This wrapper holds altered versions of all functions added
+// through `_.mixin`. Wrapped objects may be chained.
+function _(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+}
+
+_.VERSION = VERSION;
+
+// Extracts the result from a wrapped and chained object.
+_.prototype.value = function() {
+ return this._wrapped;
+};
+
+// Provide unwrapping proxies for some methods used in engine operations
+// such as arithmetic and JSON stringification.
+_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+_.prototype.toString = function() {
+ return String(this._wrapped);
+};
+
+// Internal function to wrap or shallow-copy an ArrayBuffer,
+// typed array or DataView to a new view, reusing the buffer.
+function toBufferView(bufferSource) {
+ return new Uint8Array(
+ bufferSource.buffer || bufferSource,
+ bufferSource.byteOffset || 0,
+ getByteLength(bufferSource)
+ );
+}
+
+// We use this string twice, so give it a name for minification.
+var tagDataView = '[object DataView]';
+
+// Internal recursive comparison function for `_.isEqual`.
+function eq(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // `null` or `undefined` only equal to itself (strict comparison).
+ if (a == null || b == null) return false;
+ // `NaN`s are equivalent, but non-reflexive.
+ if (a !== a) return b !== b;
+ // Exhaust primitive checks
+ var type = typeof a;
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+ return deepEq(a, b, aStack, bStack);
+}
+
+// Internal recursive comparison function for `_.isEqual`.
+function deepEq(a, b, aStack, bStack) {
+ // Unwrap any wrapped objects.
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className !== toString.call(b)) return false;
+ // Work around a bug in IE 10 - Edge 13.
+ if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+ if (!isDataView$1(b)) return false;
+ className = tagDataView;
+ }
+ switch (className) {
+ // These types are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN.
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ case '[object Symbol]':
+ return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+ case '[object ArrayBuffer]':
+ case tagDataView:
+ // Coerce to typed array so we can fall through.
+ return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays && isTypedArray$1(a)) {
+ var byteLength = getByteLength(a);
+ if (byteLength !== getByteLength(b)) return false;
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+ areArrays = true;
+ }
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+ isFunction$1(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var _keys = keys(a), key;
+ length = _keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = _keys[length];
+ if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+}
+
+// Perform a deep comparison to check if two objects are equal.
+function isEqual(a, b) {
+ return eq(a, b);
+}
+
+// Retrieve all the enumerable property names of an object.
+function allKeys(obj) {
+ if (!isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+}
+
+// Since the regular `Object.prototype.toString` type tests don't work for
+// some types in IE 11, we use a fingerprinting heuristic instead, based
+// on the methods. It's not great, but it's the best we got.
+// The fingerprint method lists are defined below.
+function ie11fingerprint(methods) {
+ var length = getLength(methods);
+ return function(obj) {
+ if (obj == null) return false;
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
+ var keys = allKeys(obj);
+ if (getLength(keys)) return false;
+ for (var i = 0; i < length; i++) {
+ if (!isFunction$1(obj[methods[i]])) return false;
+ }
+ // If we are testing against `WeakMap`, we need to ensure that
+ // `obj` doesn't have a `forEach` method in order to distinguish
+ // it from a regular `Map`.
+ return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+ };
+}
+
+// In the interest of compact minification, we write
+// each string in the fingerprints only once.
+var forEachName = 'forEach',
+ hasName = 'has',
+ commonInit = ['clear', 'delete'],
+ mapTail = ['get', hasName, 'set'];
+
+// `Map`, `WeakMap` and `Set` each have slightly different
+// combinations of the above sublists.
+var mapMethods = commonInit.concat(forEachName, mapTail),
+ weakMapMethods = commonInit.concat(mapTail),
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+var isWeakSet = tagTester('WeakSet');
+
+// Retrieve the values of an object's properties.
+function values(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[_keys[i]];
+ }
+ return values;
+}
+
+// Convert an object into a list of `[key, value]` pairs.
+// The opposite of `_.object` with one argument.
+function pairs(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [_keys[i], obj[_keys[i]]];
+ }
+ return pairs;
+}
+
+// Invert the keys and values of an object. The values must be serializable.
+function invert(obj) {
+ var result = {};
+ var _keys = keys(obj);
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ result[obj[_keys[i]]] = _keys[i];
+ }
+ return result;
+}
+
+// Return a sorted list of the function names available on the object.
+function functions(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (isFunction$1(obj[key])) names.push(key);
+ }
+ return names.sort();
+}
+
+// An internal function for creating assigner functions.
+function createAssigner(keysFunc, defaults) {
+ return function(obj) {
+ var length = arguments.length;
+ if (defaults) obj = Object(obj);
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+}
+
+// Extend a given object with all the properties in passed-in object(s).
+var extend = createAssigner(allKeys);
+
+// Assigns a given object with all the own properties in the passed-in
+// object(s).
+// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+var extendOwn = createAssigner(keys);
+
+// Fill in a given object with default properties.
+var defaults = createAssigner(allKeys, true);
+
+// Create a naked function reference for surrogate-prototype-swapping.
+function ctor() {
+ return function(){};
+}
+
+// An internal function for creating a new object that inherits from another.
+function baseCreate(prototype) {
+ if (!isObject(prototype)) return {};
+ if (nativeCreate) return nativeCreate(prototype);
+ var Ctor = ctor();
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+}
+
+// Creates an object that inherits from the given prototype object.
+// If additional properties are provided then they will be added to the
+// created object.
+function create(prototype, props) {
+ var result = baseCreate(prototype);
+ if (props) extendOwn(result, props);
+ return result;
+}
+
+// Create a (shallow-cloned) duplicate of an object.
+function clone(obj) {
+ if (!isObject(obj)) return obj;
+ return isArray(obj) ? obj.slice() : extend({}, obj);
+}
+
+// Invokes `interceptor` with the `obj` and then returns `obj`.
+// The primary purpose of this method is to "tap into" a method chain, in
+// order to perform operations on intermediate results within the chain.
+function tap(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+}
+
+// Normalize a (deep) property `path` to array.
+// Like `_.iteratee`, this function can be customized.
+function toPath(path) {
+ return isArray(path) ? path : [path];
+}
+_.toPath = toPath;
+
+// Internal wrapper for `_.toPath` to enable minification.
+// Similar to `cb` for `_.iteratee`.
+function toPath$1(path) {
+ return _.toPath(path);
+}
+
+// Internal function to obtain a nested property in `obj` along `path`.
+function deepGet(obj, path) {
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ if (obj == null) return void 0;
+ obj = obj[path[i]];
+ }
+ return length ? obj : void 0;
+}
+
+// Get the value of the (deep) property on `path` from `object`.
+// If any property in `path` does not exist or if the value is
+// `undefined`, return `defaultValue` instead.
+// The `path` is normalized through `_.toPath`.
+function get(object, path, defaultValue) {
+ var value = deepGet(object, toPath$1(path));
+ return isUndefined(value) ? defaultValue : value;
+}
+
+// Shortcut function for checking if an object has a given property directly on
+// itself (in other words, not on a prototype). Unlike the internal `has`
+// function, this public version can also traverse nested properties.
+function has$1(obj, path) {
+ path = toPath$1(path);
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ var key = path[i];
+ if (!has(obj, key)) return false;
+ obj = obj[key];
+ }
+ return !!length;
+}
+
+// Keep the identity function around for default iteratees.
+function identity(value) {
+ return value;
+}
+
+// Returns a predicate for checking whether an object has a given set of
+// `key:value` pairs.
+function matcher(attrs) {
+ attrs = extendOwn({}, attrs);
+ return function(obj) {
+ return isMatch(obj, attrs);
+ };
+}
+
+// Creates a function that, when passed an object, will traverse that object’s
+// properties down the given `path`, specified as an array of keys or indices.
+function property(path) {
+ path = toPath$1(path);
+ return function(obj) {
+ return deepGet(obj, path);
+ };
+}
+
+// Internal function that returns an efficient (for current engines) version
+// of the passed-in callback, to be repeatedly applied in other Underscore
+// functions.
+function optimizeCb(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ // The 2-argument case is omitted because we’re not using it.
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+}
+
+// An internal function to generate callbacks that can be applied to each
+// element in a collection, returning the desired result — either `_.identity`,
+// an arbitrary callback, a property matcher, or a property accessor.
+function baseIteratee(value, context, argCount) {
+ if (value == null) return identity;
+ if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+ if (isObject(value) && !isArray(value)) return matcher(value);
+ return property(value);
+}
+
+// External wrapper for our callback generator. Users may customize
+// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+// This abstraction hides the internal-only `argCount` argument.
+function iteratee(value, context) {
+ return baseIteratee(value, context, Infinity);
+}
+_.iteratee = iteratee;
+
+// The function we call internally to generate a callback. It invokes
+// `_.iteratee` if overridden, otherwise `baseIteratee`.
+function cb(value, context, argCount) {
+ if (_.iteratee !== iteratee) return _.iteratee(value, context);
+ return baseIteratee(value, context, argCount);
+}
+
+// Returns the results of applying the `iteratee` to each element of `obj`.
+// In contrast to `_.map` it returns an object.
+function mapObject(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = keys(obj),
+ length = _keys.length,
+ results = {};
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+}
+
+// Predicate-generating function. Often useful outside of Underscore.
+function noop(){}
+
+// Generates a function for a given object that returns a given property.
+function propertyOf(obj) {
+ if (obj == null) return noop;
+ return function(path) {
+ return get(obj, path);
+ };
+}
+
+// Run a function **n** times.
+function times(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+}
+
+// Return a random integer between `min` and `max` (inclusive).
+function random(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+}
+
+// A (possibly faster) way to get the current timestamp as an integer.
+var now = Date.now || function() {
+ return new Date().getTime();
+};
+
+// Internal helper to generate functions for escaping and unescaping strings
+// to/from HTML interpolation.
+function createEscaper(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+}
+
+// Internal list of HTML entities for escaping.
+var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+};
+
+// Function for escaping strings to HTML interpolation.
+var _escape = createEscaper(escapeMap);
+
+// Internal list of HTML entities for unescaping.
+var unescapeMap = invert(escapeMap);
+
+// Function for unescaping strings from HTML interpolation.
+var _unescape = createEscaper(unescapeMap);
+
+// By default, Underscore uses ERB-style template delimiters. Change the
+// following template settings to use alternative delimiters.
+var templateSettings = _.templateSettings = {
+ evaluate: /<%([\s\S]+?)%>/g,
+ interpolate: /<%=([\s\S]+?)%>/g,
+ escape: /<%-([\s\S]+?)%>/g
+};
+
+// When customizing `_.templateSettings`, if you don't want to define an
+// interpolation, evaluation or escaping regex, we need one that is
+// guaranteed not to match.
+var noMatch = /(.)^/;
+
+// Certain characters need to be escaped so that they can be put into a
+// string literal.
+var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+};
+
+var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+function escapeChar(match) {
+ return '\\' + escapes[match];
+}
+
+var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+// JavaScript micro-templating, similar to John Resig's implementation.
+// Underscore templating handles arbitrary delimiters, preserves whitespace,
+// and correctly escapes quotes within interpolated code.
+// NB: `oldSettings` only exists for backwards compatibility.
+function template(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offset.
+ return match;
+ });
+ source += "';\n";
+
+ var argument = settings.variable;
+ if (argument) {
+ if (!bareIdentifier.test(argument)) throw new Error(argument);
+ } else {
+ // If a variable is not specified, place data values in local scope.
+ source = 'with(obj||{}){\n' + source + '}\n';
+ argument = 'obj';
+ }
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ var render;
+ try {
+ render = new Function(argument, '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+}
+
+// Traverses the children of `obj` along `path`. If a child is a function, it
+// is invoked with its parent as context. Returns the value of the final
+// child, or `fallback` if any child is undefined.
+function result(obj, path, fallback) {
+ path = toPath$1(path);
+ var length = path.length;
+ if (!length) {
+ return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+ }
+ for (var i = 0; i < length; i++) {
+ var prop = obj == null ? void 0 : obj[path[i]];
+ if (prop === void 0) {
+ prop = fallback;
+ i = length; // Ensure we don't continue iterating.
+ }
+ obj = isFunction$1(prop) ? prop.call(obj) : prop;
+ }
+ return obj;
+}
+
+// Generate a unique integer id (unique within the entire client session).
+// Useful for temporary DOM ids.
+var idCounter = 0;
+function uniqueId(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+}
+
+// Start chaining a wrapped Underscore object.
+function chain(obj) {
+ var instance = _(obj);
+ instance._chain = true;
+ return instance;
+}
+
+// Internal function to execute `sourceFunc` bound to `context` with optional
+// `args`. Determines whether to execute a function as a constructor or as a
+// normal function.
+function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (isObject(result)) return result;
+ return self;
+}
+
+// Partially apply a function by creating a version that has had some of its
+// arguments pre-filled, without changing its dynamic `this` context. `_` acts
+// as a placeholder by default, allowing any combination of arguments to be
+// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+var partial = restArguments(function(func, boundArgs) {
+ var placeholder = partial.placeholder;
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return executeBound(func, bound, this, this, args);
+ };
+ return bound;
+});
+
+partial.placeholder = _;
+
+// Create a function bound to a given object (assigning `this`, and arguments,
+// optionally).
+var bind = restArguments(function(func, context, args) {
+ if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+ var bound = restArguments(function(callArgs) {
+ return executeBound(func, bound, context, this, args.concat(callArgs));
+ });
+ return bound;
+});
+
+// Internal helper for collection methods to determine whether a collection
+// should be iterated as an array or as an object.
+// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+var isArrayLike = createSizePropertyCheck(getLength);
+
+// Internal implementation of a recursive `flatten` function.
+function flatten(input, depth, strict, output) {
+ output = output || [];
+ if (!depth && depth !== 0) {
+ depth = Infinity;
+ } else if (depth <= 0) {
+ return output.concat(input);
+ }
+ var idx = output.length;
+ for (var i = 0, length = getLength(input); i < length; i++) {
+ var value = input[i];
+ if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+ // Flatten current level of array or arguments object.
+ if (depth > 1) {
+ flatten(value, depth - 1, strict, output);
+ idx = output.length;
+ } else {
+ var j = 0, len = value.length;
+ while (j < len) output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+}
+
+// Bind a number of an object's methods to that object. Remaining arguments
+// are the method names to be bound. Useful for ensuring that all callbacks
+// defined on an object belong to it.
+var bindAll = restArguments(function(obj, keys) {
+ keys = flatten(keys, false, false);
+ var index = keys.length;
+ if (index < 1) throw new Error('bindAll must be passed function names');
+ while (index--) {
+ var key = keys[index];
+ obj[key] = bind(obj[key], obj);
+ }
+ return obj;
+});
+
+// Memoize an expensive function by storing its results.
+function memoize(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+}
+
+// Delays a function for the given number of milliseconds, and then calls
+// it with the arguments supplied.
+var delay = restArguments(function(func, wait, args) {
+ return setTimeout(function() {
+ return func.apply(null, args);
+ }, wait);
+});
+
+// Defers a function, scheduling it to run after the current call stack has
+// cleared.
+var defer = partial(delay, _, 1);
+
+// Returns a function, that, when invoked, will only be triggered at most once
+// during a given window of time. Normally, the throttled function will run
+// as much as it can, without ever going more than once per `wait` duration;
+// but if you'd like to disable the execution on the leading edge, pass
+// `{leading: false}`. To disable execution on the trailing edge, ditto.
+function throttle(func, wait, options) {
+ var timeout, context, args, result;
+ var previous = 0;
+ if (!options) options = {};
+
+ var later = function() {
+ previous = options.leading === false ? 0 : now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+
+ var throttled = function() {
+ var _now = now();
+ if (!previous && options.leading === false) previous = _now;
+ var remaining = wait - (_now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = _now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+
+ throttled.cancel = function() {
+ clearTimeout(timeout);
+ previous = 0;
+ timeout = context = args = null;
+ };
+
+ return throttled;
+}
+
+// When a sequence of calls of the returned function ends, the argument
+// function is triggered. The end of a sequence is defined by the `wait`
+// parameter. If `immediate` is passed, the argument function will be
+// triggered at the beginning of the sequence instead of at the end.
+function debounce(func, wait, immediate) {
+ var timeout, previous, args, result, context;
+
+ var later = function() {
+ var passed = now() - previous;
+ if (wait > passed) {
+ timeout = setTimeout(later, wait - passed);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ // This check is needed because `func` can recursively invoke `debounced`.
+ if (!timeout) args = context = null;
+ }
+ };
+
+ var debounced = restArguments(function(_args) {
+ context = this;
+ args = _args;
+ previous = now();
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ if (immediate) result = func.apply(context, args);
+ }
+ return result;
+ });
+
+ debounced.cancel = function() {
+ clearTimeout(timeout);
+ timeout = args = context = null;
+ };
+
+ return debounced;
+}
+
+// Returns the first function passed as an argument to the second,
+// allowing you to adjust arguments, run code before and after, and
+// conditionally execute the original function.
+function wrap(func, wrapper) {
+ return partial(wrapper, func);
+}
+
+// Returns a negated version of the passed-in predicate.
+function negate(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+}
+
+// Returns a function that is the composition of a list of functions, each
+// consuming the return value of the function that follows.
+function compose() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+}
+
+// Returns a function that will only be executed on and after the Nth call.
+function after(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+}
+
+// Returns a function that will only be executed up to (but not including) the
+// Nth call.
+function before(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+}
+
+// Returns a function that will be executed at most one time, no matter how
+// often you call it. Useful for lazy initialization.
+var once = partial(before, 2);
+
+// Returns the first key on an object that passes a truth test.
+function findKey(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = keys(obj), key;
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ key = _keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+}
+
+// Internal function to generate `_.findIndex` and `_.findLastIndex`.
+function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = cb(predicate, context);
+ var length = getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+}
+
+// Returns the first index on an array-like that passes a truth test.
+var findIndex = createPredicateIndexFinder(1);
+
+// Returns the last index on an array-like that passes a truth test.
+var findLastIndex = createPredicateIndexFinder(-1);
+
+// Use a comparator function to figure out the smallest index at which
+// an object should be inserted so as to maintain order. Uses binary search.
+function sortedIndex(array, obj, iteratee, context) {
+ iteratee = cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+}
+
+// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(slice.call(array, i, length), isNaN$1);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+}
+
+// Return the position of the first occurrence of an item in an array,
+// or -1 if the item is not included in the array.
+// If the array is large and already in sort order, pass `true`
+// for **isSorted** to use binary search.
+var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+// Return the position of the last occurrence of an item in an array,
+// or -1 if the item is not included in the array.
+var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+// Return the first value which passes a truth test.
+function find(obj, predicate, context) {
+ var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+ var key = keyFinder(obj, predicate, context);
+ if (key !== void 0 && key !== -1) return obj[key];
+}
+
+// Convenience version of a common use case of `_.find`: getting the first
+// object containing specific `key:value` pairs.
+function findWhere(obj, attrs) {
+ return find(obj, matcher(attrs));
+}
+
+// The cornerstone for collection functions, an `each`
+// implementation, aka `forEach`.
+// Handles raw objects in addition to array-likes. Treats all
+// sparse array-likes as if they were dense.
+function each(obj, iteratee, context) {
+ iteratee = optimizeCb(iteratee, context);
+ var i, length;
+ if (isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var _keys = keys(obj);
+ for (i = 0, length = _keys.length; i < length; i++) {
+ iteratee(obj[_keys[i]], _keys[i], obj);
+ }
+ }
+ return obj;
+}
+
+// Return the results of applying the iteratee to each element.
+function map(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+}
+
+// Internal helper to create a reducing function, iterating left or right.
+function createReduce(dir) {
+ // Wrap code that reassigns argument variables in a separate function than
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+ var reducer = function(obj, iteratee, memo, initial) {
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ if (!initial) {
+ memo = obj[_keys ? _keys[index] : index];
+ index += dir;
+ }
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = _keys ? _keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ };
+
+ return function(obj, iteratee, memo, context) {
+ var initial = arguments.length >= 3;
+ return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+ };
+}
+
+// **Reduce** builds up a single result from a list of values, aka `inject`,
+// or `foldl`.
+var reduce = createReduce(1);
+
+// The right-associative version of reduce, also known as `foldr`.
+var reduceRight = createReduce(-1);
+
+// Return all the elements that pass a truth test.
+function filter(obj, predicate, context) {
+ var results = [];
+ predicate = cb(predicate, context);
+ each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+}
+
+// Return all the elements for which a truth test fails.
+function reject(obj, predicate, context) {
+ return filter(obj, negate(cb(predicate)), context);
+}
+
+// Determine whether all of the elements pass a truth test.
+function every(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+}
+
+// Determine if at least one element in the object passes a truth test.
+function some(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+}
+
+// Determine if the array or object contains a given item (using `===`).
+function contains(obj, item, fromIndex, guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return indexOf(obj, item, fromIndex) >= 0;
+}
+
+// Invoke a method (with arguments) on every item in a collection.
+var invoke = restArguments(function(obj, path, args) {
+ var contextPath, func;
+ if (isFunction$1(path)) {
+ func = path;
+ } else {
+ path = toPath$1(path);
+ contextPath = path.slice(0, -1);
+ path = path[path.length - 1];
+ }
+ return map(obj, function(context) {
+ var method = func;
+ if (!method) {
+ if (contextPath && contextPath.length) {
+ context = deepGet(context, contextPath);
+ }
+ if (context == null) return void 0;
+ method = context[path];
+ }
+ return method == null ? method : method.apply(context, args);
+ });
+});
+
+// Convenience version of a common use case of `_.map`: fetching a property.
+function pluck(obj, key) {
+ return map(obj, property(key));
+}
+
+// Convenience version of a common use case of `_.filter`: selecting only
+// objects containing specific `key:value` pairs.
+function where(obj, attrs) {
+ return filter(obj, matcher(attrs));
+}
+
+// Return the maximum element (or element-based computation).
+function max(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+}
+
+// Return the minimum element (or element-based computation).
+function min(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+}
+
+// Sample **n** random values from a collection using the modern version of the
+// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+// If **n** is not specified, returns a single random element.
+// The internal `guard` argument allows it to work with `_.map`.
+function sample(obj, n, guard) {
+ if (n == null || guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ return obj[random(obj.length - 1)];
+ }
+ var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+ var length = getLength(sample);
+ n = Math.max(Math.min(n, length), 0);
+ var last = length - 1;
+ for (var index = 0; index < n; index++) {
+ var rand = random(index, last);
+ var temp = sample[index];
+ sample[index] = sample[rand];
+ sample[rand] = temp;
+ }
+ return sample.slice(0, n);
+}
+
+// Shuffle a collection.
+function shuffle(obj) {
+ return sample(obj, Infinity);
+}
+
+// Sort the object's values by a criterion produced by an iteratee.
+function sortBy(obj, iteratee, context) {
+ var index = 0;
+ iteratee = cb(iteratee, context);
+ return pluck(map(obj, function(value, key, list) {
+ return {
+ value: value,
+ index: index++,
+ criteria: iteratee(value, key, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+}
+
+// An internal function used for aggregate "group by" operations.
+function group(behavior, partition) {
+ return function(obj, iteratee, context) {
+ var result = partition ? [[], []] : {};
+ iteratee = cb(iteratee, context);
+ each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+}
+
+// Groups the object's values by a criterion. Pass either a string attribute
+// to group by, or a function that returns the criterion.
+var groupBy = group(function(result, value, key) {
+ if (has(result, key)) result[key].push(value); else result[key] = [value];
+});
+
+// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+// when you know that your index values will be unique.
+var indexBy = group(function(result, value, key) {
+ result[key] = value;
+});
+
+// Counts instances of an object that group by a certain criterion. Pass
+// either a string attribute to count by, or a function that returns the
+// criterion.
+var countBy = group(function(result, value, key) {
+ if (has(result, key)) result[key]++; else result[key] = 1;
+});
+
+// Split a collection into two arrays: one whose elements all pass the given
+// truth test, and one whose elements all do not pass the truth test.
+var partition = group(function(result, value, pass) {
+ result[pass ? 0 : 1].push(value);
+}, true);
+
+// Safely create a real, live array from anything iterable.
+var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+function toArray(obj) {
+ if (!obj) return [];
+ if (isArray(obj)) return slice.call(obj);
+ if (isString(obj)) {
+ // Keep surrogate pair characters together.
+ return obj.match(reStrSymbol);
+ }
+ if (isArrayLike(obj)) return map(obj, identity);
+ return values(obj);
+}
+
+// Return the number of elements in a collection.
+function size(obj) {
+ if (obj == null) return 0;
+ return isArrayLike(obj) ? obj.length : keys(obj).length;
+}
+
+// Internal `_.pick` helper function to determine whether `key` is an enumerable
+// property name of `obj`.
+function keyInObj(value, key, obj) {
+ return key in obj;
+}
+
+// Return a copy of the object only containing the allowed properties.
+var pick = restArguments(function(obj, keys) {
+ var result = {}, iteratee = keys[0];
+ if (obj == null) return result;
+ if (isFunction$1(iteratee)) {
+ if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+ keys = allKeys(obj);
+ } else {
+ iteratee = keyInObj;
+ keys = flatten(keys, false, false);
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+});
+
+// Return a copy of the object without the disallowed properties.
+var omit = restArguments(function(obj, keys) {
+ var iteratee = keys[0], context;
+ if (isFunction$1(iteratee)) {
+ iteratee = negate(iteratee);
+ if (keys.length > 1) context = keys[1];
+ } else {
+ keys = map(flatten(keys, false, false), String);
+ iteratee = function(value, key) {
+ return !contains(keys, key);
+ };
+ }
+ return pick(obj, iteratee, context);
+});
+
+// Returns everything but the last entry of the array. Especially useful on
+// the arguments object. Passing **n** will return all the values in
+// the array, excluding the last N.
+function initial(array, n, guard) {
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+}
+
+// Get the first element of an array. Passing **n** will return the first N
+// values in the array. The **guard** check allows it to work with `_.map`.
+function first(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[0];
+ return initial(array, array.length - n);
+}
+
+// Returns everything but the first entry of the `array`. Especially useful on
+// the `arguments` object. Passing an **n** will return the rest N values in the
+// `array`.
+function rest(array, n, guard) {
+ return slice.call(array, n == null || guard ? 1 : n);
+}
+
+// Get the last element of an array. Passing **n** will return the last N
+// values in the array.
+function last(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[array.length - 1];
+ return rest(array, Math.max(0, array.length - n));
+}
+
+// Trim out all falsy values from an array.
+function compact(array) {
+ return filter(array, Boolean);
+}
+
+// Flatten out an array, either recursively (by default), or up to `depth`.
+// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+function flatten$1(array, depth) {
+ return flatten(array, depth, false);
+}
+
+// Take the difference between one array and a number of other arrays.
+// Only the elements present in just the first array will remain.
+var difference = restArguments(function(array, rest) {
+ rest = flatten(rest, true, true);
+ return filter(array, function(value){
+ return !contains(rest, value);
+ });
+});
+
+// Return a version of the array that does not contain the specified value(s).
+var without = restArguments(function(array, otherArrays) {
+ return difference(array, otherArrays);
+});
+
+// Produce a duplicate-free version of the array. If the array has already
+// been sorted, you have the option of using a faster algorithm.
+// The faster algorithm will not work with an iteratee if the iteratee
+// is not a one-to-one function, so providing an iteratee will disable
+// the faster algorithm.
+function uniq(array, isSorted, iteratee, context) {
+ if (!isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted && !iteratee) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+}
+
+// Produce an array that contains the union: each distinct element from all of
+// the passed-in arrays.
+var union = restArguments(function(arrays) {
+ return uniq(flatten(arrays, true, true));
+});
+
+// Produce an array that contains every item shared between all the
+// passed-in arrays.
+function intersection(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var item = array[i];
+ if (contains(result, item)) continue;
+ var j;
+ for (j = 1; j < argsLength; j++) {
+ if (!contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+}
+
+// Complement of zip. Unzip accepts an array of arrays and groups
+// each array's elements on shared indices.
+function unzip(array) {
+ var length = array && max(array, getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = pluck(array, index);
+ }
+ return result;
+}
+
+// Zip together multiple lists into a single array -- elements that share
+// an index go together.
+var zip = restArguments(unzip);
+
+// Converts lists into objects. Pass either a single array of `[key, value]`
+// pairs, or two parallel arrays of the same length -- one of keys, and one of
+// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+function object(list, values) {
+ var result = {};
+ for (var i = 0, length = getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+}
+
+// Generate an integer Array containing an arithmetic progression. A port of
+// the native Python `range()` function. See
+// [the Python documentation](https://docs.python.org/library/functions.html#range).
+function range(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+}
+
+// Chunk a single array into multiple arrays, each containing `count` or fewer
+// items.
+function chunk(array, count) {
+ if (count == null || count < 1) return [];
+ var result = [];
+ var i = 0, length = array.length;
+ while (i < length) {
+ result.push(slice.call(array, i, i += count));
+ }
+ return result;
+}
+
+// Helper function to continue chaining intermediate results.
+function chainResult(instance, obj) {
+ return instance._chain ? _(obj).chain() : obj;
+}
+
+// Add your own custom functions to the Underscore object.
+function mixin(obj) {
+ each(functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return chainResult(this, func.apply(_, args));
+ };
+ });
+ return _;
+}
+
+// Add all mutator `Array` functions to the wrapper.
+each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) {
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+ delete obj[0];
+ }
+ }
+ return chainResult(this, obj);
+ };
+});
+
+// Add all accessor `Array` functions to the wrapper.
+each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) obj = method.apply(obj, arguments);
+ return chainResult(this, obj);
+ };
+});
+
+// Named Exports
+
+var allExports = {
+ __proto__: null,
+ VERSION: VERSION,
+ restArguments: restArguments,
+ isObject: isObject,
+ isNull: isNull,
+ isUndefined: isUndefined,
+ isBoolean: isBoolean,
+ isElement: isElement,
+ isString: isString,
+ isNumber: isNumber,
+ isDate: isDate,
+ isRegExp: isRegExp,
+ isError: isError,
+ isSymbol: isSymbol,
+ isArrayBuffer: isArrayBuffer,
+ isDataView: isDataView$1,
+ isArray: isArray,
+ isFunction: isFunction$1,
+ isArguments: isArguments$1,
+ isFinite: isFinite$1,
+ isNaN: isNaN$1,
+ isTypedArray: isTypedArray$1,
+ isEmpty: isEmpty,
+ isMatch: isMatch,
+ isEqual: isEqual,
+ isMap: isMap,
+ isWeakMap: isWeakMap,
+ isSet: isSet,
+ isWeakSet: isWeakSet,
+ keys: keys,
+ allKeys: allKeys,
+ values: values,
+ pairs: pairs,
+ invert: invert,
+ functions: functions,
+ methods: functions,
+ extend: extend,
+ extendOwn: extendOwn,
+ assign: extendOwn,
+ defaults: defaults,
+ create: create,
+ clone: clone,
+ tap: tap,
+ get: get,
+ has: has$1,
+ mapObject: mapObject,
+ identity: identity,
+ constant: constant,
+ noop: noop,
+ toPath: toPath,
+ property: property,
+ propertyOf: propertyOf,
+ matcher: matcher,
+ matches: matcher,
+ times: times,
+ random: random,
+ now: now,
+ escape: _escape,
+ unescape: _unescape,
+ templateSettings: templateSettings,
+ template: template,
+ result: result,
+ uniqueId: uniqueId,
+ chain: chain,
+ iteratee: iteratee,
+ partial: partial,
+ bind: bind,
+ bindAll: bindAll,
+ memoize: memoize,
+ delay: delay,
+ defer: defer,
+ throttle: throttle,
+ debounce: debounce,
+ wrap: wrap,
+ negate: negate,
+ compose: compose,
+ after: after,
+ before: before,
+ once: once,
+ findKey: findKey,
+ findIndex: findIndex,
+ findLastIndex: findLastIndex,
+ sortedIndex: sortedIndex,
+ indexOf: indexOf,
+ lastIndexOf: lastIndexOf,
+ find: find,
+ detect: find,
+ findWhere: findWhere,
+ each: each,
+ forEach: each,
+ map: map,
+ collect: map,
+ reduce: reduce,
+ foldl: reduce,
+ inject: reduce,
+ reduceRight: reduceRight,
+ foldr: reduceRight,
+ filter: filter,
+ select: filter,
+ reject: reject,
+ every: every,
+ all: every,
+ some: some,
+ any: some,
+ contains: contains,
+ includes: contains,
+ include: contains,
+ invoke: invoke,
+ pluck: pluck,
+ where: where,
+ max: max,
+ min: min,
+ shuffle: shuffle,
+ sample: sample,
+ sortBy: sortBy,
+ groupBy: groupBy,
+ indexBy: indexBy,
+ countBy: countBy,
+ partition: partition,
+ toArray: toArray,
+ size: size,
+ pick: pick,
+ omit: omit,
+ first: first,
+ head: first,
+ take: first,
+ initial: initial,
+ last: last,
+ rest: rest,
+ tail: rest,
+ drop: rest,
+ compact: compact,
+ flatten: flatten$1,
+ without: without,
+ uniq: uniq,
+ unique: uniq,
+ union: union,
+ intersection: intersection,
+ difference: difference,
+ unzip: unzip,
+ transpose: unzip,
+ zip: zip,
+ object: object,
+ range: range,
+ chunk: chunk,
+ mixin: mixin,
+ 'default': _
+};
+
+// Default Export
+
+// Add all of the Underscore functions to the wrapper object.
+var _$1 = mixin(allExports);
+// Legacy Node.js API.
+_$1._ = _$1;
+
+// ESM Exports
+
+export default _$1;
+export { VERSION, after, every as all, allKeys, some as any, extendOwn as assign, before, bind, bindAll, chain, chunk, clone, map as collect, compact, compose, constant, contains, countBy, create, debounce, defaults, defer, delay, find as detect, difference, rest as drop, each, _escape as escape, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten$1 as flatten, reduce as foldl, reduceRight as foldr, each as forEach, functions, get, groupBy, has$1 as has, first as head, identity, contains as include, contains as includes, indexBy, indexOf, initial, reduce as inject, intersection, invert, invoke, isArguments$1 as isArguments, isArray, isArrayBuffer, isBoolean, isDataView$1 as isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite$1 as isFinite, isFunction$1 as isFunction, isMap, isMatch, isNaN$1 as isNaN, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray$1 as isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher as matches, max, memoize, functions as methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter as select, shuffle, size, some, sortBy, sortedIndex, rest as tail, first as take, tap, template, templateSettings, throttle, times, toArray, toPath, unzip as transpose, _unescape as unescape, union, uniq, uniq as unique, uniqueId, unzip, values, where, without, wrap, zip };
+//# sourceMappingURL=underscore-esm.js.map
diff --git a/node_modules/jsonpath/node_modules/underscore/underscore-esm.js.map b/node_modules/jsonpath/node_modules/underscore/underscore-esm.js.map
new file mode 100644
index 00000000..8187ca4c
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/underscore-esm.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"underscore-esm.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isArrayBuffer.js","modules/isFunction.js","modules/_hasObjectTag.js","modules/_stringTagBug.js","modules/isDataView.js","modules/isArray.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/_toBufferView.js","modules/isEqual.js","modules/allKeys.js","modules/_methodFingerprint.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/toPath.js","modules/_toPath.js","modules/_deepGet.js","modules/get.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_isArrayLike.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/toArray.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js","modules/index-all.js"],"sourcesContent":null,"names":["isFunction","isFinite","isNaN","isDataView","isArguments","isTypedArray","toPath","has","_has","flatten","_flatten","_"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/jsonpath/node_modules/underscore/underscore-min.js b/node_modules/jsonpath/node_modules/underscore/underscore-min.js
new file mode 100644
index 00000000..c443208a
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/underscore-min.js
@@ -0,0 +1,6 @@
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n=n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
+// Underscore.js 1.12.1
+// https://underscorejs.org
+// (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+var n="1.12.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,g=isFinite,d=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function kr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:dr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t","\"","'","`","_escape","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","delay","wait","setTimeout","defer","negate","predicate","before","times","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","each","results","currentKey","createReduce","reducer","initial","reduce","reduceRight","filter","list","every","some","fromIndex","guard","invoke","contextPath","method","pluck","computed","lastComputed","v","sample","n","last","rand","temp","group","behavior","partition","groupBy","indexBy","countBy","pass","reStrSymbol","keyInObj","pick","omit","first","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","instance","_chain","chain","mixin","nodeType","parseFloat","pairs","props","interceptor","_has","accum","text","settings","oldSettings","offset","render","argument","variable","e","template","data","fallback","prefix","id","hasher","memoize","cache","address","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","immediate","passed","debounced","_args","wrapper","start","criteria","left","right","Boolean","_flatten","argsLength","stop","step","ceil","range","count"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/jsonpath/node_modules/underscore/underscore.js b/node_modules/jsonpath/node_modules/underscore/underscore.js
new file mode 100644
index 00000000..2faa3584
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/underscore.js
@@ -0,0 +1,2034 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define('underscore', factory) :
+ (global = global || self, (function () {
+ var current = global._;
+ var exports = global._ = factory();
+ exports.noConflict = function () { global._ = current; return exports; };
+ }()));
+}(this, (function () {
+ // Underscore.js 1.12.1
+ // https://underscorejs.org
+ // (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ // Underscore may be freely distributed under the MIT license.
+
+ // Current version.
+ var VERSION = '1.12.1';
+
+ // Establish the root object, `window` (`self`) in the browser, `global`
+ // on the server, or `this` in some virtual machines. We use `self`
+ // instead of `window` for `WebWorker` support.
+ var root = typeof self == 'object' && self.self === self && self ||
+ typeof global == 'object' && global.global === global && global ||
+ Function('return this')() ||
+ {};
+
+ // Save bytes in the minified (but not gzipped) version:
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+ var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+ // Create quick reference variables for speed access to core prototypes.
+ var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+ // Modern feature detection.
+ var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+ supportsDataView = typeof DataView !== 'undefined';
+
+ // All **ECMAScript 5+** native function implementations that we hope to use
+ // are declared here.
+ var nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeCreate = Object.create,
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+ // Create references to these builtin functions because we override them.
+ var _isNaN = isNaN,
+ _isFinite = isFinite;
+
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+ // The largest integer that can be represented exactly.
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+ // Some functions take a variable number of arguments, or a few expected
+ // arguments at the beginning and then a variable number of values to operate
+ // on. This helper accumulates all remaining arguments past the function’s
+ // argument length (or an explicit `startIndex`), into an array that becomes
+ // the last argument. Similar to ES6’s "rest parameter".
+ function restArguments(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0),
+ rest = Array(length),
+ index = 0;
+ for (; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ var args = Array(startIndex + 1);
+ for (index = 0; index < startIndex; index++) {
+ args[index] = arguments[index];
+ }
+ args[startIndex] = rest;
+ return func.apply(this, args);
+ };
+ }
+
+ // Is a given variable an object?
+ function isObject(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ }
+
+ // Is a given value equal to null?
+ function isNull(obj) {
+ return obj === null;
+ }
+
+ // Is a given variable undefined?
+ function isUndefined(obj) {
+ return obj === void 0;
+ }
+
+ // Is a given value a boolean?
+ function isBoolean(obj) {
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+ }
+
+ // Is a given value a DOM element?
+ function isElement(obj) {
+ return !!(obj && obj.nodeType === 1);
+ }
+
+ // Internal function for creating a `toString`-based type tester.
+ function tagTester(name) {
+ var tag = '[object ' + name + ']';
+ return function(obj) {
+ return toString.call(obj) === tag;
+ };
+ }
+
+ var isString = tagTester('String');
+
+ var isNumber = tagTester('Number');
+
+ var isDate = tagTester('Date');
+
+ var isRegExp = tagTester('RegExp');
+
+ var isError = tagTester('Error');
+
+ var isSymbol = tagTester('Symbol');
+
+ var isArrayBuffer = tagTester('ArrayBuffer');
+
+ var isFunction = tagTester('Function');
+
+ // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+ // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+ var nodelist = root.document && root.document.childNodes;
+ if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+ isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+ }
+
+ var isFunction$1 = isFunction;
+
+ var hasObjectTag = tagTester('Object');
+
+ // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+ // In IE 11, the most common among them, this problem also applies to
+ // `Map`, `WeakMap` and `Set`.
+ var hasStringTagBug = (
+ supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+ ),
+ isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+ var isDataView = tagTester('DataView');
+
+ // In IE 10 - Edge 13, we need a different heuristic
+ // to determine whether an object is a `DataView`.
+ function ie10IsDataView(obj) {
+ return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+ }
+
+ var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+ // Is a given value an array?
+ // Delegates to ECMA5's native `Array.isArray`.
+ var isArray = nativeIsArray || tagTester('Array');
+
+ // Internal function to check whether `key` is an own property name of `obj`.
+ function has(obj, key) {
+ return obj != null && hasOwnProperty.call(obj, key);
+ }
+
+ var isArguments = tagTester('Arguments');
+
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
+ // there isn't any inspectable "Arguments" type.
+ (function() {
+ if (!isArguments(arguments)) {
+ isArguments = function(obj) {
+ return has(obj, 'callee');
+ };
+ }
+ }());
+
+ var isArguments$1 = isArguments;
+
+ // Is a given object a finite number?
+ function isFinite$1(obj) {
+ return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+ }
+
+ // Is the given value `NaN`?
+ function isNaN$1(obj) {
+ return isNumber(obj) && _isNaN(obj);
+ }
+
+ // Predicate-generating function. Often useful outside of Underscore.
+ function constant(value) {
+ return function() {
+ return value;
+ };
+ }
+
+ // Common internal logic for `isArrayLike` and `isBufferLike`.
+ function createSizePropertyCheck(getSizeProperty) {
+ return function(collection) {
+ var sizeProperty = getSizeProperty(collection);
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+ }
+ }
+
+ // Internal helper to generate a function to obtain property `key` from `obj`.
+ function shallowProperty(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+ }
+
+ // Internal helper to obtain the `byteLength` property of an object.
+ var getByteLength = shallowProperty('byteLength');
+
+ // Internal helper to determine whether we should spend extensive checks against
+ // `ArrayBuffer` et al.
+ var isBufferLike = createSizePropertyCheck(getByteLength);
+
+ // Is a given value a typed array?
+ var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+ function isTypedArray(obj) {
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+ // Otherwise, fall back on the above regular expression.
+ return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+ isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+ }
+
+ var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+ // Internal helper to obtain the `length` property of an object.
+ var getLength = shallowProperty('length');
+
+ // Internal helper to create a simple lookup structure.
+ // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+ // circular imports. `emulatedSet` is a one-off solution that only works for
+ // arrays of strings.
+ function emulatedSet(keys) {
+ var hash = {};
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+ return {
+ contains: function(key) { return hash[key]; },
+ push: function(key) {
+ hash[key] = true;
+ return keys.push(key);
+ }
+ };
+ }
+
+ // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+ // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+ // needed.
+ function collectNonEnumProps(obj, keys) {
+ keys = emulatedSet(keys);
+ var nonEnumIdx = nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+ keys.push(prop);
+ }
+ }
+ }
+
+ // Retrieve the names of an object's own properties.
+ // Delegates to **ECMAScript 5**'s native `Object.keys`.
+ function keys(obj) {
+ if (!isObject(obj)) return [];
+ if (nativeKeys) return nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ }
+
+ // Is a given array, string, or object empty?
+ // An "empty" object has no enumerable own-properties.
+ function isEmpty(obj) {
+ if (obj == null) return true;
+ // Skip the more expensive `toString`-based type checks if `obj` has no
+ // `.length`.
+ var length = getLength(obj);
+ if (typeof length == 'number' && (
+ isArray(obj) || isString(obj) || isArguments$1(obj)
+ )) return length === 0;
+ return getLength(keys(obj)) === 0;
+ }
+
+ // Returns whether an object has a given set of `key:value` pairs.
+ function isMatch(object, attrs) {
+ var _keys = keys(attrs), length = _keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = _keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+ }
+
+ // If Underscore is called as a function, it returns a wrapped object that can
+ // be used OO-style. This wrapper holds altered versions of all functions added
+ // through `_.mixin`. Wrapped objects may be chained.
+ function _(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+ }
+
+ _.VERSION = VERSION;
+
+ // Extracts the result from a wrapped and chained object.
+ _.prototype.value = function() {
+ return this._wrapped;
+ };
+
+ // Provide unwrapping proxies for some methods used in engine operations
+ // such as arithmetic and JSON stringification.
+ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+ _.prototype.toString = function() {
+ return String(this._wrapped);
+ };
+
+ // Internal function to wrap or shallow-copy an ArrayBuffer,
+ // typed array or DataView to a new view, reusing the buffer.
+ function toBufferView(bufferSource) {
+ return new Uint8Array(
+ bufferSource.buffer || bufferSource,
+ bufferSource.byteOffset || 0,
+ getByteLength(bufferSource)
+ );
+ }
+
+ // We use this string twice, so give it a name for minification.
+ var tagDataView = '[object DataView]';
+
+ // Internal recursive comparison function for `_.isEqual`.
+ function eq(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // `null` or `undefined` only equal to itself (strict comparison).
+ if (a == null || b == null) return false;
+ // `NaN`s are equivalent, but non-reflexive.
+ if (a !== a) return b !== b;
+ // Exhaust primitive checks
+ var type = typeof a;
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+ return deepEq(a, b, aStack, bStack);
+ }
+
+ // Internal recursive comparison function for `_.isEqual`.
+ function deepEq(a, b, aStack, bStack) {
+ // Unwrap any wrapped objects.
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className !== toString.call(b)) return false;
+ // Work around a bug in IE 10 - Edge 13.
+ if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+ if (!isDataView$1(b)) return false;
+ className = tagDataView;
+ }
+ switch (className) {
+ // These types are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN.
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ case '[object Symbol]':
+ return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+ case '[object ArrayBuffer]':
+ case tagDataView:
+ // Coerce to typed array so we can fall through.
+ return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays && isTypedArray$1(a)) {
+ var byteLength = getByteLength(a);
+ if (byteLength !== getByteLength(b)) return false;
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+ areArrays = true;
+ }
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+ isFunction$1(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var _keys = keys(a), key;
+ length = _keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = _keys[length];
+ if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+ }
+
+ // Perform a deep comparison to check if two objects are equal.
+ function isEqual(a, b) {
+ return eq(a, b);
+ }
+
+ // Retrieve all the enumerable property names of an object.
+ function allKeys(obj) {
+ if (!isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ }
+
+ // Since the regular `Object.prototype.toString` type tests don't work for
+ // some types in IE 11, we use a fingerprinting heuristic instead, based
+ // on the methods. It's not great, but it's the best we got.
+ // The fingerprint method lists are defined below.
+ function ie11fingerprint(methods) {
+ var length = getLength(methods);
+ return function(obj) {
+ if (obj == null) return false;
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
+ var keys = allKeys(obj);
+ if (getLength(keys)) return false;
+ for (var i = 0; i < length; i++) {
+ if (!isFunction$1(obj[methods[i]])) return false;
+ }
+ // If we are testing against `WeakMap`, we need to ensure that
+ // `obj` doesn't have a `forEach` method in order to distinguish
+ // it from a regular `Map`.
+ return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+ };
+ }
+
+ // In the interest of compact minification, we write
+ // each string in the fingerprints only once.
+ var forEachName = 'forEach',
+ hasName = 'has',
+ commonInit = ['clear', 'delete'],
+ mapTail = ['get', hasName, 'set'];
+
+ // `Map`, `WeakMap` and `Set` each have slightly different
+ // combinations of the above sublists.
+ var mapMethods = commonInit.concat(forEachName, mapTail),
+ weakMapMethods = commonInit.concat(mapTail),
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+ var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+ var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+ var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+ var isWeakSet = tagTester('WeakSet');
+
+ // Retrieve the values of an object's properties.
+ function values(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[_keys[i]];
+ }
+ return values;
+ }
+
+ // Convert an object into a list of `[key, value]` pairs.
+ // The opposite of `_.object` with one argument.
+ function pairs(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [_keys[i], obj[_keys[i]]];
+ }
+ return pairs;
+ }
+
+ // Invert the keys and values of an object. The values must be serializable.
+ function invert(obj) {
+ var result = {};
+ var _keys = keys(obj);
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ result[obj[_keys[i]]] = _keys[i];
+ }
+ return result;
+ }
+
+ // Return a sorted list of the function names available on the object.
+ function functions(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (isFunction$1(obj[key])) names.push(key);
+ }
+ return names.sort();
+ }
+
+ // An internal function for creating assigner functions.
+ function createAssigner(keysFunc, defaults) {
+ return function(obj) {
+ var length = arguments.length;
+ if (defaults) obj = Object(obj);
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+ }
+
+ // Extend a given object with all the properties in passed-in object(s).
+ var extend = createAssigner(allKeys);
+
+ // Assigns a given object with all the own properties in the passed-in
+ // object(s).
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ var extendOwn = createAssigner(keys);
+
+ // Fill in a given object with default properties.
+ var defaults = createAssigner(allKeys, true);
+
+ // Create a naked function reference for surrogate-prototype-swapping.
+ function ctor() {
+ return function(){};
+ }
+
+ // An internal function for creating a new object that inherits from another.
+ function baseCreate(prototype) {
+ if (!isObject(prototype)) return {};
+ if (nativeCreate) return nativeCreate(prototype);
+ var Ctor = ctor();
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+ }
+
+ // Creates an object that inherits from the given prototype object.
+ // If additional properties are provided then they will be added to the
+ // created object.
+ function create(prototype, props) {
+ var result = baseCreate(prototype);
+ if (props) extendOwn(result, props);
+ return result;
+ }
+
+ // Create a (shallow-cloned) duplicate of an object.
+ function clone(obj) {
+ if (!isObject(obj)) return obj;
+ return isArray(obj) ? obj.slice() : extend({}, obj);
+ }
+
+ // Invokes `interceptor` with the `obj` and then returns `obj`.
+ // The primary purpose of this method is to "tap into" a method chain, in
+ // order to perform operations on intermediate results within the chain.
+ function tap(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ }
+
+ // Normalize a (deep) property `path` to array.
+ // Like `_.iteratee`, this function can be customized.
+ function toPath(path) {
+ return isArray(path) ? path : [path];
+ }
+ _.toPath = toPath;
+
+ // Internal wrapper for `_.toPath` to enable minification.
+ // Similar to `cb` for `_.iteratee`.
+ function toPath$1(path) {
+ return _.toPath(path);
+ }
+
+ // Internal function to obtain a nested property in `obj` along `path`.
+ function deepGet(obj, path) {
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ if (obj == null) return void 0;
+ obj = obj[path[i]];
+ }
+ return length ? obj : void 0;
+ }
+
+ // Get the value of the (deep) property on `path` from `object`.
+ // If any property in `path` does not exist or if the value is
+ // `undefined`, return `defaultValue` instead.
+ // The `path` is normalized through `_.toPath`.
+ function get(object, path, defaultValue) {
+ var value = deepGet(object, toPath$1(path));
+ return isUndefined(value) ? defaultValue : value;
+ }
+
+ // Shortcut function for checking if an object has a given property directly on
+ // itself (in other words, not on a prototype). Unlike the internal `has`
+ // function, this public version can also traverse nested properties.
+ function has$1(obj, path) {
+ path = toPath$1(path);
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ var key = path[i];
+ if (!has(obj, key)) return false;
+ obj = obj[key];
+ }
+ return !!length;
+ }
+
+ // Keep the identity function around for default iteratees.
+ function identity(value) {
+ return value;
+ }
+
+ // Returns a predicate for checking whether an object has a given set of
+ // `key:value` pairs.
+ function matcher(attrs) {
+ attrs = extendOwn({}, attrs);
+ return function(obj) {
+ return isMatch(obj, attrs);
+ };
+ }
+
+ // Creates a function that, when passed an object, will traverse that object’s
+ // properties down the given `path`, specified as an array of keys or indices.
+ function property(path) {
+ path = toPath$1(path);
+ return function(obj) {
+ return deepGet(obj, path);
+ };
+ }
+
+ // Internal function that returns an efficient (for current engines) version
+ // of the passed-in callback, to be repeatedly applied in other Underscore
+ // functions.
+ function optimizeCb(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ // The 2-argument case is omitted because we’re not using it.
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+ }
+
+ // An internal function to generate callbacks that can be applied to each
+ // element in a collection, returning the desired result — either `_.identity`,
+ // an arbitrary callback, a property matcher, or a property accessor.
+ function baseIteratee(value, context, argCount) {
+ if (value == null) return identity;
+ if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+ if (isObject(value) && !isArray(value)) return matcher(value);
+ return property(value);
+ }
+
+ // External wrapper for our callback generator. Users may customize
+ // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+ // This abstraction hides the internal-only `argCount` argument.
+ function iteratee(value, context) {
+ return baseIteratee(value, context, Infinity);
+ }
+ _.iteratee = iteratee;
+
+ // The function we call internally to generate a callback. It invokes
+ // `_.iteratee` if overridden, otherwise `baseIteratee`.
+ function cb(value, context, argCount) {
+ if (_.iteratee !== iteratee) return _.iteratee(value, context);
+ return baseIteratee(value, context, argCount);
+ }
+
+ // Returns the results of applying the `iteratee` to each element of `obj`.
+ // In contrast to `_.map` it returns an object.
+ function mapObject(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = keys(obj),
+ length = _keys.length,
+ results = {};
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ }
+
+ // Predicate-generating function. Often useful outside of Underscore.
+ function noop(){}
+
+ // Generates a function for a given object that returns a given property.
+ function propertyOf(obj) {
+ if (obj == null) return noop;
+ return function(path) {
+ return get(obj, path);
+ };
+ }
+
+ // Run a function **n** times.
+ function times(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+ }
+
+ // Return a random integer between `min` and `max` (inclusive).
+ function random(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+ }
+
+ // A (possibly faster) way to get the current timestamp as an integer.
+ var now = Date.now || function() {
+ return new Date().getTime();
+ };
+
+ // Internal helper to generate functions for escaping and unescaping strings
+ // to/from HTML interpolation.
+ function createEscaper(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+ }
+
+ // Internal list of HTML entities for escaping.
+ var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+
+ // Function for escaping strings to HTML interpolation.
+ var _escape = createEscaper(escapeMap);
+
+ // Internal list of HTML entities for unescaping.
+ var unescapeMap = invert(escapeMap);
+
+ // Function for unescaping strings from HTML interpolation.
+ var _unescape = createEscaper(unescapeMap);
+
+ // By default, Underscore uses ERB-style template delimiters. Change the
+ // following template settings to use alternative delimiters.
+ var templateSettings = _.templateSettings = {
+ evaluate: /<%([\s\S]+?)%>/g,
+ interpolate: /<%=([\s\S]+?)%>/g,
+ escape: /<%-([\s\S]+?)%>/g
+ };
+
+ // When customizing `_.templateSettings`, if you don't want to define an
+ // interpolation, evaluation or escaping regex, we need one that is
+ // guaranteed not to match.
+ var noMatch = /(.)^/;
+
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+ function escapeChar(match) {
+ return '\\' + escapes[match];
+ }
+
+ var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+ // JavaScript micro-templating, similar to John Resig's implementation.
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
+ // and correctly escapes quotes within interpolated code.
+ // NB: `oldSettings` only exists for backwards compatibility.
+ function template(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offset.
+ return match;
+ });
+ source += "';\n";
+
+ var argument = settings.variable;
+ if (argument) {
+ if (!bareIdentifier.test(argument)) throw new Error(argument);
+ } else {
+ // If a variable is not specified, place data values in local scope.
+ source = 'with(obj||{}){\n' + source + '}\n';
+ argument = 'obj';
+ }
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ var render;
+ try {
+ render = new Function(argument, '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+ }
+
+ // Traverses the children of `obj` along `path`. If a child is a function, it
+ // is invoked with its parent as context. Returns the value of the final
+ // child, or `fallback` if any child is undefined.
+ function result(obj, path, fallback) {
+ path = toPath$1(path);
+ var length = path.length;
+ if (!length) {
+ return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+ }
+ for (var i = 0; i < length; i++) {
+ var prop = obj == null ? void 0 : obj[path[i]];
+ if (prop === void 0) {
+ prop = fallback;
+ i = length; // Ensure we don't continue iterating.
+ }
+ obj = isFunction$1(prop) ? prop.call(obj) : prop;
+ }
+ return obj;
+ }
+
+ // Generate a unique integer id (unique within the entire client session).
+ // Useful for temporary DOM ids.
+ var idCounter = 0;
+ function uniqueId(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+ }
+
+ // Start chaining a wrapped Underscore object.
+ function chain(obj) {
+ var instance = _(obj);
+ instance._chain = true;
+ return instance;
+ }
+
+ // Internal function to execute `sourceFunc` bound to `context` with optional
+ // `args`. Determines whether to execute a function as a constructor or as a
+ // normal function.
+ function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (isObject(result)) return result;
+ return self;
+ }
+
+ // Partially apply a function by creating a version that has had some of its
+ // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+ // as a placeholder by default, allowing any combination of arguments to be
+ // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+ var partial = restArguments(function(func, boundArgs) {
+ var placeholder = partial.placeholder;
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return executeBound(func, bound, this, this, args);
+ };
+ return bound;
+ });
+
+ partial.placeholder = _;
+
+ // Create a function bound to a given object (assigning `this`, and arguments,
+ // optionally).
+ var bind = restArguments(function(func, context, args) {
+ if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+ var bound = restArguments(function(callArgs) {
+ return executeBound(func, bound, context, this, args.concat(callArgs));
+ });
+ return bound;
+ });
+
+ // Internal helper for collection methods to determine whether a collection
+ // should be iterated as an array or as an object.
+ // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+ var isArrayLike = createSizePropertyCheck(getLength);
+
+ // Internal implementation of a recursive `flatten` function.
+ function flatten(input, depth, strict, output) {
+ output = output || [];
+ if (!depth && depth !== 0) {
+ depth = Infinity;
+ } else if (depth <= 0) {
+ return output.concat(input);
+ }
+ var idx = output.length;
+ for (var i = 0, length = getLength(input); i < length; i++) {
+ var value = input[i];
+ if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+ // Flatten current level of array or arguments object.
+ if (depth > 1) {
+ flatten(value, depth - 1, strict, output);
+ idx = output.length;
+ } else {
+ var j = 0, len = value.length;
+ while (j < len) output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+ }
+
+ // Bind a number of an object's methods to that object. Remaining arguments
+ // are the method names to be bound. Useful for ensuring that all callbacks
+ // defined on an object belong to it.
+ var bindAll = restArguments(function(obj, keys) {
+ keys = flatten(keys, false, false);
+ var index = keys.length;
+ if (index < 1) throw new Error('bindAll must be passed function names');
+ while (index--) {
+ var key = keys[index];
+ obj[key] = bind(obj[key], obj);
+ }
+ return obj;
+ });
+
+ // Memoize an expensive function by storing its results.
+ function memoize(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+ }
+
+ // Delays a function for the given number of milliseconds, and then calls
+ // it with the arguments supplied.
+ var delay = restArguments(function(func, wait, args) {
+ return setTimeout(function() {
+ return func.apply(null, args);
+ }, wait);
+ });
+
+ // Defers a function, scheduling it to run after the current call stack has
+ // cleared.
+ var defer = partial(delay, _, 1);
+
+ // Returns a function, that, when invoked, will only be triggered at most once
+ // during a given window of time. Normally, the throttled function will run
+ // as much as it can, without ever going more than once per `wait` duration;
+ // but if you'd like to disable the execution on the leading edge, pass
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
+ function throttle(func, wait, options) {
+ var timeout, context, args, result;
+ var previous = 0;
+ if (!options) options = {};
+
+ var later = function() {
+ previous = options.leading === false ? 0 : now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+
+ var throttled = function() {
+ var _now = now();
+ if (!previous && options.leading === false) previous = _now;
+ var remaining = wait - (_now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = _now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+
+ throttled.cancel = function() {
+ clearTimeout(timeout);
+ previous = 0;
+ timeout = context = args = null;
+ };
+
+ return throttled;
+ }
+
+ // When a sequence of calls of the returned function ends, the argument
+ // function is triggered. The end of a sequence is defined by the `wait`
+ // parameter. If `immediate` is passed, the argument function will be
+ // triggered at the beginning of the sequence instead of at the end.
+ function debounce(func, wait, immediate) {
+ var timeout, previous, args, result, context;
+
+ var later = function() {
+ var passed = now() - previous;
+ if (wait > passed) {
+ timeout = setTimeout(later, wait - passed);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ // This check is needed because `func` can recursively invoke `debounced`.
+ if (!timeout) args = context = null;
+ }
+ };
+
+ var debounced = restArguments(function(_args) {
+ context = this;
+ args = _args;
+ previous = now();
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ if (immediate) result = func.apply(context, args);
+ }
+ return result;
+ });
+
+ debounced.cancel = function() {
+ clearTimeout(timeout);
+ timeout = args = context = null;
+ };
+
+ return debounced;
+ }
+
+ // Returns the first function passed as an argument to the second,
+ // allowing you to adjust arguments, run code before and after, and
+ // conditionally execute the original function.
+ function wrap(func, wrapper) {
+ return partial(wrapper, func);
+ }
+
+ // Returns a negated version of the passed-in predicate.
+ function negate(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+ }
+
+ // Returns a function that is the composition of a list of functions, each
+ // consuming the return value of the function that follows.
+ function compose() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+ }
+
+ // Returns a function that will only be executed on and after the Nth call.
+ function after(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+
+ // Returns a function that will only be executed up to (but not including) the
+ // Nth call.
+ function before(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+ }
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ var once = partial(before, 2);
+
+ // Returns the first key on an object that passes a truth test.
+ function findKey(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = keys(obj), key;
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ key = _keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+ }
+
+ // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+ function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = cb(predicate, context);
+ var length = getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+ }
+
+ // Returns the first index on an array-like that passes a truth test.
+ var findIndex = createPredicateIndexFinder(1);
+
+ // Returns the last index on an array-like that passes a truth test.
+ var findLastIndex = createPredicateIndexFinder(-1);
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ function sortedIndex(array, obj, iteratee, context) {
+ iteratee = cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+ }
+
+ // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(slice.call(array, i, length), isNaN$1);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+ }
+
+ // Return the position of the first occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+ // Return the position of the last occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+ // Return the first value which passes a truth test.
+ function find(obj, predicate, context) {
+ var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+ var key = keyFinder(obj, predicate, context);
+ if (key !== void 0 && key !== -1) return obj[key];
+ }
+
+ // Convenience version of a common use case of `_.find`: getting the first
+ // object containing specific `key:value` pairs.
+ function findWhere(obj, attrs) {
+ return find(obj, matcher(attrs));
+ }
+
+ // The cornerstone for collection functions, an `each`
+ // implementation, aka `forEach`.
+ // Handles raw objects in addition to array-likes. Treats all
+ // sparse array-likes as if they were dense.
+ function each(obj, iteratee, context) {
+ iteratee = optimizeCb(iteratee, context);
+ var i, length;
+ if (isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var _keys = keys(obj);
+ for (i = 0, length = _keys.length; i < length; i++) {
+ iteratee(obj[_keys[i]], _keys[i], obj);
+ }
+ }
+ return obj;
+ }
+
+ // Return the results of applying the iteratee to each element.
+ function map(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ }
+
+ // Internal helper to create a reducing function, iterating left or right.
+ function createReduce(dir) {
+ // Wrap code that reassigns argument variables in a separate function than
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+ var reducer = function(obj, iteratee, memo, initial) {
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ if (!initial) {
+ memo = obj[_keys ? _keys[index] : index];
+ index += dir;
+ }
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = _keys ? _keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ };
+
+ return function(obj, iteratee, memo, context) {
+ var initial = arguments.length >= 3;
+ return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+ };
+ }
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`.
+ var reduce = createReduce(1);
+
+ // The right-associative version of reduce, also known as `foldr`.
+ var reduceRight = createReduce(-1);
+
+ // Return all the elements that pass a truth test.
+ function filter(obj, predicate, context) {
+ var results = [];
+ predicate = cb(predicate, context);
+ each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+ }
+
+ // Return all the elements for which a truth test fails.
+ function reject(obj, predicate, context) {
+ return filter(obj, negate(cb(predicate)), context);
+ }
+
+ // Determine whether all of the elements pass a truth test.
+ function every(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+ }
+
+ // Determine if at least one element in the object passes a truth test.
+ function some(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+ }
+
+ // Determine if the array or object contains a given item (using `===`).
+ function contains(obj, item, fromIndex, guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return indexOf(obj, item, fromIndex) >= 0;
+ }
+
+ // Invoke a method (with arguments) on every item in a collection.
+ var invoke = restArguments(function(obj, path, args) {
+ var contextPath, func;
+ if (isFunction$1(path)) {
+ func = path;
+ } else {
+ path = toPath$1(path);
+ contextPath = path.slice(0, -1);
+ path = path[path.length - 1];
+ }
+ return map(obj, function(context) {
+ var method = func;
+ if (!method) {
+ if (contextPath && contextPath.length) {
+ context = deepGet(context, contextPath);
+ }
+ if (context == null) return void 0;
+ method = context[path];
+ }
+ return method == null ? method : method.apply(context, args);
+ });
+ });
+
+ // Convenience version of a common use case of `_.map`: fetching a property.
+ function pluck(obj, key) {
+ return map(obj, property(key));
+ }
+
+ // Convenience version of a common use case of `_.filter`: selecting only
+ // objects containing specific `key:value` pairs.
+ function where(obj, attrs) {
+ return filter(obj, matcher(attrs));
+ }
+
+ // Return the maximum element (or element-based computation).
+ function max(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ }
+
+ // Return the minimum element (or element-based computation).
+ function min(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ }
+
+ // Sample **n** random values from a collection using the modern version of the
+ // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+ // If **n** is not specified, returns a single random element.
+ // The internal `guard` argument allows it to work with `_.map`.
+ function sample(obj, n, guard) {
+ if (n == null || guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ return obj[random(obj.length - 1)];
+ }
+ var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+ var length = getLength(sample);
+ n = Math.max(Math.min(n, length), 0);
+ var last = length - 1;
+ for (var index = 0; index < n; index++) {
+ var rand = random(index, last);
+ var temp = sample[index];
+ sample[index] = sample[rand];
+ sample[rand] = temp;
+ }
+ return sample.slice(0, n);
+ }
+
+ // Shuffle a collection.
+ function shuffle(obj) {
+ return sample(obj, Infinity);
+ }
+
+ // Sort the object's values by a criterion produced by an iteratee.
+ function sortBy(obj, iteratee, context) {
+ var index = 0;
+ iteratee = cb(iteratee, context);
+ return pluck(map(obj, function(value, key, list) {
+ return {
+ value: value,
+ index: index++,
+ criteria: iteratee(value, key, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+ }
+
+ // An internal function used for aggregate "group by" operations.
+ function group(behavior, partition) {
+ return function(obj, iteratee, context) {
+ var result = partition ? [[], []] : {};
+ iteratee = cb(iteratee, context);
+ each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+ }
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ var groupBy = group(function(result, value, key) {
+ if (has(result, key)) result[key].push(value); else result[key] = [value];
+ });
+
+ // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+ // when you know that your index values will be unique.
+ var indexBy = group(function(result, value, key) {
+ result[key] = value;
+ });
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ var countBy = group(function(result, value, key) {
+ if (has(result, key)) result[key]++; else result[key] = 1;
+ });
+
+ // Split a collection into two arrays: one whose elements all pass the given
+ // truth test, and one whose elements all do not pass the truth test.
+ var partition = group(function(result, value, pass) {
+ result[pass ? 0 : 1].push(value);
+ }, true);
+
+ // Safely create a real, live array from anything iterable.
+ var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+ function toArray(obj) {
+ if (!obj) return [];
+ if (isArray(obj)) return slice.call(obj);
+ if (isString(obj)) {
+ // Keep surrogate pair characters together.
+ return obj.match(reStrSymbol);
+ }
+ if (isArrayLike(obj)) return map(obj, identity);
+ return values(obj);
+ }
+
+ // Return the number of elements in a collection.
+ function size(obj) {
+ if (obj == null) return 0;
+ return isArrayLike(obj) ? obj.length : keys(obj).length;
+ }
+
+ // Internal `_.pick` helper function to determine whether `key` is an enumerable
+ // property name of `obj`.
+ function keyInObj(value, key, obj) {
+ return key in obj;
+ }
+
+ // Return a copy of the object only containing the allowed properties.
+ var pick = restArguments(function(obj, keys) {
+ var result = {}, iteratee = keys[0];
+ if (obj == null) return result;
+ if (isFunction$1(iteratee)) {
+ if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+ keys = allKeys(obj);
+ } else {
+ iteratee = keyInObj;
+ keys = flatten(keys, false, false);
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+ });
+
+ // Return a copy of the object without the disallowed properties.
+ var omit = restArguments(function(obj, keys) {
+ var iteratee = keys[0], context;
+ if (isFunction$1(iteratee)) {
+ iteratee = negate(iteratee);
+ if (keys.length > 1) context = keys[1];
+ } else {
+ keys = map(flatten(keys, false, false), String);
+ iteratee = function(value, key) {
+ return !contains(keys, key);
+ };
+ }
+ return pick(obj, iteratee, context);
+ });
+
+ // Returns everything but the last entry of the array. Especially useful on
+ // the arguments object. Passing **n** will return all the values in
+ // the array, excluding the last N.
+ function initial(array, n, guard) {
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+ }
+
+ // Get the first element of an array. Passing **n** will return the first N
+ // values in the array. The **guard** check allows it to work with `_.map`.
+ function first(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[0];
+ return initial(array, array.length - n);
+ }
+
+ // Returns everything but the first entry of the `array`. Especially useful on
+ // the `arguments` object. Passing an **n** will return the rest N values in the
+ // `array`.
+ function rest(array, n, guard) {
+ return slice.call(array, n == null || guard ? 1 : n);
+ }
+
+ // Get the last element of an array. Passing **n** will return the last N
+ // values in the array.
+ function last(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[array.length - 1];
+ return rest(array, Math.max(0, array.length - n));
+ }
+
+ // Trim out all falsy values from an array.
+ function compact(array) {
+ return filter(array, Boolean);
+ }
+
+ // Flatten out an array, either recursively (by default), or up to `depth`.
+ // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+ function flatten$1(array, depth) {
+ return flatten(array, depth, false);
+ }
+
+ // Take the difference between one array and a number of other arrays.
+ // Only the elements present in just the first array will remain.
+ var difference = restArguments(function(array, rest) {
+ rest = flatten(rest, true, true);
+ return filter(array, function(value){
+ return !contains(rest, value);
+ });
+ });
+
+ // Return a version of the array that does not contain the specified value(s).
+ var without = restArguments(function(array, otherArrays) {
+ return difference(array, otherArrays);
+ });
+
+ // Produce a duplicate-free version of the array. If the array has already
+ // been sorted, you have the option of using a faster algorithm.
+ // The faster algorithm will not work with an iteratee if the iteratee
+ // is not a one-to-one function, so providing an iteratee will disable
+ // the faster algorithm.
+ function uniq(array, isSorted, iteratee, context) {
+ if (!isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted && !iteratee) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ // Produce an array that contains the union: each distinct element from all of
+ // the passed-in arrays.
+ var union = restArguments(function(arrays) {
+ return uniq(flatten(arrays, true, true));
+ });
+
+ // Produce an array that contains every item shared between all the
+ // passed-in arrays.
+ function intersection(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var item = array[i];
+ if (contains(result, item)) continue;
+ var j;
+ for (j = 1; j < argsLength; j++) {
+ if (!contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+ }
+
+ // Complement of zip. Unzip accepts an array of arrays and groups
+ // each array's elements on shared indices.
+ function unzip(array) {
+ var length = array && max(array, getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = pluck(array, index);
+ }
+ return result;
+ }
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ var zip = restArguments(unzip);
+
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+ function object(list, values) {
+ var result = {};
+ for (var i = 0, length = getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ }
+
+ // Generate an integer Array containing an arithmetic progression. A port of
+ // the native Python `range()` function. See
+ // [the Python documentation](https://docs.python.org/library/functions.html#range).
+ function range(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+ }
+
+ // Chunk a single array into multiple arrays, each containing `count` or fewer
+ // items.
+ function chunk(array, count) {
+ if (count == null || count < 1) return [];
+ var result = [];
+ var i = 0, length = array.length;
+ while (i < length) {
+ result.push(slice.call(array, i, i += count));
+ }
+ return result;
+ }
+
+ // Helper function to continue chaining intermediate results.
+ function chainResult(instance, obj) {
+ return instance._chain ? _(obj).chain() : obj;
+ }
+
+ // Add your own custom functions to the Underscore object.
+ function mixin(obj) {
+ each(functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return chainResult(this, func.apply(_, args));
+ };
+ });
+ return _;
+ }
+
+ // Add all mutator `Array` functions to the wrapper.
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) {
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+ delete obj[0];
+ }
+ }
+ return chainResult(this, obj);
+ };
+ });
+
+ // Add all accessor `Array` functions to the wrapper.
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) obj = method.apply(obj, arguments);
+ return chainResult(this, obj);
+ };
+ });
+
+ // Named Exports
+
+ var allExports = {
+ __proto__: null,
+ VERSION: VERSION,
+ restArguments: restArguments,
+ isObject: isObject,
+ isNull: isNull,
+ isUndefined: isUndefined,
+ isBoolean: isBoolean,
+ isElement: isElement,
+ isString: isString,
+ isNumber: isNumber,
+ isDate: isDate,
+ isRegExp: isRegExp,
+ isError: isError,
+ isSymbol: isSymbol,
+ isArrayBuffer: isArrayBuffer,
+ isDataView: isDataView$1,
+ isArray: isArray,
+ isFunction: isFunction$1,
+ isArguments: isArguments$1,
+ isFinite: isFinite$1,
+ isNaN: isNaN$1,
+ isTypedArray: isTypedArray$1,
+ isEmpty: isEmpty,
+ isMatch: isMatch,
+ isEqual: isEqual,
+ isMap: isMap,
+ isWeakMap: isWeakMap,
+ isSet: isSet,
+ isWeakSet: isWeakSet,
+ keys: keys,
+ allKeys: allKeys,
+ values: values,
+ pairs: pairs,
+ invert: invert,
+ functions: functions,
+ methods: functions,
+ extend: extend,
+ extendOwn: extendOwn,
+ assign: extendOwn,
+ defaults: defaults,
+ create: create,
+ clone: clone,
+ tap: tap,
+ get: get,
+ has: has$1,
+ mapObject: mapObject,
+ identity: identity,
+ constant: constant,
+ noop: noop,
+ toPath: toPath,
+ property: property,
+ propertyOf: propertyOf,
+ matcher: matcher,
+ matches: matcher,
+ times: times,
+ random: random,
+ now: now,
+ escape: _escape,
+ unescape: _unescape,
+ templateSettings: templateSettings,
+ template: template,
+ result: result,
+ uniqueId: uniqueId,
+ chain: chain,
+ iteratee: iteratee,
+ partial: partial,
+ bind: bind,
+ bindAll: bindAll,
+ memoize: memoize,
+ delay: delay,
+ defer: defer,
+ throttle: throttle,
+ debounce: debounce,
+ wrap: wrap,
+ negate: negate,
+ compose: compose,
+ after: after,
+ before: before,
+ once: once,
+ findKey: findKey,
+ findIndex: findIndex,
+ findLastIndex: findLastIndex,
+ sortedIndex: sortedIndex,
+ indexOf: indexOf,
+ lastIndexOf: lastIndexOf,
+ find: find,
+ detect: find,
+ findWhere: findWhere,
+ each: each,
+ forEach: each,
+ map: map,
+ collect: map,
+ reduce: reduce,
+ foldl: reduce,
+ inject: reduce,
+ reduceRight: reduceRight,
+ foldr: reduceRight,
+ filter: filter,
+ select: filter,
+ reject: reject,
+ every: every,
+ all: every,
+ some: some,
+ any: some,
+ contains: contains,
+ includes: contains,
+ include: contains,
+ invoke: invoke,
+ pluck: pluck,
+ where: where,
+ max: max,
+ min: min,
+ shuffle: shuffle,
+ sample: sample,
+ sortBy: sortBy,
+ groupBy: groupBy,
+ indexBy: indexBy,
+ countBy: countBy,
+ partition: partition,
+ toArray: toArray,
+ size: size,
+ pick: pick,
+ omit: omit,
+ first: first,
+ head: first,
+ take: first,
+ initial: initial,
+ last: last,
+ rest: rest,
+ tail: rest,
+ drop: rest,
+ compact: compact,
+ flatten: flatten$1,
+ without: without,
+ uniq: uniq,
+ unique: uniq,
+ union: union,
+ intersection: intersection,
+ difference: difference,
+ unzip: unzip,
+ transpose: unzip,
+ zip: zip,
+ object: object,
+ range: range,
+ chunk: chunk,
+ mixin: mixin,
+ 'default': _
+ };
+
+ // Default Export
+
+ // Add all of the Underscore functions to the wrapper object.
+ var _$1 = mixin(allExports);
+ // Legacy Node.js API.
+ _$1._ = _$1;
+
+ return _$1;
+
+})));
+//# sourceMappingURL=underscore.js.map
diff --git a/node_modules/jsonpath/node_modules/underscore/underscore.js.map b/node_modules/jsonpath/node_modules/underscore/underscore.js.map
new file mode 100644
index 00000000..4d99d9ea
--- /dev/null
+++ b/node_modules/jsonpath/node_modules/underscore/underscore.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"underscore.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isArrayBuffer.js","modules/isFunction.js","modules/_hasObjectTag.js","modules/_stringTagBug.js","modules/isDataView.js","modules/isArray.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/_toBufferView.js","modules/isEqual.js","modules/allKeys.js","modules/_methodFingerprint.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/toPath.js","modules/_toPath.js","modules/_deepGet.js","modules/get.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_isArrayLike.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/toArray.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js"],"sourcesContent":null,"names":["isFunction","isFinite","isNaN","isDataView","isArguments","isTypedArray","toPath","has","_has","flatten","_flatten","_"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/jsonpath/package.json b/node_modules/jsonpath/package.json
new file mode 100644
index 00000000..49b91b17
--- /dev/null
+++ b/node_modules/jsonpath/package.json
@@ -0,0 +1,76 @@
+{
+ "_from": "jsonpath@^1.0.2",
+ "_id": "jsonpath@1.1.1",
+ "_inBundle": false,
+ "_integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "_location": "/jsonpath",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "jsonpath@^1.0.2",
+ "name": "jsonpath",
+ "escapedName": "jsonpath",
+ "rawSpec": "^1.0.2",
+ "saveSpec": null,
+ "fetchSpec": "^1.0.2"
+ },
+ "_requiredBy": [
+ "/actions-secret-parser"
+ ],
+ "_resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
+ "_shasum": "0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901",
+ "_spec": "jsonpath@^1.0.2",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\actions-secret-parser",
+ "alias": {
+ "./lib/aesprim.js": "./generated/aesprim-browser.js"
+ },
+ "author": {
+ "name": "david@fmail.co.uk"
+ },
+ "browser": "./jsonpath.js",
+ "bugs": {
+ "url": "https://github.com/dchester/jsonpath/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "esprima": "1.2.2",
+ "static-eval": "2.0.2",
+ "underscore": "1.12.1"
+ },
+ "deprecated": false,
+ "description": "Query JavaScript objects with JSONPath expressions. Robust / safe JSONPath engine for Node.js.",
+ "devDependencies": {
+ "grunt": "0.4.5",
+ "grunt-browserify": "3.8.0",
+ "grunt-cli": "0.1.13",
+ "grunt-contrib-uglify": "0.9.1",
+ "jison": "0.4.13",
+ "jscs": "1.10.0",
+ "jshint": "2.6.0",
+ "mocha": "2.1.0"
+ },
+ "homepage": "https://github.com/dchester/jsonpath#readme",
+ "keywords": [
+ "JSONPath",
+ "jsonpath",
+ "json-path",
+ "object",
+ "traversal",
+ "json",
+ "path",
+ "data structures"
+ ],
+ "license": "MIT",
+ "name": "jsonpath",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/dchester/jsonpath.git"
+ },
+ "scripts": {
+ "generate": "node bin/generate_parser.js > generated/parser.js",
+ "prepublishOnly": "node lib/aesprim.js > generated/aesprim-browser.js",
+ "test": "mocha -u tdd test && jscs lib && jshint lib"
+ },
+ "version": "1.1.1"
+}
diff --git a/node_modules/jsonpath/test/data/store.json b/node_modules/jsonpath/test/data/store.json
new file mode 100644
index 00000000..3e4d5d15
--- /dev/null
+++ b/node_modules/jsonpath/test/data/store.json
@@ -0,0 +1,31 @@
+{ "store": {
+ "book": [
+ { "category": "reference",
+ "author": "Nigel Rees",
+ "title": "Sayings of the Century",
+ "price": 8.95
+ },
+ { "category": "fiction",
+ "author": "Evelyn Waugh",
+ "title": "Sword of Honour",
+ "price": 12.99
+ },
+ { "category": "fiction",
+ "author": "Herman Melville",
+ "title": "Moby Dick",
+ "isbn": "0-553-21311-3",
+ "price": 8.99
+ },
+ { "category": "fiction",
+ "author": "J. R. R. Tolkien",
+ "title": "The Lord of the Rings",
+ "isbn": "0-395-19395-8",
+ "price": 22.99
+ }
+ ],
+ "bicycle": {
+ "color": "red",
+ "price": 19.95
+ }
+ }
+}
diff --git a/node_modules/jsonpath/test/lessons.js b/node_modules/jsonpath/test/lessons.js
new file mode 100644
index 00000000..2101bb06
--- /dev/null
+++ b/node_modules/jsonpath/test/lessons.js
@@ -0,0 +1,38 @@
+var assert = require('assert');
+var jp = require('../');
+
+var data = require('./data/store.json');
+
+suite('orig-google-code-issues', function() {
+
+ test('comma in eval', function() {
+ var pathExpression = '$..book[?(@.price && ",")]'
+ var results = jp.query(data, pathExpression);
+ assert.deepEqual(results, data.store.book);
+ });
+
+ test('member names with dots', function() {
+ var data = { 'www.google.com': 42, 'www.wikipedia.org': 190 };
+ var results = jp.query(data, "$['www.google.com']");
+ assert.deepEqual(results, [ 42 ]);
+ });
+
+ test('nested objects with filter', function() {
+ var data = { dataResult: { object: { objectInfo: { className: "folder", typeName: "Standard Folder", id: "uniqueId" } } } };
+ var results = jp.query(data, "$..object[?(@.className=='folder')]");
+ assert.deepEqual(results, [ data.dataResult.object.objectInfo ]);
+ });
+
+ test('script expressions with @ char', function() {
+ var data = { "DIV": [{ "@class": "value", "val": 5 }] };
+ var results = jp.query(data, "$..DIV[?(@['@class']=='value')]");
+ assert.deepEqual(results, data.DIV);
+ });
+
+ test('negative slices', function() {
+ var results = jp.query(data, "$..book[-1:].title");
+ assert.deepEqual(results, ['The Lord of the Rings']);
+ });
+
+});
+
diff --git a/node_modules/jsonpath/test/parse.js b/node_modules/jsonpath/test/parse.js
new file mode 100644
index 00000000..51fab319
--- /dev/null
+++ b/node_modules/jsonpath/test/parse.js
@@ -0,0 +1,164 @@
+var assert = require('assert');
+var jp = require('../');
+var util = require('util');
+
+suite('parse', function() {
+
+ test('should parse root-only', function() {
+ var path = jp.parse('$');
+ assert.deepEqual(path, [ { expression: { type: 'root', value: '$' } } ]);
+ });
+
+ test('parse path for store', function() {
+ var path = jp.parse('$.store');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'store' } }
+ ])
+ });
+
+ test('parse path for the authors of all books in the store', function() {
+ var path = jp.parse('$.store.book[*].author');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'store' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'book' } },
+ { operation: 'subscript', scope: 'child', expression: { type: 'wildcard', value: '*' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'author' } }
+ ])
+ });
+
+ test('parse path for all authors', function() {
+ var path = jp.parse('$..author');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'author' } }
+ ])
+ });
+
+ test('parse path for all authors via subscript descendant string literal', function() {
+ var path = jp.parse("$..['author']");
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'subscript', scope: 'descendant', expression: { type: 'string_literal', value: 'author' } }
+ ])
+ });
+
+ test('parse path for all things in store', function() {
+ var path = jp.parse('$.store.*');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'store' } },
+ { operation: 'member', scope: 'child', expression: { type: 'wildcard', value: '*' } }
+ ])
+ });
+
+ test('parse path for price of everything in the store', function() {
+ var path = jp.parse('$.store..price');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'store' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'price' } }
+ ])
+ });
+
+ test('parse path for the last book in order via expression', function() {
+ var path = jp.parse('$..book[(@.length-1)]');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'book' } },
+ { operation: 'subscript', scope: 'child', expression: { type: 'script_expression', value: '(@.length-1)' } }
+ ])
+ });
+
+ test('parse path for the first two books via union', function() {
+ var path = jp.parse('$..book[0,1]');
+
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'book' } },
+ { operation: 'subscript', scope: 'child', expression: { type: 'union', value: [ { expression: { type: 'numeric_literal', value: '0' } }, { expression: { type: 'numeric_literal', value: '1' } } ] } }
+ ])
+ });
+
+ test('parse path for the first two books via slice', function() {
+ var path = jp.parse('$..book[0:2]');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'book' } },
+ { operation: 'subscript', scope: 'child', expression: { type: 'slice', value: '0:2' } }
+ ])
+ });
+
+ test('parse path to filter all books with isbn number', function() {
+ var path = jp.parse('$..book[?(@.isbn)]');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'book' } },
+ { operation: 'subscript', scope: 'child', expression: { type: 'filter_expression', value: '?(@.isbn)' } }
+ ])
+ });
+
+ test('parse path to filter all books with a price less than 10', function() {
+ var path = jp.parse('$..book[?(@.price<10)]');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'identifier', value: 'book' } },
+ { operation: 'subscript', scope: 'child', expression: { type: 'filter_expression', value: '?(@.price<10)' } }
+ ])
+ });
+
+ test('parse path to match all elements', function() {
+ var path = jp.parse('$..*');
+ assert.deepEqual(path, [
+ { expression: { type: 'root', value: '$' } },
+ { operation: 'member', scope: 'descendant', expression: { type: 'wildcard', value: '*' } }
+ ])
+ });
+
+ test('parse path with leading member', function() {
+ var path = jp.parse('store');
+ assert.deepEqual(path, [
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'store' } }
+ ])
+ });
+
+ test('parse path with leading member and followers', function() {
+ var path = jp.parse('Request.prototype.end');
+ assert.deepEqual(path, [
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'Request' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'prototype' } },
+ { operation: 'member', scope: 'child', expression: { type: 'identifier', value: 'end' } }
+ ])
+ });
+
+ test('parser ast is reinitialized after parse() throws', function() {
+ assert.throws(function() { var path = jp.parse('store.book...') })
+ var path = jp.parse('$..price');
+ assert.deepEqual(path, [
+ { "expression": { "type": "root", "value": "$" } },
+ { "expression": { "type": "identifier", "value": "price" }, "operation": "member", "scope": "descendant"}
+ ])
+ });
+
+});
+
+suite('parse-negative', function() {
+
+ test('parse path with leading member component throws', function() {
+ assert.throws(function(e) { var path = jp.parse('.store') }, /Expecting 'DOLLAR'/)
+ });
+
+ test('parse path with leading descendant member throws', function() {
+ assert.throws(function() { var path = jp.parse('..store') }, /Expecting 'DOLLAR'/)
+ });
+
+ test('leading script throws', function() {
+ assert.throws(function() { var path = jp.parse('()') }, /Unrecognized text/)
+ });
+
+ test('first time friendly error', function() {
+ assert.throws(function() { (new jp.JSONPath).parse('$...') }, /Expecting 'STAR'/)
+ });
+
+});
diff --git a/node_modules/jsonpath/test/query.js b/node_modules/jsonpath/test/query.js
new file mode 100644
index 00000000..6a2a1843
--- /dev/null
+++ b/node_modules/jsonpath/test/query.js
@@ -0,0 +1,359 @@
+var assert = require('assert');
+var jp = require('../');
+
+var data = require('./data/store.json');
+
+suite('query', function() {
+
+ test('first-level member', function() {
+ var results = jp.nodes(data, '$.store');
+ assert.deepEqual(results, [ { path: ['$', 'store'], value: data.store } ]);
+ });
+
+ test('authors of all books in the store', function() {
+ var results = jp.nodes(data, '$.store.book[*].author');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'author'], value: 'Nigel Rees' },
+ { path: ['$', 'store', 'book', 1, 'author'], value: 'Evelyn Waugh' },
+ { path: ['$', 'store', 'book', 2, 'author'], value: 'Herman Melville' },
+ { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. Tolkien' }
+ ]);
+ });
+
+ test('all authors', function() {
+ var results = jp.nodes(data, '$..author');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'author'], value: 'Nigel Rees' },
+ { path: ['$', 'store', 'book', 1, 'author'], value: 'Evelyn Waugh' },
+ { path: ['$', 'store', 'book', 2, 'author'], value: 'Herman Melville' },
+ { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. Tolkien' }
+ ]);
+ });
+
+ test('all authors via subscript descendant string literal', function() {
+ var results = jp.nodes(data, "$..['author']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'author'], value: 'Nigel Rees' },
+ { path: ['$', 'store', 'book', 1, 'author'], value: 'Evelyn Waugh' },
+ { path: ['$', 'store', 'book', 2, 'author'], value: 'Herman Melville' },
+ { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. Tolkien' }
+ ]);
+ });
+
+ test('all things in store', function() {
+ var results = jp.nodes(data, '$.store.*');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book'], value: data.store.book },
+ { path: ['$', 'store', 'bicycle'], value: data.store.bicycle }
+ ]);
+ });
+
+ test('price of everything in the store', function() {
+ var results = jp.nodes(data, '$.store..price');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'price'], value: 8.95 },
+ { path: ['$', 'store', 'book', 1, 'price'], value: 12.99 },
+ { path: ['$', 'store', 'book', 2, 'price'], value: 8.99 },
+ { path: ['$', 'store', 'book', 3, 'price'], value: 22.99 },
+ { path: ['$', 'store', 'bicycle', 'price'], value: 19.95 }
+ ]);
+ });
+
+ test('last book in order via expression', function() {
+ var results = jp.nodes(data, '$..book[(@.length-1)]');
+ assert.deepEqual(results, [ { path: ['$', 'store', 'book', 3], value: data.store.book[3] }]);
+ });
+
+ test('first two books via union', function() {
+ var results = jp.nodes(data, '$..book[0,1]');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0], value: data.store.book[0] },
+ { path: ['$', 'store', 'book', 1], value: data.store.book[1] }
+ ]);
+ });
+
+ test('first two books via slice', function() {
+ var results = jp.nodes(data, '$..book[0:2]');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0], value: data.store.book[0] },
+ { path: ['$', 'store', 'book', 1], value: data.store.book[1] }
+ ]);
+ });
+
+ test('filter all books with isbn number', function() {
+ var results = jp.nodes(data, '$..book[?(@.isbn)]');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 2], value: data.store.book[2] },
+ { path: ['$', 'store', 'book', 3], value: data.store.book[3] }
+ ]);
+ });
+
+ test('filter all books with a price less than 10', function() {
+ var results = jp.nodes(data, '$..book[?(@.price<10)]');
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0], value: data.store.book[0] },
+ { path: ['$', 'store', 'book', 2], value: data.store.book[2] }
+ ]);
+ });
+
+ test('first ten of all elements', function() {
+ var results = jp.nodes(data, '$..*', 10);
+ assert.deepEqual(results, [
+ { path: [ '$', 'store' ], value: data.store },
+ { path: [ '$', 'store', 'book' ], value: data.store.book },
+ { path: [ '$', 'store', 'bicycle' ], value: data.store.bicycle },
+ { path: [ '$', 'store', 'book', 0 ], value: data.store.book[0] },
+ { path: [ '$', 'store', 'book', 1 ], value: data.store.book[1] },
+ { path: [ '$', 'store', 'book', 2 ], value: data.store.book[2] },
+ { path: [ '$', 'store', 'book', 3 ], value: data.store.book[3] },
+ { path: [ '$', 'store', 'book', 0, 'category' ], value: 'reference' },
+ { path: [ '$', 'store', 'book', 0, 'author' ], value: 'Nigel Rees' },
+ { path: [ '$', 'store', 'book', 0, 'title' ], value: 'Sayings of the Century' }
+ ])
+ });
+
+ test('all elements', function() {
+ var results = jp.nodes(data, '$..*');
+
+ assert.deepEqual(results, [
+ { path: [ '$', 'store' ], value: data.store },
+ { path: [ '$', 'store', 'book' ], value: data.store.book },
+ { path: [ '$', 'store', 'bicycle' ], value: data.store.bicycle },
+ { path: [ '$', 'store', 'book', 0 ], value: data.store.book[0] },
+ { path: [ '$', 'store', 'book', 1 ], value: data.store.book[1] },
+ { path: [ '$', 'store', 'book', 2 ], value: data.store.book[2] },
+ { path: [ '$', 'store', 'book', 3 ], value: data.store.book[3] },
+ { path: [ '$', 'store', 'book', 0, 'category' ], value: 'reference' },
+ { path: [ '$', 'store', 'book', 0, 'author' ], value: 'Nigel Rees' },
+ { path: [ '$', 'store', 'book', 0, 'title' ], value: 'Sayings of the Century' },
+ { path: [ '$', 'store', 'book', 0, 'price' ], value: 8.95 },
+ { path: [ '$', 'store', 'book', 1, 'category' ], value: 'fiction' },
+ { path: [ '$', 'store', 'book', 1, 'author' ], value: 'Evelyn Waugh' },
+ { path: [ '$', 'store', 'book', 1, 'title' ], value: 'Sword of Honour' },
+ { path: [ '$', 'store', 'book', 1, 'price' ], value: 12.99 },
+ { path: [ '$', 'store', 'book', 2, 'category' ], value: 'fiction' },
+ { path: [ '$', 'store', 'book', 2, 'author' ], value: 'Herman Melville' },
+ { path: [ '$', 'store', 'book', 2, 'title' ], value: 'Moby Dick' },
+ { path: [ '$', 'store', 'book', 2, 'isbn' ], value: '0-553-21311-3' },
+ { path: [ '$', 'store', 'book', 2, 'price' ], value: 8.99 },
+ { path: [ '$', 'store', 'book', 3, 'category' ], value: 'fiction' },
+ { path: [ '$', 'store', 'book', 3, 'author' ], value: 'J. R. R. Tolkien' },
+ { path: [ '$', 'store', 'book', 3, 'title' ], value: 'The Lord of the Rings' },
+ { path: [ '$', 'store', 'book', 3, 'isbn' ], value: '0-395-19395-8' },
+ { path: [ '$', 'store', 'book', 3, 'price' ], value: 22.99 },
+ { path: [ '$', 'store', 'bicycle', 'color' ], value: 'red' },
+ { path: [ '$', 'store', 'bicycle', 'price' ], value: 19.95 }
+ ]);
+ });
+
+ test('all elements via subscript wildcard', function() {
+ var results = jp.nodes(data, '$..*');
+ assert.deepEqual(jp.nodes(data, '$..[*]'), jp.nodes(data, '$..*'));
+ });
+
+ test('object subscript wildcard', function() {
+ var results = jp.query(data, '$.store[*]');
+ assert.deepEqual(results, [ data.store.book, data.store.bicycle ]);
+ });
+
+ test('no match returns empty array', function() {
+ var results = jp.nodes(data, '$..bookz');
+ assert.deepEqual(results, []);
+ });
+
+ test('member numeric literal gets first element', function() {
+ var results = jp.nodes(data, '$.store.book.0');
+ assert.deepEqual(results, [ { path: [ '$', 'store', 'book', 0 ], value: data.store.book[0] } ]);
+ });
+
+ test('member numeric literal matches string-numeric key', function() {
+ var data = { authors: { '1': 'Herman Melville', '2': 'J. R. R. Tolkien' } };
+ var results = jp.nodes(data, '$.authors.1');
+ assert.deepEqual(results, [ { path: [ '$', 'authors', 1 ], value: 'Herman Melville' } ]);
+ });
+
+ test('descendant numeric literal gets first element', function() {
+ var results = jp.nodes(data, '$.store.book..0');
+ assert.deepEqual(results, [ { path: [ '$', 'store', 'book', 0 ], value: data.store.book[0] } ]);
+ });
+
+ test('root element gets us original obj', function() {
+ var results = jp.nodes(data, '$');
+ assert.deepEqual(results, [ { path: ['$'], value: data } ]);
+ });
+
+ test('subscript double-quoted string', function() {
+ var results = jp.nodes(data, '$["store"]');
+ assert.deepEqual(results, [ { path: ['$', 'store'], value: data.store} ]);
+ });
+
+ test('subscript single-quoted string', function() {
+ var results = jp.nodes(data, "$['store']");
+ assert.deepEqual(results, [ { path: ['$', 'store'], value: data.store} ]);
+ });
+
+ test('leading member component', function() {
+ var results = jp.nodes(data, "store");
+ assert.deepEqual(results, [ { path: ['$', 'store'], value: data.store} ]);
+ });
+
+ test('union of three array slices', function() {
+ var results = jp.query(data, "$.store.book[0:1,1:2,2:3]");
+ assert.deepEqual(results, data.store.book.slice(0,3));
+ });
+
+ test('slice with step > 1', function() {
+ var results = jp.query(data, "$.store.book[0:4:2]");
+ assert.deepEqual(results, [ data.store.book[0], data.store.book[2]]);
+ });
+
+ test('union of subscript string literal keys', function() {
+ var results = jp.nodes(data, "$.store['book','bicycle']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book'], value: data.store.book },
+ { path: ['$', 'store', 'bicycle'], value: data.store.bicycle },
+ ]);
+ });
+
+ test('union of subscript string literal three keys', function() {
+ var results = jp.nodes(data, "$.store.book[0]['title','author','price']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'title'], value: data.store.book[0].title },
+ { path: ['$', 'store', 'book', 0, 'author'], value: data.store.book[0].author },
+ { path: ['$', 'store', 'book', 0, 'price'], value: data.store.book[0].price }
+ ]);
+ });
+
+ test('union of subscript integer three keys followed by member-child-identifier', function() {
+ var results = jp.nodes(data, "$.store.book[1,2,3]['title']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 1, 'title'], value: data.store.book[1].title },
+ { path: ['$', 'store', 'book', 2, 'title'], value: data.store.book[2].title },
+ { path: ['$', 'store', 'book', 3, 'title'], value: data.store.book[3].title }
+ ]);
+ });
+
+ test('union of subscript integer three keys followed by union of subscript string literal three keys', function() {
+ var results = jp.nodes(data, "$.store.book[0,1,2,3]['title','author','price']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'title'], value: data.store.book[0].title },
+ { path: ['$', 'store', 'book', 0, 'author'], value: data.store.book[0].author },
+ { path: ['$', 'store', 'book', 0, 'price'], value: data.store.book[0].price },
+ { path: ['$', 'store', 'book', 1, 'title'], value: data.store.book[1].title },
+ { path: ['$', 'store', 'book', 1, 'author'], value: data.store.book[1].author },
+ { path: ['$', 'store', 'book', 1, 'price'], value: data.store.book[1].price },
+ { path: ['$', 'store', 'book', 2, 'title'], value: data.store.book[2].title },
+ { path: ['$', 'store', 'book', 2, 'author'], value: data.store.book[2].author },
+ { path: ['$', 'store', 'book', 2, 'price'], value: data.store.book[2].price },
+ { path: ['$', 'store', 'book', 3, 'title'], value: data.store.book[3].title },
+ { path: ['$', 'store', 'book', 3, 'author'], value: data.store.book[3].author },
+ { path: ['$', 'store', 'book', 3, 'price'], value: data.store.book[3].price }
+ ]);
+ });
+
+ test('union of subscript integer four keys, including an inexistent one, followed by union of subscript string literal three keys', function() {
+ var results = jp.nodes(data, "$.store.book[0,1,2,3,151]['title','author','price']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'title'], value: data.store.book[0].title },
+ { path: ['$', 'store', 'book', 0, 'author'], value: data.store.book[0].author },
+ { path: ['$', 'store', 'book', 0, 'price'], value: data.store.book[0].price },
+ { path: ['$', 'store', 'book', 1, 'title'], value: data.store.book[1].title },
+ { path: ['$', 'store', 'book', 1, 'author'], value: data.store.book[1].author },
+ { path: ['$', 'store', 'book', 1, 'price'], value: data.store.book[1].price },
+ { path: ['$', 'store', 'book', 2, 'title'], value: data.store.book[2].title },
+ { path: ['$', 'store', 'book', 2, 'author'], value: data.store.book[2].author },
+ { path: ['$', 'store', 'book', 2, 'price'], value: data.store.book[2].price },
+ { path: ['$', 'store', 'book', 3, 'title'], value: data.store.book[3].title },
+ { path: ['$', 'store', 'book', 3, 'author'], value: data.store.book[3].author },
+ { path: ['$', 'store', 'book', 3, 'price'], value: data.store.book[3].price }
+ ]);
+ });
+
+ test('union of subscript integer three keys followed by union of subscript string literal three keys, followed by inexistent literal key', function() {
+ var results = jp.nodes(data, "$.store.book[0,1,2,3]['title','author','price','fruit']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'title'], value: data.store.book[0].title },
+ { path: ['$', 'store', 'book', 0, 'author'], value: data.store.book[0].author },
+ { path: ['$', 'store', 'book', 0, 'price'], value: data.store.book[0].price },
+ { path: ['$', 'store', 'book', 1, 'title'], value: data.store.book[1].title },
+ { path: ['$', 'store', 'book', 1, 'author'], value: data.store.book[1].author },
+ { path: ['$', 'store', 'book', 1, 'price'], value: data.store.book[1].price },
+ { path: ['$', 'store', 'book', 2, 'title'], value: data.store.book[2].title },
+ { path: ['$', 'store', 'book', 2, 'author'], value: data.store.book[2].author },
+ { path: ['$', 'store', 'book', 2, 'price'], value: data.store.book[2].price },
+ { path: ['$', 'store', 'book', 3, 'title'], value: data.store.book[3].title },
+ { path: ['$', 'store', 'book', 3, 'author'], value: data.store.book[3].author },
+ { path: ['$', 'store', 'book', 3, 'price'], value: data.store.book[3].price }
+ ]);
+ });
+
+ test('union of subscript 4 array slices followed by union of subscript string literal three keys', function() {
+ var results = jp.nodes(data, "$.store.book[0:1,1:2,2:3,3:4]['title','author','price']");
+ assert.deepEqual(results, [
+ { path: ['$', 'store', 'book', 0, 'title'], value: data.store.book[0].title },
+ { path: ['$', 'store', 'book', 0, 'author'], value: data.store.book[0].author },
+ { path: ['$', 'store', 'book', 0, 'price'], value: data.store.book[0].price },
+ { path: ['$', 'store', 'book', 1, 'title'], value: data.store.book[1].title },
+ { path: ['$', 'store', 'book', 1, 'author'], value: data.store.book[1].author },
+ { path: ['$', 'store', 'book', 1, 'price'], value: data.store.book[1].price },
+ { path: ['$', 'store', 'book', 2, 'title'], value: data.store.book[2].title },
+ { path: ['$', 'store', 'book', 2, 'author'], value: data.store.book[2].author },
+ { path: ['$', 'store', 'book', 2, 'price'], value: data.store.book[2].price },
+ { path: ['$', 'store', 'book', 3, 'title'], value: data.store.book[3].title },
+ { path: ['$', 'store', 'book', 3, 'author'], value: data.store.book[3].author },
+ { path: ['$', 'store', 'book', 3, 'price'], value: data.store.book[3].price }
+ ]);
+ });
+
+
+ test('nested parentheses eval', function() {
+ var pathExpression = '$..book[?( @.price && (@.price + 20 || false) )]'
+ var results = jp.query(data, pathExpression);
+ assert.deepEqual(results, data.store.book);
+ });
+
+ test('array indexes from 0 to 100', function() {
+ var data = [];
+ for (var i = 0; i <= 100; ++i)
+ data[i] = Math.random();
+
+ for (var i = 0; i <= 100; ++i) {
+ var results = jp.query(data, '$[' + i.toString() + ']');
+ assert.deepEqual(results, [data[i]]);
+ }
+ });
+
+ test('descendant subscript numeric literal', function() {
+ var data = [ 0, [ 1, 2, 3 ], [ 4, 5, 6 ] ];
+ var results = jp.query(data, '$..[0]');
+ assert.deepEqual(results, [ 0, 1, 4 ]);
+ });
+
+ test('descendant subscript numeric literal', function() {
+ var data = [ 0, 1, [ 2, 3, 4 ], [ 5, 6, 7, [ 8, 9 , 10 ] ] ];
+ var results = jp.query(data, '$..[0,1]');
+ assert.deepEqual(results, [ 0, 1, 2, 3, 5, 6, 8, 9 ]);
+ });
+
+ test('throws for no input', function() {
+ assert.throws(function() { jp.query() }, /needs to be an object/);
+ });
+
+ test('throws for bad input', function() {
+ assert.throws(function() { jp.query("string", "string") }, /needs to be an object/);
+ });
+
+ test('throws for bad input', function() {
+ assert.throws(function() { jp.query({}, null) }, /we need a path/);
+ });
+
+ test('throws for bad input', function() {
+ assert.throws(function() { jp.query({}, 42) }, /we need a path/);
+ });
+
+ test('union on objects', function() {
+ assert.deepEqual(jp.query({a: 1, b: 2, c: null}, '$..["a","b","c","d"]'), [1, 2, null]);
+ });
+
+});
+
diff --git a/node_modules/jsonpath/test/slice.js b/node_modules/jsonpath/test/slice.js
new file mode 100644
index 00000000..a062e453
--- /dev/null
+++ b/node_modules/jsonpath/test/slice.js
@@ -0,0 +1,57 @@
+var assert = require('assert');
+var slice = require('../lib/slice');
+
+var data = ['a', 'b', 'c', 'd', 'e', 'f'];
+
+suite('slice', function() {
+
+ test('no params yields copy', function() {
+ assert.deepEqual(slice(data), data);
+ });
+
+ test('no end param defaults to end', function() {
+ assert.deepEqual(slice(data, 2), data.slice(2));
+ });
+
+ test('zero end param yields empty', function() {
+ assert.deepEqual(slice(data, 0, 0), []);
+ });
+
+ test('first element with explicit params', function() {
+ assert.deepEqual(slice(data, 0, 1, 1), ['a']);
+ });
+
+ test('last element with explicit params', function() {
+ assert.deepEqual(slice(data, -1, 6), ['f']);
+ });
+
+ test('empty extents and negative step reverses', function() {
+ assert.deepEqual(slice(data, null, null, -1), ['f', 'e', 'd', 'c', 'b', 'a']);
+ });
+
+ test('negative step partial slice', function() {
+ assert.deepEqual(slice(data, 4, 2, -1), ['e', 'd']);
+ });
+
+ test('negative step partial slice no start defaults to end', function() {
+ assert.deepEqual(slice(data, null, 2, -1), ['f', 'e', 'd']);
+ });
+
+ test('extents clamped end', function() {
+ assert.deepEqual(slice(data, null, 100), data);
+ });
+
+ test('extents clamped beginning', function() {
+ assert.deepEqual(slice(data, -100, 100), data);
+ });
+
+ test('backwards extents yields empty', function() {
+ assert.deepEqual(slice(data, 2, 1), []);
+ });
+
+ test('zero step gets shot down', function() {
+ assert.throws(function() { slice(data, null, null, 0) });
+ });
+
+});
+
diff --git a/node_modules/jsonpath/test/stringify.js b/node_modules/jsonpath/test/stringify.js
new file mode 100644
index 00000000..36d340f2
--- /dev/null
+++ b/node_modules/jsonpath/test/stringify.js
@@ -0,0 +1,54 @@
+var assert = require('assert');
+var jp = require('../');
+
+suite('stringify', function() {
+
+ test('simple path stringifies', function() {
+ var string = jp.stringify(['$', 'a', 'b', 'c']);
+ assert.equal(string, '$.a.b.c');
+ });
+
+ test('numeric literals end up as subscript numbers', function() {
+ var string = jp.stringify(['$', 'store', 'book', 0, 'author']);
+ assert.equal(string, '$.store.book[0].author');
+ });
+
+ test('simple path with no leading root stringifies', function() {
+ var string = jp.stringify(['a', 'b', 'c']);
+ assert.equal(string, '$.a.b.c');
+ });
+
+ test('simple parsed path stringifies', function() {
+ var path = [
+ { scope: 'child', operation: 'member', expression: { type: 'identifier', value: 'a' } },
+ { scope: 'child', operation: 'member', expression: { type: 'identifier', value: 'b' } },
+ { scope: 'child', operation: 'member', expression: { type: 'identifier', value: 'c' } }
+ ];
+ var string = jp.stringify(path);
+ assert.equal(string, '$.a.b.c');
+ });
+
+ test('keys with hyphens get subscripted', function() {
+ var string = jp.stringify(['$', 'member-search']);
+ assert.equal(string, '$["member-search"]');
+ });
+
+ test('complicated path round trips', function() {
+ var pathExpression = '$..*[0:2].member["string-xyz"]';
+ var path = jp.parse(pathExpression);
+ var string = jp.stringify(path);
+ assert.equal(string, pathExpression);
+ });
+
+ test('complicated path with filter exp round trips', function() {
+ var pathExpression = '$..*[0:2].member[?(@.val > 10)]';
+ var path = jp.parse(pathExpression);
+ var string = jp.stringify(path);
+ assert.equal(string, pathExpression);
+ });
+
+ test('throws for no input', function() {
+ assert.throws(function() { jp.stringify() }, /we need a path/);
+ });
+
+});
diff --git a/node_modules/jsonpath/test/sugar.js b/node_modules/jsonpath/test/sugar.js
new file mode 100644
index 00000000..98a21b9c
--- /dev/null
+++ b/node_modules/jsonpath/test/sugar.js
@@ -0,0 +1,72 @@
+var assert = require('assert');
+var jp = require('../');
+var util = require('util');
+
+suite('sugar', function() {
+
+ test('parent gets us parent value', function() {
+ var data = { a: 1, b: 2, c: 3, z: { a: 100, b: 200 } };
+ var parent = jp.parent(data, '$.z.b');
+ assert.equal(parent, data.z);
+ });
+
+ test('apply method sets values', function() {
+ var data = { a: 1, b: 2, c: 3, z: { a: 100, b: 200 } };
+ jp.apply(data, '$..a', function(v) { return v + 1 });
+ assert.equal(data.a, 2);
+ assert.equal(data.z.a, 101);
+ });
+
+ test('apply method applies survives structural changes', function() {
+ var data = {a: {b: [1, {c: [2,3]}]}};
+ jp.apply(data, '$..*[?(@.length > 1)]', function(array) {
+ return array.reverse();
+ });
+ assert.deepEqual(data.a.b, [{c: [3, 2]}, 1]);
+ });
+
+ test('value method gets us a value', function() {
+ var data = { a: 1, b: 2, c: 3, z: { a: 100, b: 200 } };
+ var b = jp.value(data, '$..b')
+ assert.equal(b, data.b);
+ });
+
+ test('value method sets us a value', function() {
+ var data = { a: 1, b: 2, c: 3, z: { a: 100, b: 200 } };
+ var b = jp.value(data, '$..b', '5000')
+ assert.equal(b, 5000);
+ assert.equal(data.b, 5000);
+ });
+
+ test('value method sets new key and value', function() {
+ var data = {};
+ var a = jp.value(data, '$.a', 1);
+ var c = jp.value(data, '$.b.c', 2);
+ assert.equal(a, 1);
+ assert.equal(data.a, 1);
+ assert.equal(c, 2);
+ assert.equal(data.b.c, 2);
+ });
+
+ test('value method sets new array value', function() {
+ var data = {};
+ var v1 = jp.value(data, '$.a.d[0]', 4);
+ var v2 = jp.value(data, '$.a.d[1]', 5);
+ assert.equal(v1, 4);
+ assert.equal(v2, 5);
+ assert.deepEqual(data.a.d, [4, 5]);
+ });
+
+ test('value method sets non-literal key', function() {
+ var data = { "list": [ { "index": 0, "value": "default" }, { "index": 1, "value": "default" } ] };
+ jp.value(data, '$.list[?(@.index == 1)].value', "test");
+ assert.equal(data.list[1].value, "test");
+ });
+
+ test('paths with a count gets us back count many paths', function() {
+ data = [ { a: [ 1, 2, 3 ], b: [ -1, -2, -3 ] }, { } ]
+ paths = jp.paths(data, '$..*', 3)
+ assert.deepEqual(paths, [ ['$', '0'], ['$', '1'], ['$', '0', 'a'] ]);
+ });
+
+});
diff --git a/node_modules/levn/LICENSE b/node_modules/levn/LICENSE
new file mode 100644
index 00000000..525b1185
--- /dev/null
+++ b/node_modules/levn/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) George Zahariev
+
+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/levn/README.md b/node_modules/levn/README.md
new file mode 100644
index 00000000..bb9ffea0
--- /dev/null
+++ b/node_modules/levn/README.md
@@ -0,0 +1,196 @@
+# levn [](https://travis-ci.org/gkz/levn)
+__Light ECMAScript (JavaScript) Value Notation__
+Levn is a library which allows you to parse a string into a JavaScript value based on an expected type. It is meant for short amounts of human entered data (eg. config files, command line arguments).
+
+Levn aims to concisely describe JavaScript values in text, and allow for the extraction and validation of those values. Levn uses [type-check](https://github.com/gkz/type-check) for its type format, and to validate the results. MIT license. Version 0.3.0.
+
+__How is this different than JSON?__ levn is meant to be written by humans only, is (due to the previous point) much more concise, can be validated against supplied types, has regex and date literals, and can easily be extended with custom types. On the other hand, it is probably slower and thus less efficient at transporting large amounts of data, which is fine since this is not its purpose.
+
+ npm install levn
+
+For updates on levn, [follow me on twitter](https://twitter.com/gkzahariev).
+
+
+## Quick Examples
+
+```js
+var parse = require('levn').parse;
+parse('Number', '2'); // 2
+parse('String', '2'); // '2'
+parse('String', 'levn'); // 'levn'
+parse('String', 'a b'); // 'a b'
+parse('Boolean', 'true'); // true
+
+parse('Date', '#2011-11-11#'); // (Date object)
+parse('Date', '2011-11-11'); // (Date object)
+parse('RegExp', '/[a-z]/gi'); // /[a-z]/gi
+parse('RegExp', 're'); // /re/
+parse('Int', '2'); // 2
+
+parse('Number | String', 'str'); // 'str'
+parse('Number | String', '2'); // 2
+
+parse('[Number]', '[1,2,3]'); // [1,2,3]
+parse('(String, Boolean)', '(hi, false)'); // ['hi', false]
+parse('{a: String, b: Number}', '{a: str, b: 2}'); // {a: 'str', b: 2}
+
+// at the top level, you can ommit surrounding delimiters
+parse('[Number]', '1,2,3'); // [1,2,3]
+parse('(String, Boolean)', 'hi, false'); // ['hi', false]
+parse('{a: String, b: Number}', 'a: str, b: 2'); // {a: 'str', b: 2}
+
+// wildcard - auto choose type
+parse('*', '[hi,(null,[42]),{k: true}]'); // ['hi', [null, [42]], {k: true}]
+```
+## Usage
+
+`require('levn');` returns an object that exposes three properties. `VERSION` is the current version of the library as a string. `parse` and `parsedTypeParse` are functions.
+
+```js
+// parse(type, input, options);
+parse('[Number]', '1,2,3'); // [1, 2, 3]
+
+// parsedTypeParse(parsedType, input, options);
+var parsedType = require('type-check').parseType('[Number]');
+parsedTypeParse(parsedType, '1,2,3'); // [1, 2, 3]
+```
+
+### parse(type, input, options)
+
+`parse` casts the string `input` into a JavaScript value according to the specified `type` in the [type format](https://github.com/gkz/type-check#type-format) (and taking account the optional `options`) and returns the resulting JavaScript value.
+
+##### arguments
+* type - `String` - the type written in the [type format](https://github.com/gkz/type-check#type-format) which to check against
+* input - `String` - the value written in the [levn format](#levn-format)
+* options - `Maybe Object` - an optional parameter specifying additional [options](#options)
+
+##### returns
+`*` - the resulting JavaScript value
+
+##### example
+```js
+parse('[Number]', '1,2,3'); // [1, 2, 3]
+```
+
+### parsedTypeParse(parsedType, input, options)
+
+`parsedTypeParse` casts the string `input` into a JavaScript value according to the specified `type` which has already been parsed (and taking account the optional `options`) and returns the resulting JavaScript value. You can parse a type using the [type-check](https://github.com/gkz/type-check) library's `parseType` function.
+
+##### arguments
+* type - `Object` - the type in the parsed type format which to check against
+* input - `String` - the value written in the [levn format](#levn-format)
+* options - `Maybe Object` - an optional parameter specifying additional [options](#options)
+
+##### returns
+`*` - the resulting JavaScript value
+
+##### example
+```js
+var parsedType = require('type-check').parseType('[Number]');
+parsedTypeParse(parsedType, '1,2,3'); // [1, 2, 3]
+```
+
+## Levn Format
+
+Levn can use the type information you provide to choose the appropriate value to produce from the input. For the same input, it will choose a different output value depending on the type provided. For example, `parse('Number', '2')` will produce the number `2`, but `parse('String', '2')` will produce the string `"2"`.
+
+If you do not provide type information, and simply use `*`, levn will parse the input according the unambiguous "explicit" mode, which we will now detail - you can also set the `explicit` option to true manually in the [options](#options).
+
+* `"string"`, `'string'` are parsed as a String, eg. `"a msg"` is `"a msg"`
+* `#date#` is parsed as a Date, eg. `#2011-11-11#` is `new Date('2011-11-11')`
+* `/regexp/flags` is parsed as a RegExp, eg. `/re/gi` is `/re/gi`
+* `undefined`, `null`, `NaN`, `true`, and `false` are all their JavaScript equivalents
+* `[element1, element2, etc]` is an Array, and the casting procedure is recursively applied to each element. Eg. `[1,2,3]` is `[1,2,3]`.
+* `(element1, element2, etc)` is an tuple, and the casting procedure is recursively applied to each element. Eg. `(1, a)` is `(1, a)` (is `[1, 'a']`).
+* `{key1: val1, key2: val2, ...}` is an Object, and the casting procedure is recursively applied to each property. Eg. `{a: 1, b: 2}` is `{a: 1, b: 2}`.
+* Any test which does not fall under the above, and which does not contain special characters (`[``]``(``)``{``}``:``,`) is a string, eg. `$12- blah` is `"$12- blah"`.
+
+If you do provide type information, you can make your input more concise as the program already has some information about what it expects. Please see the [type format](https://github.com/gkz/type-check#type-format) section of [type-check](https://github.com/gkz/type-check) for more information about how to specify types. There are some rules about what levn can do with the information:
+
+* If a String is expected, and only a String, all characters of the input (including any special ones) will become part of the output. Eg. `[({})]` is `"[({})]"`, and `"hi"` is `'"hi"'`.
+* If a Date is expected, the surrounding `#` can be omitted from date literals. Eg. `2011-11-11` is `new Date('2011-11-11')`.
+* If a RegExp is expected, no flags need to be specified, and the regex is not using any of the special characters,the opening and closing `/` can be omitted - this will have the affect of setting the source of the regex to the input. Eg. `regex` is `/regex/`.
+* If an Array is expected, and it is the root node (at the top level), the opening `[` and closing `]` can be omitted. Eg. `1,2,3` is `[1,2,3]`.
+* If a tuple is expected, and it is the root node (at the top level), the opening `(` and closing `)` can be omitted. Eg. `1, a` is `(1, a)` (is `[1, 'a']`).
+* If an Object is expected, and it is the root node (at the top level), the opening `{` and closing `}` can be omitted. Eg `a: 1, b: 2` is `{a: 1, b: 2}`.
+
+If you list multiple types (eg. `Number | String`), it will first attempt to cast to the first type and then validate - if the validation fails it will move on to the next type and so forth, left to right. You must be careful as some types will succeed with any input, such as String. Thus put String at the end of your list. In non-explicit mode, Date and RegExp will succeed with a large variety of input - also be careful with these and list them near the end if not last in your list.
+
+Whitespace between special characters and elements is inconsequential.
+
+## Options
+
+Options is an object. It is an optional parameter to the `parse` and `parsedTypeParse` functions.
+
+### Explicit
+
+A `Boolean`. By default it is `false`.
+
+__Example:__
+
+```js
+parse('RegExp', 're', {explicit: false}); // /re/
+parse('RegExp', 're', {explicit: true}); // Error: ... does not type check...
+parse('RegExp | String', 're', {explicit: true}); // 're'
+```
+
+`explicit` sets whether to be in explicit mode or not. Using `*` automatically activates explicit mode. For more information, read the [levn format](#levn-format) section.
+
+### customTypes
+
+An `Object`. Empty `{}` by default.
+
+__Example:__
+
+```js
+var options = {
+ customTypes: {
+ Even: {
+ typeOf: 'Number',
+ validate: function (x) {
+ return x % 2 === 0;
+ },
+ cast: function (x) {
+ return {type: 'Just', value: parseInt(x)};
+ }
+ }
+ }
+}
+parse('Even', '2', options); // 2
+parse('Even', '3', options); // Error: Value: "3" does not type check...
+```
+
+__Another Example:__
+```js
+function Person(name, age){
+ this.name = name;
+ this.age = age;
+}
+var options = {
+ customTypes: {
+ Person: {
+ typeOf: 'Object',
+ validate: function (x) {
+ x instanceof Person;
+ },
+ cast: function (value, options, typesCast) {
+ var name, age;
+ if ({}.toString.call(value).slice(8, -1) !== 'Object') {
+ return {type: 'Nothing'};
+ }
+ name = typesCast(value.name, [{type: 'String'}], options);
+ age = typesCast(value.age, [{type: 'Numger'}], options);
+ return {type: 'Just', value: new Person(name, age)};
+ }
+ }
+}
+parse('Person', '{name: Laura, age: 25}', options); // Person {name: 'Laura', age: 25}
+```
+
+`customTypes` is an object whose keys are the name of the types, and whose values are an object with three properties, `typeOf`, `validate`, and `cast`. For more information about `typeOf` and `validate`, please see the [custom types](https://github.com/gkz/type-check#custom-types) section of type-check.
+
+`cast` is a function which receives three arguments, the value under question, options, and the typesCast function. In `cast`, attempt to cast the value into the specified type. If you are successful, return an object in the format `{type: 'Just', value: CAST-VALUE}`, if you know it won't work, return `{type: 'Nothing'}`. You can use the `typesCast` function to cast any child values. Remember to pass `options` to it. In your function you can also check for `options.explicit` and act accordingly.
+
+## Technical About
+
+`levn` is written in [LiveScript](http://livescript.net/) - a language that compiles to JavaScript. It uses [type-check](https://github.com/gkz/type-check) to both parse types and validate values. It also uses the [prelude.ls](http://preludels.com/) library.
diff --git a/node_modules/levn/lib/cast.js b/node_modules/levn/lib/cast.js
new file mode 100644
index 00000000..411e29d4
--- /dev/null
+++ b/node_modules/levn/lib/cast.js
@@ -0,0 +1,298 @@
+// Generated by LiveScript 1.4.0
+(function(){
+ var parsedTypeCheck, types, toString$ = {}.toString;
+ parsedTypeCheck = require('type-check').parsedTypeCheck;
+ types = {
+ '*': function(value, options){
+ switch (toString$.call(value).slice(8, -1)) {
+ case 'Array':
+ return typeCast(value, {
+ type: 'Array'
+ }, options);
+ case 'Object':
+ return typeCast(value, {
+ type: 'Object'
+ }, options);
+ default:
+ return {
+ type: 'Just',
+ value: typesCast(value, [
+ {
+ type: 'Undefined'
+ }, {
+ type: 'Null'
+ }, {
+ type: 'NaN'
+ }, {
+ type: 'Boolean'
+ }, {
+ type: 'Number'
+ }, {
+ type: 'Date'
+ }, {
+ type: 'RegExp'
+ }, {
+ type: 'Array'
+ }, {
+ type: 'Object'
+ }, {
+ type: 'String'
+ }
+ ], (options.explicit = true, options))
+ };
+ }
+ },
+ Undefined: function(it){
+ if (it === 'undefined' || it === void 8) {
+ return {
+ type: 'Just',
+ value: void 8
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ Null: function(it){
+ if (it === 'null') {
+ return {
+ type: 'Just',
+ value: null
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ NaN: function(it){
+ if (it === 'NaN') {
+ return {
+ type: 'Just',
+ value: NaN
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ Boolean: function(it){
+ if (it === 'true') {
+ return {
+ type: 'Just',
+ value: true
+ };
+ } else if (it === 'false') {
+ return {
+ type: 'Just',
+ value: false
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ Number: function(it){
+ return {
+ type: 'Just',
+ value: +it
+ };
+ },
+ Int: function(it){
+ return {
+ type: 'Just',
+ value: +it
+ };
+ },
+ Float: function(it){
+ return {
+ type: 'Just',
+ value: +it
+ };
+ },
+ Date: function(value, options){
+ var that;
+ if (that = /^\#([\s\S]*)\#$/.exec(value)) {
+ return {
+ type: 'Just',
+ value: new Date(+that[1] || that[1])
+ };
+ } else if (options.explicit) {
+ return {
+ type: 'Nothing'
+ };
+ } else {
+ return {
+ type: 'Just',
+ value: new Date(+value || value)
+ };
+ }
+ },
+ RegExp: function(value, options){
+ var that;
+ if (that = /^\/([\s\S]*)\/([gimy]*)$/.exec(value)) {
+ return {
+ type: 'Just',
+ value: new RegExp(that[1], that[2])
+ };
+ } else if (options.explicit) {
+ return {
+ type: 'Nothing'
+ };
+ } else {
+ return {
+ type: 'Just',
+ value: new RegExp(value)
+ };
+ }
+ },
+ Array: function(value, options){
+ return castArray(value, {
+ of: [{
+ type: '*'
+ }]
+ }, options);
+ },
+ Object: function(value, options){
+ return castFields(value, {
+ of: {}
+ }, options);
+ },
+ String: function(it){
+ var that;
+ if (toString$.call(it).slice(8, -1) !== 'String') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ if (that = it.match(/^'([\s\S]*)'$/)) {
+ return {
+ type: 'Just',
+ value: that[1].replace(/\\'/g, "'")
+ };
+ } else if (that = it.match(/^"([\s\S]*)"$/)) {
+ return {
+ type: 'Just',
+ value: that[1].replace(/\\"/g, '"')
+ };
+ } else {
+ return {
+ type: 'Just',
+ value: it
+ };
+ }
+ }
+ };
+ function castArray(node, type, options){
+ var typeOf, element;
+ if (toString$.call(node).slice(8, -1) !== 'Array') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ typeOf = type.of;
+ return {
+ type: 'Just',
+ value: (function(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = node).length; i$ < len$; ++i$) {
+ element = ref$[i$];
+ results$.push(typesCast(element, typeOf, options));
+ }
+ return results$;
+ }())
+ };
+ }
+ function castTuple(node, type, options){
+ var result, i, i$, ref$, len$, types, cast;
+ if (toString$.call(node).slice(8, -1) !== 'Array') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ result = [];
+ i = 0;
+ for (i$ = 0, len$ = (ref$ = type.of).length; i$ < len$; ++i$) {
+ types = ref$[i$];
+ cast = typesCast(node[i], types, options);
+ if (toString$.call(cast).slice(8, -1) !== 'Undefined') {
+ result.push(cast);
+ }
+ i++;
+ }
+ if (node.length <= i) {
+ return {
+ type: 'Just',
+ value: result
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ }
+ function castFields(node, type, options){
+ var typeOf, key, value;
+ if (toString$.call(node).slice(8, -1) !== 'Object') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ typeOf = type.of;
+ return {
+ type: 'Just',
+ value: (function(){
+ var ref$, resultObj$ = {};
+ for (key in ref$ = node) {
+ value = ref$[key];
+ resultObj$[typesCast(key, [{
+ type: 'String'
+ }], options)] = typesCast(value, typeOf[key] || [{
+ type: '*'
+ }], options);
+ }
+ return resultObj$;
+ }())
+ };
+ }
+ function typeCast(node, typeObj, options){
+ var type, structure, castFunc, ref$;
+ type = typeObj.type, structure = typeObj.structure;
+ if (type) {
+ castFunc = ((ref$ = options.customTypes[type]) != null ? ref$.cast : void 8) || types[type];
+ if (!castFunc) {
+ throw new Error("Type not defined: " + type + ".");
+ }
+ return castFunc(node, options, typesCast);
+ } else {
+ switch (structure) {
+ case 'array':
+ return castArray(node, typeObj, options);
+ case 'tuple':
+ return castTuple(node, typeObj, options);
+ case 'fields':
+ return castFields(node, typeObj, options);
+ }
+ }
+ }
+ function typesCast(node, types, options){
+ var i$, len$, type, ref$, valueType, value;
+ for (i$ = 0, len$ = types.length; i$ < len$; ++i$) {
+ type = types[i$];
+ ref$ = typeCast(node, type, options), valueType = ref$.type, value = ref$.value;
+ if (valueType === 'Nothing') {
+ continue;
+ }
+ if (parsedTypeCheck([type], value, {
+ customTypes: options.customTypes
+ })) {
+ return value;
+ }
+ }
+ throw new Error("Value " + JSON.stringify(node) + " does not type check against " + JSON.stringify(types) + ".");
+ }
+ module.exports = typesCast;
+}).call(this);
diff --git a/node_modules/levn/lib/coerce.js b/node_modules/levn/lib/coerce.js
new file mode 100644
index 00000000..027b6da0
--- /dev/null
+++ b/node_modules/levn/lib/coerce.js
@@ -0,0 +1,285 @@
+// Generated by LiveScript 1.2.0
+(function(){
+ var parsedTypeCheck, types, toString$ = {}.toString;
+ parsedTypeCheck = require('type-check').parsedTypeCheck;
+ types = {
+ '*': function(it){
+ switch (toString$.call(it).slice(8, -1)) {
+ case 'Array':
+ return coerceType(it, {
+ type: 'Array'
+ });
+ case 'Object':
+ return coerceType(it, {
+ type: 'Object'
+ });
+ default:
+ return {
+ type: 'Just',
+ value: coerceTypes(it, [
+ {
+ type: 'Undefined'
+ }, {
+ type: 'Null'
+ }, {
+ type: 'NaN'
+ }, {
+ type: 'Boolean'
+ }, {
+ type: 'Number'
+ }, {
+ type: 'Date'
+ }, {
+ type: 'RegExp'
+ }, {
+ type: 'Array'
+ }, {
+ type: 'Object'
+ }, {
+ type: 'String'
+ }
+ ], {
+ explicit: true
+ })
+ };
+ }
+ },
+ Undefined: function(it){
+ if (it === 'undefined' || it === void 8) {
+ return {
+ type: 'Just',
+ value: void 8
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ Null: function(it){
+ if (it === 'null') {
+ return {
+ type: 'Just',
+ value: null
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ NaN: function(it){
+ if (it === 'NaN') {
+ return {
+ type: 'Just',
+ value: NaN
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ Boolean: function(it){
+ if (it === 'true') {
+ return {
+ type: 'Just',
+ value: true
+ };
+ } else if (it === 'false') {
+ return {
+ type: 'Just',
+ value: false
+ };
+ } else {
+ return {
+ type: 'Nothing'
+ };
+ }
+ },
+ Number: function(it){
+ return {
+ type: 'Just',
+ value: +it
+ };
+ },
+ Int: function(it){
+ return {
+ type: 'Just',
+ value: parseInt(it)
+ };
+ },
+ Float: function(it){
+ return {
+ type: 'Just',
+ value: parseFloat(it)
+ };
+ },
+ Date: function(value, options){
+ var that;
+ if (that = /^\#(.*)\#$/.exec(value)) {
+ return {
+ type: 'Just',
+ value: new Date(+that[1] || that[1])
+ };
+ } else if (options.explicit) {
+ return {
+ type: 'Nothing'
+ };
+ } else {
+ return {
+ type: 'Just',
+ value: new Date(+value || value)
+ };
+ }
+ },
+ RegExp: function(value, options){
+ var that;
+ if (that = /^\/(.*)\/([gimy]*)$/.exec(value)) {
+ return {
+ type: 'Just',
+ value: new RegExp(that[1], that[2])
+ };
+ } else if (options.explicit) {
+ return {
+ type: 'Nothing'
+ };
+ } else {
+ return {
+ type: 'Just',
+ value: new RegExp(value)
+ };
+ }
+ },
+ Array: function(it){
+ return coerceArray(it, {
+ of: [{
+ type: '*'
+ }]
+ });
+ },
+ Object: function(it){
+ return coerceFields(it, {
+ of: {}
+ });
+ },
+ String: function(it){
+ var that;
+ if (toString$.call(it).slice(8, -1) !== 'String') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ if (that = it.match(/^'(.*)'$/)) {
+ return {
+ type: 'Just',
+ value: that[1]
+ };
+ } else if (that = it.match(/^"(.*)"$/)) {
+ return {
+ type: 'Just',
+ value: that[1]
+ };
+ } else {
+ return {
+ type: 'Just',
+ value: it
+ };
+ }
+ }
+ };
+ function coerceArray(node, type){
+ var typeOf, element;
+ if (toString$.call(node).slice(8, -1) !== 'Array') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ typeOf = type.of;
+ return {
+ type: 'Just',
+ value: (function(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = node).length; i$ < len$; ++i$) {
+ element = ref$[i$];
+ results$.push(coerceTypes(element, typeOf));
+ }
+ return results$;
+ }())
+ };
+ }
+ function coerceTuple(node, type){
+ var result, i$, ref$, len$, i, types, that;
+ if (toString$.call(node).slice(8, -1) !== 'Array') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ result = [];
+ for (i$ = 0, len$ = (ref$ = type.of).length; i$ < len$; ++i$) {
+ i = i$;
+ types = ref$[i$];
+ if (that = coerceTypes(node[i], types)) {
+ result.push(that);
+ }
+ }
+ return {
+ type: 'Just',
+ value: result
+ };
+ }
+ function coerceFields(node, type){
+ var typeOf, key, value;
+ if (toString$.call(node).slice(8, -1) !== 'Object') {
+ return {
+ type: 'Nothing'
+ };
+ }
+ typeOf = type.of;
+ return {
+ type: 'Just',
+ value: (function(){
+ var ref$, results$ = {};
+ for (key in ref$ = node) {
+ value = ref$[key];
+ results$[key] = coerceTypes(value, typeOf[key] || [{
+ type: '*'
+ }]);
+ }
+ return results$;
+ }())
+ };
+ }
+ function coerceType(node, typeObj, options){
+ var type, structure, coerceFunc;
+ type = typeObj.type, structure = typeObj.structure;
+ if (type) {
+ coerceFunc = types[type];
+ return coerceFunc(node, options);
+ } else {
+ switch (structure) {
+ case 'array':
+ return coerceArray(node, typeObj);
+ case 'tuple':
+ return coerceTuple(node, typeObj);
+ case 'fields':
+ return coerceFields(node, typeObj);
+ }
+ }
+ }
+ function coerceTypes(node, types, options){
+ var i$, len$, type, ref$, valueType, value;
+ for (i$ = 0, len$ = types.length; i$ < len$; ++i$) {
+ type = types[i$];
+ ref$ = coerceType(node, type, options), valueType = ref$.type, value = ref$.value;
+ if (valueType === 'Nothing') {
+ continue;
+ }
+ if (parsedTypeCheck([type], value)) {
+ return value;
+ }
+ }
+ throw new Error("Value " + JSON.stringify(node) + " does not type check against " + JSON.stringify(types) + ".");
+ }
+ module.exports = coerceTypes;
+}).call(this);
diff --git a/node_modules/levn/lib/index.js b/node_modules/levn/lib/index.js
new file mode 100644
index 00000000..4adae30c
--- /dev/null
+++ b/node_modules/levn/lib/index.js
@@ -0,0 +1,22 @@
+// Generated by LiveScript 1.4.0
+(function(){
+ var parseString, cast, parseType, VERSION, parsedTypeParse, parse;
+ parseString = require('./parse-string');
+ cast = require('./cast');
+ parseType = require('type-check').parseType;
+ VERSION = '0.3.0';
+ parsedTypeParse = function(parsedType, string, options){
+ options == null && (options = {});
+ options.explicit == null && (options.explicit = false);
+ options.customTypes == null && (options.customTypes = {});
+ return cast(parseString(parsedType, string, options), parsedType, options);
+ };
+ parse = function(type, string, options){
+ return parsedTypeParse(parseType(type), string, options);
+ };
+ module.exports = {
+ VERSION: VERSION,
+ parse: parse,
+ parsedTypeParse: parsedTypeParse
+ };
+}).call(this);
diff --git a/node_modules/levn/lib/parse-string.js b/node_modules/levn/lib/parse-string.js
new file mode 100644
index 00000000..d573975f
--- /dev/null
+++ b/node_modules/levn/lib/parse-string.js
@@ -0,0 +1,113 @@
+// Generated by LiveScript 1.4.0
+(function(){
+ var reject, special, tokenRegex;
+ reject = require('prelude-ls').reject;
+ function consumeOp(tokens, op){
+ if (tokens[0] === op) {
+ return tokens.shift();
+ } else {
+ throw new Error("Expected '" + op + "', but got '" + tokens[0] + "' instead in " + JSON.stringify(tokens) + ".");
+ }
+ }
+ function maybeConsumeOp(tokens, op){
+ if (tokens[0] === op) {
+ return tokens.shift();
+ }
+ }
+ function consumeList(tokens, arg$, hasDelimiters){
+ var open, close, result, untilTest;
+ open = arg$[0], close = arg$[1];
+ if (hasDelimiters) {
+ consumeOp(tokens, open);
+ }
+ result = [];
+ untilTest = "," + (hasDelimiters ? close : '');
+ while (tokens.length && (hasDelimiters && tokens[0] !== close)) {
+ result.push(consumeElement(tokens, untilTest));
+ maybeConsumeOp(tokens, ',');
+ }
+ if (hasDelimiters) {
+ consumeOp(tokens, close);
+ }
+ return result;
+ }
+ function consumeArray(tokens, hasDelimiters){
+ return consumeList(tokens, ['[', ']'], hasDelimiters);
+ }
+ function consumeTuple(tokens, hasDelimiters){
+ return consumeList(tokens, ['(', ')'], hasDelimiters);
+ }
+ function consumeFields(tokens, hasDelimiters){
+ var result, untilTest, key;
+ if (hasDelimiters) {
+ consumeOp(tokens, '{');
+ }
+ result = {};
+ untilTest = "," + (hasDelimiters ? '}' : '');
+ while (tokens.length && (!hasDelimiters || tokens[0] !== '}')) {
+ key = consumeValue(tokens, ':');
+ consumeOp(tokens, ':');
+ result[key] = consumeElement(tokens, untilTest);
+ maybeConsumeOp(tokens, ',');
+ }
+ if (hasDelimiters) {
+ consumeOp(tokens, '}');
+ }
+ return result;
+ }
+ function consumeValue(tokens, untilTest){
+ var out;
+ untilTest == null && (untilTest = '');
+ out = '';
+ while (tokens.length && -1 === untilTest.indexOf(tokens[0])) {
+ out += tokens.shift();
+ }
+ return out;
+ }
+ function consumeElement(tokens, untilTest){
+ switch (tokens[0]) {
+ case '[':
+ return consumeArray(tokens, true);
+ case '(':
+ return consumeTuple(tokens, true);
+ case '{':
+ return consumeFields(tokens, true);
+ default:
+ return consumeValue(tokens, untilTest);
+ }
+ }
+ function consumeTopLevel(tokens, types, options){
+ var ref$, type, structure, origTokens, result, finalResult, x$, y$;
+ ref$ = types[0], type = ref$.type, structure = ref$.structure;
+ origTokens = tokens.concat();
+ if (!options.explicit && types.length === 1 && ((!type && structure) || (type === 'Array' || type === 'Object'))) {
+ result = structure === 'array' || type === 'Array'
+ ? consumeArray(tokens, tokens[0] === '[')
+ : structure === 'tuple'
+ ? consumeTuple(tokens, tokens[0] === '(')
+ : consumeFields(tokens, tokens[0] === '{');
+ finalResult = tokens.length ? consumeElement(structure === 'array' || type === 'Array'
+ ? (x$ = origTokens, x$.unshift('['), x$.push(']'), x$)
+ : (y$ = origTokens, y$.unshift('('), y$.push(')'), y$)) : result;
+ } else {
+ finalResult = consumeElement(tokens);
+ }
+ return finalResult;
+ }
+ special = /\[\]\(\)}{:,/.source;
+ tokenRegex = RegExp('("(?:\\\\"|[^"])*")|(\'(?:\\\\\'|[^\'])*\')|(/(?:\\\\/|[^/])*/[a-zA-Z]*)|(#.*#)|([' + special + '])|([^\\s' + special + '](?:\\s*[^\\s' + special + ']+)*)|\\s*');
+ module.exports = function(types, string, options){
+ var tokens, node;
+ options == null && (options = {});
+ if (!options.explicit && types.length === 1 && types[0].type === 'String') {
+ return "'" + string.replace(/\\'/g, "\\\\'") + "'";
+ }
+ tokens = reject(not$, string.split(tokenRegex));
+ node = consumeTopLevel(tokens, types, options);
+ if (!node) {
+ throw new Error("Error parsing '" + string + "'.");
+ }
+ return node;
+ };
+ function not$(x){ return !x; }
+}).call(this);
diff --git a/node_modules/levn/lib/parse.js b/node_modules/levn/lib/parse.js
new file mode 100644
index 00000000..2beff0f4
--- /dev/null
+++ b/node_modules/levn/lib/parse.js
@@ -0,0 +1,102 @@
+// Generated by LiveScript 1.2.0
+(function(){
+ var reject, special, tokenRegex;
+ reject = require('prelude-ls').reject;
+ function consumeOp(tokens, op){
+ if (tokens[0] === op) {
+ return tokens.shift();
+ } else {
+ throw new Error("Expected '" + op + "', but got '" + tokens[0] + "' instead in " + JSON.stringify(tokens) + ".");
+ }
+ }
+ function maybeConsumeOp(tokens, op){
+ if (tokens[0] === op) {
+ return tokens.shift();
+ }
+ }
+ function consumeList(tokens, delimiters, hasDelimiters){
+ var result;
+ if (hasDelimiters) {
+ consumeOp(tokens, delimiters[0]);
+ }
+ result = [];
+ while (tokens.length && tokens[0] !== delimiters[1]) {
+ result.push(consumeElement(tokens));
+ maybeConsumeOp(tokens, ',');
+ }
+ if (hasDelimiters) {
+ consumeOp(tokens, delimiters[1]);
+ }
+ return result;
+ }
+ function consumeArray(tokens, hasDelimiters){
+ return consumeList(tokens, ['[', ']'], hasDelimiters);
+ }
+ function consumeTuple(tokens, hasDelimiters){
+ return consumeList(tokens, ['(', ')'], hasDelimiters);
+ }
+ function consumeFields(tokens, hasDelimiters){
+ var result, key;
+ if (hasDelimiters) {
+ consumeOp(tokens, '{');
+ }
+ result = {};
+ while (tokens.length && (!hasDelimiters || tokens[0] !== '}')) {
+ key = tokens.shift();
+ consumeOp(tokens, ':');
+ result[key] = consumeElement(tokens);
+ maybeConsumeOp(tokens, ',');
+ }
+ if (hasDelimiters) {
+ consumeOp(tokens, '}');
+ }
+ return result;
+ }
+ function consumeElement(tokens){
+ switch (tokens[0]) {
+ case '[':
+ return consumeArray(tokens, true);
+ case '(':
+ return consumeTuple(tokens, true);
+ case '{':
+ return consumeFields(tokens, true);
+ default:
+ return tokens.shift();
+ }
+ }
+ function consumeTopLevel(tokens, types){
+ var ref$, type, structure, origTokens, result, finalResult, x$, y$;
+ ref$ = types[0], type = ref$.type, structure = ref$.structure;
+ origTokens = tokens.concat();
+ if (types.length === 1 && (structure || (type === 'Array' || type === 'Object'))) {
+ result = structure === 'array' || type === 'Array'
+ ? consumeArray(tokens, tokens[0] === '[')
+ : structure === 'tuple'
+ ? consumeTuple(tokens, tokens[0] === '(')
+ : consumeFields(tokens, tokens[0] === '{');
+ finalResult = tokens.length ? consumeElement(structure === 'array' || type === 'Array'
+ ? (x$ = origTokens, x$.unshift('['), x$.push(']'), x$)
+ : (y$ = origTokens, y$.unshift('('), y$.push(')'), y$)) : result;
+ } else {
+ finalResult = consumeElement(tokens);
+ }
+ if (tokens.length && origTokens.length) {
+ throw new Error("Unable to parse " + JSON.stringify(origTokens) + " of type " + JSON.stringify(types) + ".");
+ } else {
+ return finalResult;
+ }
+ }
+ special = /\[\]\(\)}{:,/.source;
+ tokenRegex = RegExp('("(?:[^"]|\\\\")*")|(\'(?:[^\']|\\\\\')*\')|(#.*#)|(/(?:\\\\/|[^/])*/[gimy]*)|([' + special + '])|([^\\s' + special + ']+)|\\s*');
+ module.exports = function(string, types){
+ var tokens, node;
+ tokens = reject(function(it){
+ return !it || /^\s+$/.test(it);
+ }, string.split(tokenRegex));
+ node = consumeTopLevel(tokens, types);
+ if (!node) {
+ throw new Error("Error parsing '" + string + "'.");
+ }
+ return node;
+ };
+}).call(this);
diff --git a/node_modules/levn/package.json b/node_modules/levn/package.json
new file mode 100644
index 00000000..95f699ac
--- /dev/null
+++ b/node_modules/levn/package.json
@@ -0,0 +1,77 @@
+{
+ "_from": "levn@~0.3.0",
+ "_id": "levn@0.3.0",
+ "_inBundle": false,
+ "_integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "_location": "/levn",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "levn@~0.3.0",
+ "name": "levn",
+ "escapedName": "levn",
+ "rawSpec": "~0.3.0",
+ "saveSpec": null,
+ "fetchSpec": "~0.3.0"
+ },
+ "_requiredBy": [
+ "/optionator"
+ ],
+ "_resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "_shasum": "3b09924edf9f083c0490fdd4c0bc4421e04764ee",
+ "_spec": "levn@~0.3.0",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\optionator",
+ "author": {
+ "name": "George Zahariev",
+ "email": "z@georgezahariev.com"
+ },
+ "bugs": {
+ "url": "https://github.com/gkz/levn/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "deprecated": false,
+ "description": "Light ECMAScript (JavaScript) Value Notation - human written, concise, typed, flexible",
+ "devDependencies": {
+ "istanbul": "~0.4.1",
+ "livescript": "~1.4.0",
+ "mocha": "~2.3.4"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "files": [
+ "lib",
+ "README.md",
+ "LICENSE"
+ ],
+ "homepage": "https://github.com/gkz/levn",
+ "keywords": [
+ "levn",
+ "light",
+ "ecmascript",
+ "value",
+ "notation",
+ "json",
+ "typed",
+ "human",
+ "concise",
+ "typed",
+ "flexible"
+ ],
+ "license": "MIT",
+ "main": "./lib/",
+ "name": "levn",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/gkz/levn.git"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "version": "0.3.0"
+}
diff --git a/node_modules/optionator/CHANGELOG.md b/node_modules/optionator/CHANGELOG.md
new file mode 100644
index 00000000..ddaf0b5b
--- /dev/null
+++ b/node_modules/optionator/CHANGELOG.md
@@ -0,0 +1,56 @@
+# 0.8.3
+- changes dependency from `wordwrap` to `word-wrap` due to license issue
+- update dependencies
+
+# 0.8.2
+- fix bug #18 - detect missing value when flag is last item
+- update dependencies
+
+# 0.8.1
+- update `fast-levenshtein` dependency
+
+# 0.8.0
+- update `levn` dependency - supplying a float value to an option with type `Int` now throws an error, instead of silently converting to an `Int`
+
+# 0.7.1
+- fix bug with use of `defaults` and `concatRepeatedArrays` or `mergeRepeatedObjects`
+
+# 0.7.0
+- added `concatrepeatedarrays` option: `oneValuePerFlag`, only allows one array value per flag
+- added `typeAliases` option
+- added `parseArgv` which takes an array and parses with the first two items sliced off
+- changed enum help style
+- bug fixes (#12)
+- use of `concatRepeatedArrays` and `mergeRepeatedObjects` at the top level is deprecated, use it as either a per-option option, or set them in the `defaults` object to set them for all objects
+
+# 0.6.0
+- added `defaults` lib-option flag, allowing one to set default properties for all options
+- added `concatRepeatedArrays` and `mergeRepeatedObjects` as option level properties, allowing you to turn this feature on for specific options only
+
+# 0.5.0
+- `Boolean` flags with `default: 'true'`, and no short aliases, will by default show the `--no` version in help
+
+# 0.4.0
+- add `mergeRepeatedObjects` setting
+
+# 0.3.0
+- add `concatRepeatedArrays` setting
+- add `overrideRequired` option setting
+- use just Levenshtein string compare algo rather than Levenshtein Damerau to due dependency license issue
+
+# 0.2.2
+- bug fixes
+
+# 0.2.1
+- improved interpolation
+- added changelog
+
+# 0.2.0
+- add dependency checks to options - added `dependsOn` as an option property
+- add interpolation for `prepend` and `append` text with new `generateHelp` option, `interpolate`
+
+# 0.1.1
+- update dependencies
+
+# 0.1.0
+- initial release
diff --git a/node_modules/optionator/LICENSE b/node_modules/optionator/LICENSE
new file mode 100644
index 00000000..525b1185
--- /dev/null
+++ b/node_modules/optionator/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) George Zahariev
+
+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/optionator/README.md b/node_modules/optionator/README.md
new file mode 100644
index 00000000..8e4ba424
--- /dev/null
+++ b/node_modules/optionator/README.md
@@ -0,0 +1,238 @@
+# Optionator
+
+
+Optionator is a JavaScript/Node.js option parsing and help generation library used by [eslint](http://eslint.org), [Grasp](http://graspjs.com), [LiveScript](http://livescript.net), [esmangle](https://github.com/estools/esmangle), [escodegen](https://github.com/estools/escodegen), and [many more](https://www.npmjs.com/browse/depended/optionator).
+
+For an online demo, check out the [Grasp online demo](http://www.graspjs.com/#demo).
+
+[About](#about) · [Usage](#usage) · [Settings Format](#settings-format) · [Argument Format](#argument-format)
+
+## Why?
+The problem with other option parsers, such as `yargs` or `minimist`, is they just accept all input, valid or not.
+With Optionator, if you mistype an option, it will give you an error (with a suggestion for what you meant).
+If you give the wrong type of argument for an option, it will give you an error rather than supplying the wrong input to your application.
+
+ $ cmd --halp
+ Invalid option '--halp' - perhaps you meant '--help'?
+
+ $ cmd --count str
+ Invalid value for option 'count' - expected type Int, received value: str.
+
+Other helpful features include reformatting the help text based on the size of the console, so that it fits even if the console is narrow, and accepting not just an array (eg. process.argv), but a string or object as well, making things like testing much easier.
+
+## About
+Optionator uses [type-check](https://github.com/gkz/type-check) and [levn](https://github.com/gkz/levn) behind the scenes to cast and verify input according the specified types.
+
+MIT license. Version 0.8.3
+
+ npm install optionator
+
+For updates on Optionator, [follow me on twitter](https://twitter.com/gkzahariev).
+
+Optionator is a Node.js module, but can be used in the browser as well if packed with webpack/browserify.
+
+## Usage
+`require('optionator');` returns a function. It has one property, `VERSION`, the current version of the library as a string. This function is called with an object specifying your options and other information, see the [settings format section](#settings-format). This in turn returns an object with three properties, `parse`, `parseArgv`, `generateHelp`, and `generateHelpForOption`, which are all functions.
+
+```js
+var optionator = require('optionator')({
+ prepend: 'Usage: cmd [options]',
+ append: 'Version 1.0.0',
+ options: [{
+ option: 'help',
+ alias: 'h',
+ type: 'Boolean',
+ description: 'displays help'
+ }, {
+ option: 'count',
+ alias: 'c',
+ type: 'Int',
+ description: 'number of things',
+ example: 'cmd --count 2'
+ }]
+});
+
+var options = optionator.parseArgv(process.argv);
+if (options.help) {
+ console.log(optionator.generateHelp());
+}
+...
+```
+
+### parse(input, parseOptions)
+`parse` processes the `input` according to your settings, and returns an object with the results.
+
+##### arguments
+* input - `[String] | Object | String` - the input you wish to parse
+* parseOptions - `{slice: Int}` - all options optional
+ - `slice` specifies how much to slice away from the beginning if the input is an array or string - by default `0` for string, `2` for array (works with `process.argv`)
+
+##### returns
+`Object` - the parsed options, each key is a camelCase version of the option name (specified in dash-case), and each value is the processed value for that option. Positional values are in an array under the `_` key.
+
+##### example
+```js
+parse(['node', 't.js', '--count', '2', 'positional']); // {count: 2, _: ['positional']}
+parse('--count 2 positional'); // {count: 2, _: ['positional']}
+parse({count: 2, _:['positional']}); // {count: 2, _: ['positional']}
+```
+
+### parseArgv(input)
+`parseArgv` works exactly like `parse`, but only for array input and it slices off the first two elements.
+
+##### arguments
+* input - `[String]` - the input you wish to parse
+
+##### returns
+See "returns" section in "parse"
+
+##### example
+```js
+parseArgv(process.argv);
+```
+
+### generateHelp(helpOptions)
+`generateHelp` produces help text based on your settings.
+
+##### arguments
+* helpOptions - `{showHidden: Boolean, interpolate: Object}` - all options optional
+ - `showHidden` specifies whether to show options with `hidden: true` specified, by default it is `false`
+ - `interpolate` specify data to be interpolated in `prepend` and `append` text, `{{key}}` is the format - eg. `generateHelp({interpolate:{version: '0.4.2'}})`, will change this `append` text: `Version {{version}}` to `Version 0.4.2`
+
+##### returns
+`String` - the generated help text
+
+##### example
+```js
+generateHelp(); /*
+"Usage: cmd [options] positional
+
+ -h, --help displays help
+ -c, --count Int number of things
+
+Version 1.0.0
+"*/
+```
+
+### generateHelpForOption(optionName)
+`generateHelpForOption` produces expanded help text for the specified with `optionName` option. If an `example` was specified for the option, it will be displayed, and if a `longDescription` was specified, it will display that instead of the `description`.
+
+##### arguments
+* optionName - `String` - the name of the option to display
+
+##### returns
+`String` - the generated help text for the option
+
+##### example
+```js
+generateHelpForOption('count'); /*
+"-c, --count Int
+description: number of things
+example: cmd --count 2
+"*/
+```
+
+## Settings Format
+When your `require('optionator')`, you get a function that takes in a settings object. This object has the type:
+
+ {
+ prepend: String,
+ append: String,
+ options: [{heading: String} | {
+ option: String,
+ alias: [String] | String,
+ type: String,
+ enum: [String],
+ default: String,
+ restPositional: Boolean,
+ required: Boolean,
+ overrideRequired: Boolean,
+ dependsOn: [String] | String,
+ concatRepeatedArrays: Boolean | (Boolean, Object),
+ mergeRepeatedObjects: Boolean,
+ description: String,
+ longDescription: String,
+ example: [String] | String
+ }],
+ helpStyle: {
+ aliasSeparator: String,
+ typeSeparator: String,
+ descriptionSeparator: String,
+ initialIndent: Int,
+ secondaryIndent: Int,
+ maxPadFactor: Number
+ },
+ mutuallyExclusive: [[String | [String]]],
+ concatRepeatedArrays: Boolean | (Boolean, Object), // deprecated, set in defaults object
+ mergeRepeatedObjects: Boolean, // deprecated, set in defaults object
+ positionalAnywhere: Boolean,
+ typeAliases: Object,
+ defaults: Object
+ }
+
+All of the properties are optional (the `Maybe` has been excluded for brevities sake), except for having either `heading: String` or `option: String` in each object in the `options` array.
+
+### Top Level Properties
+* `prepend` is an optional string to be placed before the options in the help text
+* `append` is an optional string to be placed after the options in the help text
+* `options` is a required array specifying your options and headings, the options and headings will be displayed in the order specified
+* `helpStyle` is an optional object which enables you to change the default appearance of some aspects of the help text
+* `mutuallyExclusive` is an optional array of arrays of either strings or arrays of strings. The top level array is a list of rules, each rule is a list of elements - each element can be either a string (the name of an option), or a list of strings (a group of option names) - there will be an error if more than one element is present
+* `concatRepeatedArrays` see description under the "Option Properties" heading - use at the top level is deprecated, if you want to set this for all options, use the `defaults` property
+* `mergeRepeatedObjects` see description under the "Option Properties" heading - use at the top level is deprecated, if you want to set this for all options, use the `defaults` property
+* `positionalAnywhere` is an optional boolean (defaults to `true`) - when `true` it allows positional arguments anywhere, when `false`, all arguments after the first positional one are taken to be positional as well, even if they look like a flag. For example, with `positionalAnywhere: false`, the arguments `--flag --boom 12 --crack` would have two positional arguments: `12` and `--crack`
+* `typeAliases` is an optional object, it allows you to set aliases for types, eg. `{Path: 'String'}` would allow you to use the type `Path` as an alias for the type `String`
+* `defaults` is an optional object following the option properties format, which specifies default values for all options. A default will be overridden if manually set. For example, you can do `default: { type: "String" }` to set the default type of all options to `String`, and then override that default in an individual option by setting the `type` property
+
+#### Heading Properties
+* `heading` a required string, the name of the heading
+
+#### Option Properties
+* `option` the required name of the option - use dash-case, without the leading dashes
+* `alias` is an optional string or array of strings which specify any aliases for the option
+* `type` is a required string in the [type check](https://github.com/gkz/type-check) [format](https://github.com/gkz/type-check#type-format), this will be used to cast the inputted value and validate it
+* `enum` is an optional array of strings, each string will be parsed by [levn](https://github.com/gkz/levn) - the argument value must be one of the resulting values - each potential value must validate against the specified `type`
+* `default` is a optional string, which will be parsed by [levn](https://github.com/gkz/levn) and used as the default value if none is set - the value must validate against the specified `type`
+* `restPositional` is an optional boolean - if set to `true`, everything after the option will be taken to be a positional argument, even if it looks like a named argument
+* `required` is an optional boolean - if set to `true`, the option parsing will fail if the option is not defined
+* `overrideRequired` is a optional boolean - if set to `true` and the option is used, and there is another option which is required but not set, it will override the need for the required option and there will be no error - this is useful if you have required options and want to use `--help` or `--version` flags
+* `concatRepeatedArrays` is an optional boolean or tuple with boolean and options object (defaults to `false`) - when set to `true` and an option contains an array value and is repeated, the subsequent values for the flag will be appended rather than overwriting the original value - eg. option `g` of type `[String]`: `-g a -g b -g c,d` will result in `['a','b','c','d']`
+
+ You can supply an options object by giving the following value: `[true, options]`. The one currently supported option is `oneValuePerFlag`, this only allows one array value per flag. This is useful if your potential values contain a comma.
+* `mergeRepeatedObjects` is an optional boolean (defaults to `false`) - when set to `true` and an option contains an object value and is repeated, the subsequent values for the flag will be merged rather than overwriting the original value - eg. option `g` of type `Object`: `-g a:1 -g b:2 -g c:3,d:4` will result in `{a: 1, b: 2, c: 3, d: 4}`
+* `dependsOn` is an optional string or array of strings - if simply a string (the name of another option), it will make sure that that other option is set, if an array of strings, depending on whether `'and'` or `'or'` is first, it will either check whether all (`['and', 'option-a', 'option-b']`), or at least one (`['or', 'option-a', 'option-b']`) other options are set
+* `description` is an optional string, which will be displayed next to the option in the help text
+* `longDescription` is an optional string, it will be displayed instead of the `description` when `generateHelpForOption` is used
+* `example` is an optional string or array of strings with example(s) for the option - these will be displayed when `generateHelpForOption` is used
+
+#### Help Style Properties
+* `aliasSeparator` is an optional string, separates multiple names from each other - default: ' ,'
+* `typeSeparator` is an optional string, separates the type from the names - default: ' '
+* `descriptionSeparator` is an optional string , separates the description from the padded name and type - default: ' '
+* `initialIndent` is an optional int - the amount of indent for options - default: 2
+* `secondaryIndent` is an optional int - the amount of indent if wrapped fully (in addition to the initial indent) - default: 4
+* `maxPadFactor` is an optional number - affects the default level of padding for the names/type, it is multiplied by the average of the length of the names/type - default: 1.5
+
+## Argument Format
+At the highest level there are two types of arguments: named, and positional.
+
+Name arguments of any length are prefixed with `--` (eg. `--go`), and those of one character may be prefixed with either `--` or `-` (eg. `-g`).
+
+There are two types of named arguments: boolean flags (eg. `--problemo`, `-p`) which take no value and result in a `true` if they are present, the falsey `undefined` if they are not present, or `false` if present and explicitly prefixed with `no` (eg. `--no-problemo`). Named arguments with values (eg. `--tseries 800`, `-t 800`) are the other type. If the option has a type `Boolean` it will automatically be made into a boolean flag. Any other type results in a named argument that takes a value.
+
+For more information about how to properly set types to get the value you want, take a look at the [type check](https://github.com/gkz/type-check) and [levn](https://github.com/gkz/levn) pages.
+
+You can group single character arguments that use a single `-`, however all except the last must be boolean flags (which take no value). The last may be a boolean flag, or an argument which takes a value - eg. `-ba 2` is equivalent to `-b -a 2`.
+
+Positional arguments are all those values which do not fall under the above - they can be anywhere, not just at the end. For example, in `cmd -b one -a 2 two` where `b` is a boolean flag, and `a` has the type `Number`, there are two positional arguments, `one` and `two`.
+
+Everything after an `--` is positional, even if it looks like a named argument.
+
+You may optionally use `=` to separate option names from values, for example: `--count=2`.
+
+If you specify the option `NUM`, then any argument using a single `-` followed by a number will be valid and will set the value of `NUM`. Eg. `-2` will be parsed into `NUM: 2`.
+
+If duplicate named arguments are present, the last one will be taken.
+
+## Technical About
+`optionator` is written in [LiveScript](http://livescript.net/) - a language that compiles to JavaScript. It uses [levn](https://github.com/gkz/levn) to cast arguments to their specified type, and uses [type-check](https://github.com/gkz/type-check) to validate values. It also uses the [prelude.ls](http://preludels.com/) library.
diff --git a/node_modules/optionator/lib/help.js b/node_modules/optionator/lib/help.js
new file mode 100644
index 00000000..59e6f969
--- /dev/null
+++ b/node_modules/optionator/lib/help.js
@@ -0,0 +1,260 @@
+// Generated by LiveScript 1.6.0
+(function(){
+ var ref$, id, find, sort, min, max, map, unlines, nameToRaw, dasherize, naturalJoin, wordWrap, wordwrap, getPreText, setHelpStyleDefaults, generateHelpForOption, generateHelp;
+ ref$ = require('prelude-ls'), id = ref$.id, find = ref$.find, sort = ref$.sort, min = ref$.min, max = ref$.max, map = ref$.map, unlines = ref$.unlines;
+ ref$ = require('./util'), nameToRaw = ref$.nameToRaw, dasherize = ref$.dasherize, naturalJoin = ref$.naturalJoin;
+ wordWrap = require('word-wrap');
+ wordwrap = function(a, b){
+ var ref$, indent, width;
+ ref$ = b === undefined
+ ? ['', a - 1]
+ : [repeatString$(' ', a), b - a - 1], indent = ref$[0], width = ref$[1];
+ return function(text){
+ return wordWrap(text, {
+ indent: indent,
+ width: width,
+ trim: true
+ });
+ };
+ };
+ getPreText = function(option, arg$, maxWidth){
+ var mainName, shortNames, ref$, longNames, type, description, aliasSeparator, typeSeparator, initialIndent, names, namesString, namesStringLen, typeSeparatorString, typeSeparatorStringLen, wrap;
+ mainName = option.option, shortNames = (ref$ = option.shortNames) != null
+ ? ref$
+ : [], longNames = (ref$ = option.longNames) != null
+ ? ref$
+ : [], type = option.type, description = option.description;
+ aliasSeparator = arg$.aliasSeparator, typeSeparator = arg$.typeSeparator, initialIndent = arg$.initialIndent;
+ if (option.negateName) {
+ mainName = "no-" + mainName;
+ if (longNames) {
+ longNames = map(function(it){
+ return "no-" + it;
+ }, longNames);
+ }
+ }
+ names = mainName.length === 1
+ ? [mainName].concat(shortNames, longNames)
+ : shortNames.concat([mainName], longNames);
+ namesString = map(nameToRaw, names).join(aliasSeparator);
+ namesStringLen = namesString.length;
+ typeSeparatorString = mainName === 'NUM' ? '::' : typeSeparator;
+ typeSeparatorStringLen = typeSeparatorString.length;
+ if (maxWidth != null && !option.boolean && initialIndent + namesStringLen + typeSeparatorStringLen + type.length > maxWidth) {
+ wrap = wordwrap(initialIndent + namesStringLen + typeSeparatorStringLen, maxWidth);
+ return namesString + "" + typeSeparatorString + wrap(type).replace(/^\s+/, '');
+ } else {
+ return namesString + "" + (option.boolean
+ ? ''
+ : typeSeparatorString + "" + type);
+ }
+ };
+ setHelpStyleDefaults = function(helpStyle){
+ helpStyle.aliasSeparator == null && (helpStyle.aliasSeparator = ', ');
+ helpStyle.typeSeparator == null && (helpStyle.typeSeparator = ' ');
+ helpStyle.descriptionSeparator == null && (helpStyle.descriptionSeparator = ' ');
+ helpStyle.initialIndent == null && (helpStyle.initialIndent = 2);
+ helpStyle.secondaryIndent == null && (helpStyle.secondaryIndent = 4);
+ helpStyle.maxPadFactor == null && (helpStyle.maxPadFactor = 1.5);
+ };
+ generateHelpForOption = function(getOption, arg$){
+ var stdout, helpStyle, ref$;
+ stdout = arg$.stdout, helpStyle = (ref$ = arg$.helpStyle) != null
+ ? ref$
+ : {};
+ setHelpStyleDefaults(helpStyle);
+ return function(optionName){
+ var maxWidth, wrap, option, e, pre, defaultString, restPositionalString, description, fullDescription, that, preDescription, descriptionString, exampleString, examples, seperator;
+ maxWidth = stdout != null && stdout.isTTY ? stdout.columns - 1 : null;
+ wrap = maxWidth ? wordwrap(maxWidth) : id;
+ try {
+ option = getOption(dasherize(optionName));
+ } catch (e$) {
+ e = e$;
+ return e.message;
+ }
+ pre = getPreText(option, helpStyle);
+ defaultString = option['default'] && !option.negateName ? "\ndefault: " + option['default'] : '';
+ restPositionalString = option.restPositional ? 'Everything after this option is considered a positional argument, even if it looks like an option.' : '';
+ description = option.longDescription || option.description && sentencize(option.description);
+ fullDescription = description && restPositionalString
+ ? description + " " + restPositionalString
+ : (that = description || restPositionalString) ? that : '';
+ preDescription = 'description:';
+ descriptionString = !fullDescription
+ ? ''
+ : maxWidth && fullDescription.length - 1 - preDescription.length > maxWidth
+ ? "\n" + preDescription + "\n" + wrap(fullDescription)
+ : "\n" + preDescription + " " + fullDescription;
+ exampleString = (that = option.example) ? (examples = [].concat(that), examples.length > 1
+ ? "\nexamples:\n" + unlines(examples)
+ : "\nexample: " + examples[0]) : '';
+ seperator = defaultString || descriptionString || exampleString ? "\n" + repeatString$('=', pre.length) : '';
+ return pre + "" + seperator + defaultString + descriptionString + exampleString;
+ };
+ };
+ generateHelp = function(arg$){
+ var options, prepend, append, helpStyle, ref$, stdout, aliasSeparator, typeSeparator, descriptionSeparator, maxPadFactor, initialIndent, secondaryIndent;
+ options = arg$.options, prepend = arg$.prepend, append = arg$.append, helpStyle = (ref$ = arg$.helpStyle) != null
+ ? ref$
+ : {}, stdout = arg$.stdout;
+ setHelpStyleDefaults(helpStyle);
+ aliasSeparator = helpStyle.aliasSeparator, typeSeparator = helpStyle.typeSeparator, descriptionSeparator = helpStyle.descriptionSeparator, maxPadFactor = helpStyle.maxPadFactor, initialIndent = helpStyle.initialIndent, secondaryIndent = helpStyle.secondaryIndent;
+ return function(arg$){
+ var ref$, showHidden, interpolate, maxWidth, output, out, data, optionCount, totalPreLen, preLens, i$, len$, item, that, pre, descParts, desc, preLen, sortedPreLens, maxPreLen, preLenMean, x, padAmount, descSepLen, fullWrapCount, partialWrapCount, descLen, totalLen, initialSpace, wrapAllFull, i, wrap;
+ ref$ = arg$ != null
+ ? arg$
+ : {}, showHidden = ref$.showHidden, interpolate = ref$.interpolate;
+ maxWidth = stdout != null && stdout.isTTY ? stdout.columns - 1 : null;
+ output = [];
+ out = function(it){
+ return output.push(it != null ? it : '');
+ };
+ if (prepend) {
+ out(interpolate ? interp(prepend, interpolate) : prepend);
+ out();
+ }
+ data = [];
+ optionCount = 0;
+ totalPreLen = 0;
+ preLens = [];
+ for (i$ = 0, len$ = (ref$ = options).length; i$ < len$; ++i$) {
+ item = ref$[i$];
+ if (showHidden || !item.hidden) {
+ if (that = item.heading) {
+ data.push({
+ type: 'heading',
+ value: that
+ });
+ } else {
+ pre = getPreText(item, helpStyle, maxWidth);
+ descParts = [];
+ if ((that = item.description) != null) {
+ descParts.push(that);
+ }
+ if (that = item['enum']) {
+ descParts.push("either: " + naturalJoin(that));
+ }
+ if (item['default'] && !item.negateName) {
+ descParts.push("default: " + item['default']);
+ }
+ desc = descParts.join(' - ');
+ data.push({
+ type: 'option',
+ pre: pre,
+ desc: desc,
+ descLen: desc.length
+ });
+ preLen = pre.length;
+ optionCount++;
+ totalPreLen += preLen;
+ preLens.push(preLen);
+ }
+ }
+ }
+ sortedPreLens = sort(preLens);
+ maxPreLen = sortedPreLens[sortedPreLens.length - 1];
+ preLenMean = initialIndent + totalPreLen / optionCount;
+ x = optionCount > 2 ? min(preLenMean * maxPadFactor, maxPreLen) : maxPreLen;
+ for (i$ = sortedPreLens.length - 1; i$ >= 0; --i$) {
+ preLen = sortedPreLens[i$];
+ if (preLen <= x) {
+ padAmount = preLen;
+ break;
+ }
+ }
+ descSepLen = descriptionSeparator.length;
+ if (maxWidth != null) {
+ fullWrapCount = 0;
+ partialWrapCount = 0;
+ for (i$ = 0, len$ = data.length; i$ < len$; ++i$) {
+ item = data[i$];
+ if (item.type === 'option') {
+ pre = item.pre, desc = item.desc, descLen = item.descLen;
+ if (descLen === 0) {
+ item.wrap = 'none';
+ } else {
+ preLen = max(padAmount, pre.length) + initialIndent + descSepLen;
+ totalLen = preLen + descLen;
+ if (totalLen > maxWidth) {
+ if (descLen / 2.5 > maxWidth - preLen) {
+ fullWrapCount++;
+ item.wrap = 'full';
+ } else {
+ partialWrapCount++;
+ item.wrap = 'partial';
+ }
+ } else {
+ item.wrap = 'none';
+ }
+ }
+ }
+ }
+ }
+ initialSpace = repeatString$(' ', initialIndent);
+ wrapAllFull = optionCount > 1 && fullWrapCount + partialWrapCount * 0.5 > optionCount * 0.5;
+ for (i$ = 0, len$ = data.length; i$ < len$; ++i$) {
+ i = i$;
+ item = data[i$];
+ if (item.type === 'heading') {
+ if (i !== 0) {
+ out();
+ }
+ out(item.value + ":");
+ } else {
+ pre = item.pre, desc = item.desc, descLen = item.descLen, wrap = item.wrap;
+ if (maxWidth != null) {
+ if (wrapAllFull || wrap === 'full') {
+ wrap = wordwrap(initialIndent + secondaryIndent, maxWidth);
+ out(initialSpace + "" + pre + "\n" + wrap(desc));
+ continue;
+ } else if (wrap === 'partial') {
+ wrap = wordwrap(initialIndent + descSepLen + max(padAmount, pre.length), maxWidth);
+ out(initialSpace + "" + pad(pre, padAmount) + descriptionSeparator + wrap(desc).replace(/^\s+/, ''));
+ continue;
+ }
+ }
+ if (descLen === 0) {
+ out(initialSpace + "" + pre);
+ } else {
+ out(initialSpace + "" + pad(pre, padAmount) + descriptionSeparator + desc);
+ }
+ }
+ }
+ if (append) {
+ out();
+ out(interpolate ? interp(append, interpolate) : append);
+ }
+ return unlines(output);
+ };
+ };
+ function pad(str, num){
+ var len, padAmount;
+ len = str.length;
+ padAmount = num - len;
+ return str + "" + repeatString$(' ', padAmount > 0 ? padAmount : 0);
+ }
+ function sentencize(str){
+ var first, rest, period;
+ first = str.charAt(0).toUpperCase();
+ rest = str.slice(1);
+ period = /[\.!\?]$/.test(str) ? '' : '.';
+ return first + "" + rest + period;
+ }
+ function interp(string, object){
+ return string.replace(/{{([a-zA-Z$_][a-zA-Z$_0-9]*)}}/g, function(arg$, key){
+ var ref$;
+ return (ref$ = object[key]) != null
+ ? ref$
+ : "{{" + key + "}}";
+ });
+ }
+ module.exports = {
+ generateHelp: generateHelp,
+ generateHelpForOption: generateHelpForOption
+ };
+ function repeatString$(str, n){
+ for (var r = ''; n > 0; (n >>= 1) && (str += str)) if (n & 1) r += str;
+ return r;
+ }
+}).call(this);
diff --git a/node_modules/optionator/lib/index.js b/node_modules/optionator/lib/index.js
new file mode 100644
index 00000000..7ce37b23
--- /dev/null
+++ b/node_modules/optionator/lib/index.js
@@ -0,0 +1,465 @@
+// Generated by LiveScript 1.6.0
+(function(){
+ var VERSION, ref$, id, map, compact, any, groupBy, partition, chars, isItNaN, keys, Obj, camelize, deepIs, closestString, nameToRaw, dasherize, naturalJoin, generateHelp, generateHelpForOption, parsedTypeCheck, parseType, parseLevn, camelizeKeys, parseString, main, toString$ = {}.toString, slice$ = [].slice, arrayFrom$ = Array.from || function(x){return slice$.call(x);};
+ VERSION = '0.8.3';
+ ref$ = require('prelude-ls'), id = ref$.id, map = ref$.map, compact = ref$.compact, any = ref$.any, groupBy = ref$.groupBy, partition = ref$.partition, chars = ref$.chars, isItNaN = ref$.isItNaN, keys = ref$.keys, Obj = ref$.Obj, camelize = ref$.camelize;
+ deepIs = require('deep-is');
+ ref$ = require('./util'), closestString = ref$.closestString, nameToRaw = ref$.nameToRaw, dasherize = ref$.dasherize, naturalJoin = ref$.naturalJoin;
+ ref$ = require('./help'), generateHelp = ref$.generateHelp, generateHelpForOption = ref$.generateHelpForOption;
+ ref$ = require('type-check'), parsedTypeCheck = ref$.parsedTypeCheck, parseType = ref$.parseType;
+ parseLevn = require('levn').parsedTypeParse;
+ camelizeKeys = function(obj){
+ var key, value, resultObj$ = {};
+ for (key in obj) {
+ value = obj[key];
+ resultObj$[camelize(key)] = value;
+ }
+ return resultObj$;
+ };
+ parseString = function(string){
+ var assignOpt, regex, replaceRegex, result;
+ assignOpt = '--?[a-zA-Z][-a-z-A-Z0-9]*=';
+ regex = RegExp('(?:' + assignOpt + ')?(?:\'(?:\\\\\'|[^\'])+\'|"(?:\\\\"|[^"])+")|[^\'"\\s]+', 'g');
+ replaceRegex = RegExp('^(' + assignOpt + ')?[\'"]([\\s\\S]*)[\'"]$');
+ result = map(function(it){
+ return it.replace(replaceRegex, '$1$2');
+ }, string.match(regex) || []);
+ return result;
+ };
+ main = function(libOptions){
+ var opts, defaults, required, traverse, getOption, parse;
+ opts = {};
+ defaults = {};
+ required = [];
+ if (toString$.call(libOptions.stdout).slice(8, -1) === 'Undefined') {
+ libOptions.stdout = process.stdout;
+ }
+ libOptions.positionalAnywhere == null && (libOptions.positionalAnywhere = true);
+ libOptions.typeAliases == null && (libOptions.typeAliases = {});
+ libOptions.defaults == null && (libOptions.defaults = {});
+ if (libOptions.concatRepeatedArrays != null) {
+ libOptions.defaults.concatRepeatedArrays = libOptions.concatRepeatedArrays;
+ }
+ if (libOptions.mergeRepeatedObjects != null) {
+ libOptions.defaults.mergeRepeatedObjects = libOptions.mergeRepeatedObjects;
+ }
+ traverse = function(options){
+ var i$, len$, option, name, k, ref$, v, type, that, e, parsedPossibilities, parsedType, j$, len1$, possibility, rawDependsType, dependsOpts, dependsType, cra, alias, shortNames, longNames;
+ if (toString$.call(options).slice(8, -1) !== 'Array') {
+ throw new Error('No options defined.');
+ }
+ for (i$ = 0, len$ = options.length; i$ < len$; ++i$) {
+ option = options[i$];
+ if (option.heading == null) {
+ name = option.option;
+ if (opts[name] != null) {
+ throw new Error("Option '" + name + "' already defined.");
+ }
+ for (k in ref$ = libOptions.defaults) {
+ v = ref$[k];
+ option[k] == null && (option[k] = v);
+ }
+ if (option.type === 'Boolean') {
+ option.boolean == null && (option.boolean = true);
+ }
+ if (option.parsedType == null) {
+ if (!option.type) {
+ throw new Error("No type defined for option '" + name + "'.");
+ }
+ try {
+ type = (that = libOptions.typeAliases[option.type]) != null
+ ? that
+ : option.type;
+ option.parsedType = parseType(type);
+ } catch (e$) {
+ e = e$;
+ throw new Error("Option '" + name + "': Error parsing type '" + option.type + "': " + e.message);
+ }
+ }
+ if (option['default']) {
+ try {
+ defaults[name] = parseLevn(option.parsedType, option['default']);
+ } catch (e$) {
+ e = e$;
+ throw new Error("Option '" + name + "': Error parsing default value '" + option['default'] + "' for type '" + option.type + "': " + e.message);
+ }
+ }
+ if (option['enum'] && !option.parsedPossiblities) {
+ parsedPossibilities = [];
+ parsedType = option.parsedType;
+ for (j$ = 0, len1$ = (ref$ = option['enum']).length; j$ < len1$; ++j$) {
+ possibility = ref$[j$];
+ try {
+ parsedPossibilities.push(parseLevn(parsedType, possibility));
+ } catch (e$) {
+ e = e$;
+ throw new Error("Option '" + name + "': Error parsing enum value '" + possibility + "' for type '" + option.type + "': " + e.message);
+ }
+ }
+ option.parsedPossibilities = parsedPossibilities;
+ }
+ if (that = option.dependsOn) {
+ if (that.length) {
+ ref$ = [].concat(option.dependsOn), rawDependsType = ref$[0], dependsOpts = slice$.call(ref$, 1);
+ dependsType = rawDependsType.toLowerCase();
+ if (dependsOpts.length) {
+ if (dependsType === 'and' || dependsType === 'or') {
+ option.dependsOn = [dependsType].concat(arrayFrom$(dependsOpts));
+ } else {
+ throw new Error("Option '" + name + "': If you have more than one dependency, you must specify either 'and' or 'or'");
+ }
+ } else {
+ if ((ref$ = dependsType.toLowerCase()) === 'and' || ref$ === 'or') {
+ option.dependsOn = null;
+ } else {
+ option.dependsOn = ['and', rawDependsType];
+ }
+ }
+ } else {
+ option.dependsOn = null;
+ }
+ }
+ if (option.required) {
+ required.push(name);
+ }
+ opts[name] = option;
+ if (option.concatRepeatedArrays != null) {
+ cra = option.concatRepeatedArrays;
+ if ('Boolean' === toString$.call(cra).slice(8, -1)) {
+ option.concatRepeatedArrays = [cra, {}];
+ } else if (cra.length === 1) {
+ option.concatRepeatedArrays = [cra[0], {}];
+ } else if (cra.length !== 2) {
+ throw new Error("Invalid setting for concatRepeatedArrays");
+ }
+ }
+ if (option.alias || option.aliases) {
+ if (name === 'NUM') {
+ throw new Error("-NUM option can't have aliases.");
+ }
+ if (option.alias) {
+ option.aliases == null && (option.aliases = [].concat(option.alias));
+ }
+ for (j$ = 0, len1$ = (ref$ = option.aliases).length; j$ < len1$; ++j$) {
+ alias = ref$[j$];
+ if (opts[alias] != null) {
+ throw new Error("Option '" + alias + "' already defined.");
+ }
+ opts[alias] = option;
+ }
+ ref$ = partition(fn$, option.aliases), shortNames = ref$[0], longNames = ref$[1];
+ option.shortNames == null && (option.shortNames = shortNames);
+ option.longNames == null && (option.longNames = longNames);
+ }
+ if ((!option.aliases || option.shortNames.length === 0) && option.type === 'Boolean' && option['default'] === 'true') {
+ option.negateName = true;
+ }
+ }
+ }
+ function fn$(it){
+ return it.length === 1;
+ }
+ };
+ traverse(libOptions.options);
+ getOption = function(name){
+ var opt, possiblyMeant;
+ opt = opts[name];
+ if (opt == null) {
+ possiblyMeant = closestString(keys(opts), name);
+ throw new Error("Invalid option '" + nameToRaw(name) + "'" + (possiblyMeant ? " - perhaps you meant '" + nameToRaw(possiblyMeant) + "'?" : '.'));
+ }
+ return opt;
+ };
+ parse = function(input, arg$){
+ var slice, obj, positional, restPositional, overrideRequired, prop, setValue, setDefaults, checkRequired, mutuallyExclusiveError, checkMutuallyExclusive, checkDependency, checkDependencies, checkProp, args, key, value, option, ref$, i$, len$, arg, that, result, short, argName, usingAssign, val, flags, len, j$, len1$, i, flag, opt, name, valPrime, negated, noedName;
+ slice = (arg$ != null
+ ? arg$
+ : {}).slice;
+ obj = {};
+ positional = [];
+ restPositional = false;
+ overrideRequired = false;
+ prop = null;
+ setValue = function(name, value){
+ var opt, val, cra, e, currentType;
+ opt = getOption(name);
+ if (opt.boolean) {
+ val = value;
+ } else {
+ try {
+ cra = opt.concatRepeatedArrays;
+ if (cra != null && cra[0] && cra[1].oneValuePerFlag && opt.parsedType.length === 1 && opt.parsedType[0].structure === 'array') {
+ val = [parseLevn(opt.parsedType[0].of, value)];
+ } else {
+ val = parseLevn(opt.parsedType, value);
+ }
+ } catch (e$) {
+ e = e$;
+ throw new Error("Invalid value for option '" + name + "' - expected type " + opt.type + ", received value: " + value + ".");
+ }
+ if (opt['enum'] && !any(function(it){
+ return deepIs(it, val);
+ }, opt.parsedPossibilities)) {
+ throw new Error("Option " + name + ": '" + val + "' not one of " + naturalJoin(opt['enum']) + ".");
+ }
+ }
+ currentType = toString$.call(obj[name]).slice(8, -1);
+ if (obj[name] != null) {
+ if (opt.concatRepeatedArrays != null && opt.concatRepeatedArrays[0] && currentType === 'Array') {
+ obj[name] = obj[name].concat(val);
+ } else if (opt.mergeRepeatedObjects && currentType === 'Object') {
+ import$(obj[name], val);
+ } else {
+ obj[name] = val;
+ }
+ } else {
+ obj[name] = val;
+ }
+ if (opt.restPositional) {
+ restPositional = true;
+ }
+ if (opt.overrideRequired) {
+ overrideRequired = true;
+ }
+ };
+ setDefaults = function(){
+ var name, ref$, value;
+ for (name in ref$ = defaults) {
+ value = ref$[name];
+ if (obj[name] == null) {
+ obj[name] = value;
+ }
+ }
+ };
+ checkRequired = function(){
+ var i$, ref$, len$, name;
+ if (overrideRequired) {
+ return;
+ }
+ for (i$ = 0, len$ = (ref$ = required).length; i$ < len$; ++i$) {
+ name = ref$[i$];
+ if (!obj[name]) {
+ throw new Error("Option " + nameToRaw(name) + " is required.");
+ }
+ }
+ };
+ mutuallyExclusiveError = function(first, second){
+ throw new Error("The options " + nameToRaw(first) + " and " + nameToRaw(second) + " are mutually exclusive - you cannot use them at the same time.");
+ };
+ checkMutuallyExclusive = function(){
+ var rules, i$, len$, rule, present, j$, len1$, element, k$, len2$, opt;
+ rules = libOptions.mutuallyExclusive;
+ if (!rules) {
+ return;
+ }
+ for (i$ = 0, len$ = rules.length; i$ < len$; ++i$) {
+ rule = rules[i$];
+ present = null;
+ for (j$ = 0, len1$ = rule.length; j$ < len1$; ++j$) {
+ element = rule[j$];
+ if (toString$.call(element).slice(8, -1) === 'Array') {
+ for (k$ = 0, len2$ = element.length; k$ < len2$; ++k$) {
+ opt = element[k$];
+ if (opt in obj) {
+ if (present != null) {
+ mutuallyExclusiveError(present, opt);
+ } else {
+ present = opt;
+ break;
+ }
+ }
+ }
+ } else {
+ if (element in obj) {
+ if (present != null) {
+ mutuallyExclusiveError(present, element);
+ } else {
+ present = element;
+ }
+ }
+ }
+ }
+ }
+ };
+ checkDependency = function(option){
+ var dependsOn, type, targetOptionNames, i$, len$, targetOptionName, targetOption;
+ dependsOn = option.dependsOn;
+ if (!dependsOn || option.dependenciesMet) {
+ return true;
+ }
+ type = dependsOn[0], targetOptionNames = slice$.call(dependsOn, 1);
+ for (i$ = 0, len$ = targetOptionNames.length; i$ < len$; ++i$) {
+ targetOptionName = targetOptionNames[i$];
+ targetOption = obj[targetOptionName];
+ if (targetOption && checkDependency(targetOption)) {
+ if (type === 'or') {
+ return true;
+ }
+ } else if (type === 'and') {
+ throw new Error("The option '" + option.option + "' did not have its dependencies met.");
+ }
+ }
+ if (type === 'and') {
+ return true;
+ } else {
+ throw new Error("The option '" + option.option + "' did not meet any of its dependencies.");
+ }
+ };
+ checkDependencies = function(){
+ var name;
+ for (name in obj) {
+ checkDependency(opts[name]);
+ }
+ };
+ checkProp = function(){
+ if (prop) {
+ throw new Error("Value for '" + prop + "' of type '" + getOption(prop).type + "' required.");
+ }
+ };
+ switch (toString$.call(input).slice(8, -1)) {
+ case 'String':
+ args = parseString(input.slice(slice != null ? slice : 0));
+ break;
+ case 'Array':
+ args = input.slice(slice != null ? slice : 2);
+ break;
+ case 'Object':
+ obj = {};
+ for (key in input) {
+ value = input[key];
+ if (key !== '_') {
+ option = getOption(dasherize(key));
+ if (parsedTypeCheck(option.parsedType, value)) {
+ obj[option.option] = value;
+ } else {
+ throw new Error("Option '" + option.option + "': Invalid type for '" + value + "' - expected type '" + option.type + "'.");
+ }
+ }
+ }
+ checkMutuallyExclusive();
+ checkDependencies();
+ setDefaults();
+ checkRequired();
+ return ref$ = camelizeKeys(obj), ref$._ = input._ || [], ref$;
+ default:
+ throw new Error("Invalid argument to 'parse': " + input + ".");
+ }
+ for (i$ = 0, len$ = args.length; i$ < len$; ++i$) {
+ arg = args[i$];
+ if (arg === '--') {
+ restPositional = true;
+ } else if (restPositional) {
+ positional.push(arg);
+ } else {
+ if (that = arg.match(/^(--?)([a-zA-Z][-a-zA-Z0-9]*)(=)?(.*)?$/)) {
+ result = that;
+ checkProp();
+ short = result[1].length === 1;
+ argName = result[2];
+ usingAssign = result[3] != null;
+ val = result[4];
+ if (usingAssign && val == null) {
+ throw new Error("No value for '" + argName + "' specified.");
+ }
+ if (short) {
+ flags = chars(argName);
+ len = flags.length;
+ for (j$ = 0, len1$ = flags.length; j$ < len1$; ++j$) {
+ i = j$;
+ flag = flags[j$];
+ opt = getOption(flag);
+ name = opt.option;
+ if (restPositional) {
+ positional.push(flag);
+ } else if (i === len - 1) {
+ if (usingAssign) {
+ valPrime = opt.boolean ? parseLevn([{
+ type: 'Boolean'
+ }], val) : val;
+ setValue(name, valPrime);
+ } else if (opt.boolean) {
+ setValue(name, true);
+ } else {
+ prop = name;
+ }
+ } else if (opt.boolean) {
+ setValue(name, true);
+ } else {
+ throw new Error("Can't set argument '" + flag + "' when not last flag in a group of short flags.");
+ }
+ }
+ } else {
+ negated = false;
+ if (that = argName.match(/^no-(.+)$/)) {
+ negated = true;
+ noedName = that[1];
+ opt = getOption(noedName);
+ } else {
+ opt = getOption(argName);
+ }
+ name = opt.option;
+ if (opt.boolean) {
+ valPrime = usingAssign ? parseLevn([{
+ type: 'Boolean'
+ }], val) : true;
+ if (negated) {
+ setValue(name, !valPrime);
+ } else {
+ setValue(name, valPrime);
+ }
+ } else {
+ if (negated) {
+ throw new Error("Only use 'no-' prefix for Boolean options, not with '" + noedName + "'.");
+ }
+ if (usingAssign) {
+ setValue(name, val);
+ } else {
+ prop = name;
+ }
+ }
+ }
+ } else if (that = arg.match(/^-([0-9]+(?:\.[0-9]+)?)$/)) {
+ opt = opts.NUM;
+ if (!opt) {
+ throw new Error('No -NUM option defined.');
+ }
+ setValue(opt.option, that[1]);
+ } else {
+ if (prop) {
+ setValue(prop, arg);
+ prop = null;
+ } else {
+ positional.push(arg);
+ if (!libOptions.positionalAnywhere) {
+ restPositional = true;
+ }
+ }
+ }
+ }
+ }
+ checkProp();
+ checkMutuallyExclusive();
+ checkDependencies();
+ setDefaults();
+ checkRequired();
+ return ref$ = camelizeKeys(obj), ref$._ = positional, ref$;
+ };
+ return {
+ parse: parse,
+ parseArgv: function(it){
+ return parse(it, {
+ slice: 2
+ });
+ },
+ generateHelp: generateHelp(libOptions),
+ generateHelpForOption: generateHelpForOption(getOption, libOptions)
+ };
+ };
+ main.VERSION = VERSION;
+ module.exports = main;
+ function import$(obj, src){
+ var own = {}.hasOwnProperty;
+ for (var key in src) if (own.call(src, key)) obj[key] = src[key];
+ return obj;
+ }
+}).call(this);
diff --git a/node_modules/optionator/lib/util.js b/node_modules/optionator/lib/util.js
new file mode 100644
index 00000000..5bc0cbb6
--- /dev/null
+++ b/node_modules/optionator/lib/util.js
@@ -0,0 +1,54 @@
+// Generated by LiveScript 1.6.0
+(function(){
+ var prelude, map, sortBy, fl, closestString, nameToRaw, dasherize, naturalJoin;
+ prelude = require('prelude-ls'), map = prelude.map, sortBy = prelude.sortBy;
+ fl = require('fast-levenshtein');
+ closestString = function(possibilities, input){
+ var distances, ref$, string, distance;
+ if (!possibilities.length) {
+ return;
+ }
+ distances = map(function(it){
+ var ref$, longer, shorter;
+ ref$ = input.length > it.length
+ ? [input, it]
+ : [it, input], longer = ref$[0], shorter = ref$[1];
+ return {
+ string: it,
+ distance: fl.get(longer, shorter)
+ };
+ })(
+ possibilities);
+ ref$ = sortBy(function(it){
+ return it.distance;
+ }, distances)[0], string = ref$.string, distance = ref$.distance;
+ return string;
+ };
+ nameToRaw = function(name){
+ if (name.length === 1 || name === 'NUM') {
+ return "-" + name;
+ } else {
+ return "--" + name;
+ }
+ };
+ dasherize = function(string){
+ if (/^[A-Z]/.test(string)) {
+ return string;
+ } else {
+ return prelude.dasherize(string);
+ }
+ };
+ naturalJoin = function(array){
+ if (array.length < 3) {
+ return array.join(' or ');
+ } else {
+ return array.slice(0, -1).join(', ') + ", or " + array[array.length - 1];
+ }
+ };
+ module.exports = {
+ closestString: closestString,
+ nameToRaw: nameToRaw,
+ dasherize: dasherize,
+ naturalJoin: naturalJoin
+ };
+}).call(this);
diff --git a/node_modules/optionator/package.json b/node_modules/optionator/package.json
new file mode 100644
index 00000000..ae049cf0
--- /dev/null
+++ b/node_modules/optionator/package.json
@@ -0,0 +1,74 @@
+{
+ "_from": "optionator@^0.8.1",
+ "_id": "optionator@0.8.3",
+ "_inBundle": false,
+ "_integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "_location": "/optionator",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "optionator@^0.8.1",
+ "name": "optionator",
+ "escapedName": "optionator",
+ "rawSpec": "^0.8.1",
+ "saveSpec": null,
+ "fetchSpec": "^0.8.1"
+ },
+ "_requiredBy": [
+ "/escodegen"
+ ],
+ "_resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "_shasum": "84fa1d036fe9d3c7e21d99884b601167ec8fb495",
+ "_spec": "optionator@^0.8.1",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\escodegen",
+ "author": {
+ "name": "George Zahariev",
+ "email": "z@georgezahariev.com"
+ },
+ "bugs": {
+ "url": "https://github.com/gkz/optionator/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "deprecated": false,
+ "description": "option parsing and help generation",
+ "devDependencies": {
+ "istanbul": "~0.4.5",
+ "livescript": "~1.6.0",
+ "mocha": "~6.2.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "files": [
+ "lib",
+ "README.md",
+ "LICENSE"
+ ],
+ "homepage": "https://github.com/gkz/optionator",
+ "keywords": [
+ "options",
+ "flags",
+ "option parsing",
+ "cli"
+ ],
+ "license": "MIT",
+ "main": "./lib/",
+ "name": "optionator",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/gkz/optionator.git"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "version": "0.8.3"
+}
diff --git a/node_modules/prelude-ls/CHANGELOG.md b/node_modules/prelude-ls/CHANGELOG.md
new file mode 100644
index 00000000..c2de12d5
--- /dev/null
+++ b/node_modules/prelude-ls/CHANGELOG.md
@@ -0,0 +1,99 @@
+# 1.1.2
+- add `Func.memoize`
+- fix `zip-all` and `zip-with-all` corner case (no input)
+- build with LiveScript 1.4.0
+
+# 1.1.1
+- curry `unique-by`, `minimum-by`
+
+# 1.1.0
+- added `List` functions: `maximum-by`, `minimum-by`, `unique-by`
+- added `List` functions: `at`, `elem-index`, `elem-indices`, `find-index`, `find-indices`
+- added `Str` functions: `capitalize`, `camelize`, `dasherize`
+- added `Func` function: `over` - eg. ``same-length = (==) `over` (.length)``
+- exported `Str.repeat` through main `prelude` object
+- fixed definition of `foldr` and `foldr1`, the new correct definition is backwards incompatible with the old, incorrect one
+- fixed issue with `fix`
+- improved code coverage
+
+# 1.0.3
+- build browser versions
+
+# 1.0.2
+- bug fix for `flatten` - slight change with bug fix, flattens arrays only, not array-like objects
+
+# 1.0.1
+- bug fixes for `drop-while` and `take-while`
+
+# 1.0.0
+* massive update - separated functions into separate modules
+* functions do not accept multiple types anymore - use different versions in their respective modules in some cases (eg. `Obj.map`), or use `chars` or `values` in other cases to transform into a list
+* objects are no longer transformed into functions, simply use `(obj.)` in LiveScript to do that
+* browser version now using browserify - use `prelude = require('prelude-ls')`
+* added `compact`, `split`, `flatten`, `difference`, `intersection`, `union`, `count-by`, `group-by`, `chars`, `unchars`, `apply`
+* added `lists-to-obj` which takes a list of keys and list of values and zips them up into an object, and the converse `obj-to-lists`
+* added `pairs-to-obj` which takes a list of pairs (2 element lists) and creates an object, and the converse `obj-to-pairs`
+* removed `cons`, `append` - use the concat operator
+* removed `compose` - use the compose operator
+* removed `obj-to-func` - use partially applied access (eg. `(obj.)`)
+* removed `length` - use `(.length)`
+* `sort-by` renamed to `sort-with`
+* added new `sort-by`
+* removed `compare` - just use the new `sort-by`
+* `break-it` renamed `break-list`, (`Str.break-str` for the string version)
+* added `Str.repeat` which creates a new string by repeating the input n times
+* `unfold` as alias to `unfoldr` is no longer used
+* fixed up style and compiled with LiveScript 1.1.1
+* use Make instead of Slake
+* greatly improved tests
+
+# 0.6.0
+* fixed various bugs
+* added `fix`, a fixpoint (Y combinator) for anonymous recursive functions
+* added `unfoldr` (alias `unfold`)
+* calling `replicate` with a string now returns a list of strings
+* removed `partial`, just use native partial application in LiveScript using the `_` placeholder, or currying
+* added `sort`, `sortBy`, and `compare`
+
+# 0.5.0
+* removed `lookup` - use (.prop)
+* removed `call` - use (.func arg1, arg2)
+* removed `pluck` - use map (.prop), xs
+* fixed buys wtih `head` and `last`
+* added non-minifed browser version, as `prelude-browser.js`
+* renamed `prelude-min.js` to `prelude-browser-min.js`
+* renamed `zip` to `zipAll`
+* renamed `zipWith` to `zipAllWith`
+* added `zip`, a curried zip that takes only two arguments
+* added `zipWith`, a curried zipWith that takes only two arguments
+
+# 0.4.0
+* added `parition` function
+* added `curry` function
+* removed `elem` function (use `in`)
+* removed `notElem` function (use `not in`)
+
+# 0.3.0
+* added `listToObject`
+* added `unique`
+* added `objToFunc`
+* added support for using strings in map and the like
+* added support for using objects in map and the like
+* added ability to use objects instead of functions in certain cases
+* removed `error` (just use throw)
+* added `tau` constant
+* added `join`
+* added `values`
+* added `keys`
+* added `partial`
+* renamed `log` to `ln`
+* added alias to `head`: `first`
+* added `installPrelude` helper
+
+# 0.2.0
+* removed functions that simply warp operators as you can now use operators as functions in LiveScript
+* `min/max` are now curried and take only 2 arguments
+* added `call`
+
+# 0.1.0
+* initial public release
diff --git a/node_modules/prelude-ls/LICENSE b/node_modules/prelude-ls/LICENSE
new file mode 100644
index 00000000..525b1185
--- /dev/null
+++ b/node_modules/prelude-ls/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) George Zahariev
+
+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/prelude-ls/README.md b/node_modules/prelude-ls/README.md
new file mode 100644
index 00000000..fabc212e
--- /dev/null
+++ b/node_modules/prelude-ls/README.md
@@ -0,0 +1,15 @@
+# prelude.ls [](https://travis-ci.org/gkz/prelude-ls)
+
+is a functionally oriented utility library. It is powerful and flexible. Almost all of its functions are curried. It is written in, and is the recommended base library for, LiveScript.
+
+See **[the prelude.ls site](http://preludels.com)** for examples, a reference, and more.
+
+You can install via npm `npm install prelude-ls`
+
+### Development
+
+`make test` to test
+
+`make build` to build `lib` from `src`
+
+`make build-browser` to build browser versions
diff --git a/node_modules/prelude-ls/lib/Func.js b/node_modules/prelude-ls/lib/Func.js
new file mode 100644
index 00000000..b80c9b13
--- /dev/null
+++ b/node_modules/prelude-ls/lib/Func.js
@@ -0,0 +1,65 @@
+// Generated by LiveScript 1.4.0
+var apply, curry, flip, fix, over, memoize, slice$ = [].slice, toString$ = {}.toString;
+apply = curry$(function(f, list){
+ return f.apply(null, list);
+});
+curry = function(f){
+ return curry$(f);
+};
+flip = curry$(function(f, x, y){
+ return f(y, x);
+});
+fix = function(f){
+ return function(g){
+ return function(){
+ return f(g(g)).apply(null, arguments);
+ };
+ }(function(g){
+ return function(){
+ return f(g(g)).apply(null, arguments);
+ };
+ });
+};
+over = curry$(function(f, g, x, y){
+ return f(g(x), g(y));
+});
+memoize = function(f){
+ var memo;
+ memo = {};
+ return function(){
+ var args, key, arg;
+ args = slice$.call(arguments);
+ key = (function(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = args).length; i$ < len$; ++i$) {
+ arg = ref$[i$];
+ results$.push(arg + toString$.call(arg).slice(8, -1));
+ }
+ return results$;
+ }()).join('');
+ return memo[key] = key in memo
+ ? memo[key]
+ : f.apply(null, args);
+ };
+};
+module.exports = {
+ curry: curry,
+ flip: flip,
+ fix: fix,
+ apply: apply,
+ over: over,
+ memoize: memoize
+};
+function curry$(f, bound){
+ var context,
+ _curry = function(args) {
+ return f.length > 1 ? function(){
+ var params = args ? args.concat() : [];
+ context = bound ? context || this : this;
+ return params.push.apply(params, arguments) <
+ f.length && arguments.length ?
+ _curry.call(context, params) : f.apply(context, params);
+ } : f;
+ };
+ return _curry();
+}
\ No newline at end of file
diff --git a/node_modules/prelude-ls/lib/List.js b/node_modules/prelude-ls/lib/List.js
new file mode 100644
index 00000000..5790816b
--- /dev/null
+++ b/node_modules/prelude-ls/lib/List.js
@@ -0,0 +1,686 @@
+// Generated by LiveScript 1.4.0
+var each, map, compact, filter, reject, partition, find, head, first, tail, last, initial, empty, reverse, unique, uniqueBy, fold, foldl, fold1, foldl1, foldr, foldr1, unfoldr, concat, concatMap, flatten, difference, intersection, union, countBy, groupBy, andList, orList, any, all, sort, sortWith, sortBy, sum, product, mean, average, maximum, minimum, maximumBy, minimumBy, scan, scanl, scan1, scanl1, scanr, scanr1, slice, take, drop, splitAt, takeWhile, dropWhile, span, breakList, zip, zipWith, zipAll, zipAllWith, at, elemIndex, elemIndices, findIndex, findIndices, toString$ = {}.toString, slice$ = [].slice;
+each = curry$(function(f, xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ f(x);
+ }
+ return xs;
+});
+map = curry$(function(f, xs){
+ var i$, len$, x, results$ = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ results$.push(f(x));
+ }
+ return results$;
+});
+compact = function(xs){
+ var i$, len$, x, results$ = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (x) {
+ results$.push(x);
+ }
+ }
+ return results$;
+};
+filter = curry$(function(f, xs){
+ var i$, len$, x, results$ = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (f(x)) {
+ results$.push(x);
+ }
+ }
+ return results$;
+});
+reject = curry$(function(f, xs){
+ var i$, len$, x, results$ = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (!f(x)) {
+ results$.push(x);
+ }
+ }
+ return results$;
+});
+partition = curry$(function(f, xs){
+ var passed, failed, i$, len$, x;
+ passed = [];
+ failed = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ (f(x) ? passed : failed).push(x);
+ }
+ return [passed, failed];
+});
+find = curry$(function(f, xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (f(x)) {
+ return x;
+ }
+ }
+});
+head = first = function(xs){
+ return xs[0];
+};
+tail = function(xs){
+ if (!xs.length) {
+ return;
+ }
+ return xs.slice(1);
+};
+last = function(xs){
+ return xs[xs.length - 1];
+};
+initial = function(xs){
+ if (!xs.length) {
+ return;
+ }
+ return xs.slice(0, -1);
+};
+empty = function(xs){
+ return !xs.length;
+};
+reverse = function(xs){
+ return xs.concat().reverse();
+};
+unique = function(xs){
+ var result, i$, len$, x;
+ result = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (!in$(x, result)) {
+ result.push(x);
+ }
+ }
+ return result;
+};
+uniqueBy = curry$(function(f, xs){
+ var seen, i$, len$, x, val, results$ = [];
+ seen = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ val = f(x);
+ if (in$(val, seen)) {
+ continue;
+ }
+ seen.push(val);
+ results$.push(x);
+ }
+ return results$;
+});
+fold = foldl = curry$(function(f, memo, xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ memo = f(memo, x);
+ }
+ return memo;
+});
+fold1 = foldl1 = curry$(function(f, xs){
+ return fold(f, xs[0], xs.slice(1));
+});
+foldr = curry$(function(f, memo, xs){
+ var i$, x;
+ for (i$ = xs.length - 1; i$ >= 0; --i$) {
+ x = xs[i$];
+ memo = f(x, memo);
+ }
+ return memo;
+});
+foldr1 = curry$(function(f, xs){
+ return foldr(f, xs[xs.length - 1], xs.slice(0, -1));
+});
+unfoldr = curry$(function(f, b){
+ var result, x, that;
+ result = [];
+ x = b;
+ while ((that = f(x)) != null) {
+ result.push(that[0]);
+ x = that[1];
+ }
+ return result;
+});
+concat = function(xss){
+ return [].concat.apply([], xss);
+};
+concatMap = curry$(function(f, xs){
+ var x;
+ return [].concat.apply([], (function(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = xs).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ results$.push(f(x));
+ }
+ return results$;
+ }()));
+});
+flatten = function(xs){
+ var x;
+ return [].concat.apply([], (function(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = xs).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ if (toString$.call(x).slice(8, -1) === 'Array') {
+ results$.push(flatten(x));
+ } else {
+ results$.push(x);
+ }
+ }
+ return results$;
+ }()));
+};
+difference = function(xs){
+ var yss, results, i$, len$, x, j$, len1$, ys;
+ yss = slice$.call(arguments, 1);
+ results = [];
+ outer: for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ for (j$ = 0, len1$ = yss.length; j$ < len1$; ++j$) {
+ ys = yss[j$];
+ if (in$(x, ys)) {
+ continue outer;
+ }
+ }
+ results.push(x);
+ }
+ return results;
+};
+intersection = function(xs){
+ var yss, results, i$, len$, x, j$, len1$, ys;
+ yss = slice$.call(arguments, 1);
+ results = [];
+ outer: for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ for (j$ = 0, len1$ = yss.length; j$ < len1$; ++j$) {
+ ys = yss[j$];
+ if (!in$(x, ys)) {
+ continue outer;
+ }
+ }
+ results.push(x);
+ }
+ return results;
+};
+union = function(){
+ var xss, results, i$, len$, xs, j$, len1$, x;
+ xss = slice$.call(arguments);
+ results = [];
+ for (i$ = 0, len$ = xss.length; i$ < len$; ++i$) {
+ xs = xss[i$];
+ for (j$ = 0, len1$ = xs.length; j$ < len1$; ++j$) {
+ x = xs[j$];
+ if (!in$(x, results)) {
+ results.push(x);
+ }
+ }
+ }
+ return results;
+};
+countBy = curry$(function(f, xs){
+ var results, i$, len$, x, key;
+ results = {};
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ key = f(x);
+ if (key in results) {
+ results[key] += 1;
+ } else {
+ results[key] = 1;
+ }
+ }
+ return results;
+});
+groupBy = curry$(function(f, xs){
+ var results, i$, len$, x, key;
+ results = {};
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ key = f(x);
+ if (key in results) {
+ results[key].push(x);
+ } else {
+ results[key] = [x];
+ }
+ }
+ return results;
+});
+andList = function(xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (!x) {
+ return false;
+ }
+ }
+ return true;
+};
+orList = function(xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (x) {
+ return true;
+ }
+ }
+ return false;
+};
+any = curry$(function(f, xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (f(x)) {
+ return true;
+ }
+ }
+ return false;
+});
+all = curry$(function(f, xs){
+ var i$, len$, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ if (!f(x)) {
+ return false;
+ }
+ }
+ return true;
+});
+sort = function(xs){
+ return xs.concat().sort(function(x, y){
+ if (x > y) {
+ return 1;
+ } else if (x < y) {
+ return -1;
+ } else {
+ return 0;
+ }
+ });
+};
+sortWith = curry$(function(f, xs){
+ return xs.concat().sort(f);
+});
+sortBy = curry$(function(f, xs){
+ return xs.concat().sort(function(x, y){
+ if (f(x) > f(y)) {
+ return 1;
+ } else if (f(x) < f(y)) {
+ return -1;
+ } else {
+ return 0;
+ }
+ });
+});
+sum = function(xs){
+ var result, i$, len$, x;
+ result = 0;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ result += x;
+ }
+ return result;
+};
+product = function(xs){
+ var result, i$, len$, x;
+ result = 1;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ result *= x;
+ }
+ return result;
+};
+mean = average = function(xs){
+ var sum, i$, len$, x;
+ sum = 0;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ x = xs[i$];
+ sum += x;
+ }
+ return sum / xs.length;
+};
+maximum = function(xs){
+ var max, i$, ref$, len$, x;
+ max = xs[0];
+ for (i$ = 0, len$ = (ref$ = xs.slice(1)).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ if (x > max) {
+ max = x;
+ }
+ }
+ return max;
+};
+minimum = function(xs){
+ var min, i$, ref$, len$, x;
+ min = xs[0];
+ for (i$ = 0, len$ = (ref$ = xs.slice(1)).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ if (x < min) {
+ min = x;
+ }
+ }
+ return min;
+};
+maximumBy = curry$(function(f, xs){
+ var max, i$, ref$, len$, x;
+ max = xs[0];
+ for (i$ = 0, len$ = (ref$ = xs.slice(1)).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ if (f(x) > f(max)) {
+ max = x;
+ }
+ }
+ return max;
+});
+minimumBy = curry$(function(f, xs){
+ var min, i$, ref$, len$, x;
+ min = xs[0];
+ for (i$ = 0, len$ = (ref$ = xs.slice(1)).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ if (f(x) < f(min)) {
+ min = x;
+ }
+ }
+ return min;
+});
+scan = scanl = curry$(function(f, memo, xs){
+ var last, x;
+ last = memo;
+ return [memo].concat((function(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = xs).length; i$ < len$; ++i$) {
+ x = ref$[i$];
+ results$.push(last = f(last, x));
+ }
+ return results$;
+ }()));
+});
+scan1 = scanl1 = curry$(function(f, xs){
+ if (!xs.length) {
+ return;
+ }
+ return scan(f, xs[0], xs.slice(1));
+});
+scanr = curry$(function(f, memo, xs){
+ xs = xs.concat().reverse();
+ return scan(f, memo, xs).reverse();
+});
+scanr1 = curry$(function(f, xs){
+ if (!xs.length) {
+ return;
+ }
+ xs = xs.concat().reverse();
+ return scan(f, xs[0], xs.slice(1)).reverse();
+});
+slice = curry$(function(x, y, xs){
+ return xs.slice(x, y);
+});
+take = curry$(function(n, xs){
+ if (n <= 0) {
+ return xs.slice(0, 0);
+ } else {
+ return xs.slice(0, n);
+ }
+});
+drop = curry$(function(n, xs){
+ if (n <= 0) {
+ return xs;
+ } else {
+ return xs.slice(n);
+ }
+});
+splitAt = curry$(function(n, xs){
+ return [take(n, xs), drop(n, xs)];
+});
+takeWhile = curry$(function(p, xs){
+ var len, i;
+ len = xs.length;
+ if (!len) {
+ return xs;
+ }
+ i = 0;
+ while (i < len && p(xs[i])) {
+ i += 1;
+ }
+ return xs.slice(0, i);
+});
+dropWhile = curry$(function(p, xs){
+ var len, i;
+ len = xs.length;
+ if (!len) {
+ return xs;
+ }
+ i = 0;
+ while (i < len && p(xs[i])) {
+ i += 1;
+ }
+ return xs.slice(i);
+});
+span = curry$(function(p, xs){
+ return [takeWhile(p, xs), dropWhile(p, xs)];
+});
+breakList = curry$(function(p, xs){
+ return span(compose$(p, not$), xs);
+});
+zip = curry$(function(xs, ys){
+ var result, len, i$, len$, i, x;
+ result = [];
+ len = ys.length;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ i = i$;
+ x = xs[i$];
+ if (i === len) {
+ break;
+ }
+ result.push([x, ys[i]]);
+ }
+ return result;
+});
+zipWith = curry$(function(f, xs, ys){
+ var result, len, i$, len$, i, x;
+ result = [];
+ len = ys.length;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ i = i$;
+ x = xs[i$];
+ if (i === len) {
+ break;
+ }
+ result.push(f(x, ys[i]));
+ }
+ return result;
+});
+zipAll = function(){
+ var xss, minLength, i$, len$, xs, ref$, i, lresult$, j$, results$ = [];
+ xss = slice$.call(arguments);
+ minLength = undefined;
+ for (i$ = 0, len$ = xss.length; i$ < len$; ++i$) {
+ xs = xss[i$];
+ minLength <= (ref$ = xs.length) || (minLength = ref$);
+ }
+ for (i$ = 0; i$ < minLength; ++i$) {
+ i = i$;
+ lresult$ = [];
+ for (j$ = 0, len$ = xss.length; j$ < len$; ++j$) {
+ xs = xss[j$];
+ lresult$.push(xs[i]);
+ }
+ results$.push(lresult$);
+ }
+ return results$;
+};
+zipAllWith = function(f){
+ var xss, minLength, i$, len$, xs, ref$, i, results$ = [];
+ xss = slice$.call(arguments, 1);
+ minLength = undefined;
+ for (i$ = 0, len$ = xss.length; i$ < len$; ++i$) {
+ xs = xss[i$];
+ minLength <= (ref$ = xs.length) || (minLength = ref$);
+ }
+ for (i$ = 0; i$ < minLength; ++i$) {
+ i = i$;
+ results$.push(f.apply(null, (fn$())));
+ }
+ return results$;
+ function fn$(){
+ var i$, ref$, len$, results$ = [];
+ for (i$ = 0, len$ = (ref$ = xss).length; i$ < len$; ++i$) {
+ xs = ref$[i$];
+ results$.push(xs[i]);
+ }
+ return results$;
+ }
+};
+at = curry$(function(n, xs){
+ if (n < 0) {
+ return xs[xs.length + n];
+ } else {
+ return xs[n];
+ }
+});
+elemIndex = curry$(function(el, xs){
+ var i$, len$, i, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ i = i$;
+ x = xs[i$];
+ if (x === el) {
+ return i;
+ }
+ }
+});
+elemIndices = curry$(function(el, xs){
+ var i$, len$, i, x, results$ = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ i = i$;
+ x = xs[i$];
+ if (x === el) {
+ results$.push(i);
+ }
+ }
+ return results$;
+});
+findIndex = curry$(function(f, xs){
+ var i$, len$, i, x;
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ i = i$;
+ x = xs[i$];
+ if (f(x)) {
+ return i;
+ }
+ }
+});
+findIndices = curry$(function(f, xs){
+ var i$, len$, i, x, results$ = [];
+ for (i$ = 0, len$ = xs.length; i$ < len$; ++i$) {
+ i = i$;
+ x = xs[i$];
+ if (f(x)) {
+ results$.push(i);
+ }
+ }
+ return results$;
+});
+module.exports = {
+ each: each,
+ map: map,
+ filter: filter,
+ compact: compact,
+ reject: reject,
+ partition: partition,
+ find: find,
+ head: head,
+ first: first,
+ tail: tail,
+ last: last,
+ initial: initial,
+ empty: empty,
+ reverse: reverse,
+ difference: difference,
+ intersection: intersection,
+ union: union,
+ countBy: countBy,
+ groupBy: groupBy,
+ fold: fold,
+ fold1: fold1,
+ foldl: foldl,
+ foldl1: foldl1,
+ foldr: foldr,
+ foldr1: foldr1,
+ unfoldr: unfoldr,
+ andList: andList,
+ orList: orList,
+ any: any,
+ all: all,
+ unique: unique,
+ uniqueBy: uniqueBy,
+ sort: sort,
+ sortWith: sortWith,
+ sortBy: sortBy,
+ sum: sum,
+ product: product,
+ mean: mean,
+ average: average,
+ concat: concat,
+ concatMap: concatMap,
+ flatten: flatten,
+ maximum: maximum,
+ minimum: minimum,
+ maximumBy: maximumBy,
+ minimumBy: minimumBy,
+ scan: scan,
+ scan1: scan1,
+ scanl: scanl,
+ scanl1: scanl1,
+ scanr: scanr,
+ scanr1: scanr1,
+ slice: slice,
+ take: take,
+ drop: drop,
+ splitAt: splitAt,
+ takeWhile: takeWhile,
+ dropWhile: dropWhile,
+ span: span,
+ breakList: breakList,
+ zip: zip,
+ zipWith: zipWith,
+ zipAll: zipAll,
+ zipAllWith: zipAllWith,
+ at: at,
+ elemIndex: elemIndex,
+ elemIndices: elemIndices,
+ findIndex: findIndex,
+ findIndices: findIndices
+};
+function curry$(f, bound){
+ var context,
+ _curry = function(args) {
+ return f.length > 1 ? function(){
+ var params = args ? args.concat() : [];
+ context = bound ? context || this : this;
+ return params.push.apply(params, arguments) <
+ f.length && arguments.length ?
+ _curry.call(context, params) : f.apply(context, params);
+ } : f;
+ };
+ return _curry();
+}
+function in$(x, xs){
+ var i = -1, l = xs.length >>> 0;
+ while (++i < l) if (x === xs[i]) return true;
+ return false;
+}
+function compose$() {
+ var functions = arguments;
+ return function() {
+ var i, result;
+ result = functions[0].apply(this, arguments);
+ for (i = 1; i < functions.length; ++i) {
+ result = functions[i](result);
+ }
+ return result;
+ };
+}
+function not$(x){ return !x; }
\ No newline at end of file
diff --git a/node_modules/prelude-ls/lib/Num.js b/node_modules/prelude-ls/lib/Num.js
new file mode 100644
index 00000000..0e25be7b
--- /dev/null
+++ b/node_modules/prelude-ls/lib/Num.js
@@ -0,0 +1,130 @@
+// Generated by LiveScript 1.4.0
+var max, min, negate, abs, signum, quot, rem, div, mod, recip, pi, tau, exp, sqrt, ln, pow, sin, tan, cos, asin, acos, atan, atan2, truncate, round, ceiling, floor, isItNaN, even, odd, gcd, lcm;
+max = curry$(function(x$, y$){
+ return x$ > y$ ? x$ : y$;
+});
+min = curry$(function(x$, y$){
+ return x$ < y$ ? x$ : y$;
+});
+negate = function(x){
+ return -x;
+};
+abs = Math.abs;
+signum = function(x){
+ if (x < 0) {
+ return -1;
+ } else if (x > 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+};
+quot = curry$(function(x, y){
+ return ~~(x / y);
+});
+rem = curry$(function(x$, y$){
+ return x$ % y$;
+});
+div = curry$(function(x, y){
+ return Math.floor(x / y);
+});
+mod = curry$(function(x$, y$){
+ var ref$;
+ return (((x$) % (ref$ = y$) + ref$) % ref$);
+});
+recip = (function(it){
+ return 1 / it;
+});
+pi = Math.PI;
+tau = pi * 2;
+exp = Math.exp;
+sqrt = Math.sqrt;
+ln = Math.log;
+pow = curry$(function(x$, y$){
+ return Math.pow(x$, y$);
+});
+sin = Math.sin;
+tan = Math.tan;
+cos = Math.cos;
+asin = Math.asin;
+acos = Math.acos;
+atan = Math.atan;
+atan2 = curry$(function(x, y){
+ return Math.atan2(x, y);
+});
+truncate = function(x){
+ return ~~x;
+};
+round = Math.round;
+ceiling = Math.ceil;
+floor = Math.floor;
+isItNaN = function(x){
+ return x !== x;
+};
+even = function(x){
+ return x % 2 === 0;
+};
+odd = function(x){
+ return x % 2 !== 0;
+};
+gcd = curry$(function(x, y){
+ var z;
+ x = Math.abs(x);
+ y = Math.abs(y);
+ while (y !== 0) {
+ z = x % y;
+ x = y;
+ y = z;
+ }
+ return x;
+});
+lcm = curry$(function(x, y){
+ return Math.abs(Math.floor(x / gcd(x, y) * y));
+});
+module.exports = {
+ max: max,
+ min: min,
+ negate: negate,
+ abs: abs,
+ signum: signum,
+ quot: quot,
+ rem: rem,
+ div: div,
+ mod: mod,
+ recip: recip,
+ pi: pi,
+ tau: tau,
+ exp: exp,
+ sqrt: sqrt,
+ ln: ln,
+ pow: pow,
+ sin: sin,
+ tan: tan,
+ cos: cos,
+ acos: acos,
+ asin: asin,
+ atan: atan,
+ atan2: atan2,
+ truncate: truncate,
+ round: round,
+ ceiling: ceiling,
+ floor: floor,
+ isItNaN: isItNaN,
+ even: even,
+ odd: odd,
+ gcd: gcd,
+ lcm: lcm
+};
+function curry$(f, bound){
+ var context,
+ _curry = function(args) {
+ return f.length > 1 ? function(){
+ var params = args ? args.concat() : [];
+ context = bound ? context || this : this;
+ return params.push.apply(params, arguments) <
+ f.length && arguments.length ?
+ _curry.call(context, params) : f.apply(context, params);
+ } : f;
+ };
+ return _curry();
+}
\ No newline at end of file
diff --git a/node_modules/prelude-ls/lib/Obj.js b/node_modules/prelude-ls/lib/Obj.js
new file mode 100644
index 00000000..f0a921ff
--- /dev/null
+++ b/node_modules/prelude-ls/lib/Obj.js
@@ -0,0 +1,154 @@
+// Generated by LiveScript 1.4.0
+var values, keys, pairsToObj, objToPairs, listsToObj, objToLists, empty, each, map, compact, filter, reject, partition, find;
+values = function(object){
+ var i$, x, results$ = [];
+ for (i$ in object) {
+ x = object[i$];
+ results$.push(x);
+ }
+ return results$;
+};
+keys = function(object){
+ var x, results$ = [];
+ for (x in object) {
+ results$.push(x);
+ }
+ return results$;
+};
+pairsToObj = function(object){
+ var i$, len$, x, resultObj$ = {};
+ for (i$ = 0, len$ = object.length; i$ < len$; ++i$) {
+ x = object[i$];
+ resultObj$[x[0]] = x[1];
+ }
+ return resultObj$;
+};
+objToPairs = function(object){
+ var key, value, results$ = [];
+ for (key in object) {
+ value = object[key];
+ results$.push([key, value]);
+ }
+ return results$;
+};
+listsToObj = curry$(function(keys, values){
+ var i$, len$, i, key, resultObj$ = {};
+ for (i$ = 0, len$ = keys.length; i$ < len$; ++i$) {
+ i = i$;
+ key = keys[i$];
+ resultObj$[key] = values[i];
+ }
+ return resultObj$;
+});
+objToLists = function(object){
+ var keys, values, key, value;
+ keys = [];
+ values = [];
+ for (key in object) {
+ value = object[key];
+ keys.push(key);
+ values.push(value);
+ }
+ return [keys, values];
+};
+empty = function(object){
+ var x;
+ for (x in object) {
+ return false;
+ }
+ return true;
+};
+each = curry$(function(f, object){
+ var i$, x;
+ for (i$ in object) {
+ x = object[i$];
+ f(x);
+ }
+ return object;
+});
+map = curry$(function(f, object){
+ var k, x, resultObj$ = {};
+ for (k in object) {
+ x = object[k];
+ resultObj$[k] = f(x);
+ }
+ return resultObj$;
+});
+compact = function(object){
+ var k, x, resultObj$ = {};
+ for (k in object) {
+ x = object[k];
+ if (x) {
+ resultObj$[k] = x;
+ }
+ }
+ return resultObj$;
+};
+filter = curry$(function(f, object){
+ var k, x, resultObj$ = {};
+ for (k in object) {
+ x = object[k];
+ if (f(x)) {
+ resultObj$[k] = x;
+ }
+ }
+ return resultObj$;
+});
+reject = curry$(function(f, object){
+ var k, x, resultObj$ = {};
+ for (k in object) {
+ x = object[k];
+ if (!f(x)) {
+ resultObj$[k] = x;
+ }
+ }
+ return resultObj$;
+});
+partition = curry$(function(f, object){
+ var passed, failed, k, x;
+ passed = {};
+ failed = {};
+ for (k in object) {
+ x = object[k];
+ (f(x) ? passed : failed)[k] = x;
+ }
+ return [passed, failed];
+});
+find = curry$(function(f, object){
+ var i$, x;
+ for (i$ in object) {
+ x = object[i$];
+ if (f(x)) {
+ return x;
+ }
+ }
+});
+module.exports = {
+ values: values,
+ keys: keys,
+ pairsToObj: pairsToObj,
+ objToPairs: objToPairs,
+ listsToObj: listsToObj,
+ objToLists: objToLists,
+ empty: empty,
+ each: each,
+ map: map,
+ filter: filter,
+ compact: compact,
+ reject: reject,
+ partition: partition,
+ find: find
+};
+function curry$(f, bound){
+ var context,
+ _curry = function(args) {
+ return f.length > 1 ? function(){
+ var params = args ? args.concat() : [];
+ context = bound ? context || this : this;
+ return params.push.apply(params, arguments) <
+ f.length && arguments.length ?
+ _curry.call(context, params) : f.apply(context, params);
+ } : f;
+ };
+ return _curry();
+}
\ No newline at end of file
diff --git a/node_modules/prelude-ls/lib/Str.js b/node_modules/prelude-ls/lib/Str.js
new file mode 100644
index 00000000..eb9a1ac0
--- /dev/null
+++ b/node_modules/prelude-ls/lib/Str.js
@@ -0,0 +1,92 @@
+// Generated by LiveScript 1.4.0
+var split, join, lines, unlines, words, unwords, chars, unchars, reverse, repeat, capitalize, camelize, dasherize;
+split = curry$(function(sep, str){
+ return str.split(sep);
+});
+join = curry$(function(sep, xs){
+ return xs.join(sep);
+});
+lines = function(str){
+ if (!str.length) {
+ return [];
+ }
+ return str.split('\n');
+};
+unlines = function(it){
+ return it.join('\n');
+};
+words = function(str){
+ if (!str.length) {
+ return [];
+ }
+ return str.split(/[ ]+/);
+};
+unwords = function(it){
+ return it.join(' ');
+};
+chars = function(it){
+ return it.split('');
+};
+unchars = function(it){
+ return it.join('');
+};
+reverse = function(str){
+ return str.split('').reverse().join('');
+};
+repeat = curry$(function(n, str){
+ var result, i$;
+ result = '';
+ for (i$ = 0; i$ < n; ++i$) {
+ result += str;
+ }
+ return result;
+});
+capitalize = function(str){
+ return str.charAt(0).toUpperCase() + str.slice(1);
+};
+camelize = function(it){
+ return it.replace(/[-_]+(.)?/g, function(arg$, c){
+ return (c != null ? c : '').toUpperCase();
+ });
+};
+dasherize = function(str){
+ return str.replace(/([^-A-Z])([A-Z]+)/g, function(arg$, lower, upper){
+ return lower + "-" + (upper.length > 1
+ ? upper
+ : upper.toLowerCase());
+ }).replace(/^([A-Z]+)/, function(arg$, upper){
+ if (upper.length > 1) {
+ return upper + "-";
+ } else {
+ return upper.toLowerCase();
+ }
+ });
+};
+module.exports = {
+ split: split,
+ join: join,
+ lines: lines,
+ unlines: unlines,
+ words: words,
+ unwords: unwords,
+ chars: chars,
+ unchars: unchars,
+ reverse: reverse,
+ repeat: repeat,
+ capitalize: capitalize,
+ camelize: camelize,
+ dasherize: dasherize
+};
+function curry$(f, bound){
+ var context,
+ _curry = function(args) {
+ return f.length > 1 ? function(){
+ var params = args ? args.concat() : [];
+ context = bound ? context || this : this;
+ return params.push.apply(params, arguments) <
+ f.length && arguments.length ?
+ _curry.call(context, params) : f.apply(context, params);
+ } : f;
+ };
+ return _curry();
+}
\ No newline at end of file
diff --git a/node_modules/prelude-ls/lib/index.js b/node_modules/prelude-ls/lib/index.js
new file mode 100644
index 00000000..391cb2ee
--- /dev/null
+++ b/node_modules/prelude-ls/lib/index.js
@@ -0,0 +1,178 @@
+// Generated by LiveScript 1.4.0
+var Func, List, Obj, Str, Num, id, isType, replicate, prelude, toString$ = {}.toString;
+Func = require('./Func.js');
+List = require('./List.js');
+Obj = require('./Obj.js');
+Str = require('./Str.js');
+Num = require('./Num.js');
+id = function(x){
+ return x;
+};
+isType = curry$(function(type, x){
+ return toString$.call(x).slice(8, -1) === type;
+});
+replicate = curry$(function(n, x){
+ var i$, results$ = [];
+ for (i$ = 0; i$ < n; ++i$) {
+ results$.push(x);
+ }
+ return results$;
+});
+Str.empty = List.empty;
+Str.slice = List.slice;
+Str.take = List.take;
+Str.drop = List.drop;
+Str.splitAt = List.splitAt;
+Str.takeWhile = List.takeWhile;
+Str.dropWhile = List.dropWhile;
+Str.span = List.span;
+Str.breakStr = List.breakList;
+prelude = {
+ Func: Func,
+ List: List,
+ Obj: Obj,
+ Str: Str,
+ Num: Num,
+ id: id,
+ isType: isType,
+ replicate: replicate
+};
+prelude.each = List.each;
+prelude.map = List.map;
+prelude.filter = List.filter;
+prelude.compact = List.compact;
+prelude.reject = List.reject;
+prelude.partition = List.partition;
+prelude.find = List.find;
+prelude.head = List.head;
+prelude.first = List.first;
+prelude.tail = List.tail;
+prelude.last = List.last;
+prelude.initial = List.initial;
+prelude.empty = List.empty;
+prelude.reverse = List.reverse;
+prelude.difference = List.difference;
+prelude.intersection = List.intersection;
+prelude.union = List.union;
+prelude.countBy = List.countBy;
+prelude.groupBy = List.groupBy;
+prelude.fold = List.fold;
+prelude.foldl = List.foldl;
+prelude.fold1 = List.fold1;
+prelude.foldl1 = List.foldl1;
+prelude.foldr = List.foldr;
+prelude.foldr1 = List.foldr1;
+prelude.unfoldr = List.unfoldr;
+prelude.andList = List.andList;
+prelude.orList = List.orList;
+prelude.any = List.any;
+prelude.all = List.all;
+prelude.unique = List.unique;
+prelude.uniqueBy = List.uniqueBy;
+prelude.sort = List.sort;
+prelude.sortWith = List.sortWith;
+prelude.sortBy = List.sortBy;
+prelude.sum = List.sum;
+prelude.product = List.product;
+prelude.mean = List.mean;
+prelude.average = List.average;
+prelude.concat = List.concat;
+prelude.concatMap = List.concatMap;
+prelude.flatten = List.flatten;
+prelude.maximum = List.maximum;
+prelude.minimum = List.minimum;
+prelude.maximumBy = List.maximumBy;
+prelude.minimumBy = List.minimumBy;
+prelude.scan = List.scan;
+prelude.scanl = List.scanl;
+prelude.scan1 = List.scan1;
+prelude.scanl1 = List.scanl1;
+prelude.scanr = List.scanr;
+prelude.scanr1 = List.scanr1;
+prelude.slice = List.slice;
+prelude.take = List.take;
+prelude.drop = List.drop;
+prelude.splitAt = List.splitAt;
+prelude.takeWhile = List.takeWhile;
+prelude.dropWhile = List.dropWhile;
+prelude.span = List.span;
+prelude.breakList = List.breakList;
+prelude.zip = List.zip;
+prelude.zipWith = List.zipWith;
+prelude.zipAll = List.zipAll;
+prelude.zipAllWith = List.zipAllWith;
+prelude.at = List.at;
+prelude.elemIndex = List.elemIndex;
+prelude.elemIndices = List.elemIndices;
+prelude.findIndex = List.findIndex;
+prelude.findIndices = List.findIndices;
+prelude.apply = Func.apply;
+prelude.curry = Func.curry;
+prelude.flip = Func.flip;
+prelude.fix = Func.fix;
+prelude.over = Func.over;
+prelude.split = Str.split;
+prelude.join = Str.join;
+prelude.lines = Str.lines;
+prelude.unlines = Str.unlines;
+prelude.words = Str.words;
+prelude.unwords = Str.unwords;
+prelude.chars = Str.chars;
+prelude.unchars = Str.unchars;
+prelude.repeat = Str.repeat;
+prelude.capitalize = Str.capitalize;
+prelude.camelize = Str.camelize;
+prelude.dasherize = Str.dasherize;
+prelude.values = Obj.values;
+prelude.keys = Obj.keys;
+prelude.pairsToObj = Obj.pairsToObj;
+prelude.objToPairs = Obj.objToPairs;
+prelude.listsToObj = Obj.listsToObj;
+prelude.objToLists = Obj.objToLists;
+prelude.max = Num.max;
+prelude.min = Num.min;
+prelude.negate = Num.negate;
+prelude.abs = Num.abs;
+prelude.signum = Num.signum;
+prelude.quot = Num.quot;
+prelude.rem = Num.rem;
+prelude.div = Num.div;
+prelude.mod = Num.mod;
+prelude.recip = Num.recip;
+prelude.pi = Num.pi;
+prelude.tau = Num.tau;
+prelude.exp = Num.exp;
+prelude.sqrt = Num.sqrt;
+prelude.ln = Num.ln;
+prelude.pow = Num.pow;
+prelude.sin = Num.sin;
+prelude.tan = Num.tan;
+prelude.cos = Num.cos;
+prelude.acos = Num.acos;
+prelude.asin = Num.asin;
+prelude.atan = Num.atan;
+prelude.atan2 = Num.atan2;
+prelude.truncate = Num.truncate;
+prelude.round = Num.round;
+prelude.ceiling = Num.ceiling;
+prelude.floor = Num.floor;
+prelude.isItNaN = Num.isItNaN;
+prelude.even = Num.even;
+prelude.odd = Num.odd;
+prelude.gcd = Num.gcd;
+prelude.lcm = Num.lcm;
+prelude.VERSION = '1.1.2';
+module.exports = prelude;
+function curry$(f, bound){
+ var context,
+ _curry = function(args) {
+ return f.length > 1 ? function(){
+ var params = args ? args.concat() : [];
+ context = bound ? context || this : this;
+ return params.push.apply(params, arguments) <
+ f.length && arguments.length ?
+ _curry.call(context, params) : f.apply(context, params);
+ } : f;
+ };
+ return _curry();
+}
\ No newline at end of file
diff --git a/node_modules/prelude-ls/package.json b/node_modules/prelude-ls/package.json
new file mode 100644
index 00000000..c1e0c967
--- /dev/null
+++ b/node_modules/prelude-ls/package.json
@@ -0,0 +1,84 @@
+{
+ "_from": "prelude-ls@~1.1.2",
+ "_id": "prelude-ls@1.1.2",
+ "_inBundle": false,
+ "_integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "_location": "/prelude-ls",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "prelude-ls@~1.1.2",
+ "name": "prelude-ls",
+ "escapedName": "prelude-ls",
+ "rawSpec": "~1.1.2",
+ "saveSpec": null,
+ "fetchSpec": "~1.1.2"
+ },
+ "_requiredBy": [
+ "/levn",
+ "/optionator",
+ "/type-check"
+ ],
+ "_resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "_shasum": "21932a549f5e52ffd9a827f570e04be62a97da54",
+ "_spec": "prelude-ls@~1.1.2",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\optionator",
+ "author": {
+ "name": "George Zahariev",
+ "email": "z@georgezahariev.com"
+ },
+ "bugs": {
+ "url": "https://github.com/gkz/prelude-ls/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "prelude.ls is a functionally oriented utility library. It is powerful and flexible. Almost all of its functions are curried. It is written in, and is the recommended base library for, LiveScript.",
+ "devDependencies": {
+ "browserify": "~3.24.13",
+ "istanbul": "~0.2.4",
+ "livescript": "~1.4.0",
+ "mocha": "~2.2.4",
+ "sinon": "~1.10.2",
+ "uglify-js": "~2.4.12"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "files": [
+ "lib/",
+ "README.md",
+ "LICENSE"
+ ],
+ "homepage": "http://preludels.com",
+ "keywords": [
+ "prelude",
+ "livescript",
+ "utility",
+ "ls",
+ "coffeescript",
+ "javascript",
+ "library",
+ "functional",
+ "array",
+ "list",
+ "object",
+ "string"
+ ],
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "https://raw.github.com/gkz/prelude-ls/master/LICENSE"
+ }
+ ],
+ "main": "lib/",
+ "name": "prelude-ls",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/gkz/prelude-ls.git"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "version": "1.1.2"
+}
diff --git a/node_modules/source-map/CHANGELOG.md b/node_modules/source-map/CHANGELOG.md
new file mode 100644
index 00000000..3a8c066c
--- /dev/null
+++ b/node_modules/source-map/CHANGELOG.md
@@ -0,0 +1,301 @@
+# Change Log
+
+## 0.5.6
+
+* Fix for regression when people were using numbers as names in source maps. See
+ #236.
+
+## 0.5.5
+
+* Fix "regression" of unsupported, implementation behavior that half the world
+ happens to have come to depend on. See #235.
+
+* Fix regression involving function hoisting in SpiderMonkey. See #233.
+
+## 0.5.4
+
+* Large performance improvements to source-map serialization. See #228 and #229.
+
+## 0.5.3
+
+* Do not include unnecessary distribution files. See
+ commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86.
+
+## 0.5.2
+
+* Include browser distributions of the library in package.json's `files`. See
+ issue #212.
+
+## 0.5.1
+
+* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See
+ ff05274becc9e6e1295ed60f3ea090d31d843379.
+
+## 0.5.0
+
+* Node 0.8 is no longer supported.
+
+* Use webpack instead of dryice for bundling.
+
+* Big speedups serializing source maps. See pull request #203.
+
+* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that
+ explicitly start with the source root. See issue #199.
+
+## 0.4.4
+
+* Fix an issue where using a `SourceMapGenerator` after having created a
+ `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See
+ issue #191.
+
+* Fix an issue with where `SourceMapGenerator` would mistakenly consider
+ different mappings as duplicates of each other and avoid generating them. See
+ issue #192.
+
+## 0.4.3
+
+* A very large number of performance improvements, particularly when parsing
+ source maps. Collectively about 75% of time shaved off of the source map
+ parsing benchmark!
+
+* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy
+ searching in the presence of a column option. See issue #177.
+
+* Fix a bug with joining a source and its source root when the source is above
+ the root. See issue #182.
+
+* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to
+ determine when all sources' contents are inlined into the source map. See
+ issue #190.
+
+## 0.4.2
+
+* Add an `.npmignore` file so that the benchmarks aren't pulled down by
+ dependent projects. Issue #169.
+
+* Add an optional `column` argument to
+ `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines
+ with no mappings. Issues #172 and #173.
+
+## 0.4.1
+
+* Fix accidentally defining a global variable. #170.
+
+## 0.4.0
+
+* The default direction for fuzzy searching was changed back to its original
+ direction. See #164.
+
+* There is now a `bias` option you can supply to `SourceMapConsumer` to control
+ the fuzzy searching direction. See #167.
+
+* About an 8% speed up in parsing source maps. See #159.
+
+* Added a benchmark for parsing and generating source maps.
+
+## 0.3.0
+
+* Change the default direction that searching for positions fuzzes when there is
+ not an exact match. See #154.
+
+* Support for environments using json2.js for JSON serialization. See #156.
+
+## 0.2.0
+
+* Support for consuming "indexed" source maps which do not have any remote
+ sections. See pull request #127. This introduces a minor backwards
+ incompatibility if you are monkey patching `SourceMapConsumer.prototype`
+ methods.
+
+## 0.1.43
+
+* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue
+ #148 for some discussion and issues #150, #151, and #152 for implementations.
+
+## 0.1.42
+
+* Fix an issue where `SourceNode`s from different versions of the source-map
+ library couldn't be used in conjunction with each other. See issue #142.
+
+## 0.1.41
+
+* Fix a bug with getting the source content of relative sources with a "./"
+ prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768).
+
+* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the
+ column span of each mapping.
+
+* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find
+ all generated positions associated with a given original source and line.
+
+## 0.1.40
+
+* Performance improvements for parsing source maps in SourceMapConsumer.
+
+## 0.1.39
+
+* Fix a bug where setting a source's contents to null before any source content
+ had been set before threw a TypeError. See issue #131.
+
+## 0.1.38
+
+* Fix a bug where finding relative paths from an empty path were creating
+ absolute paths. See issue #129.
+
+## 0.1.37
+
+* Fix a bug where if the source root was an empty string, relative source paths
+ would turn into absolute source paths. Issue #124.
+
+## 0.1.36
+
+* Allow the `names` mapping property to be an empty string. Issue #121.
+
+## 0.1.35
+
+* A third optional parameter was added to `SourceNode.fromStringWithSourceMap`
+ to specify a path that relative sources in the second parameter should be
+ relative to. Issue #105.
+
+* If no file property is given to a `SourceMapGenerator`, then the resulting
+ source map will no longer have a `null` file property. The property will
+ simply not exist. Issue #104.
+
+* Fixed a bug where consecutive newlines were ignored in `SourceNode`s.
+ Issue #116.
+
+## 0.1.34
+
+* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103.
+
+* Fix bug involving source contents and the
+ `SourceMapGenerator.prototype.applySourceMap`. Issue #100.
+
+## 0.1.33
+
+* Fix some edge cases surrounding path joining and URL resolution.
+
+* Add a third parameter for relative path to
+ `SourceMapGenerator.prototype.applySourceMap`.
+
+* Fix issues with mappings and EOLs.
+
+## 0.1.32
+
+* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns
+ (issue 92).
+
+* Fixed test runner to actually report number of failed tests as its process
+ exit code.
+
+* Fixed a typo when reporting bad mappings (issue 87).
+
+## 0.1.31
+
+* Delay parsing the mappings in SourceMapConsumer until queried for a source
+ location.
+
+* Support Sass source maps (which at the time of writing deviate from the spec
+ in small ways) in SourceMapConsumer.
+
+## 0.1.30
+
+* Do not join source root with a source, when the source is a data URI.
+
+* Extend the test runner to allow running single specific test files at a time.
+
+* Performance improvements in `SourceNode.prototype.walk` and
+ `SourceMapConsumer.prototype.eachMapping`.
+
+* Source map browser builds will now work inside Workers.
+
+* Better error messages when attempting to add an invalid mapping to a
+ `SourceMapGenerator`.
+
+## 0.1.29
+
+* Allow duplicate entries in the `names` and `sources` arrays of source maps
+ (usually from TypeScript) we are parsing. Fixes github issue 72.
+
+## 0.1.28
+
+* Skip duplicate mappings when creating source maps from SourceNode; github
+ issue 75.
+
+## 0.1.27
+
+* Don't throw an error when the `file` property is missing in SourceMapConsumer,
+ we don't use it anyway.
+
+## 0.1.26
+
+* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70.
+
+## 0.1.25
+
+* Make compatible with browserify
+
+## 0.1.24
+
+* Fix issue with absolute paths and `file://` URIs. See
+ https://bugzilla.mozilla.org/show_bug.cgi?id=885597
+
+## 0.1.23
+
+* Fix issue with absolute paths and sourcesContent, github issue 64.
+
+## 0.1.22
+
+* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21.
+
+## 0.1.21
+
+* Fixed handling of sources that start with a slash so that they are relative to
+ the source root's host.
+
+## 0.1.20
+
+* Fixed github issue #43: absolute URLs aren't joined with the source root
+ anymore.
+
+## 0.1.19
+
+* Using Travis CI to run tests.
+
+## 0.1.18
+
+* Fixed a bug in the handling of sourceRoot.
+
+## 0.1.17
+
+* Added SourceNode.fromStringWithSourceMap.
+
+## 0.1.16
+
+* Added missing documentation.
+
+* Fixed the generating of empty mappings in SourceNode.
+
+## 0.1.15
+
+* Added SourceMapGenerator.applySourceMap.
+
+## 0.1.14
+
+* The sourceRoot is now handled consistently.
+
+## 0.1.13
+
+* Added SourceMapGenerator.fromSourceMap.
+
+## 0.1.12
+
+* SourceNode now generates empty mappings too.
+
+## 0.1.11
+
+* Added name support to SourceNode.
+
+## 0.1.10
+
+* Added sourcesContent support to the customer and generator.
diff --git a/node_modules/source-map/LICENSE b/node_modules/source-map/LICENSE
new file mode 100644
index 00000000..ed1b7cf2
--- /dev/null
+++ b/node_modules/source-map/LICENSE
@@ -0,0 +1,28 @@
+
+Copyright (c) 2009-2011, Mozilla Foundation and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the names of the Mozilla Foundation nor the names of project
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/source-map/README.md b/node_modules/source-map/README.md
new file mode 100644
index 00000000..fea4beb1
--- /dev/null
+++ b/node_modules/source-map/README.md
@@ -0,0 +1,742 @@
+# Source Map
+
+[](https://travis-ci.org/mozilla/source-map)
+
+[](https://www.npmjs.com/package/source-map)
+
+This is a library to generate and consume the source map format
+[described here][format].
+
+[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+
+## Use with Node
+
+ $ npm install source-map
+
+## Use on the Web
+
+
+
+--------------------------------------------------------------------------------
+
+
+
+
+
+## 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. Line numbers in
+ this library are 1-based (note that the underlying source map
+ specification uses 0-based line numbers -- this library handles the
+ translation).
+
+* `column`: The column number in the generated source. Column numbers
+ in this library are 0-based.
+
+* `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. The line number is 1-based.
+
+* `column`: The column number in the original source, or null if this
+ information is not available. The column number is 0-based.
+
+* `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. The line number is
+ 1-based.
+
+* `column`: The column number in the original source. The column
+ number is 0-based.
+
+and an object is returned with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```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. The line number is
+ 1-based.
+
+* `column`: Optional. The column number in the original source. The
+ column number is 0-based.
+
+and an array of objects is returned, each with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```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. The line number is 1-based.
+
+* `column`: The original column number associated with this source node, or null
+ if it isn't associated with an original column. The column number
+ is 0-based.
+
+* `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 00000000..aad0620d
--- /dev/null
+++ b/node_modules/source-map/dist/source-map.debug.js
@@ -0,0 +1,3234 @@
+(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 sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ 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+))?(.*)$/;
+ 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) === '/' || urlRegexp.test(aPath);
+ };
+
+ /**
+ * 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 = 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 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(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 = 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.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ 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;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+
+
+/***/ }),
+/* 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, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ }
+
+ SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+ }
+
+ /**
+ * 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', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype.__originalMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ 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);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ 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. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ 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)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ 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 first 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;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ 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);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ 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._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+ }
+
+ BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ 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;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // 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._absoluteSources.slice();
+ }
+ });
+
+ /**
+ * 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. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - 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. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - 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);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ 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;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ 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 = relativeSource.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("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // 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('"' + relativeSource + '" 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. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - 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. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ 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 first 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;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ 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'), aSourceMapURL)
+ }
+ });
+ }
+
+ 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. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * 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. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - 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. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ 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._findSourceIndex(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);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJC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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/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 00000000..b4eb0874
--- /dev/null
+++ b/node_modules/source-map/dist/source-map.js
@@ -0,0 +1,3233 @@
+(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 sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ 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+))?(.*)$/;
+ 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) === '/' || urlRegexp.test(aPath);
+ };
+
+ /**
+ * 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 = 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 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(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 = 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.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ 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;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+
+
+/***/ }),
+/* 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, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ }
+
+ SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+ }
+
+ /**
+ * 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', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype.__originalMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ 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);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ 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. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ 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)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ 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 first 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;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ 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);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ 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._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+ }
+
+ BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ 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;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // 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._absoluteSources.slice();
+ }
+ });
+
+ /**
+ * 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. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - 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. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - 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);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ 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;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ 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 = relativeSource.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("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // 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('"' + relativeSource + '" 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. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - 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. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ 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 first 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;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ 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'), aSourceMapURL)
+ }
+ });
+ }
+
+ 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. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * 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. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - 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. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ 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._findSourceIndex(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);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ 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 00000000..c7c72dad
--- /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(t){var o=t;null!==n&&(o=i.relative(n,t)),r._sources.has(o)||r._sources.add(o);var s=e.sourceContentFor(t);null!=s&&r.setSourceContent(t,s)}),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(y))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=f(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:f(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=f(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:f(e.name,n.name)))))}function f(e,n){return e===n?0:null===e?1:null===n?-1: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)))))}function m(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}function _(e,n,r){if(n=n||"",e&&("/"!==e[e.length-1]&&"/"!==n[0]&&(e+="/"),n=e+n),r){var a=t(r);if(!a)throw new Error("sourceMapURL could not be parsed");if(a.path){var u=a.path.lastIndexOf("/");u>=0&&(a.path=a.path.substring(0,u+1))}n=s(o(a),n)}return i(n)}n.getArg=r;var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,y=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||v.test(e)},n.relative=a;var C=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=C?u:l,n.fromSetString=C?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d,n.parseSourceMapInput=m,n.computeSourceURL=_},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,n){var r=e;return"string"==typeof e&&(r=a.parseSourceMapInput(e)),null!=r.sections?new s(r,n):new o(r,n)}function o(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var t=a.getArg(r,"version"),o=a.getArg(r,"sources"),i=a.getArg(r,"names",[]),s=a.getArg(r,"sourceRoot",null),u=a.getArg(r,"sourcesContent",null),c=a.getArg(r,"mappings"),g=a.getArg(r,"file",null);if(t!=this._version)throw new Error("Unsupported version: "+t);s&&(s=a.normalize(s)),o=o.map(String).map(a.normalize).map(function(e){return s&&a.isAbsolute(s)&&a.isAbsolute(e)?a.relative(s,e):e}),this._names=l.fromArray(i.map(String),!0),this._sources=l.fromArray(o,!0),this._absoluteSources=this._sources.toArray().map(function(e){return a.computeSourceURL(s,e,n)}),this.sourceRoot=s,this.sourcesContent=u,this._mappings=c,this._sourceMapURL=n,this.file=g}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var o=a.getArg(r,"version"),i=a.getArg(r,"sections");if(o!=this._version)throw new Error("Unsupported version: "+o);this._sources=new l,this._names=new l;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var r=a.getArg(e,"offset"),o=a.getArg(r,"line"),i=a.getArg(r,"column");if(o=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.prototype._findSourceIndex=function(e){var n=e;if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);var r;for(r=0;r1&&(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])),A.push(r),"number"==typeof r.originalLine&&S.push(r)}g(A,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=A,g(S,a.compareByOriginalPositions),this.__originalMappings=S},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),i=a.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));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;var r=this._findSourceIndex(e);if(r>=0)return this.sourcesContent[r];var t=e;null!=this.sourceRoot&&(t=a.relative(this.sourceRoot,t));var o;if(null!=this.sourceRoot&&(o=a.urlParse(this.sourceRoot))){var i=t.replace(/^file:\/\//,"");if("file"==o.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!o.path||"/"==o.path)&&this._sources.has("/"+t))return this.sourcesContent[this._sources.indexOf("/"+t)]}if(n)return null;throw new Error('"'+t+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};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+))?(.*)$/;\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) === '/' || urlRegexp.test(aPath);\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 = 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 || 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 strcmp(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 = 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.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 === null) {\n\t return 1; // aStr2 !== null\n\t }\n\t\n\t if (aStr2 === null) {\n\t return -1; // aStr1 !== null\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\t\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\t\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t sourceURL = sourceURL || '';\n\t\n\t if (sourceRoot) {\n\t // This follows what Chrome does.\n\t if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t sourceRoot += '/';\n\t }\n\t // The spec says:\n\t // Line 4: An optional source root, useful for relocating source\n\t // files on a server or removing repeated values in the\n\t // “sources” entry. This value is prepended to the individual\n\t // entries in the “source” field.\n\t sourceURL = sourceRoot + sourceURL;\n\t }\n\t\n\t // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t // a parameter. This mode is still somewhat supported, which is why\n\t // this code block is conditional. However, it's preferable to pass\n\t // the source map URL to SourceMapConsumer, so that this function\n\t // can implement the source URL resolution algorithm as outlined in\n\t // the spec. This block is basically the equivalent of:\n\t // new URL(sourceURL, sourceMapURL).toString()\n\t // ... except it avoids using URL, which wasn't available in the\n\t // older releases of node still supported by this library.\n\t //\n\t // The spec says:\n\t // If the sources are not absolute URLs after prepending of the\n\t // “sourceRoot”, the sources are resolved relative to the\n\t // SourceMap (like resolving script src in a html document).\n\t if (sourceMapURL) {\n\t var parsed = urlParse(sourceMapURL);\n\t if (!parsed) {\n\t throw new Error(\"sourceMapURL could not be parsed\");\n\t }\n\t if (parsed.path) {\n\t // Strip the last path component, but keep the \"/\".\n\t var index = parsed.path.lastIndexOf('/');\n\t if (index >= 0) {\n\t parsed.path = parsed.path.substring(0, index + 1);\n\t }\n\t }\n\t sourceURL = join(urlGenerate(parsed), sourceURL);\n\t }\n\t\n\t return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\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, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\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 configurable: true,\n\t enumerable: true,\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 configurable: true,\n\t enumerable: true,\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 source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\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. The line number is 1-based.\n\t * - column: Optional. the column number in the original source.\n\t * The column number is 0-based.\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. The\n\t * line number is 1-based.\n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\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 needle.source = this._findSourceIndex(needle.source);\n\t if (needle.source < 0) {\n\t return [];\n\t }\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 first 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 * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found. This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\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 if (sourceRoot) {\n\t sourceRoot = util.normalize(sourceRoot);\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._absoluteSources = this._sources.toArray().map(function (s) {\n\t return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t });\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this._sourceMapURL = aSourceMapURL;\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 * Utility function to find the index of a source. Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t var relativeSource = aSource;\n\t if (this.sourceRoot != null) {\n\t relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t }\n\t\n\t if (this._sources.has(relativeSource)) {\n\t return this._sources.indexOf(relativeSource);\n\t }\n\t\n\t // Maybe aSource is an absolute URL as returned by |sources|. In\n\t // this case we can't simply undo the transform.\n\t var i;\n\t for (i = 0; i < this._absoluteSources.length; ++i) {\n\t if (this._absoluteSources[i] == aSource) {\n\t return i;\n\t }\n\t }\n\t\n\t return -1;\n\t};\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 * @param String aSourceMapURL\n\t * The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\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 smc._sourceMapURL = aSourceMapURL;\n\t smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t });\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._absoluteSources.slice();\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. The line number\n\t * is 1-based.\n\t * - column: The column number in the generated source. The column\n\t * number is 0-based.\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. The\n\t * line number is 1-based.\n\t * - column: The column number in the original source, or null. The\n\t * column number is 0-based.\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 source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\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 var index = this._findSourceIndex(aSource);\n\t if (index >= 0) {\n\t return this.sourcesContent[index];\n\t }\n\t\n\t var relativeSource = aSource;\n\t if (this.sourceRoot != null) {\n\t relativeSource = util.relative(this.sourceRoot, relativeSource);\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 = relativeSource.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(\"/\" + relativeSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\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('\"' + relativeSource + '\" 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. The line number\n\t * is 1-based.\n\t * - column: The column number in the original source. The column\n\t * number is 0-based.\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. The\n\t * line number is 1-based.\n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t source = this._findSourceIndex(source);\n\t if (source < 0) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\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 first 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 * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found. This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\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'), aSourceMapURL)\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. The line number\n\t * is 1-based.\n\t * - column: The column number in the generated source. The column\n\t * number is 0-based.\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. The\n\t * line number is 1-based.\n\t * - column: The column number in the original source, or null. The\n\t * column number is 0-based.\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. The line number\n\t * is 1-based.\n\t * - column: The column number in the original source. The column\n\t * number is 0-based.\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. The\n\t * line number is 1-based. \n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\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._findSourceIndex(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 source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = null;\n\t if (mapping.name) {\n\t name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t }\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 0fd5815da764db5fb9fe","/*\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 sourceRelative = sourceFile;\n if (sourceRoot !== null) {\n sourceRelative = util.relative(sourceRoot, sourceFile);\n }\n\n if (!generator._sources.has(sourceRelative)) {\n generator._sources.add(sourceRelative);\n }\n\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+))?(.*)$/;\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) === '/' || urlRegexp.test(aPath);\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 = 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 || 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 strcmp(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 = 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.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 === null) {\n return 1; // aStr2 !== null\n }\n\n if (aStr2 === null) {\n return -1; // aStr1 !== null\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 * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n sourceURL = sourceURL || '';\n\n if (sourceRoot) {\n // This follows what Chrome does.\n if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n sourceRoot += '/';\n }\n // The spec says:\n // Line 4: An optional source root, useful for relocating source\n // files on a server or removing repeated values in the\n // “sources” entry. This value is prepended to the individual\n // entries in the “source” field.\n sourceURL = sourceRoot + sourceURL;\n }\n\n // Historically, SourceMapConsumer did not take the sourceMapURL as\n // a parameter. This mode is still somewhat supported, which is why\n // this code block is conditional. However, it's preferable to pass\n // the source map URL to SourceMapConsumer, so that this function\n // can implement the source URL resolution algorithm as outlined in\n // the spec. This block is basically the equivalent of:\n // new URL(sourceURL, sourceMapURL).toString()\n // ... except it avoids using URL, which wasn't available in the\n // older releases of node still supported by this library.\n //\n // The spec says:\n // If the sources are not absolute URLs after prepending of the\n // “sourceRoot”, the sources are resolved relative to the\n // SourceMap (like resolving script src in a html document).\n if (sourceMapURL) {\n var parsed = urlParse(sourceMapURL);\n if (!parsed) {\n throw new Error(\"sourceMapURL could not be parsed\");\n }\n if (parsed.path) {\n // Strip the last path component, but keep the \"/\".\n var index = parsed.path.lastIndexOf('/');\n if (index >= 0) {\n parsed.path = parsed.path.substring(0, index + 1);\n }\n }\n sourceURL = join(urlGenerate(parsed), sourceURL);\n }\n\n return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\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, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\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 configurable: true,\n enumerable: true,\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 configurable: true,\n enumerable: true,\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 source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\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. The line number is 1-based.\n * - column: Optional. the column number in the original source.\n * The column number is 0-based.\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. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\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 needle.source = this._findSourceIndex(needle.source);\n if (needle.source < 0) {\n return [];\n }\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 first 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 * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\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 if (sourceRoot) {\n sourceRoot = util.normalize(sourceRoot);\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._absoluteSources = this._sources.toArray().map(function (s) {\n return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n });\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this._sourceMapURL = aSourceMapURL;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source. Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n if (this._sources.has(relativeSource)) {\n return this._sources.indexOf(relativeSource);\n }\n\n // Maybe aSource is an absolute URL as returned by |sources|. In\n // this case we can't simply undo the transform.\n var i;\n for (i = 0; i < this._absoluteSources.length; ++i) {\n if (this._absoluteSources[i] == aSource) {\n return i;\n }\n }\n\n return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @param String aSourceMapURL\n * The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\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 smc._sourceMapURL = aSourceMapURL;\n smc._absoluteSources = smc._sources.toArray().map(function (s) {\n return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n });\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._absoluteSources.slice();\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. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\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. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\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 source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\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 var index = this._findSourceIndex(aSource);\n if (index >= 0) {\n return this.sourcesContent[index];\n }\n\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\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 = relativeSource.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(\"/\" + relativeSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\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('\"' + relativeSource + '\" 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. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\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. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n source = this._findSourceIndex(source);\n if (source < 0) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\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 first 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 * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\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'), aSourceMapURL)\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. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\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. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\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. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based. \n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\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._findSourceIndex(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 source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = null;\n if (mapping.name) {\n name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n }\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 00000000..fbd5c81c
--- /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 00000000..612b4040
--- /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 00000000..8aa86b30
--- /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 00000000..010ac941
--- /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 00000000..06d1274a
--- /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 00000000..6a7caadb
--- /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 00000000..7b99d1da
--- /dev/null
+++ b/node_modules/source-map/lib/source-map-consumer.js
@@ -0,0 +1,1145 @@
+/* -*- 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, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+}
+
+SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+}
+
+/**
+ * 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', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+});
+
+SourceMapConsumer.prototype.__originalMappings = null;
+Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ 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);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ 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. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+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)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ 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 first 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;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ 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);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ 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._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+}
+
+BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+/**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+};
+
+/**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ 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;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // 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._absoluteSources.slice();
+ }
+});
+
+/**
+ * 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. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - 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. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - 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);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ 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;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ 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 = relativeSource.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("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // 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('"' + relativeSource + '" 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. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - 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. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ 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 first 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;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ 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'), aSourceMapURL)
+ }
+ });
+}
+
+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. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * 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. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - 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. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+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._findSourceIndex(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);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ 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 00000000..508bcfbb
--- /dev/null
+++ b/node_modules/source-map/lib/source-map-generator.js
@@ -0,0 +1,425 @@
+/* -*- 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 sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ 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 00000000..8bcdbe38
--- /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 00000000..3ca92e56
--- /dev/null
+++ b/node_modules/source-map/lib/util.js
@@ -0,0 +1,488 @@
+/* -*- 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+))?(.*)$/;
+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) === '/' || urlRegexp.test(aPath);
+};
+
+/**
+ * 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 = 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 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(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 = 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.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ 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;
+
+/**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+}
+exports.parseSourceMapInput = parseSourceMapInput;
+
+/**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+}
+exports.computeSourceURL = computeSourceURL;
diff --git a/node_modules/source-map/package.json b/node_modules/source-map/package.json
new file mode 100644
index 00000000..c900df50
--- /dev/null
+++ b/node_modules/source-map/package.json
@@ -0,0 +1,212 @@
+{
+ "_from": "source-map@~0.6.1",
+ "_id": "source-map@0.6.1",
+ "_inBundle": false,
+ "_integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "_location": "/source-map",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "source-map@~0.6.1",
+ "name": "source-map",
+ "escapedName": "source-map",
+ "rawSpec": "~0.6.1",
+ "saveSpec": null,
+ "fetchSpec": "~0.6.1"
+ },
+ "_requiredBy": [
+ "/escodegen"
+ ],
+ "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "_shasum": "74722af32e9614e9c287a8d0bbde48b5e2f1a263",
+ "_spec": "source-map@~0.6.1",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\escodegen",
+ "author": {
+ "name": "Nick Fitzgerald",
+ "email": "nfitzgerald@mozilla.com"
+ },
+ "bugs": {
+ "url": "https://github.com/mozilla/source-map/issues"
+ },
+ "bundleDependencies": false,
+ "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"
+ }
+ ],
+ "deprecated": false,
+ "description": "Generates and consumes source maps",
+ "devDependencies": {
+ "doctoc": "^0.15.0",
+ "webpack": "^1.12.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "source-map.js",
+ "source-map.d.ts",
+ "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.6.1"
+}
diff --git a/node_modules/source-map/source-map.d.ts b/node_modules/source-map/source-map.d.ts
new file mode 100644
index 00000000..8f972b0c
--- /dev/null
+++ b/node_modules/source-map/source-map.d.ts
@@ -0,0 +1,98 @@
+export interface StartOfSourceMap {
+ file?: string;
+ sourceRoot?: string;
+}
+
+export interface RawSourceMap extends StartOfSourceMap {
+ version: string;
+ sources: string[];
+ names: string[];
+ sourcesContent?: string[];
+ mappings: string;
+}
+
+export interface Position {
+ line: number;
+ column: number;
+}
+
+export interface LineRange extends Position {
+ lastColumn: number;
+}
+
+export interface FindPosition extends Position {
+ // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND
+ bias?: number;
+}
+
+export interface SourceFindPosition extends FindPosition {
+ source: string;
+}
+
+export interface MappedPosition extends Position {
+ source: string;
+ name?: string;
+}
+
+export interface MappingItem {
+ source: string;
+ generatedLine: number;
+ generatedColumn: number;
+ originalLine: number;
+ originalColumn: number;
+ name: string;
+}
+
+export class SourceMapConsumer {
+ static GENERATED_ORDER: number;
+ static ORIGINAL_ORDER: number;
+
+ static GREATEST_LOWER_BOUND: number;
+ static LEAST_UPPER_BOUND: number;
+
+ constructor(rawSourceMap: RawSourceMap);
+ computeColumnSpans(): void;
+ originalPositionFor(generatedPosition: FindPosition): MappedPosition;
+ generatedPositionFor(originalPosition: SourceFindPosition): LineRange;
+ allGeneratedPositionsFor(originalPosition: MappedPosition): Position[];
+ hasContentsOfAllSources(): boolean;
+ sourceContentFor(source: string, returnNullOnMissing?: boolean): string;
+ eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void;
+}
+
+export interface Mapping {
+ generated: Position;
+ original: Position;
+ source: string;
+ name?: string;
+}
+
+export class SourceMapGenerator {
+ constructor(startOfSourceMap?: StartOfSourceMap);
+ static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator;
+ addMapping(mapping: Mapping): void;
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+ applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void;
+ toString(): string;
+}
+
+export interface CodeWithSourceMap {
+ code: string;
+ map: SourceMapGenerator;
+}
+
+export class SourceNode {
+ constructor();
+ constructor(line: number, column: number, source: string);
+ constructor(line: number, column: number, source: string, chunk?: string, name?: string);
+ static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode;
+ add(chunk: string): void;
+ prepend(chunk: string): void;
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+ walk(fn: (chunk: string, mapping: MappedPosition) => void): void;
+ walkSourceContents(fn: (file: string, content: string) => void): void;
+ join(sep: string): SourceNode;
+ replaceRight(pattern: string, replacement: string): SourceNode;
+ toString(): string;
+ toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap;
+}
diff --git a/node_modules/source-map/source-map.js b/node_modules/source-map/source-map.js
new file mode 100644
index 00000000..bc88fe82
--- /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/static-eval/.travis.yml b/node_modules/static-eval/.travis.yml
new file mode 100644
index 00000000..cc4dba29
--- /dev/null
+++ b/node_modules/static-eval/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
diff --git a/node_modules/static-eval/LICENSE b/node_modules/static-eval/LICENSE
new file mode 100644
index 00000000..ee27ba4b
--- /dev/null
+++ b/node_modules/static-eval/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/static-eval/example/eval.js b/node_modules/static-eval/example/eval.js
new file mode 100644
index 00000000..8a8cf4e8
--- /dev/null
+++ b/node_modules/static-eval/example/eval.js
@@ -0,0 +1,7 @@
+var evaluate = require('static-eval');
+var parse = require('esprima').parse;
+
+var src = process.argv.slice(2).join(' ');
+var ast = parse(src).body[0].expression;
+
+console.log(evaluate(ast));
diff --git a/node_modules/static-eval/example/vars.js b/node_modules/static-eval/example/vars.js
new file mode 100644
index 00000000..78198b07
--- /dev/null
+++ b/node_modules/static-eval/example/vars.js
@@ -0,0 +1,11 @@
+var evaluate = require('../');
+var parse = require('esprima').parse;
+
+var src = '[1,2,3+4*10+n,foo(3+5),obj[""+"x"].y]';
+var ast = parse(src).body[0].expression;
+
+console.log(evaluate(ast, {
+ n: 6,
+ foo: function (x) { return x * 100 },
+ obj: { x: { y: 555 } }
+}));
diff --git a/node_modules/static-eval/index.js b/node_modules/static-eval/index.js
new file mode 100644
index 00000000..ea161866
--- /dev/null
+++ b/node_modules/static-eval/index.js
@@ -0,0 +1,178 @@
+var unparse = require('escodegen').generate;
+
+module.exports = function (ast, vars) {
+ if (!vars) vars = {};
+ var FAIL = {};
+
+ var result = (function walk (node, scopeVars) {
+ if (node.type === 'Literal') {
+ return node.value;
+ }
+ else if (node.type === 'UnaryExpression'){
+ var val = walk(node.argument)
+ if (node.operator === '+') return +val
+ if (node.operator === '-') return -val
+ if (node.operator === '~') return ~val
+ if (node.operator === '!') return !val
+ return FAIL
+ }
+ else if (node.type === 'ArrayExpression') {
+ var xs = [];
+ for (var i = 0, l = node.elements.length; i < l; i++) {
+ var x = walk(node.elements[i]);
+ if (x === FAIL) return FAIL;
+ xs.push(x);
+ }
+ return xs;
+ }
+ else if (node.type === 'ObjectExpression') {
+ var obj = {};
+ for (var i = 0; i < node.properties.length; i++) {
+ var prop = node.properties[i];
+ var value = prop.value === null
+ ? prop.value
+ : walk(prop.value)
+ ;
+ if (value === FAIL) return FAIL;
+ obj[prop.key.value || prop.key.name] = value;
+ }
+ return obj;
+ }
+ else if (node.type === 'BinaryExpression' ||
+ node.type === 'LogicalExpression') {
+ var l = walk(node.left);
+ if (l === FAIL) return FAIL;
+ var r = walk(node.right);
+ if (r === FAIL) return FAIL;
+
+ var op = node.operator;
+ if (op === '==') return l == r;
+ if (op === '===') return l === r;
+ if (op === '!=') return l != r;
+ if (op === '!==') return l !== r;
+ if (op === '+') return l + r;
+ if (op === '-') return l - r;
+ if (op === '*') return l * r;
+ if (op === '/') return l / r;
+ if (op === '%') return l % r;
+ if (op === '<') return l < r;
+ if (op === '<=') return l <= r;
+ if (op === '>') return l > r;
+ if (op === '>=') return l >= r;
+ if (op === '|') return l | r;
+ if (op === '&') return l & r;
+ if (op === '^') return l ^ r;
+ if (op === '&&') return l && r;
+ if (op === '||') return l || r;
+
+ return FAIL;
+ }
+ else if (node.type === 'Identifier') {
+ if ({}.hasOwnProperty.call(vars, node.name)) {
+ return vars[node.name];
+ }
+ else return FAIL;
+ }
+ else if (node.type === 'ThisExpression') {
+ if ({}.hasOwnProperty.call(vars, 'this')) {
+ return vars['this'];
+ }
+ else return FAIL;
+ }
+ else if (node.type === 'CallExpression') {
+ var callee = walk(node.callee);
+ if (callee === FAIL) return FAIL;
+ if (typeof callee !== 'function') return FAIL;
+
+ var ctx = node.callee.object ? walk(node.callee.object) : FAIL;
+ if (ctx === FAIL) ctx = null;
+
+ var args = [];
+ for (var i = 0, l = node.arguments.length; i < l; i++) {
+ var x = walk(node.arguments[i]);
+ if (x === FAIL) return FAIL;
+ args.push(x);
+ }
+ return callee.apply(ctx, args);
+ }
+ else if (node.type === 'MemberExpression') {
+ var obj = walk(node.object);
+ // do not allow access to methods on Function
+ if((obj === FAIL) || (typeof obj == 'function')){
+ return FAIL;
+ }
+ if (node.property.type === 'Identifier') {
+ return obj[node.property.name];
+ }
+ var prop = walk(node.property);
+ if (prop === FAIL) return FAIL;
+ return obj[prop];
+ }
+ else if (node.type === 'ConditionalExpression') {
+ var val = walk(node.test)
+ if (val === FAIL) return FAIL;
+ return val ? walk(node.consequent) : walk(node.alternate)
+ }
+ else if (node.type === 'ExpressionStatement') {
+ var val = walk(node.expression)
+ if (val === FAIL) return FAIL;
+ return val;
+ }
+ else if (node.type === 'ReturnStatement') {
+ return walk(node.argument)
+ }
+ else if (node.type === 'FunctionExpression') {
+
+ var bodies = node.body.body;
+
+ // Create a "scope" for our arguments
+ var oldVars = {};
+ Object.keys(vars).forEach(function(element){
+ oldVars[element] = vars[element];
+ })
+
+ for(var i=0; i
+
+`type-check` is a library which allows you to check the types of JavaScript values at runtime with a Haskell like type syntax. It is great for checking external input, for testing, or even for adding a bit of safety to your internal code. It is a major component of [levn](https://github.com/gkz/levn). MIT license. Version 0.3.2. Check out the [demo](http://gkz.github.io/type-check/).
+
+For updates on `type-check`, [follow me on twitter](https://twitter.com/gkzahariev).
+
+ npm install type-check
+
+## Quick Examples
+
+```js
+// Basic types:
+var typeCheck = require('type-check').typeCheck;
+typeCheck('Number', 1); // true
+typeCheck('Number', 'str'); // false
+typeCheck('Error', new Error); // true
+typeCheck('Undefined', undefined); // true
+
+// Comment
+typeCheck('count::Number', 1); // true
+
+// One type OR another type:
+typeCheck('Number | String', 2); // true
+typeCheck('Number | String', 'str'); // true
+
+// Wildcard, matches all types:
+typeCheck('*', 2) // true
+
+// Array, all elements of a single type:
+typeCheck('[Number]', [1, 2, 3]); // true
+typeCheck('[Number]', [1, 'str', 3]); // false
+
+// Tuples, or fixed length arrays with elements of different types:
+typeCheck('(String, Number)', ['str', 2]); // true
+typeCheck('(String, Number)', ['str']); // false
+typeCheck('(String, Number)', ['str', 2, 5]); // false
+
+// Object properties:
+typeCheck('{x: Number, y: Boolean}', {x: 2, y: false}); // true
+typeCheck('{x: Number, y: Boolean}', {x: 2}); // false
+typeCheck('{x: Number, y: Maybe Boolean}', {x: 2}); // true
+typeCheck('{x: Number, y: Boolean}', {x: 2, y: false, z: 3}); // false
+typeCheck('{x: Number, y: Boolean, ...}', {x: 2, y: false, z: 3}); // true
+
+// A particular type AND object properties:
+typeCheck('RegExp{source: String, ...}', /re/i); // true
+typeCheck('RegExp{source: String, ...}', {source: 're'}); // false
+
+// Custom types:
+var opt = {customTypes:
+ {Even: { typeOf: 'Number', validate: function(x) { return x % 2 === 0; }}}};
+typeCheck('Even', 2, opt); // true
+
+// Nested:
+var type = '{a: (String, [Number], {y: Array, ...}), b: Error{message: String, ...}}'
+typeCheck(type, {a: ['hi', [1, 2, 3], {y: [1, 'ms']}], b: new Error('oh no')}); // true
+```
+
+Check out the [type syntax format](#syntax) and [guide](#guide).
+
+## Usage
+
+`require('type-check');` returns an object that exposes four properties. `VERSION` is the current version of the library as a string. `typeCheck`, `parseType`, and `parsedTypeCheck` are functions.
+
+```js
+// typeCheck(type, input, options);
+typeCheck('Number', 2); // true
+
+// parseType(type);
+var parsedType = parseType('Number'); // object
+
+// parsedTypeCheck(parsedType, input, options);
+parsedTypeCheck(parsedType, 2); // true
+```
+
+### typeCheck(type, input, options)
+
+`typeCheck` checks a JavaScript value `input` against `type` written in the [type format](#type-format) (and taking account the optional `options`) and returns whether the `input` matches the `type`.
+
+##### arguments
+* type - `String` - the type written in the [type format](#type-format) which to check against
+* input - `*` - any JavaScript value, which is to be checked against the type
+* options - `Maybe Object` - an optional parameter specifying additional options, currently the only available option is specifying [custom types](#custom-types)
+
+##### returns
+`Boolean` - whether the input matches the type
+
+##### example
+```js
+typeCheck('Number', 2); // true
+```
+
+### parseType(type)
+
+`parseType` parses string `type` written in the [type format](#type-format) into an object representing the parsed type.
+
+##### arguments
+* type - `String` - the type written in the [type format](#type-format) which to parse
+
+##### returns
+`Object` - an object in the parsed type format representing the parsed type
+
+##### example
+```js
+parseType('Number'); // [{type: 'Number'}]
+```
+### parsedTypeCheck(parsedType, input, options)
+
+`parsedTypeCheck` checks a JavaScript value `input` against parsed `type` in the parsed type format (and taking account the optional `options`) and returns whether the `input` matches the `type`. Use this in conjunction with `parseType` if you are going to use a type more than once.
+
+##### arguments
+* type - `Object` - the type in the parsed type format which to check against
+* input - `*` - any JavaScript value, which is to be checked against the type
+* options - `Maybe Object` - an optional parameter specifying additional options, currently the only available option is specifying [custom types](#custom-types)
+
+##### returns
+`Boolean` - whether the input matches the type
+
+##### example
+```js
+parsedTypeCheck([{type: 'Number'}], 2); // true
+var parsedType = parseType('String');
+parsedTypeCheck(parsedType, 'str'); // true
+```
+
+
+## Type Format
+
+### Syntax
+
+White space is ignored. The root node is a __Types__.
+
+* __Identifier__ = `[\$\w]+` - a group of any lower or upper case letters, numbers, underscores, or dollar signs - eg. `String`
+* __Type__ = an `Identifier`, an `Identifier` followed by a `Structure`, just a `Structure`, or a wildcard `*` - eg. `String`, `Object{x: Number}`, `{x: Number}`, `Array{0: String, 1: Boolean, length: Number}`, `*`
+* __Types__ = optionally a comment (an `Indentifier` followed by a `::`), optionally the identifier `Maybe`, one or more `Type`, separated by `|` - eg. `Number`, `String | Date`, `Maybe Number`, `Maybe Boolean | String`
+* __Structure__ = `Fields`, or a `Tuple`, or an `Array` - eg. `{x: Number}`, `(String, Number)`, `[Date]`
+* __Fields__ = a `{`, followed one or more `Field` separated by a comma `,` (trailing comma `,` is permitted), optionally an `...` (always preceded by a comma `,`), followed by a `}` - eg. `{x: Number, y: String}`, `{k: Function, ...}`
+* __Field__ = an `Identifier`, followed by a colon `:`, followed by `Types` - eg. `x: Date | String`, `y: Boolean`
+* __Tuple__ = a `(`, followed by one or more `Types` separated by a comma `,` (trailing comma `,` is permitted), followed by a `)` - eg `(Date)`, `(Number, Date)`
+* __Array__ = a `[` followed by exactly one `Types` followed by a `]` - eg. `[Boolean]`, `[Boolean | Null]`
+
+### Guide
+
+`type-check` uses `Object.toString` to find out the basic type of a value. Specifically,
+
+```js
+{}.toString.call(VALUE).slice(8, -1)
+{}.toString.call(true).slice(8, -1) // 'Boolean'
+```
+A basic type, eg. `Number`, uses this check. This is much more versatile than using `typeof` - for example, with `document`, `typeof` produces `'object'` which isn't that useful, and our technique produces `'HTMLDocument'`.
+
+You may check for multiple types by separating types with a `|`. The checker proceeds from left to right, and passes if the value is any of the types - eg. `String | Boolean` first checks if the value is a string, and then if it is a boolean. If it is none of those, then it returns false.
+
+Adding a `Maybe` in front of a list of multiple types is the same as also checking for `Null` and `Undefined` - eg. `Maybe String` is equivalent to `Undefined | Null | String`.
+
+You may add a comment to remind you of what the type is for by following an identifier with a `::` before a type (or multiple types). The comment is simply thrown out.
+
+The wildcard `*` matches all types.
+
+There are three types of structures for checking the contents of a value: 'fields', 'tuple', and 'array'.
+
+If used by itself, a 'fields' structure will pass with any type of object as long as it is an instance of `Object` and the properties pass - this allows for duck typing - eg. `{x: Boolean}`.
+
+To check if the properties pass, and the value is of a certain type, you can specify the type - eg. `Error{message: String}`.
+
+If you want to make a field optional, you can simply use `Maybe` - eg. `{x: Boolean, y: Maybe String}` will still pass if `y` is undefined (or null).
+
+If you don't care if the value has properties beyond what you have specified, you can use the 'etc' operator `...` - eg. `{x: Boolean, ...}` will match an object with an `x` property that is a boolean, and with zero or more other properties.
+
+For an array, you must specify one or more types (separated by `|`) - it will pass for something of any length as long as each element passes the types provided - eg. `[Number]`, `[Number | String]`.
+
+A tuple checks for a fixed number of elements, each of a potentially different type. Each element is separated by a comma - eg. `(String, Number)`.
+
+An array and tuple structure check that the value is of type `Array` by default, but if another type is specified, they will check for that instead - eg. `Int32Array[Number]`. You can use the wildcard `*` to search for any type at all.
+
+Check out the [type precedence](https://github.com/zaboco/type-precedence) library for type-check.
+
+## Options
+
+Options is an object. It is an optional parameter to the `typeCheck` and `parsedTypeCheck` functions. The only current option is `customTypes`.
+
+
+### Custom Types
+
+__Example:__
+
+```js
+var options = {
+ customTypes: {
+ Even: {
+ typeOf: 'Number',
+ validate: function(x) {
+ return x % 2 === 0;
+ }
+ }
+ }
+};
+typeCheck('Even', 2, options); // true
+typeCheck('Even', 3, options); // false
+```
+
+`customTypes` allows you to set up custom types for validation. The value of this is an object. The keys of the object are the types you will be matching. Each value of the object will be an object having a `typeOf` property - a string, and `validate` property - a function.
+
+The `typeOf` property is the type the value should be, and `validate` is a function which should return true if the value is of that type. `validate` receives one parameter, which is the value that we are checking.
+
+## Technical About
+
+`type-check` is written in [LiveScript](http://livescript.net/) - a language that compiles to JavaScript. It also uses the [prelude.ls](http://preludels.com/) library.
diff --git a/node_modules/type-check/lib/check.js b/node_modules/type-check/lib/check.js
new file mode 100644
index 00000000..0504c8d2
--- /dev/null
+++ b/node_modules/type-check/lib/check.js
@@ -0,0 +1,126 @@
+// Generated by LiveScript 1.4.0
+(function(){
+ var ref$, any, all, isItNaN, types, defaultType, customTypes, toString$ = {}.toString;
+ ref$ = require('prelude-ls'), any = ref$.any, all = ref$.all, isItNaN = ref$.isItNaN;
+ types = {
+ Number: {
+ typeOf: 'Number',
+ validate: function(it){
+ return !isItNaN(it);
+ }
+ },
+ NaN: {
+ typeOf: 'Number',
+ validate: isItNaN
+ },
+ Int: {
+ typeOf: 'Number',
+ validate: function(it){
+ return !isItNaN(it) && it % 1 === 0;
+ }
+ },
+ Float: {
+ typeOf: 'Number',
+ validate: function(it){
+ return !isItNaN(it);
+ }
+ },
+ Date: {
+ typeOf: 'Date',
+ validate: function(it){
+ return !isItNaN(it.getTime());
+ }
+ }
+ };
+ defaultType = {
+ array: 'Array',
+ tuple: 'Array'
+ };
+ function checkArray(input, type){
+ return all(function(it){
+ return checkMultiple(it, type.of);
+ }, input);
+ }
+ function checkTuple(input, type){
+ var i, i$, ref$, len$, types;
+ i = 0;
+ for (i$ = 0, len$ = (ref$ = type.of).length; i$ < len$; ++i$) {
+ types = ref$[i$];
+ if (!checkMultiple(input[i], types)) {
+ return false;
+ }
+ i++;
+ }
+ return input.length <= i;
+ }
+ function checkFields(input, type){
+ var inputKeys, numInputKeys, k, numOfKeys, key, ref$, types;
+ inputKeys = {};
+ numInputKeys = 0;
+ for (k in input) {
+ inputKeys[k] = true;
+ numInputKeys++;
+ }
+ numOfKeys = 0;
+ for (key in ref$ = type.of) {
+ types = ref$[key];
+ if (!checkMultiple(input[key], types)) {
+ return false;
+ }
+ if (inputKeys[key]) {
+ numOfKeys++;
+ }
+ }
+ return type.subset || numInputKeys === numOfKeys;
+ }
+ function checkStructure(input, type){
+ if (!(input instanceof Object)) {
+ return false;
+ }
+ switch (type.structure) {
+ case 'fields':
+ return checkFields(input, type);
+ case 'array':
+ return checkArray(input, type);
+ case 'tuple':
+ return checkTuple(input, type);
+ }
+ }
+ function check(input, typeObj){
+ var type, structure, setting, that;
+ type = typeObj.type, structure = typeObj.structure;
+ if (type) {
+ if (type === '*') {
+ return true;
+ }
+ setting = customTypes[type] || types[type];
+ if (setting) {
+ return setting.typeOf === toString$.call(input).slice(8, -1) && setting.validate(input);
+ } else {
+ return type === toString$.call(input).slice(8, -1) && (!structure || checkStructure(input, typeObj));
+ }
+ } else if (structure) {
+ if (that = defaultType[structure]) {
+ if (that !== toString$.call(input).slice(8, -1)) {
+ return false;
+ }
+ }
+ return checkStructure(input, typeObj);
+ } else {
+ throw new Error("No type defined. Input: " + input + ".");
+ }
+ }
+ function checkMultiple(input, types){
+ if (toString$.call(types).slice(8, -1) !== 'Array') {
+ throw new Error("Types must be in an array. Input: " + input + ".");
+ }
+ return any(function(it){
+ return check(input, it);
+ }, types);
+ }
+ module.exports = function(parsedType, input, options){
+ options == null && (options = {});
+ customTypes = options.customTypes || {};
+ return checkMultiple(input, parsedType);
+ };
+}).call(this);
diff --git a/node_modules/type-check/lib/index.js b/node_modules/type-check/lib/index.js
new file mode 100644
index 00000000..f3316bab
--- /dev/null
+++ b/node_modules/type-check/lib/index.js
@@ -0,0 +1,16 @@
+// Generated by LiveScript 1.4.0
+(function(){
+ var VERSION, parseType, parsedTypeCheck, typeCheck;
+ VERSION = '0.3.2';
+ parseType = require('./parse-type');
+ parsedTypeCheck = require('./check');
+ typeCheck = function(type, input, options){
+ return parsedTypeCheck(parseType(type), input, options);
+ };
+ module.exports = {
+ VERSION: VERSION,
+ typeCheck: typeCheck,
+ parsedTypeCheck: parsedTypeCheck,
+ parseType: parseType
+ };
+}).call(this);
diff --git a/node_modules/type-check/lib/parse-type.js b/node_modules/type-check/lib/parse-type.js
new file mode 100644
index 00000000..5baf661f
--- /dev/null
+++ b/node_modules/type-check/lib/parse-type.js
@@ -0,0 +1,196 @@
+// Generated by LiveScript 1.4.0
+(function(){
+ var identifierRegex, tokenRegex;
+ identifierRegex = /[\$\w]+/;
+ function peek(tokens){
+ var token;
+ token = tokens[0];
+ if (token == null) {
+ throw new Error('Unexpected end of input.');
+ }
+ return token;
+ }
+ function consumeIdent(tokens){
+ var token;
+ token = peek(tokens);
+ if (!identifierRegex.test(token)) {
+ throw new Error("Expected text, got '" + token + "' instead.");
+ }
+ return tokens.shift();
+ }
+ function consumeOp(tokens, op){
+ var token;
+ token = peek(tokens);
+ if (token !== op) {
+ throw new Error("Expected '" + op + "', got '" + token + "' instead.");
+ }
+ return tokens.shift();
+ }
+ function maybeConsumeOp(tokens, op){
+ var token;
+ token = tokens[0];
+ if (token === op) {
+ return tokens.shift();
+ } else {
+ return null;
+ }
+ }
+ function consumeArray(tokens){
+ var types;
+ consumeOp(tokens, '[');
+ if (peek(tokens) === ']') {
+ throw new Error("Must specify type of Array - eg. [Type], got [] instead.");
+ }
+ types = consumeTypes(tokens);
+ consumeOp(tokens, ']');
+ return {
+ structure: 'array',
+ of: types
+ };
+ }
+ function consumeTuple(tokens){
+ var components;
+ components = [];
+ consumeOp(tokens, '(');
+ if (peek(tokens) === ')') {
+ throw new Error("Tuple must be of at least length 1 - eg. (Type), got () instead.");
+ }
+ for (;;) {
+ components.push(consumeTypes(tokens));
+ maybeConsumeOp(tokens, ',');
+ if (')' === peek(tokens)) {
+ break;
+ }
+ }
+ consumeOp(tokens, ')');
+ return {
+ structure: 'tuple',
+ of: components
+ };
+ }
+ function consumeFields(tokens){
+ var fields, subset, ref$, key, types;
+ fields = {};
+ consumeOp(tokens, '{');
+ subset = false;
+ for (;;) {
+ if (maybeConsumeOp(tokens, '...')) {
+ subset = true;
+ break;
+ }
+ ref$ = consumeField(tokens), key = ref$[0], types = ref$[1];
+ fields[key] = types;
+ maybeConsumeOp(tokens, ',');
+ if ('}' === peek(tokens)) {
+ break;
+ }
+ }
+ consumeOp(tokens, '}');
+ return {
+ structure: 'fields',
+ of: fields,
+ subset: subset
+ };
+ }
+ function consumeField(tokens){
+ var key, types;
+ key = consumeIdent(tokens);
+ consumeOp(tokens, ':');
+ types = consumeTypes(tokens);
+ return [key, types];
+ }
+ function maybeConsumeStructure(tokens){
+ switch (tokens[0]) {
+ case '[':
+ return consumeArray(tokens);
+ case '(':
+ return consumeTuple(tokens);
+ case '{':
+ return consumeFields(tokens);
+ }
+ }
+ function consumeType(tokens){
+ var token, wildcard, type, structure;
+ token = peek(tokens);
+ wildcard = token === '*';
+ if (wildcard || identifierRegex.test(token)) {
+ type = wildcard
+ ? consumeOp(tokens, '*')
+ : consumeIdent(tokens);
+ structure = maybeConsumeStructure(tokens);
+ if (structure) {
+ return structure.type = type, structure;
+ } else {
+ return {
+ type: type
+ };
+ }
+ } else {
+ structure = maybeConsumeStructure(tokens);
+ if (!structure) {
+ throw new Error("Unexpected character: " + token);
+ }
+ return structure;
+ }
+ }
+ function consumeTypes(tokens){
+ var lookahead, types, typesSoFar, typeObj, type;
+ if ('::' === peek(tokens)) {
+ throw new Error("No comment before comment separator '::' found.");
+ }
+ lookahead = tokens[1];
+ if (lookahead != null && lookahead === '::') {
+ tokens.shift();
+ tokens.shift();
+ }
+ types = [];
+ typesSoFar = {};
+ if ('Maybe' === peek(tokens)) {
+ tokens.shift();
+ types = [
+ {
+ type: 'Undefined'
+ }, {
+ type: 'Null'
+ }
+ ];
+ typesSoFar = {
+ Undefined: true,
+ Null: true
+ };
+ }
+ for (;;) {
+ typeObj = consumeType(tokens), type = typeObj.type;
+ if (!typesSoFar[type]) {
+ types.push(typeObj);
+ }
+ typesSoFar[type] = true;
+ if (!maybeConsumeOp(tokens, '|')) {
+ break;
+ }
+ }
+ return types;
+ }
+ tokenRegex = RegExp('\\.\\.\\.|::|->|' + identifierRegex.source + '|\\S', 'g');
+ module.exports = function(input){
+ var tokens, e;
+ if (!input.length) {
+ throw new Error('No type specified.');
+ }
+ tokens = input.match(tokenRegex) || [];
+ if (in$('->', tokens)) {
+ throw new Error("Function types are not supported.\ To validate that something is a function, you may use 'Function'.");
+ }
+ try {
+ return consumeTypes(tokens);
+ } catch (e$) {
+ e = e$;
+ throw new Error(e.message + " - Remaining tokens: " + JSON.stringify(tokens) + " - Initial input: '" + input + "'");
+ }
+ };
+ function in$(x, xs){
+ var i = -1, l = xs.length >>> 0;
+ while (++i < l) if (x === xs[i]) return true;
+ return false;
+ }
+}).call(this);
diff --git a/node_modules/type-check/package.json b/node_modules/type-check/package.json
new file mode 100644
index 00000000..75797308
--- /dev/null
+++ b/node_modules/type-check/package.json
@@ -0,0 +1,71 @@
+{
+ "_from": "type-check@~0.3.2",
+ "_id": "type-check@0.3.2",
+ "_inBundle": false,
+ "_integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "_location": "/type-check",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "type-check@~0.3.2",
+ "name": "type-check",
+ "escapedName": "type-check",
+ "rawSpec": "~0.3.2",
+ "saveSpec": null,
+ "fetchSpec": "~0.3.2"
+ },
+ "_requiredBy": [
+ "/levn",
+ "/optionator"
+ ],
+ "_resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "_shasum": "5884cab512cf1d355e3fb784f30804b2b520db72",
+ "_spec": "type-check@~0.3.2",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\optionator",
+ "author": {
+ "name": "George Zahariev",
+ "email": "z@georgezahariev.com"
+ },
+ "bugs": {
+ "url": "https://github.com/gkz/type-check/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "deprecated": false,
+ "description": "type-check allows you to check the types of JavaScript values at runtime with a Haskell like type syntax.",
+ "devDependencies": {
+ "browserify": "~12.0.1",
+ "istanbul": "~0.4.1",
+ "livescript": "~1.4.0",
+ "mocha": "~2.3.4"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "files": [
+ "lib",
+ "README.md",
+ "LICENSE"
+ ],
+ "homepage": "https://github.com/gkz/type-check",
+ "keywords": [
+ "type",
+ "check",
+ "checking",
+ "library"
+ ],
+ "license": "MIT",
+ "main": "./lib/",
+ "name": "type-check",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/gkz/type-check.git"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "version": "0.3.2"
+}
diff --git a/node_modules/word-wrap/LICENSE b/node_modules/word-wrap/LICENSE
new file mode 100644
index 00000000..d734237b
--- /dev/null
+++ b/node_modules/word-wrap/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/word-wrap/README.md b/node_modules/word-wrap/README.md
new file mode 100644
index 00000000..88b96840
--- /dev/null
+++ b/node_modules/word-wrap/README.md
@@ -0,0 +1,182 @@
+# word-wrap [](https://www.npmjs.com/package/word-wrap) [](https://npmjs.org/package/word-wrap) [](https://npmjs.org/package/word-wrap) [](https://travis-ci.org/jonschlinkert/word-wrap)
+
+> Wrap words to a specified length.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save word-wrap
+```
+
+## Usage
+
+```js
+var wrap = require('word-wrap');
+
+wrap('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.');
+```
+
+Results in:
+
+```
+ Lorem ipsum dolor sit amet, consectetur adipiscing
+ elit, sed do eiusmod tempor incididunt ut labore
+ et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat.
+```
+
+## Options
+
+
+
+### options.width
+
+Type: `Number`
+
+Default: `50`
+
+The width of the text before wrapping to a new line.
+
+**Example:**
+
+```js
+wrap(str, {width: 60});
+```
+
+### options.indent
+
+Type: `String`
+
+Default: `` (two spaces)
+
+The string to use at the beginning of each line.
+
+**Example:**
+
+```js
+wrap(str, {indent: ' '});
+```
+
+### options.newline
+
+Type: `String`
+
+Default: `\n`
+
+The string to use at the end of each line.
+
+**Example:**
+
+```js
+wrap(str, {newline: '\n\n'});
+```
+
+### options.escape
+
+Type: `function`
+
+Default: `function(str){return str;}`
+
+An escape function to run on each line after splitting them.
+
+**Example:**
+
+```js
+var xmlescape = require('xml-escape');
+wrap(str, {
+ escape: function(string){
+ return xmlescape(string);
+ }
+});
+```
+
+### options.trim
+
+Type: `Boolean`
+
+Default: `false`
+
+Trim trailing whitespace from the returned string. This option is included since `.trim()` would also strip the leading indentation from the first line.
+
+**Example:**
+
+```js
+wrap(str, {trim: true});
+```
+
+### options.cut
+
+Type: `Boolean`
+
+Default: `false`
+
+Break a word between any two letters when the word is longer than the specified width.
+
+**Example:**
+
+```js
+wrap(str, {cut: true});
+```
+
+## About
+
+### Related projects
+
+* [common-words](https://www.npmjs.com/package/common-words): Updated list (JSON) of the 100 most common words in the English language. Useful for… [more](https://github.com/jonschlinkert/common-words) | [homepage](https://github.com/jonschlinkert/common-words "Updated list (JSON) of the 100 most common words in the English language. Useful for excluding these words from arrays.")
+* [shuffle-words](https://www.npmjs.com/package/shuffle-words): Shuffle the words in a string and optionally the letters in each word using the… [more](https://github.com/jonschlinkert/shuffle-words) | [homepage](https://github.com/jonschlinkert/shuffle-words "Shuffle the words in a string and optionally the letters in each word using the Fisher-Yates algorithm. Useful for creating test fixtures, benchmarking samples, etc.")
+* [unique-words](https://www.npmjs.com/package/unique-words): Return the unique words in a string or array. | [homepage](https://github.com/jonschlinkert/unique-words "Return the unique words in a string or array.")
+* [wordcount](https://www.npmjs.com/package/wordcount): Count the words in a string. Support for english, CJK and Cyrillic. | [homepage](https://github.com/jonschlinkert/wordcount "Count the words in a string. Support for english, CJK and Cyrillic.")
+
+### Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 43 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 2 | [lordvlad](https://github.com/lordvlad) |
+| 2 | [hildjj](https://github.com/hildjj) |
+| 1 | [danilosampaio](https://github.com/danilosampaio) |
+| 1 | [2fd](https://github.com/2fd) |
+| 1 | [toddself](https://github.com/toddself) |
+| 1 | [wolfgang42](https://github.com/wolfgang42) |
+| 1 | [zachhale](https://github.com/zachhale) |
+
+### 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 June 02, 2017._
\ No newline at end of file
diff --git a/node_modules/word-wrap/index.d.ts b/node_modules/word-wrap/index.d.ts
new file mode 100644
index 00000000..54ee5f26
--- /dev/null
+++ b/node_modules/word-wrap/index.d.ts
@@ -0,0 +1,50 @@
+/**
+ * Wrap words to a specified length.
+ */
+export = wrap;
+
+declare function wrap(str: string, options?: wrap.IOptions): string;
+
+declare namespace wrap {
+ export interface IOptions {
+
+ /**
+ * The width of the text before wrapping to a new line.
+ * @default ´50´
+ */
+ width?: number;
+
+ /**
+ * The string to use at the beginning of each line.
+ * @default ´ ´ (two spaces)
+ */
+ indent?: string;
+
+ /**
+ * The string to use at the end of each line.
+ * @default ´\n´
+ */
+ newline?: string;
+
+ /**
+ * An escape function to run on each line after splitting them.
+ * @default (str: string) => string;
+ */
+ escape?: (str: string) => string;
+
+ /**
+ * Trim trailing whitespace from the returned string.
+ * This option is included since .trim() would also strip
+ * the leading indentation from the first line.
+ * @default true
+ */
+ trim?: boolean;
+
+ /**
+ * Break a word between any two letters when the word is longer
+ * than the specified width.
+ * @default false
+ */
+ cut?: boolean;
+ }
+}
\ No newline at end of file
diff --git a/node_modules/word-wrap/index.js b/node_modules/word-wrap/index.js
new file mode 100644
index 00000000..45373c6d
--- /dev/null
+++ b/node_modules/word-wrap/index.js
@@ -0,0 +1,46 @@
+/*!
+ * word-wrap
+ *
+ * Copyright (c) 2014-2017, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+module.exports = function(str, options) {
+ options = options || {};
+ if (str == null) {
+ return str;
+ }
+
+ var width = options.width || 50;
+ var indent = (typeof options.indent === 'string')
+ ? options.indent
+ : ' ';
+
+ var newline = options.newline || '\n' + indent;
+ var escape = typeof options.escape === 'function'
+ ? options.escape
+ : identity;
+
+ var regexString = '.{1,' + width + '}';
+ if (options.cut !== true) {
+ regexString += '([\\s\u200B]+|$)|[^\\s\u200B]+?([\\s\u200B]+|$)';
+ }
+
+ var re = new RegExp(regexString, 'g');
+ var lines = str.match(re) || [];
+ var result = indent + lines.map(function(line) {
+ if (line.slice(-1) === '\n') {
+ line = line.slice(0, line.length - 1);
+ }
+ return escape(line);
+ }).join(newline);
+
+ if (options.trim === true) {
+ result = result.replace(/[ \t]*$/gm, '');
+ }
+ return result;
+};
+
+function identity(str) {
+ return str;
+}
diff --git a/node_modules/word-wrap/package.json b/node_modules/word-wrap/package.json
new file mode 100644
index 00000000..5cd85fcc
--- /dev/null
+++ b/node_modules/word-wrap/package.json
@@ -0,0 +1,137 @@
+{
+ "_from": "word-wrap@~1.2.3",
+ "_id": "word-wrap@1.2.3",
+ "_inBundle": false,
+ "_integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "_location": "/word-wrap",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "word-wrap@~1.2.3",
+ "name": "word-wrap",
+ "escapedName": "word-wrap",
+ "rawSpec": "~1.2.3",
+ "saveSpec": null,
+ "fetchSpec": "~1.2.3"
+ },
+ "_requiredBy": [
+ "/optionator"
+ ],
+ "_resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "_shasum": "610636f6b1f703891bd34771ccb17fb93b47079c",
+ "_spec": "word-wrap@~1.2.3",
+ "_where": "C:\\Users\\atharvam\\repos-main\\k8s-set-context\\node_modules\\optionator",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/word-wrap/issues"
+ },
+ "bundleDependencies": false,
+ "contributors": [
+ {
+ "name": "Danilo Sampaio",
+ "email": "danilo.sampaio@gmail.com",
+ "url": "localhost:8080"
+ },
+ {
+ "name": "Fede Ramirez",
+ "email": "i@2fd.me",
+ "url": "https://2fd.github.io"
+ },
+ {
+ "name": "Joe Hildebrand",
+ "email": "joe-github@cursive.net",
+ "url": "https://twitter.com/hildjj"
+ },
+ {
+ "name": "Jon Schlinkert",
+ "email": "jon.schlinkert@sellside.com",
+ "url": "http://twitter.com/jonschlinkert"
+ },
+ {
+ "name": "Todd Kennedy",
+ "url": "https://tck.io"
+ },
+ {
+ "name": "Waldemar Reusch",
+ "url": "https://github.com/lordvlad"
+ },
+ {
+ "name": "Wolfgang Faust",
+ "url": "http://www.linestarve.com"
+ },
+ {
+ "name": "Zach Hale",
+ "email": "zachhale@gmail.com",
+ "url": "http://zachhale.com"
+ }
+ ],
+ "deprecated": false,
+ "description": "Wrap words to a specified length.",
+ "devDependencies": {
+ "gulp-format-md": "^0.1.11",
+ "mocha": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "homepage": "https://github.com/jonschlinkert/word-wrap",
+ "keywords": [
+ "break",
+ "carriage",
+ "line",
+ "new-line",
+ "newline",
+ "return",
+ "soft",
+ "text",
+ "word",
+ "word-wrap",
+ "words",
+ "wrap"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "word-wrap",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jonschlinkert/word-wrap.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "typings": "index.d.ts",
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "lint": {
+ "reflinks": true
+ },
+ "related": {
+ "list": [
+ "common-words",
+ "shuffle-words",
+ "unique-words",
+ "wordcount"
+ ]
+ },
+ "reflinks": [
+ "verb",
+ "verb-generate-readme"
+ ]
+ },
+ "version": "1.2.3"
+}
diff --git a/node_modules/xmldom/.travis.yml b/node_modules/xmldom/.travis.yml
new file mode 100644
index 00000000..b95408e8
--- /dev/null
+++ b/node_modules/xmldom/.travis.yml
@@ -0,0 +1,22 @@
+language: node_js
+
+node_js:
+ - '0.10'
+
+branches:
+ only:
+ - master
+ - proof
+ - travis-ci
+
+# Not using `npm install --dev` because it is recursive. It will pull in the all
+# development dependencies for CoffeeScript. Way too much spew in the Travis CI
+# build output.
+
+before_install:
+ - npm install
+ - npm install istanbul coveralls
+
+env:
+ global:
+ - secure: "BxUHTsa1WVANLQoimilbZwa1MCWSdM9hOmPWBE/rsYb7uT/iiqkRXXwnWhKtN5CLvTvIQbiAzq4iyPID0S8UHrnxClYQrOuA6QkrtwgIEuDAmijao/bgxobPOremvkwXcpMGIwzYKyYQQtSEaEIQbqf6gSSKW9dBh/GZ/vfTsqo="
diff --git a/node_modules/xmldom/LICENSE b/node_modules/xmldom/LICENSE
new file mode 100644
index 00000000..68a9b5e1
--- /dev/null
+++ b/node_modules/xmldom/LICENSE
@@ -0,0 +1,8 @@
+You can choose any one of those:
+
+The MIT License (MIT):
+
+link:http://opensource.org/licenses/MIT
+
+LGPL:
+http://www.gnu.org/licenses/lgpl.html
diff --git a/node_modules/xmldom/__package__.js b/node_modules/xmldom/__package__.js
new file mode 100644
index 00000000..b4cad289
--- /dev/null
+++ b/node_modules/xmldom/__package__.js
@@ -0,0 +1,4 @@
+this.addScript('dom.js',['DOMImplementation','XMLSerializer']);
+this.addScript('dom-parser.js',['DOMHandler','DOMParser'],
+ ['DOMImplementation','XMLReader']);
+this.addScript('sax.js','XMLReader');
\ No newline at end of file
diff --git a/node_modules/xmldom/changelog b/node_modules/xmldom/changelog
new file mode 100644
index 00000000..ab815bb8
--- /dev/null
+++ b/node_modules/xmldom/changelog
@@ -0,0 +1,14 @@
+### Version 0.1.16
+
+Sat May 4 14:58:03 UTC 2013
+
+ * Correctly handle multibyte Unicode greater than two byts. #57. #56.
+ * Initial unit testing and test coverage. #53. #46. #19.
+ * Create Bower `component.json` #52.
+
+### Version 0.1.8
+
+ * Add: some test case from node-o3-xml(excludes xpath support)
+ * Fix: remove existed attribute before setting (bug introduced in v0.1.5)
+ * Fix: index direct access for childNodes and any NodeList collection(not w3c standard)
+ * Fix: remove last child bug
diff --git a/node_modules/xmldom/component.json b/node_modules/xmldom/component.json
new file mode 100644
index 00000000..93b4d570
--- /dev/null
+++ b/node_modules/xmldom/component.json
@@ -0,0 +1,10 @@
+{
+ "name": "xmldom",
+ "version": "0.1.15",
+ "main": "dom-parser.js",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "components"
+ ]
+}
diff --git a/node_modules/xmldom/dom-parser.js b/node_modules/xmldom/dom-parser.js
new file mode 100644
index 00000000..41d52267
--- /dev/null
+++ b/node_modules/xmldom/dom-parser.js
@@ -0,0 +1,251 @@
+function DOMParser(options){
+ this.options = options ||{locator:{}};
+
+}
+DOMParser.prototype.parseFromString = function(source,mimeType){
+ var options = this.options;
+ var sax = new XMLReader();
+ var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
+ var errorHandler = options.errorHandler;
+ var locator = options.locator;
+ var defaultNSMap = options.xmlns||{};
+ var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
+ if(locator){
+ domBuilder.setDocumentLocator(locator)
+ }
+
+ sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
+ sax.domBuilder = options.domBuilder || domBuilder;
+ if(/\/x?html?$/.test(mimeType)){
+ entityMap.nbsp = '\xa0';
+ entityMap.copy = '\xa9';
+ defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
+ }
+ defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
+ if(source){
+ sax.parse(source,defaultNSMap,entityMap);
+ }else{
+ sax.errorHandler.error("invalid doc source");
+ }
+ return domBuilder.doc;
+}
+function buildErrorHandler(errorImpl,domBuilder,locator){
+ if(!errorImpl){
+ if(domBuilder instanceof DOMHandler){
+ return domBuilder;
+ }
+ errorImpl = domBuilder ;
+ }
+ var errorHandler = {}
+ var isCallback = errorImpl instanceof Function;
+ locator = locator||{}
+ function build(key){
+ var fn = errorImpl[key];
+ if(!fn && isCallback){
+ fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
+ }
+ errorHandler[key] = fn && function(msg){
+ fn('[xmldom '+key+']\t'+msg+_locator(locator));
+ }||function(){};
+ }
+ build('warning');
+ build('error');
+ build('fatalError');
+ return errorHandler;
+}
+
+//console.log('#\n\n\n\n\n\n\n####')
+/**
+ * +ContentHandler+ErrorHandler
+ * +LexicalHandler+EntityResolver2
+ * -DeclHandler-DTDHandler
+ *
+ * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
+ * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
+ */
+function DOMHandler() {
+ this.cdata = false;
+}
+function position(locator,node){
+ node.lineNumber = locator.lineNumber;
+ node.columnNumber = locator.columnNumber;
+}
+/**
+ * @see org.xml.sax.ContentHandler#startDocument
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
+ */
+DOMHandler.prototype = {
+ startDocument : function() {
+ this.doc = new DOMImplementation().createDocument(null, null, null);
+ if (this.locator) {
+ this.doc.documentURI = this.locator.systemId;
+ }
+ },
+ startElement:function(namespaceURI, localName, qName, attrs) {
+ var doc = this.doc;
+ var el = doc.createElementNS(namespaceURI, qName||localName);
+ var len = attrs.length;
+ appendElement(this, el);
+ this.currentElement = el;
+
+ this.locator && position(this.locator,el)
+ for (var i = 0 ; i < len; i++) {
+ var namespaceURI = attrs.getURI(i);
+ var value = attrs.getValue(i);
+ var qName = attrs.getQName(i);
+ var attr = doc.createAttributeNS(namespaceURI, qName);
+ this.locator &&position(attrs.getLocator(i),attr);
+ attr.value = attr.nodeValue = value;
+ el.setAttributeNode(attr)
+ }
+ },
+ endElement:function(namespaceURI, localName, qName) {
+ var current = this.currentElement
+ var tagName = current.tagName;
+ this.currentElement = current.parentNode;
+ },
+ startPrefixMapping:function(prefix, uri) {
+ },
+ endPrefixMapping:function(prefix) {
+ },
+ processingInstruction:function(target, data) {
+ var ins = this.doc.createProcessingInstruction(target, data);
+ this.locator && position(this.locator,ins)
+ appendElement(this, ins);
+ },
+ ignorableWhitespace:function(ch, start, length) {
+ },
+ characters:function(chars, start, length) {
+ chars = _toString.apply(this,arguments)
+ //console.log(chars)
+ if(chars){
+ if (this.cdata) {
+ var charNode = this.doc.createCDATASection(chars);
+ } else {
+ var charNode = this.doc.createTextNode(chars);
+ }
+ if(this.currentElement){
+ this.currentElement.appendChild(charNode);
+ }else if(/^\s*$/.test(chars)){
+ this.doc.appendChild(charNode);
+ //process xml
+ }
+ this.locator && position(this.locator,charNode)
+ }
+ },
+ skippedEntity:function(name) {
+ },
+ endDocument:function() {
+ this.doc.normalize();
+ },
+ setDocumentLocator:function (locator) {
+ if(this.locator = locator){// && !('lineNumber' in locator)){
+ locator.lineNumber = 0;
+ }
+ },
+ //LexicalHandler
+ comment:function(chars, start, length) {
+ chars = _toString.apply(this,arguments)
+ var comm = this.doc.createComment(chars);
+ this.locator && position(this.locator,comm)
+ appendElement(this, comm);
+ },
+
+ startCDATA:function() {
+ //used in characters() methods
+ this.cdata = true;
+ },
+ endCDATA:function() {
+ this.cdata = false;
+ },
+
+ startDTD:function(name, publicId, systemId) {
+ var impl = this.doc.implementation;
+ if (impl && impl.createDocumentType) {
+ var dt = impl.createDocumentType(name, publicId, systemId);
+ this.locator && position(this.locator,dt)
+ appendElement(this, dt);
+ }
+ },
+ /**
+ * @see org.xml.sax.ErrorHandler
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
+ */
+ warning:function(error) {
+ console.warn('[xmldom warning]\t'+error,_locator(this.locator));
+ },
+ error:function(error) {
+ console.error('[xmldom error]\t'+error,_locator(this.locator));
+ },
+ fatalError:function(error) {
+ console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
+ throw error;
+ }
+}
+function _locator(l){
+ if(l){
+ return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
+ }
+}
+function _toString(chars,start,length){
+ if(typeof chars == 'string'){
+ return chars.substr(start,length)
+ }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
+ if(chars.length >= start+length || start){
+ return new java.lang.String(chars,start,length)+'';
+ }
+ return chars;
+ }
+}
+
+/*
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
+ * used method of org.xml.sax.ext.LexicalHandler:
+ * #comment(chars, start, length)
+ * #startCDATA()
+ * #endCDATA()
+ * #startDTD(name, publicId, systemId)
+ *
+ *
+ * IGNORED method of org.xml.sax.ext.LexicalHandler:
+ * #endDTD()
+ * #startEntity(name)
+ * #endEntity(name)
+ *
+ *
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
+ * IGNORED method of org.xml.sax.ext.DeclHandler
+ * #attributeDecl(eName, aName, type, mode, value)
+ * #elementDecl(name, model)
+ * #externalEntityDecl(name, publicId, systemId)
+ * #internalEntityDecl(name, value)
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
+ * IGNORED method of org.xml.sax.EntityResolver2
+ * #resolveEntity(String name,String publicId,String baseURI,String systemId)
+ * #resolveEntity(publicId, systemId)
+ * #getExternalSubset(name, baseURI)
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
+ * IGNORED method of org.xml.sax.DTDHandler
+ * #notationDecl(name, publicId, systemId) {};
+ * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
+ */
+"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
+ DOMHandler.prototype[key] = function(){return null}
+})
+
+/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
+function appendElement (hander,node) {
+ if (!hander.currentElement) {
+ hander.doc.appendChild(node);
+ } else {
+ hander.currentElement.appendChild(node);
+ }
+}//appendChild and setAttributeNS are preformance key
+
+//if(typeof require == 'function'){
+ var XMLReader = require('./sax').XMLReader;
+ var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
+ exports.XMLSerializer = require('./dom').XMLSerializer ;
+ exports.DOMParser = DOMParser;
+//}
diff --git a/node_modules/xmldom/dom.js b/node_modules/xmldom/dom.js
new file mode 100644
index 00000000..b290df08
--- /dev/null
+++ b/node_modules/xmldom/dom.js
@@ -0,0 +1,1244 @@
+/*
+ * DOM Level 2
+ * Object DOMException
+ * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
+ * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
+ */
+
+function copy(src,dest){
+ for(var p in src){
+ dest[p] = src[p];
+ }
+}
+/**
+^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
+^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
+ */
+function _extends(Class,Super){
+ var pt = Class.prototype;
+ if(Object.create){
+ var ppt = Object.create(Super.prototype)
+ pt.__proto__ = ppt;
+ }
+ if(!(pt instanceof Super)){
+ function t(){};
+ t.prototype = Super.prototype;
+ t = new t();
+ copy(pt,t);
+ Class.prototype = pt = t;
+ }
+ if(pt.constructor != Class){
+ if(typeof Class != 'function'){
+ console.error("unknow Class:"+Class)
+ }
+ pt.constructor = Class
+ }
+}
+var htmlns = 'http://www.w3.org/1999/xhtml' ;
+// Node Types
+var NodeType = {}
+var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
+var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
+var TEXT_NODE = NodeType.TEXT_NODE = 3;
+var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
+var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
+var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
+var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
+var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
+var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
+var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
+var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
+var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
+
+// ExceptionCode
+var ExceptionCode = {}
+var ExceptionMessage = {};
+var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
+var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
+var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
+var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
+var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
+var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
+var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
+var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
+var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
+var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
+//level2
+var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
+var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
+var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
+var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
+var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
+
+
+function DOMException(code, message) {
+ if(message instanceof Error){
+ var error = message;
+ }else{
+ error = this;
+ Error.call(this, ExceptionMessage[code]);
+ this.message = ExceptionMessage[code];
+ if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
+ }
+ error.code = code;
+ if(message) this.message = this.message + ": " + message;
+ return error;
+};
+DOMException.prototype = Error.prototype;
+copy(ExceptionCode,DOMException)
+/**
+ * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
+ * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
+ * The items in the NodeList are accessible via an integral index, starting from 0.
+ */
+function NodeList() {
+};
+NodeList.prototype = {
+ /**
+ * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
+ * @standard level1
+ */
+ length:0,
+ /**
+ * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
+ * @standard level1
+ * @param index unsigned long
+ * Index into the collection.
+ * @return Node
+ * The node at the indexth position in the NodeList, or null if that is not a valid index.
+ */
+ item: function(index) {
+ return this[index] || null;
+ },
+ toString:function(isHTML,nodeFilter){
+ for(var buf = [], i = 0;i=0){
+ var lastIndex = list.length-1
+ while(i0 || key == 'xmlns'){
+// return null;
+// }
+ //console.log()
+ var i = this.length;
+ while(i--){
+ var attr = this[i];
+ //console.log(attr.nodeName,key)
+ if(attr.nodeName == key){
+ return attr;
+ }
+ }
+ },
+ setNamedItem: function(attr) {
+ var el = attr.ownerElement;
+ if(el && el!=this._ownerElement){
+ throw new DOMException(INUSE_ATTRIBUTE_ERR);
+ }
+ var oldAttr = this.getNamedItem(attr.nodeName);
+ _addNamedNode(this._ownerElement,this,attr,oldAttr);
+ return oldAttr;
+ },
+ /* returns Node */
+ setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
+ var el = attr.ownerElement, oldAttr;
+ if(el && el!=this._ownerElement){
+ throw new DOMException(INUSE_ATTRIBUTE_ERR);
+ }
+ oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
+ _addNamedNode(this._ownerElement,this,attr,oldAttr);
+ return oldAttr;
+ },
+
+ /* returns Node */
+ removeNamedItem: function(key) {
+ var attr = this.getNamedItem(key);
+ _removeNamedNode(this._ownerElement,this,attr);
+ return attr;
+
+
+ },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
+
+ //for level2
+ removeNamedItemNS:function(namespaceURI,localName){
+ var attr = this.getNamedItemNS(namespaceURI,localName);
+ _removeNamedNode(this._ownerElement,this,attr);
+ return attr;
+ },
+ getNamedItemNS: function(namespaceURI, localName) {
+ var i = this.length;
+ while(i--){
+ var node = this[i];
+ if(node.localName == localName && node.namespaceURI == namespaceURI){
+ return node;
+ }
+ }
+ return null;
+ }
+};
+/**
+ * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
+ */
+function DOMImplementation(/* Object */ features) {
+ this._features = {};
+ if (features) {
+ for (var feature in features) {
+ this._features = features[feature];
+ }
+ }
+};
+
+DOMImplementation.prototype = {
+ hasFeature: function(/* string */ feature, /* string */ version) {
+ var versions = this._features[feature.toLowerCase()];
+ if (versions && (!version || version in versions)) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+ // Introduced in DOM Level 2:
+ createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
+ var doc = new Document();
+ doc.implementation = this;
+ doc.childNodes = new NodeList();
+ doc.doctype = doctype;
+ if(doctype){
+ doc.appendChild(doctype);
+ }
+ if(qualifiedName){
+ var root = doc.createElementNS(namespaceURI,qualifiedName);
+ doc.appendChild(root);
+ }
+ return doc;
+ },
+ // Introduced in DOM Level 2:
+ createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
+ var node = new DocumentType();
+ node.name = qualifiedName;
+ node.nodeName = qualifiedName;
+ node.publicId = publicId;
+ node.systemId = systemId;
+ // Introduced in DOM Level 2:
+ //readonly attribute DOMString internalSubset;
+
+ //TODO:..
+ // readonly attribute NamedNodeMap entities;
+ // readonly attribute NamedNodeMap notations;
+ return node;
+ }
+};
+
+
+/**
+ * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
+ */
+
+function Node() {
+};
+
+Node.prototype = {
+ firstChild : null,
+ lastChild : null,
+ previousSibling : null,
+ nextSibling : null,
+ attributes : null,
+ parentNode : null,
+ childNodes : null,
+ ownerDocument : null,
+ nodeValue : null,
+ namespaceURI : null,
+ prefix : null,
+ localName : null,
+ // Modified in DOM Level 2:
+ insertBefore:function(newChild, refChild){//raises
+ return _insertBefore(this,newChild,refChild);
+ },
+ replaceChild:function(newChild, oldChild){//raises
+ this.insertBefore(newChild,oldChild);
+ if(oldChild){
+ this.removeChild(oldChild);
+ }
+ },
+ removeChild:function(oldChild){
+ return _removeChild(this,oldChild);
+ },
+ appendChild:function(newChild){
+ return this.insertBefore(newChild,null);
+ },
+ hasChildNodes:function(){
+ return this.firstChild != null;
+ },
+ cloneNode:function(deep){
+ return cloneNode(this.ownerDocument||this,this,deep);
+ },
+ // Modified in DOM Level 2:
+ normalize:function(){
+ var child = this.firstChild;
+ while(child){
+ var next = child.nextSibling;
+ if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
+ this.removeChild(next);
+ child.appendData(next.data);
+ }else{
+ child.normalize();
+ child = next;
+ }
+ }
+ },
+ // Introduced in DOM Level 2:
+ isSupported:function(feature, version){
+ return this.ownerDocument.implementation.hasFeature(feature,version);
+ },
+ // Introduced in DOM Level 2:
+ hasAttributes:function(){
+ return this.attributes.length>0;
+ },
+ lookupPrefix:function(namespaceURI){
+ var el = this;
+ while(el){
+ var map = el._nsMap;
+ //console.dir(map)
+ if(map){
+ for(var n in map){
+ if(map[n] == namespaceURI){
+ return n;
+ }
+ }
+ }
+ el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
+ }
+ return null;
+ },
+ // Introduced in DOM Level 3:
+ lookupNamespaceURI:function(prefix){
+ var el = this;
+ while(el){
+ var map = el._nsMap;
+ //console.dir(map)
+ if(map){
+ if(prefix in map){
+ return map[prefix] ;
+ }
+ }
+ el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
+ }
+ return null;
+ },
+ // Introduced in DOM Level 3:
+ isDefaultNamespace:function(namespaceURI){
+ var prefix = this.lookupPrefix(namespaceURI);
+ return prefix == null;
+ }
+};
+
+
+function _xmlEncoder(c){
+ return c == '<' && '<' ||
+ c == '>' && '>' ||
+ c == '&' && '&' ||
+ c == '"' && '"' ||
+ ''+c.charCodeAt()+';'
+}
+
+
+copy(NodeType,Node);
+copy(NodeType,Node.prototype);
+
+/**
+ * @param callback return true for continue,false for break
+ * @return boolean true: break visit;
+ */
+function _visitNode(node,callback){
+ if(callback(node)){
+ return true;
+ }
+ if(node = node.firstChild){
+ do{
+ if(_visitNode(node,callback)){return true}
+ }while(node=node.nextSibling)
+ }
+}
+
+
+
+function Document(){
+}
+function _onAddAttribute(doc,el,newAttr){
+ doc && doc._inc++;
+ var ns = newAttr.namespaceURI ;
+ if(ns == 'http://www.w3.org/2000/xmlns/'){
+ //update namespace
+ el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
+ }
+}
+function _onRemoveAttribute(doc,el,newAttr,remove){
+ doc && doc._inc++;
+ var ns = newAttr.namespaceURI ;
+ if(ns == 'http://www.w3.org/2000/xmlns/'){
+ //update namespace
+ delete el._nsMap[newAttr.prefix?newAttr.localName:'']
+ }
+}
+function _onUpdateChild(doc,el,newChild){
+ if(doc && doc._inc){
+ doc._inc++;
+ //update childNodes
+ var cs = el.childNodes;
+ if(newChild){
+ cs[cs.length++] = newChild;
+ }else{
+ //console.log(1)
+ var child = el.firstChild;
+ var i = 0;
+ while(child){
+ cs[i++] = child;
+ child =child.nextSibling;
+ }
+ cs.length = i;
+ }
+ }
+}
+
+/**
+ * attributes;
+ * children;
+ *
+ * writeable properties:
+ * nodeValue,Attr:value,CharacterData:data
+ * prefix
+ */
+function _removeChild(parentNode,child){
+ var previous = child.previousSibling;
+ var next = child.nextSibling;
+ if(previous){
+ previous.nextSibling = next;
+ }else{
+ parentNode.firstChild = next
+ }
+ if(next){
+ next.previousSibling = previous;
+ }else{
+ parentNode.lastChild = previous;
+ }
+ _onUpdateChild(parentNode.ownerDocument,parentNode);
+ return child;
+}
+/**
+ * preformance key(refChild == null)
+ */
+function _insertBefore(parentNode,newChild,nextChild){
+ var cp = newChild.parentNode;
+ if(cp){
+ cp.removeChild(newChild);//remove and update
+ }
+ if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
+ var newFirst = newChild.firstChild;
+ if (newFirst == null) {
+ return newChild;
+ }
+ var newLast = newChild.lastChild;
+ }else{
+ newFirst = newLast = newChild;
+ }
+ var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
+
+ newFirst.previousSibling = pre;
+ newLast.nextSibling = nextChild;
+
+
+ if(pre){
+ pre.nextSibling = newFirst;
+ }else{
+ parentNode.firstChild = newFirst;
+ }
+ if(nextChild == null){
+ parentNode.lastChild = newLast;
+ }else{
+ nextChild.previousSibling = newLast;
+ }
+ do{
+ newFirst.parentNode = parentNode;
+ }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
+ _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
+ //console.log(parentNode.lastChild.nextSibling == null)
+ if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
+ newChild.firstChild = newChild.lastChild = null;
+ }
+ return newChild;
+}
+function _appendSingleChild(parentNode,newChild){
+ var cp = newChild.parentNode;
+ if(cp){
+ var pre = parentNode.lastChild;
+ cp.removeChild(newChild);//remove and update
+ var pre = parentNode.lastChild;
+ }
+ var pre = parentNode.lastChild;
+ newChild.parentNode = parentNode;
+ newChild.previousSibling = pre;
+ newChild.nextSibling = null;
+ if(pre){
+ pre.nextSibling = newChild;
+ }else{
+ parentNode.firstChild = newChild;
+ }
+ parentNode.lastChild = newChild;
+ _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
+ return newChild;
+ //console.log("__aa",parentNode.lastChild.nextSibling == null)
+}
+Document.prototype = {
+ //implementation : null,
+ nodeName : '#document',
+ nodeType : DOCUMENT_NODE,
+ doctype : null,
+ documentElement : null,
+ _inc : 1,
+
+ insertBefore : function(newChild, refChild){//raises
+ if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
+ var child = newChild.firstChild;
+ while(child){
+ var next = child.nextSibling;
+ this.insertBefore(child,refChild);
+ child = next;
+ }
+ return newChild;
+ }
+ if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
+ this.documentElement = newChild;
+ }
+
+ return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
+ },
+ removeChild : function(oldChild){
+ if(this.documentElement == oldChild){
+ this.documentElement = null;
+ }
+ return _removeChild(this,oldChild);
+ },
+ // Introduced in DOM Level 2:
+ importNode : function(importedNode,deep){
+ return importNode(this,importedNode,deep);
+ },
+ // Introduced in DOM Level 2:
+ getElementById : function(id){
+ var rtv = null;
+ _visitNode(this.documentElement,function(node){
+ if(node.nodeType == ELEMENT_NODE){
+ if(node.getAttribute('id') == id){
+ rtv = node;
+ return true;
+ }
+ }
+ })
+ return rtv;
+ },
+
+ //document factory method:
+ createElement : function(tagName){
+ var node = new Element();
+ node.ownerDocument = this;
+ node.nodeName = tagName;
+ node.tagName = tagName;
+ node.childNodes = new NodeList();
+ var attrs = node.attributes = new NamedNodeMap();
+ attrs._ownerElement = node;
+ return node;
+ },
+ createDocumentFragment : function(){
+ var node = new DocumentFragment();
+ node.ownerDocument = this;
+ node.childNodes = new NodeList();
+ return node;
+ },
+ createTextNode : function(data){
+ var node = new Text();
+ node.ownerDocument = this;
+ node.appendData(data)
+ return node;
+ },
+ createComment : function(data){
+ var node = new Comment();
+ node.ownerDocument = this;
+ node.appendData(data)
+ return node;
+ },
+ createCDATASection : function(data){
+ var node = new CDATASection();
+ node.ownerDocument = this;
+ node.appendData(data)
+ return node;
+ },
+ createProcessingInstruction : function(target,data){
+ var node = new ProcessingInstruction();
+ node.ownerDocument = this;
+ node.tagName = node.target = target;
+ node.nodeValue= node.data = data;
+ return node;
+ },
+ createAttribute : function(name){
+ var node = new Attr();
+ node.ownerDocument = this;
+ node.name = name;
+ node.nodeName = name;
+ node.localName = name;
+ node.specified = true;
+ return node;
+ },
+ createEntityReference : function(name){
+ var node = new EntityReference();
+ node.ownerDocument = this;
+ node.nodeName = name;
+ return node;
+ },
+ // Introduced in DOM Level 2:
+ createElementNS : function(namespaceURI,qualifiedName){
+ var node = new Element();
+ var pl = qualifiedName.split(':');
+ var attrs = node.attributes = new NamedNodeMap();
+ node.childNodes = new NodeList();
+ node.ownerDocument = this;
+ node.nodeName = qualifiedName;
+ node.tagName = qualifiedName;
+ node.namespaceURI = namespaceURI;
+ if(pl.length == 2){
+ node.prefix = pl[0];
+ node.localName = pl[1];
+ }else{
+ //el.prefix = null;
+ node.localName = qualifiedName;
+ }
+ attrs._ownerElement = node;
+ return node;
+ },
+ // Introduced in DOM Level 2:
+ createAttributeNS : function(namespaceURI,qualifiedName){
+ var node = new Attr();
+ var pl = qualifiedName.split(':');
+ node.ownerDocument = this;
+ node.nodeName = qualifiedName;
+ node.name = qualifiedName;
+ node.namespaceURI = namespaceURI;
+ node.specified = true;
+ if(pl.length == 2){
+ node.prefix = pl[0];
+ node.localName = pl[1];
+ }else{
+ //el.prefix = null;
+ node.localName = qualifiedName;
+ }
+ return node;
+ }
+};
+_extends(Document,Node);
+
+
+function Element() {
+ this._nsMap = {};
+};
+Element.prototype = {
+ nodeType : ELEMENT_NODE,
+ hasAttribute : function(name){
+ return this.getAttributeNode(name)!=null;
+ },
+ getAttribute : function(name){
+ var attr = this.getAttributeNode(name);
+ return attr && attr.value || '';
+ },
+ getAttributeNode : function(name){
+ return this.attributes.getNamedItem(name);
+ },
+ setAttribute : function(name, value){
+ var attr = this.ownerDocument.createAttribute(name);
+ attr.value = attr.nodeValue = "" + value;
+ this.setAttributeNode(attr)
+ },
+ removeAttribute : function(name){
+ var attr = this.getAttributeNode(name)
+ attr && this.removeAttributeNode(attr);
+ },
+
+ //four real opeartion method
+ appendChild:function(newChild){
+ if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
+ return this.insertBefore(newChild,null);
+ }else{
+ return _appendSingleChild(this,newChild);
+ }
+ },
+ setAttributeNode : function(newAttr){
+ return this.attributes.setNamedItem(newAttr);
+ },
+ setAttributeNodeNS : function(newAttr){
+ return this.attributes.setNamedItemNS(newAttr);
+ },
+ removeAttributeNode : function(oldAttr){
+ //console.log(this == oldAttr.ownerElement)
+ return this.attributes.removeNamedItem(oldAttr.nodeName);
+ },
+ //get real attribute name,and remove it by removeAttributeNode
+ removeAttributeNS : function(namespaceURI, localName){
+ var old = this.getAttributeNodeNS(namespaceURI, localName);
+ old && this.removeAttributeNode(old);
+ },
+
+ hasAttributeNS : function(namespaceURI, localName){
+ return this.getAttributeNodeNS(namespaceURI, localName)!=null;
+ },
+ getAttributeNS : function(namespaceURI, localName){
+ var attr = this.getAttributeNodeNS(namespaceURI, localName);
+ return attr && attr.value || '';
+ },
+ setAttributeNS : function(namespaceURI, qualifiedName, value){
+ var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
+ attr.value = attr.nodeValue = "" + value;
+ this.setAttributeNode(attr)
+ },
+ getAttributeNodeNS : function(namespaceURI, localName){
+ return this.attributes.getNamedItemNS(namespaceURI, localName);
+ },
+
+ getElementsByTagName : function(tagName){
+ return new LiveNodeList(this,function(base){
+ var ls = [];
+ _visitNode(base,function(node){
+ if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
+ ls.push(node);
+ }
+ });
+ return ls;
+ });
+ },
+ getElementsByTagNameNS : function(namespaceURI, localName){
+ return new LiveNodeList(this,function(base){
+ var ls = [];
+ _visitNode(base,function(node){
+ if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
+ ls.push(node);
+ }
+ });
+ return ls;
+
+ });
+ }
+};
+Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
+Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
+
+
+_extends(Element,Node);
+function Attr() {
+};
+Attr.prototype.nodeType = ATTRIBUTE_NODE;
+_extends(Attr,Node);
+
+
+function CharacterData() {
+};
+CharacterData.prototype = {
+ data : '',
+ substringData : function(offset, count) {
+ return this.data.substring(offset, offset+count);
+ },
+ appendData: function(text) {
+ text = this.data+text;
+ this.nodeValue = this.data = text;
+ this.length = text.length;
+ },
+ insertData: function(offset,text) {
+ this.replaceData(offset,0,text);
+
+ },
+ appendChild:function(newChild){
+ throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
+ },
+ deleteData: function(offset, count) {
+ this.replaceData(offset,count,"");
+ },
+ replaceData: function(offset, count, text) {
+ var start = this.data.substring(0,offset);
+ var end = this.data.substring(offset+count);
+ text = start + text + end;
+ this.nodeValue = this.data = text;
+ this.length = text.length;
+ }
+}
+_extends(CharacterData,Node);
+function Text() {
+};
+Text.prototype = {
+ nodeName : "#text",
+ nodeType : TEXT_NODE,
+ splitText : function(offset) {
+ var text = this.data;
+ var newText = text.substring(offset);
+ text = text.substring(0, offset);
+ this.data = this.nodeValue = text;
+ this.length = text.length;
+ var newNode = this.ownerDocument.createTextNode(newText);
+ if(this.parentNode){
+ this.parentNode.insertBefore(newNode, this.nextSibling);
+ }
+ return newNode;
+ }
+}
+_extends(Text,CharacterData);
+function Comment() {
+};
+Comment.prototype = {
+ nodeName : "#comment",
+ nodeType : COMMENT_NODE
+}
+_extends(Comment,CharacterData);
+
+function CDATASection() {
+};
+CDATASection.prototype = {
+ nodeName : "#cdata-section",
+ nodeType : CDATA_SECTION_NODE
+}
+_extends(CDATASection,CharacterData);
+
+
+function DocumentType() {
+};
+DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
+_extends(DocumentType,Node);
+
+function Notation() {
+};
+Notation.prototype.nodeType = NOTATION_NODE;
+_extends(Notation,Node);
+
+function Entity() {
+};
+Entity.prototype.nodeType = ENTITY_NODE;
+_extends(Entity,Node);
+
+function EntityReference() {
+};
+EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
+_extends(EntityReference,Node);
+
+function DocumentFragment() {
+};
+DocumentFragment.prototype.nodeName = "#document-fragment";
+DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
+_extends(DocumentFragment,Node);
+
+
+function ProcessingInstruction() {
+}
+ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
+_extends(ProcessingInstruction,Node);
+function XMLSerializer(){}
+XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
+ return nodeSerializeToString.call(node,isHtml,nodeFilter);
+}
+Node.prototype.toString = nodeSerializeToString;
+function nodeSerializeToString(isHtml,nodeFilter){
+ var buf = [];
+ var refNode = this.nodeType == 9?this.documentElement:this;
+ var prefix = refNode.prefix;
+ var uri = refNode.namespaceURI;
+
+ if(uri && prefix == null){
+ //console.log(prefix)
+ var prefix = refNode.lookupPrefix(uri);
+ if(prefix == null){
+ //isHTML = true;
+ var visibleNamespaces=[
+ {namespace:uri,prefix:null}
+ //{namespace:uri,prefix:''}
+ ]
+ }
+ }
+ serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
+ //console.log('###',this.nodeType,uri,prefix,buf.join(''))
+ return buf.join('');
+}
+function needNamespaceDefine(node,isHTML, visibleNamespaces) {
+ var prefix = node.prefix||'';
+ var uri = node.namespaceURI;
+ if (!prefix && !uri){
+ return false;
+ }
+ if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
+ || uri == 'http://www.w3.org/2000/xmlns/'){
+ return false;
+ }
+
+ var i = visibleNamespaces.length
+ //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
+ while (i--) {
+ var ns = visibleNamespaces[i];
+ // get namespace prefix
+ //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
+ if (ns.prefix == prefix){
+ return ns.namespace != uri;
+ }
+ }
+ //console.log(isHTML,uri,prefix=='')
+ //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
+ // return false;
+ //}
+ //node.flag = '11111'
+ //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
+ return true;
+}
+function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
+ if(nodeFilter){
+ node = nodeFilter(node);
+ if(node){
+ if(typeof node == 'string'){
+ buf.push(node);
+ return;
+ }
+ }else{
+ return;
+ }
+ //buf.sort.apply(attrs, attributeSorter);
+ }
+ switch(node.nodeType){
+ case ELEMENT_NODE:
+ if (!visibleNamespaces) visibleNamespaces = [];
+ var startVisibleNamespaces = visibleNamespaces.length;
+ var attrs = node.attributes;
+ var len = attrs.length;
+ var child = node.firstChild;
+ var nodeName = node.tagName;
+
+ isHTML = (htmlns === node.namespaceURI) ||isHTML
+ buf.push('<',nodeName);
+
+
+
+ for(var i=0;i');
+ //if is cdata child node
+ if(isHTML && /^script$/i.test(nodeName)){
+ while(child){
+ if(child.data){
+ buf.push(child.data);
+ }else{
+ serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
+ }
+ child = child.nextSibling;
+ }
+ }else
+ {
+ while(child){
+ serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
+ child = child.nextSibling;
+ }
+ }
+ buf.push('',nodeName,'>');
+ }else{
+ buf.push('/>');
+ }
+ // remove added visible namespaces
+ //visibleNamespaces.length = startVisibleNamespaces;
+ return;
+ case DOCUMENT_NODE:
+ case DOCUMENT_FRAGMENT_NODE:
+ var child = node.firstChild;
+ while(child){
+ serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
+ child = child.nextSibling;
+ }
+ return;
+ case ATTRIBUTE_NODE:
+ return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
+ case TEXT_NODE:
+ return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
+ case CDATA_SECTION_NODE:
+ return buf.push( '');
+ case COMMENT_NODE:
+ return buf.push( "");
+ case DOCUMENT_TYPE_NODE:
+ var pubid = node.publicId;
+ var sysid = node.systemId;
+ buf.push('');
+ }else if(sysid && sysid!='.'){
+ buf.push(' SYSTEM "',sysid,'">');
+ }else{
+ var sub = node.internalSubset;
+ if(sub){
+ buf.push(" [",sub,"]");
+ }
+ buf.push(">");
+ }
+ return;
+ case PROCESSING_INSTRUCTION_NODE:
+ return buf.push( "",node.target," ",node.data,"?>");
+ case ENTITY_REFERENCE_NODE:
+ return buf.push( '&',node.nodeName,';');
+ //case ENTITY_NODE:
+ //case NOTATION_NODE:
+ default:
+ buf.push('??',node.nodeName);
+ }
+}
+function importNode(doc,node,deep){
+ var node2;
+ switch (node.nodeType) {
+ case ELEMENT_NODE:
+ node2 = node.cloneNode(false);
+ node2.ownerDocument = doc;
+ //var attrs = node2.attributes;
+ //var len = attrs.length;
+ //for(var i=0;i=0.1"
+ },
+ "homepage": "https://github.com/xmldom/xmldom",
+ "keywords": [
+ "w3c",
+ "dom",
+ "xml",
+ "parser",
+ "javascript",
+ "DOMParser",
+ "XMLSerializer"
+ ],
+ "license": "(LGPL-2.0 or MIT)",
+ "main": "./dom-parser.js",
+ "maintainers": [
+ {
+ "name": "jindw",
+ "email": "jindw@xidea.org",
+ "url": "http://www.xidea.org"
+ }
+ ],
+ "name": "xmldom",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/xmldom/xmldom.git"
+ },
+ "scripts": {
+ "test": "proof platform win32 && proof test */*/*.t.js || t/test"
+ },
+ "version": "0.1.31"
+}
diff --git a/node_modules/xmldom/readme.md b/node_modules/xmldom/readme.md
new file mode 100644
index 00000000..f832c448
--- /dev/null
+++ b/node_modules/xmldom/readme.md
@@ -0,0 +1,219 @@
+# XMLDOM [](http://travis-ci.org/bigeasy/xmldom) [](https://coveralls.io/r/bigeasy/xmldom) [](http://badge.fury.io/js/xmldom)
+
+A JavaScript implementation of W3C DOM for Node.js, Rhino and the browser. Fully
+compatible with `W3C DOM level2`; and some compatible with `level3`. Supports
+`DOMParser` and `XMLSerializer` interface such as in browser.
+
+Install:
+-------
+>npm install xmldom
+
+Example:
+====
+```javascript
+var DOMParser = require('xmldom').DOMParser;
+var doc = new DOMParser().parseFromString(
+ '\n'+
+ '\ttest\n'+
+ '\t\n'+
+ '\t\n'+
+ ''
+ ,'text/xml');
+doc.documentElement.setAttribute('x','y');
+doc.documentElement.setAttributeNS('./lite','c:x','y2');
+var nsAttr = doc.documentElement.getAttributeNS('./lite','x')
+console.info(nsAttr)
+console.info(doc)
+```
+API Reference
+=====
+
+ * [DOMParser](https://developer.mozilla.org/en/DOMParser):
+
+ ```javascript
+ parseFromString(xmlsource,mimeType)
+ ```
+ * **options extension** _by xmldom_(not BOM standard!!)
+
+ ```javascript
+ //added the options argument
+ new DOMParser(options)
+
+ //errorHandler is supported
+ new DOMParser({
+ /**
+ * locator is always need for error position info
+ */
+ locator:{},
+ /**
+ * you can override the errorHandler for xml parser
+ * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
+ */
+ errorHandler:{warning:function(w){console.warn(w)},error:callback,fatalError:callback}
+ //only callback model
+ //errorHandler:function(level,msg){console.log(level,msg)}
+ })
+
+ ```
+
+ * [XMLSerializer](https://developer.mozilla.org/en/XMLSerializer)
+
+ ```javascript
+ serializeToString(node)
+ ```
+DOM level2 method and attribute:
+------
+
+ * [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247)
+
+ attribute:
+ nodeValue|prefix
+ readonly attribute:
+ nodeName|nodeType|parentNode|childNodes|firstChild|lastChild|previousSibling|nextSibling|attributes|ownerDocument|namespaceURI|localName
+ method:
+ insertBefore(newChild, refChild)
+ replaceChild(newChild, oldChild)
+ removeChild(oldChild)
+ appendChild(newChild)
+ hasChildNodes()
+ cloneNode(deep)
+ normalize()
+ isSupported(feature, version)
+ hasAttributes()
+
+ * [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490)
+
+ method:
+ hasFeature(feature, version)
+ createDocumentType(qualifiedName, publicId, systemId)
+ createDocument(namespaceURI, qualifiedName, doctype)
+
+ * [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node
+
+ readonly attribute:
+ doctype|implementation|documentElement
+ method:
+ createElement(tagName)
+ createDocumentFragment()
+ createTextNode(data)
+ createComment(data)
+ createCDATASection(data)
+ createProcessingInstruction(target, data)
+ createAttribute(name)
+ createEntityReference(name)
+ getElementsByTagName(tagname)
+ importNode(importedNode, deep)
+ createElementNS(namespaceURI, qualifiedName)
+ createAttributeNS(namespaceURI, qualifiedName)
+ getElementsByTagNameNS(namespaceURI, localName)
+ getElementById(elementId)
+
+ * [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node
+ * [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node
+
+ readonly attribute:
+ tagName
+ method:
+ getAttribute(name)
+ setAttribute(name, value)
+ removeAttribute(name)
+ getAttributeNode(name)
+ setAttributeNode(newAttr)
+ removeAttributeNode(oldAttr)
+ getElementsByTagName(name)
+ getAttributeNS(namespaceURI, localName)
+ setAttributeNS(namespaceURI, qualifiedName, value)
+ removeAttributeNS(namespaceURI, localName)
+ getAttributeNodeNS(namespaceURI, localName)
+ setAttributeNodeNS(newAttr)
+ getElementsByTagNameNS(namespaceURI, localName)
+ hasAttribute(name)
+ hasAttributeNS(namespaceURI, localName)
+
+ * [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node
+
+ attribute:
+ value
+ readonly attribute:
+ name|specified|ownerElement
+
+ * [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177)
+
+ readonly attribute:
+ length
+ method:
+ item(index)
+
+ * [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922)
+
+ readonly attribute:
+ length
+ method:
+ getNamedItem(name)
+ setNamedItem(arg)
+ removeNamedItem(name)
+ item(index)
+ getNamedItemNS(namespaceURI, localName)
+ setNamedItemNS(arg)
+ removeNamedItemNS(namespaceURI, localName)
+
+ * [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node
+
+ method:
+ substringData(offset, count)
+ appendData(arg)
+ insertData(offset, arg)
+ deleteData(offset, count)
+ replaceData(offset, count, arg)
+
+ * [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData
+
+ method:
+ splitText(offset)
+
+ * [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212)
+ * [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData
+
+ * [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927)
+
+ readonly attribute:
+ name|entities|notations|publicId|systemId|internalSubset
+
+ * Notation : Node
+
+ readonly attribute:
+ publicId|systemId
+
+ * Entity : Node
+
+ readonly attribute:
+ publicId|systemId|notationName
+
+ * EntityReference : Node
+ * ProcessingInstruction : Node
+
+ attribute:
+ data
+ readonly attribute:
+ target
+
+DOM level 3 support:
+-----
+
+ * [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent)
+
+ attribute:
+ textContent
+ method:
+ isDefaultNamespace(namespaceURI){
+ lookupNamespaceURI(prefix)
+
+DOM extension by xmldom
+---
+ * [Node] Source position extension;
+
+ attribute:
+ //Numbered starting from '1'
+ lineNumber
+ //Numbered starting from '1'
+ columnNumber
diff --git a/node_modules/xmldom/sax.js b/node_modules/xmldom/sax.js
new file mode 100644
index 00000000..b33635f6
--- /dev/null
+++ b/node_modules/xmldom/sax.js
@@ -0,0 +1,633 @@
+//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
+//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
+//[5] Name ::= NameStartChar (NameChar)*
+var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
+var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
+var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
+//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
+//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
+
+//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
+//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
+var S_TAG = 0;//tag name offerring
+var S_ATTR = 1;//attr name offerring
+var S_ATTR_SPACE=2;//attr name end and space offer
+var S_EQ = 3;//=space?
+var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
+var S_ATTR_END = 5;//attr value end and no space(quot end)
+var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
+var S_TAG_CLOSE = 7;//closed el
+
+function XMLReader(){
+
+}
+
+XMLReader.prototype = {
+ parse:function(source,defaultNSMap,entityMap){
+ var domBuilder = this.domBuilder;
+ domBuilder.startDocument();
+ _copy(defaultNSMap ,defaultNSMap = {})
+ parse(source,defaultNSMap,entityMap,
+ domBuilder,this.errorHandler);
+ domBuilder.endDocument();
+ }
+}
+function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
+ function fixedFromCharCode(code) {
+ // String.prototype.fromCharCode does not supports
+ // > 2 bytes unicode chars directly
+ if (code > 0xffff) {
+ code -= 0x10000;
+ var surrogate1 = 0xd800 + (code >> 10)
+ , surrogate2 = 0xdc00 + (code & 0x3ff);
+
+ return String.fromCharCode(surrogate1, surrogate2);
+ } else {
+ return String.fromCharCode(code);
+ }
+ }
+ function entityReplacer(a){
+ var k = a.slice(1,-1);
+ if(k in entityMap){
+ return entityMap[k];
+ }else if(k.charAt(0) === '#'){
+ return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
+ }else{
+ errorHandler.error('entity not found:'+a);
+ return a;
+ }
+ }
+ function appendText(end){//has some bugs
+ if(end>start){
+ var xt = source.substring(start,end).replace(/?\w+;/g,entityReplacer);
+ locator&&position(start);
+ domBuilder.characters(xt,0,end-start);
+ start = end
+ }
+ }
+ function position(p,m){
+ while(p>=lineEnd && (m = linePattern.exec(source))){
+ lineStart = m.index;
+ lineEnd = lineStart + m[0].length;
+ locator.lineNumber++;
+ //console.log('line++:',locator,startPos,endPos)
+ }
+ locator.columnNumber = p-lineStart+1;
+ }
+ var lineStart = 0;
+ var lineEnd = 0;
+ var linePattern = /.*(?:\r\n?|\n)|.*$/g
+ var locator = domBuilder.locator;
+
+ var parseStack = [{currentNSMap:defaultNSMapCopy}]
+ var closeMap = {};
+ var start = 0;
+ while(true){
+ try{
+ var tagStart = source.indexOf('<',start);
+ if(tagStart<0){
+ if(!source.substr(start).match(/^\s*$/)){
+ var doc = domBuilder.doc;
+ var text = doc.createTextNode(source.substr(start));
+ doc.appendChild(text);
+ domBuilder.currentElement = text;
+ }
+ return;
+ }
+ if(tagStart>start){
+ appendText(tagStart);
+ }
+ switch(source.charAt(tagStart+1)){
+ case '/':
+ var end = source.indexOf('>',tagStart+3);
+ var tagName = source.substring(tagStart+2,end);
+ var config = parseStack.pop();
+ if(end<0){
+
+ tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
+ //console.error('#@@@@@@'+tagName)
+ errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
+ end = tagStart+1+tagName.length;
+ }else if(tagName.match(/\s)){
+ tagName = tagName.replace(/[\s<].*/,'');
+ errorHandler.error("end tag name: "+tagName+' maybe not complete');
+ end = tagStart+1+tagName.length;
+ }
+ //console.error(parseStack.length,parseStack)
+ //console.error(config);
+ var localNSMap = config.localNSMap;
+ var endMatch = config.tagName == tagName;
+ var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
+ if(endIgnoreCaseMach){
+ domBuilder.endElement(config.uri,config.localName,tagName);
+ if(localNSMap){
+ for(var prefix in localNSMap){
+ domBuilder.endPrefixMapping(prefix) ;
+ }
+ }
+ if(!endMatch){
+ errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
+ }
+ }else{
+ parseStack.push(config)
+ }
+
+ end++;
+ break;
+ // end elment
+ case '?':// ...?>
+ locator&&position(tagStart);
+ end = parseInstruction(source,tagStart,domBuilder);
+ break;
+ case '!':// start){
+ start = end;
+ }else{
+ //TODO: 这里有可能sax回退,有位置错误风险
+ appendText(Math.max(tagStart,start)+1);
+ }
+ }
+}
+function copyLocator(f,t){
+ t.lineNumber = f.lineNumber;
+ t.columnNumber = f.columnNumber;
+ return t;
+}
+
+/**
+ * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
+ * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
+ */
+function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
+ var attrName;
+ var value;
+ var p = ++start;
+ var s = S_TAG;//status
+ while(true){
+ var c = source.charAt(p);
+ switch(c){
+ case '=':
+ if(s === S_ATTR){//attrName
+ attrName = source.slice(start,p);
+ s = S_EQ;
+ }else if(s === S_ATTR_SPACE){
+ s = S_EQ;
+ }else{
+ //fatalError: equal must after attrName or space after attrName
+ throw new Error('attribute equal must after attrName');
+ }
+ break;
+ case '\'':
+ case '"':
+ if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
+ ){//equal
+ if(s === S_ATTR){
+ errorHandler.warning('attribute value must after "="')
+ attrName = source.slice(start,p)
+ }
+ start = p+1;
+ p = source.indexOf(c,start)
+ if(p>0){
+ value = source.slice(start,p).replace(/?\w+;/g,entityReplacer);
+ el.add(attrName,value,start-1);
+ s = S_ATTR_END;
+ }else{
+ //fatalError: no end quot match
+ throw new Error('attribute value no end \''+c+'\' match');
+ }
+ }else if(s == S_ATTR_NOQUOT_VALUE){
+ value = source.slice(start,p).replace(/?\w+;/g,entityReplacer);
+ //console.log(attrName,value,start,p)
+ el.add(attrName,value,start);
+ //console.dir(el)
+ errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
+ start = p+1;
+ s = S_ATTR_END
+ }else{
+ //fatalError: no equal before
+ throw new Error('attribute value must after "="');
+ }
+ break;
+ case '/':
+ switch(s){
+ case S_TAG:
+ el.setTagName(source.slice(start,p));
+ case S_ATTR_END:
+ case S_TAG_SPACE:
+ case S_TAG_CLOSE:
+ s =S_TAG_CLOSE;
+ el.closed = true;
+ case S_ATTR_NOQUOT_VALUE:
+ case S_ATTR:
+ case S_ATTR_SPACE:
+ break;
+ //case S_EQ:
+ default:
+ throw new Error("attribute invalid close char('/')")
+ }
+ break;
+ case ''://end document
+ //throw new Error('unexpected end of input')
+ errorHandler.error('unexpected end of input');
+ if(s == S_TAG){
+ el.setTagName(source.slice(start,p));
+ }
+ return p;
+ case '>':
+ switch(s){
+ case S_TAG:
+ el.setTagName(source.slice(start,p));
+ case S_ATTR_END:
+ case S_TAG_SPACE:
+ case S_TAG_CLOSE:
+ break;//normal
+ case S_ATTR_NOQUOT_VALUE://Compatible state
+ case S_ATTR:
+ value = source.slice(start,p);
+ if(value.slice(-1) === '/'){
+ el.closed = true;
+ value = value.slice(0,-1)
+ }
+ case S_ATTR_SPACE:
+ if(s === S_ATTR_SPACE){
+ value = attrName;
+ }
+ if(s == S_ATTR_NOQUOT_VALUE){
+ errorHandler.warning('attribute "'+value+'" missed quot(")!!');
+ el.add(attrName,value.replace(/?\w+;/g,entityReplacer),start)
+ }else{
+ if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
+ errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
+ }
+ el.add(value,value,start)
+ }
+ break;
+ case S_EQ:
+ throw new Error('attribute value missed!!');
+ }
+// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
+ return p;
+ /*xml space '\x20' | #x9 | #xD | #xA; */
+ case '\u0080':
+ c = ' ';
+ default:
+ if(c<= ' '){//space
+ switch(s){
+ case S_TAG:
+ el.setTagName(source.slice(start,p));//tagName
+ s = S_TAG_SPACE;
+ break;
+ case S_ATTR:
+ attrName = source.slice(start,p)
+ s = S_ATTR_SPACE;
+ break;
+ case S_ATTR_NOQUOT_VALUE:
+ var value = source.slice(start,p).replace(/?\w+;/g,entityReplacer);
+ errorHandler.warning('attribute "'+value+'" missed quot(")!!');
+ el.add(attrName,value,start)
+ case S_ATTR_END:
+ s = S_TAG_SPACE;
+ break;
+ //case S_TAG_SPACE:
+ //case S_EQ:
+ //case S_ATTR_SPACE:
+ // void();break;
+ //case S_TAG_CLOSE:
+ //ignore warning
+ }
+ }else{//not space
+//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
+//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
+ switch(s){
+ //case S_TAG:void();break;
+ //case S_ATTR:void();break;
+ //case S_ATTR_NOQUOT_VALUE:void();break;
+ case S_ATTR_SPACE:
+ var tagName = el.tagName;
+ if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
+ errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
+ }
+ el.add(attrName,attrName,start);
+ start = p;
+ s = S_ATTR;
+ break;
+ case S_ATTR_END:
+ errorHandler.warning('attribute space is required"'+attrName+'"!!')
+ case S_TAG_SPACE:
+ s = S_ATTR;
+ start = p;
+ break;
+ case S_EQ:
+ s = S_ATTR_NOQUOT_VALUE;
+ start = p;
+ break;
+ case S_TAG_CLOSE:
+ throw new Error("elements closed character '/' and '>' must be connected to");
+ }
+ }
+ }//end outer switch
+ //console.log('p++',p)
+ p++;
+ }
+}
+/**
+ * @return true if has new namespace define
+ */
+function appendElement(el,domBuilder,currentNSMap){
+ var tagName = el.tagName;
+ var localNSMap = null;
+ //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
+ var i = el.length;
+ while(i--){
+ var a = el[i];
+ var qName = a.qName;
+ var value = a.value;
+ var nsp = qName.indexOf(':');
+ if(nsp>0){
+ var prefix = a.prefix = qName.slice(0,nsp);
+ var localName = qName.slice(nsp+1);
+ var nsPrefix = prefix === 'xmlns' && localName
+ }else{
+ localName = qName;
+ prefix = null
+ nsPrefix = qName === 'xmlns' && ''
+ }
+ //can not set prefix,because prefix !== ''
+ a.localName = localName ;
+ //prefix == null for no ns prefix attribute
+ if(nsPrefix !== false){//hack!!
+ if(localNSMap == null){
+ localNSMap = {}
+ //console.log(currentNSMap,0)
+ _copy(currentNSMap,currentNSMap={})
+ //console.log(currentNSMap,1)
+ }
+ currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
+ a.uri = 'http://www.w3.org/2000/xmlns/'
+ domBuilder.startPrefixMapping(nsPrefix, value)
+ }
+ }
+ var i = el.length;
+ while(i--){
+ a = el[i];
+ var prefix = a.prefix;
+ if(prefix){//no prefix attribute has no namespace
+ if(prefix === 'xml'){
+ a.uri = 'http://www.w3.org/XML/1998/namespace';
+ }if(prefix !== 'xmlns'){
+ a.uri = currentNSMap[prefix || '']
+
+ //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
+ }
+ }
+ }
+ var nsp = tagName.indexOf(':');
+ if(nsp>0){
+ prefix = el.prefix = tagName.slice(0,nsp);
+ localName = el.localName = tagName.slice(nsp+1);
+ }else{
+ prefix = null;//important!!
+ localName = el.localName = tagName;
+ }
+ //no prefix element has default namespace
+ var ns = el.uri = currentNSMap[prefix || ''];
+ domBuilder.startElement(ns,localName,tagName,el);
+ //endPrefixMapping and startPrefixMapping have not any help for dom builder
+ //localNSMap = null
+ if(el.closed){
+ domBuilder.endElement(ns,localName,tagName);
+ if(localNSMap){
+ for(prefix in localNSMap){
+ domBuilder.endPrefixMapping(prefix)
+ }
+ }
+ }else{
+ el.currentNSMap = currentNSMap;
+ el.localNSMap = localNSMap;
+ //parseStack.push(el);
+ return true;
+ }
+}
+function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
+ if(/^(?:script|textarea)$/i.test(tagName)){
+ var elEndStart = source.indexOf(''+tagName+'>',elStartEnd);
+ var text = source.substring(elStartEnd+1,elEndStart);
+ if(/[&<]/.test(text)){
+ if(/^script$/i.test(tagName)){
+ //if(!/\]\]>/.test(text)){
+ //lexHandler.startCDATA();
+ domBuilder.characters(text,0,text.length);
+ //lexHandler.endCDATA();
+ return elEndStart;
+ //}
+ }//}else{//text area
+ text = text.replace(/?\w+;/g,entityReplacer);
+ domBuilder.characters(text,0,text.length);
+ return elEndStart;
+ //}
+
+ }
+ }
+ return elStartEnd+1;
+}
+function fixSelfClosed(source,elStartEnd,tagName,closeMap){
+ //if(tagName in closeMap){
+ var pos = closeMap[tagName];
+ if(pos == null){
+ //console.log(tagName)
+ pos = source.lastIndexOf(''+tagName+'>')
+ if(pos',start+4);
+ //append comment source.substring(4,end)//Harry Potter';
+ var doc = new dom().parseFromString(xml);
+ var nodes = xpath.select('//title', doc);
+ assert.equal('title', nodes[0].localName);
+ assert.equal('Harry Potter', nodes[0].firstChild.data);
+ assert.equal('Harry Potter', nodes[0].toString());
+
+ var nodes2 = xpath.select('//node()', doc);
+ assert.equal(7, nodes2.length);
+
+ var pis = xpath.select("/processing-instruction('series')", doc);
+ assert.equal(2, pis.length);
+ assert.equal('books="7"', pis[1].data);
+
+ test.done();
+ },
+
+ 'select single node': function(test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+
+ assert.equal('title', xpath.select('//title[1]', doc)[0].localName);
+
+ test.done();
+ },
+
+ 'select text node': function (test) {
+ var xml = 'HarryPotter';
+ var doc = new dom().parseFromString(xml);
+
+ assert.deepEqual('book', xpath.select('local-name(/book)', doc));
+ assert.deepEqual('Harry,Potter', xpath.select('//title/text()', doc).toString());
+
+ test.done();
+ },
+
+ 'select number value': function(test) {
+ var xml = 'HarryPotter';
+ var doc = new dom().parseFromString(xml);
+
+ assert.deepEqual(2, xpath.select('count(//title)', doc));
+
+ test.done();
+ },
+
+ 'select xpath with namespaces': function (test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+
+ var nodes = xpath.select('//*[local-name(.)="title" and namespace-uri(.)="myns"]', doc);
+ assert.equal('title', nodes[0].localName);
+ assert.equal('myns', nodes[0].namespaceURI) ;
+
+ var nodes2 = xpath.select('/*/title', doc);
+
+ assert.equal(0, nodes2.length);
+
+ test.done();
+ },
+
+ 'select xpath with namespaces, using a resolver': function (test) {
+ var xml = 'NarniaHarry PotterJKR';
+ var doc = new dom().parseFromString(xml);
+
+ var resolver = {
+ mappings: {
+ 'testns': 'http://example.com/test'
+ },
+ lookupNamespaceURI: function(prefix) {
+ return this.mappings[prefix];
+ }
+ }
+
+ var nodes = xpath.selectWithResolver('//testns:title/text()', doc, resolver);
+ assert.equal('Harry Potter', xpath.selectWithResolver('//testns:title/text()', doc, resolver)[0].nodeValue);
+ assert.equal('JKR', xpath.selectWithResolver('//testns:field[@testns:type="author"]/text()', doc, resolver)[0].nodeValue);
+
+ var nodes2 = xpath.selectWithResolver('/*/testns:*', doc, resolver);
+
+ assert.equal(2, nodes2.length);
+
+ test.done();
+ },
+
+ 'select xpath with default namespace, using a resolver': function (test) {
+ var xml = 'Harry PotterJKR';
+ var doc = new dom().parseFromString(xml);
+
+ var resolver = {
+ mappings: {
+ 'testns': 'http://example.com/test'
+ },
+ lookupNamespaceURI: function(prefix) {
+ return this.mappings[prefix];
+ }
+ }
+
+ var nodes = xpath.selectWithResolver('//testns:title/text()', doc, resolver);
+ assert.equal('Harry Potter', xpath.selectWithResolver('//testns:title/text()', doc, resolver)[0].nodeValue);
+ assert.equal('JKR', xpath.selectWithResolver('//testns:field[@type="author"]/text()', doc, resolver)[0].nodeValue);
+
+ test.done();
+ },
+
+ 'select xpath with namespaces, prefixes different in xml and xpath, using a resolver': function (test) {
+ var xml = 'Harry PotterJKR';
+ var doc = new dom().parseFromString(xml);
+
+ var resolver = {
+ mappings: {
+ 'ns': 'http://example.com/test'
+ },
+ lookupNamespaceURI: function(prefix) {
+ return this.mappings[prefix];
+ }
+ }
+
+ var nodes = xpath.selectWithResolver('//ns:title/text()', doc, resolver);
+ assert.equal('Harry Potter', xpath.selectWithResolver('//ns:title/text()', doc, resolver)[0].nodeValue);
+ assert.equal('JKR', xpath.selectWithResolver('//ns:field[@ns:type="author"]/text()', doc, resolver)[0].nodeValue);
+
+ test.done();
+ },
+
+ 'select xpath with namespaces, using namespace mappings': function (test) {
+ var xml = 'Harry PotterJKR';
+ var doc = new dom().parseFromString(xml);
+ var select = xpath.useNamespaces({'testns': 'http://example.com/test'});
+
+ assert.equal('Harry Potter', select('//testns:title/text()', doc)[0].nodeValue);
+ assert.equal('JKR', select('//testns:field[@testns:type="author"]/text()', doc)[0].nodeValue);
+
+ test.done();
+ },
+
+
+ 'select attribute': function (test) {
+ var xml = '';
+ var doc = new dom().parseFromString(xml);
+
+ var author = xpath.select1('/author/@name', doc).value;
+ assert.equal('J. K. Rowling', author);
+
+ test.done();
+ }
+
+ ,'select with multiple predicates': function (test) {
+ var xml = '';
+ var doc = new dom().parseFromString(xml);
+
+ var characters = xpath.select('/*/character[@sex = "M"][@age > 40]/@name', doc);
+
+ assert.equal(1, characters.length);
+ assert.equal('Snape', characters[0].textContent);
+
+ test.done();
+ }
+
+ // https://github.com/goto100/xpath/issues/37
+ ,'select multiple attributes': function (test) {
+ var xml = '';
+ var doc = new dom().parseFromString(xml);
+
+ var authors = xpath.select('/authors/author/@name', doc);
+ assert.equal(2, authors.length);
+ assert.equal('J. K. Rowling', authors[0].value);
+
+ // https://github.com/goto100/xpath/issues/41
+ doc = new dom().parseFromString('');
+ var nodes = xpath.select("/chapters/chapter/@v", doc);
+ var values = nodes.map(function(n) { return n.value; });
+
+ assert.equal(3, values.length);
+ assert.equal("1", values[0]);
+ assert.equal("2", values[1]);
+ assert.equal("3", values[2]);
+
+ test.done();
+ }
+
+ ,'XPathException acts like Error': function (test) {
+ try {
+ xpath.evaluate('1', null, null, null);
+ assert.fail(null, null, 'evaluate() should throw exception');
+ } catch (e) {
+ assert.ok('code' in e, 'must have a code');
+ assert.ok('stack' in e, 'must have a stack');
+ }
+
+ test.done();
+ },
+
+ 'string() with no arguments': function (test) {
+ var doc = new dom().parseFromString('Harry Potter');
+
+ var rootElement = xpath.select1('/book', doc);
+ assert.ok(rootElement, 'rootElement is null');
+
+ assert.equal('Harry Potter', xpath.select1('string()', doc));
+
+ test.done();
+ },
+
+ 'string value of document fragment': function (test) {
+ var doc = new dom().parseFromString('');
+ var docFragment = doc.createDocumentFragment();
+
+ var el = doc.createElement("book");
+ docFragment.appendChild(el);
+
+ var testValue = "Harry Potter";
+
+ el.appendChild(doc.createTextNode(testValue));
+
+ assert.equal(testValue, xpath.select1("string()", docFragment));
+
+ test.done();
+ },
+
+ 'compare string of a number with a number': function (test) {
+ assert.ok(xpath.select1('"000" = 0'), '000');
+ assert.ok(xpath.select1('"45.0" = 45'), '45');
+
+ test.done();
+ },
+
+ 'string(boolean) is a string': function (test) {
+ assert.equal('string', typeof xpath.select1('string(true())'));
+ assert.equal('string', typeof xpath.select1('string(false())'));
+ assert.equal('string', typeof xpath.select1('string(1 = 2)'));
+ assert.ok(xpath.select1('"true" = string(true())'), '"true" = string(true())');
+
+ test.done();
+ },
+
+ 'string should downcast to boolean': function (test) {
+ assert.equal(false, xpath.select1('"false" = false()'), '"false" = false()');
+ assert.equal(true, xpath.select1('"a" = true()'), '"a" = true()');
+ assert.equal(true, xpath.select1('"" = false()'), '"" = false()');
+
+ test.done();
+ },
+
+ 'string(number) is a string': function (test) {
+ assert.equal('string', typeof xpath.select1('string(45)'));
+ assert.ok(xpath.select1('"45" = string(45)'), '"45" = string(45)');
+
+ test.done();
+ },
+
+ 'correct string to number conversion': function (test) {
+ assert.equal(45.2, xpath.select1('number("45.200")'));
+ assert.equal(55.0, xpath.select1('number("000055")'));
+ assert.equal(65.0, xpath.select1('number(" 65 ")'));
+
+ assert.equal(true, xpath.select1('"" != 0'), '"" != 0');
+ assert.equal(false, xpath.select1('"" = 0'), '"" = 0');
+ assert.equal(false, xpath.select1('0 = ""'), '0 = ""');
+ assert.equal(false, xpath.select1('0 = " "'), '0 = " "');
+
+ assert.ok(Number.isNaN(xpath.select('number("")')), 'number("")');
+ assert.ok(Number.isNaN(xpath.select('number("45.8g")')), 'number("45.8g")');
+ assert.ok(Number.isNaN(xpath.select('number("2e9")')), 'number("2e9")');
+ assert.ok(Number.isNaN(xpath.select('number("+33")')), 'number("+33")');
+
+ test.done();
+ }
+
+ ,'correct number to string conversion': function (test) {
+ assert.equal('0.0000000000000000000000005250000000000001', xpath.parse('0.525 div 1000000 div 1000000 div 1000000 div 1000000').evaluateString());
+ assert.equal('525000000000000000000000', xpath.parse('0.525 * 1000000 * 1000000 * 1000000 * 1000000').evaluateString());
+
+ test.done();
+ }
+
+ ,'local-name() and name() of processing instruction': function (test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+ var expectedName = 'book-record';
+ var localName = xpath.select('local-name(/processing-instruction())', doc);
+ var name = xpath.select('name(/processing-instruction())', doc);
+
+ assert.deepEqual(expectedName, localName, 'local-name() - "' + expectedName + '" !== "' + localName + '"');
+ assert.deepEqual(expectedName, name, 'name() - "' + expectedName + '" !== "' + name + '"');
+
+ test.done();
+ },
+
+ 'evaluate substring-after': function (test) {
+ var xml = 'Hermione';
+ var doc = new dom().parseFromString(xml);
+
+ var part = xpath.select('substring-after(/classmate, "Her")', doc);
+ assert.deepEqual('mione', part);
+
+ test.done();
+ }
+
+ ,'parsed expression with no options': function (test) {
+ var parsed = xpath.parse('5 + 7');
+
+ assert.equal(typeof parsed, "object", "parse() should return an object");
+ assert.equal(typeof parsed.evaluate, "function", "parsed.evaluate should be a function");
+ assert.equal(typeof parsed.evaluateNumber, "function", "parsed.evaluateNumber should be a function");
+
+ assert.equal(parsed.evaluateNumber(), 12);
+
+ // evaluating twice should yield the same result
+ assert.equal(parsed.evaluateNumber(), 12);
+
+ test.done();
+ }
+
+ ,'select1() on parsed expression': function (test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+ var parsed = xpath.parse('/*/title');
+
+ assert.equal(typeof parsed, 'object', 'parse() should return an object');
+
+ assert.equal(typeof parsed.select1, 'function', 'parsed.select1 should be a function');
+
+ var single = parsed.select1({ node: doc });
+
+ assert.equal('title', single.localName);
+ assert.equal('Harry Potter', single.firstChild.data);
+ assert.equal('Harry Potter', single.toString());
+
+ test.done();
+ }
+
+ ,'select() on parsed expression': function (test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+ var parsed = xpath.parse('/*/title');
+
+ assert.equal(typeof parsed, 'object', 'parse() should return an object');
+
+ assert.equal(typeof parsed.select, 'function', 'parsed.select should be a function');
+
+ var nodes = parsed.select({ node: doc });
+
+ assert.ok(nodes, 'parsed.select() should return a value');
+ assert.equal(1, nodes.length);
+ assert.equal('title', nodes[0].localName);
+ assert.equal('Harry Potter', nodes[0].firstChild.data);
+ assert.equal('Harry Potter', nodes[0].toString());
+
+ test.done();
+ }
+
+ ,'evaluateString(), and evaluateNumber() on parsed expression with node': function (test) {
+ var xml = 'Harry Potter7';
+ var doc = new dom().parseFromString(xml);
+ var parsed = xpath.parse('/*/numVolumes');
+
+ assert.equal(typeof parsed, 'object', 'parse() should return an object');
+
+ assert.equal(typeof parsed.evaluateString, 'function', 'parsed.evaluateString should be a function');
+ assert.equal('7', parsed.evaluateString({ node: doc }));
+
+ assert.equal(typeof parsed.evaluateBoolean, 'function', 'parsed.evaluateBoolean should be a function');
+ assert.equal(true, parsed.evaluateBoolean({ node: doc }));
+
+ assert.equal(typeof parsed.evaluateNumber, 'function', 'parsed.evaluateNumber should be a function');
+ assert.equal(7, parsed.evaluateNumber({ node: doc }));
+
+ test.done();
+ }
+
+ ,'evaluateBoolean() on parsed empty node set and boolean expressions': function (test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+ var context = { node: doc };
+
+ function evaluate(path) {
+ return xpath.parse(path).evaluateBoolean({ node: doc });
+ }
+
+ assert.equal(false, evaluate('/*/myrtle'), 'boolean value of empty node set should be false');
+
+ assert.equal(true, evaluate('not(/*/myrtle)'), 'not() of empty nodeset should be true');
+
+ assert.equal(true, evaluate('/*/title'), 'boolean value of non-empty nodeset should be true');
+
+ assert.equal(true, evaluate('/*/title = "Harry Potter"'), 'title equals Harry Potter');
+
+ assert.equal(false, evaluate('/*/title != "Harry Potter"'), 'title != Harry Potter should be false');
+
+ assert.equal(false, evaluate('/*/title = "Percy Jackson"'), 'title should not equal Percy Jackson');
+
+ test.done();
+ }
+
+ ,'namespaces with parsed expression': function (test) {
+ var xml = '' +
+ 'QuirrellFluffy' +
+ 'MyrtleTom Riddle' +
+ '';
+ var doc = new dom().parseFromString(xml);
+
+ var expr = xpath.parse('/characters/c:character');
+ var countExpr = xpath.parse('count(/characters/c:character)');
+ var csns = 'http://chamber-secrets.com';
+
+ function resolve(prefix) {
+ if (prefix === 'c') {
+ return csns;
+ }
+ }
+
+ function testContext(context, description) {
+ try {
+ var value = expr.evaluateString(context);
+ var count = countExpr.evaluateNumber(context);
+
+ assert.equal('Myrtle', value, description + ' - string value - ' + value);
+ assert.equal(2, count, description + ' map - count - ' + count);
+ } catch(e) {
+ e.message = description + ': ' + (e.message || '');
+ throw e;
+ }
+ }
+
+ testContext({
+ node: doc,
+ namespaces: {
+ c: csns
+ }
+ }, 'Namespace map');
+
+ testContext({
+ node: doc,
+ namespaces: resolve
+ }, 'Namespace function');
+
+ testContext({
+ node: doc,
+ namespaces: {
+ getNamespace: resolve
+ }
+ }, 'Namespace object');
+
+ test.done();
+ }
+
+ ,'custom functions': function (test) {
+ var xml = 'Harry Potter';
+ var doc = new dom().parseFromString(xml);
+
+ var parsed = xpath.parse('concat(double(/*/title), " is cool")');
+
+ function doubleString(context, value) {
+ assert.equal(2, arguments.length);
+ var str = value.stringValue();
+ return str + str;
+ }
+
+ function functions(name, namespace) {
+ if(name === 'double') {
+ return doubleString;
+ }
+ return null;
+ }
+
+ function testContext(context, description) {
+ try{
+ var actual = parsed.evaluateString(context);
+ var expected = 'Harry PotterHarry Potter is cool';
+ assert.equal(expected, actual, description + ' - ' + expected + ' != ' + actual);
+ } catch (e) {
+ e.message = description + ": " + (e.message || '');
+ throw e;
+ }
+ }
+
+ testContext({
+ node: doc,
+ functions: functions
+ }, 'Functions function');
+
+ testContext({
+ node: doc,
+ functions: {
+ getFunction: functions
+ }
+ }, 'Functions object');
+
+ testContext({
+ node: doc,
+ functions: {
+ double: doubleString
+ }
+ }, 'Functions map');
+
+ test.done();
+ }
+
+ ,'custom function namespaces': function (test) {
+ var xml = 'Harry PotterRonHermioneNeville';
+ var doc = new dom().parseFromString(xml);
+
+ var parsed = xpath.parse('concat(hp:double(/*/title), " is 2 cool ", hp:square(2), " school")');
+ var hpns = 'http://harry-potter.com';
+
+ var namespaces = {
+ hp: hpns
+ };
+
+ var context = {
+ node: doc,
+ namespaces: {
+ hp: hpns
+ },
+ functions: function (name, namespace) {
+ if (namespace === hpns) {
+ switch (name) {
+ case "double":
+ return function (context, value) {
+ assert.equal(2, arguments.length);
+ var str = value.stringValue();
+ return str + str;
+ };
+ case "square":
+ return function (context, value) {
+ var num = value.numberValue();
+ return num * num;
+ };
+
+ case "xor":
+ return function (context, l, r) {
+ assert.equal(3, arguments.length);
+ var lbool = l.booleanValue();
+ var rbool = r.booleanValue();
+ return (lbool || rbool) && !(lbool && rbool);
+ };
+
+ case "second":
+ return function (context, nodes) {
+ var nodesArr = nodes.toArray();
+ var second = nodesArr[1];
+ return second ? [second] : [];
+ };
+ }
+ }
+ return null;
+ }
+ };
+
+ assert.equal('Harry PotterHarry Potter is 2 cool 4 school', parsed.evaluateString(context));
+
+ assert.equal(false, xpath.parse('hp:xor(false(), false())').evaluateBoolean(context));
+ assert.equal(true, xpath.parse('hp:xor(false(), true())').evaluateBoolean(context));
+ assert.equal(true, xpath.parse('hp:xor(true(), false())').evaluateBoolean(context));
+ assert.equal(false, xpath.parse('hp:xor(true(), true())').evaluateBoolean(context));
+
+ assert.equal('Hermione', xpath.parse('hp:second(/*/friend)').evaluateString(context));
+ assert.equal(1, xpath.parse('count(hp:second(/*/friend))').evaluateNumber(context));
+ assert.equal(0, xpath.parse('count(hp:second(/*/friendz))').evaluateNumber(context));
+
+ test.done();
+ }
+
+ ,'xpath variables': function (test) {
+ var xml = 'Harry Potter7';
+ var doc = new dom().parseFromString(xml);
+
+ var variables = {
+ title: 'Harry Potter',
+ notTitle: 'Percy Jackson',
+ houses: 4
+ };
+
+ function variableFunction(name) {
+ return variables[name];
+ }
+
+ function testContext(context, description) {
+ try{
+ assert.equal(true, xpath.parse('$title = /*/title').evaluateBoolean(context));
+ assert.equal(false, xpath.parse('$notTitle = /*/title').evaluateBoolean(context));
+ assert.equal(11, xpath.parse('$houses + /*/volumes').evaluateNumber(context));
+ } catch (e) {
+ e.message = description + ": " + (e.message || '');
+ throw e;
+ }
+ }
+
+ testContext({
+ node: doc,
+ variables: variableFunction
+ }, 'Variables function');
+
+ testContext({
+ node: doc,
+ variables: {
+ getVariable: variableFunction
+ }
+ }, 'Variables object');
+
+ testContext({
+ node: doc,
+ variables: variables
+ }, 'Variables map');
+
+ test.done();
+ }
+
+ ,'xpath variable namespaces': function (test) {
+ var xml = 'Harry Potter7';
+ var doc = new dom().parseFromString(xml);
+ var hpns = 'http://harry-potter.com';
+
+ var context = {
+ node: doc,
+ namespaces: {
+ hp: hpns
+ },
+ variables: function(name, namespace) {
+ if (namespace === hpns) {
+ switch (name) {
+ case 'title': return 'Harry Potter';
+ case 'houses': return 4;
+ case 'false': return false;
+ case 'falseStr': return 'false';
+ }
+ } else if (namespace === '') {
+ switch (name) {
+ case 'title': return 'World';
+ }
+ }
+
+ return null;
+ }
+ };
+
+ assert.equal(true, xpath.parse('$hp:title = /*/title').evaluateBoolean(context));
+ assert.equal(false, xpath.parse('$title = /*/title').evaluateBoolean(context));
+ assert.equal('World', xpath.parse('$title').evaluateString(context));
+ assert.equal(false, xpath.parse('$hp:false').evaluateBoolean(context));
+ assert.notEqual(false, xpath.parse('$hp:falseStr').evaluateBoolean(context));
+ assert.throws(function () {
+ xpath.parse('$hp:hello').evaluateString(context);
+ }, function (err) {
+ return err.message === 'Undeclared variable: $hp:hello';
+ });
+
+ test.done();
+ }
+
+ ,"detect unterminated string literals": function (test) {
+ function testUnterminated(path) {
+ assert.throws(function () {
+ xpath.evaluate('"hello');
+ }, function (err) {
+ return err.message.indexOf('Unterminated') !== -1;
+ });
+ }
+
+ testUnterminated('"Hello');
+ testUnterminated("'Hello");
+ testUnterminated('self::text() = "\""');
+ testUnterminated('"\""');
+
+ test.done();
+ }
+
+ ,"string value for CDATA sections": function (test) {
+ var xml = "Ron ",
+ doc = new dom().parseFromString(xml),
+ person1 = xpath.parse("/people/person").evaluateString({ node: doc }),
+ person2 = xpath.parse("/people/person/text()").evaluateString({ node: doc }),
+ person3 = xpath.select("string(/people/person/text())", doc);
+ person4 = xpath.parse("/people/person[2]").evaluateString({ node: doc });
+
+ assert.equal(person1, 'Harry Potter');
+ assert.equal(person2, 'Harry Potter');
+ assert.equal(person3, 'Harry Potter');
+ assert.equal(person4, 'Ron Weasley');
+
+ test.done();
+ }
+
+ ,"string value of various node types": function (test) {
+ var xml = "Harry Potter",
+ doc = new dom().parseFromString(xml),
+ allText = xpath.parse('.').evaluateString({ node: doc }),
+ ns = xpath.parse('*/namespace::*[name() = "hp"]').evaluateString({ node: doc }),
+ title = xpath.parse('*/title').evaluateString({ node: doc }),
+ child = xpath.parse('*/*').evaluateString({ node: doc }),
+ titleLang = xpath.parse('*/*/@lang').evaluateString({ node: doc }),
+ pi = xpath.parse('*/processing-instruction()').evaluateString({ node: doc }),
+ comment = xpath.parse('*/comment()').evaluateString({ node: doc });
+
+ assert.equal(allText, "Harry Potter & the Philosopher's StoneHarry Potter");
+ assert.equal(ns, 'http://harry');
+ assert.equal(title, "Harry Potter & the Philosopher's Stone");
+ assert.equal(child, "Harry Potter & the Philosopher's Stone");
+ assert.equal(titleLang, 'en');
+ assert.equal(pi.trim(), "name='J.K. Rowling'");
+ assert.equal(comment, ' This describes the Harry Potter Book ');
+
+ test.done();
+ }
+
+ ,"exposes custom types": function (test) {
+ assert.ok(xpath.XPath, "xpath.XPath");
+ assert.ok(xpath.XPathParser, "xpath.XPathParser");
+ assert.ok(xpath.XPathResult, "xpath.XPathResult");
+
+ assert.ok(xpath.Step, "xpath.Step");
+ assert.ok(xpath.NodeTest, "xpath.NodeTest");
+ assert.ok(xpath.BarOperation, "xpath.BarOperation");
+
+ assert.ok(xpath.NamespaceResolver, "xpath.NamespaceResolver");
+ assert.ok(xpath.FunctionResolver, "xpath.FunctionResolver");
+ assert.ok(xpath.VariableResolver, "xpath.VariableResolver");
+
+ assert.ok(xpath.Utilities, "xpath.Utilities");
+
+ assert.ok(xpath.XPathContext, "xpath.XPathContext");
+ assert.ok(xpath.XNodeSet, "xpath.XNodeSet");
+ assert.ok(xpath.XBoolean, "xpath.XBoolean");
+ assert.ok(xpath.XString, "xpath.XString");
+ assert.ok(xpath.XNumber, "xpath.XNumber");
+
+ test.done();
+ }
+
+ ,"work with nodes created using DOM1 createElement()": function (test) {
+ var doc = new dom().parseFromString('');
+
+ doc.documentElement.appendChild(doc.createElement('characters'));
+
+ assert.ok(xpath.select1('/book/characters', doc));
+
+ assert.equal(xpath.select1('local-name(/book/characters)', doc), 'characters');
+
+ test.done();
+ }
+
+ ,"preceding:: axis works on document fragments": function (test) {
+ var doc = new dom().parseFromString(''),
+ df = doc.createDocumentFragment(),
+ root = doc.createElement('book');
+
+ df.appendChild(root);
+
+ for (var i = 0; i < 10; i += 1) {
+ root.appendChild(doc.createElement('chapter'));
+ }
+
+ var chapter = xpath.select1("book/chapter[5]", df);
+
+ assert.ok(chapter, 'chapter');
+
+ assert.equal(xpath.select("count(preceding::chapter)", chapter), 4);
+
+ test.done();
+ }
+
+ ,"node set sorted and unsorted arrays": function (test) {
+ var doc = new dom().parseFromString('HarryRonHermione'),
+ path = xpath.parse("/*/*[3] | /*/*[2] | /*/*[1]")
+ nset = path.evaluateNodeSet({ node: doc }),
+ sorted = nset.toArray(),
+ unsorted = nset.toUnsortedArray();
+
+ assert.equal(sorted.length, 3);
+ assert.equal(unsorted.length, 3);
+
+ assert.equal(sorted[0].textContent, 'Harry');
+ assert.equal(sorted[1].textContent, 'Ron');
+ assert.equal(sorted[2].textContent, 'Hermione');
+
+ assert.notEqual(sorted[0], unsorted[0], "first nodeset element equal");
+
+ test.done();
+ }
+
+ ,'meaningful error for invalid function': function(test) {
+ var path = xpath.parse('invalidFunc()');
+
+ assert.throws(function () {
+ path.evaluateString();
+ }, function (err) {
+ return err.message.indexOf('invalidFunc') !== -1;
+ });
+
+ var path2 = xpath.parse('funcs:invalidFunc()');
+
+ assert.throws(function () {
+ path2.evaluateString({
+ namespaces: {
+ funcs: 'myfunctions'
+ }
+ });
+ }, function (err) {
+ return err.message.indexOf('invalidFunc') !== -1;
+ });
+
+ test.done();
+ }
+
+ // https://github.com/goto100/xpath/issues/32
+ ,'supports contains() function on attributes': function (test) {
+ var doc = new dom().parseFromString(""),
+ andTheBooks = xpath.select("/books/book[contains(@title, ' ')]", doc),
+ secretBooks = xpath.select("/books/book[contains(@title, 'Secrets')]", doc);
+
+ assert.equal(andTheBooks.length, 2);
+ assert.equal(secretBooks.length, 1);
+
+ test.done();
+ }
+
+ ,'compare multiple nodes to multiple nodes (equals)': function (test) {
+ var xml = '' +
+ 'HarryHermione' +
+ 'DracoCrabbe' +
+ 'LunaCho' +
+ '' +
+ 'HermioneLuna';
+
+ var doc = new dom().parseFromString(xml);
+ var houses = xpath.parse('/school/houses/house[student = /school/honorStudents/student]').select({ node: doc });
+
+ assert.equal(houses.length, 2);
+
+ var houseNames = houses.map(function (node) { return node.getAttribute('name'); }).sort();
+
+ assert.equal(houseNames[0], 'Gryffindor');
+ assert.equal(houseNames[1], 'Ravenclaw');
+
+ test.done();
+ }
+
+ ,'compare multiple nodes to multiple nodes (gte)': function (test) {
+ var xml = '' +
+ 'HarryHermione' +
+ 'GoyleCrabbe' +
+ 'LunaCho' +
+ '' +
+ 'DADACharms' +
+ '';
+
+ var doc = new dom().parseFromString(xml);
+ var houses = xpath.parse('/school/houses/house[student/@level >= /school/courses/course/@minLevel]').select({ node: doc });
+
+ assert.equal(houses.length, 2);
+
+ var houseNames = houses.map(function (node) { return node.getAttribute('name'); }).sort();
+
+ assert.equal(houseNames[0], 'Gryffindor');
+ assert.equal(houseNames[1], 'Ravenclaw');
+
+ test.done();
+ }
+
+ ,'inequality comparisons with nodesets': function (test) {
+ var xml = "";
+ var doc = new dom().parseFromString(xml);
+
+ var options = { node: doc, variables: { theNumber: 3, theString: '3', theBoolean: true }};
+
+ var numberPaths = [
+ '/books/book[$theNumber <= @num]',
+ '/books/book[$theNumber < @num]',
+ '/books/book[$theNumber >= @num]',
+ '/books/book[$theNumber > @num]'
+ ];
+
+ var stringPaths = [
+ '/books/book[$theString <= @num]',
+ '/books/book[$theString < @num]',
+ '/books/book[$theString >= @num]',
+ '/books/book[$theString > @num]'
+ ];
+
+ var booleanPaths = [
+ '/books/book[$theBoolean <= @num]',
+ '/books/book[$theBoolean < @num]',
+ '/books/book[$theBoolean >= @num]',
+ '/books/book[$theBoolean > @num]'
+ ];
+
+ var lhsPaths = [
+ '/books/book[@num <= $theNumber]',
+ '/books/book[@num < $theNumber]'
+ ];
+
+ function countNodes(paths){
+ return paths
+ .map(xpath.parse)
+ .map(function (path) { return path.select(options) })
+ .map(function (arr) { return arr.length; });
+ }
+
+ assert.deepEqual(countNodes(numberPaths), [5, 4, 3, 2], 'numbers');
+ assert.deepEqual(countNodes(stringPaths), [5, 4, 3, 2], 'strings');
+ assert.deepEqual(countNodes(booleanPaths), [7, 6, 1, 0], 'numbers');
+ assert.deepEqual(countNodes(lhsPaths), [3, 2], 'lhs');
+
+ test.done();
+ }
+
+ ,'error when evaluating boolean as number': function (test) {
+ var num = xpath.parse('"a" = "b"').evaluateNumber();
+
+ assert.equal(num, 0);
+
+ var str = xpath.select('substring("expelliarmus", 1, "a" = "a")');
+
+ assert.equal(str, 'e');
+
+ test.done();
+ }
+
+ ,'string values of parsed expressions': function (test) {
+ var parser = new xpath.XPathParser();
+
+ var simpleStep = parser.parse('my:book');
+
+ assert.equal(simpleStep.toString(), 'child::my:book');
+
+ var precedingSib = parser.parse('preceding-sibling::my:chapter');
+
+ assert.equal(precedingSib.toString(), 'preceding-sibling::my:chapter');
+
+ var withPredicates = parser.parse('book[number > 3][contains(title, "and the")]');
+
+ assert.equal(withPredicates.toString(), "child::book[(child::number > 3)][contains(child::title, 'and the')]");
+
+ var parenthesisWithPredicate = parser.parse('(/books/book/chapter)[7]');
+
+ assert.equal(parenthesisWithPredicate.toString(), '(/child::books/child::book/child::chapter)[7]');
+
+ var charactersOver20 = parser.parse('heroes[age > 20] | villains[age > 20]');
+
+ assert.equal(charactersOver20.toString(), 'child::heroes[(child::age > 20)] | child::villains[(child::age > 20)]');
+
+ test.done();
+ }
+
+ ,'context position should work correctly': function (test) {
+ var doc = new dom().parseFromString("The boy who livedThe vanishing glassThe worst birthdayDobby's warningThe burrow");
+
+ var chapters = xpath.parse('/books/book/chapter[2]').select({ node: doc });
+
+ assert.equal(2, chapters.length);
+ assert.equal('The vanishing glass', chapters[0].textContent);
+ assert.equal("Dobby's warning", chapters[1].textContent);
+
+ var lastChapters = xpath.parse('/books/book/chapter[last()]').select({ node: doc });
+
+ assert.equal(2, lastChapters.length);
+ assert.equal('The vanishing glass', lastChapters[0].textContent);
+ assert.equal("The burrow", lastChapters[1].textContent);
+
+ var secondChapter = xpath.parse('(/books/book/chapter)[2]').select({ node: doc });
+
+ assert.equal(1, secondChapter.length);
+ assert.equal('The vanishing glass', chapters[0].textContent);
+
+ var lastChapter = xpath.parse('(/books/book/chapter)[last()]').select({ node: doc });
+
+ assert.equal(1, lastChapter.length);
+ assert.equal("The burrow", lastChapter[0].textContent);
+
+
+ test.done();
+ }
+
+ ,'should allow null namespaces for null prefixes': function (test) {
+ var markup = 'Hi Ron!
Hi Draco!
Hi Hermione!
';
+ var docHtml = new dom().parseFromString(markup, 'text/html');
+
+ var noPrefixPath = xpath.parse('/html/body/p[2]');
+
+ var greetings1 = noPrefixPath.select({ node: docHtml, allowAnyNamespaceForNoPrefix: false });
+
+ assert.equal(0, greetings1.length);
+
+ var allowAnyNamespaceOptions = { node: docHtml, allowAnyNamespaceForNoPrefix: true };
+
+ // if allowAnyNamespaceForNoPrefix specified, allow using prefix-less node tests to match nodes with no prefix
+ var greetings2 = noPrefixPath.select(allowAnyNamespaceOptions);
+
+ assert.equal(1, greetings2.length);
+ assert.equal('Hi Hermione!', greetings2[0].textContent);
+
+ var allGreetings = xpath.parse('/html/body/p').select(allowAnyNamespaceOptions);
+
+ assert.equal(2, allGreetings.length);
+
+ var nsm = { html: xhtmlNs, other: 'http://www.example.com/other' };
+
+ var prefixPath = xpath.parse('/html:html/body/html:p');
+ var optionsWithNamespaces = { node: docHtml, allowAnyNamespaceForNoPrefix: true, namespaces: nsm };
+
+ // if the path uses prefixes, they have to match
+ var greetings3 = prefixPath.select(optionsWithNamespaces);
+
+ assert.equal(2, greetings3.length);
+
+ var badPrefixPath = xpath.parse('/html:html/other:body/html:p');
+
+ var greetings4 = badPrefixPath.select(optionsWithNamespaces);
+
+ test.done();
+ }
+
+ ,'support isHtml option' : function (test){
+ var markup = 'Hi Ron!
Hi Draco!
Hi Hermione!
';
+ var docHtml = new dom().parseFromString(markup, 'text/html');
+
+ var ns = { h: xhtmlNs };
+
+ // allow matching on unprefixed nodes
+ var greetings1 = xpath.parse('/html/body/p').select({ node: docHtml, isHtml: true });
+
+ assert.equal(2, greetings1.length);
+
+ // allow case insensitive match
+ var greetings2 = xpath.parse('/h:html/h:bOdY/h:p').select({ node: docHtml, namespaces: ns, isHtml: true });
+
+ assert.equal(2, greetings2.length);
+
+ // non-html mode: allow select if case and namespaces match
+ var greetings3 = xpath.parse('/h:html/h:body/h:p').select({ node: docHtml, namespaces: ns });
+
+ assert.equal(2, greetings3.length);
+
+ // non-html mode: require namespaces
+ var greetings4 = xpath.parse('/html/body/p').select({ node: docHtml, namespaces: ns });
+
+ assert.equal(0, greetings4.length);
+
+ // non-html mode: require case to match
+ var greetings5 = xpath.parse('/h:html/h:bOdY/h:p').select({ node: docHtml, namespaces: ns });
+
+ assert.equal(0, greetings5.length);
+
+ test.done();
+ }
+
+ ,"builtin functions": function (test) {
+ var translated = xpath.parse('translate("hello", "lhho", "yHb")').evaluateString();
+
+ assert.equal('Heyy', translated);
+
+ var characters = new dom().parseFromString('HarryRonHermione');
+
+ var firstTwo = xpath.parse('/characters/character[position() <= 2]').select({ node: characters });
+
+ assert.equal(2, firstTwo.length);
+ assert.equal('Harry', firstTwo[0].textContent);
+ assert.equal('Ron', firstTwo[1].textContent);
+
+ var last = xpath.parse('/characters/character[last()]').select({ node: characters });
+
+ assert.equal(1, last.length);
+ assert.equal('Hermione', last[0].textContent);
+
+ test.done();
+ }
+}
diff --git a/node_modules/xpath/xpath.d.ts b/node_modules/xpath/xpath.d.ts
new file mode 100644
index 00000000..ac95996d
--- /dev/null
+++ b/node_modules/xpath/xpath.d.ts
@@ -0,0 +1,9 @@
+type SelectedValue = Node | Attr | string | number | boolean;
+interface XPathSelect {
+ (expression: string, node?: Node): Array;
+ (expression: string, node: Node, single: true): SelectedValue;
+}
+export var select: XPathSelect;
+export function select1(expression: string, node?: Node): SelectedValue;
+export function evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
+export function useNamespaces(namespaceMap: { [name: string]: string }): XPathSelect;
diff --git a/node_modules/xpath/xpath.js b/node_modules/xpath/xpath.js
new file mode 100644
index 00000000..02732c02
--- /dev/null
+++ b/node_modules/xpath/xpath.js
@@ -0,0 +1,4764 @@
+/*
+ * xpath.js
+ *
+ * An XPath 1.0 library for JavaScript.
+ *
+ * Cameron McCormack
+ *
+ * This work is licensed under the MIT License.
+ *
+ * Revision 20: April 26, 2011
+ * Fixed a typo resulting in FIRST_ORDERED_NODE_TYPE results being wrong,
+ * thanks to .
+ *
+ * Revision 19: November 29, 2005
+ * Nodesets now store their nodes in a height balanced tree, increasing
+ * performance for the common case of selecting nodes in document order,
+ * thanks to S閎astien Cramatte .
+ * AVL tree code adapted from Raimund Neumann .
+ *
+ * Revision 18: October 27, 2005
+ * DOM 3 XPath support. Caveats:
+ * - namespace prefixes aren't resolved in XPathEvaluator.createExpression,
+ * but in XPathExpression.evaluate.
+ * - XPathResult.invalidIteratorState is not implemented.
+ *
+ * Revision 17: October 25, 2005
+ * Some core XPath function fixes and a patch to avoid crashing certain
+ * versions of MSXML in PathExpr.prototype.getOwnerElement, thanks to
+ * S閎astien Cramatte .
+ *
+ * Revision 16: September 22, 2005
+ * Workarounds for some IE 5.5 deficiencies.
+ * Fixed problem with prefix node tests on attribute nodes.
+ *
+ * Revision 15: May 21, 2005
+ * Fixed problem with QName node tests on elements with an xmlns="...".
+ *
+ * Revision 14: May 19, 2005
+ * Fixed QName node tests on attribute node regression.
+ *
+ * Revision 13: May 3, 2005
+ * Node tests are case insensitive now if working in an HTML DOM.
+ *
+ * Revision 12: April 26, 2005
+ * Updated licence. Slight code changes to enable use of Dean
+ * Edwards' script compression, http://dean.edwards.name/packer/ .
+ *
+ * Revision 11: April 23, 2005
+ * Fixed bug with 'and' and 'or' operators, fix thanks to
+ * Sandy McArthur .
+ *
+ * Revision 10: April 15, 2005
+ * Added support for a virtual root node, supposedly helpful for
+ * implementing XForms. Fixed problem with QName node tests and
+ * the parent axis.
+ *
+ * Revision 9: March 17, 2005
+ * Namespace resolver tweaked so using the document node as the context
+ * for namespace lookups is equivalent to using the document element.
+ *
+ * Revision 8: February 13, 2005
+ * Handle implicit declaration of 'xmlns' namespace prefix.
+ * Fixed bug when comparing nodesets.
+ * Instance data can now be associated with a FunctionResolver, and
+ * workaround for MSXML not supporting 'localName' and 'getElementById',
+ * thanks to Grant Gongaware.
+ * Fix a few problems when the context node is the root node.
+ *
+ * Revision 7: February 11, 2005
+ * Default namespace resolver fix from Grant Gongaware
+ * .
+ *
+ * Revision 6: February 10, 2005
+ * Fixed bug in 'number' function.
+ *
+ * Revision 5: February 9, 2005
+ * Fixed bug where text nodes not getting converted to string values.
+ *
+ * Revision 4: January 21, 2005
+ * Bug in 'name' function, fix thanks to Bill Edney.
+ * Fixed incorrect processing of namespace nodes.
+ * Fixed NamespaceResolver to resolve 'xml' namespace.
+ * Implemented union '|' operator.
+ *
+ * Revision 3: January 14, 2005
+ * Fixed bug with nodeset comparisons, bug lexing < and >.
+ *
+ * Revision 2: October 26, 2004
+ * QName node test namespace handling fixed. Few other bug fixes.
+ *
+ * Revision 1: August 13, 2004
+ * Bug fixes from William J. Edney .
+ * Added minimal licence.
+ *
+ * Initial version: June 14, 2004
+ */
+
+// non-node wrapper
+var xpath = (typeof exports === 'undefined') ? {} : exports;
+
+(function(exports) {
+"use strict";
+
+// functional helpers
+function curry( func ) {
+ var slice = Array.prototype.slice,
+ totalargs = func.length,
+ partial = function( args, fn ) {
+ return function( ) {
+ return fn.apply( this, args.concat( slice.call( arguments ) ) );
+ }
+ },
+ fn = function( ) {
+ var args = slice.call( arguments );
+ return ( args.length < totalargs ) ?
+ partial( args, fn ) :
+ func.apply( this, slice.apply( arguments, [ 0, totalargs ] ) );
+ };
+ return fn;
+}
+
+var forEach = curry(function (f, xs) {
+ for (var i = 0; i < xs.length; i += 1) {
+ f(xs[i], i, xs);
+ }
+});
+
+var reduce = curry(function (f, seed, xs) {
+ var acc = seed;
+
+ forEach(function (x, i) { acc = f(acc, x, i); }, xs);
+
+ return acc;
+});
+
+var map = curry(function (f, xs) {
+ var mapped = new Array(xs.length);
+
+ forEach(function (x, i) { mapped[i] = f(x); }, xs);
+
+ return mapped;
+});
+
+var filter = curry(function (f, xs) {
+ var filtered = [];
+
+ forEach(function (x, i) { if(f(x, i)) { filtered.push(x); } }, xs);
+
+ return filtered;
+});
+
+function compose() {
+ if (arguments.length === 0) { throw new Error('compose requires at least one argument'); }
+
+ var funcs = Array.prototype.slice.call(arguments).reverse();
+
+ var f0 = funcs[0];
+ var fRem = funcs.slice(1);
+
+ return function () {
+ return reduce(function (acc, next) {
+ return next(acc);
+ }, f0.apply(null, arguments), fRem);
+ };
+}
+
+var includes = curry(function (values, value) {
+ for (var i = 0; i < values.length; i += 1) {
+ if (values[i] === value){
+ return true;
+ }
+ }
+
+ return false;
+});
+
+function always(value) { return function () { return value ;} }
+
+var prop = curry(function (name, obj) { return obj[name]; });
+
+function toString (x) { return x.toString(); }
+var join = curry(function (s, xs) { return xs.join(s); });
+var wrap = curry(function (pref, suf, str) { return pref + str + suf; });
+
+function assign(target) { // .length of function is 2
+ var to = Object(target);
+
+ for (var index = 1; index < arguments.length; index++) {
+ var nextSource = arguments[index];
+
+ if (nextSource != null) { // Skip over if undefined or null
+ for (var nextKey in nextSource) {
+ // Avoid bugs when hasOwnProperty is shadowed
+ if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+ to[nextKey] = nextSource[nextKey];
+ }
+ }
+ }
+ }
+
+ return to;
+}
+
+// XPathParser ///////////////////////////////////////////////////////////////
+
+XPathParser.prototype = new Object();
+XPathParser.prototype.constructor = XPathParser;
+XPathParser.superclass = Object.prototype;
+
+function XPathParser() {
+ this.init();
+}
+
+XPathParser.prototype.init = function() {
+ this.reduceActions = [];
+
+ this.reduceActions[3] = function(rhs) {
+ return new OrOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[5] = function(rhs) {
+ return new AndOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[7] = function(rhs) {
+ return new EqualsOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[8] = function(rhs) {
+ return new NotEqualOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[10] = function(rhs) {
+ return new LessThanOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[11] = function(rhs) {
+ return new GreaterThanOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[12] = function(rhs) {
+ return new LessThanOrEqualOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[13] = function(rhs) {
+ return new GreaterThanOrEqualOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[15] = function(rhs) {
+ return new PlusOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[16] = function(rhs) {
+ return new MinusOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[18] = function(rhs) {
+ return new MultiplyOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[19] = function(rhs) {
+ return new DivOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[20] = function(rhs) {
+ return new ModOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[22] = function(rhs) {
+ return new UnaryMinusOperation(rhs[1]);
+ };
+ this.reduceActions[24] = function(rhs) {
+ return new BarOperation(rhs[0], rhs[2]);
+ };
+ this.reduceActions[25] = function(rhs) {
+ return new PathExpr(undefined, undefined, rhs[0]);
+ };
+ this.reduceActions[27] = function(rhs) {
+ rhs[0].locationPath = rhs[2];
+ return rhs[0];
+ };
+ this.reduceActions[28] = function(rhs) {
+ rhs[0].locationPath = rhs[2];
+ rhs[0].locationPath.steps.unshift(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));
+ return rhs[0];
+ };
+ this.reduceActions[29] = function(rhs) {
+ return new PathExpr(rhs[0], [], undefined);
+ };
+ this.reduceActions[30] = function(rhs) {
+ if (Utilities.instance_of(rhs[0], PathExpr)) {
+ if (rhs[0].filterPredicates == undefined) {
+ rhs[0].filterPredicates = [];
+ }
+ rhs[0].filterPredicates.push(rhs[1]);
+ return rhs[0];
+ } else {
+ return new PathExpr(rhs[0], [rhs[1]], undefined);
+ }
+ };
+ this.reduceActions[32] = function(rhs) {
+ return rhs[1];
+ };
+ this.reduceActions[33] = function(rhs) {
+ return new XString(rhs[0]);
+ };
+ this.reduceActions[34] = function(rhs) {
+ return new XNumber(rhs[0]);
+ };
+ this.reduceActions[36] = function(rhs) {
+ return new FunctionCall(rhs[0], []);
+ };
+ this.reduceActions[37] = function(rhs) {
+ return new FunctionCall(rhs[0], rhs[2]);
+ };
+ this.reduceActions[38] = function(rhs) {
+ return [ rhs[0] ];
+ };
+ this.reduceActions[39] = function(rhs) {
+ rhs[2].unshift(rhs[0]);
+ return rhs[2];
+ };
+ this.reduceActions[43] = function(rhs) {
+ return new LocationPath(true, []);
+ };
+ this.reduceActions[44] = function(rhs) {
+ rhs[1].absolute = true;
+ return rhs[1];
+ };
+ this.reduceActions[46] = function(rhs) {
+ return new LocationPath(false, [ rhs[0] ]);
+ };
+ this.reduceActions[47] = function(rhs) {
+ rhs[0].steps.push(rhs[2]);
+ return rhs[0];
+ };
+ this.reduceActions[49] = function(rhs) {
+ return new Step(rhs[0], rhs[1], []);
+ };
+ this.reduceActions[50] = function(rhs) {
+ return new Step(Step.CHILD, rhs[0], []);
+ };
+ this.reduceActions[51] = function(rhs) {
+ return new Step(rhs[0], rhs[1], rhs[2]);
+ };
+ this.reduceActions[52] = function(rhs) {
+ return new Step(Step.CHILD, rhs[0], rhs[1]);
+ };
+ this.reduceActions[54] = function(rhs) {
+ return [ rhs[0] ];
+ };
+ this.reduceActions[55] = function(rhs) {
+ rhs[1].unshift(rhs[0]);
+ return rhs[1];
+ };
+ this.reduceActions[56] = function(rhs) {
+ if (rhs[0] == "ancestor") {
+ return Step.ANCESTOR;
+ } else if (rhs[0] == "ancestor-or-self") {
+ return Step.ANCESTORORSELF;
+ } else if (rhs[0] == "attribute") {
+ return Step.ATTRIBUTE;
+ } else if (rhs[0] == "child") {
+ return Step.CHILD;
+ } else if (rhs[0] == "descendant") {
+ return Step.DESCENDANT;
+ } else if (rhs[0] == "descendant-or-self") {
+ return Step.DESCENDANTORSELF;
+ } else if (rhs[0] == "following") {
+ return Step.FOLLOWING;
+ } else if (rhs[0] == "following-sibling") {
+ return Step.FOLLOWINGSIBLING;
+ } else if (rhs[0] == "namespace") {
+ return Step.NAMESPACE;
+ } else if (rhs[0] == "parent") {
+ return Step.PARENT;
+ } else if (rhs[0] == "preceding") {
+ return Step.PRECEDING;
+ } else if (rhs[0] == "preceding-sibling") {
+ return Step.PRECEDINGSIBLING;
+ } else if (rhs[0] == "self") {
+ return Step.SELF;
+ }
+ return -1;
+ };
+ this.reduceActions[57] = function(rhs) {
+ return Step.ATTRIBUTE;
+ };
+ this.reduceActions[59] = function(rhs) {
+ if (rhs[0] == "comment") {
+ return NodeTest.commentTest;
+ } else if (rhs[0] == "text") {
+ return NodeTest.textTest;
+ } else if (rhs[0] == "processing-instruction") {
+ return NodeTest.anyPiTest;
+ } else if (rhs[0] == "node") {
+ return NodeTest.nodeTest;
+ }
+ return new NodeTest(-1, undefined);
+ };
+ this.reduceActions[60] = function(rhs) {
+ return new NodeTest.PITest(rhs[2]);
+ };
+ this.reduceActions[61] = function(rhs) {
+ return rhs[1];
+ };
+ this.reduceActions[63] = function(rhs) {
+ rhs[1].absolute = true;
+ rhs[1].steps.unshift(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));
+ return rhs[1];
+ };
+ this.reduceActions[64] = function(rhs) {
+ rhs[0].steps.push(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));
+ rhs[0].steps.push(rhs[2]);
+ return rhs[0];
+ };
+ this.reduceActions[65] = function(rhs) {
+ return new Step(Step.SELF, NodeTest.nodeTest, []);
+ };
+ this.reduceActions[66] = function(rhs) {
+ return new Step(Step.PARENT, NodeTest.nodeTest, []);
+ };
+ this.reduceActions[67] = function(rhs) {
+ return new VariableReference(rhs[1]);
+ };
+ this.reduceActions[68] = function(rhs) {
+ return NodeTest.nameTestAny;
+ };
+ this.reduceActions[69] = function(rhs) {
+ return new NodeTest.NameTestPrefixAny(rhs[0].split(':')[0]);
+ };
+ this.reduceActions[70] = function(rhs) {
+ return new NodeTest.NameTestQName(rhs[0]);
+ };
+};
+
+XPathParser.actionTable = [
+ " s s sssssssss s ss s ss",
+ " s ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ " rrrrr ",
+ " s s sssssssss s ss s ss",
+ "rs rrrrrrrr s sssssrrrrrr rrs rs ",
+ " s s sssssssss s ss s ss",
+ " s ",
+ " s ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " s ",
+ " s ",
+ " s s sssss s s ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "a ",
+ "r s rr r ",
+ "r sr rr r ",
+ "r s rr s rr r ",
+ "r rssrr rss rr r ",
+ "r rrrrr rrrss rr r ",
+ "r rrrrrsss rrrrr rr r ",
+ "r rrrrrrrr rrrrr rr r ",
+ "r rrrrrrrr rrrrrs rr r ",
+ "r rrrrrrrr rrrrrr rr r ",
+ "r rrrrrrrr rrrrrr rr r ",
+ "r srrrrrrrr rrrrrrs rr sr ",
+ "r srrrrrrrr rrrrrrs rr r ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrr rrrrrr rr r ",
+ "r rrrrrrrr rrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ " sssss ",
+ "r rrrrrrrrr rrrrrrr rr sr ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " s ",
+ "r srrrrrrrr rrrrrrs rr r ",
+ "r rrrrrrrr rrrrr rr r ",
+ " s ",
+ " s ",
+ " rrrrr ",
+ " s s sssssssss s sss s ss",
+ "r srrrrrrrr rrrrrrs rr r ",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssssssss ss s ss",
+ " s s sssssssss s ss s ss",
+ " s s sssss s s ",
+ " s s sssss s s ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " s s sssss s s ",
+ " s s sssss s s ",
+ "r rrrrrrrrr rrrrrrr rr sr ",
+ "r rrrrrrrrr rrrrrrr rr sr ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " s ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " rr ",
+ " s ",
+ " rs ",
+ "r sr rr r ",
+ "r s rr s rr r ",
+ "r rssrr rss rr r ",
+ "r rssrr rss rr r ",
+ "r rrrrr rrrss rr r ",
+ "r rrrrr rrrss rr r ",
+ "r rrrrr rrrss rr r ",
+ "r rrrrr rrrss rr r ",
+ "r rrrrrsss rrrrr rr r ",
+ "r rrrrrsss rrrrr rr r ",
+ "r rrrrrrrr rrrrr rr r ",
+ "r rrrrrrrr rrrrr rr r ",
+ "r rrrrrrrr rrrrr rr r ",
+ "r rrrrrrrr rrrrrr rr r ",
+ " r ",
+ " s ",
+ "r srrrrrrrr rrrrrrs rr r ",
+ "r srrrrrrrr rrrrrrs rr r ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr r ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " s s sssssssss s ss s ss",
+ "r rrrrrrrrr rrrrrrr rr rr ",
+ " r "
+];
+
+XPathParser.actionTableNumber = [
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " J ",
+ "a aaaaaaaaa aaaaaaa aa a ",
+ " YYYYY ",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ "K1 KKKKKKKK . +*)('KKKKKK KK# K\" ",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " N ",
+ " O ",
+ "e eeeeeeeee eeeeeee ee ee ",
+ "f fffffffff fffffff ff ff ",
+ "d ddddddddd ddddddd dd dd ",
+ "B BBBBBBBBB BBBBBBB BB BB ",
+ "A AAAAAAAAA AAAAAAA AA AA ",
+ " P ",
+ " Q ",
+ " 1 . +*)(' # \" ",
+ "b bbbbbbbbb bbbbbbb bb b ",
+ " ",
+ "! S !! ! ",
+ "\" T\" \"\" \" ",
+ "$ V $$ U $$ $ ",
+ "& &ZY&& &XW && & ",
+ ") ))))) )))\\[ )) ) ",
+ ". ....._^] ..... .. . ",
+ "1 11111111 11111 11 1 ",
+ "5 55555555 55555` 55 5 ",
+ "7 77777777 777777 77 7 ",
+ "9 99999999 999999 99 9 ",
+ ": c:::::::: ::::::b :: a: ",
+ "I fIIIIIIII IIIIIIe II I ",
+ "= ========= ======= == == ",
+ "? ????????? ??????? ?? ?? ",
+ "C CCCCCCCCC CCCCCCC CC CC ",
+ "J JJJJJJJJ JJJJJJ JJ J ",
+ "M MMMMMMMM MMMMMM MM M ",
+ "N NNNNNNNNN NNNNNNN NN N ",
+ "P PPPPPPPPP PPPPPPP PP P ",
+ " +*)(' ",
+ "R RRRRRRRRR RRRRRRR RR aR ",
+ "U UUUUUUUUU UUUUUUU UU U ",
+ "Z ZZZZZZZZZ ZZZZZZZ ZZ ZZ ",
+ "c ccccccccc ccccccc cc cc ",
+ " j ",
+ "L fLLLLLLLL LLLLLLe LL L ",
+ "6 66666666 66666 66 6 ",
+ " k ",
+ " l ",
+ " XXXXX ",
+ " 1 0 /.-,+*)(' & %$m # \"!",
+ "_ f________ ______e __ _ ",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 0 /.-,+*)(' %$ # \"!",
+ " 1 0 /.-,+*)(' & %$ # \"!",
+ " 1 . +*)(' # \" ",
+ " 1 . +*)(' # \" ",
+ "> >>>>>>>>> >>>>>>> >> >> ",
+ " 1 . +*)(' # \" ",
+ " 1 . +*)(' # \" ",
+ "Q QQQQQQQQQ QQQQQQQ QQ aQ ",
+ "V VVVVVVVVV VVVVVVV VV aV ",
+ "T TTTTTTTTT TTTTTTT TT T ",
+ "@ @@@@@@@@@ @@@@@@@ @@ @@ ",
+ " \x87 ",
+ "[ [[[[[[[[[ [[[[[[[ [[ [[ ",
+ "D DDDDDDDDD DDDDDDD DD DD ",
+ " HH ",
+ " \x88 ",
+ " F\x89 ",
+ "# T# ## # ",
+ "% V %% U %% % ",
+ "' 'ZY'' 'XW '' ' ",
+ "( (ZY(( (XW (( ( ",
+ "+ +++++ +++\\[ ++ + ",
+ "* ***** ***\\[ ** * ",
+ "- ----- ---\\[ -- - ",
+ ", ,,,,, ,,,\\[ ,, , ",
+ "0 00000_^] 00000 00 0 ",
+ "/ /////_^] ///// // / ",
+ "2 22222222 22222 22 2 ",
+ "3 33333333 33333 33 3 ",
+ "4 44444444 44444 44 4 ",
+ "8 88888888 888888 88 8 ",
+ " ^ ",
+ " \x8a ",
+ "; f;;;;;;;; ;;;;;;e ;; ; ",
+ "< f<<<<<<<< <<<<<?@ AB CDEFGH IJ ",
+ " ",
+ " ",
+ " ",
+ "L456789:;<=>?@ AB CDEFGH IJ ",
+ " M EFGH IJ ",
+ " N;<=>?@ AB CDEFGH IJ ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " S EFGH IJ ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " e ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " h J ",
+ " i j ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "o456789:;<=>?@ ABpqCDEFGH IJ ",
+ " ",
+ " r6789:;<=>?@ AB CDEFGH IJ ",
+ " s789:;<=>?@ AB CDEFGH IJ ",
+ " t89:;<=>?@ AB CDEFGH IJ ",
+ " u89:;<=>?@ AB CDEFGH IJ ",
+ " v9:;<=>?@ AB CDEFGH IJ ",
+ " w9:;<=>?@ AB CDEFGH IJ ",
+ " x9:;<=>?@ AB CDEFGH IJ ",
+ " y9:;<=>?@ AB CDEFGH IJ ",
+ " z:;<=>?@ AB CDEFGH IJ ",
+ " {:;<=>?@ AB CDEFGH IJ ",
+ " |;<=>?@ AB CDEFGH IJ ",
+ " };<=>?@ AB CDEFGH IJ ",
+ " ~;<=>?@ AB CDEFGH IJ ",
+ " \x7f=>?@ AB CDEFGH IJ ",
+ "\x80456789:;<=>?@ AB CDEFGH IJ\x81",
+ " \x82 EFGH IJ ",
+ " \x83 EFGH IJ ",
+ " ",
+ " \x84 GH IJ ",
+ " \x85 GH IJ ",
+ " i \x86 ",
+ " i \x87 ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "o456789:;<=>?@ AB\x8cqCDEFGH IJ ",
+ " ",
+ " "
+];
+
+XPathParser.productions = [
+ [1, 1, 2],
+ [2, 1, 3],
+ [3, 1, 4],
+ [3, 3, 3, -9, 4],
+ [4, 1, 5],
+ [4, 3, 4, -8, 5],
+ [5, 1, 6],
+ [5, 3, 5, -22, 6],
+ [5, 3, 5, -5, 6],
+ [6, 1, 7],
+ [6, 3, 6, -23, 7],
+ [6, 3, 6, -24, 7],
+ [6, 3, 6, -6, 7],
+ [6, 3, 6, -7, 7],
+ [7, 1, 8],
+ [7, 3, 7, -25, 8],
+ [7, 3, 7, -26, 8],
+ [8, 1, 9],
+ [8, 3, 8, -12, 9],
+ [8, 3, 8, -11, 9],
+ [8, 3, 8, -10, 9],
+ [9, 1, 10],
+ [9, 2, -26, 9],
+ [10, 1, 11],
+ [10, 3, 10, -27, 11],
+ [11, 1, 12],
+ [11, 1, 13],
+ [11, 3, 13, -28, 14],
+ [11, 3, 13, -4, 14],
+ [13, 1, 15],
+ [13, 2, 13, 16],
+ [15, 1, 17],
+ [15, 3, -29, 2, -30],
+ [15, 1, -15],
+ [15, 1, -16],
+ [15, 1, 18],
+ [18, 3, -13, -29, -30],
+ [18, 4, -13, -29, 19, -30],
+ [19, 1, 20],
+ [19, 3, 20, -31, 19],
+ [20, 1, 2],
+ [12, 1, 14],
+ [12, 1, 21],
+ [21, 1, -28],
+ [21, 2, -28, 14],
+ [21, 1, 22],
+ [14, 1, 23],
+ [14, 3, 14, -28, 23],
+ [14, 1, 24],
+ [23, 2, 25, 26],
+ [23, 1, 26],
+ [23, 3, 25, 26, 27],
+ [23, 2, 26, 27],
+ [23, 1, 28],
+ [27, 1, 16],
+ [27, 2, 16, 27],
+ [25, 2, -14, -3],
+ [25, 1, -32],
+ [26, 1, 29],
+ [26, 3, -20, -29, -30],
+ [26, 4, -21, -29, -15, -30],
+ [16, 3, -33, 30, -34],
+ [30, 1, 2],
+ [22, 2, -4, 14],
+ [24, 3, 14, -4, 23],
+ [28, 1, -35],
+ [28, 1, -2],
+ [17, 2, -36, -18],
+ [29, 1, -17],
+ [29, 1, -19],
+ [29, 1, -18]
+];
+
+XPathParser.DOUBLEDOT = 2;
+XPathParser.DOUBLECOLON = 3;
+XPathParser.DOUBLESLASH = 4;
+XPathParser.NOTEQUAL = 5;
+XPathParser.LESSTHANOREQUAL = 6;
+XPathParser.GREATERTHANOREQUAL = 7;
+XPathParser.AND = 8;
+XPathParser.OR = 9;
+XPathParser.MOD = 10;
+XPathParser.DIV = 11;
+XPathParser.MULTIPLYOPERATOR = 12;
+XPathParser.FUNCTIONNAME = 13;
+XPathParser.AXISNAME = 14;
+XPathParser.LITERAL = 15;
+XPathParser.NUMBER = 16;
+XPathParser.ASTERISKNAMETEST = 17;
+XPathParser.QNAME = 18;
+XPathParser.NCNAMECOLONASTERISK = 19;
+XPathParser.NODETYPE = 20;
+XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL = 21;
+XPathParser.EQUALS = 22;
+XPathParser.LESSTHAN = 23;
+XPathParser.GREATERTHAN = 24;
+XPathParser.PLUS = 25;
+XPathParser.MINUS = 26;
+XPathParser.BAR = 27;
+XPathParser.SLASH = 28;
+XPathParser.LEFTPARENTHESIS = 29;
+XPathParser.RIGHTPARENTHESIS = 30;
+XPathParser.COMMA = 31;
+XPathParser.AT = 32;
+XPathParser.LEFTBRACKET = 33;
+XPathParser.RIGHTBRACKET = 34;
+XPathParser.DOT = 35;
+XPathParser.DOLLAR = 36;
+
+XPathParser.prototype.tokenize = function(s1) {
+ var types = [];
+ var values = [];
+ var s = s1 + '\0';
+
+ var pos = 0;
+ var c = s.charAt(pos++);
+ while (1) {
+ while (c == ' ' || c == '\t' || c == '\r' || c == '\n') {
+ c = s.charAt(pos++);
+ }
+ if (c == '\0' || pos >= s.length) {
+ break;
+ }
+
+ if (c == '(') {
+ types.push(XPathParser.LEFTPARENTHESIS);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == ')') {
+ types.push(XPathParser.RIGHTPARENTHESIS);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '[') {
+ types.push(XPathParser.LEFTBRACKET);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == ']') {
+ types.push(XPathParser.RIGHTBRACKET);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '@') {
+ types.push(XPathParser.AT);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == ',') {
+ types.push(XPathParser.COMMA);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '|') {
+ types.push(XPathParser.BAR);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '+') {
+ types.push(XPathParser.PLUS);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '-') {
+ types.push(XPathParser.MINUS);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '=') {
+ types.push(XPathParser.EQUALS);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c == '$') {
+ types.push(XPathParser.DOLLAR);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+
+ if (c == '.') {
+ c = s.charAt(pos++);
+ if (c == '.') {
+ types.push(XPathParser.DOUBLEDOT);
+ values.push("..");
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (c >= '0' && c <= '9') {
+ var number = "." + c;
+ c = s.charAt(pos++);
+ while (c >= '0' && c <= '9') {
+ number += c;
+ c = s.charAt(pos++);
+ }
+ types.push(XPathParser.NUMBER);
+ values.push(number);
+ continue;
+ }
+ types.push(XPathParser.DOT);
+ values.push('.');
+ continue;
+ }
+
+ if (c == '\'' || c == '"') {
+ var delimiter = c;
+ var literal = "";
+ while (pos < s.length && (c = s.charAt(pos)) !== delimiter) {
+ literal += c;
+ pos += 1;
+ }
+ if (c !== delimiter) {
+ throw XPathException.fromMessage("Unterminated string literal: " + delimiter + literal);
+ }
+ pos += 1;
+ types.push(XPathParser.LITERAL);
+ values.push(literal);
+ c = s.charAt(pos++);
+ continue;
+ }
+
+ if (c >= '0' && c <= '9') {
+ var number = c;
+ c = s.charAt(pos++);
+ while (c >= '0' && c <= '9') {
+ number += c;
+ c = s.charAt(pos++);
+ }
+ if (c == '.') {
+ if (s.charAt(pos) >= '0' && s.charAt(pos) <= '9') {
+ number += c;
+ number += s.charAt(pos++);
+ c = s.charAt(pos++);
+ while (c >= '0' && c <= '9') {
+ number += c;
+ c = s.charAt(pos++);
+ }
+ }
+ }
+ types.push(XPathParser.NUMBER);
+ values.push(number);
+ continue;
+ }
+
+ if (c == '*') {
+ if (types.length > 0) {
+ var last = types[types.length - 1];
+ if (last != XPathParser.AT
+ && last != XPathParser.DOUBLECOLON
+ && last != XPathParser.LEFTPARENTHESIS
+ && last != XPathParser.LEFTBRACKET
+ && last != XPathParser.AND
+ && last != XPathParser.OR
+ && last != XPathParser.MOD
+ && last != XPathParser.DIV
+ && last != XPathParser.MULTIPLYOPERATOR
+ && last != XPathParser.SLASH
+ && last != XPathParser.DOUBLESLASH
+ && last != XPathParser.BAR
+ && last != XPathParser.PLUS
+ && last != XPathParser.MINUS
+ && last != XPathParser.EQUALS
+ && last != XPathParser.NOTEQUAL
+ && last != XPathParser.LESSTHAN
+ && last != XPathParser.LESSTHANOREQUAL
+ && last != XPathParser.GREATERTHAN
+ && last != XPathParser.GREATERTHANOREQUAL) {
+ types.push(XPathParser.MULTIPLYOPERATOR);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+ }
+ types.push(XPathParser.ASTERISKNAMETEST);
+ values.push(c);
+ c = s.charAt(pos++);
+ continue;
+ }
+
+ if (c == ':') {
+ if (s.charAt(pos) == ':') {
+ types.push(XPathParser.DOUBLECOLON);
+ values.push("::");
+ pos++;
+ c = s.charAt(pos++);
+ continue;
+ }
+ }
+
+ if (c == '/') {
+ c = s.charAt(pos++);
+ if (c == '/') {
+ types.push(XPathParser.DOUBLESLASH);
+ values.push("//");
+ c = s.charAt(pos++);
+ continue;
+ }
+ types.push(XPathParser.SLASH);
+ values.push('/');
+ continue;
+ }
+
+ if (c == '!') {
+ if (s.charAt(pos) == '=') {
+ types.push(XPathParser.NOTEQUAL);
+ values.push("!=");
+ pos++;
+ c = s.charAt(pos++);
+ continue;
+ }
+ }
+
+ if (c == '<') {
+ if (s.charAt(pos) == '=') {
+ types.push(XPathParser.LESSTHANOREQUAL);
+ values.push("<=");
+ pos++;
+ c = s.charAt(pos++);
+ continue;
+ }
+ types.push(XPathParser.LESSTHAN);
+ values.push('<');
+ c = s.charAt(pos++);
+ continue;
+ }
+
+ if (c == '>') {
+ if (s.charAt(pos) == '=') {
+ types.push(XPathParser.GREATERTHANOREQUAL);
+ values.push(">=");
+ pos++;
+ c = s.charAt(pos++);
+ continue;
+ }
+ types.push(XPathParser.GREATERTHAN);
+ values.push('>');
+ c = s.charAt(pos++);
+ continue;
+ }
+
+ if (c == '_' || Utilities.isLetter(c.charCodeAt(0))) {
+ var name = c;
+ c = s.charAt(pos++);
+ while (Utilities.isNCNameChar(c.charCodeAt(0))) {
+ name += c;
+ c = s.charAt(pos++);
+ }
+ if (types.length > 0) {
+ var last = types[types.length - 1];
+ if (last != XPathParser.AT
+ && last != XPathParser.DOUBLECOLON
+ && last != XPathParser.LEFTPARENTHESIS
+ && last != XPathParser.LEFTBRACKET
+ && last != XPathParser.AND
+ && last != XPathParser.OR
+ && last != XPathParser.MOD
+ && last != XPathParser.DIV
+ && last != XPathParser.MULTIPLYOPERATOR
+ && last != XPathParser.SLASH
+ && last != XPathParser.DOUBLESLASH
+ && last != XPathParser.BAR
+ && last != XPathParser.PLUS
+ && last != XPathParser.MINUS
+ && last != XPathParser.EQUALS
+ && last != XPathParser.NOTEQUAL
+ && last != XPathParser.LESSTHAN
+ && last != XPathParser.LESSTHANOREQUAL
+ && last != XPathParser.GREATERTHAN
+ && last != XPathParser.GREATERTHANOREQUAL) {
+ if (name == "and") {
+ types.push(XPathParser.AND);
+ values.push(name);
+ continue;
+ }
+ if (name == "or") {
+ types.push(XPathParser.OR);
+ values.push(name);
+ continue;
+ }
+ if (name == "mod") {
+ types.push(XPathParser.MOD);
+ values.push(name);
+ continue;
+ }
+ if (name == "div") {
+ types.push(XPathParser.DIV);
+ values.push(name);
+ continue;
+ }
+ }
+ }
+ if (c == ':') {
+ if (s.charAt(pos) == '*') {
+ types.push(XPathParser.NCNAMECOLONASTERISK);
+ values.push(name + ":*");
+ pos++;
+ c = s.charAt(pos++);
+ continue;
+ }
+ if (s.charAt(pos) == '_' || Utilities.isLetter(s.charCodeAt(pos))) {
+ name += ':';
+ c = s.charAt(pos++);
+ while (Utilities.isNCNameChar(c.charCodeAt(0))) {
+ name += c;
+ c = s.charAt(pos++);
+ }
+ if (c == '(') {
+ types.push(XPathParser.FUNCTIONNAME);
+ values.push(name);
+ continue;
+ }
+ types.push(XPathParser.QNAME);
+ values.push(name);
+ continue;
+ }
+ if (s.charAt(pos) == ':') {
+ types.push(XPathParser.AXISNAME);
+ values.push(name);
+ continue;
+ }
+ }
+ if (c == '(') {
+ if (name == "comment" || name == "text" || name == "node") {
+ types.push(XPathParser.NODETYPE);
+ values.push(name);
+ continue;
+ }
+ if (name == "processing-instruction") {
+ if (s.charAt(pos) == ')') {
+ types.push(XPathParser.NODETYPE);
+ } else {
+ types.push(XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL);
+ }
+ values.push(name);
+ continue;
+ }
+ types.push(XPathParser.FUNCTIONNAME);
+ values.push(name);
+ continue;
+ }
+ types.push(XPathParser.QNAME);
+ values.push(name);
+ continue;
+ }
+
+ throw new Error("Unexpected character " + c);
+ }
+ types.push(1);
+ values.push("[EOF]");
+ return [types, values];
+};
+
+XPathParser.SHIFT = 's';
+XPathParser.REDUCE = 'r';
+XPathParser.ACCEPT = 'a';
+
+XPathParser.prototype.parse = function(s) {
+ var types;
+ var values;
+ var res = this.tokenize(s);
+ if (res == undefined) {
+ return undefined;
+ }
+ types = res[0];
+ values = res[1];
+ var tokenPos = 0;
+ var state = [];
+ var tokenType = [];
+ var tokenValue = [];
+ var s;
+ var a;
+ var t;
+
+ state.push(0);
+ tokenType.push(1);
+ tokenValue.push("_S");
+
+ a = types[tokenPos];
+ t = values[tokenPos++];
+ while (1) {
+ s = state[state.length - 1];
+ switch (XPathParser.actionTable[s].charAt(a - 1)) {
+ case XPathParser.SHIFT:
+ tokenType.push(-a);
+ tokenValue.push(t);
+ state.push(XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32);
+ a = types[tokenPos];
+ t = values[tokenPos++];
+ break;
+ case XPathParser.REDUCE:
+ var num = XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][1];
+ var rhs = [];
+ for (var i = 0; i < num; i++) {
+ tokenType.pop();
+ rhs.unshift(tokenValue.pop());
+ state.pop();
+ }
+ var s_ = state[state.length - 1];
+ tokenType.push(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0]);
+ if (this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32] == undefined) {
+ tokenValue.push(rhs[0]);
+ } else {
+ tokenValue.push(this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32](rhs));
+ }
+ state.push(XPathParser.gotoTable[s_].charCodeAt(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0] - 2) - 33);
+ break;
+ case XPathParser.ACCEPT:
+ return new XPath(tokenValue.pop());
+ default:
+ throw new Error("XPath parse error");
+ }
+ }
+};
+
+// XPath /////////////////////////////////////////////////////////////////////
+
+XPath.prototype = new Object();
+XPath.prototype.constructor = XPath;
+XPath.superclass = Object.prototype;
+
+function XPath(e) {
+ this.expression = e;
+}
+
+XPath.prototype.toString = function() {
+ return this.expression.toString();
+};
+
+function setIfUnset(obj, prop, value) {
+ if (!(prop in obj)) {
+ obj[prop] = value;
+ }
+}
+
+XPath.prototype.evaluate = function(c) {
+ c.contextNode = c.expressionContextNode;
+ c.contextSize = 1;
+ c.contextPosition = 1;
+
+ // [2017-11-25] Removed usage of .implementation.hasFeature() since it does
+ // not reliably detect HTML DOMs (always returns false in xmldom and true in browsers)
+ if (c.isHtml) {
+ setIfUnset(c, 'caseInsensitive', true);
+ setIfUnset(c, 'allowAnyNamespaceForNoPrefix', true);
+ }
+
+ setIfUnset(c, 'caseInsensitive', false);
+
+ return this.expression.evaluate(c);
+};
+
+XPath.XML_NAMESPACE_URI = "http://www.w3.org/XML/1998/namespace";
+XPath.XMLNS_NAMESPACE_URI = "http://www.w3.org/2000/xmlns/";
+
+// Expression ////////////////////////////////////////////////////////////////
+
+Expression.prototype = new Object();
+Expression.prototype.constructor = Expression;
+Expression.superclass = Object.prototype;
+
+function Expression() {
+}
+
+Expression.prototype.init = function() {
+};
+
+Expression.prototype.toString = function() {
+ return "";
+};
+
+Expression.prototype.evaluate = function(c) {
+ throw new Error("Could not evaluate expression.");
+};
+
+// UnaryOperation ////////////////////////////////////////////////////////////
+
+UnaryOperation.prototype = new Expression();
+UnaryOperation.prototype.constructor = UnaryOperation;
+UnaryOperation.superclass = Expression.prototype;
+
+function UnaryOperation(rhs) {
+ if (arguments.length > 0) {
+ this.init(rhs);
+ }
+}
+
+UnaryOperation.prototype.init = function(rhs) {
+ this.rhs = rhs;
+};
+
+// UnaryMinusOperation ///////////////////////////////////////////////////////
+
+UnaryMinusOperation.prototype = new UnaryOperation();
+UnaryMinusOperation.prototype.constructor = UnaryMinusOperation;
+UnaryMinusOperation.superclass = UnaryOperation.prototype;
+
+function UnaryMinusOperation(rhs) {
+ if (arguments.length > 0) {
+ this.init(rhs);
+ }
+}
+
+UnaryMinusOperation.prototype.init = function(rhs) {
+ UnaryMinusOperation.superclass.init.call(this, rhs);
+};
+
+UnaryMinusOperation.prototype.evaluate = function(c) {
+ return this.rhs.evaluate(c).number().negate();
+};
+
+UnaryMinusOperation.prototype.toString = function() {
+ return "-" + this.rhs.toString();
+};
+
+// BinaryOperation ///////////////////////////////////////////////////////////
+
+BinaryOperation.prototype = new Expression();
+BinaryOperation.prototype.constructor = BinaryOperation;
+BinaryOperation.superclass = Expression.prototype;
+
+function BinaryOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+BinaryOperation.prototype.init = function(lhs, rhs) {
+ this.lhs = lhs;
+ this.rhs = rhs;
+};
+
+// OrOperation ///////////////////////////////////////////////////////////////
+
+OrOperation.prototype = new BinaryOperation();
+OrOperation.prototype.constructor = OrOperation;
+OrOperation.superclass = BinaryOperation.prototype;
+
+function OrOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+OrOperation.prototype.init = function(lhs, rhs) {
+ OrOperation.superclass.init.call(this, lhs, rhs);
+};
+
+OrOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " or " + this.rhs.toString() + ")";
+};
+
+OrOperation.prototype.evaluate = function(c) {
+ var b = this.lhs.evaluate(c).bool();
+ if (b.booleanValue()) {
+ return b;
+ }
+ return this.rhs.evaluate(c).bool();
+};
+
+// AndOperation //////////////////////////////////////////////////////////////
+
+AndOperation.prototype = new BinaryOperation();
+AndOperation.prototype.constructor = AndOperation;
+AndOperation.superclass = BinaryOperation.prototype;
+
+function AndOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+AndOperation.prototype.init = function(lhs, rhs) {
+ AndOperation.superclass.init.call(this, lhs, rhs);
+};
+
+AndOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " and " + this.rhs.toString() + ")";
+};
+
+AndOperation.prototype.evaluate = function(c) {
+ var b = this.lhs.evaluate(c).bool();
+ if (!b.booleanValue()) {
+ return b;
+ }
+ return this.rhs.evaluate(c).bool();
+};
+
+// EqualsOperation ///////////////////////////////////////////////////////////
+
+EqualsOperation.prototype = new BinaryOperation();
+EqualsOperation.prototype.constructor = EqualsOperation;
+EqualsOperation.superclass = BinaryOperation.prototype;
+
+function EqualsOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+EqualsOperation.prototype.init = function(lhs, rhs) {
+ EqualsOperation.superclass.init.call(this, lhs, rhs);
+};
+
+EqualsOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " = " + this.rhs.toString() + ")";
+};
+
+EqualsOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).equals(this.rhs.evaluate(c));
+};
+
+// NotEqualOperation /////////////////////////////////////////////////////////
+
+NotEqualOperation.prototype = new BinaryOperation();
+NotEqualOperation.prototype.constructor = NotEqualOperation;
+NotEqualOperation.superclass = BinaryOperation.prototype;
+
+function NotEqualOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+NotEqualOperation.prototype.init = function(lhs, rhs) {
+ NotEqualOperation.superclass.init.call(this, lhs, rhs);
+};
+
+NotEqualOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " != " + this.rhs.toString() + ")";
+};
+
+NotEqualOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).notequal(this.rhs.evaluate(c));
+};
+
+// LessThanOperation /////////////////////////////////////////////////////////
+
+LessThanOperation.prototype = new BinaryOperation();
+LessThanOperation.prototype.constructor = LessThanOperation;
+LessThanOperation.superclass = BinaryOperation.prototype;
+
+function LessThanOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+LessThanOperation.prototype.init = function(lhs, rhs) {
+ LessThanOperation.superclass.init.call(this, lhs, rhs);
+};
+
+LessThanOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).lessthan(this.rhs.evaluate(c));
+};
+
+LessThanOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " < " + this.rhs.toString() + ")";
+};
+
+// GreaterThanOperation //////////////////////////////////////////////////////
+
+GreaterThanOperation.prototype = new BinaryOperation();
+GreaterThanOperation.prototype.constructor = GreaterThanOperation;
+GreaterThanOperation.superclass = BinaryOperation.prototype;
+
+function GreaterThanOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+GreaterThanOperation.prototype.init = function(lhs, rhs) {
+ GreaterThanOperation.superclass.init.call(this, lhs, rhs);
+};
+
+GreaterThanOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).greaterthan(this.rhs.evaluate(c));
+};
+
+GreaterThanOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " > " + this.rhs.toString() + ")";
+};
+
+// LessThanOrEqualOperation //////////////////////////////////////////////////
+
+LessThanOrEqualOperation.prototype = new BinaryOperation();
+LessThanOrEqualOperation.prototype.constructor = LessThanOrEqualOperation;
+LessThanOrEqualOperation.superclass = BinaryOperation.prototype;
+
+function LessThanOrEqualOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+LessThanOrEqualOperation.prototype.init = function(lhs, rhs) {
+ LessThanOrEqualOperation.superclass.init.call(this, lhs, rhs);
+};
+
+LessThanOrEqualOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).lessthanorequal(this.rhs.evaluate(c));
+};
+
+LessThanOrEqualOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " <= " + this.rhs.toString() + ")";
+};
+
+// GreaterThanOrEqualOperation ///////////////////////////////////////////////
+
+GreaterThanOrEqualOperation.prototype = new BinaryOperation();
+GreaterThanOrEqualOperation.prototype.constructor = GreaterThanOrEqualOperation;
+GreaterThanOrEqualOperation.superclass = BinaryOperation.prototype;
+
+function GreaterThanOrEqualOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+GreaterThanOrEqualOperation.prototype.init = function(lhs, rhs) {
+ GreaterThanOrEqualOperation.superclass.init.call(this, lhs, rhs);
+};
+
+GreaterThanOrEqualOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).greaterthanorequal(this.rhs.evaluate(c));
+};
+
+GreaterThanOrEqualOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " >= " + this.rhs.toString() + ")";
+};
+
+// PlusOperation /////////////////////////////////////////////////////////////
+
+PlusOperation.prototype = new BinaryOperation();
+PlusOperation.prototype.constructor = PlusOperation;
+PlusOperation.superclass = BinaryOperation.prototype;
+
+function PlusOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+PlusOperation.prototype.init = function(lhs, rhs) {
+ PlusOperation.superclass.init.call(this, lhs, rhs);
+};
+
+PlusOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).number().plus(this.rhs.evaluate(c).number());
+};
+
+PlusOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " + " + this.rhs.toString() + ")";
+};
+
+// MinusOperation ////////////////////////////////////////////////////////////
+
+MinusOperation.prototype = new BinaryOperation();
+MinusOperation.prototype.constructor = MinusOperation;
+MinusOperation.superclass = BinaryOperation.prototype;
+
+function MinusOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+MinusOperation.prototype.init = function(lhs, rhs) {
+ MinusOperation.superclass.init.call(this, lhs, rhs);
+};
+
+MinusOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).number().minus(this.rhs.evaluate(c).number());
+};
+
+MinusOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " - " + this.rhs.toString() + ")";
+};
+
+// MultiplyOperation /////////////////////////////////////////////////////////
+
+MultiplyOperation.prototype = new BinaryOperation();
+MultiplyOperation.prototype.constructor = MultiplyOperation;
+MultiplyOperation.superclass = BinaryOperation.prototype;
+
+function MultiplyOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+MultiplyOperation.prototype.init = function(lhs, rhs) {
+ MultiplyOperation.superclass.init.call(this, lhs, rhs);
+};
+
+MultiplyOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).number().multiply(this.rhs.evaluate(c).number());
+};
+
+MultiplyOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " * " + this.rhs.toString() + ")";
+};
+
+// DivOperation //////////////////////////////////////////////////////////////
+
+DivOperation.prototype = new BinaryOperation();
+DivOperation.prototype.constructor = DivOperation;
+DivOperation.superclass = BinaryOperation.prototype;
+
+function DivOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+DivOperation.prototype.init = function(lhs, rhs) {
+ DivOperation.superclass.init.call(this, lhs, rhs);
+};
+
+DivOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).number().div(this.rhs.evaluate(c).number());
+};
+
+DivOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " div " + this.rhs.toString() + ")";
+};
+
+// ModOperation //////////////////////////////////////////////////////////////
+
+ModOperation.prototype = new BinaryOperation();
+ModOperation.prototype.constructor = ModOperation;
+ModOperation.superclass = BinaryOperation.prototype;
+
+function ModOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+ModOperation.prototype.init = function(lhs, rhs) {
+ ModOperation.superclass.init.call(this, lhs, rhs);
+};
+
+ModOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).number().mod(this.rhs.evaluate(c).number());
+};
+
+ModOperation.prototype.toString = function() {
+ return "(" + this.lhs.toString() + " mod " + this.rhs.toString() + ")";
+};
+
+// BarOperation //////////////////////////////////////////////////////////////
+
+BarOperation.prototype = new BinaryOperation();
+BarOperation.prototype.constructor = BarOperation;
+BarOperation.superclass = BinaryOperation.prototype;
+
+function BarOperation(lhs, rhs) {
+ if (arguments.length > 0) {
+ this.init(lhs, rhs);
+ }
+}
+
+BarOperation.prototype.init = function(lhs, rhs) {
+ BarOperation.superclass.init.call(this, lhs, rhs);
+};
+
+BarOperation.prototype.evaluate = function(c) {
+ return this.lhs.evaluate(c).nodeset().union(this.rhs.evaluate(c).nodeset());
+};
+
+BarOperation.prototype.toString = function() {
+ return map(toString, [this.lhs, this.rhs]).join(' | ');
+};
+
+// PathExpr //////////////////////////////////////////////////////////////////
+
+PathExpr.prototype = new Expression();
+PathExpr.prototype.constructor = PathExpr;
+PathExpr.superclass = Expression.prototype;
+
+function PathExpr(filter, filterPreds, locpath) {
+ if (arguments.length > 0) {
+ this.init(filter, filterPreds, locpath);
+ }
+}
+
+PathExpr.prototype.init = function(filter, filterPreds, locpath) {
+ PathExpr.superclass.init.call(this);
+ this.filter = filter;
+ this.filterPredicates = filterPreds;
+ this.locationPath = locpath;
+};
+
+/**
+ * Returns the topmost node of the tree containing node
+ */
+function findRoot(node) {
+ while (node && node.parentNode) {
+ node = node.parentNode;
+ }
+
+ return node;
+}
+
+PathExpr.applyPredicates = function (predicates, c, nodes) {
+ return reduce(function (inNodes, pred) {
+ var ctx = c.extend({ contextSize: inNodes.length });
+
+ return filter(function (node, i) {
+ return PathExpr.predicateMatches(pred, ctx.extend({ contextNode: node, contextPosition: i + 1 }));
+ }, inNodes);
+ }, nodes, predicates);
+};
+
+PathExpr.getRoot = function (xpc, nodes) {
+ var firstNode = nodes[0];
+
+ if (firstNode.nodeType === 9 /*Node.DOCUMENT_NODE*/) {
+ return firstNode;
+ }
+
+ if (xpc.virtualRoot) {
+ return xpc.virtualRoot;
+ }
+
+ var ownerDoc = firstNode.ownerDocument;
+
+ if (ownerDoc) {
+ return ownerDoc;
+ }
+
+ // IE 5.5 doesn't have ownerDocument?
+ var n = firstNode;
+ while (n.parentNode != null) {
+ n = n.parentNode;
+ }
+ return n;
+}
+
+PathExpr.applyStep = function (step, xpc, node) {
+ var self = this;
+ var newNodes = [];
+ xpc.contextNode = node;
+
+ switch (step.axis) {
+ case Step.ANCESTOR:
+ // look at all the ancestor nodes
+ if (xpc.contextNode === xpc.virtualRoot) {
+ break;
+ }
+ var m;
+ if (xpc.contextNode.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
+ m = PathExpr.getOwnerElement(xpc.contextNode);
+ } else {
+ m = xpc.contextNode.parentNode;
+ }
+ while (m != null) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ if (m === xpc.virtualRoot) {
+ break;
+ }
+ m = m.parentNode;
+ }
+ break;
+
+ case Step.ANCESTORORSELF:
+ // look at all the ancestor nodes and the current node
+ for (var m = xpc.contextNode; m != null; m = m.nodeType == 2 /*Node.ATTRIBUTE_NODE*/ ? PathExpr.getOwnerElement(m) : m.parentNode) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ if (m === xpc.virtualRoot) {
+ break;
+ }
+ }
+ break;
+
+ case Step.ATTRIBUTE:
+ // look at the attributes
+ var nnm = xpc.contextNode.attributes;
+ if (nnm != null) {
+ for (var k = 0; k < nnm.length; k++) {
+ var m = nnm.item(k);
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ }
+ }
+ break;
+
+ case Step.CHILD:
+ // look at all child elements
+ for (var m = xpc.contextNode.firstChild; m != null; m = m.nextSibling) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ }
+ break;
+
+ case Step.DESCENDANT:
+ // look at all descendant nodes
+ var st = [ xpc.contextNode.firstChild ];
+ while (st.length > 0) {
+ for (var m = st.pop(); m != null; ) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ if (m.firstChild != null) {
+ st.push(m.nextSibling);
+ m = m.firstChild;
+ } else {
+ m = m.nextSibling;
+ }
+ }
+ }
+ break;
+
+ case Step.DESCENDANTORSELF:
+ // look at self
+ if (step.nodeTest.matches(xpc.contextNode, xpc)) {
+ newNodes.push(xpc.contextNode);
+ }
+ // look at all descendant nodes
+ var st = [ xpc.contextNode.firstChild ];
+ while (st.length > 0) {
+ for (var m = st.pop(); m != null; ) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ if (m.firstChild != null) {
+ st.push(m.nextSibling);
+ m = m.firstChild;
+ } else {
+ m = m.nextSibling;
+ }
+ }
+ }
+ break;
+
+ case Step.FOLLOWING:
+ if (xpc.contextNode === xpc.virtualRoot) {
+ break;
+ }
+ var st = [];
+ if (xpc.contextNode.firstChild != null) {
+ st.unshift(xpc.contextNode.firstChild);
+ } else {
+ st.unshift(xpc.contextNode.nextSibling);
+ }
+ for (var m = xpc.contextNode.parentNode; m != null && m.nodeType != 9 /*Node.DOCUMENT_NODE*/ && m !== xpc.virtualRoot; m = m.parentNode) {
+ st.unshift(m.nextSibling);
+ }
+ do {
+ for (var m = st.pop(); m != null; ) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ if (m.firstChild != null) {
+ st.push(m.nextSibling);
+ m = m.firstChild;
+ } else {
+ m = m.nextSibling;
+ }
+ }
+ } while (st.length > 0);
+ break;
+
+ case Step.FOLLOWINGSIBLING:
+ if (xpc.contextNode === xpc.virtualRoot) {
+ break;
+ }
+ for (var m = xpc.contextNode.nextSibling; m != null; m = m.nextSibling) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ }
+ break;
+
+ case Step.NAMESPACE:
+ var n = {};
+ if (xpc.contextNode.nodeType == 1 /*Node.ELEMENT_NODE*/) {
+ n["xml"] = XPath.XML_NAMESPACE_URI;
+ n["xmlns"] = XPath.XMLNS_NAMESPACE_URI;
+ for (var m = xpc.contextNode; m != null && m.nodeType == 1 /*Node.ELEMENT_NODE*/; m = m.parentNode) {
+ for (var k = 0; k < m.attributes.length; k++) {
+ var attr = m.attributes.item(k);
+ var nm = String(attr.name);
+ if (nm == "xmlns") {
+ if (n[""] == undefined) {
+ n[""] = attr.value;
+ }
+ } else if (nm.length > 6 && nm.substring(0, 6) == "xmlns:") {
+ var pre = nm.substring(6, nm.length);
+ if (n[pre] == undefined) {
+ n[pre] = attr.value;
+ }
+ }
+ }
+ }
+ for (var pre in n) {
+ var nsn = new XPathNamespace(pre, n[pre], xpc.contextNode);
+ if (step.nodeTest.matches(nsn, xpc)) {
+ newNodes.push(nsn);
+ }
+ }
+ }
+ break;
+
+ case Step.PARENT:
+ m = null;
+ if (xpc.contextNode !== xpc.virtualRoot) {
+ if (xpc.contextNode.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
+ m = PathExpr.getOwnerElement(xpc.contextNode);
+ } else {
+ m = xpc.contextNode.parentNode;
+ }
+ }
+ if (m != null && step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ break;
+
+ case Step.PRECEDING:
+ var st;
+ if (xpc.virtualRoot != null) {
+ st = [ xpc.virtualRoot ];
+ } else {
+ // cannot rely on .ownerDocument because the node may be in a document fragment
+ st = [findRoot(xpc.contextNode)];
+ }
+ outer: while (st.length > 0) {
+ for (var m = st.pop(); m != null; ) {
+ if (m == xpc.contextNode) {
+ break outer;
+ }
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.unshift(m);
+ }
+ if (m.firstChild != null) {
+ st.push(m.nextSibling);
+ m = m.firstChild;
+ } else {
+ m = m.nextSibling;
+ }
+ }
+ }
+ break;
+
+ case Step.PRECEDINGSIBLING:
+ if (xpc.contextNode === xpc.virtualRoot) {
+ break;
+ }
+ for (var m = xpc.contextNode.previousSibling; m != null; m = m.previousSibling) {
+ if (step.nodeTest.matches(m, xpc)) {
+ newNodes.push(m);
+ }
+ }
+ break;
+
+ case Step.SELF:
+ if (step.nodeTest.matches(xpc.contextNode, xpc)) {
+ newNodes.push(xpc.contextNode);
+ }
+ break;
+
+ default:
+ }
+
+ return newNodes;
+};
+
+PathExpr.applySteps = function (steps, xpc, nodes) {
+ return reduce(function (inNodes, step) {
+ return [].concat.apply([], map(function (node) {
+ return PathExpr.applyPredicates(step.predicates, xpc, PathExpr.applyStep(step, xpc, node));
+ }, inNodes));
+ }, nodes, steps);
+}
+
+PathExpr.prototype.applyFilter = function(c, xpc) {
+ if (!this.filter) {
+ return { nodes: [ c.contextNode ] };
+ }
+
+ var ns = this.filter.evaluate(c);
+
+ if (!Utilities.instance_of(ns, XNodeSet)) {
+ if (this.filterPredicates != null && this.filterPredicates.length > 0 || this.locationPath != null) {
+ throw new Error("Path expression filter must evaluate to a nodeset if predicates or location path are used");
+ }
+
+ return { nonNodes: ns };
+ }
+
+ return {
+ nodes: PathExpr.applyPredicates(this.filterPredicates || [], xpc, ns.toUnsortedArray())
+ };
+};
+
+PathExpr.applyLocationPath = function (locationPath, xpc, nodes) {
+ if (!locationPath) {
+ return nodes;
+ }
+
+ var startNodes = locationPath.absolute ? [ PathExpr.getRoot(xpc, nodes) ] : nodes;
+
+ return PathExpr.applySteps(locationPath.steps, xpc, startNodes);
+};
+
+PathExpr.prototype.evaluate = function(c) {
+ var xpc = assign(new XPathContext(), c);
+
+ var filterResult = this.applyFilter(c, xpc);
+
+ if ('nonNodes' in filterResult) {
+ return filterResult.nonNodes;
+ }
+
+ var ns = new XNodeSet();
+ ns.addArray(PathExpr.applyLocationPath(this.locationPath, xpc, filterResult.nodes));
+ return ns;
+};
+
+PathExpr.predicateMatches = function(pred, c) {
+ var res = pred.evaluate(c);
+
+ return Utilities.instance_of(res, XNumber)
+ ? c.contextPosition == res.numberValue()
+ : res.booleanValue();
+};
+
+PathExpr.predicateString = compose(wrap('[', ']'), toString);
+PathExpr.predicatesString = compose(join(''), map(PathExpr.predicateString));
+
+PathExpr.prototype.toString = function() {
+ if (this.filter != undefined) {
+ var filterStr = toString(this.filter);
+
+ if (Utilities.instance_of(this.filter, XString)) {
+ return wrap("'", "'", filterStr);
+ }
+ if (this.filterPredicates != undefined && this.filterPredicates.length) {
+ return wrap('(', ')', filterStr) +
+ PathExpr.predicatesString(this.filterPredicates);
+ }
+ if (this.locationPath != undefined) {
+ return filterStr +
+ (this.locationPath.absolute ? '' : '/') +
+ toString(this.locationPath);
+ }
+
+ return filterStr;
+ }
+
+ return toString(this.locationPath);
+};
+
+PathExpr.getOwnerElement = function(n) {
+ // DOM 2 has ownerElement
+ if (n.ownerElement) {
+ return n.ownerElement;
+ }
+ // DOM 1 Internet Explorer can use selectSingleNode (ironically)
+ try {
+ if (n.selectSingleNode) {
+ return n.selectSingleNode("..");
+ }
+ } catch (e) {
+ }
+ // Other DOM 1 implementations must use this egregious search
+ var doc = n.nodeType == 9 /*Node.DOCUMENT_NODE*/
+ ? n
+ : n.ownerDocument;
+ var elts = doc.getElementsByTagName("*");
+ for (var i = 0; i < elts.length; i++) {
+ var elt = elts.item(i);
+ var nnm = elt.attributes;
+ for (var j = 0; j < nnm.length; j++) {
+ var an = nnm.item(j);
+ if (an === n) {
+ return elt;
+ }
+ }
+ }
+ return null;
+};
+
+// LocationPath //////////////////////////////////////////////////////////////
+
+LocationPath.prototype = new Object();
+LocationPath.prototype.constructor = LocationPath;
+LocationPath.superclass = Object.prototype;
+
+function LocationPath(abs, steps) {
+ if (arguments.length > 0) {
+ this.init(abs, steps);
+ }
+}
+
+LocationPath.prototype.init = function(abs, steps) {
+ this.absolute = abs;
+ this.steps = steps;
+};
+
+LocationPath.prototype.toString = function() {
+ return (
+ (this.absolute ? '/' : '') +
+ map(toString, this.steps).join('/')
+ );
+};
+
+// Step //////////////////////////////////////////////////////////////////////
+
+Step.prototype = new Object();
+Step.prototype.constructor = Step;
+Step.superclass = Object.prototype;
+
+function Step(axis, nodetest, preds) {
+ if (arguments.length > 0) {
+ this.init(axis, nodetest, preds);
+ }
+}
+
+Step.prototype.init = function(axis, nodetest, preds) {
+ this.axis = axis;
+ this.nodeTest = nodetest;
+ this.predicates = preds;
+};
+
+Step.prototype.toString = function() {
+ return Step.STEPNAMES[this.axis] +
+ "::" +
+ this.nodeTest.toString() +
+ PathExpr.predicatesString(this.predicates);
+};
+
+
+Step.ANCESTOR = 0;
+Step.ANCESTORORSELF = 1;
+Step.ATTRIBUTE = 2;
+Step.CHILD = 3;
+Step.DESCENDANT = 4;
+Step.DESCENDANTORSELF = 5;
+Step.FOLLOWING = 6;
+Step.FOLLOWINGSIBLING = 7;
+Step.NAMESPACE = 8;
+Step.PARENT = 9;
+Step.PRECEDING = 10;
+Step.PRECEDINGSIBLING = 11;
+Step.SELF = 12;
+
+Step.STEPNAMES = reduce(function (acc, x) { return acc[x[0]] = x[1], acc; }, {}, [
+ [Step.ANCESTOR, 'ancestor'],
+ [Step.ANCESTORORSELF, 'ancestor-or-self'],
+ [Step.ATTRIBUTE, 'attribute'],
+ [Step.CHILD, 'child'],
+ [Step.DESCENDANT, 'descendant'],
+ [Step.DESCENDANTORSELF, 'descendant-or-self'],
+ [Step.FOLLOWING, 'following'],
+ [Step.FOLLOWINGSIBLING, 'following-sibling'],
+ [Step.NAMESPACE, 'namespace'],
+ [Step.PARENT, 'parent'],
+ [Step.PRECEDING, 'preceding'],
+ [Step.PRECEDINGSIBLING, 'preceding-sibling'],
+ [Step.SELF, 'self']
+ ]);
+
+// NodeTest //////////////////////////////////////////////////////////////////
+
+NodeTest.prototype = new Object();
+NodeTest.prototype.constructor = NodeTest;
+NodeTest.superclass = Object.prototype;
+
+function NodeTest(type, value) {
+ if (arguments.length > 0) {
+ this.init(type, value);
+ }
+}
+
+NodeTest.prototype.init = function(type, value) {
+ this.type = type;
+ this.value = value;
+};
+
+NodeTest.prototype.toString = function() {
+ return "";
+};
+
+NodeTest.prototype.matches = function (n, xpc) {
+ console.warn('unknown node test type');
+};
+
+NodeTest.NAMETESTANY = 0;
+NodeTest.NAMETESTPREFIXANY = 1;
+NodeTest.NAMETESTQNAME = 2;
+NodeTest.COMMENT = 3;
+NodeTest.TEXT = 4;
+NodeTest.PI = 5;
+NodeTest.NODE = 6;
+
+NodeTest.isNodeType = function (types){
+ return compose(includes(types), prop('nodeType'));
+};
+
+NodeTest.makeNodeTestType = function (type, members, ctor) {
+ var newType = ctor || function () {};
+
+ newType.prototype = new NodeTest(members.type);
+ newType.prototype.constructor = type;
+
+ for (var key in members) {
+ newType.prototype[key] = members[key];
+ }
+
+ return newType;
+};
+// create invariant node test for certain node types
+NodeTest.makeNodeTypeTest = function (type, nodeTypes, stringVal) {
+ return new (NodeTest.makeNodeTestType(type, {
+ matches: NodeTest.isNodeType(nodeTypes),
+ toString: always(stringVal)
+ }))();
+};
+
+NodeTest.hasPrefix = function (node) {
+ return node.prefix || (node.nodeName || node.tagName).indexOf(':') !== -1;
+};
+
+NodeTest.isElementOrAttribute = NodeTest.isNodeType([1, 2]);
+NodeTest.nameSpaceMatches = function (prefix, xpc, n) {
+ var nNamespace = (n.namespaceURI || '');
+
+ if (!prefix) {
+ return !nNamespace || (xpc.allowAnyNamespaceForNoPrefix && !NodeTest.hasPrefix(n));
+ }
+
+ var ns = xpc.namespaceResolver.getNamespace(prefix, xpc.expressionContextNode);
+
+ if (ns == null) {
+ throw new Error("Cannot resolve QName " + prefix);
+ }
+
+ return ns === nNamespace;
+};
+NodeTest.localNameMatches = function (localName, xpc, n) {
+ var nLocalName = (n.localName || n.nodeName);
+
+ return xpc.caseInsensitive
+ ? localName.toLowerCase() === nLocalName.toLowerCase()
+ : localName === nLocalName;
+};
+
+NodeTest.NameTestPrefixAny = NodeTest.makeNodeTestType(NodeTest.NAMETESTPREFIXANY, {
+ matches: function (n, xpc){
+ return NodeTest.isElementOrAttribute(n) &&
+ NodeTest.nameSpaceMatches(this.prefix, xpc, n);
+ },
+ toString: function () {
+ return this.prefix + ":*";
+ }
+}, function (prefix) { this.prefix = prefix; });
+
+NodeTest.NameTestQName = NodeTest.makeNodeTestType(NodeTest.NAMETESTQNAME, {
+ matches: function (n, xpc) {
+ return NodeTest.isNodeType([1, 2, XPathNamespace.XPATH_NAMESPACE_NODE])(n) &&
+ NodeTest.nameSpaceMatches(this.prefix, xpc, n) &&
+ NodeTest.localNameMatches(this.localName, xpc, n);
+ },
+ toString: function () {
+ return this.name;
+ }
+}, function (name) {
+ var nameParts = name.split(':');
+
+ this.name = name;
+ this.prefix = nameParts.length > 1 ? nameParts[0] : null;
+ this.localName = nameParts[nameParts.length > 1 ? 1 : 0];
+});
+
+NodeTest.PITest = NodeTest.makeNodeTestType(NodeTest.PI, {
+ matches: function (n, xpc) {
+ return NodeTest.isNodeType([7])(n) && (n.target || n.nodeName) === this.name;
+ },
+ toString: function () {
+ return wrap('processing-instruction("', '")', this.name);
+ }
+}, function (name) { this.name = name; })
+
+// singletons
+
+// elements, attributes, namespaces
+NodeTest.nameTestAny = NodeTest.makeNodeTypeTest(NodeTest.NAMETESTANY, [1, 2, XPathNamespace.XPATH_NAMESPACE_NODE], '*');
+// text, cdata
+NodeTest.textTest = NodeTest.makeNodeTypeTest(NodeTest.TEXT, [3, 4], 'text()');
+NodeTest.commentTest = NodeTest.makeNodeTypeTest(NodeTest.COMMENT, [8], 'comment()');
+// elements, attributes, text, cdata, PIs, comments, document nodes
+NodeTest.nodeTest = NodeTest.makeNodeTypeTest(NodeTest.NODE, [1, 2, 3, 4, 7, 8, 9], 'node()');
+NodeTest.anyPiTest = NodeTest.makeNodeTypeTest(NodeTest.PI, [7], 'processing-instruction()');
+
+// VariableReference /////////////////////////////////////////////////////////
+
+VariableReference.prototype = new Expression();
+VariableReference.prototype.constructor = VariableReference;
+VariableReference.superclass = Expression.prototype;
+
+function VariableReference(v) {
+ if (arguments.length > 0) {
+ this.init(v);
+ }
+}
+
+VariableReference.prototype.init = function(v) {
+ this.variable = v;
+};
+
+VariableReference.prototype.toString = function() {
+ return "$" + this.variable;
+};
+
+VariableReference.prototype.evaluate = function(c) {
+ var parts = Utilities.resolveQName(this.variable, c.namespaceResolver, c.contextNode, false);
+
+ if (parts[0] == null) {
+ throw new Error("Cannot resolve QName " + fn);
+ }
+ var result = c.variableResolver.getVariable(parts[1], parts[0]);
+ if (!result) {
+ throw XPathException.fromMessage("Undeclared variable: " + this.toString());
+ }
+ return result;
+};
+
+// FunctionCall //////////////////////////////////////////////////////////////
+
+FunctionCall.prototype = new Expression();
+FunctionCall.prototype.constructor = FunctionCall;
+FunctionCall.superclass = Expression.prototype;
+
+function FunctionCall(fn, args) {
+ if (arguments.length > 0) {
+ this.init(fn, args);
+ }
+}
+
+FunctionCall.prototype.init = function(fn, args) {
+ this.functionName = fn;
+ this.arguments = args;
+};
+
+FunctionCall.prototype.toString = function() {
+ var s = this.functionName + "(";
+ for (var i = 0; i < this.arguments.length; i++) {
+ if (i > 0) {
+ s += ", ";
+ }
+ s += this.arguments[i].toString();
+ }
+ return s + ")";
+};
+
+FunctionCall.prototype.evaluate = function(c) {
+ var f = FunctionResolver.getFunctionFromContext(this.functionName, c);
+
+ if (!f) {
+ throw new Error("Unknown function " + this.functionName);
+ }
+
+ var a = [c].concat(this.arguments);
+ return f.apply(c.functionResolver.thisArg, a);
+};
+
+// Operators /////////////////////////////////////////////////////////////////
+
+var Operators = new Object();
+
+Operators.equals = function(l, r) {
+ return l.equals(r);
+};
+
+Operators.notequal = function(l, r) {
+ return l.notequal(r);
+};
+
+Operators.lessthan = function(l, r) {
+ return l.lessthan(r);
+};
+
+Operators.greaterthan = function(l, r) {
+ return l.greaterthan(r);
+};
+
+Operators.lessthanorequal = function(l, r) {
+ return l.lessthanorequal(r);
+};
+
+Operators.greaterthanorequal = function(l, r) {
+ return l.greaterthanorequal(r);
+};
+
+// XString ///////////////////////////////////////////////////////////////////
+
+XString.prototype = new Expression();
+XString.prototype.constructor = XString;
+XString.superclass = Expression.prototype;
+
+function XString(s) {
+ if (arguments.length > 0) {
+ this.init(s);
+ }
+}
+
+XString.prototype.init = function(s) {
+ this.str = String(s);
+};
+
+XString.prototype.toString = function() {
+ return this.str;
+};
+
+XString.prototype.evaluate = function(c) {
+ return this;
+};
+
+XString.prototype.string = function() {
+ return this;
+};
+
+XString.prototype.number = function() {
+ return new XNumber(this.str);
+};
+
+XString.prototype.bool = function() {
+ return new XBoolean(this.str);
+};
+
+XString.prototype.nodeset = function() {
+ throw new Error("Cannot convert string to nodeset");
+};
+
+XString.prototype.stringValue = function() {
+ return this.str;
+};
+
+XString.prototype.numberValue = function() {
+ return this.number().numberValue();
+};
+
+XString.prototype.booleanValue = function() {
+ return this.bool().booleanValue();
+};
+
+XString.prototype.equals = function(r) {
+ if (Utilities.instance_of(r, XBoolean)) {
+ return this.bool().equals(r);
+ }
+ if (Utilities.instance_of(r, XNumber)) {
+ return this.number().equals(r);
+ }
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithString(this, Operators.equals);
+ }
+ return new XBoolean(this.str == r.str);
+};
+
+XString.prototype.notequal = function(r) {
+ if (Utilities.instance_of(r, XBoolean)) {
+ return this.bool().notequal(r);
+ }
+ if (Utilities.instance_of(r, XNumber)) {
+ return this.number().notequal(r);
+ }
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithString(this, Operators.notequal);
+ }
+ return new XBoolean(this.str != r.str);
+};
+
+XString.prototype.lessthan = function(r) {
+ return this.number().lessthan(r);
+};
+
+XString.prototype.greaterthan = function(r) {
+ return this.number().greaterthan(r);
+};
+
+XString.prototype.lessthanorequal = function(r) {
+ return this.number().lessthanorequal(r);
+};
+
+XString.prototype.greaterthanorequal = function(r) {
+ return this.number().greaterthanorequal(r);
+};
+
+// XNumber ///////////////////////////////////////////////////////////////////
+
+XNumber.prototype = new Expression();
+XNumber.prototype.constructor = XNumber;
+XNumber.superclass = Expression.prototype;
+
+function XNumber(n) {
+ if (arguments.length > 0) {
+ this.init(n);
+ }
+}
+
+XNumber.prototype.init = function(n) {
+ this.num = typeof n === "string" ? this.parse(n) : Number(n);
+};
+
+XNumber.prototype.numberFormat = /^\s*-?[0-9]*\.?[0-9]+\s*$/;
+
+XNumber.prototype.parse = function(s) {
+ // XPath representation of numbers is more restrictive than what Number() or parseFloat() allow
+ return this.numberFormat.test(s) ? parseFloat(s) : Number.NaN;
+};
+
+function padSmallNumber(numberStr) {
+ var parts = numberStr.split('e-');
+ var base = parts[0].replace('.', '');
+ var exponent = Number(parts[1]);
+
+ for (var i = 0; i < exponent - 1; i += 1) {
+ base = '0' + base;
+ }
+
+ return '0.' + base;
+}
+
+function padLargeNumber(numberStr) {
+ var parts = numberStr.split('e');
+ var base = parts[0].replace('.', '');
+ var exponent = Number(parts[1]);
+ var zerosToAppend = exponent + 1 - base.length;
+
+ for (var i = 0; i < zerosToAppend; i += 1){
+ base += '0';
+ }
+
+ return base;
+}
+
+XNumber.prototype.toString = function() {
+ var strValue = this.num.toString();
+
+ if (strValue.indexOf('e-') !== -1) {
+ return padSmallNumber(strValue);
+ }
+
+ if (strValue.indexOf('e') !== -1) {
+ return padLargeNumber(strValue);
+ }
+
+ return strValue;
+};
+
+XNumber.prototype.evaluate = function(c) {
+ return this;
+};
+
+XNumber.prototype.string = function() {
+
+
+ return new XString(this.toString());
+};
+
+XNumber.prototype.number = function() {
+ return this;
+};
+
+XNumber.prototype.bool = function() {
+ return new XBoolean(this.num);
+};
+
+XNumber.prototype.nodeset = function() {
+ throw new Error("Cannot convert number to nodeset");
+};
+
+XNumber.prototype.stringValue = function() {
+ return this.string().stringValue();
+};
+
+XNumber.prototype.numberValue = function() {
+ return this.num;
+};
+
+XNumber.prototype.booleanValue = function() {
+ return this.bool().booleanValue();
+};
+
+XNumber.prototype.negate = function() {
+ return new XNumber(-this.num);
+};
+
+XNumber.prototype.equals = function(r) {
+ if (Utilities.instance_of(r, XBoolean)) {
+ return this.bool().equals(r);
+ }
+ if (Utilities.instance_of(r, XString)) {
+ return this.equals(r.number());
+ }
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithNumber(this, Operators.equals);
+ }
+ return new XBoolean(this.num == r.num);
+};
+
+XNumber.prototype.notequal = function(r) {
+ if (Utilities.instance_of(r, XBoolean)) {
+ return this.bool().notequal(r);
+ }
+ if (Utilities.instance_of(r, XString)) {
+ return this.notequal(r.number());
+ }
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithNumber(this, Operators.notequal);
+ }
+ return new XBoolean(this.num != r.num);
+};
+
+XNumber.prototype.lessthan = function(r) {
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithNumber(this, Operators.greaterthan);
+ }
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
+ return this.lessthan(r.number());
+ }
+ return new XBoolean(this.num < r.num);
+};
+
+XNumber.prototype.greaterthan = function(r) {
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithNumber(this, Operators.lessthan);
+ }
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
+ return this.greaterthan(r.number());
+ }
+ return new XBoolean(this.num > r.num);
+};
+
+XNumber.prototype.lessthanorequal = function(r) {
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithNumber(this, Operators.greaterthanorequal);
+ }
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
+ return this.lessthanorequal(r.number());
+ }
+ return new XBoolean(this.num <= r.num);
+};
+
+XNumber.prototype.greaterthanorequal = function(r) {
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithNumber(this, Operators.lessthanorequal);
+ }
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
+ return this.greaterthanorequal(r.number());
+ }
+ return new XBoolean(this.num >= r.num);
+};
+
+XNumber.prototype.plus = function(r) {
+ return new XNumber(this.num + r.num);
+};
+
+XNumber.prototype.minus = function(r) {
+ return new XNumber(this.num - r.num);
+};
+
+XNumber.prototype.multiply = function(r) {
+ return new XNumber(this.num * r.num);
+};
+
+XNumber.prototype.div = function(r) {
+ return new XNumber(this.num / r.num);
+};
+
+XNumber.prototype.mod = function(r) {
+ return new XNumber(this.num % r.num);
+};
+
+// XBoolean //////////////////////////////////////////////////////////////////
+
+XBoolean.prototype = new Expression();
+XBoolean.prototype.constructor = XBoolean;
+XBoolean.superclass = Expression.prototype;
+
+function XBoolean(b) {
+ if (arguments.length > 0) {
+ this.init(b);
+ }
+}
+
+XBoolean.prototype.init = function(b) {
+ this.b = Boolean(b);
+};
+
+XBoolean.prototype.toString = function() {
+ return this.b.toString();
+};
+
+XBoolean.prototype.evaluate = function(c) {
+ return this;
+};
+
+XBoolean.prototype.string = function() {
+ return new XString(this.b);
+};
+
+XBoolean.prototype.number = function() {
+ return new XNumber(this.b);
+};
+
+XBoolean.prototype.bool = function() {
+ return this;
+};
+
+XBoolean.prototype.nodeset = function() {
+ throw new Error("Cannot convert boolean to nodeset");
+};
+
+XBoolean.prototype.stringValue = function() {
+ return this.string().stringValue();
+};
+
+XBoolean.prototype.numberValue = function() {
+ return this.number().numberValue();
+};
+
+XBoolean.prototype.booleanValue = function() {
+ return this.b;
+};
+
+XBoolean.prototype.not = function() {
+ return new XBoolean(!this.b);
+};
+
+XBoolean.prototype.equals = function(r) {
+ if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {
+ return this.equals(r.bool());
+ }
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithBoolean(this, Operators.equals);
+ }
+ return new XBoolean(this.b == r.b);
+};
+
+XBoolean.prototype.notequal = function(r) {
+ if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {
+ return this.notequal(r.bool());
+ }
+ if (Utilities.instance_of(r, XNodeSet)) {
+ return r.compareWithBoolean(this, Operators.notequal);
+ }
+ return new XBoolean(this.b != r.b);
+};
+
+XBoolean.prototype.lessthan = function(r) {
+ return this.number().lessthan(r);
+};
+
+XBoolean.prototype.greaterthan = function(r) {
+ return this.number().greaterthan(r);
+};
+
+XBoolean.prototype.lessthanorequal = function(r) {
+ return this.number().lessthanorequal(r);
+};
+
+XBoolean.prototype.greaterthanorequal = function(r) {
+ return this.number().greaterthanorequal(r);
+};
+
+XBoolean.true_ = new XBoolean(true);
+XBoolean.false_ = new XBoolean(false);
+
+// AVLTree ///////////////////////////////////////////////////////////////////
+
+AVLTree.prototype = new Object();
+AVLTree.prototype.constructor = AVLTree;
+AVLTree.superclass = Object.prototype;
+
+function AVLTree(n) {
+ this.init(n);
+}
+
+AVLTree.prototype.init = function(n) {
+ this.left = null;
+ this.right = null;
+ this.node = n;
+ this.depth = 1;
+};
+
+AVLTree.prototype.balance = function() {
+ var ldepth = this.left == null ? 0 : this.left.depth;
+ var rdepth = this.right == null ? 0 : this.right.depth;
+
+ if (ldepth > rdepth + 1) {
+ // LR or LL rotation
+ var lldepth = this.left.left == null ? 0 : this.left.left.depth;
+ var lrdepth = this.left.right == null ? 0 : this.left.right.depth;
+
+ if (lldepth < lrdepth) {
+ // LR rotation consists of a RR rotation of the left child
+ this.left.rotateRR();
+ // plus a LL rotation of this node, which happens anyway
+ }
+ this.rotateLL();
+ } else if (ldepth + 1 < rdepth) {
+ // RR or RL rorarion
+ var rrdepth = this.right.right == null ? 0 : this.right.right.depth;
+ var rldepth = this.right.left == null ? 0 : this.right.left.depth;
+
+ if (rldepth > rrdepth) {
+ // RR rotation consists of a LL rotation of the right child
+ this.right.rotateLL();
+ // plus a RR rotation of this node, which happens anyway
+ }
+ this.rotateRR();
+ }
+};
+
+AVLTree.prototype.rotateLL = function() {
+ // the left side is too long => rotate from the left (_not_ leftwards)
+ var nodeBefore = this.node;
+ var rightBefore = this.right;
+ this.node = this.left.node;
+ this.right = this.left;
+ this.left = this.left.left;
+ this.right.left = this.right.right;
+ this.right.right = rightBefore;
+ this.right.node = nodeBefore;
+ this.right.updateInNewLocation();
+ this.updateInNewLocation();
+};
+
+AVLTree.prototype.rotateRR = function() {
+ // the right side is too long => rotate from the right (_not_ rightwards)
+ var nodeBefore = this.node;
+ var leftBefore = this.left;
+ this.node = this.right.node;
+ this.left = this.right;
+ this.right = this.right.right;
+ this.left.right = this.left.left;
+ this.left.left = leftBefore;
+ this.left.node = nodeBefore;
+ this.left.updateInNewLocation();
+ this.updateInNewLocation();
+};
+
+AVLTree.prototype.updateInNewLocation = function() {
+ this.getDepthFromChildren();
+};
+
+AVLTree.prototype.getDepthFromChildren = function() {
+ this.depth = this.node == null ? 0 : 1;
+ if (this.left != null) {
+ this.depth = this.left.depth + 1;
+ }
+ if (this.right != null && this.depth <= this.right.depth) {
+ this.depth = this.right.depth + 1;
+ }
+};
+
+function nodeOrder(n1, n2) {
+ if (n1 === n2) {
+ return 0;
+ }
+
+ if (n1.compareDocumentPosition) {
+ var cpos = n1.compareDocumentPosition(n2);
+
+ if (cpos & 0x01) {
+ // not in the same document; return an arbitrary result (is there a better way to do this)
+ return 1;
+ }
+ if (cpos & 0x0A) {
+ // n2 precedes or contains n1
+ return 1;
+ }
+ if (cpos & 0x14) {
+ // n2 follows or is contained by n1
+ return -1;
+ }
+
+ return 0;
+ }
+
+ var d1 = 0,
+ d2 = 0;
+ for (var m1 = n1; m1 != null; m1 = m1.parentNode || m1.ownerElement) {
+ d1++;
+ }
+ for (var m2 = n2; m2 != null; m2 = m2.parentNode || m2.ownerElement) {
+ d2++;
+ }
+
+ // step up to same depth
+ if (d1 > d2) {
+ while (d1 > d2) {
+ n1 = n1.parentNode || n1.ownerElement;
+ d1--;
+ }
+ if (n1 === n2) {
+ return 1;
+ }
+ } else if (d2 > d1) {
+ while (d2 > d1) {
+ n2 = n2.parentNode || n2.ownerElement;
+ d2--;
+ }
+ if (n1 === n2) {
+ return -1;
+ }
+ }
+
+ var n1Par = n1.parentNode || n1.ownerElement,
+ n2Par = n2.parentNode || n2.ownerElement;
+
+ // find common parent
+ while (n1Par !== n2Par) {
+ n1 = n1Par;
+ n2 = n2Par;
+ n1Par = n1.parentNode || n1.ownerElement;
+ n2Par = n2.parentNode || n2.ownerElement;
+ }
+
+ var n1isAttr = Utilities.isAttribute(n1);
+ var n2isAttr = Utilities.isAttribute(n2);
+
+ if (n1isAttr && !n2isAttr) {
+ return -1;
+ }
+ if (!n1isAttr && n2isAttr) {
+ return 1;
+ }
+
+ if(n1Par) {
+ var cn = n1isAttr ? n1Par.attributes : n1Par.childNodes,
+ len = cn.length;
+ for (var i = 0; i < len; i += 1) {
+ var n = cn[i];
+ if (n === n1) {
+ return -1;
+ }
+ if (n === n2) {
+ return 1;
+ }
+ }
+ }
+
+ throw new Error('Unexpected: could not determine node order');
+}
+
+AVLTree.prototype.add = function(n) {
+ if (n === this.node) {
+ return false;
+ }
+
+ var o = nodeOrder(n, this.node);
+
+ var ret = false;
+ if (o == -1) {
+ if (this.left == null) {
+ this.left = new AVLTree(n);
+ ret = true;
+ } else {
+ ret = this.left.add(n);
+ if (ret) {
+ this.balance();
+ }
+ }
+ } else if (o == 1) {
+ if (this.right == null) {
+ this.right = new AVLTree(n);
+ ret = true;
+ } else {
+ ret = this.right.add(n);
+ if (ret) {
+ this.balance();
+ }
+ }
+ }
+
+ if (ret) {
+ this.getDepthFromChildren();
+ }
+ return ret;
+};
+
+// XNodeSet //////////////////////////////////////////////////////////////////
+
+XNodeSet.prototype = new Expression();
+XNodeSet.prototype.constructor = XNodeSet;
+XNodeSet.superclass = Expression.prototype;
+
+function XNodeSet() {
+ this.init();
+}
+
+XNodeSet.prototype.init = function() {
+ this.tree = null;
+ this.nodes = [];
+ this.size = 0;
+};
+
+XNodeSet.prototype.toString = function() {
+ var p = this.first();
+ if (p == null) {
+ return "";
+ }
+ return this.stringForNode(p);
+};
+
+XNodeSet.prototype.evaluate = function(c) {
+ return this;
+};
+
+XNodeSet.prototype.string = function() {
+ return new XString(this.toString());
+};
+
+XNodeSet.prototype.stringValue = function() {
+ return this.toString();
+};
+
+XNodeSet.prototype.number = function() {
+ return new XNumber(this.string());
+};
+
+XNodeSet.prototype.numberValue = function() {
+ return Number(this.string());
+};
+
+XNodeSet.prototype.bool = function() {
+ return new XBoolean(this.booleanValue());
+};
+
+XNodeSet.prototype.booleanValue = function() {
+ return !!this.size;
+};
+
+XNodeSet.prototype.nodeset = function() {
+ return this;
+};
+
+XNodeSet.prototype.stringForNode = function(n) {
+ if (n.nodeType == 9 /*Node.DOCUMENT_NODE*/ ||
+ n.nodeType == 1 /*Node.ELEMENT_NODE */ ||
+ n.nodeType === 11 /*Node.DOCUMENT_FRAGMENT*/) {
+ return this.stringForContainerNode(n);
+ }
+ if (n.nodeType === 2 /* Node.ATTRIBUTE_NODE */) {
+ return n.value || n.nodeValue;
+ }
+ if (n.isNamespaceNode) {
+ return n.namespace;
+ }
+ return n.nodeValue;
+};
+
+XNodeSet.prototype.stringForContainerNode = function(n) {
+ var s = "";
+ for (var n2 = n.firstChild; n2 != null; n2 = n2.nextSibling) {
+ var nt = n2.nodeType;
+ // Element, Text, CDATA, Document, Document Fragment
+ if (nt === 1 || nt === 3 || nt === 4 || nt === 9 || nt === 11) {
+ s += this.stringForNode(n2);
+ }
+ }
+ return s;
+};
+
+XNodeSet.prototype.buildTree = function () {
+ if (!this.tree && this.nodes.length) {
+ this.tree = new AVLTree(this.nodes[0]);
+ for (var i = 1; i < this.nodes.length; i += 1) {
+ this.tree.add(this.nodes[i]);
+ }
+ }
+
+ return this.tree;
+};
+
+XNodeSet.prototype.first = function() {
+ var p = this.buildTree();
+ if (p == null) {
+ return null;
+ }
+ while (p.left != null) {
+ p = p.left;
+ }
+ return p.node;
+};
+
+XNodeSet.prototype.add = function(n) {
+ for (var i = 0; i < this.nodes.length; i += 1) {
+ if (n === this.nodes[i]) {
+ return;
+ }
+ }
+
+ this.tree = null;
+ this.nodes.push(n);
+ this.size += 1;
+};
+
+XNodeSet.prototype.addArray = function(ns) {
+ var self = this;
+
+ forEach(function (x) { self.add(x); }, ns);
+};
+
+/**
+ * Returns an array of the node set's contents in document order
+ */
+XNodeSet.prototype.toArray = function() {
+ var a = [];
+ this.toArrayRec(this.buildTree(), a);
+ return a;
+};
+
+XNodeSet.prototype.toArrayRec = function(t, a) {
+ if (t != null) {
+ this.toArrayRec(t.left, a);
+ a.push(t.node);
+ this.toArrayRec(t.right, a);
+ }
+};
+
+/**
+ * Returns an array of the node set's contents in arbitrary order
+ */
+XNodeSet.prototype.toUnsortedArray = function () {
+ return this.nodes.slice();
+};
+
+XNodeSet.prototype.compareWithString = function(r, o) {
+ var a = this.toUnsortedArray();
+ for (var i = 0; i < a.length; i++) {
+ var n = a[i];
+ var l = new XString(this.stringForNode(n));
+ var res = o(l, r);
+ if (res.booleanValue()) {
+ return res;
+ }
+ }
+ return new XBoolean(false);
+};
+
+XNodeSet.prototype.compareWithNumber = function(r, o) {
+ var a = this.toUnsortedArray();
+ for (var i = 0; i < a.length; i++) {
+ var n = a[i];
+ var l = new XNumber(this.stringForNode(n));
+ var res = o(l, r);
+ if (res.booleanValue()) {
+ return res;
+ }
+ }
+ return new XBoolean(false);
+};
+
+XNodeSet.prototype.compareWithBoolean = function(r, o) {
+ return o(this.bool(), r);
+};
+
+XNodeSet.prototype.compareWithNodeSet = function(r, o) {
+ var arr = this.toUnsortedArray();
+ var oInvert = function (lop, rop) { return o(rop, lop); };
+
+ for (var i = 0; i < arr.length; i++) {
+ var l = new XString(this.stringForNode(arr[i]));
+
+ var res = r.compareWithString(l, oInvert);
+ if (res.booleanValue()) {
+ return res;
+ }
+ }
+
+ return new XBoolean(false);
+};
+
+XNodeSet.compareWith = curry(function (o, r) {
+ if (Utilities.instance_of(r, XString)) {
+ return this.compareWithString(r, o);
+ }
+ if (Utilities.instance_of(r, XNumber)) {
+ return this.compareWithNumber(r, o);
+ }
+ if (Utilities.instance_of(r, XBoolean)) {
+ return this.compareWithBoolean(r, o);
+ }
+ return this.compareWithNodeSet(r, o);
+});
+
+XNodeSet.prototype.equals = XNodeSet.compareWith(Operators.equals);
+XNodeSet.prototype.notequal = XNodeSet.compareWith(Operators.notequal);
+XNodeSet.prototype.lessthan = XNodeSet.compareWith(Operators.lessthan);
+XNodeSet.prototype.greaterthan = XNodeSet.compareWith(Operators.greaterthan);
+XNodeSet.prototype.lessthanorequal = XNodeSet.compareWith(Operators.lessthanorequal);
+XNodeSet.prototype.greaterthanorequal = XNodeSet.compareWith(Operators.greaterthanorequal);
+
+XNodeSet.prototype.union = function(r) {
+ var ns = new XNodeSet();
+ ns.addArray(this.toUnsortedArray());
+ ns.addArray(r.toUnsortedArray());
+ return ns;
+};
+
+// XPathNamespace ////////////////////////////////////////////////////////////
+
+XPathNamespace.prototype = new Object();
+XPathNamespace.prototype.constructor = XPathNamespace;
+XPathNamespace.superclass = Object.prototype;
+
+function XPathNamespace(pre, ns, p) {
+ this.isXPathNamespace = true;
+ this.ownerDocument = p.ownerDocument;
+ this.nodeName = "#namespace";
+ this.prefix = pre;
+ this.localName = pre;
+ this.namespaceURI = ns;
+ this.nodeValue = ns;
+ this.ownerElement = p;
+ this.nodeType = XPathNamespace.XPATH_NAMESPACE_NODE;
+}
+
+XPathNamespace.prototype.toString = function() {
+ return "{ \"" + this.prefix + "\", \"" + this.namespaceURI + "\" }";
+};
+
+// XPathContext //////////////////////////////////////////////////////////////
+
+XPathContext.prototype = new Object();
+XPathContext.prototype.constructor = XPathContext;
+XPathContext.superclass = Object.prototype;
+
+function XPathContext(vr, nr, fr) {
+ this.variableResolver = vr != null ? vr : new VariableResolver();
+ this.namespaceResolver = nr != null ? nr : new NamespaceResolver();
+ this.functionResolver = fr != null ? fr : new FunctionResolver();
+}
+
+XPathContext.prototype.extend = function (newProps) {
+ return assign(new XPathContext(), this, newProps);
+};
+
+// VariableResolver //////////////////////////////////////////////////////////
+
+VariableResolver.prototype = new Object();
+VariableResolver.prototype.constructor = VariableResolver;
+VariableResolver.superclass = Object.prototype;
+
+function VariableResolver() {
+}
+
+VariableResolver.prototype.getVariable = function(ln, ns) {
+ return null;
+};
+
+// FunctionResolver //////////////////////////////////////////////////////////
+
+FunctionResolver.prototype = new Object();
+FunctionResolver.prototype.constructor = FunctionResolver;
+FunctionResolver.superclass = Object.prototype;
+
+function FunctionResolver(thisArg) {
+ this.thisArg = thisArg != null ? thisArg : Functions;
+ this.functions = new Object();
+ this.addStandardFunctions();
+}
+
+FunctionResolver.prototype.addStandardFunctions = function() {
+ this.functions["{}last"] = Functions.last;
+ this.functions["{}position"] = Functions.position;
+ this.functions["{}count"] = Functions.count;
+ this.functions["{}id"] = Functions.id;
+ this.functions["{}local-name"] = Functions.localName;
+ this.functions["{}namespace-uri"] = Functions.namespaceURI;
+ this.functions["{}name"] = Functions.name;
+ this.functions["{}string"] = Functions.string;
+ this.functions["{}concat"] = Functions.concat;
+ this.functions["{}starts-with"] = Functions.startsWith;
+ this.functions["{}contains"] = Functions.contains;
+ this.functions["{}substring-before"] = Functions.substringBefore;
+ this.functions["{}substring-after"] = Functions.substringAfter;
+ this.functions["{}substring"] = Functions.substring;
+ this.functions["{}string-length"] = Functions.stringLength;
+ this.functions["{}normalize-space"] = Functions.normalizeSpace;
+ this.functions["{}translate"] = Functions.translate;
+ this.functions["{}boolean"] = Functions.boolean_;
+ this.functions["{}not"] = Functions.not;
+ this.functions["{}true"] = Functions.true_;
+ this.functions["{}false"] = Functions.false_;
+ this.functions["{}lang"] = Functions.lang;
+ this.functions["{}number"] = Functions.number;
+ this.functions["{}sum"] = Functions.sum;
+ this.functions["{}floor"] = Functions.floor;
+ this.functions["{}ceiling"] = Functions.ceiling;
+ this.functions["{}round"] = Functions.round;
+};
+
+FunctionResolver.prototype.addFunction = function(ns, ln, f) {
+ this.functions["{" + ns + "}" + ln] = f;
+};
+
+FunctionResolver.getFunctionFromContext = function(qName, context) {
+ var parts = Utilities.resolveQName(qName, context.namespaceResolver, context.contextNode, false);
+
+ if (parts[0] === null) {
+ throw new Error("Cannot resolve QName " + name);
+ }
+
+ return context.functionResolver.getFunction(parts[1], parts[0]);
+};
+
+FunctionResolver.prototype.getFunction = function(localName, namespace) {
+ return this.functions["{" + namespace + "}" + localName];
+};
+
+// NamespaceResolver /////////////////////////////////////////////////////////
+
+NamespaceResolver.prototype = new Object();
+NamespaceResolver.prototype.constructor = NamespaceResolver;
+NamespaceResolver.superclass = Object.prototype;
+
+function NamespaceResolver() {
+}
+
+NamespaceResolver.prototype.getNamespace = function(prefix, n) {
+ if (prefix == "xml") {
+ return XPath.XML_NAMESPACE_URI;
+ } else if (prefix == "xmlns") {
+ return XPath.XMLNS_NAMESPACE_URI;
+ }
+ if (n.nodeType == 9 /*Node.DOCUMENT_NODE*/) {
+ n = n.documentElement;
+ } else if (n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
+ n = PathExpr.getOwnerElement(n);
+ } else if (n.nodeType != 1 /*Node.ELEMENT_NODE*/) {
+ n = n.parentNode;
+ }
+ while (n != null && n.nodeType == 1 /*Node.ELEMENT_NODE*/) {
+ var nnm = n.attributes;
+ for (var i = 0; i < nnm.length; i++) {
+ var a = nnm.item(i);
+ var aname = a.name || a.nodeName;
+ if ((aname === "xmlns" && prefix === "")
+ || aname === "xmlns:" + prefix) {
+ return String(a.value || a.nodeValue);
+ }
+ }
+ n = n.parentNode;
+ }
+ return null;
+};
+
+// Functions /////////////////////////////////////////////////////////////////
+
+var Functions = new Object();
+
+Functions.last = function(c) {
+ if (arguments.length != 1) {
+ throw new Error("Function last expects ()");
+ }
+
+ return new XNumber(c.contextSize);
+};
+
+Functions.position = function(c) {
+ if (arguments.length != 1) {
+ throw new Error("Function position expects ()");
+ }
+
+ return new XNumber(c.contextPosition);
+};
+
+Functions.count = function() {
+ var c = arguments[0];
+ var ns;
+ if (arguments.length != 2 || !Utilities.instance_of(ns = arguments[1].evaluate(c), XNodeSet)) {
+ throw new Error("Function count expects (node-set)");
+ }
+ return new XNumber(ns.size);
+};
+
+Functions.id = function() {
+ var c = arguments[0];
+ var id;
+ if (arguments.length != 2) {
+ throw new Error("Function id expects (object)");
+ }
+ id = arguments[1].evaluate(c);
+ if (Utilities.instance_of(id, XNodeSet)) {
+ id = id.toArray().join(" ");
+ } else {
+ id = id.stringValue();
+ }
+ var ids = id.split(/[\x0d\x0a\x09\x20]+/);
+ var count = 0;
+ var ns = new XNodeSet();
+ var doc = c.contextNode.nodeType == 9 /*Node.DOCUMENT_NODE*/
+ ? c.contextNode
+ : c.contextNode.ownerDocument;
+ for (var i = 0; i < ids.length; i++) {
+ var n;
+ if (doc.getElementById) {
+ n = doc.getElementById(ids[i]);
+ } else {
+ n = Utilities.getElementById(doc, ids[i]);
+ }
+ if (n != null) {
+ ns.add(n);
+ count++;
+ }
+ }
+ return ns;
+};
+
+Functions.localName = function(c, eNode) {
+ var n;
+
+ if (arguments.length == 1) {
+ n = c.contextNode;
+ } else if (arguments.length == 2) {
+ n = eNode.evaluate(c).first();
+ } else {
+ throw new Error("Function local-name expects (node-set?)");
+ }
+
+ if (n == null) {
+ return new XString("");
+ }
+
+ return new XString(n.localName || // standard elements and attributes
+ n.baseName || // IE
+ n.target || // processing instructions
+ n.nodeName || // DOM1 elements
+ ""); // fallback
+};
+
+Functions.namespaceURI = function() {
+ var c = arguments[0];
+ var n;
+ if (arguments.length == 1) {
+ n = c.contextNode;
+ } else if (arguments.length == 2) {
+ n = arguments[1].evaluate(c).first();
+ } else {
+ throw new Error("Function namespace-uri expects (node-set?)");
+ }
+ if (n == null) {
+ return new XString("");
+ }
+ return new XString(n.namespaceURI);
+};
+
+Functions.name = function() {
+ var c = arguments[0];
+ var n;
+ if (arguments.length == 1) {
+ n = c.contextNode;
+ } else if (arguments.length == 2) {
+ n = arguments[1].evaluate(c).first();
+ } else {
+ throw new Error("Function name expects (node-set?)");
+ }
+ if (n == null) {
+ return new XString("");
+ }
+ if (n.nodeType == 1 /*Node.ELEMENT_NODE*/) {
+ return new XString(n.nodeName);
+ } else if (n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
+ return new XString(n.name || n.nodeName);
+ } else if (n.nodeType === 7 /*Node.PROCESSING_INSTRUCTION_NODE*/) {
+ return new XString(n.target || n.nodeName);
+ } else if (n.localName == null) {
+ return new XString("");
+ } else {
+ return new XString(n.localName);
+ }
+};
+
+Functions.string = function() {
+ var c = arguments[0];
+ if (arguments.length == 1) {
+ return new XString(XNodeSet.prototype.stringForNode(c.contextNode));
+ } else if (arguments.length == 2) {
+ return arguments[1].evaluate(c).string();
+ }
+ throw new Error("Function string expects (object?)");
+};
+
+Functions.concat = function(c) {
+ if (arguments.length < 3) {
+ throw new Error("Function concat expects (string, string[, string]*)");
+ }
+ var s = "";
+ for (var i = 1; i < arguments.length; i++) {
+ s += arguments[i].evaluate(c).stringValue();
+ }
+ return new XString(s);
+};
+
+Functions.startsWith = function() {
+ var c = arguments[0];
+ if (arguments.length != 3) {
+ throw new Error("Function startsWith expects (string, string)");
+ }
+ var s1 = arguments[1].evaluate(c).stringValue();
+ var s2 = arguments[2].evaluate(c).stringValue();
+ return new XBoolean(s1.substring(0, s2.length) == s2);
+};
+
+Functions.contains = function() {
+ var c = arguments[0];
+ if (arguments.length != 3) {
+ throw new Error("Function contains expects (string, string)");
+ }
+ var s1 = arguments[1].evaluate(c).stringValue();
+ var s2 = arguments[2].evaluate(c).stringValue();
+ return new XBoolean(s1.indexOf(s2) !== -1);
+};
+
+Functions.substringBefore = function() {
+ var c = arguments[0];
+ if (arguments.length != 3) {
+ throw new Error("Function substring-before expects (string, string)");
+ }
+ var s1 = arguments[1].evaluate(c).stringValue();
+ var s2 = arguments[2].evaluate(c).stringValue();
+ return new XString(s1.substring(0, s1.indexOf(s2)));
+};
+
+Functions.substringAfter = function() {
+ var c = arguments[0];
+ if (arguments.length != 3) {
+ throw new Error("Function substring-after expects (string, string)");
+ }
+ var s1 = arguments[1].evaluate(c).stringValue();
+ var s2 = arguments[2].evaluate(c).stringValue();
+ if (s2.length == 0) {
+ return new XString(s1);
+ }
+ var i = s1.indexOf(s2);
+ if (i == -1) {
+ return new XString("");
+ }
+ return new XString(s1.substring(i + s2.length));
+};
+
+Functions.substring = function() {
+ var c = arguments[0];
+ if (!(arguments.length == 3 || arguments.length == 4)) {
+ throw new Error("Function substring expects (string, number, number?)");
+ }
+ var s = arguments[1].evaluate(c).stringValue();
+ var n1 = Math.round(arguments[2].evaluate(c).numberValue()) - 1;
+ var n2 = arguments.length == 4 ? n1 + Math.round(arguments[3].evaluate(c).numberValue()) : undefined;
+ return new XString(s.substring(n1, n2));
+};
+
+Functions.stringLength = function() {
+ var c = arguments[0];
+ var s;
+ if (arguments.length == 1) {
+ s = XNodeSet.prototype.stringForNode(c.contextNode);
+ } else if (arguments.length == 2) {
+ s = arguments[1].evaluate(c).stringValue();
+ } else {
+ throw new Error("Function string-length expects (string?)");
+ }
+ return new XNumber(s.length);
+};
+
+Functions.normalizeSpace = function() {
+ var c = arguments[0];
+ var s;
+ if (arguments.length == 1) {
+ s = XNodeSet.prototype.stringForNode(c.contextNode);
+ } else if (arguments.length == 2) {
+ s = arguments[1].evaluate(c).stringValue();
+ } else {
+ throw new Error("Function normalize-space expects (string?)");
+ }
+ var i = 0;
+ var j = s.length - 1;
+ while (Utilities.isSpace(s.charCodeAt(j))) {
+ j--;
+ }
+ var t = "";
+ while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {
+ i++;
+ }
+ while (i <= j) {
+ if (Utilities.isSpace(s.charCodeAt(i))) {
+ t += " ";
+ while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {
+ i++;
+ }
+ } else {
+ t += s.charAt(i);
+ i++;
+ }
+ }
+ return new XString(t);
+};
+
+Functions.translate = function(c, eValue, eFrom, eTo) {
+ if (arguments.length != 4) {
+ throw new Error("Function translate expects (string, string, string)");
+ }
+
+ var value = eValue.evaluate(c).stringValue();
+ var from = eFrom.evaluate(c).stringValue();
+ var to = eTo.evaluate(c).stringValue();
+
+ var cMap = reduce(function (acc, ch, i) {
+ if (!(ch in acc)) {
+ acc[ch] = i > to.length ? '' : to[i];
+ }
+ return acc;
+ }, {}, from);
+
+ var t = join('', map(function (ch) {
+ return ch in cMap ? cMap[ch] : ch;
+ }, value));
+
+ return new XString(t);
+};
+
+Functions.boolean_ = function() {
+ var c = arguments[0];
+ if (arguments.length != 2) {
+ throw new Error("Function boolean expects (object)");
+ }
+ return arguments[1].evaluate(c).bool();
+};
+
+Functions.not = function(c, eValue) {
+ if (arguments.length != 2) {
+ throw new Error("Function not expects (object)");
+ }
+ return eValue.evaluate(c).bool().not();
+};
+
+Functions.true_ = function() {
+ if (arguments.length != 1) {
+ throw new Error("Function true expects ()");
+ }
+ return XBoolean.true_;
+};
+
+Functions.false_ = function() {
+ if (arguments.length != 1) {
+ throw new Error("Function false expects ()");
+ }
+ return XBoolean.false_;
+};
+
+Functions.lang = function() {
+ var c = arguments[0];
+ if (arguments.length != 2) {
+ throw new Error("Function lang expects (string)");
+ }
+ var lang;
+ for (var n = c.contextNode; n != null && n.nodeType != 9 /*Node.DOCUMENT_NODE*/; n = n.parentNode) {
+ var a = n.getAttributeNS(XPath.XML_NAMESPACE_URI, "lang");
+ if (a != null) {
+ lang = String(a);
+ break;
+ }
+ }
+ if (lang == null) {
+ return XBoolean.false_;
+ }
+ var s = arguments[1].evaluate(c).stringValue();
+ return new XBoolean(lang.substring(0, s.length) == s
+ && (lang.length == s.length || lang.charAt(s.length) == '-'));
+};
+
+Functions.number = function() {
+ var c = arguments[0];
+ if (!(arguments.length == 1 || arguments.length == 2)) {
+ throw new Error("Function number expects (object?)");
+ }
+ if (arguments.length == 1) {
+ return new XNumber(XNodeSet.prototype.stringForNode(c.contextNode));
+ }
+ return arguments[1].evaluate(c).number();
+};
+
+Functions.sum = function() {
+ var c = arguments[0];
+ var ns;
+ if (arguments.length != 2 || !Utilities.instance_of((ns = arguments[1].evaluate(c)), XNodeSet)) {
+ throw new Error("Function sum expects (node-set)");
+ }
+ ns = ns.toUnsortedArray();
+ var n = 0;
+ for (var i = 0; i < ns.length; i++) {
+ n += new XNumber(XNodeSet.prototype.stringForNode(ns[i])).numberValue();
+ }
+ return new XNumber(n);
+};
+
+Functions.floor = function() {
+ var c = arguments[0];
+ if (arguments.length != 2) {
+ throw new Error("Function floor expects (number)");
+ }
+ return new XNumber(Math.floor(arguments[1].evaluate(c).numberValue()));
+};
+
+Functions.ceiling = function() {
+ var c = arguments[0];
+ if (arguments.length != 2) {
+ throw new Error("Function ceiling expects (number)");
+ }
+ return new XNumber(Math.ceil(arguments[1].evaluate(c).numberValue()));
+};
+
+Functions.round = function() {
+ var c = arguments[0];
+ if (arguments.length != 2) {
+ throw new Error("Function round expects (number)");
+ }
+ return new XNumber(Math.round(arguments[1].evaluate(c).numberValue()));
+};
+
+// Utilities /////////////////////////////////////////////////////////////////
+
+var Utilities = new Object();
+
+Utilities.isAttribute = function (val) {
+ return val && (val.nodeType === 2 || val.ownerElement);
+}
+
+Utilities.splitQName = function(qn) {
+ var i = qn.indexOf(":");
+ if (i == -1) {
+ return [ null, qn ];
+ }
+ return [ qn.substring(0, i), qn.substring(i + 1) ];
+};
+
+Utilities.resolveQName = function(qn, nr, n, useDefault) {
+ var parts = Utilities.splitQName(qn);
+ if (parts[0] != null) {
+ parts[0] = nr.getNamespace(parts[0], n);
+ } else {
+ if (useDefault) {
+ parts[0] = nr.getNamespace("", n);
+ if (parts[0] == null) {
+ parts[0] = "";
+ }
+ } else {
+ parts[0] = "";
+ }
+ }
+ return parts;
+};
+
+Utilities.isSpace = function(c) {
+ return c == 0x9 || c == 0xd || c == 0xa || c == 0x20;
+};
+
+Utilities.isLetter = function(c) {
+ return c >= 0x0041 && c <= 0x005A ||
+ c >= 0x0061 && c <= 0x007A ||
+ c >= 0x00C0 && c <= 0x00D6 ||
+ c >= 0x00D8 && c <= 0x00F6 ||
+ c >= 0x00F8 && c <= 0x00FF ||
+ c >= 0x0100 && c <= 0x0131 ||
+ c >= 0x0134 && c <= 0x013E ||
+ c >= 0x0141 && c <= 0x0148 ||
+ c >= 0x014A && c <= 0x017E ||
+ c >= 0x0180 && c <= 0x01C3 ||
+ c >= 0x01CD && c <= 0x01F0 ||
+ c >= 0x01F4 && c <= 0x01F5 ||
+ c >= 0x01FA && c <= 0x0217 ||
+ c >= 0x0250 && c <= 0x02A8 ||
+ c >= 0x02BB && c <= 0x02C1 ||
+ c == 0x0386 ||
+ c >= 0x0388 && c <= 0x038A ||
+ c == 0x038C ||
+ c >= 0x038E && c <= 0x03A1 ||
+ c >= 0x03A3 && c <= 0x03CE ||
+ c >= 0x03D0 && c <= 0x03D6 ||
+ c == 0x03DA ||
+ c == 0x03DC ||
+ c == 0x03DE ||
+ c == 0x03E0 ||
+ c >= 0x03E2 && c <= 0x03F3 ||
+ c >= 0x0401 && c <= 0x040C ||
+ c >= 0x040E && c <= 0x044F ||
+ c >= 0x0451 && c <= 0x045C ||
+ c >= 0x045E && c <= 0x0481 ||
+ c >= 0x0490 && c <= 0x04C4 ||
+ c >= 0x04C7 && c <= 0x04C8 ||
+ c >= 0x04CB && c <= 0x04CC ||
+ c >= 0x04D0 && c <= 0x04EB ||
+ c >= 0x04EE && c <= 0x04F5 ||
+ c >= 0x04F8 && c <= 0x04F9 ||
+ c >= 0x0531 && c <= 0x0556 ||
+ c == 0x0559 ||
+ c >= 0x0561 && c <= 0x0586 ||
+ c >= 0x05D0 && c <= 0x05EA ||
+ c >= 0x05F0 && c <= 0x05F2 ||
+ c >= 0x0621 && c <= 0x063A ||
+ c >= 0x0641 && c <= 0x064A ||
+ c >= 0x0671 && c <= 0x06B7 ||
+ c >= 0x06BA && c <= 0x06BE ||
+ c >= 0x06C0 && c <= 0x06CE ||
+ c >= 0x06D0 && c <= 0x06D3 ||
+ c == 0x06D5 ||
+ c >= 0x06E5 && c <= 0x06E6 ||
+ c >= 0x0905 && c <= 0x0939 ||
+ c == 0x093D ||
+ c >= 0x0958 && c <= 0x0961 ||
+ c >= 0x0985 && c <= 0x098C ||
+ c >= 0x098F && c <= 0x0990 ||
+ c >= 0x0993 && c <= 0x09A8 ||
+ c >= 0x09AA && c <= 0x09B0 ||
+ c == 0x09B2 ||
+ c >= 0x09B6 && c <= 0x09B9 ||
+ c >= 0x09DC && c <= 0x09DD ||
+ c >= 0x09DF && c <= 0x09E1 ||
+ c >= 0x09F0 && c <= 0x09F1 ||
+ c >= 0x0A05 && c <= 0x0A0A ||
+ c >= 0x0A0F && c <= 0x0A10 ||
+ c >= 0x0A13 && c <= 0x0A28 ||
+ c >= 0x0A2A && c <= 0x0A30 ||
+ c >= 0x0A32 && c <= 0x0A33 ||
+ c >= 0x0A35 && c <= 0x0A36 ||
+ c >= 0x0A38 && c <= 0x0A39 ||
+ c >= 0x0A59 && c <= 0x0A5C ||
+ c == 0x0A5E ||
+ c >= 0x0A72 && c <= 0x0A74 ||
+ c >= 0x0A85 && c <= 0x0A8B ||
+ c == 0x0A8D ||
+ c >= 0x0A8F && c <= 0x0A91 ||
+ c >= 0x0A93 && c <= 0x0AA8 ||
+ c >= 0x0AAA && c <= 0x0AB0 ||
+ c >= 0x0AB2 && c <= 0x0AB3 ||
+ c >= 0x0AB5 && c <= 0x0AB9 ||
+ c == 0x0ABD ||
+ c == 0x0AE0 ||
+ c >= 0x0B05 && c <= 0x0B0C ||
+ c >= 0x0B0F && c <= 0x0B10 ||
+ c >= 0x0B13 && c <= 0x0B28 ||
+ c >= 0x0B2A && c <= 0x0B30 ||
+ c >= 0x0B32 && c <= 0x0B33 ||
+ c >= 0x0B36 && c <= 0x0B39 ||
+ c == 0x0B3D ||
+ c >= 0x0B5C && c <= 0x0B5D ||
+ c >= 0x0B5F && c <= 0x0B61 ||
+ c >= 0x0B85 && c <= 0x0B8A ||
+ c >= 0x0B8E && c <= 0x0B90 ||
+ c >= 0x0B92 && c <= 0x0B95 ||
+ c >= 0x0B99 && c <= 0x0B9A ||
+ c == 0x0B9C ||
+ c >= 0x0B9E && c <= 0x0B9F ||
+ c >= 0x0BA3 && c <= 0x0BA4 ||
+ c >= 0x0BA8 && c <= 0x0BAA ||
+ c >= 0x0BAE && c <= 0x0BB5 ||
+ c >= 0x0BB7 && c <= 0x0BB9 ||
+ c >= 0x0C05 && c <= 0x0C0C ||
+ c >= 0x0C0E && c <= 0x0C10 ||
+ c >= 0x0C12 && c <= 0x0C28 ||
+ c >= 0x0C2A && c <= 0x0C33 ||
+ c >= 0x0C35 && c <= 0x0C39 ||
+ c >= 0x0C60 && c <= 0x0C61 ||
+ c >= 0x0C85 && c <= 0x0C8C ||
+ c >= 0x0C8E && c <= 0x0C90 ||
+ c >= 0x0C92 && c <= 0x0CA8 ||
+ c >= 0x0CAA && c <= 0x0CB3 ||
+ c >= 0x0CB5 && c <= 0x0CB9 ||
+ c == 0x0CDE ||
+ c >= 0x0CE0 && c <= 0x0CE1 ||
+ c >= 0x0D05 && c <= 0x0D0C ||
+ c >= 0x0D0E && c <= 0x0D10 ||
+ c >= 0x0D12 && c <= 0x0D28 ||
+ c >= 0x0D2A && c <= 0x0D39 ||
+ c >= 0x0D60 && c <= 0x0D61 ||
+ c >= 0x0E01 && c <= 0x0E2E ||
+ c == 0x0E30 ||
+ c >= 0x0E32 && c <= 0x0E33 ||
+ c >= 0x0E40 && c <= 0x0E45 ||
+ c >= 0x0E81 && c <= 0x0E82 ||
+ c == 0x0E84 ||
+ c >= 0x0E87 && c <= 0x0E88 ||
+ c == 0x0E8A ||
+ c == 0x0E8D ||
+ c >= 0x0E94 && c <= 0x0E97 ||
+ c >= 0x0E99 && c <= 0x0E9F ||
+ c >= 0x0EA1 && c <= 0x0EA3 ||
+ c == 0x0EA5 ||
+ c == 0x0EA7 ||
+ c >= 0x0EAA && c <= 0x0EAB ||
+ c >= 0x0EAD && c <= 0x0EAE ||
+ c == 0x0EB0 ||
+ c >= 0x0EB2 && c <= 0x0EB3 ||
+ c == 0x0EBD ||
+ c >= 0x0EC0 && c <= 0x0EC4 ||
+ c >= 0x0F40 && c <= 0x0F47 ||
+ c >= 0x0F49 && c <= 0x0F69 ||
+ c >= 0x10A0 && c <= 0x10C5 ||
+ c >= 0x10D0 && c <= 0x10F6 ||
+ c == 0x1100 ||
+ c >= 0x1102 && c <= 0x1103 ||
+ c >= 0x1105 && c <= 0x1107 ||
+ c == 0x1109 ||
+ c >= 0x110B && c <= 0x110C ||
+ c >= 0x110E && c <= 0x1112 ||
+ c == 0x113C ||
+ c == 0x113E ||
+ c == 0x1140 ||
+ c == 0x114C ||
+ c == 0x114E ||
+ c == 0x1150 ||
+ c >= 0x1154 && c <= 0x1155 ||
+ c == 0x1159 ||
+ c >= 0x115F && c <= 0x1161 ||
+ c == 0x1163 ||
+ c == 0x1165 ||
+ c == 0x1167 ||
+ c == 0x1169 ||
+ c >= 0x116D && c <= 0x116E ||
+ c >= 0x1172 && c <= 0x1173 ||
+ c == 0x1175 ||
+ c == 0x119E ||
+ c == 0x11A8 ||
+ c == 0x11AB ||
+ c >= 0x11AE && c <= 0x11AF ||
+ c >= 0x11B7 && c <= 0x11B8 ||
+ c == 0x11BA ||
+ c >= 0x11BC && c <= 0x11C2 ||
+ c == 0x11EB ||
+ c == 0x11F0 ||
+ c == 0x11F9 ||
+ c >= 0x1E00 && c <= 0x1E9B ||
+ c >= 0x1EA0 && c <= 0x1EF9 ||
+ c >= 0x1F00 && c <= 0x1F15 ||
+ c >= 0x1F18 && c <= 0x1F1D ||
+ c >= 0x1F20 && c <= 0x1F45 ||
+ c >= 0x1F48 && c <= 0x1F4D ||
+ c >= 0x1F50 && c <= 0x1F57 ||
+ c == 0x1F59 ||
+ c == 0x1F5B ||
+ c == 0x1F5D ||
+ c >= 0x1F5F && c <= 0x1F7D ||
+ c >= 0x1F80 && c <= 0x1FB4 ||
+ c >= 0x1FB6 && c <= 0x1FBC ||
+ c == 0x1FBE ||
+ c >= 0x1FC2 && c <= 0x1FC4 ||
+ c >= 0x1FC6 && c <= 0x1FCC ||
+ c >= 0x1FD0 && c <= 0x1FD3 ||
+ c >= 0x1FD6 && c <= 0x1FDB ||
+ c >= 0x1FE0 && c <= 0x1FEC ||
+ c >= 0x1FF2 && c <= 0x1FF4 ||
+ c >= 0x1FF6 && c <= 0x1FFC ||
+ c == 0x2126 ||
+ c >= 0x212A && c <= 0x212B ||
+ c == 0x212E ||
+ c >= 0x2180 && c <= 0x2182 ||
+ c >= 0x3041 && c <= 0x3094 ||
+ c >= 0x30A1 && c <= 0x30FA ||
+ c >= 0x3105 && c <= 0x312C ||
+ c >= 0xAC00 && c <= 0xD7A3 ||
+ c >= 0x4E00 && c <= 0x9FA5 ||
+ c == 0x3007 ||
+ c >= 0x3021 && c <= 0x3029;
+};
+
+Utilities.isNCNameChar = function(c) {
+ return c >= 0x0030 && c <= 0x0039
+ || c >= 0x0660 && c <= 0x0669
+ || c >= 0x06F0 && c <= 0x06F9
+ || c >= 0x0966 && c <= 0x096F
+ || c >= 0x09E6 && c <= 0x09EF
+ || c >= 0x0A66 && c <= 0x0A6F
+ || c >= 0x0AE6 && c <= 0x0AEF
+ || c >= 0x0B66 && c <= 0x0B6F
+ || c >= 0x0BE7 && c <= 0x0BEF
+ || c >= 0x0C66 && c <= 0x0C6F
+ || c >= 0x0CE6 && c <= 0x0CEF
+ || c >= 0x0D66 && c <= 0x0D6F
+ || c >= 0x0E50 && c <= 0x0E59
+ || c >= 0x0ED0 && c <= 0x0ED9
+ || c >= 0x0F20 && c <= 0x0F29
+ || c == 0x002E
+ || c == 0x002D
+ || c == 0x005F
+ || Utilities.isLetter(c)
+ || c >= 0x0300 && c <= 0x0345
+ || c >= 0x0360 && c <= 0x0361
+ || c >= 0x0483 && c <= 0x0486
+ || c >= 0x0591 && c <= 0x05A1
+ || c >= 0x05A3 && c <= 0x05B9
+ || c >= 0x05BB && c <= 0x05BD
+ || c == 0x05BF
+ || c >= 0x05C1 && c <= 0x05C2
+ || c == 0x05C4
+ || c >= 0x064B && c <= 0x0652
+ || c == 0x0670
+ || c >= 0x06D6 && c <= 0x06DC
+ || c >= 0x06DD && c <= 0x06DF
+ || c >= 0x06E0 && c <= 0x06E4
+ || c >= 0x06E7 && c <= 0x06E8
+ || c >= 0x06EA && c <= 0x06ED
+ || c >= 0x0901 && c <= 0x0903
+ || c == 0x093C
+ || c >= 0x093E && c <= 0x094C
+ || c == 0x094D
+ || c >= 0x0951 && c <= 0x0954
+ || c >= 0x0962 && c <= 0x0963
+ || c >= 0x0981 && c <= 0x0983
+ || c == 0x09BC
+ || c == 0x09BE
+ || c == 0x09BF
+ || c >= 0x09C0 && c <= 0x09C4
+ || c >= 0x09C7 && c <= 0x09C8
+ || c >= 0x09CB && c <= 0x09CD
+ || c == 0x09D7
+ || c >= 0x09E2 && c <= 0x09E3
+ || c == 0x0A02
+ || c == 0x0A3C
+ || c == 0x0A3E
+ || c == 0x0A3F
+ || c >= 0x0A40 && c <= 0x0A42
+ || c >= 0x0A47 && c <= 0x0A48
+ || c >= 0x0A4B && c <= 0x0A4D
+ || c >= 0x0A70 && c <= 0x0A71
+ || c >= 0x0A81 && c <= 0x0A83
+ || c == 0x0ABC
+ || c >= 0x0ABE && c <= 0x0AC5
+ || c >= 0x0AC7 && c <= 0x0AC9
+ || c >= 0x0ACB && c <= 0x0ACD
+ || c >= 0x0B01 && c <= 0x0B03
+ || c == 0x0B3C
+ || c >= 0x0B3E && c <= 0x0B43
+ || c >= 0x0B47 && c <= 0x0B48
+ || c >= 0x0B4B && c <= 0x0B4D
+ || c >= 0x0B56 && c <= 0x0B57
+ || c >= 0x0B82 && c <= 0x0B83
+ || c >= 0x0BBE && c <= 0x0BC2
+ || c >= 0x0BC6 && c <= 0x0BC8
+ || c >= 0x0BCA && c <= 0x0BCD
+ || c == 0x0BD7
+ || c >= 0x0C01 && c <= 0x0C03
+ || c >= 0x0C3E && c <= 0x0C44
+ || c >= 0x0C46 && c <= 0x0C48
+ || c >= 0x0C4A && c <= 0x0C4D
+ || c >= 0x0C55 && c <= 0x0C56
+ || c >= 0x0C82 && c <= 0x0C83
+ || c >= 0x0CBE && c <= 0x0CC4
+ || c >= 0x0CC6 && c <= 0x0CC8
+ || c >= 0x0CCA && c <= 0x0CCD
+ || c >= 0x0CD5 && c <= 0x0CD6
+ || c >= 0x0D02 && c <= 0x0D03
+ || c >= 0x0D3E && c <= 0x0D43
+ || c >= 0x0D46 && c <= 0x0D48
+ || c >= 0x0D4A && c <= 0x0D4D
+ || c == 0x0D57
+ || c == 0x0E31
+ || c >= 0x0E34 && c <= 0x0E3A
+ || c >= 0x0E47 && c <= 0x0E4E
+ || c == 0x0EB1
+ || c >= 0x0EB4 && c <= 0x0EB9
+ || c >= 0x0EBB && c <= 0x0EBC
+ || c >= 0x0EC8 && c <= 0x0ECD
+ || c >= 0x0F18 && c <= 0x0F19
+ || c == 0x0F35
+ || c == 0x0F37
+ || c == 0x0F39
+ || c == 0x0F3E
+ || c == 0x0F3F
+ || c >= 0x0F71 && c <= 0x0F84
+ || c >= 0x0F86 && c <= 0x0F8B
+ || c >= 0x0F90 && c <= 0x0F95
+ || c == 0x0F97
+ || c >= 0x0F99 && c <= 0x0FAD
+ || c >= 0x0FB1 && c <= 0x0FB7
+ || c == 0x0FB9
+ || c >= 0x20D0 && c <= 0x20DC
+ || c == 0x20E1
+ || c >= 0x302A && c <= 0x302F
+ || c == 0x3099
+ || c == 0x309A
+ || c == 0x00B7
+ || c == 0x02D0
+ || c == 0x02D1
+ || c == 0x0387
+ || c == 0x0640
+ || c == 0x0E46
+ || c == 0x0EC6
+ || c == 0x3005
+ || c >= 0x3031 && c <= 0x3035
+ || c >= 0x309D && c <= 0x309E
+ || c >= 0x30FC && c <= 0x30FE;
+};
+
+Utilities.coalesceText = function(n) {
+ for (var m = n.firstChild; m != null; m = m.nextSibling) {
+ if (m.nodeType == 3 /*Node.TEXT_NODE*/ || m.nodeType == 4 /*Node.CDATA_SECTION_NODE*/) {
+ var s = m.nodeValue;
+ var first = m;
+ m = m.nextSibling;
+ while (m != null && (m.nodeType == 3 /*Node.TEXT_NODE*/ || m.nodeType == 4 /*Node.CDATA_SECTION_NODE*/)) {
+ s += m.nodeValue;
+ var del = m;
+ m = m.nextSibling;
+ del.parentNode.removeChild(del);
+ }
+ if (first.nodeType == 4 /*Node.CDATA_SECTION_NODE*/) {
+ var p = first.parentNode;
+ if (first.nextSibling == null) {
+ p.removeChild(first);
+ p.appendChild(p.ownerDocument.createTextNode(s));
+ } else {
+ var next = first.nextSibling;
+ p.removeChild(first);
+ p.insertBefore(p.ownerDocument.createTextNode(s), next);
+ }
+ } else {
+ first.nodeValue = s;
+ }
+ if (m == null) {
+ break;
+ }
+ } else if (m.nodeType == 1 /*Node.ELEMENT_NODE*/) {
+ Utilities.coalesceText(m);
+ }
+ }
+};
+
+Utilities.instance_of = function(o, c) {
+ while (o != null) {
+ if (o.constructor === c) {
+ return true;
+ }
+ if (o === Object) {
+ return false;
+ }
+ o = o.constructor.superclass;
+ }
+ return false;
+};
+
+Utilities.getElementById = function(n, id) {
+ // Note that this does not check the DTD to check for actual
+ // attributes of type ID, so this may be a bit wrong.
+ if (n.nodeType == 1 /*Node.ELEMENT_NODE*/) {
+ if (n.getAttribute("id") == id
+ || n.getAttributeNS(null, "id") == id) {
+ return n;
+ }
+ }
+ for (var m = n.firstChild; m != null; m = m.nextSibling) {
+ var res = Utilities.getElementById(m, id);
+ if (res != null) {
+ return res;
+ }
+ }
+ return null;
+};
+
+// XPathException ////////////////////////////////////////////////////////////
+
+var XPathException = (function () {
+ function getMessage(code, exception) {
+ var msg = exception ? ": " + exception.toString() : "";
+ switch (code) {
+ case XPathException.INVALID_EXPRESSION_ERR:
+ return "Invalid expression" + msg;
+ case XPathException.TYPE_ERR:
+ return "Type error" + msg;
+ }
+ return null;
+ }
+
+ function XPathException(code, error, message) {
+ var err = Error.call(this, getMessage(code, error) || message);
+
+ err.code = code;
+ err.exception = error;
+
+ return err;
+ }
+
+ XPathException.prototype = Object.create(Error.prototype);
+ XPathException.prototype.constructor = XPathException;
+ XPathException.superclass = Error;
+
+ XPathException.prototype.toString = function() {
+ return this.message;
+ };
+
+ XPathException.fromMessage = function(message, error) {
+ return new XPathException(null, error, message);
+ };
+
+ XPathException.INVALID_EXPRESSION_ERR = 51;
+ XPathException.TYPE_ERR = 52;
+
+ return XPathException;
+})();
+
+// XPathExpression ///////////////////////////////////////////////////////////
+
+XPathExpression.prototype = {};
+XPathExpression.prototype.constructor = XPathExpression;
+XPathExpression.superclass = Object.prototype;
+
+function XPathExpression(e, r, p) {
+ this.xpath = p.parse(e);
+ this.context = new XPathContext();
+ this.context.namespaceResolver = new XPathNSResolverWrapper(r);
+}
+
+XPathExpression.getOwnerDocument = function (n) {
+ return n.nodeType === 9 /*Node.DOCUMENT_NODE*/ ? n : n.ownerDocument;
+}
+
+XPathExpression.detectHtmlDom = function (n) {
+ if (!n) { return false; }
+
+ var doc = XPathExpression.getOwnerDocument(n);
+
+ try {
+ return doc.implementation.hasFeature("HTML", "2.0");
+ } catch (e) {
+ return true;
+ }
+}
+
+XPathExpression.prototype.evaluate = function(n, t, res) {
+ this.context.expressionContextNode = n;
+ // backward compatibility - no reliable way to detect whether the DOM is HTML, but
+ // this library has been using this method up until now, so we will continue to use it
+ // ONLY when using an XPathExpression
+ this.context.caseInsensitive = XPathExpression.detectHtmlDom(n);
+
+ var result = this.xpath.evaluate(this.context);
+ return new XPathResult(result, t);
+}
+
+// XPathNSResolverWrapper ////////////////////////////////////////////////////
+
+XPathNSResolverWrapper.prototype = {};
+XPathNSResolverWrapper.prototype.constructor = XPathNSResolverWrapper;
+XPathNSResolverWrapper.superclass = Object.prototype;
+
+function XPathNSResolverWrapper(r) {
+ this.xpathNSResolver = r;
+}
+
+XPathNSResolverWrapper.prototype.getNamespace = function(prefix, n) {
+ if (this.xpathNSResolver == null) {
+ return null;
+ }
+ return this.xpathNSResolver.lookupNamespaceURI(prefix);
+};
+
+// NodeXPathNSResolver ///////////////////////////////////////////////////////
+
+NodeXPathNSResolver.prototype = {};
+NodeXPathNSResolver.prototype.constructor = NodeXPathNSResolver;
+NodeXPathNSResolver.superclass = Object.prototype;
+
+function NodeXPathNSResolver(n) {
+ this.node = n;
+ this.namespaceResolver = new NamespaceResolver();
+}
+
+NodeXPathNSResolver.prototype.lookupNamespaceURI = function(prefix) {
+ return this.namespaceResolver.getNamespace(prefix, this.node);
+};
+
+// XPathResult ///////////////////////////////////////////////////////////////
+
+XPathResult.prototype = {};
+XPathResult.prototype.constructor = XPathResult;
+XPathResult.superclass = Object.prototype;
+
+function XPathResult(v, t) {
+ if (t == XPathResult.ANY_TYPE) {
+ if (v.constructor === XString) {
+ t = XPathResult.STRING_TYPE;
+ } else if (v.constructor === XNumber) {
+ t = XPathResult.NUMBER_TYPE;
+ } else if (v.constructor === XBoolean) {
+ t = XPathResult.BOOLEAN_TYPE;
+ } else if (v.constructor === XNodeSet) {
+ t = XPathResult.UNORDERED_NODE_ITERATOR_TYPE;
+ }
+ }
+ this.resultType = t;
+ switch (t) {
+ case XPathResult.NUMBER_TYPE:
+ this.numberValue = v.numberValue();
+ return;
+ case XPathResult.STRING_TYPE:
+ this.stringValue = v.stringValue();
+ return;
+ case XPathResult.BOOLEAN_TYPE:
+ this.booleanValue = v.booleanValue();
+ return;
+ case XPathResult.ANY_UNORDERED_NODE_TYPE:
+ case XPathResult.FIRST_ORDERED_NODE_TYPE:
+ if (v.constructor === XNodeSet) {
+ this.singleNodeValue = v.first();
+ return;
+ }
+ break;
+ case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
+ case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
+ if (v.constructor === XNodeSet) {
+ this.invalidIteratorState = false;
+ this.nodes = v.toArray();
+ this.iteratorIndex = 0;
+ return;
+ }
+ break;
+ case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
+ case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
+ if (v.constructor === XNodeSet) {
+ this.nodes = v.toArray();
+ this.snapshotLength = this.nodes.length;
+ return;
+ }
+ break;
+ }
+ throw new XPathException(XPathException.TYPE_ERR);
+};
+
+XPathResult.prototype.iterateNext = function() {
+ if (this.resultType != XPathResult.UNORDERED_NODE_ITERATOR_TYPE
+ && this.resultType != XPathResult.ORDERED_NODE_ITERATOR_TYPE) {
+ throw new XPathException(XPathException.TYPE_ERR);
+ }
+ return this.nodes[this.iteratorIndex++];
+};
+
+XPathResult.prototype.snapshotItem = function(i) {
+ if (this.resultType != XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE
+ && this.resultType != XPathResult.ORDERED_NODE_SNAPSHOT_TYPE) {
+ throw new XPathException(XPathException.TYPE_ERR);
+ }
+ return this.nodes[i];
+};
+
+XPathResult.ANY_TYPE = 0;
+XPathResult.NUMBER_TYPE = 1;
+XPathResult.STRING_TYPE = 2;
+XPathResult.BOOLEAN_TYPE = 3;
+XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
+XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
+XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
+XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
+XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
+
+// DOM 3 XPath support ///////////////////////////////////////////////////////
+
+function installDOM3XPathSupport(doc, p) {
+ doc.createExpression = function(e, r) {
+ try {
+ return new XPathExpression(e, r, p);
+ } catch (e) {
+ throw new XPathException(XPathException.INVALID_EXPRESSION_ERR, e);
+ }
+ };
+ doc.createNSResolver = function(n) {
+ return new NodeXPathNSResolver(n);
+ };
+ doc.evaluate = function(e, cn, r, t, res) {
+ if (t < 0 || t > 9) {
+ throw { code: 0, toString: function() { return "Request type not supported"; } };
+ }
+ return doc.createExpression(e, r, p).evaluate(cn, t, res);
+ };
+};
+
+// ---------------------------------------------------------------------------
+
+// Install DOM 3 XPath support for the current document.
+try {
+ var shouldInstall = true;
+ try {
+ if (document.implementation
+ && document.implementation.hasFeature
+ && document.implementation.hasFeature("XPath", null)) {
+ shouldInstall = false;
+ }
+ } catch (e) {
+ }
+ if (shouldInstall) {
+ installDOM3XPathSupport(document, new XPathParser());
+ }
+} catch (e) {
+}
+
+// ---------------------------------------------------------------------------
+// exports for node.js
+
+installDOM3XPathSupport(exports, new XPathParser());
+
+(function() {
+ var parser = new XPathParser();
+
+ var defaultNSResolver = new NamespaceResolver();
+ var defaultFunctionResolver = new FunctionResolver();
+ var defaultVariableResolver = new VariableResolver();
+
+ function makeNSResolverFromFunction(func) {
+ return {
+ getNamespace: function (prefix, node) {
+ var ns = func(prefix, node);
+
+ return ns || defaultNSResolver.getNamespace(prefix, node);
+ }
+ };
+ }
+
+ function makeNSResolverFromObject(obj) {
+ return makeNSResolverFromFunction(obj.getNamespace.bind(obj));
+ }
+
+ function makeNSResolverFromMap(map) {
+ return makeNSResolverFromFunction(function (prefix) {
+ return map[prefix];
+ });
+ }
+
+ function makeNSResolver(resolver) {
+ if (resolver && typeof resolver.getNamespace === "function") {
+ return makeNSResolverFromObject(resolver);
+ }
+
+ if (typeof resolver === "function") {
+ return makeNSResolverFromFunction(resolver);
+ }
+
+ // assume prefix -> uri mapping
+ if (typeof resolver === "object") {
+ return makeNSResolverFromMap(resolver);
+ }
+
+ return defaultNSResolver;
+ }
+
+ /** Converts native JavaScript types to their XPath library equivalent */
+ function convertValue(value) {
+ if (value === null ||
+ typeof value === "undefined" ||
+ value instanceof XString ||
+ value instanceof XBoolean ||
+ value instanceof XNumber ||
+ value instanceof XNodeSet) {
+ return value;
+ }
+
+ switch (typeof value) {
+ case "string": return new XString(value);
+ case "boolean": return new XBoolean(value);
+ case "number": return new XNumber(value);
+ }
+
+ // assume node(s)
+ var ns = new XNodeSet();
+ ns.addArray([].concat(value));
+ return ns;
+ }
+
+ function makeEvaluator(func) {
+ return function (context) {
+ var args = Array.prototype.slice.call(arguments, 1).map(function (arg) {
+ return arg.evaluate(context);
+ });
+ var result = func.apply(this, [].concat(context, args));
+ return convertValue(result);
+ };
+ }
+
+ function makeFunctionResolverFromFunction(func) {
+ return {
+ getFunction: function (name, namespace) {
+ var found = func(name, namespace);
+ if (found) {
+ return makeEvaluator(found);
+ }
+ return defaultFunctionResolver.getFunction(name, namespace);
+ }
+ };
+ }
+
+ function makeFunctionResolverFromObject(obj) {
+ return makeFunctionResolverFromFunction(obj.getFunction.bind(obj));
+ }
+
+ function makeFunctionResolverFromMap(map) {
+ return makeFunctionResolverFromFunction(function (name) {
+ return map[name];
+ });
+ }
+
+ function makeFunctionResolver(resolver) {
+ if (resolver && typeof resolver.getFunction === "function") {
+ return makeFunctionResolverFromObject(resolver);
+ }
+
+ if (typeof resolver === "function") {
+ return makeFunctionResolverFromFunction(resolver);
+ }
+
+ // assume map
+ if (typeof resolver === "object") {
+ return makeFunctionResolverFromMap(resolver);
+ }
+
+ return defaultFunctionResolver;
+ }
+
+ function makeVariableResolverFromFunction(func) {
+ return {
+ getVariable: function (name, namespace) {
+ var value = func(name, namespace);
+ return convertValue(value);
+ }
+ };
+ }
+
+ function makeVariableResolver(resolver) {
+ if (resolver) {
+ if (typeof resolver.getVariable === "function") {
+ return makeVariableResolverFromFunction(resolver.getVariable.bind(resolver));
+ }
+
+ if (typeof resolver === "function") {
+ return makeVariableResolverFromFunction(resolver);
+ }
+
+ // assume map
+ if (typeof resolver === "object") {
+ return makeVariableResolverFromFunction(function (name) {
+ return resolver[name];
+ });
+ }
+ }
+
+ return defaultVariableResolver;
+ }
+
+ function copyIfPresent(prop, dest, source) {
+ if (prop in source) { dest[prop] = source[prop]; }
+ }
+
+ function makeContext(options) {
+ var context = new XPathContext();
+
+ if (options) {
+ context.namespaceResolver = makeNSResolver(options.namespaces);
+ context.functionResolver = makeFunctionResolver(options.functions);
+ context.variableResolver = makeVariableResolver(options.variables);
+ context.expressionContextNode = options.node;
+ copyIfPresent('allowAnyNamespaceForNoPrefix', context, options);
+ copyIfPresent('isHtml', context, options);
+ } else {
+ context.namespaceResolver = defaultNSResolver;
+ }
+
+ return context;
+ }
+
+ function evaluate(parsedExpression, options) {
+ var context = makeContext(options);
+
+ return parsedExpression.evaluate(context);
+ }
+
+ var evaluatorPrototype = {
+ evaluate: function (options) {
+ return evaluate(this.expression, options);
+ }
+
+ ,evaluateNumber: function (options) {
+ return this.evaluate(options).numberValue();
+ }
+
+ ,evaluateString: function (options) {
+ return this.evaluate(options).stringValue();
+ }
+
+ ,evaluateBoolean: function (options) {
+ return this.evaluate(options).booleanValue();
+ }
+
+ ,evaluateNodeSet: function (options) {
+ return this.evaluate(options).nodeset();
+ }
+
+ ,select: function (options) {
+ return this.evaluateNodeSet(options).toArray()
+ }
+
+ ,select1: function (options) {
+ return this.select(options)[0];
+ }
+ };
+
+ function parse(xpath) {
+ var parsed = parser.parse(xpath);
+
+ return Object.create(evaluatorPrototype, {
+ expression: {
+ value: parsed
+ }
+ });
+ }
+
+ exports.parse = parse;
+})();
+
+exports.XPath = XPath;
+exports.XPathParser = XPathParser;
+exports.XPathResult = XPathResult;
+
+exports.Step = Step;
+exports.NodeTest = NodeTest;
+exports.BarOperation = BarOperation;
+
+exports.NamespaceResolver = NamespaceResolver;
+exports.FunctionResolver = FunctionResolver;
+exports.VariableResolver = VariableResolver;
+
+exports.Utilities = Utilities;
+
+exports.XPathContext = XPathContext;
+exports.XNodeSet = XNodeSet;
+exports.XBoolean = XBoolean;
+exports.XString = XString;
+exports.XNumber = XNumber;
+
+// helper
+exports.select = function(e, doc, single) {
+ return exports.selectWithResolver(e, doc, null, single);
+};
+
+exports.useNamespaces = function(mappings) {
+ var resolver = {
+ mappings: mappings || {},
+ lookupNamespaceURI: function(prefix) {
+ return this.mappings[prefix];
+ }
+ };
+
+ return function(e, doc, single) {
+ return exports.selectWithResolver(e, doc, resolver, single);
+ };
+};
+
+exports.selectWithResolver = function(e, doc, resolver, single) {
+ var expression = new XPathExpression(e, resolver, new XPathParser());
+ var type = XPathResult.ANY_TYPE;
+
+ var result = expression.evaluate(doc, type, null);
+
+ if (result.resultType == XPathResult.STRING_TYPE) {
+ result = result.stringValue;
+ }
+ else if (result.resultType == XPathResult.NUMBER_TYPE) {
+ result = result.numberValue;
+ }
+ else if (result.resultType == XPathResult.BOOLEAN_TYPE) {
+ result = result.booleanValue;
+ }
+ else {
+ result = result.nodes;
+ if (single) {
+ result = result[0];
+ }
+ }
+
+ return result;
+};
+
+exports.select1 = function(e, doc) {
+ return exports.select(e, doc, true);
+};
+
+// end non-node wrapper
+})(xpath);
diff --git a/package-lock.json b/package-lock.json
index 7f002ee0..d9e25812 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38,6 +38,17 @@
"integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==",
"dev": true
},
+ "actions-secret-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/actions-secret-parser/-/actions-secret-parser-1.0.3.tgz",
+ "integrity": "sha512-+iGlMSsE/cbxDaEZlqR0NUjn35DckMYsdYFwVeZ7JRbtyO/AiBKnaScKkzkHSoiZ4nEPTdIHtMpRGVgoeVYX+A==",
+ "requires": {
+ "@actions/core": "^1.1.3",
+ "jsonpath": "^1.0.2",
+ "xmldom": "^0.1.27",
+ "xpath": "0.0.27"
+ }
+ },
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -46,11 +57,43 @@
"sprintf-js": "~1.0.2"
}
},
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ }
+ },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
"js-yaml": {
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
@@ -60,21 +103,92 @@
"esprima": "^4.0.0"
}
},
+ "jsonpath": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
+ "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "requires": {
+ "esprima": "1.2.2",
+ "static-eval": "2.0.2",
+ "underscore": "1.12.1"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
+ "integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs="
+ },
+ "underscore": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
+ }
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
+ "static-eval": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
+ "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
+ "requires": {
+ "escodegen": "^1.8.1"
+ }
+ },
"tunnel": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz",
"integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM="
},
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
"typed-rest-client": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.5.0.tgz",
@@ -99,6 +213,21 @@
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
"integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+ },
+ "xmldom": {
+ "version": "0.1.31",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
+ "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ=="
+ },
+ "xpath": {
+ "version": "0.0.27",
+ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz",
+ "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ=="
}
}
}
diff --git a/package.json b/package.json
index 6aa01bdb..27f1bd22 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.0",
"@actions/tool-cache": "^1.0.0",
+ "actions-secret-parser": "^1.0.3",
"js-yaml": "^3.13.1"
},
"devDependencies": {
diff --git a/src/PowerShell/Constants.ts b/src/PowerShell/Constants.ts
new file mode 100644
index 00000000..9613db1d
--- /dev/null
+++ b/src/PowerShell/Constants.ts
@@ -0,0 +1,13 @@
+export default class Constants {
+ static readonly prefix: string = "az_";
+ static readonly moduleName: string = "Az.Accounts";
+ static readonly versionPattern = /[0-9]\.[0-9]\.[0-9]/;
+
+ static readonly AzureCloud: string = "AzureCloud";
+ static readonly Subscription: string = "Subscription";
+ static readonly ServicePrincipal: string = "ServicePrincipal";
+
+ static readonly Success: string = "Success";
+ static readonly Error: string = "Error";
+ static readonly AzVersion: string = "AzVersion";
+}
\ No newline at end of file
diff --git a/src/PowerShell/IAzurePowerShellSession.ts b/src/PowerShell/IAzurePowerShellSession.ts
new file mode 100644
index 00000000..544369d5
--- /dev/null
+++ b/src/PowerShell/IAzurePowerShellSession.ts
@@ -0,0 +1,4 @@
+interface IAzurePowerShellSession {
+ initialize();
+ login();
+}
\ No newline at end of file
diff --git a/src/PowerShell/ServicePrincipalLogin.ts b/src/PowerShell/ServicePrincipalLogin.ts
new file mode 100644
index 00000000..cc8a2dde
--- /dev/null
+++ b/src/PowerShell/ServicePrincipalLogin.ts
@@ -0,0 +1,71 @@
+import * as core from '@actions/core';
+
+import Utils from './Utilities/Utils';
+import PowerShellToolRunner from './Utilities/PowerShellToolRunner';
+import ScriptBuilder from './Utilities/ScriptBuilder';
+import Constants from './Constants';
+
+export class ServicePrincipalLogin implements IAzurePowerShellSession {
+ static readonly scopeLevel: string = Constants.Subscription;
+ static readonly scheme: string = Constants.ServicePrincipal;
+ environment: string;
+ servicePrincipalId: string;
+ servicePrincipalKey: string;
+ tenantId: string;
+ subscriptionId: string;
+ resourceManagerEndpointUrl: string;
+ allowNoSubscriptionsLogin: boolean;
+
+ constructor(servicePrincipalId: string,
+ servicePrincipalKey: string,
+ tenantId: string,
+ subscriptionId: string,
+ allowNoSubscriptionsLogin: boolean,
+ environment: string,
+ resourceManagerEndpointUrl: string) {
+
+ this.servicePrincipalId = servicePrincipalId;
+ this.servicePrincipalKey = servicePrincipalKey;
+ this.tenantId = tenantId;
+ this.subscriptionId = subscriptionId;
+ this.environment = environment;
+ this.resourceManagerEndpointUrl = resourceManagerEndpointUrl;
+ this.allowNoSubscriptionsLogin = allowNoSubscriptionsLogin;
+ }
+
+ async initialize() {
+ Utils.setPSModulePath();
+ const azLatestVersion: string = await Utils.getLatestModule(Constants.moduleName);
+ core.debug(`Az Module version used: ${azLatestVersion}`);
+ Utils.setPSModulePath(`${Constants.prefix}${azLatestVersion}`);
+ }
+
+ async login() {
+ let output: string = "";
+ const options: any = {
+ listeners: {
+ stdout: (data: Buffer) => {
+ output += data.toString();
+ }
+ }
+ };
+ const args: any = {
+ servicePrincipalId: this.servicePrincipalId,
+ servicePrincipalKey: this.servicePrincipalKey,
+ subscriptionId: this.subscriptionId,
+ environment: this.environment,
+ scopeLevel: ServicePrincipalLogin.scopeLevel,
+ allowNoSubscriptionsLogin: this.allowNoSubscriptionsLogin,
+ resourceManagerEndpointUrl: this.resourceManagerEndpointUrl
+ }
+ const script: string = new ScriptBuilder().getAzPSLoginScript(ServicePrincipalLogin.scheme, this.tenantId, args);
+ await PowerShellToolRunner.init();
+ await PowerShellToolRunner.executePowerShellScriptBlock(script, options);
+ const result: any = JSON.parse(output.trim());
+ if (!(Constants.Success in result)) {
+ throw new Error(`Azure PowerShell login failed with error: ${result[Constants.Error]}`);
+ }
+ console.log(`Azure PowerShell session successfully initialized`);
+ }
+
+}
\ No newline at end of file
diff --git a/src/PowerShell/Utilities/PowerShellToolRunner.ts b/src/PowerShell/Utilities/PowerShellToolRunner.ts
new file mode 100644
index 00000000..e8364f32
--- /dev/null
+++ b/src/PowerShell/Utilities/PowerShellToolRunner.ts
@@ -0,0 +1,16 @@
+import * as io from '@actions/io';
+import * as exec from '@actions/exec';
+
+export default class PowerShellToolRunner {
+ static psPath: string;
+
+ static async init() {
+ if(!PowerShellToolRunner.psPath) {
+ PowerShellToolRunner.psPath = await io.which("pwsh", true);
+ }
+ }
+
+ static async executePowerShellScriptBlock(scriptBlock: string, options: any = {}) {
+ await exec.exec(`"${PowerShellToolRunner.psPath}" -Command`, [scriptBlock], options)
+ }
+}
\ No newline at end of file
diff --git a/src/PowerShell/Utilities/ScriptBuilder.ts b/src/PowerShell/Utilities/ScriptBuilder.ts
new file mode 100644
index 00000000..2da79a1f
--- /dev/null
+++ b/src/PowerShell/Utilities/ScriptBuilder.ts
@@ -0,0 +1,54 @@
+import * as core from '@actions/core';
+
+import Constants from "../Constants";
+
+export default class ScriptBuilder {
+ script: string = "";
+
+ getAzPSLoginScript(scheme: string, tenantId: string, args: any): string {
+ let command = `Clear-AzContext -Scope Process;
+ Clear-AzContext -Scope CurrentUser -Force -ErrorAction SilentlyContinue;`;
+ if (scheme === Constants.ServicePrincipal) {
+ if (args.environment.toLowerCase() == "azurestack") {
+ command += `Add-AzEnvironment -Name ${args.environment} -ARMEndpoint ${args.resourceManagerEndpointUrl} | out-null;`;
+ }
+ command += `Connect-AzAccount -ServicePrincipal -Tenant '${tenantId}' -Credential \
+ (New-Object System.Management.Automation.PSCredential('${args.servicePrincipalId}',(ConvertTo-SecureString '${args.servicePrincipalKey.replace("'", "''")}' -AsPlainText -Force))) \
+ -Environment '${args.environment}' | out-null;`;
+ if (args.scopeLevel === Constants.Subscription && !args.allowNoSubscriptionsLogin) {
+ command += `Set-AzContext -SubscriptionId '${args.subscriptionId}' -TenantId '${tenantId}' | out-null;`;
+ }
+ }
+ this.script += `try {
+ $ErrorActionPreference = "Stop"
+ $WarningPreference = "SilentlyContinue"
+ $output = @{}
+ ${command}
+ $output['${Constants.Success}'] = "true"
+ }
+ catch {
+ $output['${Constants.Error}'] = $_.exception.Message
+ }
+ return ConvertTo-Json $output`;
+ core.debug(`Azure PowerShell Login Script: ${this.script}`);
+ return this.script;
+ }
+
+ getLatestModuleScript(moduleName: string): string {
+ const command: string = `Get-Module -Name ${moduleName} -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1`;
+ this.script += `try {
+ $ErrorActionPreference = "Stop"
+ $WarningPreference = "SilentlyContinue"
+ $output = @{}
+ $data = ${command}
+ $output['${Constants.AzVersion}'] = $data.Version.ToString()
+ $output['${Constants.Success}'] = "true"
+ }
+ catch {
+ $output['${Constants.Error}'] = $_.exception.Message
+ }
+ return ConvertTo-Json $output`;
+ core.debug(`GetLatestModuleScript: ${this.script}`);
+ return this.script;
+ }
+}
diff --git a/src/PowerShell/Utilities/Utils.ts b/src/PowerShell/Utilities/Utils.ts
new file mode 100644
index 00000000..8814ab1f
--- /dev/null
+++ b/src/PowerShell/Utilities/Utils.ts
@@ -0,0 +1,61 @@
+import * as os from 'os';
+
+import Constants from '../Constants';
+import ScriptBuilder from './ScriptBuilder';
+import PowerShellToolRunner from './PowerShellToolRunner';
+
+export default class Utils {
+ /**
+ * Add the folder path where Az modules are present to PSModulePath based on runner
+ * @param azPSVersion
+ * If azPSVersion is empty, folder path in which all Az modules are present are set
+ * If azPSVersion is not empty, folder path of exact Az module version is set
+ */
+ static setPSModulePath(azPSVersion: string = "") {
+ let modulePath: string = "";
+ const runner: string = process.env.RUNNER_OS || os.type();
+ switch (runner.toLowerCase()) {
+ case "linux":
+ modulePath = `/usr/share/${azPSVersion}:`;
+ break;
+ case "windows":
+ case "windows_nt":
+ modulePath = `C:\\Modules\\${azPSVersion};`;
+ break;
+ case "macos":
+ case "darwin":
+ throw new Error(`OS not supported`);
+ default:
+ throw new Error(`Unknown os: ${runner.toLowerCase()}`);
+ }
+ process.env.PSModulePath = `${modulePath}${process.env.PSModulePath}`;
+ }
+
+ static async getLatestModule(moduleName: string): Promise {
+ let output: string = "";
+ const options: any = {
+ listeners: {
+ stdout: (data: Buffer) => {
+ output += data.toString();
+ }
+ }
+ };
+ await PowerShellToolRunner.init();
+ await PowerShellToolRunner.executePowerShellScriptBlock(new ScriptBuilder()
+ .getLatestModuleScript(moduleName), options);
+ const result = JSON.parse(output.trim());
+ if (!(Constants.Success in result)) {
+ throw new Error(result[Constants.Error]);
+ }
+ const azLatestVersion: string = result[Constants.AzVersion];
+ if (!Utils.isValidVersion(azLatestVersion)) {
+ throw new Error(`Invalid AzPSVersion: ${azLatestVersion}`);
+ }
+ return azLatestVersion;
+ }
+
+ static isValidVersion(version: string): boolean {
+ return !!version.match(Constants.versionPattern);
+ }
+}
+
diff --git a/src/arc-login.ts b/src/arc-login.ts
index 06ce91aa..2d1e183a 100644
--- a/src/arc-login.ts
+++ b/src/arc-login.ts
@@ -2,6 +2,10 @@ import * as core from '@actions/core';
import { rejects } from 'assert';
import { WebRequest, WebRequestOptions, WebResponse, sendRequest } from './client';
import * as querystring from 'querystring';
+import * as az_login from './main';
+import * as path from 'path';
+import {spawn} from 'child_process';
+import * as fs from 'fs';
async function getAzureAccessToken(servicePrincipalId, servicePrincipalKey, tenantId, authorityUrl, managementEndpointUrl: string): Promise {
@@ -47,52 +51,52 @@ async function getAzureAccessToken(servicePrincipalId, servicePrincipalKey, tena
export async function getArcKubeconfig(): Promise {
try {
- let creds = core.getInput('creds');
- let credsObject: { [key: string]: string; };
- try {
- credsObject = JSON.parse(creds);
- } catch (ex) {
- throw new Error('Credentials object is not a valid JSON: ' + ex);
- }
-
- let servicePrincipalId = credsObject["clientId"];
- let servicePrincipalKey = credsObject["clientSecret"];
- let tenantId = credsObject["tenantId"];
- let authorityUrl = credsObject["activeDirectoryEndpointUrl"] || "https://login.microsoftonline.com";
- let managementEndpointUrl = credsObject["resourceManagerEndpointUrl"] || "https://management.azure.com/";
- let subscriptionId = credsObject["subscriptionId"];
-
- let azureSessionToken = await getAzureAccessToken(servicePrincipalId, servicePrincipalKey, tenantId, authorityUrl, managementEndpointUrl).catch(ex => {
- throw new Error('Could not fetch the azure access token: ' + ex);
- });
+ let method = core.getInput('method');
+ if (method != 'service-account' && method != 'spn'){
+ throw Error("Supported methods for arc cluster are 'service-account' and 'spn'.");
+ }
+
let resourceGroupName = core.getInput('resource-group');
let clusterName = core.getInput('cluster-name');
- let saToken = core.getInput('token');
- return new Promise((resolve, reject) => {
- var webRequest = new WebRequest();
- webRequest.method = 'POST';
- webRequest.uri = `${managementEndpointUrl}/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.Kubernetes/connectedClusters/${clusterName}/listClusterUserCredentials?api-version=2020-01-01-preview`;
- webRequest.headers = {
- 'Authorization': 'Bearer ' + azureSessionToken,
- 'Content-Type': 'application/json; charset=utf-8'
+ if(!resourceGroupName){
+ throw Error("'resourceGroupName' is not passed for arc cluster.")
+ }
+ if(!clusterName){
+ throw Error("'clusterName' is not passed for arc cluster.")
+ }
+ await az_login.main();
+ await az_login.executeAzCliCommand(`account show`, false);
+ await az_login.executeAzCliCommand(`extension add -n connectedk8s`, false);
+ await az_login.executeAzCliCommand(`extension list`, false);
+ const runnerTempDirectory = process.env['RUNNER_TEMP']; // Using process.env until the core libs are updated
+ const kubeconfigPath = path.join(runnerTempDirectory, `kubeconfig_${Date.now()}`);
+ if (method == 'service-account'){
+ let saToken = core.getInput('token');
+ if(!saToken){
+ throw Error("'saToken' is not passed for 'service-account' method.")
}
- webRequest.body = JSON.stringify({
- authenticationMethod: "Token",
- value: {
- token: saToken
- }
- });
- sendRequest(webRequest).then((response: WebResponse) => {
- let kubeconfigs = response.body.kubeconfigs;
- if (kubeconfigs && kubeconfigs.length > 0) {
- var kubeconfig = Buffer.from(kubeconfigs[0].value, 'base64');
- resolve(kubeconfig.toString());
- } else {
- reject(JSON.stringify(response.body));
- }
- }).catch(reject);
- });
+ console.log('using service account method for authenticating to arc cluster.')
+ spawn('az',['connectedk8s','proxy','-n',clusterName,'-g',resourceGroupName,'-f',kubeconfigPath,'--token',saToken], {
+ detached: true,
+ stdio: 'ignore'
+ }).unref();
+ } else{
+ console.log('using spn method for authenticating to arc cluster.')
+ spawn('az',['connectedk8s','proxy','-n',clusterName,'-g',resourceGroupName,'-f',kubeconfigPath], {
+ detached: true,
+ stdio: 'ignore'
+ }).unref();
+ }
+ console.log('started proxy')
+ await sleep(120000) //sleeping for a minute to allow kubeconfig to be merged
+ fs.chmodSync(kubeconfigPath, '600');
+ core.exportVariable('KUBECONFIG', kubeconfigPath);
+ console.log('KUBECONFIG environment variable is set');
} catch (ex) {
return Promise.reject(ex);
}
-}
\ No newline at end of file
+}
+
+function sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
diff --git a/src/login.ts b/src/login.ts
index f4fb91e0..eb44f6e7 100644
--- a/src/login.ts
+++ b/src/login.ts
@@ -107,21 +107,21 @@ async function run() {
let kubeconfig = '';
const cluster_type = core.getInput('cluster-type', { required: true });
if (cluster_type == 'arc') {
- kubeconfig = await getArcKubeconfig().catch(ex => {
+ await getArcKubeconfig().catch(ex => {
throw new Error('Error: Could not get the KUBECONFIG for arc cluster: ' + ex);
});
}
else {
+ const runnerTempDirectory = process.env['RUNNER_TEMP']; // Using process.env until the core libs are updated
+ const kubeconfigPath = path.join(runnerTempDirectory, `kubeconfig_${Date.now()}`);
kubeconfig = getKubeconfig();
+ core.debug(`Writing kubeconfig contents to ${kubeconfigPath}`);
+ fs.writeFileSync(kubeconfigPath, kubeconfig);
+ fs.chmodSync(kubeconfigPath, '600');
+ core.exportVariable('KUBECONFIG', kubeconfigPath);
+ console.log('KUBECONFIG environment variable is set');
+ await setContext(kubeconfigPath);
}
- const runnerTempDirectory = process.env['RUNNER_TEMP']; // Using process.env until the core libs are updated
- const kubeconfigPath = path.join(runnerTempDirectory, `kubeconfig_${Date.now()}`);
- core.debug(`Writing kubeconfig contents to ${kubeconfigPath}`);
- fs.writeFileSync(kubeconfigPath, kubeconfig);
- fs.chmodSync(kubeconfigPath, '600');
- core.exportVariable('KUBECONFIG', kubeconfigPath);
- console.log('KUBECONFIG environment variable is set');
- await setContext(kubeconfigPath);
} catch (ex) {
return Promise.reject(ex);
}
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 00000000..f80cd5b1
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,176 @@
+import * as core from '@actions/core';
+import * as exec from '@actions/exec';
+import * as io from '@actions/io';
+import { FormatType, SecretParser } from 'actions-secret-parser';
+import { ServicePrincipalLogin } from './PowerShell/ServicePrincipalLogin';
+
+var azPath: string;
+var prefix = !!process.env.AZURE_HTTP_USER_AGENT ? `${process.env.AZURE_HTTP_USER_AGENT}` : "";
+var azPSHostEnv = !!process.env.AZUREPS_HOST_ENVIRONMENT ? `${process.env.AZUREPS_HOST_ENVIRONMENT}` : "";
+
+export async function main() {
+ try {
+ // Set user agent variable
+ var isAzCLISuccess = false;
+ let usrAgentRepo = `${process.env.GITHUB_REPOSITORY}`;
+ let actionName = 'AzureLogin';
+ let userAgentString = (!!prefix ? `${prefix}+` : '') + `GITHUBACTIONS/${actionName}@v1_${usrAgentRepo}`;
+ let azurePSHostEnv = (!!azPSHostEnv ? `${azPSHostEnv}+` : '') + `GITHUBACTIONS/${actionName}@v1_${usrAgentRepo}`;
+ core.exportVariable('AZURE_HTTP_USER_AGENT', userAgentString);
+ core.exportVariable('AZUREPS_HOST_ENVIRONMENT', azurePSHostEnv);
+
+ azPath = await io.which("az", true);
+
+ let azureSupportedCloudName = new Set([
+ "azureusgovernment",
+ "azurechinacloud",
+ "azuregermancloud",
+ "azurecloud",
+ "azurestack"]);
+
+ let output: string = "";
+ const execOptions: any = {
+ listeners: {
+ stdout: (data: Buffer) => {
+ output += data.toString();
+ }
+ }
+ };
+ await executeAzCliCommand("--version", true, execOptions);
+ core.debug(`az cli version used:\n${output}`);
+
+ let creds = core.getInput('creds', { required: true });
+ let secrets = new SecretParser(creds, FormatType.JSON);
+ let servicePrincipalId = secrets.getSecret("$.clientId", false);
+ let servicePrincipalKey = secrets.getSecret("$.clientSecret", true);
+ let tenantId = secrets.getSecret("$.tenantId", false);
+ let subscriptionId = secrets.getSecret("$.subscriptionId", false);
+ let resourceManagerEndpointUrl = secrets.getSecret("$.resourceManagerEndpointUrl", false);
+ let environment = core.getInput("environment").toLowerCase();
+ const enableAzPSSession = core.getInput('enable-AzPSSession').toLowerCase() === "true";
+ const allowNoSubscriptionsLogin = core.getInput('allow-no-subscriptions').toLowerCase() === "true";
+
+ if (!servicePrincipalId || !servicePrincipalKey || !tenantId) {
+ throw new Error("Not all values are present in the creds object. Ensure clientId, clientSecret and tenantId are supplied.");
+ }
+
+ if (!subscriptionId && !allowNoSubscriptionsLogin) {
+ throw new Error("Not all values are present in the creds object. Ensure subscriptionId is supplied.");
+ }
+
+ if (!azureSupportedCloudName.has(environment)){
+ throw new Error("Unsupported value for environment is passed.The list of supported values for environment are ‘azureusgovernment', ‘azurechinacloud’, ‘azuregermancloud’, ‘azurecloud’ or ’azurestack’");
+ }
+
+ // Attempting Az cli login
+ if (environment == "azurestack") {
+ if (!resourceManagerEndpointUrl) {
+ throw new Error("resourceManagerEndpointUrl is a required parameter when environment is defined.");
+ }
+
+ console.log(`Unregistering cloud: "${environment}" first if it exists`);
+ try {
+ await executeAzCliCommand(`cloud set -n AzureCloud`, true);
+ await executeAzCliCommand(`cloud unregister -n "${environment}"`, false);
+ }
+ catch (error) {
+ console.log(`Ignore cloud not registered error: "${error}"`);
+ }
+
+ console.log(`Registering cloud: "${environment}" with ARM endpoint: "${resourceManagerEndpointUrl}"`);
+ try {
+ let baseUri = resourceManagerEndpointUrl;
+ if (baseUri.endsWith('/')) {
+ baseUri = baseUri.substring(0, baseUri.length-1); // need to remove trailing / from resourceManagerEndpointUrl to correctly derive suffixes below
+ }
+ let suffixKeyvault = ".vault" + baseUri.substring(baseUri.indexOf('.')); // keyvault suffix starts with .
+ let suffixStorage = baseUri.substring(baseUri.indexOf('.')+1); // storage suffix starts without .
+ let profileVersion = "2019-03-01-hybrid";
+ await executeAzCliCommand(`cloud register -n "${environment}" --endpoint-resource-manager "${resourceManagerEndpointUrl}" --suffix-keyvault-dns "${suffixKeyvault}" --suffix-storage-endpoint "${suffixStorage}" --profile "${profileVersion}"`, false);
+ }
+ catch (error) {
+ core.error(`Error while trying to register cloud "${environment}": "${error}"`);
+ }
+
+ console.log(`Done registering cloud: "${environment}"`)
+ }
+
+ await executeAzCliCommand(`cloud set -n "${environment}"`, false);
+ console.log(`Done setting cloud: "${environment}"`);
+
+ // Attempting Az cli login
+ if (allowNoSubscriptionsLogin) {
+ let args = [
+ "--allow-no-subscriptions",
+ "--service-principal",
+ "-u", servicePrincipalId,
+ "-p", servicePrincipalKey,
+ "--tenant", tenantId
+ ];
+ await executeAzCliCommand(`login`, true, {}, args);
+ }
+ else {
+ let args = [
+ "--service-principal",
+ "-u", servicePrincipalId,
+ "-p", servicePrincipalKey,
+ "--tenant", tenantId
+ ];
+ await executeAzCliCommand(`login`, true, {}, args);
+ args = [
+ "--subscription",
+ subscriptionId
+ ];
+ await executeAzCliCommand(`account set`, true, {}, args);
+ }
+
+ isAzCLISuccess = true;
+ if (enableAzPSSession) {
+ // Attempting Az PS login
+ console.log(`Running Azure PS Login`);
+ const spnlogin: ServicePrincipalLogin = new ServicePrincipalLogin(
+ servicePrincipalId,
+ servicePrincipalKey,
+ tenantId,
+ subscriptionId,
+ allowNoSubscriptionsLogin,
+ environment,
+ resourceManagerEndpointUrl);
+ await spnlogin.initialize();
+ await spnlogin.login();
+ }
+
+ console.log("Login successful.");
+ }
+ catch (error) {
+ if (!isAzCLISuccess) {
+ core.error("Az CLI Login failed. Please check the credentials. For more information refer https://aka.ms/create-secrets-for-GitHub-workflows");
+ }
+ else {
+ core.error(`Azure PowerShell Login failed. Please check the credentials. For more information refer https://aka.ms/create-secrets-for-GitHub-workflows"`);
+ }
+ core.setFailed(error);
+ }
+ finally {
+ // Reset AZURE_HTTP_USER_AGENT
+ core.exportVariable('AZURE_HTTP_USER_AGENT', prefix);
+ core.exportVariable('AZUREPS_HOST_ENVIRONMENT', azPSHostEnv);
+ }
+}
+
+export async function executeAzCliCommand(
+ command: string,
+ silent?: boolean,
+ execOptions: any = {},
+ args: any = []) {
+
+ execOptions.silent = !!silent;
+ try {
+ await exec.exec(`"${azPath}" ${command}`, args, execOptions);
+ }
+ catch (error) {
+ throw new Error(error);
+ }
+}
+
+main();
\ No newline at end of file