.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / snapdragon / node_modules / source-map / dist / source-map.js
1 (function webpackUniversalModuleDefinition(root, factory) {
2         if(typeof exports === 'object' && typeof module === 'object')
3                 module.exports = factory();
4         else if(typeof define === 'function' && define.amd)
5                 define([], factory);
6         else if(typeof exports === 'object')
7                 exports["sourceMap"] = factory();
8         else
9                 root["sourceMap"] = factory();
10 })(this, function() {
11 return /******/ (function(modules) { // webpackBootstrap
12 /******/        // The module cache
13 /******/        var installedModules = {};
14
15 /******/        // The require function
16 /******/        function __webpack_require__(moduleId) {
17
18 /******/                // Check if module is in cache
19 /******/                if(installedModules[moduleId])
20 /******/                        return installedModules[moduleId].exports;
21
22 /******/                // Create a new module (and put it into the cache)
23 /******/                var module = installedModules[moduleId] = {
24 /******/                        exports: {},
25 /******/                        id: moduleId,
26 /******/                        loaded: false
27 /******/                };
28
29 /******/                // Execute the module function
30 /******/                modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31
32 /******/                // Flag the module as loaded
33 /******/                module.loaded = true;
34
35 /******/                // Return the exports of the module
36 /******/                return module.exports;
37 /******/        }
38
39
40 /******/        // expose the modules object (__webpack_modules__)
41 /******/        __webpack_require__.m = modules;
42
43 /******/        // expose the module cache
44 /******/        __webpack_require__.c = installedModules;
45
46 /******/        // __webpack_public_path__
47 /******/        __webpack_require__.p = "";
48
49 /******/        // Load entry module and return exports
50 /******/        return __webpack_require__(0);
51 /******/ })
52 /************************************************************************/
53 /******/ ([
54 /* 0 */
55 /***/ (function(module, exports, __webpack_require__) {
56
57         /*
58          * Copyright 2009-2011 Mozilla Foundation and contributors
59          * Licensed under the New BSD license. See LICENSE.txt or:
60          * http://opensource.org/licenses/BSD-3-Clause
61          */
62         exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
63         exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
64         exports.SourceNode = __webpack_require__(10).SourceNode;
65
66
67 /***/ }),
68 /* 1 */
69 /***/ (function(module, exports, __webpack_require__) {
70
71         /* -*- Mode: js; js-indent-level: 2; -*- */
72         /*
73          * Copyright 2011 Mozilla Foundation and contributors
74          * Licensed under the New BSD license. See LICENSE or:
75          * http://opensource.org/licenses/BSD-3-Clause
76          */
77
78         var base64VLQ = __webpack_require__(2);
79         var util = __webpack_require__(4);
80         var ArraySet = __webpack_require__(5).ArraySet;
81         var MappingList = __webpack_require__(6).MappingList;
82
83         /**
84          * An instance of the SourceMapGenerator represents a source map which is
85          * being built incrementally. You may pass an object with the following
86          * properties:
87          *
88          *   - file: The filename of the generated source.
89          *   - sourceRoot: A root for all relative URLs in this source map.
90          */
91         function SourceMapGenerator(aArgs) {
92           if (!aArgs) {
93             aArgs = {};
94           }
95           this._file = util.getArg(aArgs, 'file', null);
96           this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
97           this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
98           this._sources = new ArraySet();
99           this._names = new ArraySet();
100           this._mappings = new MappingList();
101           this._sourcesContents = null;
102         }
103
104         SourceMapGenerator.prototype._version = 3;
105
106         /**
107          * Creates a new SourceMapGenerator based on a SourceMapConsumer
108          *
109          * @param aSourceMapConsumer The SourceMap.
110          */
111         SourceMapGenerator.fromSourceMap =
112           function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
113             var sourceRoot = aSourceMapConsumer.sourceRoot;
114             var generator = new SourceMapGenerator({
115               file: aSourceMapConsumer.file,
116               sourceRoot: sourceRoot
117             });
118             aSourceMapConsumer.eachMapping(function (mapping) {
119               var newMapping = {
120                 generated: {
121                   line: mapping.generatedLine,
122                   column: mapping.generatedColumn
123                 }
124               };
125
126               if (mapping.source != null) {
127                 newMapping.source = mapping.source;
128                 if (sourceRoot != null) {
129                   newMapping.source = util.relative(sourceRoot, newMapping.source);
130                 }
131
132                 newMapping.original = {
133                   line: mapping.originalLine,
134                   column: mapping.originalColumn
135                 };
136
137                 if (mapping.name != null) {
138                   newMapping.name = mapping.name;
139                 }
140               }
141
142               generator.addMapping(newMapping);
143             });
144             aSourceMapConsumer.sources.forEach(function (sourceFile) {
145               var content = aSourceMapConsumer.sourceContentFor(sourceFile);
146               if (content != null) {
147                 generator.setSourceContent(sourceFile, content);
148               }
149             });
150             return generator;
151           };
152
153         /**
154          * Add a single mapping from original source line and column to the generated
155          * source's line and column for this source map being created. The mapping
156          * object should have the following properties:
157          *
158          *   - generated: An object with the generated line and column positions.
159          *   - original: An object with the original line and column positions.
160          *   - source: The original source file (relative to the sourceRoot).
161          *   - name: An optional original token name for this mapping.
162          */
163         SourceMapGenerator.prototype.addMapping =
164           function SourceMapGenerator_addMapping(aArgs) {
165             var generated = util.getArg(aArgs, 'generated');
166             var original = util.getArg(aArgs, 'original', null);
167             var source = util.getArg(aArgs, 'source', null);
168             var name = util.getArg(aArgs, 'name', null);
169
170             if (!this._skipValidation) {
171               this._validateMapping(generated, original, source, name);
172             }
173
174             if (source != null) {
175               source = String(source);
176               if (!this._sources.has(source)) {
177                 this._sources.add(source);
178               }
179             }
180
181             if (name != null) {
182               name = String(name);
183               if (!this._names.has(name)) {
184                 this._names.add(name);
185               }
186             }
187
188             this._mappings.add({
189               generatedLine: generated.line,
190               generatedColumn: generated.column,
191               originalLine: original != null && original.line,
192               originalColumn: original != null && original.column,
193               source: source,
194               name: name
195             });
196           };
197
198         /**
199          * Set the source content for a source file.
200          */
201         SourceMapGenerator.prototype.setSourceContent =
202           function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
203             var source = aSourceFile;
204             if (this._sourceRoot != null) {
205               source = util.relative(this._sourceRoot, source);
206             }
207
208             if (aSourceContent != null) {
209               // Add the source content to the _sourcesContents map.
210               // Create a new _sourcesContents map if the property is null.
211               if (!this._sourcesContents) {
212                 this._sourcesContents = Object.create(null);
213               }
214               this._sourcesContents[util.toSetString(source)] = aSourceContent;
215             } else if (this._sourcesContents) {
216               // Remove the source file from the _sourcesContents map.
217               // If the _sourcesContents map is empty, set the property to null.
218               delete this._sourcesContents[util.toSetString(source)];
219               if (Object.keys(this._sourcesContents).length === 0) {
220                 this._sourcesContents = null;
221               }
222             }
223           };
224
225         /**
226          * Applies the mappings of a sub-source-map for a specific source file to the
227          * source map being generated. Each mapping to the supplied source file is
228          * rewritten using the supplied source map. Note: The resolution for the
229          * resulting mappings is the minimium of this map and the supplied map.
230          *
231          * @param aSourceMapConsumer The source map to be applied.
232          * @param aSourceFile Optional. The filename of the source file.
233          *        If omitted, SourceMapConsumer's file property will be used.
234          * @param aSourceMapPath Optional. The dirname of the path to the source map
235          *        to be applied. If relative, it is relative to the SourceMapConsumer.
236          *        This parameter is needed when the two source maps aren't in the same
237          *        directory, and the source map to be applied contains relative source
238          *        paths. If so, those relative source paths need to be rewritten
239          *        relative to the SourceMapGenerator.
240          */
241         SourceMapGenerator.prototype.applySourceMap =
242           function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
243             var sourceFile = aSourceFile;
244             // If aSourceFile is omitted, we will use the file property of the SourceMap
245             if (aSourceFile == null) {
246               if (aSourceMapConsumer.file == null) {
247                 throw new Error(
248                   'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
249                   'or the source map\'s "file" property. Both were omitted.'
250                 );
251               }
252               sourceFile = aSourceMapConsumer.file;
253             }
254             var sourceRoot = this._sourceRoot;
255             // Make "sourceFile" relative if an absolute Url is passed.
256             if (sourceRoot != null) {
257               sourceFile = util.relative(sourceRoot, sourceFile);
258             }
259             // Applying the SourceMap can add and remove items from the sources and
260             // the names array.
261             var newSources = new ArraySet();
262             var newNames = new ArraySet();
263
264             // Find mappings for the "sourceFile"
265             this._mappings.unsortedForEach(function (mapping) {
266               if (mapping.source === sourceFile && mapping.originalLine != null) {
267                 // Check if it can be mapped by the source map, then update the mapping.
268                 var original = aSourceMapConsumer.originalPositionFor({
269                   line: mapping.originalLine,
270                   column: mapping.originalColumn
271                 });
272                 if (original.source != null) {
273                   // Copy mapping
274                   mapping.source = original.source;
275                   if (aSourceMapPath != null) {
276                     mapping.source = util.join(aSourceMapPath, mapping.source)
277                   }
278                   if (sourceRoot != null) {
279                     mapping.source = util.relative(sourceRoot, mapping.source);
280                   }
281                   mapping.originalLine = original.line;
282                   mapping.originalColumn = original.column;
283                   if (original.name != null) {
284                     mapping.name = original.name;
285                   }
286                 }
287               }
288
289               var source = mapping.source;
290               if (source != null && !newSources.has(source)) {
291                 newSources.add(source);
292               }
293
294               var name = mapping.name;
295               if (name != null && !newNames.has(name)) {
296                 newNames.add(name);
297               }
298
299             }, this);
300             this._sources = newSources;
301             this._names = newNames;
302
303             // Copy sourcesContents of applied map.
304             aSourceMapConsumer.sources.forEach(function (sourceFile) {
305               var content = aSourceMapConsumer.sourceContentFor(sourceFile);
306               if (content != null) {
307                 if (aSourceMapPath != null) {
308                   sourceFile = util.join(aSourceMapPath, sourceFile);
309                 }
310                 if (sourceRoot != null) {
311                   sourceFile = util.relative(sourceRoot, sourceFile);
312                 }
313                 this.setSourceContent(sourceFile, content);
314               }
315             }, this);
316           };
317
318         /**
319          * A mapping can have one of the three levels of data:
320          *
321          *   1. Just the generated position.
322          *   2. The Generated position, original position, and original source.
323          *   3. Generated and original position, original source, as well as a name
324          *      token.
325          *
326          * To maintain consistency, we validate that any new mapping being added falls
327          * in to one of these categories.
328          */
329         SourceMapGenerator.prototype._validateMapping =
330           function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
331                                                       aName) {
332             // When aOriginal is truthy but has empty values for .line and .column,
333             // it is most likely a programmer error. In this case we throw a very
334             // specific error message to try to guide them the right way.
335             // For example: https://github.com/Polymer/polymer-bundler/pull/519
336             if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
337                 throw new Error(
338                     'original.line and original.column are not numbers -- you probably meant to omit ' +
339                     'the original mapping entirely and only map the generated position. If so, pass ' +
340                     'null for the original mapping instead of an object with empty or null values.'
341                 );
342             }
343
344             if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
345                 && aGenerated.line > 0 && aGenerated.column >= 0
346                 && !aOriginal && !aSource && !aName) {
347               // Case 1.
348               return;
349             }
350             else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
351                      && aOriginal && 'line' in aOriginal && 'column' in aOriginal
352                      && aGenerated.line > 0 && aGenerated.column >= 0
353                      && aOriginal.line > 0 && aOriginal.column >= 0
354                      && aSource) {
355               // Cases 2 and 3.
356               return;
357             }
358             else {
359               throw new Error('Invalid mapping: ' + JSON.stringify({
360                 generated: aGenerated,
361                 source: aSource,
362                 original: aOriginal,
363                 name: aName
364               }));
365             }
366           };
367
368         /**
369          * Serialize the accumulated mappings in to the stream of base 64 VLQs
370          * specified by the source map format.
371          */
372         SourceMapGenerator.prototype._serializeMappings =
373           function SourceMapGenerator_serializeMappings() {
374             var previousGeneratedColumn = 0;
375             var previousGeneratedLine = 1;
376             var previousOriginalColumn = 0;
377             var previousOriginalLine = 0;
378             var previousName = 0;
379             var previousSource = 0;
380             var result = '';
381             var next;
382             var mapping;
383             var nameIdx;
384             var sourceIdx;
385
386             var mappings = this._mappings.toArray();
387             for (var i = 0, len = mappings.length; i < len; i++) {
388               mapping = mappings[i];
389               next = ''
390
391               if (mapping.generatedLine !== previousGeneratedLine) {
392                 previousGeneratedColumn = 0;
393                 while (mapping.generatedLine !== previousGeneratedLine) {
394                   next += ';';
395                   previousGeneratedLine++;
396                 }
397               }
398               else {
399                 if (i > 0) {
400                   if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
401                     continue;
402                   }
403                   next += ',';
404                 }
405               }
406
407               next += base64VLQ.encode(mapping.generatedColumn
408                                          - previousGeneratedColumn);
409               previousGeneratedColumn = mapping.generatedColumn;
410
411               if (mapping.source != null) {
412                 sourceIdx = this._sources.indexOf(mapping.source);
413                 next += base64VLQ.encode(sourceIdx - previousSource);
414                 previousSource = sourceIdx;
415
416                 // lines are stored 0-based in SourceMap spec version 3
417                 next += base64VLQ.encode(mapping.originalLine - 1
418                                            - previousOriginalLine);
419                 previousOriginalLine = mapping.originalLine - 1;
420
421                 next += base64VLQ.encode(mapping.originalColumn
422                                            - previousOriginalColumn);
423                 previousOriginalColumn = mapping.originalColumn;
424
425                 if (mapping.name != null) {
426                   nameIdx = this._names.indexOf(mapping.name);
427                   next += base64VLQ.encode(nameIdx - previousName);
428                   previousName = nameIdx;
429                 }
430               }
431
432               result += next;
433             }
434
435             return result;
436           };
437
438         SourceMapGenerator.prototype._generateSourcesContent =
439           function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
440             return aSources.map(function (source) {
441               if (!this._sourcesContents) {
442                 return null;
443               }
444               if (aSourceRoot != null) {
445                 source = util.relative(aSourceRoot, source);
446               }
447               var key = util.toSetString(source);
448               return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
449                 ? this._sourcesContents[key]
450                 : null;
451             }, this);
452           };
453
454         /**
455          * Externalize the source map.
456          */
457         SourceMapGenerator.prototype.toJSON =
458           function SourceMapGenerator_toJSON() {
459             var map = {
460               version: this._version,
461               sources: this._sources.toArray(),
462               names: this._names.toArray(),
463               mappings: this._serializeMappings()
464             };
465             if (this._file != null) {
466               map.file = this._file;
467             }
468             if (this._sourceRoot != null) {
469               map.sourceRoot = this._sourceRoot;
470             }
471             if (this._sourcesContents) {
472               map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
473             }
474
475             return map;
476           };
477
478         /**
479          * Render the source map being generated to a string.
480          */
481         SourceMapGenerator.prototype.toString =
482           function SourceMapGenerator_toString() {
483             return JSON.stringify(this.toJSON());
484           };
485
486         exports.SourceMapGenerator = SourceMapGenerator;
487
488
489 /***/ }),
490 /* 2 */
491 /***/ (function(module, exports, __webpack_require__) {
492
493         /* -*- Mode: js; js-indent-level: 2; -*- */
494         /*
495          * Copyright 2011 Mozilla Foundation and contributors
496          * Licensed under the New BSD license. See LICENSE or:
497          * http://opensource.org/licenses/BSD-3-Clause
498          *
499          * Based on the Base 64 VLQ implementation in Closure Compiler:
500          * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
501          *
502          * Copyright 2011 The Closure Compiler Authors. All rights reserved.
503          * Redistribution and use in source and binary forms, with or without
504          * modification, are permitted provided that the following conditions are
505          * met:
506          *
507          *  * Redistributions of source code must retain the above copyright
508          *    notice, this list of conditions and the following disclaimer.
509          *  * Redistributions in binary form must reproduce the above
510          *    copyright notice, this list of conditions and the following
511          *    disclaimer in the documentation and/or other materials provided
512          *    with the distribution.
513          *  * Neither the name of Google Inc. nor the names of its
514          *    contributors may be used to endorse or promote products derived
515          *    from this software without specific prior written permission.
516          *
517          * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
518          * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
519          * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
520          * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
521          * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
522          * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
523          * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
524          * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
525          * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
526          * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
527          * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
528          */
529
530         var base64 = __webpack_require__(3);
531
532         // A single base 64 digit can contain 6 bits of data. For the base 64 variable
533         // length quantities we use in the source map spec, the first bit is the sign,
534         // the next four bits are the actual value, and the 6th bit is the
535         // continuation bit. The continuation bit tells us whether there are more
536         // digits in this value following this digit.
537         //
538         //   Continuation
539         //   |    Sign
540         //   |    |
541         //   V    V
542         //   101011
543
544         var VLQ_BASE_SHIFT = 5;
545
546         // binary: 100000
547         var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
548
549         // binary: 011111
550         var VLQ_BASE_MASK = VLQ_BASE - 1;
551
552         // binary: 100000
553         var VLQ_CONTINUATION_BIT = VLQ_BASE;
554
555         /**
556          * Converts from a two-complement value to a value where the sign bit is
557          * placed in the least significant bit.  For example, as decimals:
558          *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
559          *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
560          */
561         function toVLQSigned(aValue) {
562           return aValue < 0
563             ? ((-aValue) << 1) + 1
564             : (aValue << 1) + 0;
565         }
566
567         /**
568          * Converts to a two-complement value from a value where the sign bit is
569          * placed in the least significant bit.  For example, as decimals:
570          *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
571          *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
572          */
573         function fromVLQSigned(aValue) {
574           var isNegative = (aValue & 1) === 1;
575           var shifted = aValue >> 1;
576           return isNegative
577             ? -shifted
578             : shifted;
579         }
580
581         /**
582          * Returns the base 64 VLQ encoded value.
583          */
584         exports.encode = function base64VLQ_encode(aValue) {
585           var encoded = "";
586           var digit;
587
588           var vlq = toVLQSigned(aValue);
589
590           do {
591             digit = vlq & VLQ_BASE_MASK;
592             vlq >>>= VLQ_BASE_SHIFT;
593             if (vlq > 0) {
594               // There are still more digits in this value, so we must make sure the
595               // continuation bit is marked.
596               digit |= VLQ_CONTINUATION_BIT;
597             }
598             encoded += base64.encode(digit);
599           } while (vlq > 0);
600
601           return encoded;
602         };
603
604         /**
605          * Decodes the next base 64 VLQ value from the given string and returns the
606          * value and the rest of the string via the out parameter.
607          */
608         exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
609           var strLen = aStr.length;
610           var result = 0;
611           var shift = 0;
612           var continuation, digit;
613
614           do {
615             if (aIndex >= strLen) {
616               throw new Error("Expected more digits in base 64 VLQ value.");
617             }
618
619             digit = base64.decode(aStr.charCodeAt(aIndex++));
620             if (digit === -1) {
621               throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
622             }
623
624             continuation = !!(digit & VLQ_CONTINUATION_BIT);
625             digit &= VLQ_BASE_MASK;
626             result = result + (digit << shift);
627             shift += VLQ_BASE_SHIFT;
628           } while (continuation);
629
630           aOutParam.value = fromVLQSigned(result);
631           aOutParam.rest = aIndex;
632         };
633
634
635 /***/ }),
636 /* 3 */
637 /***/ (function(module, exports) {
638
639         /* -*- Mode: js; js-indent-level: 2; -*- */
640         /*
641          * Copyright 2011 Mozilla Foundation and contributors
642          * Licensed under the New BSD license. See LICENSE or:
643          * http://opensource.org/licenses/BSD-3-Clause
644          */
645
646         var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
647
648         /**
649          * Encode an integer in the range of 0 to 63 to a single base 64 digit.
650          */
651         exports.encode = function (number) {
652           if (0 <= number && number < intToCharMap.length) {
653             return intToCharMap[number];
654           }
655           throw new TypeError("Must be between 0 and 63: " + number);
656         };
657
658         /**
659          * Decode a single base 64 character code digit to an integer. Returns -1 on
660          * failure.
661          */
662         exports.decode = function (charCode) {
663           var bigA = 65;     // 'A'
664           var bigZ = 90;     // 'Z'
665
666           var littleA = 97;  // 'a'
667           var littleZ = 122; // 'z'
668
669           var zero = 48;     // '0'
670           var nine = 57;     // '9'
671
672           var plus = 43;     // '+'
673           var slash = 47;    // '/'
674
675           var littleOffset = 26;
676           var numberOffset = 52;
677
678           // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
679           if (bigA <= charCode && charCode <= bigZ) {
680             return (charCode - bigA);
681           }
682
683           // 26 - 51: abcdefghijklmnopqrstuvwxyz
684           if (littleA <= charCode && charCode <= littleZ) {
685             return (charCode - littleA + littleOffset);
686           }
687
688           // 52 - 61: 0123456789
689           if (zero <= charCode && charCode <= nine) {
690             return (charCode - zero + numberOffset);
691           }
692
693           // 62: +
694           if (charCode == plus) {
695             return 62;
696           }
697
698           // 63: /
699           if (charCode == slash) {
700             return 63;
701           }
702
703           // Invalid base64 digit.
704           return -1;
705         };
706
707
708 /***/ }),
709 /* 4 */
710 /***/ (function(module, exports) {
711
712         /* -*- Mode: js; js-indent-level: 2; -*- */
713         /*
714          * Copyright 2011 Mozilla Foundation and contributors
715          * Licensed under the New BSD license. See LICENSE or:
716          * http://opensource.org/licenses/BSD-3-Clause
717          */
718
719         /**
720          * This is a helper function for getting values from parameter/options
721          * objects.
722          *
723          * @param args The object we are extracting values from
724          * @param name The name of the property we are getting.
725          * @param defaultValue An optional value to return if the property is missing
726          * from the object. If this is not specified and the property is missing, an
727          * error will be thrown.
728          */
729         function getArg(aArgs, aName, aDefaultValue) {
730           if (aName in aArgs) {
731             return aArgs[aName];
732           } else if (arguments.length === 3) {
733             return aDefaultValue;
734           } else {
735             throw new Error('"' + aName + '" is a required argument.');
736           }
737         }
738         exports.getArg = getArg;
739
740         var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/;
741         var dataUrlRegexp = /^data:.+\,.+$/;
742
743         function urlParse(aUrl) {
744           var match = aUrl.match(urlRegexp);
745           if (!match) {
746             return null;
747           }
748           return {
749             scheme: match[1],
750             auth: match[2],
751             host: match[3],
752             port: match[4],
753             path: match[5]
754           };
755         }
756         exports.urlParse = urlParse;
757
758         function urlGenerate(aParsedUrl) {
759           var url = '';
760           if (aParsedUrl.scheme) {
761             url += aParsedUrl.scheme + ':';
762           }
763           url += '//';
764           if (aParsedUrl.auth) {
765             url += aParsedUrl.auth + '@';
766           }
767           if (aParsedUrl.host) {
768             url += aParsedUrl.host;
769           }
770           if (aParsedUrl.port) {
771             url += ":" + aParsedUrl.port
772           }
773           if (aParsedUrl.path) {
774             url += aParsedUrl.path;
775           }
776           return url;
777         }
778         exports.urlGenerate = urlGenerate;
779
780         /**
781          * Normalizes a path, or the path portion of a URL:
782          *
783          * - Replaces consecutive slashes with one slash.
784          * - Removes unnecessary '.' parts.
785          * - Removes unnecessary '<dir>/..' parts.
786          *
787          * Based on code in the Node.js 'path' core module.
788          *
789          * @param aPath The path or url to normalize.
790          */
791         function normalize(aPath) {
792           var path = aPath;
793           var url = urlParse(aPath);
794           if (url) {
795             if (!url.path) {
796               return aPath;
797             }
798             path = url.path;
799           }
800           var isAbsolute = exports.isAbsolute(path);
801
802           var parts = path.split(/\/+/);
803           for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
804             part = parts[i];
805             if (part === '.') {
806               parts.splice(i, 1);
807             } else if (part === '..') {
808               up++;
809             } else if (up > 0) {
810               if (part === '') {
811                 // The first part is blank if the path is absolute. Trying to go
812                 // above the root is a no-op. Therefore we can remove all '..' parts
813                 // directly after the root.
814                 parts.splice(i + 1, up);
815                 up = 0;
816               } else {
817                 parts.splice(i, 2);
818                 up--;
819               }
820             }
821           }
822           path = parts.join('/');
823
824           if (path === '') {
825             path = isAbsolute ? '/' : '.';
826           }
827
828           if (url) {
829             url.path = path;
830             return urlGenerate(url);
831           }
832           return path;
833         }
834         exports.normalize = normalize;
835
836         /**
837          * Joins two paths/URLs.
838          *
839          * @param aRoot The root path or URL.
840          * @param aPath The path or URL to be joined with the root.
841          *
842          * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
843          *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
844          *   first.
845          * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
846          *   is updated with the result and aRoot is returned. Otherwise the result
847          *   is returned.
848          *   - If aPath is absolute, the result is aPath.
849          *   - Otherwise the two paths are joined with a slash.
850          * - Joining for example 'http://' and 'www.example.com' is also supported.
851          */
852         function join(aRoot, aPath) {
853           if (aRoot === "") {
854             aRoot = ".";
855           }
856           if (aPath === "") {
857             aPath = ".";
858           }
859           var aPathUrl = urlParse(aPath);
860           var aRootUrl = urlParse(aRoot);
861           if (aRootUrl) {
862             aRoot = aRootUrl.path || '/';
863           }
864
865           // `join(foo, '//www.example.org')`
866           if (aPathUrl && !aPathUrl.scheme) {
867             if (aRootUrl) {
868               aPathUrl.scheme = aRootUrl.scheme;
869             }
870             return urlGenerate(aPathUrl);
871           }
872
873           if (aPathUrl || aPath.match(dataUrlRegexp)) {
874             return aPath;
875           }
876
877           // `join('http://', 'www.example.com')`
878           if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
879             aRootUrl.host = aPath;
880             return urlGenerate(aRootUrl);
881           }
882
883           var joined = aPath.charAt(0) === '/'
884             ? aPath
885             : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
886
887           if (aRootUrl) {
888             aRootUrl.path = joined;
889             return urlGenerate(aRootUrl);
890           }
891           return joined;
892         }
893         exports.join = join;
894
895         exports.isAbsolute = function (aPath) {
896           return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);
897         };
898
899         /**
900          * Make a path relative to a URL or another path.
901          *
902          * @param aRoot The root path or URL.
903          * @param aPath The path or URL to be made relative to aRoot.
904          */
905         function relative(aRoot, aPath) {
906           if (aRoot === "") {
907             aRoot = ".";
908           }
909
910           aRoot = aRoot.replace(/\/$/, '');
911
912           // It is possible for the path to be above the root. In this case, simply
913           // checking whether the root is a prefix of the path won't work. Instead, we
914           // need to remove components from the root one by one, until either we find
915           // a prefix that fits, or we run out of components to remove.
916           var level = 0;
917           while (aPath.indexOf(aRoot + '/') !== 0) {
918             var index = aRoot.lastIndexOf("/");
919             if (index < 0) {
920               return aPath;
921             }
922
923             // If the only part of the root that is left is the scheme (i.e. http://,
924             // file:///, etc.), one or more slashes (/), or simply nothing at all, we
925             // have exhausted all components, so the path is not relative to the root.
926             aRoot = aRoot.slice(0, index);
927             if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
928               return aPath;
929             }
930
931             ++level;
932           }
933
934           // Make sure we add a "../" for each component we removed from the root.
935           return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
936         }
937         exports.relative = relative;
938
939         var supportsNullProto = (function () {
940           var obj = Object.create(null);
941           return !('__proto__' in obj);
942         }());
943
944         function identity (s) {
945           return s;
946         }
947
948         /**
949          * Because behavior goes wacky when you set `__proto__` on objects, we
950          * have to prefix all the strings in our set with an arbitrary character.
951          *
952          * See https://github.com/mozilla/source-map/pull/31 and
953          * https://github.com/mozilla/source-map/issues/30
954          *
955          * @param String aStr
956          */
957         function toSetString(aStr) {
958           if (isProtoString(aStr)) {
959             return '$' + aStr;
960           }
961
962           return aStr;
963         }
964         exports.toSetString = supportsNullProto ? identity : toSetString;
965
966         function fromSetString(aStr) {
967           if (isProtoString(aStr)) {
968             return aStr.slice(1);
969           }
970
971           return aStr;
972         }
973         exports.fromSetString = supportsNullProto ? identity : fromSetString;
974
975         function isProtoString(s) {
976           if (!s) {
977             return false;
978           }
979
980           var length = s.length;
981
982           if (length < 9 /* "__proto__".length */) {
983             return false;
984           }
985
986           if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
987               s.charCodeAt(length - 2) !== 95  /* '_' */ ||
988               s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
989               s.charCodeAt(length - 4) !== 116 /* 't' */ ||
990               s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
991               s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
992               s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
993               s.charCodeAt(length - 8) !== 95  /* '_' */ ||
994               s.charCodeAt(length - 9) !== 95  /* '_' */) {
995             return false;
996           }
997
998           for (var i = length - 10; i >= 0; i--) {
999             if (s.charCodeAt(i) !== 36 /* '$' */) {
1000               return false;
1001             }
1002           }
1003
1004           return true;
1005         }
1006
1007         /**
1008          * Comparator between two mappings where the original positions are compared.
1009          *
1010          * Optionally pass in `true` as `onlyCompareGenerated` to consider two
1011          * mappings with the same original source/line/column, but different generated
1012          * line and column the same. Useful when searching for a mapping with a
1013          * stubbed out mapping.
1014          */
1015         function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
1016           var cmp = mappingA.source - mappingB.source;
1017           if (cmp !== 0) {
1018             return cmp;
1019           }
1020
1021           cmp = mappingA.originalLine - mappingB.originalLine;
1022           if (cmp !== 0) {
1023             return cmp;
1024           }
1025
1026           cmp = mappingA.originalColumn - mappingB.originalColumn;
1027           if (cmp !== 0 || onlyCompareOriginal) {
1028             return cmp;
1029           }
1030
1031           cmp = mappingA.generatedColumn - mappingB.generatedColumn;
1032           if (cmp !== 0) {
1033             return cmp;
1034           }
1035
1036           cmp = mappingA.generatedLine - mappingB.generatedLine;
1037           if (cmp !== 0) {
1038             return cmp;
1039           }
1040
1041           return mappingA.name - mappingB.name;
1042         }
1043         exports.compareByOriginalPositions = compareByOriginalPositions;
1044
1045         /**
1046          * Comparator between two mappings with deflated source and name indices where
1047          * the generated positions are compared.
1048          *
1049          * Optionally pass in `true` as `onlyCompareGenerated` to consider two
1050          * mappings with the same generated line and column, but different
1051          * source/name/original line and column the same. Useful when searching for a
1052          * mapping with a stubbed out mapping.
1053          */
1054         function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
1055           var cmp = mappingA.generatedLine - mappingB.generatedLine;
1056           if (cmp !== 0) {
1057             return cmp;
1058           }
1059
1060           cmp = mappingA.generatedColumn - mappingB.generatedColumn;
1061           if (cmp !== 0 || onlyCompareGenerated) {
1062             return cmp;
1063           }
1064
1065           cmp = mappingA.source - mappingB.source;
1066           if (cmp !== 0) {
1067             return cmp;
1068           }
1069
1070           cmp = mappingA.originalLine - mappingB.originalLine;
1071           if (cmp !== 0) {
1072             return cmp;
1073           }
1074
1075           cmp = mappingA.originalColumn - mappingB.originalColumn;
1076           if (cmp !== 0) {
1077             return cmp;
1078           }
1079
1080           return mappingA.name - mappingB.name;
1081         }
1082         exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
1083
1084         function strcmp(aStr1, aStr2) {
1085           if (aStr1 === aStr2) {
1086             return 0;
1087           }
1088
1089           if (aStr1 > aStr2) {
1090             return 1;
1091           }
1092
1093           return -1;
1094         }
1095
1096         /**
1097          * Comparator between two mappings with inflated source and name strings where
1098          * the generated positions are compared.
1099          */
1100         function compareByGeneratedPositionsInflated(mappingA, mappingB) {
1101           var cmp = mappingA.generatedLine - mappingB.generatedLine;
1102           if (cmp !== 0) {
1103             return cmp;
1104           }
1105
1106           cmp = mappingA.generatedColumn - mappingB.generatedColumn;
1107           if (cmp !== 0) {
1108             return cmp;
1109           }
1110
1111           cmp = strcmp(mappingA.source, mappingB.source);
1112           if (cmp !== 0) {
1113             return cmp;
1114           }
1115
1116           cmp = mappingA.originalLine - mappingB.originalLine;
1117           if (cmp !== 0) {
1118             return cmp;
1119           }
1120
1121           cmp = mappingA.originalColumn - mappingB.originalColumn;
1122           if (cmp !== 0) {
1123             return cmp;
1124           }
1125
1126           return strcmp(mappingA.name, mappingB.name);
1127         }
1128         exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
1129
1130
1131 /***/ }),
1132 /* 5 */
1133 /***/ (function(module, exports, __webpack_require__) {
1134
1135         /* -*- Mode: js; js-indent-level: 2; -*- */
1136         /*
1137          * Copyright 2011 Mozilla Foundation and contributors
1138          * Licensed under the New BSD license. See LICENSE or:
1139          * http://opensource.org/licenses/BSD-3-Clause
1140          */
1141
1142         var util = __webpack_require__(4);
1143         var has = Object.prototype.hasOwnProperty;
1144         var hasNativeMap = typeof Map !== "undefined";
1145
1146         /**
1147          * A data structure which is a combination of an array and a set. Adding a new
1148          * member is O(1), testing for membership is O(1), and finding the index of an
1149          * element is O(1). Removing elements from the set is not supported. Only
1150          * strings are supported for membership.
1151          */
1152         function ArraySet() {
1153           this._array = [];
1154           this._set = hasNativeMap ? new Map() : Object.create(null);
1155         }
1156
1157         /**
1158          * Static method for creating ArraySet instances from an existing array.
1159          */
1160         ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
1161           var set = new ArraySet();
1162           for (var i = 0, len = aArray.length; i < len; i++) {
1163             set.add(aArray[i], aAllowDuplicates);
1164           }
1165           return set;
1166         };
1167
1168         /**
1169          * Return how many unique items are in this ArraySet. If duplicates have been
1170          * added, than those do not count towards the size.
1171          *
1172          * @returns Number
1173          */
1174         ArraySet.prototype.size = function ArraySet_size() {
1175           return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
1176         };
1177
1178         /**
1179          * Add the given string to this set.
1180          *
1181          * @param String aStr
1182          */
1183         ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
1184           var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
1185           var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
1186           var idx = this._array.length;
1187           if (!isDuplicate || aAllowDuplicates) {
1188             this._array.push(aStr);
1189           }
1190           if (!isDuplicate) {
1191             if (hasNativeMap) {
1192               this._set.set(aStr, idx);
1193             } else {
1194               this._set[sStr] = idx;
1195             }
1196           }
1197         };
1198
1199         /**
1200          * Is the given string a member of this set?
1201          *
1202          * @param String aStr
1203          */
1204         ArraySet.prototype.has = function ArraySet_has(aStr) {
1205           if (hasNativeMap) {
1206             return this._set.has(aStr);
1207           } else {
1208             var sStr = util.toSetString(aStr);
1209             return has.call(this._set, sStr);
1210           }
1211         };
1212
1213         /**
1214          * What is the index of the given string in the array?
1215          *
1216          * @param String aStr
1217          */
1218         ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
1219           if (hasNativeMap) {
1220             var idx = this._set.get(aStr);
1221             if (idx >= 0) {
1222                 return idx;
1223             }
1224           } else {
1225             var sStr = util.toSetString(aStr);
1226             if (has.call(this._set, sStr)) {
1227               return this._set[sStr];
1228             }
1229           }
1230
1231           throw new Error('"' + aStr + '" is not in the set.');
1232         };
1233
1234         /**
1235          * What is the element at the given index?
1236          *
1237          * @param Number aIdx
1238          */
1239         ArraySet.prototype.at = function ArraySet_at(aIdx) {
1240           if (aIdx >= 0 && aIdx < this._array.length) {
1241             return this._array[aIdx];
1242           }
1243           throw new Error('No element indexed by ' + aIdx);
1244         };
1245
1246         /**
1247          * Returns the array representation of this set (which has the proper indices
1248          * indicated by indexOf). Note that this is a copy of the internal array used
1249          * for storing the members so that no one can mess with internal state.
1250          */
1251         ArraySet.prototype.toArray = function ArraySet_toArray() {
1252           return this._array.slice();
1253         };
1254
1255         exports.ArraySet = ArraySet;
1256
1257
1258 /***/ }),
1259 /* 6 */
1260 /***/ (function(module, exports, __webpack_require__) {
1261
1262         /* -*- Mode: js; js-indent-level: 2; -*- */
1263         /*
1264          * Copyright 2014 Mozilla Foundation and contributors
1265          * Licensed under the New BSD license. See LICENSE or:
1266          * http://opensource.org/licenses/BSD-3-Clause
1267          */
1268
1269         var util = __webpack_require__(4);
1270
1271         /**
1272          * Determine whether mappingB is after mappingA with respect to generated
1273          * position.
1274          */
1275         function generatedPositionAfter(mappingA, mappingB) {
1276           // Optimized for most common case
1277           var lineA = mappingA.generatedLine;
1278           var lineB = mappingB.generatedLine;
1279           var columnA = mappingA.generatedColumn;
1280           var columnB = mappingB.generatedColumn;
1281           return lineB > lineA || lineB == lineA && columnB >= columnA ||
1282                  util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
1283         }
1284
1285         /**
1286          * A data structure to provide a sorted view of accumulated mappings in a
1287          * performance conscious manner. It trades a neglibable overhead in general
1288          * case for a large speedup in case of mappings being added in order.
1289          */
1290         function MappingList() {
1291           this._array = [];
1292           this._sorted = true;
1293           // Serves as infimum
1294           this._last = {generatedLine: -1, generatedColumn: 0};
1295         }
1296
1297         /**
1298          * Iterate through internal items. This method takes the same arguments that
1299          * `Array.prototype.forEach` takes.
1300          *
1301          * NOTE: The order of the mappings is NOT guaranteed.
1302          */
1303         MappingList.prototype.unsortedForEach =
1304           function MappingList_forEach(aCallback, aThisArg) {
1305             this._array.forEach(aCallback, aThisArg);
1306           };
1307
1308         /**
1309          * Add the given source mapping.
1310          *
1311          * @param Object aMapping
1312          */
1313         MappingList.prototype.add = function MappingList_add(aMapping) {
1314           if (generatedPositionAfter(this._last, aMapping)) {
1315             this._last = aMapping;
1316             this._array.push(aMapping);
1317           } else {
1318             this._sorted = false;
1319             this._array.push(aMapping);
1320           }
1321         };
1322
1323         /**
1324          * Returns the flat, sorted array of mappings. The mappings are sorted by
1325          * generated position.
1326          *
1327          * WARNING: This method returns internal data without copying, for
1328          * performance. The return value must NOT be mutated, and should be treated as
1329          * an immutable borrow. If you want to take ownership, you must make your own
1330          * copy.
1331          */
1332         MappingList.prototype.toArray = function MappingList_toArray() {
1333           if (!this._sorted) {
1334             this._array.sort(util.compareByGeneratedPositionsInflated);
1335             this._sorted = true;
1336           }
1337           return this._array;
1338         };
1339
1340         exports.MappingList = MappingList;
1341
1342
1343 /***/ }),
1344 /* 7 */
1345 /***/ (function(module, exports, __webpack_require__) {
1346
1347         /* -*- Mode: js; js-indent-level: 2; -*- */
1348         /*
1349          * Copyright 2011 Mozilla Foundation and contributors
1350          * Licensed under the New BSD license. See LICENSE or:
1351          * http://opensource.org/licenses/BSD-3-Clause
1352          */
1353
1354         var util = __webpack_require__(4);
1355         var binarySearch = __webpack_require__(8);
1356         var ArraySet = __webpack_require__(5).ArraySet;
1357         var base64VLQ = __webpack_require__(2);
1358         var quickSort = __webpack_require__(9).quickSort;
1359
1360         function SourceMapConsumer(aSourceMap) {
1361           var sourceMap = aSourceMap;
1362           if (typeof aSourceMap === 'string') {
1363             sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
1364           }
1365
1366           return sourceMap.sections != null
1367             ? new IndexedSourceMapConsumer(sourceMap)
1368             : new BasicSourceMapConsumer(sourceMap);
1369         }
1370
1371         SourceMapConsumer.fromSourceMap = function(aSourceMap) {
1372           return BasicSourceMapConsumer.fromSourceMap(aSourceMap);
1373         }
1374
1375         /**
1376          * The version of the source mapping spec that we are consuming.
1377          */
1378         SourceMapConsumer.prototype._version = 3;
1379
1380         // `__generatedMappings` and `__originalMappings` are arrays that hold the
1381         // parsed mapping coordinates from the source map's "mappings" attribute. They
1382         // are lazily instantiated, accessed via the `_generatedMappings` and
1383         // `_originalMappings` getters respectively, and we only parse the mappings
1384         // and create these arrays once queried for a source location. We jump through
1385         // these hoops because there can be many thousands of mappings, and parsing
1386         // them is expensive, so we only want to do it if we must.
1387         //
1388         // Each object in the arrays is of the form:
1389         //
1390         //     {
1391         //       generatedLine: The line number in the generated code,
1392         //       generatedColumn: The column number in the generated code,
1393         //       source: The path to the original source file that generated this
1394         //               chunk of code,
1395         //       originalLine: The line number in the original source that
1396         //                     corresponds to this chunk of generated code,
1397         //       originalColumn: The column number in the original source that
1398         //                       corresponds to this chunk of generated code,
1399         //       name: The name of the original symbol which generated this chunk of
1400         //             code.
1401         //     }
1402         //
1403         // All properties except for `generatedLine` and `generatedColumn` can be
1404         // `null`.
1405         //
1406         // `_generatedMappings` is ordered by the generated positions.
1407         //
1408         // `_originalMappings` is ordered by the original positions.
1409
1410         SourceMapConsumer.prototype.__generatedMappings = null;
1411         Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
1412           get: function () {
1413             if (!this.__generatedMappings) {
1414               this._parseMappings(this._mappings, this.sourceRoot);
1415             }
1416
1417             return this.__generatedMappings;
1418           }
1419         });
1420
1421         SourceMapConsumer.prototype.__originalMappings = null;
1422         Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
1423           get: function () {
1424             if (!this.__originalMappings) {
1425               this._parseMappings(this._mappings, this.sourceRoot);
1426             }
1427
1428             return this.__originalMappings;
1429           }
1430         });
1431
1432         SourceMapConsumer.prototype._charIsMappingSeparator =
1433           function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
1434             var c = aStr.charAt(index);
1435             return c === ";" || c === ",";
1436           };
1437
1438         /**
1439          * Parse the mappings in a string in to a data structure which we can easily
1440          * query (the ordered arrays in the `this.__generatedMappings` and
1441          * `this.__originalMappings` properties).
1442          */
1443         SourceMapConsumer.prototype._parseMappings =
1444           function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
1445             throw new Error("Subclasses must implement _parseMappings");
1446           };
1447
1448         SourceMapConsumer.GENERATED_ORDER = 1;
1449         SourceMapConsumer.ORIGINAL_ORDER = 2;
1450
1451         SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
1452         SourceMapConsumer.LEAST_UPPER_BOUND = 2;
1453
1454         /**
1455          * Iterate over each mapping between an original source/line/column and a
1456          * generated line/column in this source map.
1457          *
1458          * @param Function aCallback
1459          *        The function that is called with each mapping.
1460          * @param Object aContext
1461          *        Optional. If specified, this object will be the value of `this` every
1462          *        time that `aCallback` is called.
1463          * @param aOrder
1464          *        Either `SourceMapConsumer.GENERATED_ORDER` or
1465          *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
1466          *        iterate over the mappings sorted by the generated file's line/column
1467          *        order or the original's source/line/column order, respectively. Defaults to
1468          *        `SourceMapConsumer.GENERATED_ORDER`.
1469          */
1470         SourceMapConsumer.prototype.eachMapping =
1471           function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
1472             var context = aContext || null;
1473             var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
1474
1475             var mappings;
1476             switch (order) {
1477             case SourceMapConsumer.GENERATED_ORDER:
1478               mappings = this._generatedMappings;
1479               break;
1480             case SourceMapConsumer.ORIGINAL_ORDER:
1481               mappings = this._originalMappings;
1482               break;
1483             default:
1484               throw new Error("Unknown order of iteration.");
1485             }
1486
1487             var sourceRoot = this.sourceRoot;
1488             mappings.map(function (mapping) {
1489               var source = mapping.source === null ? null : this._sources.at(mapping.source);
1490               if (source != null && sourceRoot != null) {
1491                 source = util.join(sourceRoot, source);
1492               }
1493               return {
1494                 source: source,
1495                 generatedLine: mapping.generatedLine,
1496                 generatedColumn: mapping.generatedColumn,
1497                 originalLine: mapping.originalLine,
1498                 originalColumn: mapping.originalColumn,
1499                 name: mapping.name === null ? null : this._names.at(mapping.name)
1500               };
1501             }, this).forEach(aCallback, context);
1502           };
1503
1504         /**
1505          * Returns all generated line and column information for the original source,
1506          * line, and column provided. If no column is provided, returns all mappings
1507          * corresponding to a either the line we are searching for or the next
1508          * closest line that has any mappings. Otherwise, returns all mappings
1509          * corresponding to the given line and either the column we are searching for
1510          * or the next closest column that has any offsets.
1511          *
1512          * The only argument is an object with the following properties:
1513          *
1514          *   - source: The filename of the original source.
1515          *   - line: The line number in the original source.
1516          *   - column: Optional. the column number in the original source.
1517          *
1518          * and an array of objects is returned, each with the following properties:
1519          *
1520          *   - line: The line number in the generated source, or null.
1521          *   - column: The column number in the generated source, or null.
1522          */
1523         SourceMapConsumer.prototype.allGeneratedPositionsFor =
1524           function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
1525             var line = util.getArg(aArgs, 'line');
1526
1527             // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
1528             // returns the index of the closest mapping less than the needle. By
1529             // setting needle.originalColumn to 0, we thus find the last mapping for
1530             // the given line, provided such a mapping exists.
1531             var needle = {
1532               source: util.getArg(aArgs, 'source'),
1533               originalLine: line,
1534               originalColumn: util.getArg(aArgs, 'column', 0)
1535             };
1536
1537             if (this.sourceRoot != null) {
1538               needle.source = util.relative(this.sourceRoot, needle.source);
1539             }
1540             if (!this._sources.has(needle.source)) {
1541               return [];
1542             }
1543             needle.source = this._sources.indexOf(needle.source);
1544
1545             var mappings = [];
1546
1547             var index = this._findMapping(needle,
1548                                           this._originalMappings,
1549                                           "originalLine",
1550                                           "originalColumn",
1551                                           util.compareByOriginalPositions,
1552                                           binarySearch.LEAST_UPPER_BOUND);
1553             if (index >= 0) {
1554               var mapping = this._originalMappings[index];
1555
1556               if (aArgs.column === undefined) {
1557                 var originalLine = mapping.originalLine;
1558
1559                 // Iterate until either we run out of mappings, or we run into
1560                 // a mapping for a different line than the one we found. Since
1561                 // mappings are sorted, this is guaranteed to find all mappings for
1562                 // the line we found.
1563                 while (mapping && mapping.originalLine === originalLine) {
1564                   mappings.push({
1565                     line: util.getArg(mapping, 'generatedLine', null),
1566                     column: util.getArg(mapping, 'generatedColumn', null),
1567                     lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
1568                   });
1569
1570                   mapping = this._originalMappings[++index];
1571                 }
1572               } else {
1573                 var originalColumn = mapping.originalColumn;
1574
1575                 // Iterate until either we run out of mappings, or we run into
1576                 // a mapping for a different line than the one we were searching for.
1577                 // Since mappings are sorted, this is guaranteed to find all mappings for
1578                 // the line we are searching for.
1579                 while (mapping &&
1580                        mapping.originalLine === line &&
1581                        mapping.originalColumn == originalColumn) {
1582                   mappings.push({
1583                     line: util.getArg(mapping, 'generatedLine', null),
1584                     column: util.getArg(mapping, 'generatedColumn', null),
1585                     lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
1586                   });
1587
1588                   mapping = this._originalMappings[++index];
1589                 }
1590               }
1591             }
1592
1593             return mappings;
1594           };
1595
1596         exports.SourceMapConsumer = SourceMapConsumer;
1597
1598         /**
1599          * A BasicSourceMapConsumer instance represents a parsed source map which we can
1600          * query for information about the original file positions by giving it a file
1601          * position in the generated source.
1602          *
1603          * The only parameter is the raw source map (either as a JSON string, or
1604          * already parsed to an object). According to the spec, source maps have the
1605          * following attributes:
1606          *
1607          *   - version: Which version of the source map spec this map is following.
1608          *   - sources: An array of URLs to the original source files.
1609          *   - names: An array of identifiers which can be referrenced by individual mappings.
1610          *   - sourceRoot: Optional. The URL root from which all sources are relative.
1611          *   - sourcesContent: Optional. An array of contents of the original source files.
1612          *   - mappings: A string of base64 VLQs which contain the actual mappings.
1613          *   - file: Optional. The generated file this source map is associated with.
1614          *
1615          * Here is an example source map, taken from the source map spec[0]:
1616          *
1617          *     {
1618          *       version : 3,
1619          *       file: "out.js",
1620          *       sourceRoot : "",
1621          *       sources: ["foo.js", "bar.js"],
1622          *       names: ["src", "maps", "are", "fun"],
1623          *       mappings: "AA,AB;;ABCDE;"
1624          *     }
1625          *
1626          * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
1627          */
1628         function BasicSourceMapConsumer(aSourceMap) {
1629           var sourceMap = aSourceMap;
1630           if (typeof aSourceMap === 'string') {
1631             sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
1632           }
1633
1634           var version = util.getArg(sourceMap, 'version');
1635           var sources = util.getArg(sourceMap, 'sources');
1636           // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
1637           // requires the array) to play nice here.
1638           var names = util.getArg(sourceMap, 'names', []);
1639           var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
1640           var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
1641           var mappings = util.getArg(sourceMap, 'mappings');
1642           var file = util.getArg(sourceMap, 'file', null);
1643
1644           // Once again, Sass deviates from the spec and supplies the version as a
1645           // string rather than a number, so we use loose equality checking here.
1646           if (version != this._version) {
1647             throw new Error('Unsupported version: ' + version);
1648           }
1649
1650           sources = sources
1651             .map(String)
1652             // Some source maps produce relative source paths like "./foo.js" instead of
1653             // "foo.js".  Normalize these first so that future comparisons will succeed.
1654             // See bugzil.la/1090768.
1655             .map(util.normalize)
1656             // Always ensure that absolute sources are internally stored relative to
1657             // the source root, if the source root is absolute. Not doing this would
1658             // be particularly problematic when the source root is a prefix of the
1659             // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
1660             .map(function (source) {
1661               return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
1662                 ? util.relative(sourceRoot, source)
1663                 : source;
1664             });
1665
1666           // Pass `true` below to allow duplicate names and sources. While source maps
1667           // are intended to be compressed and deduplicated, the TypeScript compiler
1668           // sometimes generates source maps with duplicates in them. See Github issue
1669           // #72 and bugzil.la/889492.
1670           this._names = ArraySet.fromArray(names.map(String), true);
1671           this._sources = ArraySet.fromArray(sources, true);
1672
1673           this.sourceRoot = sourceRoot;
1674           this.sourcesContent = sourcesContent;
1675           this._mappings = mappings;
1676           this.file = file;
1677         }
1678
1679         BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
1680         BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
1681
1682         /**
1683          * Create a BasicSourceMapConsumer from a SourceMapGenerator.
1684          *
1685          * @param SourceMapGenerator aSourceMap
1686          *        The source map that will be consumed.
1687          * @returns BasicSourceMapConsumer
1688          */
1689         BasicSourceMapConsumer.fromSourceMap =
1690           function SourceMapConsumer_fromSourceMap(aSourceMap) {
1691             var smc = Object.create(BasicSourceMapConsumer.prototype);
1692
1693             var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
1694             var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
1695             smc.sourceRoot = aSourceMap._sourceRoot;
1696             smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
1697                                                                     smc.sourceRoot);
1698             smc.file = aSourceMap._file;
1699
1700             // Because we are modifying the entries (by converting string sources and
1701             // names to indices into the sources and names ArraySets), we have to make
1702             // a copy of the entry or else bad things happen. Shared mutable state
1703             // strikes again! See github issue #191.
1704
1705             var generatedMappings = aSourceMap._mappings.toArray().slice();
1706             var destGeneratedMappings = smc.__generatedMappings = [];
1707             var destOriginalMappings = smc.__originalMappings = [];
1708
1709             for (var i = 0, length = generatedMappings.length; i < length; i++) {
1710               var srcMapping = generatedMappings[i];
1711               var destMapping = new Mapping;
1712               destMapping.generatedLine = srcMapping.generatedLine;
1713               destMapping.generatedColumn = srcMapping.generatedColumn;
1714
1715               if (srcMapping.source) {
1716                 destMapping.source = sources.indexOf(srcMapping.source);
1717                 destMapping.originalLine = srcMapping.originalLine;
1718                 destMapping.originalColumn = srcMapping.originalColumn;
1719
1720                 if (srcMapping.name) {
1721                   destMapping.name = names.indexOf(srcMapping.name);
1722                 }
1723
1724                 destOriginalMappings.push(destMapping);
1725               }
1726
1727               destGeneratedMappings.push(destMapping);
1728             }
1729
1730             quickSort(smc.__originalMappings, util.compareByOriginalPositions);
1731
1732             return smc;
1733           };
1734
1735         /**
1736          * The version of the source mapping spec that we are consuming.
1737          */
1738         BasicSourceMapConsumer.prototype._version = 3;
1739
1740         /**
1741          * The list of original sources.
1742          */
1743         Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
1744           get: function () {
1745             return this._sources.toArray().map(function (s) {
1746               return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;
1747             }, this);
1748           }
1749         });
1750
1751         /**
1752          * Provide the JIT with a nice shape / hidden class.
1753          */
1754         function Mapping() {
1755           this.generatedLine = 0;
1756           this.generatedColumn = 0;
1757           this.source = null;
1758           this.originalLine = null;
1759           this.originalColumn = null;
1760           this.name = null;
1761         }
1762
1763         /**
1764          * Parse the mappings in a string in to a data structure which we can easily
1765          * query (the ordered arrays in the `this.__generatedMappings` and
1766          * `this.__originalMappings` properties).
1767          */
1768         BasicSourceMapConsumer.prototype._parseMappings =
1769           function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
1770             var generatedLine = 1;
1771             var previousGeneratedColumn = 0;
1772             var previousOriginalLine = 0;
1773             var previousOriginalColumn = 0;
1774             var previousSource = 0;
1775             var previousName = 0;
1776             var length = aStr.length;
1777             var index = 0;
1778             var cachedSegments = {};
1779             var temp = {};
1780             var originalMappings = [];
1781             var generatedMappings = [];
1782             var mapping, str, segment, end, value;
1783
1784             while (index < length) {
1785               if (aStr.charAt(index) === ';') {
1786                 generatedLine++;
1787                 index++;
1788                 previousGeneratedColumn = 0;
1789               }
1790               else if (aStr.charAt(index) === ',') {
1791                 index++;
1792               }
1793               else {
1794                 mapping = new Mapping();
1795                 mapping.generatedLine = generatedLine;
1796
1797                 // Because each offset is encoded relative to the previous one,
1798                 // many segments often have the same encoding. We can exploit this
1799                 // fact by caching the parsed variable length fields of each segment,
1800                 // allowing us to avoid a second parse if we encounter the same
1801                 // segment again.
1802                 for (end = index; end < length; end++) {
1803                   if (this._charIsMappingSeparator(aStr, end)) {
1804                     break;
1805                   }
1806                 }
1807                 str = aStr.slice(index, end);
1808
1809                 segment = cachedSegments[str];
1810                 if (segment) {
1811                   index += str.length;
1812                 } else {
1813                   segment = [];
1814                   while (index < end) {
1815                     base64VLQ.decode(aStr, index, temp);
1816                     value = temp.value;
1817                     index = temp.rest;
1818                     segment.push(value);
1819                   }
1820
1821                   if (segment.length === 2) {
1822                     throw new Error('Found a source, but no line and column');
1823                   }
1824
1825                   if (segment.length === 3) {
1826                     throw new Error('Found a source and line, but no column');
1827                   }
1828
1829                   cachedSegments[str] = segment;
1830                 }
1831
1832                 // Generated column.
1833                 mapping.generatedColumn = previousGeneratedColumn + segment[0];
1834                 previousGeneratedColumn = mapping.generatedColumn;
1835
1836                 if (segment.length > 1) {
1837                   // Original source.
1838                   mapping.source = previousSource + segment[1];
1839                   previousSource += segment[1];
1840
1841                   // Original line.
1842                   mapping.originalLine = previousOriginalLine + segment[2];
1843                   previousOriginalLine = mapping.originalLine;
1844                   // Lines are stored 0-based
1845                   mapping.originalLine += 1;
1846
1847                   // Original column.
1848                   mapping.originalColumn = previousOriginalColumn + segment[3];
1849                   previousOriginalColumn = mapping.originalColumn;
1850
1851                   if (segment.length > 4) {
1852                     // Original name.
1853                     mapping.name = previousName + segment[4];
1854                     previousName += segment[4];
1855                   }
1856                 }
1857
1858                 generatedMappings.push(mapping);
1859                 if (typeof mapping.originalLine === 'number') {
1860                   originalMappings.push(mapping);
1861                 }
1862               }
1863             }
1864
1865             quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
1866             this.__generatedMappings = generatedMappings;
1867
1868             quickSort(originalMappings, util.compareByOriginalPositions);
1869             this.__originalMappings = originalMappings;
1870           };
1871
1872         /**
1873          * Find the mapping that best matches the hypothetical "needle" mapping that
1874          * we are searching for in the given "haystack" of mappings.
1875          */
1876         BasicSourceMapConsumer.prototype._findMapping =
1877           function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
1878                                                  aColumnName, aComparator, aBias) {
1879             // To return the position we are searching for, we must first find the
1880             // mapping for the given position and then return the opposite position it
1881             // points to. Because the mappings are sorted, we can use binary search to
1882             // find the best mapping.
1883
1884             if (aNeedle[aLineName] <= 0) {
1885               throw new TypeError('Line must be greater than or equal to 1, got '
1886                                   + aNeedle[aLineName]);
1887             }
1888             if (aNeedle[aColumnName] < 0) {
1889               throw new TypeError('Column must be greater than or equal to 0, got '
1890                                   + aNeedle[aColumnName]);
1891             }
1892
1893             return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
1894           };
1895
1896         /**
1897          * Compute the last column for each generated mapping. The last column is
1898          * inclusive.
1899          */
1900         BasicSourceMapConsumer.prototype.computeColumnSpans =
1901           function SourceMapConsumer_computeColumnSpans() {
1902             for (var index = 0; index < this._generatedMappings.length; ++index) {
1903               var mapping = this._generatedMappings[index];
1904
1905               // Mappings do not contain a field for the last generated columnt. We
1906               // can come up with an optimistic estimate, however, by assuming that
1907               // mappings are contiguous (i.e. given two consecutive mappings, the
1908               // first mapping ends where the second one starts).
1909               if (index + 1 < this._generatedMappings.length) {
1910                 var nextMapping = this._generatedMappings[index + 1];
1911
1912                 if (mapping.generatedLine === nextMapping.generatedLine) {
1913                   mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
1914                   continue;
1915                 }
1916               }
1917
1918               // The last mapping for each line spans the entire line.
1919               mapping.lastGeneratedColumn = Infinity;
1920             }
1921           };
1922
1923         /**
1924          * Returns the original source, line, and column information for the generated
1925          * source's line and column positions provided. The only argument is an object
1926          * with the following properties:
1927          *
1928          *   - line: The line number in the generated source.
1929          *   - column: The column number in the generated source.
1930          *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
1931          *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
1932          *     closest element that is smaller than or greater than the one we are
1933          *     searching for, respectively, if the exact element cannot be found.
1934          *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
1935          *
1936          * and an object is returned with the following properties:
1937          *
1938          *   - source: The original source file, or null.
1939          *   - line: The line number in the original source, or null.
1940          *   - column: The column number in the original source, or null.
1941          *   - name: The original identifier, or null.
1942          */
1943         BasicSourceMapConsumer.prototype.originalPositionFor =
1944           function SourceMapConsumer_originalPositionFor(aArgs) {
1945             var needle = {
1946               generatedLine: util.getArg(aArgs, 'line'),
1947               generatedColumn: util.getArg(aArgs, 'column')
1948             };
1949
1950             var index = this._findMapping(
1951               needle,
1952               this._generatedMappings,
1953               "generatedLine",
1954               "generatedColumn",
1955               util.compareByGeneratedPositionsDeflated,
1956               util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
1957             );
1958
1959             if (index >= 0) {
1960               var mapping = this._generatedMappings[index];
1961
1962               if (mapping.generatedLine === needle.generatedLine) {
1963                 var source = util.getArg(mapping, 'source', null);
1964                 if (source !== null) {
1965                   source = this._sources.at(source);
1966                   if (this.sourceRoot != null) {
1967                     source = util.join(this.sourceRoot, source);
1968                   }
1969                 }
1970                 var name = util.getArg(mapping, 'name', null);
1971                 if (name !== null) {
1972                   name = this._names.at(name);
1973                 }
1974                 return {
1975                   source: source,
1976                   line: util.getArg(mapping, 'originalLine', null),
1977                   column: util.getArg(mapping, 'originalColumn', null),
1978                   name: name
1979                 };
1980               }
1981             }
1982
1983             return {
1984               source: null,
1985               line: null,
1986               column: null,
1987               name: null
1988             };
1989           };
1990
1991         /**
1992          * Return true if we have the source content for every source in the source
1993          * map, false otherwise.
1994          */
1995         BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
1996           function BasicSourceMapConsumer_hasContentsOfAllSources() {
1997             if (!this.sourcesContent) {
1998               return false;
1999             }
2000             return this.sourcesContent.length >= this._sources.size() &&
2001               !this.sourcesContent.some(function (sc) { return sc == null; });
2002           };
2003
2004         /**
2005          * Returns the original source content. The only argument is the url of the
2006          * original source file. Returns null if no original source content is
2007          * available.
2008          */
2009         BasicSourceMapConsumer.prototype.sourceContentFor =
2010           function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
2011             if (!this.sourcesContent) {
2012               return null;
2013             }
2014
2015             if (this.sourceRoot != null) {
2016               aSource = util.relative(this.sourceRoot, aSource);
2017             }
2018
2019             if (this._sources.has(aSource)) {
2020               return this.sourcesContent[this._sources.indexOf(aSource)];
2021             }
2022
2023             var url;
2024             if (this.sourceRoot != null
2025                 && (url = util.urlParse(this.sourceRoot))) {
2026               // XXX: file:// URIs and absolute paths lead to unexpected behavior for
2027               // many users. We can help them out when they expect file:// URIs to
2028               // behave like it would if they were running a local HTTP server. See
2029               // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
2030               var fileUriAbsPath = aSource.replace(/^file:\/\//, "");
2031               if (url.scheme == "file"
2032                   && this._sources.has(fileUriAbsPath)) {
2033                 return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
2034               }
2035
2036               if ((!url.path || url.path == "/")
2037                   && this._sources.has("/" + aSource)) {
2038                 return this.sourcesContent[this._sources.indexOf("/" + aSource)];
2039               }
2040             }
2041
2042             // This function is used recursively from
2043             // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
2044             // don't want to throw if we can't find the source - we just want to
2045             // return null, so we provide a flag to exit gracefully.
2046             if (nullOnMissing) {
2047               return null;
2048             }
2049             else {
2050               throw new Error('"' + aSource + '" is not in the SourceMap.');
2051             }
2052           };
2053
2054         /**
2055          * Returns the generated line and column information for the original source,
2056          * line, and column positions provided. The only argument is an object with
2057          * the following properties:
2058          *
2059          *   - source: The filename of the original source.
2060          *   - line: The line number in the original source.
2061          *   - column: The column number in the original source.
2062          *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
2063          *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
2064          *     closest element that is smaller than or greater than the one we are
2065          *     searching for, respectively, if the exact element cannot be found.
2066          *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
2067          *
2068          * and an object is returned with the following properties:
2069          *
2070          *   - line: The line number in the generated source, or null.
2071          *   - column: The column number in the generated source, or null.
2072          */
2073         BasicSourceMapConsumer.prototype.generatedPositionFor =
2074           function SourceMapConsumer_generatedPositionFor(aArgs) {
2075             var source = util.getArg(aArgs, 'source');
2076             if (this.sourceRoot != null) {
2077               source = util.relative(this.sourceRoot, source);
2078             }
2079             if (!this._sources.has(source)) {
2080               return {
2081                 line: null,
2082                 column: null,
2083                 lastColumn: null
2084               };
2085             }
2086             source = this._sources.indexOf(source);
2087
2088             var needle = {
2089               source: source,
2090               originalLine: util.getArg(aArgs, 'line'),
2091               originalColumn: util.getArg(aArgs, 'column')
2092             };
2093
2094             var index = this._findMapping(
2095               needle,
2096               this._originalMappings,
2097               "originalLine",
2098               "originalColumn",
2099               util.compareByOriginalPositions,
2100               util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
2101             );
2102
2103             if (index >= 0) {
2104               var mapping = this._originalMappings[index];
2105
2106               if (mapping.source === needle.source) {
2107                 return {
2108                   line: util.getArg(mapping, 'generatedLine', null),
2109                   column: util.getArg(mapping, 'generatedColumn', null),
2110                   lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
2111                 };
2112               }
2113             }
2114
2115             return {
2116               line: null,
2117               column: null,
2118               lastColumn: null
2119             };
2120           };
2121
2122         exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
2123
2124         /**
2125          * An IndexedSourceMapConsumer instance represents a parsed source map which
2126          * we can query for information. It differs from BasicSourceMapConsumer in
2127          * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
2128          * input.
2129          *
2130          * The only parameter is a raw source map (either as a JSON string, or already
2131          * parsed to an object). According to the spec for indexed source maps, they
2132          * have the following attributes:
2133          *
2134          *   - version: Which version of the source map spec this map is following.
2135          *   - file: Optional. The generated file this source map is associated with.
2136          *   - sections: A list of section definitions.
2137          *
2138          * Each value under the "sections" field has two fields:
2139          *   - offset: The offset into the original specified at which this section
2140          *       begins to apply, defined as an object with a "line" and "column"
2141          *       field.
2142          *   - map: A source map definition. This source map could also be indexed,
2143          *       but doesn't have to be.
2144          *
2145          * Instead of the "map" field, it's also possible to have a "url" field
2146          * specifying a URL to retrieve a source map from, but that's currently
2147          * unsupported.
2148          *
2149          * Here's an example source map, taken from the source map spec[0], but
2150          * modified to omit a section which uses the "url" field.
2151          *
2152          *  {
2153          *    version : 3,
2154          *    file: "app.js",
2155          *    sections: [{
2156          *      offset: {line:100, column:10},
2157          *      map: {
2158          *        version : 3,
2159          *        file: "section.js",
2160          *        sources: ["foo.js", "bar.js"],
2161          *        names: ["src", "maps", "are", "fun"],
2162          *        mappings: "AAAA,E;;ABCDE;"
2163          *      }
2164          *    }],
2165          *  }
2166          *
2167          * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
2168          */
2169         function IndexedSourceMapConsumer(aSourceMap) {
2170           var sourceMap = aSourceMap;
2171           if (typeof aSourceMap === 'string') {
2172             sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
2173           }
2174
2175           var version = util.getArg(sourceMap, 'version');
2176           var sections = util.getArg(sourceMap, 'sections');
2177
2178           if (version != this._version) {
2179             throw new Error('Unsupported version: ' + version);
2180           }
2181
2182           this._sources = new ArraySet();
2183           this._names = new ArraySet();
2184
2185           var lastOffset = {
2186             line: -1,
2187             column: 0
2188           };
2189           this._sections = sections.map(function (s) {
2190             if (s.url) {
2191               // The url field will require support for asynchronicity.
2192               // See https://github.com/mozilla/source-map/issues/16
2193               throw new Error('Support for url field in sections not implemented.');
2194             }
2195             var offset = util.getArg(s, 'offset');
2196             var offsetLine = util.getArg(offset, 'line');
2197             var offsetColumn = util.getArg(offset, 'column');
2198
2199             if (offsetLine < lastOffset.line ||
2200                 (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
2201               throw new Error('Section offsets must be ordered and non-overlapping.');
2202             }
2203             lastOffset = offset;
2204
2205             return {
2206               generatedOffset: {
2207                 // The offset fields are 0-based, but we use 1-based indices when
2208                 // encoding/decoding from VLQ.
2209                 generatedLine: offsetLine + 1,
2210                 generatedColumn: offsetColumn + 1
2211               },
2212               consumer: new SourceMapConsumer(util.getArg(s, 'map'))
2213             }
2214           });
2215         }
2216
2217         IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
2218         IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
2219
2220         /**
2221          * The version of the source mapping spec that we are consuming.
2222          */
2223         IndexedSourceMapConsumer.prototype._version = 3;
2224
2225         /**
2226          * The list of original sources.
2227          */
2228         Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
2229           get: function () {
2230             var sources = [];
2231             for (var i = 0; i < this._sections.length; i++) {
2232               for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
2233                 sources.push(this._sections[i].consumer.sources[j]);
2234               }
2235             }
2236             return sources;
2237           }
2238         });
2239
2240         /**
2241          * Returns the original source, line, and column information for the generated
2242          * source's line and column positions provided. The only argument is an object
2243          * with the following properties:
2244          *
2245          *   - line: The line number in the generated source.
2246          *   - column: The column number in the generated source.
2247          *
2248          * and an object is returned with the following properties:
2249          *
2250          *   - source: The original source file, or null.
2251          *   - line: The line number in the original source, or null.
2252          *   - column: The column number in the original source, or null.
2253          *   - name: The original identifier, or null.
2254          */
2255         IndexedSourceMapConsumer.prototype.originalPositionFor =
2256           function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
2257             var needle = {
2258               generatedLine: util.getArg(aArgs, 'line'),
2259               generatedColumn: util.getArg(aArgs, 'column')
2260             };
2261
2262             // Find the section containing the generated position we're trying to map
2263             // to an original position.
2264             var sectionIndex = binarySearch.search(needle, this._sections,
2265               function(needle, section) {
2266                 var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
2267                 if (cmp) {
2268                   return cmp;
2269                 }
2270
2271                 return (needle.generatedColumn -
2272                         section.generatedOffset.generatedColumn);
2273               });
2274             var section = this._sections[sectionIndex];
2275
2276             if (!section) {
2277               return {
2278                 source: null,
2279                 line: null,
2280                 column: null,
2281                 name: null
2282               };
2283             }
2284
2285             return section.consumer.originalPositionFor({
2286               line: needle.generatedLine -
2287                 (section.generatedOffset.generatedLine - 1),
2288               column: needle.generatedColumn -
2289                 (section.generatedOffset.generatedLine === needle.generatedLine
2290                  ? section.generatedOffset.generatedColumn - 1
2291                  : 0),
2292               bias: aArgs.bias
2293             });
2294           };
2295
2296         /**
2297          * Return true if we have the source content for every source in the source
2298          * map, false otherwise.
2299          */
2300         IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
2301           function IndexedSourceMapConsumer_hasContentsOfAllSources() {
2302             return this._sections.every(function (s) {
2303               return s.consumer.hasContentsOfAllSources();
2304             });
2305           };
2306
2307         /**
2308          * Returns the original source content. The only argument is the url of the
2309          * original source file. Returns null if no original source content is
2310          * available.
2311          */
2312         IndexedSourceMapConsumer.prototype.sourceContentFor =
2313           function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
2314             for (var i = 0; i < this._sections.length; i++) {
2315               var section = this._sections[i];
2316
2317               var content = section.consumer.sourceContentFor(aSource, true);
2318               if (content) {
2319                 return content;
2320               }
2321             }
2322             if (nullOnMissing) {
2323               return null;
2324             }
2325             else {
2326               throw new Error('"' + aSource + '" is not in the SourceMap.');
2327             }
2328           };
2329
2330         /**
2331          * Returns the generated line and column information for the original source,
2332          * line, and column positions provided. The only argument is an object with
2333          * the following properties:
2334          *
2335          *   - source: The filename of the original source.
2336          *   - line: The line number in the original source.
2337          *   - column: The column number in the original source.
2338          *
2339          * and an object is returned with the following properties:
2340          *
2341          *   - line: The line number in the generated source, or null.
2342          *   - column: The column number in the generated source, or null.
2343          */
2344         IndexedSourceMapConsumer.prototype.generatedPositionFor =
2345           function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
2346             for (var i = 0; i < this._sections.length; i++) {
2347               var section = this._sections[i];
2348
2349               // Only consider this section if the requested source is in the list of
2350               // sources of the consumer.
2351               if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {
2352                 continue;
2353               }
2354               var generatedPosition = section.consumer.generatedPositionFor(aArgs);
2355               if (generatedPosition) {
2356                 var ret = {
2357                   line: generatedPosition.line +
2358                     (section.generatedOffset.generatedLine - 1),
2359                   column: generatedPosition.column +
2360                     (section.generatedOffset.generatedLine === generatedPosition.line
2361                      ? section.generatedOffset.generatedColumn - 1
2362                      : 0)
2363                 };
2364                 return ret;
2365               }
2366             }
2367
2368             return {
2369               line: null,
2370               column: null
2371             };
2372           };
2373
2374         /**
2375          * Parse the mappings in a string in to a data structure which we can easily
2376          * query (the ordered arrays in the `this.__generatedMappings` and
2377          * `this.__originalMappings` properties).
2378          */
2379         IndexedSourceMapConsumer.prototype._parseMappings =
2380           function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
2381             this.__generatedMappings = [];
2382             this.__originalMappings = [];
2383             for (var i = 0; i < this._sections.length; i++) {
2384               var section = this._sections[i];
2385               var sectionMappings = section.consumer._generatedMappings;
2386               for (var j = 0; j < sectionMappings.length; j++) {
2387                 var mapping = sectionMappings[j];
2388
2389                 var source = section.consumer._sources.at(mapping.source);
2390                 if (section.consumer.sourceRoot !== null) {
2391                   source = util.join(section.consumer.sourceRoot, source);
2392                 }
2393                 this._sources.add(source);
2394                 source = this._sources.indexOf(source);
2395
2396                 var name = section.consumer._names.at(mapping.name);
2397                 this._names.add(name);
2398                 name = this._names.indexOf(name);
2399
2400                 // The mappings coming from the consumer for the section have
2401                 // generated positions relative to the start of the section, so we
2402                 // need to offset them to be relative to the start of the concatenated
2403                 // generated file.
2404                 var adjustedMapping = {
2405                   source: source,
2406                   generatedLine: mapping.generatedLine +
2407                     (section.generatedOffset.generatedLine - 1),
2408                   generatedColumn: mapping.generatedColumn +
2409                     (section.generatedOffset.generatedLine === mapping.generatedLine
2410                     ? section.generatedOffset.generatedColumn - 1
2411                     : 0),
2412                   originalLine: mapping.originalLine,
2413                   originalColumn: mapping.originalColumn,
2414                   name: name
2415                 };
2416
2417                 this.__generatedMappings.push(adjustedMapping);
2418                 if (typeof adjustedMapping.originalLine === 'number') {
2419                   this.__originalMappings.push(adjustedMapping);
2420                 }
2421               }
2422             }
2423
2424             quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
2425             quickSort(this.__originalMappings, util.compareByOriginalPositions);
2426           };
2427
2428         exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
2429
2430
2431 /***/ }),
2432 /* 8 */
2433 /***/ (function(module, exports) {
2434
2435         /* -*- Mode: js; js-indent-level: 2; -*- */
2436         /*
2437          * Copyright 2011 Mozilla Foundation and contributors
2438          * Licensed under the New BSD license. See LICENSE or:
2439          * http://opensource.org/licenses/BSD-3-Clause
2440          */
2441
2442         exports.GREATEST_LOWER_BOUND = 1;
2443         exports.LEAST_UPPER_BOUND = 2;
2444
2445         /**
2446          * Recursive implementation of binary search.
2447          *
2448          * @param aLow Indices here and lower do not contain the needle.
2449          * @param aHigh Indices here and higher do not contain the needle.
2450          * @param aNeedle The element being searched for.
2451          * @param aHaystack The non-empty array being searched.
2452          * @param aCompare Function which takes two elements and returns -1, 0, or 1.
2453          * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
2454          *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
2455          *     closest element that is smaller than or greater than the one we are
2456          *     searching for, respectively, if the exact element cannot be found.
2457          */
2458         function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
2459           // This function terminates when one of the following is true:
2460           //
2461           //   1. We find the exact element we are looking for.
2462           //
2463           //   2. We did not find the exact element, but we can return the index of
2464           //      the next-closest element.
2465           //
2466           //   3. We did not find the exact element, and there is no next-closest
2467           //      element than the one we are searching for, so we return -1.
2468           var mid = Math.floor((aHigh - aLow) / 2) + aLow;
2469           var cmp = aCompare(aNeedle, aHaystack[mid], true);
2470           if (cmp === 0) {
2471             // Found the element we are looking for.
2472             return mid;
2473           }
2474           else if (cmp > 0) {
2475             // Our needle is greater than aHaystack[mid].
2476             if (aHigh - mid > 1) {
2477               // The element is in the upper half.
2478               return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
2479             }
2480
2481             // The exact needle element was not found in this haystack. Determine if
2482             // we are in termination case (3) or (2) and return the appropriate thing.
2483             if (aBias == exports.LEAST_UPPER_BOUND) {
2484               return aHigh < aHaystack.length ? aHigh : -1;
2485             } else {
2486               return mid;
2487             }
2488           }
2489           else {
2490             // Our needle is less than aHaystack[mid].
2491             if (mid - aLow > 1) {
2492               // The element is in the lower half.
2493               return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
2494             }
2495
2496             // we are in termination case (3) or (2) and return the appropriate thing.
2497             if (aBias == exports.LEAST_UPPER_BOUND) {
2498               return mid;
2499             } else {
2500               return aLow < 0 ? -1 : aLow;
2501             }
2502           }
2503         }
2504
2505         /**
2506          * This is an implementation of binary search which will always try and return
2507          * the index of the closest element if there is no exact hit. This is because
2508          * mappings between original and generated line/col pairs are single points,
2509          * and there is an implicit region between each of them, so a miss just means
2510          * that you aren't on the very start of a region.
2511          *
2512          * @param aNeedle The element you are looking for.
2513          * @param aHaystack The array that is being searched.
2514          * @param aCompare A function which takes the needle and an element in the
2515          *     array and returns -1, 0, or 1 depending on whether the needle is less
2516          *     than, equal to, or greater than the element, respectively.
2517          * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
2518          *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
2519          *     closest element that is smaller than or greater than the one we are
2520          *     searching for, respectively, if the exact element cannot be found.
2521          *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
2522          */
2523         exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
2524           if (aHaystack.length === 0) {
2525             return -1;
2526           }
2527
2528           var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
2529                                       aCompare, aBias || exports.GREATEST_LOWER_BOUND);
2530           if (index < 0) {
2531             return -1;
2532           }
2533
2534           // We have found either the exact element, or the next-closest element than
2535           // the one we are searching for. However, there may be more than one such
2536           // element. Make sure we always return the smallest of these.
2537           while (index - 1 >= 0) {
2538             if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
2539               break;
2540             }
2541             --index;
2542           }
2543
2544           return index;
2545         };
2546
2547
2548 /***/ }),
2549 /* 9 */
2550 /***/ (function(module, exports) {
2551
2552         /* -*- Mode: js; js-indent-level: 2; -*- */
2553         /*
2554          * Copyright 2011 Mozilla Foundation and contributors
2555          * Licensed under the New BSD license. See LICENSE or:
2556          * http://opensource.org/licenses/BSD-3-Clause
2557          */
2558
2559         // It turns out that some (most?) JavaScript engines don't self-host
2560         // `Array.prototype.sort`. This makes sense because C++ will likely remain
2561         // faster than JS when doing raw CPU-intensive sorting. However, when using a
2562         // custom comparator function, calling back and forth between the VM's C++ and
2563         // JIT'd JS is rather slow *and* loses JIT type information, resulting in
2564         // worse generated code for the comparator function than would be optimal. In
2565         // fact, when sorting with a comparator, these costs outweigh the benefits of
2566         // sorting in C++. By using our own JS-implemented Quick Sort (below), we get
2567         // a ~3500ms mean speed-up in `bench/bench.html`.
2568
2569         /**
2570          * Swap the elements indexed by `x` and `y` in the array `ary`.
2571          *
2572          * @param {Array} ary
2573          *        The array.
2574          * @param {Number} x
2575          *        The index of the first item.
2576          * @param {Number} y
2577          *        The index of the second item.
2578          */
2579         function swap(ary, x, y) {
2580           var temp = ary[x];
2581           ary[x] = ary[y];
2582           ary[y] = temp;
2583         }
2584
2585         /**
2586          * Returns a random integer within the range `low .. high` inclusive.
2587          *
2588          * @param {Number} low
2589          *        The lower bound on the range.
2590          * @param {Number} high
2591          *        The upper bound on the range.
2592          */
2593         function randomIntInRange(low, high) {
2594           return Math.round(low + (Math.random() * (high - low)));
2595         }
2596
2597         /**
2598          * The Quick Sort algorithm.
2599          *
2600          * @param {Array} ary
2601          *        An array to sort.
2602          * @param {function} comparator
2603          *        Function to use to compare two items.
2604          * @param {Number} p
2605          *        Start index of the array
2606          * @param {Number} r
2607          *        End index of the array
2608          */
2609         function doQuickSort(ary, comparator, p, r) {
2610           // If our lower bound is less than our upper bound, we (1) partition the
2611           // array into two pieces and (2) recurse on each half. If it is not, this is
2612           // the empty array and our base case.
2613
2614           if (p < r) {
2615             // (1) Partitioning.
2616             //
2617             // The partitioning chooses a pivot between `p` and `r` and moves all
2618             // elements that are less than or equal to the pivot to the before it, and
2619             // all the elements that are greater than it after it. The effect is that
2620             // once partition is done, the pivot is in the exact place it will be when
2621             // the array is put in sorted order, and it will not need to be moved
2622             // again. This runs in O(n) time.
2623
2624             // Always choose a random pivot so that an input array which is reverse
2625             // sorted does not cause O(n^2) running time.
2626             var pivotIndex = randomIntInRange(p, r);
2627             var i = p - 1;
2628
2629             swap(ary, pivotIndex, r);
2630             var pivot = ary[r];
2631
2632             // Immediately after `j` is incremented in this loop, the following hold
2633             // true:
2634             //
2635             //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
2636             //
2637             //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
2638             for (var j = p; j < r; j++) {
2639               if (comparator(ary[j], pivot) <= 0) {
2640                 i += 1;
2641                 swap(ary, i, j);
2642               }
2643             }
2644
2645             swap(ary, i + 1, j);
2646             var q = i + 1;
2647
2648             // (2) Recurse on each half.
2649
2650             doQuickSort(ary, comparator, p, q - 1);
2651             doQuickSort(ary, comparator, q + 1, r);
2652           }
2653         }
2654
2655         /**
2656          * Sort the given array in-place with the given comparator function.
2657          *
2658          * @param {Array} ary
2659          *        An array to sort.
2660          * @param {function} comparator
2661          *        Function to use to compare two items.
2662          */
2663         exports.quickSort = function (ary, comparator) {
2664           doQuickSort(ary, comparator, 0, ary.length - 1);
2665         };
2666
2667
2668 /***/ }),
2669 /* 10 */
2670 /***/ (function(module, exports, __webpack_require__) {
2671
2672         /* -*- Mode: js; js-indent-level: 2; -*- */
2673         /*
2674          * Copyright 2011 Mozilla Foundation and contributors
2675          * Licensed under the New BSD license. See LICENSE or:
2676          * http://opensource.org/licenses/BSD-3-Clause
2677          */
2678
2679         var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
2680         var util = __webpack_require__(4);
2681
2682         // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
2683         // operating systems these days (capturing the result).
2684         var REGEX_NEWLINE = /(\r?\n)/;
2685
2686         // Newline character code for charCodeAt() comparisons
2687         var NEWLINE_CODE = 10;
2688
2689         // Private symbol for identifying `SourceNode`s when multiple versions of
2690         // the source-map library are loaded. This MUST NOT CHANGE across
2691         // versions!
2692         var isSourceNode = "$$$isSourceNode$$$";
2693
2694         /**
2695          * SourceNodes provide a way to abstract over interpolating/concatenating
2696          * snippets of generated JavaScript source code while maintaining the line and
2697          * column information associated with the original source code.
2698          *
2699          * @param aLine The original line number.
2700          * @param aColumn The original column number.
2701          * @param aSource The original source's filename.
2702          * @param aChunks Optional. An array of strings which are snippets of
2703          *        generated JS, or other SourceNodes.
2704          * @param aName The original identifier.
2705          */
2706         function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
2707           this.children = [];
2708           this.sourceContents = {};
2709           this.line = aLine == null ? null : aLine;
2710           this.column = aColumn == null ? null : aColumn;
2711           this.source = aSource == null ? null : aSource;
2712           this.name = aName == null ? null : aName;
2713           this[isSourceNode] = true;
2714           if (aChunks != null) this.add(aChunks);
2715         }
2716
2717         /**
2718          * Creates a SourceNode from generated code and a SourceMapConsumer.
2719          *
2720          * @param aGeneratedCode The generated code
2721          * @param aSourceMapConsumer The SourceMap for the generated code
2722          * @param aRelativePath Optional. The path that relative sources in the
2723          *        SourceMapConsumer should be relative to.
2724          */
2725         SourceNode.fromStringWithSourceMap =
2726           function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
2727             // The SourceNode we want to fill with the generated code
2728             // and the SourceMap
2729             var node = new SourceNode();
2730
2731             // All even indices of this array are one line of the generated code,
2732             // while all odd indices are the newlines between two adjacent lines
2733             // (since `REGEX_NEWLINE` captures its match).
2734             // Processed fragments are accessed by calling `shiftNextLine`.
2735             var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
2736             var remainingLinesIndex = 0;
2737             var shiftNextLine = function() {
2738               var lineContents = getNextLine();
2739               // The last line of a file might not have a newline.
2740               var newLine = getNextLine() || "";
2741               return lineContents + newLine;
2742
2743               function getNextLine() {
2744                 return remainingLinesIndex < remainingLines.length ?
2745                     remainingLines[remainingLinesIndex++] : undefined;
2746               }
2747             };
2748
2749             // We need to remember the position of "remainingLines"
2750             var lastGeneratedLine = 1, lastGeneratedColumn = 0;
2751
2752             // The generate SourceNodes we need a code range.
2753             // To extract it current and last mapping is used.
2754             // Here we store the last mapping.
2755             var lastMapping = null;
2756
2757             aSourceMapConsumer.eachMapping(function (mapping) {
2758               if (lastMapping !== null) {
2759                 // We add the code from "lastMapping" to "mapping":
2760                 // First check if there is a new line in between.
2761                 if (lastGeneratedLine < mapping.generatedLine) {
2762                   // Associate first line with "lastMapping"
2763                   addMappingWithCode(lastMapping, shiftNextLine());
2764                   lastGeneratedLine++;
2765                   lastGeneratedColumn = 0;
2766                   // The remaining code is added without mapping
2767                 } else {
2768                   // There is no new line in between.
2769                   // Associate the code between "lastGeneratedColumn" and
2770                   // "mapping.generatedColumn" with "lastMapping"
2771                   var nextLine = remainingLines[remainingLinesIndex];
2772                   var code = nextLine.substr(0, mapping.generatedColumn -
2773                                                 lastGeneratedColumn);
2774                   remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
2775                                                       lastGeneratedColumn);
2776                   lastGeneratedColumn = mapping.generatedColumn;
2777                   addMappingWithCode(lastMapping, code);
2778                   // No more remaining code, continue
2779                   lastMapping = mapping;
2780                   return;
2781                 }
2782               }
2783               // We add the generated code until the first mapping
2784               // to the SourceNode without any mapping.
2785               // Each line is added as separate string.
2786               while (lastGeneratedLine < mapping.generatedLine) {
2787                 node.add(shiftNextLine());
2788                 lastGeneratedLine++;
2789               }
2790               if (lastGeneratedColumn < mapping.generatedColumn) {
2791                 var nextLine = remainingLines[remainingLinesIndex];
2792                 node.add(nextLine.substr(0, mapping.generatedColumn));
2793                 remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
2794                 lastGeneratedColumn = mapping.generatedColumn;
2795               }
2796               lastMapping = mapping;
2797             }, this);
2798             // We have processed all mappings.
2799             if (remainingLinesIndex < remainingLines.length) {
2800               if (lastMapping) {
2801                 // Associate the remaining code in the current line with "lastMapping"
2802                 addMappingWithCode(lastMapping, shiftNextLine());
2803               }
2804               // and add the remaining lines without any mapping
2805               node.add(remainingLines.splice(remainingLinesIndex).join(""));
2806             }
2807
2808             // Copy sourcesContent into SourceNode
2809             aSourceMapConsumer.sources.forEach(function (sourceFile) {
2810               var content = aSourceMapConsumer.sourceContentFor(sourceFile);
2811               if (content != null) {
2812                 if (aRelativePath != null) {
2813                   sourceFile = util.join(aRelativePath, sourceFile);
2814                 }
2815                 node.setSourceContent(sourceFile, content);
2816               }
2817             });
2818
2819             return node;
2820
2821             function addMappingWithCode(mapping, code) {
2822               if (mapping === null || mapping.source === undefined) {
2823                 node.add(code);
2824               } else {
2825                 var source = aRelativePath
2826                   ? util.join(aRelativePath, mapping.source)
2827                   : mapping.source;
2828                 node.add(new SourceNode(mapping.originalLine,
2829                                         mapping.originalColumn,
2830                                         source,
2831                                         code,
2832                                         mapping.name));
2833               }
2834             }
2835           };
2836
2837         /**
2838          * Add a chunk of generated JS to this source node.
2839          *
2840          * @param aChunk A string snippet of generated JS code, another instance of
2841          *        SourceNode, or an array where each member is one of those things.
2842          */
2843         SourceNode.prototype.add = function SourceNode_add(aChunk) {
2844           if (Array.isArray(aChunk)) {
2845             aChunk.forEach(function (chunk) {
2846               this.add(chunk);
2847             }, this);
2848           }
2849           else if (aChunk[isSourceNode] || typeof aChunk === "string") {
2850             if (aChunk) {
2851               this.children.push(aChunk);
2852             }
2853           }
2854           else {
2855             throw new TypeError(
2856               "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
2857             );
2858           }
2859           return this;
2860         };
2861
2862         /**
2863          * Add a chunk of generated JS to the beginning of this source node.
2864          *
2865          * @param aChunk A string snippet of generated JS code, another instance of
2866          *        SourceNode, or an array where each member is one of those things.
2867          */
2868         SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
2869           if (Array.isArray(aChunk)) {
2870             for (var i = aChunk.length-1; i >= 0; i--) {
2871               this.prepend(aChunk[i]);
2872             }
2873           }
2874           else if (aChunk[isSourceNode] || typeof aChunk === "string") {
2875             this.children.unshift(aChunk);
2876           }
2877           else {
2878             throw new TypeError(
2879               "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
2880             );
2881           }
2882           return this;
2883         };
2884
2885         /**
2886          * Walk over the tree of JS snippets in this node and its children. The
2887          * walking function is called once for each snippet of JS and is passed that
2888          * snippet and the its original associated source's line/column location.
2889          *
2890          * @param aFn The traversal function.
2891          */
2892         SourceNode.prototype.walk = function SourceNode_walk(aFn) {
2893           var chunk;
2894           for (var i = 0, len = this.children.length; i < len; i++) {
2895             chunk = this.children[i];
2896             if (chunk[isSourceNode]) {
2897               chunk.walk(aFn);
2898             }
2899             else {
2900               if (chunk !== '') {
2901                 aFn(chunk, { source: this.source,
2902                              line: this.line,
2903                              column: this.column,
2904                              name: this.name });
2905               }
2906             }
2907           }
2908         };
2909
2910         /**
2911          * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
2912          * each of `this.children`.
2913          *
2914          * @param aSep The separator.
2915          */
2916         SourceNode.prototype.join = function SourceNode_join(aSep) {
2917           var newChildren;
2918           var i;
2919           var len = this.children.length;
2920           if (len > 0) {
2921             newChildren = [];
2922             for (i = 0; i < len-1; i++) {
2923               newChildren.push(this.children[i]);
2924               newChildren.push(aSep);
2925             }
2926             newChildren.push(this.children[i]);
2927             this.children = newChildren;
2928           }
2929           return this;
2930         };
2931
2932         /**
2933          * Call String.prototype.replace on the very right-most source snippet. Useful
2934          * for trimming whitespace from the end of a source node, etc.
2935          *
2936          * @param aPattern The pattern to replace.
2937          * @param aReplacement The thing to replace the pattern with.
2938          */
2939         SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
2940           var lastChild = this.children[this.children.length - 1];
2941           if (lastChild[isSourceNode]) {
2942             lastChild.replaceRight(aPattern, aReplacement);
2943           }
2944           else if (typeof lastChild === 'string') {
2945             this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
2946           }
2947           else {
2948             this.children.push(''.replace(aPattern, aReplacement));
2949           }
2950           return this;
2951         };
2952
2953         /**
2954          * Set the source content for a source file. This will be added to the SourceMapGenerator
2955          * in the sourcesContent field.
2956          *
2957          * @param aSourceFile The filename of the source file
2958          * @param aSourceContent The content of the source file
2959          */
2960         SourceNode.prototype.setSourceContent =
2961           function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
2962             this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
2963           };
2964
2965         /**
2966          * Walk over the tree of SourceNodes. The walking function is called for each
2967          * source file content and is passed the filename and source content.
2968          *
2969          * @param aFn The traversal function.
2970          */
2971         SourceNode.prototype.walkSourceContents =
2972           function SourceNode_walkSourceContents(aFn) {
2973             for (var i = 0, len = this.children.length; i < len; i++) {
2974               if (this.children[i][isSourceNode]) {
2975                 this.children[i].walkSourceContents(aFn);
2976               }
2977             }
2978
2979             var sources = Object.keys(this.sourceContents);
2980             for (var i = 0, len = sources.length; i < len; i++) {
2981               aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
2982             }
2983           };
2984
2985         /**
2986          * Return the string representation of this source node. Walks over the tree
2987          * and concatenates all the various snippets together to one string.
2988          */
2989         SourceNode.prototype.toString = function SourceNode_toString() {
2990           var str = "";
2991           this.walk(function (chunk) {
2992             str += chunk;
2993           });
2994           return str;
2995         };
2996
2997         /**
2998          * Returns the string representation of this source node along with a source
2999          * map.
3000          */
3001         SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
3002           var generated = {
3003             code: "",
3004             line: 1,
3005             column: 0
3006           };
3007           var map = new SourceMapGenerator(aArgs);
3008           var sourceMappingActive = false;
3009           var lastOriginalSource = null;
3010           var lastOriginalLine = null;
3011           var lastOriginalColumn = null;
3012           var lastOriginalName = null;
3013           this.walk(function (chunk, original) {
3014             generated.code += chunk;
3015             if (original.source !== null
3016                 && original.line !== null
3017                 && original.column !== null) {
3018               if(lastOriginalSource !== original.source
3019                  || lastOriginalLine !== original.line
3020                  || lastOriginalColumn !== original.column
3021                  || lastOriginalName !== original.name) {
3022                 map.addMapping({
3023                   source: original.source,
3024                   original: {
3025                     line: original.line,
3026                     column: original.column
3027                   },
3028                   generated: {
3029                     line: generated.line,
3030                     column: generated.column
3031                   },
3032                   name: original.name
3033                 });
3034               }
3035               lastOriginalSource = original.source;
3036               lastOriginalLine = original.line;
3037               lastOriginalColumn = original.column;
3038               lastOriginalName = original.name;
3039               sourceMappingActive = true;
3040             } else if (sourceMappingActive) {
3041               map.addMapping({
3042                 generated: {
3043                   line: generated.line,
3044                   column: generated.column
3045                 }
3046               });
3047               lastOriginalSource = null;
3048               sourceMappingActive = false;
3049             }
3050             for (var idx = 0, length = chunk.length; idx < length; idx++) {
3051               if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
3052                 generated.line++;
3053                 generated.column = 0;
3054                 // Mappings end at eol
3055                 if (idx + 1 === length) {
3056                   lastOriginalSource = null;
3057                   sourceMappingActive = false;
3058                 } else if (sourceMappingActive) {
3059                   map.addMapping({
3060                     source: original.source,
3061                     original: {
3062                       line: original.line,
3063                       column: original.column
3064                     },
3065                     generated: {
3066                       line: generated.line,
3067                       column: generated.column
3068                     },
3069                     name: original.name
3070                   });
3071                 }
3072               } else {
3073                 generated.column++;
3074               }
3075             }
3076           });
3077           this.walkSourceContents(function (sourceFile, sourceContent) {
3078             map.setSourceContent(sourceFile, sourceContent);
3079           });
3080
3081           return { code: generated.code, map: map };
3082         };
3083
3084         exports.SourceNode = SourceNode;
3085
3086
3087 /***/ })
3088 /******/ ])
3089 });
3090 ;