'use strict'; 
 | 
// adapted from https://github.com/jridgewell/string-dedent 
 | 
var getBuiltIn = require('../internals/get-built-in'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
  
 | 
var fromCharCode = String.fromCharCode; 
 | 
var fromCodePoint = getBuiltIn('String', 'fromCodePoint'); 
 | 
var charAt = uncurryThis(''.charAt); 
 | 
var charCodeAt = uncurryThis(''.charCodeAt); 
 | 
var stringIndexOf = uncurryThis(''.indexOf); 
 | 
var stringSlice = uncurryThis(''.slice); 
 | 
  
 | 
var ZERO_CODE = 48; 
 | 
var NINE_CODE = 57; 
 | 
var LOWER_A_CODE = 97; 
 | 
var LOWER_F_CODE = 102; 
 | 
var UPPER_A_CODE = 65; 
 | 
var UPPER_F_CODE = 70; 
 | 
  
 | 
var isDigit = function (str, index) { 
 | 
  var c = charCodeAt(str, index); 
 | 
  return c >= ZERO_CODE && c <= NINE_CODE; 
 | 
}; 
 | 
  
 | 
var parseHex = function (str, index, end) { 
 | 
  if (end >= str.length) return -1; 
 | 
  var n = 0; 
 | 
  for (; index < end; index++) { 
 | 
    var c = hexToInt(charCodeAt(str, index)); 
 | 
    if (c === -1) return -1; 
 | 
    n = n * 16 + c; 
 | 
  } 
 | 
  return n; 
 | 
}; 
 | 
  
 | 
var hexToInt = function (c) { 
 | 
  if (c >= ZERO_CODE && c <= NINE_CODE) return c - ZERO_CODE; 
 | 
  if (c >= LOWER_A_CODE && c <= LOWER_F_CODE) return c - LOWER_A_CODE + 10; 
 | 
  if (c >= UPPER_A_CODE && c <= UPPER_F_CODE) return c - UPPER_A_CODE + 10; 
 | 
  return -1; 
 | 
}; 
 | 
  
 | 
module.exports = function (raw) { 
 | 
  var out = ''; 
 | 
  var start = 0; 
 | 
  // We need to find every backslash escape sequence, and cook the escape into a real char. 
 | 
  var i = 0; 
 | 
  var n; 
 | 
  while ((i = stringIndexOf(raw, '\\', i)) > -1) { 
 | 
    out += stringSlice(raw, start, i); 
 | 
    // If the backslash is the last char of the string, then it was an invalid sequence. 
 | 
    // This can't actually happen in a tagged template literal, but could happen if you manually 
 | 
    // invoked the tag with an array. 
 | 
    if (++i === raw.length) return; 
 | 
    var next = charAt(raw, i++); 
 | 
    switch (next) { 
 | 
      // Escaped control codes need to be individually processed. 
 | 
      case 'b': 
 | 
        out += '\b'; 
 | 
        break; 
 | 
      case 't': 
 | 
        out += '\t'; 
 | 
        break; 
 | 
      case 'n': 
 | 
        out += '\n'; 
 | 
        break; 
 | 
      case 'v': 
 | 
        out += '\v'; 
 | 
        break; 
 | 
      case 'f': 
 | 
        out += '\f'; 
 | 
        break; 
 | 
      case 'r': 
 | 
        out += '\r'; 
 | 
        break; 
 | 
      // Escaped line terminators just skip the char. 
 | 
      case '\r': 
 | 
        // Treat `\r\n` as a single terminator. 
 | 
        if (i < raw.length && charAt(raw, i) === '\n') ++i; 
 | 
      // break omitted 
 | 
      case '\n': 
 | 
      case '\u2028': 
 | 
      case '\u2029': 
 | 
        break; 
 | 
      // `\0` is a null control char, but `\0` followed by another digit is an illegal octal escape. 
 | 
      case '0': 
 | 
        if (isDigit(raw, i)) return; 
 | 
        out += '\0'; 
 | 
        break; 
 | 
      // Hex escapes must contain 2 hex chars. 
 | 
      case 'x': 
 | 
        n = parseHex(raw, i, i + 2); 
 | 
        if (n === -1) return; 
 | 
        i += 2; 
 | 
        out += fromCharCode(n); 
 | 
        break; 
 | 
      // Unicode escapes contain either 4 chars, or an unlimited number between `{` and `}`. 
 | 
      // The hex value must not overflow 0x10FFFF. 
 | 
      case 'u': 
 | 
        if (i < raw.length && charAt(raw, i) === '{') { 
 | 
          var end = stringIndexOf(raw, '}', ++i); 
 | 
          if (end === -1) return; 
 | 
          n = parseHex(raw, i, end); 
 | 
          i = end + 1; 
 | 
        } else { 
 | 
          n = parseHex(raw, i, i + 4); 
 | 
          i += 4; 
 | 
        } 
 | 
        if (n === -1 || n > 0x10FFFF) return; 
 | 
        out += fromCodePoint(n); 
 | 
        break; 
 | 
      default: 
 | 
        if (isDigit(next, 0)) return; 
 | 
        out += next; 
 | 
    } 
 | 
    start = i; 
 | 
  } 
 | 
  return out + stringSlice(raw, start); 
 | 
}; 
 |