'use strict'; 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var definePropertyModule = require('../internals/object-define-property'); 
 | 
var makeBuiltIn = require('../internals/make-built-in'); 
 | 
var defineGlobalProperty = require('../internals/define-global-property'); 
 | 
  
 | 
module.exports = function (O, key, value, options) { 
 | 
  if (!options) options = {}; 
 | 
  var simple = options.enumerable; 
 | 
  var name = options.name !== undefined ? options.name : key; 
 | 
  if (isCallable(value)) makeBuiltIn(value, name, options); 
 | 
  if (options.global) { 
 | 
    if (simple) O[key] = value; 
 | 
    else defineGlobalProperty(key, value); 
 | 
  } else { 
 | 
    try { 
 | 
      if (!options.unsafe) delete O[key]; 
 | 
      else if (O[key]) simple = true; 
 | 
    } catch (error) { /* empty */ } 
 | 
    if (simple) O[key] = value; 
 | 
    else definePropertyModule.f(O, key, { 
 | 
      value: value, 
 | 
      enumerable: false, 
 | 
      configurable: !options.nonConfigurable, 
 | 
      writable: !options.nonWritable 
 | 
    }); 
 | 
  } return O; 
 | 
}; 
 |