'use strict'; 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); 
 | 
var toString = require('../internals/to-string'); 
 | 
var requireObjectCoercible = require('../internals/require-object-coercible'); 
 | 
  
 | 
var charAt = uncurryThis(''.charAt); 
 | 
var charCodeAt = uncurryThis(''.charCodeAt); 
 | 
var stringSlice = uncurryThis(''.slice); 
 | 
  
 | 
var createMethod = function (CONVERT_TO_STRING) { 
 | 
  return function ($this, pos) { 
 | 
    var S = toString(requireObjectCoercible($this)); 
 | 
    var position = toIntegerOrInfinity(pos); 
 | 
    var size = S.length; 
 | 
    var first, second; 
 | 
    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; 
 | 
    first = charCodeAt(S, position); 
 | 
    return first < 0xD800 || first > 0xDBFF || position + 1 === size 
 | 
      || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF 
 | 
        ? CONVERT_TO_STRING 
 | 
          ? charAt(S, position) 
 | 
          : first 
 | 
        : CONVERT_TO_STRING 
 | 
          ? stringSlice(S, position, position + 2) 
 | 
          : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; 
 | 
  }; 
 | 
}; 
 | 
  
 | 
module.exports = { 
 | 
  // `String.prototype.codePointAt` method 
 | 
  // https://tc39.es/ecma262/#sec-string.prototype.codepointat 
 | 
  codeAt: createMethod(false), 
 | 
  // `String.prototype.at` method 
 | 
  // https://github.com/mathiasbynens/String.prototype.at 
 | 
  charAt: createMethod(true) 
 | 
}; 
 |