cscg24-guacamole

CSCG 2024 Challenge 'Guacamole Mashup'
git clone https://git.sinitax.com/sinitax/cscg24-guacamole
Log | Files | Refs | sfeed.txt

react-dom-server-legacy.node.development.js (245608B)


      1/**
      2 * @license React
      3 * react-dom-server-legacy.node.development.js
      4 *
      5 * Copyright (c) Facebook, Inc. and its affiliates.
      6 *
      7 * This source code is licensed under the MIT license found in the
      8 * LICENSE file in the root directory of this source tree.
      9 */
     10
     11'use strict';
     12
     13if (process.env.NODE_ENV !== "production") {
     14  (function() {
     15'use strict';
     16
     17var React = require('react');
     18var stream = require('stream');
     19
     20var ReactVersion = '18.2.0';
     21
     22var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
     23
     24// by calls to these methods by a Babel plugin.
     25//
     26// In PROD (or in packages without access to React internals),
     27// they are left as they are instead.
     28
     29function warn(format) {
     30  {
     31    {
     32      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
     33        args[_key - 1] = arguments[_key];
     34      }
     35
     36      printWarning('warn', format, args);
     37    }
     38  }
     39}
     40function error(format) {
     41  {
     42    {
     43      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
     44        args[_key2 - 1] = arguments[_key2];
     45      }
     46
     47      printWarning('error', format, args);
     48    }
     49  }
     50}
     51
     52function printWarning(level, format, args) {
     53  // When changing this logic, you might want to also
     54  // update consoleWithStackDev.www.js as well.
     55  {
     56    var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
     57    var stack = ReactDebugCurrentFrame.getStackAddendum();
     58
     59    if (stack !== '') {
     60      format += '%s';
     61      args = args.concat([stack]);
     62    } // eslint-disable-next-line react-internal/safe-string-coercion
     63
     64
     65    var argsWithFormat = args.map(function (item) {
     66      return String(item);
     67    }); // Careful: RN currently depends on this prefix
     68
     69    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
     70    // breaks IE9: https://github.com/facebook/react/issues/13610
     71    // eslint-disable-next-line react-internal/no-production-logging
     72
     73    Function.prototype.apply.call(console[level], console, argsWithFormat);
     74  }
     75}
     76
     77function scheduleWork(callback) {
     78  callback();
     79}
     80function beginWriting(destination) {}
     81function writeChunk(destination, chunk) {
     82  writeChunkAndReturn(destination, chunk);
     83}
     84function writeChunkAndReturn(destination, chunk) {
     85  return destination.push(chunk);
     86}
     87function completeWriting(destination) {}
     88function close(destination) {
     89  destination.push(null);
     90}
     91function stringToChunk(content) {
     92  return content;
     93}
     94function stringToPrecomputedChunk(content) {
     95  return content;
     96}
     97function closeWithError(destination, error) {
     98  // $FlowFixMe: This is an Error object or the destination accepts other types.
     99  destination.destroy(error);
    100}
    101
    102/*
    103 * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol
    104 * and Temporal.* types. See https://github.com/facebook/react/pull/22064.
    105 *
    106 * The functions in this module will throw an easier-to-understand,
    107 * easier-to-debug exception with a clear errors message message explaining the
    108 * problem. (Instead of a confusing exception thrown inside the implementation
    109 * of the `value` object).
    110 */
    111// $FlowFixMe only called in DEV, so void return is not possible.
    112function typeName(value) {
    113  {
    114    // toStringTag is needed for namespaced types like Temporal.Instant
    115    var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;
    116    var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';
    117    return type;
    118  }
    119} // $FlowFixMe only called in DEV, so void return is not possible.
    120
    121
    122function willCoercionThrow(value) {
    123  {
    124    try {
    125      testStringCoercion(value);
    126      return false;
    127    } catch (e) {
    128      return true;
    129    }
    130  }
    131}
    132
    133function testStringCoercion(value) {
    134  // If you ended up here by following an exception call stack, here's what's
    135  // happened: you supplied an object or symbol value to React (as a prop, key,
    136  // DOM attribute, CSS property, string ref, etc.) and when React tried to
    137  // coerce it to a string using `'' + value`, an exception was thrown.
    138  //
    139  // The most common types that will cause this exception are `Symbol` instances
    140  // and Temporal objects like `Temporal.Instant`. But any object that has a
    141  // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this
    142  // exception. (Library authors do this to prevent users from using built-in
    143  // numeric operators like `+` or comparison operators like `>=` because custom
    144  // methods are needed to perform accurate arithmetic or comparison.)
    145  //
    146  // To fix the problem, coerce this object or symbol value to a string before
    147  // passing it to React. The most reliable way is usually `String(value)`.
    148  //
    149  // To find which value is throwing, check the browser or debugger console.
    150  // Before this exception was thrown, there should be `console.error` output
    151  // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the
    152  // problem and how that type was used: key, atrribute, input value prop, etc.
    153  // In most cases, this console output also shows the component and its
    154  // ancestor components where the exception happened.
    155  //
    156  // eslint-disable-next-line react-internal/safe-string-coercion
    157  return '' + value;
    158}
    159
    160function checkAttributeStringCoercion(value, attributeName) {
    161  {
    162    if (willCoercionThrow(value)) {
    163      error('The provided `%s` attribute is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', attributeName, typeName(value));
    164
    165      return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    166    }
    167  }
    168}
    169function checkCSSPropertyStringCoercion(value, propName) {
    170  {
    171    if (willCoercionThrow(value)) {
    172      error('The provided `%s` CSS property is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
    173
    174      return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    175    }
    176  }
    177}
    178function checkHtmlStringCoercion(value) {
    179  {
    180    if (willCoercionThrow(value)) {
    181      error('The provided HTML markup uses a value of unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
    182
    183      return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    184    }
    185  }
    186}
    187
    188var hasOwnProperty = Object.prototype.hasOwnProperty;
    189
    190// A reserved attribute.
    191// It is handled by React separately and shouldn't be written to the DOM.
    192var RESERVED = 0; // A simple string attribute.
    193// Attributes that aren't in the filter are presumed to have this type.
    194
    195var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
    196// "enumerated" attributes with "true" and "false" as possible values.
    197// When true, it should be set to a "true" string.
    198// When false, it should be set to a "false" string.
    199
    200var BOOLEANISH_STRING = 2; // A real boolean attribute.
    201// When true, it should be present (set either to an empty string or its name).
    202// When false, it should be omitted.
    203
    204var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
    205// When true, it should be present (set either to an empty string or its name).
    206// When false, it should be omitted.
    207// For any other value, should be present with that value.
    208
    209var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
    210// When falsy, it should be removed.
    211
    212var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
    213// When falsy, it should be removed.
    214
    215var POSITIVE_NUMERIC = 6;
    216
    217/* eslint-disable max-len */
    218var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
    219/* eslint-enable max-len */
    220
    221var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
    222var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
    223var illegalAttributeNameCache = {};
    224var validatedAttributeNameCache = {};
    225function isAttributeNameSafe(attributeName) {
    226  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
    227    return true;
    228  }
    229
    230  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
    231    return false;
    232  }
    233
    234  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
    235    validatedAttributeNameCache[attributeName] = true;
    236    return true;
    237  }
    238
    239  illegalAttributeNameCache[attributeName] = true;
    240
    241  {
    242    error('Invalid attribute name: `%s`', attributeName);
    243  }
    244
    245  return false;
    246}
    247function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
    248  if (propertyInfo !== null && propertyInfo.type === RESERVED) {
    249    return false;
    250  }
    251
    252  switch (typeof value) {
    253    case 'function': // $FlowIssue symbol is perfectly valid here
    254
    255    case 'symbol':
    256      // eslint-disable-line
    257      return true;
    258
    259    case 'boolean':
    260      {
    261        if (isCustomComponentTag) {
    262          return false;
    263        }
    264
    265        if (propertyInfo !== null) {
    266          return !propertyInfo.acceptsBooleans;
    267        } else {
    268          var prefix = name.toLowerCase().slice(0, 5);
    269          return prefix !== 'data-' && prefix !== 'aria-';
    270        }
    271      }
    272
    273    default:
    274      return false;
    275  }
    276}
    277function getPropertyInfo(name) {
    278  return properties.hasOwnProperty(name) ? properties[name] : null;
    279}
    280
    281function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) {
    282  this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
    283  this.attributeName = attributeName;
    284  this.attributeNamespace = attributeNamespace;
    285  this.mustUseProperty = mustUseProperty;
    286  this.propertyName = name;
    287  this.type = type;
    288  this.sanitizeURL = sanitizeURL;
    289  this.removeEmptyString = removeEmptyString;
    290} // When adding attributes to this list, be sure to also add them to
    291// the `possibleStandardNames` module to ensure casing and incorrect
    292// name warnings.
    293
    294
    295var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
    296
    297var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
    298// elements (not just inputs). Now that ReactDOMInput assigns to the
    299// defaultValue property -- do we need this?
    300'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
    301
    302reservedProps.forEach(function (name) {
    303  properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
    304  name, // attributeName
    305  null, // attributeNamespace
    306  false, // sanitizeURL
    307  false);
    308}); // A few React string attributes have a different name.
    309// This is a mapping from React prop names to the attribute names.
    310
    311[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
    312  var name = _ref[0],
    313      attributeName = _ref[1];
    314  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    315  attributeName, // attributeName
    316  null, // attributeNamespace
    317  false, // sanitizeURL
    318  false);
    319}); // These are "enumerated" HTML attributes that accept "true" and "false".
    320// In React, we let users pass `true` and `false` even though technically
    321// these aren't boolean attributes (they are coerced to strings).
    322
    323['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
    324  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
    325  name.toLowerCase(), // attributeName
    326  null, // attributeNamespace
    327  false, // sanitizeURL
    328  false);
    329}); // These are "enumerated" SVG attributes that accept "true" and "false".
    330// In React, we let users pass `true` and `false` even though technically
    331// these aren't boolean attributes (they are coerced to strings).
    332// Since these are SVG attributes, their attribute names are case-sensitive.
    333
    334['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
    335  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
    336  name, // attributeName
    337  null, // attributeNamespace
    338  false, // sanitizeURL
    339  false);
    340}); // These are HTML boolean attributes.
    341
    342['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
    343// on the client side because the browsers are inconsistent. Instead we call focus().
    344'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
    345'itemScope'].forEach(function (name) {
    346  properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
    347  name.toLowerCase(), // attributeName
    348  null, // attributeNamespace
    349  false, // sanitizeURL
    350  false);
    351}); // These are the few React props that we set as DOM properties
    352// rather than attributes. These are all booleans.
    353
    354['checked', // Note: `option.selected` is not updated if `select.multiple` is
    355// disabled with `removeAttribute`. We have special logic for handling this.
    356'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
    357// you'll need to set attributeName to name.toLowerCase()
    358// instead in the assignment below.
    359].forEach(function (name) {
    360  properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
    361  name, // attributeName
    362  null, // attributeNamespace
    363  false, // sanitizeURL
    364  false);
    365}); // These are HTML attributes that are "overloaded booleans": they behave like
    366// booleans, but can also accept a string value.
    367
    368['capture', 'download' // NOTE: if you add a camelCased prop to this list,
    369// you'll need to set attributeName to name.toLowerCase()
    370// instead in the assignment below.
    371].forEach(function (name) {
    372  properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
    373  name, // attributeName
    374  null, // attributeNamespace
    375  false, // sanitizeURL
    376  false);
    377}); // These are HTML attributes that must be positive numbers.
    378
    379['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
    380// you'll need to set attributeName to name.toLowerCase()
    381// instead in the assignment below.
    382].forEach(function (name) {
    383  properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
    384  name, // attributeName
    385  null, // attributeNamespace
    386  false, // sanitizeURL
    387  false);
    388}); // These are HTML attributes that must be numbers.
    389
    390['rowSpan', 'start'].forEach(function (name) {
    391  properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
    392  name.toLowerCase(), // attributeName
    393  null, // attributeNamespace
    394  false, // sanitizeURL
    395  false);
    396});
    397var CAMELIZE = /[\-\:]([a-z])/g;
    398
    399var capitalize = function (token) {
    400  return token[1].toUpperCase();
    401}; // This is a list of all SVG attributes that need special casing, namespacing,
    402// or boolean value assignment. Regular attributes that just accept strings
    403// and have the same names are omitted, just like in the HTML attribute filter.
    404// Some of these attributes can be hard to find. This list was created by
    405// scraping the MDN documentation.
    406
    407
    408['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,
    409// you'll need to set attributeName to name.toLowerCase()
    410// instead in the assignment below.
    411].forEach(function (attributeName) {
    412  var name = attributeName.replace(CAMELIZE, capitalize);
    413  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    414  attributeName, null, // attributeNamespace
    415  false, // sanitizeURL
    416  false);
    417}); // String SVG attributes with the xlink namespace.
    418
    419['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
    420// you'll need to set attributeName to name.toLowerCase()
    421// instead in the assignment below.
    422].forEach(function (attributeName) {
    423  var name = attributeName.replace(CAMELIZE, capitalize);
    424  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    425  attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL
    426  false);
    427}); // String SVG attributes with the xml namespace.
    428
    429['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
    430// you'll need to set attributeName to name.toLowerCase()
    431// instead in the assignment below.
    432].forEach(function (attributeName) {
    433  var name = attributeName.replace(CAMELIZE, capitalize);
    434  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    435  attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL
    436  false);
    437}); // These attribute exists both in HTML and SVG.
    438// The attribute name is case-sensitive in SVG so we can't just use
    439// the React name like we do for attributes that exist only in HTML.
    440
    441['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
    442  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
    443  attributeName.toLowerCase(), // attributeName
    444  null, // attributeNamespace
    445  false, // sanitizeURL
    446  false);
    447}); // These attributes accept URLs. These must not allow javascript: URLS.
    448// These will also need to accept Trusted Types object in the future.
    449
    450var xlinkHref = 'xlinkHref';
    451properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
    452'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL
    453false);
    454['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
    455  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
    456  attributeName.toLowerCase(), // attributeName
    457  null, // attributeNamespace
    458  true, // sanitizeURL
    459  true);
    460});
    461
    462/**
    463 * CSS properties which accept numbers but are not in units of "px".
    464 */
    465var isUnitlessNumber = {
    466  animationIterationCount: true,
    467  aspectRatio: true,
    468  borderImageOutset: true,
    469  borderImageSlice: true,
    470  borderImageWidth: true,
    471  boxFlex: true,
    472  boxFlexGroup: true,
    473  boxOrdinalGroup: true,
    474  columnCount: true,
    475  columns: true,
    476  flex: true,
    477  flexGrow: true,
    478  flexPositive: true,
    479  flexShrink: true,
    480  flexNegative: true,
    481  flexOrder: true,
    482  gridArea: true,
    483  gridRow: true,
    484  gridRowEnd: true,
    485  gridRowSpan: true,
    486  gridRowStart: true,
    487  gridColumn: true,
    488  gridColumnEnd: true,
    489  gridColumnSpan: true,
    490  gridColumnStart: true,
    491  fontWeight: true,
    492  lineClamp: true,
    493  lineHeight: true,
    494  opacity: true,
    495  order: true,
    496  orphans: true,
    497  tabSize: true,
    498  widows: true,
    499  zIndex: true,
    500  zoom: true,
    501  // SVG-related properties
    502  fillOpacity: true,
    503  floodOpacity: true,
    504  stopOpacity: true,
    505  strokeDasharray: true,
    506  strokeDashoffset: true,
    507  strokeMiterlimit: true,
    508  strokeOpacity: true,
    509  strokeWidth: true
    510};
    511/**
    512 * @param {string} prefix vendor-specific prefix, eg: Webkit
    513 * @param {string} key style name, eg: transitionDuration
    514 * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
    515 * WebkitTransitionDuration
    516 */
    517
    518function prefixKey(prefix, key) {
    519  return prefix + key.charAt(0).toUpperCase() + key.substring(1);
    520}
    521/**
    522 * Support style names that may come passed in prefixed by adding permutations
    523 * of vendor prefixes.
    524 */
    525
    526
    527var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
    528// infinite loop, because it iterates over the newly added props too.
    529
    530Object.keys(isUnitlessNumber).forEach(function (prop) {
    531  prefixes.forEach(function (prefix) {
    532    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
    533  });
    534});
    535
    536var hasReadOnlyValue = {
    537  button: true,
    538  checkbox: true,
    539  image: true,
    540  hidden: true,
    541  radio: true,
    542  reset: true,
    543  submit: true
    544};
    545function checkControlledValueProps(tagName, props) {
    546  {
    547    if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {
    548      error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
    549    }
    550
    551    if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {
    552      error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
    553    }
    554  }
    555}
    556
    557function isCustomComponent(tagName, props) {
    558  if (tagName.indexOf('-') === -1) {
    559    return typeof props.is === 'string';
    560  }
    561
    562  switch (tagName) {
    563    // These are reserved SVG and MathML elements.
    564    // We don't mind this list too much because we expect it to never grow.
    565    // The alternative is to track the namespace in a few places which is convoluted.
    566    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
    567    case 'annotation-xml':
    568    case 'color-profile':
    569    case 'font-face':
    570    case 'font-face-src':
    571    case 'font-face-uri':
    572    case 'font-face-format':
    573    case 'font-face-name':
    574    case 'missing-glyph':
    575      return false;
    576
    577    default:
    578      return true;
    579  }
    580}
    581
    582var ariaProperties = {
    583  'aria-current': 0,
    584  // state
    585  'aria-description': 0,
    586  'aria-details': 0,
    587  'aria-disabled': 0,
    588  // state
    589  'aria-hidden': 0,
    590  // state
    591  'aria-invalid': 0,
    592  // state
    593  'aria-keyshortcuts': 0,
    594  'aria-label': 0,
    595  'aria-roledescription': 0,
    596  // Widget Attributes
    597  'aria-autocomplete': 0,
    598  'aria-checked': 0,
    599  'aria-expanded': 0,
    600  'aria-haspopup': 0,
    601  'aria-level': 0,
    602  'aria-modal': 0,
    603  'aria-multiline': 0,
    604  'aria-multiselectable': 0,
    605  'aria-orientation': 0,
    606  'aria-placeholder': 0,
    607  'aria-pressed': 0,
    608  'aria-readonly': 0,
    609  'aria-required': 0,
    610  'aria-selected': 0,
    611  'aria-sort': 0,
    612  'aria-valuemax': 0,
    613  'aria-valuemin': 0,
    614  'aria-valuenow': 0,
    615  'aria-valuetext': 0,
    616  // Live Region Attributes
    617  'aria-atomic': 0,
    618  'aria-busy': 0,
    619  'aria-live': 0,
    620  'aria-relevant': 0,
    621  // Drag-and-Drop Attributes
    622  'aria-dropeffect': 0,
    623  'aria-grabbed': 0,
    624  // Relationship Attributes
    625  'aria-activedescendant': 0,
    626  'aria-colcount': 0,
    627  'aria-colindex': 0,
    628  'aria-colspan': 0,
    629  'aria-controls': 0,
    630  'aria-describedby': 0,
    631  'aria-errormessage': 0,
    632  'aria-flowto': 0,
    633  'aria-labelledby': 0,
    634  'aria-owns': 0,
    635  'aria-posinset': 0,
    636  'aria-rowcount': 0,
    637  'aria-rowindex': 0,
    638  'aria-rowspan': 0,
    639  'aria-setsize': 0
    640};
    641
    642var warnedProperties = {};
    643var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
    644var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
    645
    646function validateProperty(tagName, name) {
    647  {
    648    if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {
    649      return true;
    650    }
    651
    652    if (rARIACamel.test(name)) {
    653      var ariaName = 'aria-' + name.slice(4).toLowerCase();
    654      var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
    655      // DOM properties, then it is an invalid aria-* attribute.
    656
    657      if (correctName == null) {
    658        error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
    659
    660        warnedProperties[name] = true;
    661        return true;
    662      } // aria-* attributes should be lowercase; suggest the lowercase version.
    663
    664
    665      if (name !== correctName) {
    666        error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
    667
    668        warnedProperties[name] = true;
    669        return true;
    670      }
    671    }
    672
    673    if (rARIA.test(name)) {
    674      var lowerCasedName = name.toLowerCase();
    675      var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
    676      // DOM properties, then it is an invalid aria-* attribute.
    677
    678      if (standardName == null) {
    679        warnedProperties[name] = true;
    680        return false;
    681      } // aria-* attributes should be lowercase; suggest the lowercase version.
    682
    683
    684      if (name !== standardName) {
    685        error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
    686
    687        warnedProperties[name] = true;
    688        return true;
    689      }
    690    }
    691  }
    692
    693  return true;
    694}
    695
    696function warnInvalidARIAProps(type, props) {
    697  {
    698    var invalidProps = [];
    699
    700    for (var key in props) {
    701      var isValid = validateProperty(type, key);
    702
    703      if (!isValid) {
    704        invalidProps.push(key);
    705      }
    706    }
    707
    708    var unknownPropString = invalidProps.map(function (prop) {
    709      return '`' + prop + '`';
    710    }).join(', ');
    711
    712    if (invalidProps.length === 1) {
    713      error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
    714    } else if (invalidProps.length > 1) {
    715      error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
    716    }
    717  }
    718}
    719
    720function validateProperties(type, props) {
    721  if (isCustomComponent(type, props)) {
    722    return;
    723  }
    724
    725  warnInvalidARIAProps(type, props);
    726}
    727
    728var didWarnValueNull = false;
    729function validateProperties$1(type, props) {
    730  {
    731    if (type !== 'input' && type !== 'textarea' && type !== 'select') {
    732      return;
    733    }
    734
    735    if (props != null && props.value === null && !didWarnValueNull) {
    736      didWarnValueNull = true;
    737
    738      if (type === 'select' && props.multiple) {
    739        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);
    740      } else {
    741        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
    742      }
    743    }
    744  }
    745}
    746
    747// When adding attributes to the HTML or SVG allowed attribute list, be sure to
    748// also add them to this module to ensure casing and incorrect name
    749// warnings.
    750var possibleStandardNames = {
    751  // HTML
    752  accept: 'accept',
    753  acceptcharset: 'acceptCharset',
    754  'accept-charset': 'acceptCharset',
    755  accesskey: 'accessKey',
    756  action: 'action',
    757  allowfullscreen: 'allowFullScreen',
    758  alt: 'alt',
    759  as: 'as',
    760  async: 'async',
    761  autocapitalize: 'autoCapitalize',
    762  autocomplete: 'autoComplete',
    763  autocorrect: 'autoCorrect',
    764  autofocus: 'autoFocus',
    765  autoplay: 'autoPlay',
    766  autosave: 'autoSave',
    767  capture: 'capture',
    768  cellpadding: 'cellPadding',
    769  cellspacing: 'cellSpacing',
    770  challenge: 'challenge',
    771  charset: 'charSet',
    772  checked: 'checked',
    773  children: 'children',
    774  cite: 'cite',
    775  class: 'className',
    776  classid: 'classID',
    777  classname: 'className',
    778  cols: 'cols',
    779  colspan: 'colSpan',
    780  content: 'content',
    781  contenteditable: 'contentEditable',
    782  contextmenu: 'contextMenu',
    783  controls: 'controls',
    784  controlslist: 'controlsList',
    785  coords: 'coords',
    786  crossorigin: 'crossOrigin',
    787  dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
    788  data: 'data',
    789  datetime: 'dateTime',
    790  default: 'default',
    791  defaultchecked: 'defaultChecked',
    792  defaultvalue: 'defaultValue',
    793  defer: 'defer',
    794  dir: 'dir',
    795  disabled: 'disabled',
    796  disablepictureinpicture: 'disablePictureInPicture',
    797  disableremoteplayback: 'disableRemotePlayback',
    798  download: 'download',
    799  draggable: 'draggable',
    800  enctype: 'encType',
    801  enterkeyhint: 'enterKeyHint',
    802  for: 'htmlFor',
    803  form: 'form',
    804  formmethod: 'formMethod',
    805  formaction: 'formAction',
    806  formenctype: 'formEncType',
    807  formnovalidate: 'formNoValidate',
    808  formtarget: 'formTarget',
    809  frameborder: 'frameBorder',
    810  headers: 'headers',
    811  height: 'height',
    812  hidden: 'hidden',
    813  high: 'high',
    814  href: 'href',
    815  hreflang: 'hrefLang',
    816  htmlfor: 'htmlFor',
    817  httpequiv: 'httpEquiv',
    818  'http-equiv': 'httpEquiv',
    819  icon: 'icon',
    820  id: 'id',
    821  imagesizes: 'imageSizes',
    822  imagesrcset: 'imageSrcSet',
    823  innerhtml: 'innerHTML',
    824  inputmode: 'inputMode',
    825  integrity: 'integrity',
    826  is: 'is',
    827  itemid: 'itemID',
    828  itemprop: 'itemProp',
    829  itemref: 'itemRef',
    830  itemscope: 'itemScope',
    831  itemtype: 'itemType',
    832  keyparams: 'keyParams',
    833  keytype: 'keyType',
    834  kind: 'kind',
    835  label: 'label',
    836  lang: 'lang',
    837  list: 'list',
    838  loop: 'loop',
    839  low: 'low',
    840  manifest: 'manifest',
    841  marginwidth: 'marginWidth',
    842  marginheight: 'marginHeight',
    843  max: 'max',
    844  maxlength: 'maxLength',
    845  media: 'media',
    846  mediagroup: 'mediaGroup',
    847  method: 'method',
    848  min: 'min',
    849  minlength: 'minLength',
    850  multiple: 'multiple',
    851  muted: 'muted',
    852  name: 'name',
    853  nomodule: 'noModule',
    854  nonce: 'nonce',
    855  novalidate: 'noValidate',
    856  open: 'open',
    857  optimum: 'optimum',
    858  pattern: 'pattern',
    859  placeholder: 'placeholder',
    860  playsinline: 'playsInline',
    861  poster: 'poster',
    862  preload: 'preload',
    863  profile: 'profile',
    864  radiogroup: 'radioGroup',
    865  readonly: 'readOnly',
    866  referrerpolicy: 'referrerPolicy',
    867  rel: 'rel',
    868  required: 'required',
    869  reversed: 'reversed',
    870  role: 'role',
    871  rows: 'rows',
    872  rowspan: 'rowSpan',
    873  sandbox: 'sandbox',
    874  scope: 'scope',
    875  scoped: 'scoped',
    876  scrolling: 'scrolling',
    877  seamless: 'seamless',
    878  selected: 'selected',
    879  shape: 'shape',
    880  size: 'size',
    881  sizes: 'sizes',
    882  span: 'span',
    883  spellcheck: 'spellCheck',
    884  src: 'src',
    885  srcdoc: 'srcDoc',
    886  srclang: 'srcLang',
    887  srcset: 'srcSet',
    888  start: 'start',
    889  step: 'step',
    890  style: 'style',
    891  summary: 'summary',
    892  tabindex: 'tabIndex',
    893  target: 'target',
    894  title: 'title',
    895  type: 'type',
    896  usemap: 'useMap',
    897  value: 'value',
    898  width: 'width',
    899  wmode: 'wmode',
    900  wrap: 'wrap',
    901  // SVG
    902  about: 'about',
    903  accentheight: 'accentHeight',
    904  'accent-height': 'accentHeight',
    905  accumulate: 'accumulate',
    906  additive: 'additive',
    907  alignmentbaseline: 'alignmentBaseline',
    908  'alignment-baseline': 'alignmentBaseline',
    909  allowreorder: 'allowReorder',
    910  alphabetic: 'alphabetic',
    911  amplitude: 'amplitude',
    912  arabicform: 'arabicForm',
    913  'arabic-form': 'arabicForm',
    914  ascent: 'ascent',
    915  attributename: 'attributeName',
    916  attributetype: 'attributeType',
    917  autoreverse: 'autoReverse',
    918  azimuth: 'azimuth',
    919  basefrequency: 'baseFrequency',
    920  baselineshift: 'baselineShift',
    921  'baseline-shift': 'baselineShift',
    922  baseprofile: 'baseProfile',
    923  bbox: 'bbox',
    924  begin: 'begin',
    925  bias: 'bias',
    926  by: 'by',
    927  calcmode: 'calcMode',
    928  capheight: 'capHeight',
    929  'cap-height': 'capHeight',
    930  clip: 'clip',
    931  clippath: 'clipPath',
    932  'clip-path': 'clipPath',
    933  clippathunits: 'clipPathUnits',
    934  cliprule: 'clipRule',
    935  'clip-rule': 'clipRule',
    936  color: 'color',
    937  colorinterpolation: 'colorInterpolation',
    938  'color-interpolation': 'colorInterpolation',
    939  colorinterpolationfilters: 'colorInterpolationFilters',
    940  'color-interpolation-filters': 'colorInterpolationFilters',
    941  colorprofile: 'colorProfile',
    942  'color-profile': 'colorProfile',
    943  colorrendering: 'colorRendering',
    944  'color-rendering': 'colorRendering',
    945  contentscripttype: 'contentScriptType',
    946  contentstyletype: 'contentStyleType',
    947  cursor: 'cursor',
    948  cx: 'cx',
    949  cy: 'cy',
    950  d: 'd',
    951  datatype: 'datatype',
    952  decelerate: 'decelerate',
    953  descent: 'descent',
    954  diffuseconstant: 'diffuseConstant',
    955  direction: 'direction',
    956  display: 'display',
    957  divisor: 'divisor',
    958  dominantbaseline: 'dominantBaseline',
    959  'dominant-baseline': 'dominantBaseline',
    960  dur: 'dur',
    961  dx: 'dx',
    962  dy: 'dy',
    963  edgemode: 'edgeMode',
    964  elevation: 'elevation',
    965  enablebackground: 'enableBackground',
    966  'enable-background': 'enableBackground',
    967  end: 'end',
    968  exponent: 'exponent',
    969  externalresourcesrequired: 'externalResourcesRequired',
    970  fill: 'fill',
    971  fillopacity: 'fillOpacity',
    972  'fill-opacity': 'fillOpacity',
    973  fillrule: 'fillRule',
    974  'fill-rule': 'fillRule',
    975  filter: 'filter',
    976  filterres: 'filterRes',
    977  filterunits: 'filterUnits',
    978  floodopacity: 'floodOpacity',
    979  'flood-opacity': 'floodOpacity',
    980  floodcolor: 'floodColor',
    981  'flood-color': 'floodColor',
    982  focusable: 'focusable',
    983  fontfamily: 'fontFamily',
    984  'font-family': 'fontFamily',
    985  fontsize: 'fontSize',
    986  'font-size': 'fontSize',
    987  fontsizeadjust: 'fontSizeAdjust',
    988  'font-size-adjust': 'fontSizeAdjust',
    989  fontstretch: 'fontStretch',
    990  'font-stretch': 'fontStretch',
    991  fontstyle: 'fontStyle',
    992  'font-style': 'fontStyle',
    993  fontvariant: 'fontVariant',
    994  'font-variant': 'fontVariant',
    995  fontweight: 'fontWeight',
    996  'font-weight': 'fontWeight',
    997  format: 'format',
    998  from: 'from',
    999  fx: 'fx',
   1000  fy: 'fy',
   1001  g1: 'g1',
   1002  g2: 'g2',
   1003  glyphname: 'glyphName',
   1004  'glyph-name': 'glyphName',
   1005  glyphorientationhorizontal: 'glyphOrientationHorizontal',
   1006  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
   1007  glyphorientationvertical: 'glyphOrientationVertical',
   1008  'glyph-orientation-vertical': 'glyphOrientationVertical',
   1009  glyphref: 'glyphRef',
   1010  gradienttransform: 'gradientTransform',
   1011  gradientunits: 'gradientUnits',
   1012  hanging: 'hanging',
   1013  horizadvx: 'horizAdvX',
   1014  'horiz-adv-x': 'horizAdvX',
   1015  horizoriginx: 'horizOriginX',
   1016  'horiz-origin-x': 'horizOriginX',
   1017  ideographic: 'ideographic',
   1018  imagerendering: 'imageRendering',
   1019  'image-rendering': 'imageRendering',
   1020  in2: 'in2',
   1021  in: 'in',
   1022  inlist: 'inlist',
   1023  intercept: 'intercept',
   1024  k1: 'k1',
   1025  k2: 'k2',
   1026  k3: 'k3',
   1027  k4: 'k4',
   1028  k: 'k',
   1029  kernelmatrix: 'kernelMatrix',
   1030  kernelunitlength: 'kernelUnitLength',
   1031  kerning: 'kerning',
   1032  keypoints: 'keyPoints',
   1033  keysplines: 'keySplines',
   1034  keytimes: 'keyTimes',
   1035  lengthadjust: 'lengthAdjust',
   1036  letterspacing: 'letterSpacing',
   1037  'letter-spacing': 'letterSpacing',
   1038  lightingcolor: 'lightingColor',
   1039  'lighting-color': 'lightingColor',
   1040  limitingconeangle: 'limitingConeAngle',
   1041  local: 'local',
   1042  markerend: 'markerEnd',
   1043  'marker-end': 'markerEnd',
   1044  markerheight: 'markerHeight',
   1045  markermid: 'markerMid',
   1046  'marker-mid': 'markerMid',
   1047  markerstart: 'markerStart',
   1048  'marker-start': 'markerStart',
   1049  markerunits: 'markerUnits',
   1050  markerwidth: 'markerWidth',
   1051  mask: 'mask',
   1052  maskcontentunits: 'maskContentUnits',
   1053  maskunits: 'maskUnits',
   1054  mathematical: 'mathematical',
   1055  mode: 'mode',
   1056  numoctaves: 'numOctaves',
   1057  offset: 'offset',
   1058  opacity: 'opacity',
   1059  operator: 'operator',
   1060  order: 'order',
   1061  orient: 'orient',
   1062  orientation: 'orientation',
   1063  origin: 'origin',
   1064  overflow: 'overflow',
   1065  overlineposition: 'overlinePosition',
   1066  'overline-position': 'overlinePosition',
   1067  overlinethickness: 'overlineThickness',
   1068  'overline-thickness': 'overlineThickness',
   1069  paintorder: 'paintOrder',
   1070  'paint-order': 'paintOrder',
   1071  panose1: 'panose1',
   1072  'panose-1': 'panose1',
   1073  pathlength: 'pathLength',
   1074  patterncontentunits: 'patternContentUnits',
   1075  patterntransform: 'patternTransform',
   1076  patternunits: 'patternUnits',
   1077  pointerevents: 'pointerEvents',
   1078  'pointer-events': 'pointerEvents',
   1079  points: 'points',
   1080  pointsatx: 'pointsAtX',
   1081  pointsaty: 'pointsAtY',
   1082  pointsatz: 'pointsAtZ',
   1083  prefix: 'prefix',
   1084  preservealpha: 'preserveAlpha',
   1085  preserveaspectratio: 'preserveAspectRatio',
   1086  primitiveunits: 'primitiveUnits',
   1087  property: 'property',
   1088  r: 'r',
   1089  radius: 'radius',
   1090  refx: 'refX',
   1091  refy: 'refY',
   1092  renderingintent: 'renderingIntent',
   1093  'rendering-intent': 'renderingIntent',
   1094  repeatcount: 'repeatCount',
   1095  repeatdur: 'repeatDur',
   1096  requiredextensions: 'requiredExtensions',
   1097  requiredfeatures: 'requiredFeatures',
   1098  resource: 'resource',
   1099  restart: 'restart',
   1100  result: 'result',
   1101  results: 'results',
   1102  rotate: 'rotate',
   1103  rx: 'rx',
   1104  ry: 'ry',
   1105  scale: 'scale',
   1106  security: 'security',
   1107  seed: 'seed',
   1108  shaperendering: 'shapeRendering',
   1109  'shape-rendering': 'shapeRendering',
   1110  slope: 'slope',
   1111  spacing: 'spacing',
   1112  specularconstant: 'specularConstant',
   1113  specularexponent: 'specularExponent',
   1114  speed: 'speed',
   1115  spreadmethod: 'spreadMethod',
   1116  startoffset: 'startOffset',
   1117  stddeviation: 'stdDeviation',
   1118  stemh: 'stemh',
   1119  stemv: 'stemv',
   1120  stitchtiles: 'stitchTiles',
   1121  stopcolor: 'stopColor',
   1122  'stop-color': 'stopColor',
   1123  stopopacity: 'stopOpacity',
   1124  'stop-opacity': 'stopOpacity',
   1125  strikethroughposition: 'strikethroughPosition',
   1126  'strikethrough-position': 'strikethroughPosition',
   1127  strikethroughthickness: 'strikethroughThickness',
   1128  'strikethrough-thickness': 'strikethroughThickness',
   1129  string: 'string',
   1130  stroke: 'stroke',
   1131  strokedasharray: 'strokeDasharray',
   1132  'stroke-dasharray': 'strokeDasharray',
   1133  strokedashoffset: 'strokeDashoffset',
   1134  'stroke-dashoffset': 'strokeDashoffset',
   1135  strokelinecap: 'strokeLinecap',
   1136  'stroke-linecap': 'strokeLinecap',
   1137  strokelinejoin: 'strokeLinejoin',
   1138  'stroke-linejoin': 'strokeLinejoin',
   1139  strokemiterlimit: 'strokeMiterlimit',
   1140  'stroke-miterlimit': 'strokeMiterlimit',
   1141  strokewidth: 'strokeWidth',
   1142  'stroke-width': 'strokeWidth',
   1143  strokeopacity: 'strokeOpacity',
   1144  'stroke-opacity': 'strokeOpacity',
   1145  suppresscontenteditablewarning: 'suppressContentEditableWarning',
   1146  suppresshydrationwarning: 'suppressHydrationWarning',
   1147  surfacescale: 'surfaceScale',
   1148  systemlanguage: 'systemLanguage',
   1149  tablevalues: 'tableValues',
   1150  targetx: 'targetX',
   1151  targety: 'targetY',
   1152  textanchor: 'textAnchor',
   1153  'text-anchor': 'textAnchor',
   1154  textdecoration: 'textDecoration',
   1155  'text-decoration': 'textDecoration',
   1156  textlength: 'textLength',
   1157  textrendering: 'textRendering',
   1158  'text-rendering': 'textRendering',
   1159  to: 'to',
   1160  transform: 'transform',
   1161  typeof: 'typeof',
   1162  u1: 'u1',
   1163  u2: 'u2',
   1164  underlineposition: 'underlinePosition',
   1165  'underline-position': 'underlinePosition',
   1166  underlinethickness: 'underlineThickness',
   1167  'underline-thickness': 'underlineThickness',
   1168  unicode: 'unicode',
   1169  unicodebidi: 'unicodeBidi',
   1170  'unicode-bidi': 'unicodeBidi',
   1171  unicoderange: 'unicodeRange',
   1172  'unicode-range': 'unicodeRange',
   1173  unitsperem: 'unitsPerEm',
   1174  'units-per-em': 'unitsPerEm',
   1175  unselectable: 'unselectable',
   1176  valphabetic: 'vAlphabetic',
   1177  'v-alphabetic': 'vAlphabetic',
   1178  values: 'values',
   1179  vectoreffect: 'vectorEffect',
   1180  'vector-effect': 'vectorEffect',
   1181  version: 'version',
   1182  vertadvy: 'vertAdvY',
   1183  'vert-adv-y': 'vertAdvY',
   1184  vertoriginx: 'vertOriginX',
   1185  'vert-origin-x': 'vertOriginX',
   1186  vertoriginy: 'vertOriginY',
   1187  'vert-origin-y': 'vertOriginY',
   1188  vhanging: 'vHanging',
   1189  'v-hanging': 'vHanging',
   1190  videographic: 'vIdeographic',
   1191  'v-ideographic': 'vIdeographic',
   1192  viewbox: 'viewBox',
   1193  viewtarget: 'viewTarget',
   1194  visibility: 'visibility',
   1195  vmathematical: 'vMathematical',
   1196  'v-mathematical': 'vMathematical',
   1197  vocab: 'vocab',
   1198  widths: 'widths',
   1199  wordspacing: 'wordSpacing',
   1200  'word-spacing': 'wordSpacing',
   1201  writingmode: 'writingMode',
   1202  'writing-mode': 'writingMode',
   1203  x1: 'x1',
   1204  x2: 'x2',
   1205  x: 'x',
   1206  xchannelselector: 'xChannelSelector',
   1207  xheight: 'xHeight',
   1208  'x-height': 'xHeight',
   1209  xlinkactuate: 'xlinkActuate',
   1210  'xlink:actuate': 'xlinkActuate',
   1211  xlinkarcrole: 'xlinkArcrole',
   1212  'xlink:arcrole': 'xlinkArcrole',
   1213  xlinkhref: 'xlinkHref',
   1214  'xlink:href': 'xlinkHref',
   1215  xlinkrole: 'xlinkRole',
   1216  'xlink:role': 'xlinkRole',
   1217  xlinkshow: 'xlinkShow',
   1218  'xlink:show': 'xlinkShow',
   1219  xlinktitle: 'xlinkTitle',
   1220  'xlink:title': 'xlinkTitle',
   1221  xlinktype: 'xlinkType',
   1222  'xlink:type': 'xlinkType',
   1223  xmlbase: 'xmlBase',
   1224  'xml:base': 'xmlBase',
   1225  xmllang: 'xmlLang',
   1226  'xml:lang': 'xmlLang',
   1227  xmlns: 'xmlns',
   1228  'xml:space': 'xmlSpace',
   1229  xmlnsxlink: 'xmlnsXlink',
   1230  'xmlns:xlink': 'xmlnsXlink',
   1231  xmlspace: 'xmlSpace',
   1232  y1: 'y1',
   1233  y2: 'y2',
   1234  y: 'y',
   1235  ychannelselector: 'yChannelSelector',
   1236  z: 'z',
   1237  zoomandpan: 'zoomAndPan'
   1238};
   1239
   1240var validateProperty$1 = function () {};
   1241
   1242{
   1243  var warnedProperties$1 = {};
   1244  var EVENT_NAME_REGEX = /^on./;
   1245  var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
   1246  var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
   1247  var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
   1248
   1249  validateProperty$1 = function (tagName, name, value, eventRegistry) {
   1250    if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
   1251      return true;
   1252    }
   1253
   1254    var lowerCasedName = name.toLowerCase();
   1255
   1256    if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
   1257      error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
   1258
   1259      warnedProperties$1[name] = true;
   1260      return true;
   1261    } // We can't rely on the event system being injected on the server.
   1262
   1263
   1264    if (eventRegistry != null) {
   1265      var registrationNameDependencies = eventRegistry.registrationNameDependencies,
   1266          possibleRegistrationNames = eventRegistry.possibleRegistrationNames;
   1267
   1268      if (registrationNameDependencies.hasOwnProperty(name)) {
   1269        return true;
   1270      }
   1271
   1272      var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
   1273
   1274      if (registrationName != null) {
   1275        error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
   1276
   1277        warnedProperties$1[name] = true;
   1278        return true;
   1279      }
   1280
   1281      if (EVENT_NAME_REGEX.test(name)) {
   1282        error('Unknown event handler property `%s`. It will be ignored.', name);
   1283
   1284        warnedProperties$1[name] = true;
   1285        return true;
   1286      }
   1287    } else if (EVENT_NAME_REGEX.test(name)) {
   1288      // If no event plugins have been injected, we are in a server environment.
   1289      // So we can't tell if the event name is correct for sure, but we can filter
   1290      // out known bad ones like `onclick`. We can't suggest a specific replacement though.
   1291      if (INVALID_EVENT_NAME_REGEX.test(name)) {
   1292        error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
   1293      }
   1294
   1295      warnedProperties$1[name] = true;
   1296      return true;
   1297    } // Let the ARIA attribute hook validate ARIA attributes
   1298
   1299
   1300    if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
   1301      return true;
   1302    }
   1303
   1304    if (lowerCasedName === 'innerhtml') {
   1305      error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
   1306
   1307      warnedProperties$1[name] = true;
   1308      return true;
   1309    }
   1310
   1311    if (lowerCasedName === 'aria') {
   1312      error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
   1313
   1314      warnedProperties$1[name] = true;
   1315      return true;
   1316    }
   1317
   1318    if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
   1319      error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
   1320
   1321      warnedProperties$1[name] = true;
   1322      return true;
   1323    }
   1324
   1325    if (typeof value === 'number' && isNaN(value)) {
   1326      error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
   1327
   1328      warnedProperties$1[name] = true;
   1329      return true;
   1330    }
   1331
   1332    var propertyInfo = getPropertyInfo(name);
   1333    var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
   1334
   1335    if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
   1336      var standardName = possibleStandardNames[lowerCasedName];
   1337
   1338      if (standardName !== name) {
   1339        error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
   1340
   1341        warnedProperties$1[name] = true;
   1342        return true;
   1343      }
   1344    } else if (!isReserved && name !== lowerCasedName) {
   1345      // Unknown attributes should have lowercase casing since that's how they
   1346      // will be cased anyway with server rendering.
   1347      error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);
   1348
   1349      warnedProperties$1[name] = true;
   1350      return true;
   1351    }
   1352
   1353    if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
   1354      if (value) {
   1355        error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name);
   1356      } else {
   1357        error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
   1358      }
   1359
   1360      warnedProperties$1[name] = true;
   1361      return true;
   1362    } // Now that we've validated casing, do not validate
   1363    // data types for reserved props
   1364
   1365
   1366    if (isReserved) {
   1367      return true;
   1368    } // Warn when a known attribute is a bad type
   1369
   1370
   1371    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
   1372      warnedProperties$1[name] = true;
   1373      return false;
   1374    } // Warn when passing the strings 'false' or 'true' into a boolean prop
   1375
   1376
   1377    if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
   1378      error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
   1379
   1380      warnedProperties$1[name] = true;
   1381      return true;
   1382    }
   1383
   1384    return true;
   1385  };
   1386}
   1387
   1388var warnUnknownProperties = function (type, props, eventRegistry) {
   1389  {
   1390    var unknownProps = [];
   1391
   1392    for (var key in props) {
   1393      var isValid = validateProperty$1(type, key, props[key], eventRegistry);
   1394
   1395      if (!isValid) {
   1396        unknownProps.push(key);
   1397      }
   1398    }
   1399
   1400    var unknownPropString = unknownProps.map(function (prop) {
   1401      return '`' + prop + '`';
   1402    }).join(', ');
   1403
   1404    if (unknownProps.length === 1) {
   1405      error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type);
   1406    } else if (unknownProps.length > 1) {
   1407      error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type);
   1408    }
   1409  }
   1410};
   1411
   1412function validateProperties$2(type, props, eventRegistry) {
   1413  if (isCustomComponent(type, props)) {
   1414    return;
   1415  }
   1416
   1417  warnUnknownProperties(type, props, eventRegistry);
   1418}
   1419
   1420var warnValidStyle = function () {};
   1421
   1422{
   1423  // 'msTransform' is correct, but the other prefixes should be capitalized
   1424  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
   1425  var msPattern = /^-ms-/;
   1426  var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
   1427
   1428  var badStyleValueWithSemicolonPattern = /;\s*$/;
   1429  var warnedStyleNames = {};
   1430  var warnedStyleValues = {};
   1431  var warnedForNaNValue = false;
   1432  var warnedForInfinityValue = false;
   1433
   1434  var camelize = function (string) {
   1435    return string.replace(hyphenPattern, function (_, character) {
   1436      return character.toUpperCase();
   1437    });
   1438  };
   1439
   1440  var warnHyphenatedStyleName = function (name) {
   1441    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
   1442      return;
   1443    }
   1444
   1445    warnedStyleNames[name] = true;
   1446
   1447    error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
   1448    // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
   1449    // is converted to lowercase `ms`.
   1450    camelize(name.replace(msPattern, 'ms-')));
   1451  };
   1452
   1453  var warnBadVendoredStyleName = function (name) {
   1454    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
   1455      return;
   1456    }
   1457
   1458    warnedStyleNames[name] = true;
   1459
   1460    error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
   1461  };
   1462
   1463  var warnStyleValueWithSemicolon = function (name, value) {
   1464    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
   1465      return;
   1466    }
   1467
   1468    warnedStyleValues[value] = true;
   1469
   1470    error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
   1471  };
   1472
   1473  var warnStyleValueIsNaN = function (name, value) {
   1474    if (warnedForNaNValue) {
   1475      return;
   1476    }
   1477
   1478    warnedForNaNValue = true;
   1479
   1480    error('`NaN` is an invalid value for the `%s` css style property.', name);
   1481  };
   1482
   1483  var warnStyleValueIsInfinity = function (name, value) {
   1484    if (warnedForInfinityValue) {
   1485      return;
   1486    }
   1487
   1488    warnedForInfinityValue = true;
   1489
   1490    error('`Infinity` is an invalid value for the `%s` css style property.', name);
   1491  };
   1492
   1493  warnValidStyle = function (name, value) {
   1494    if (name.indexOf('-') > -1) {
   1495      warnHyphenatedStyleName(name);
   1496    } else if (badVendoredStyleNamePattern.test(name)) {
   1497      warnBadVendoredStyleName(name);
   1498    } else if (badStyleValueWithSemicolonPattern.test(value)) {
   1499      warnStyleValueWithSemicolon(name, value);
   1500    }
   1501
   1502    if (typeof value === 'number') {
   1503      if (isNaN(value)) {
   1504        warnStyleValueIsNaN(name, value);
   1505      } else if (!isFinite(value)) {
   1506        warnStyleValueIsInfinity(name, value);
   1507      }
   1508    }
   1509  };
   1510}
   1511
   1512var warnValidStyle$1 = warnValidStyle;
   1513
   1514// code copied and modified from escape-html
   1515var matchHtmlRegExp = /["'&<>]/;
   1516/**
   1517 * Escapes special characters and HTML entities in a given html string.
   1518 *
   1519 * @param  {string} string HTML string to escape for later insertion
   1520 * @return {string}
   1521 * @public
   1522 */
   1523
   1524function escapeHtml(string) {
   1525  {
   1526    checkHtmlStringCoercion(string);
   1527  }
   1528
   1529  var str = '' + string;
   1530  var match = matchHtmlRegExp.exec(str);
   1531
   1532  if (!match) {
   1533    return str;
   1534  }
   1535
   1536  var escape;
   1537  var html = '';
   1538  var index;
   1539  var lastIndex = 0;
   1540
   1541  for (index = match.index; index < str.length; index++) {
   1542    switch (str.charCodeAt(index)) {
   1543      case 34:
   1544        // "
   1545        escape = '&quot;';
   1546        break;
   1547
   1548      case 38:
   1549        // &
   1550        escape = '&amp;';
   1551        break;
   1552
   1553      case 39:
   1554        // '
   1555        escape = '&#x27;'; // modified from escape-html; used to be '&#39'
   1556
   1557        break;
   1558
   1559      case 60:
   1560        // <
   1561        escape = '&lt;';
   1562        break;
   1563
   1564      case 62:
   1565        // >
   1566        escape = '&gt;';
   1567        break;
   1568
   1569      default:
   1570        continue;
   1571    }
   1572
   1573    if (lastIndex !== index) {
   1574      html += str.substring(lastIndex, index);
   1575    }
   1576
   1577    lastIndex = index + 1;
   1578    html += escape;
   1579  }
   1580
   1581  return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
   1582} // end code copied and modified from escape-html
   1583
   1584/**
   1585 * Escapes text to prevent scripting attacks.
   1586 *
   1587 * @param {*} text Text value to escape.
   1588 * @return {string} An escaped string.
   1589 */
   1590
   1591
   1592function escapeTextForBrowser(text) {
   1593  if (typeof text === 'boolean' || typeof text === 'number') {
   1594    // this shortcircuit helps perf for types that we know will never have
   1595    // special characters, especially given that this function is used often
   1596    // for numeric dom ids.
   1597    return '' + text;
   1598  }
   1599
   1600  return escapeHtml(text);
   1601}
   1602
   1603var uppercasePattern = /([A-Z])/g;
   1604var msPattern$1 = /^ms-/;
   1605/**
   1606 * Hyphenates a camelcased CSS property name, for example:
   1607 *
   1608 *   > hyphenateStyleName('backgroundColor')
   1609 *   < "background-color"
   1610 *   > hyphenateStyleName('MozTransition')
   1611 *   < "-moz-transition"
   1612 *   > hyphenateStyleName('msTransition')
   1613 *   < "-ms-transition"
   1614 *
   1615 * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
   1616 * is converted to `-ms-`.
   1617 */
   1618
   1619function hyphenateStyleName(name) {
   1620  return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern$1, '-ms-');
   1621}
   1622
   1623// and any newline or tab are filtered out as if they're not part of the URL.
   1624// https://url.spec.whatwg.org/#url-parsing
   1625// Tab or newline are defined as \r\n\t:
   1626// https://infra.spec.whatwg.org/#ascii-tab-or-newline
   1627// A C0 control is a code point in the range \u0000 NULL to \u001F
   1628// INFORMATION SEPARATOR ONE, inclusive:
   1629// https://infra.spec.whatwg.org/#c0-control-or-space
   1630
   1631/* eslint-disable max-len */
   1632
   1633var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
   1634var didWarn = false;
   1635
   1636function sanitizeURL(url) {
   1637  {
   1638    if (!didWarn && isJavaScriptProtocol.test(url)) {
   1639      didWarn = true;
   1640
   1641      error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));
   1642    }
   1643  }
   1644}
   1645
   1646var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare
   1647
   1648function isArray(a) {
   1649  return isArrayImpl(a);
   1650}
   1651
   1652var startInlineScript = stringToPrecomputedChunk('<script>');
   1653var endInlineScript = stringToPrecomputedChunk('</script>');
   1654var startScriptSrc = stringToPrecomputedChunk('<script src="');
   1655var startModuleSrc = stringToPrecomputedChunk('<script type="module" src="');
   1656var endAsyncScript = stringToPrecomputedChunk('" async=""></script>');
   1657/**
   1658 * This escaping function is designed to work with bootstrapScriptContent only.
   1659 * because we know we are escaping the entire script. We can avoid for instance
   1660 * escaping html comment string sequences that are valid javascript as well because
   1661 * if there are no sebsequent <script sequences the html parser will never enter
   1662 * script data double escaped state (see: https://www.w3.org/TR/html53/syntax.html#script-data-double-escaped-state)
   1663 *
   1664 * While untrusted script content should be made safe before using this api it will
   1665 * ensure that the script cannot be early terminated or never terminated state
   1666 */
   1667
   1668function escapeBootstrapScriptContent(scriptText) {
   1669  {
   1670    checkHtmlStringCoercion(scriptText);
   1671  }
   1672
   1673  return ('' + scriptText).replace(scriptRegex, scriptReplacer);
   1674}
   1675
   1676var scriptRegex = /(<\/|<)(s)(cript)/gi;
   1677
   1678var scriptReplacer = function (match, prefix, s, suffix) {
   1679  return "" + prefix + (s === 's' ? "\\u0073" : "\\u0053") + suffix;
   1680}; // Allows us to keep track of what we've already written so we can refer back to it.
   1681
   1682
   1683function createResponseState(identifierPrefix, nonce, bootstrapScriptContent, bootstrapScripts, bootstrapModules) {
   1684  var idPrefix = identifierPrefix === undefined ? '' : identifierPrefix;
   1685  var inlineScriptWithNonce = nonce === undefined ? startInlineScript : stringToPrecomputedChunk('<script nonce="' + escapeTextForBrowser(nonce) + '">');
   1686  var bootstrapChunks = [];
   1687
   1688  if (bootstrapScriptContent !== undefined) {
   1689    bootstrapChunks.push(inlineScriptWithNonce, stringToChunk(escapeBootstrapScriptContent(bootstrapScriptContent)), endInlineScript);
   1690  }
   1691
   1692  if (bootstrapScripts !== undefined) {
   1693    for (var i = 0; i < bootstrapScripts.length; i++) {
   1694      bootstrapChunks.push(startScriptSrc, stringToChunk(escapeTextForBrowser(bootstrapScripts[i])), endAsyncScript);
   1695    }
   1696  }
   1697
   1698  if (bootstrapModules !== undefined) {
   1699    for (var _i = 0; _i < bootstrapModules.length; _i++) {
   1700      bootstrapChunks.push(startModuleSrc, stringToChunk(escapeTextForBrowser(bootstrapModules[_i])), endAsyncScript);
   1701    }
   1702  }
   1703
   1704  return {
   1705    bootstrapChunks: bootstrapChunks,
   1706    startInlineScript: inlineScriptWithNonce,
   1707    placeholderPrefix: stringToPrecomputedChunk(idPrefix + 'P:'),
   1708    segmentPrefix: stringToPrecomputedChunk(idPrefix + 'S:'),
   1709    boundaryPrefix: idPrefix + 'B:',
   1710    idPrefix: idPrefix,
   1711    nextSuspenseID: 0,
   1712    sentCompleteSegmentFunction: false,
   1713    sentCompleteBoundaryFunction: false,
   1714    sentClientRenderFunction: false
   1715  };
   1716} // Constants for the insertion mode we're currently writing in. We don't encode all HTML5 insertion
   1717// modes. We only include the variants as they matter for the sake of our purposes.
   1718// We don't actually provide the namespace therefore we use constants instead of the string.
   1719
   1720var ROOT_HTML_MODE = 0; // Used for the root most element tag.
   1721
   1722var HTML_MODE = 1;
   1723var SVG_MODE = 2;
   1724var MATHML_MODE = 3;
   1725var HTML_TABLE_MODE = 4;
   1726var HTML_TABLE_BODY_MODE = 5;
   1727var HTML_TABLE_ROW_MODE = 6;
   1728var HTML_COLGROUP_MODE = 7; // We have a greater than HTML_TABLE_MODE check elsewhere. If you add more cases here, make sure it
   1729// still makes sense
   1730
   1731function createFormatContext(insertionMode, selectedValue) {
   1732  return {
   1733    insertionMode: insertionMode,
   1734    selectedValue: selectedValue
   1735  };
   1736}
   1737function getChildFormatContext(parentContext, type, props) {
   1738  switch (type) {
   1739    case 'select':
   1740      return createFormatContext(HTML_MODE, props.value != null ? props.value : props.defaultValue);
   1741
   1742    case 'svg':
   1743      return createFormatContext(SVG_MODE, null);
   1744
   1745    case 'math':
   1746      return createFormatContext(MATHML_MODE, null);
   1747
   1748    case 'foreignObject':
   1749      return createFormatContext(HTML_MODE, null);
   1750    // Table parents are special in that their children can only be created at all if they're
   1751    // wrapped in a table parent. So we need to encode that we're entering this mode.
   1752
   1753    case 'table':
   1754      return createFormatContext(HTML_TABLE_MODE, null);
   1755
   1756    case 'thead':
   1757    case 'tbody':
   1758    case 'tfoot':
   1759      return createFormatContext(HTML_TABLE_BODY_MODE, null);
   1760
   1761    case 'colgroup':
   1762      return createFormatContext(HTML_COLGROUP_MODE, null);
   1763
   1764    case 'tr':
   1765      return createFormatContext(HTML_TABLE_ROW_MODE, null);
   1766  }
   1767
   1768  if (parentContext.insertionMode >= HTML_TABLE_MODE) {
   1769    // Whatever tag this was, it wasn't a table parent or other special parent, so we must have
   1770    // entered plain HTML again.
   1771    return createFormatContext(HTML_MODE, null);
   1772  }
   1773
   1774  if (parentContext.insertionMode === ROOT_HTML_MODE) {
   1775    // We've emitted the root and is now in plain HTML mode.
   1776    return createFormatContext(HTML_MODE, null);
   1777  }
   1778
   1779  return parentContext;
   1780}
   1781var UNINITIALIZED_SUSPENSE_BOUNDARY_ID = null;
   1782function assignSuspenseBoundaryID(responseState) {
   1783  var generatedID = responseState.nextSuspenseID++;
   1784  return stringToPrecomputedChunk(responseState.boundaryPrefix + generatedID.toString(16));
   1785}
   1786function makeId(responseState, treeId, localId) {
   1787  var idPrefix = responseState.idPrefix;
   1788  var id = ':' + idPrefix + 'R' + treeId; // Unless this is the first id at this level, append a number at the end
   1789  // that represents the position of this useId hook among all the useId
   1790  // hooks for this fiber.
   1791
   1792  if (localId > 0) {
   1793    id += 'H' + localId.toString(32);
   1794  }
   1795
   1796  return id + ':';
   1797}
   1798
   1799function encodeHTMLTextNode(text) {
   1800  return escapeTextForBrowser(text);
   1801}
   1802
   1803var textSeparator = stringToPrecomputedChunk('<!-- -->');
   1804function pushTextInstance(target, text, responseState, textEmbedded) {
   1805  if (text === '') {
   1806    // Empty text doesn't have a DOM node representation and the hydration is aware of this.
   1807    return textEmbedded;
   1808  }
   1809
   1810  if (textEmbedded) {
   1811    target.push(textSeparator);
   1812  }
   1813
   1814  target.push(stringToChunk(encodeHTMLTextNode(text)));
   1815  return true;
   1816} // Called when Fizz is done with a Segment. Currently the only purpose is to conditionally
   1817// emit a text separator when we don't know for sure it is safe to omit
   1818
   1819function pushSegmentFinale(target, responseState, lastPushedText, textEmbedded) {
   1820  if (lastPushedText && textEmbedded) {
   1821    target.push(textSeparator);
   1822  }
   1823}
   1824var styleNameCache = new Map();
   1825
   1826function processStyleName(styleName) {
   1827  var chunk = styleNameCache.get(styleName);
   1828
   1829  if (chunk !== undefined) {
   1830    return chunk;
   1831  }
   1832
   1833  var result = stringToPrecomputedChunk(escapeTextForBrowser(hyphenateStyleName(styleName)));
   1834  styleNameCache.set(styleName, result);
   1835  return result;
   1836}
   1837
   1838var styleAttributeStart = stringToPrecomputedChunk(' style="');
   1839var styleAssign = stringToPrecomputedChunk(':');
   1840var styleSeparator = stringToPrecomputedChunk(';');
   1841
   1842function pushStyle(target, responseState, style) {
   1843  if (typeof style !== 'object') {
   1844    throw new Error('The `style` prop expects a mapping from style properties to values, ' + "not a string. For example, style={{marginRight: spacing + 'em'}} when " + 'using JSX.');
   1845  }
   1846
   1847  var isFirst = true;
   1848
   1849  for (var styleName in style) {
   1850    if (!hasOwnProperty.call(style, styleName)) {
   1851      continue;
   1852    } // If you provide unsafe user data here they can inject arbitrary CSS
   1853    // which may be problematic (I couldn't repro this):
   1854    // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
   1855    // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
   1856    // This is not an XSS hole but instead a potential CSS injection issue
   1857    // which has lead to a greater discussion about how we're going to
   1858    // trust URLs moving forward. See #2115901
   1859
   1860
   1861    var styleValue = style[styleName];
   1862
   1863    if (styleValue == null || typeof styleValue === 'boolean' || styleValue === '') {
   1864      // TODO: We used to set empty string as a style with an empty value. Does that ever make sense?
   1865      continue;
   1866    }
   1867
   1868    var nameChunk = void 0;
   1869    var valueChunk = void 0;
   1870    var isCustomProperty = styleName.indexOf('--') === 0;
   1871
   1872    if (isCustomProperty) {
   1873      nameChunk = stringToChunk(escapeTextForBrowser(styleName));
   1874
   1875      {
   1876        checkCSSPropertyStringCoercion(styleValue, styleName);
   1877      }
   1878
   1879      valueChunk = stringToChunk(escapeTextForBrowser(('' + styleValue).trim()));
   1880    } else {
   1881      {
   1882        warnValidStyle$1(styleName, styleValue);
   1883      }
   1884
   1885      nameChunk = processStyleName(styleName);
   1886
   1887      if (typeof styleValue === 'number') {
   1888        if (styleValue !== 0 && !hasOwnProperty.call(isUnitlessNumber, styleName)) {
   1889          valueChunk = stringToChunk(styleValue + 'px'); // Presumes implicit 'px' suffix for unitless numbers
   1890        } else {
   1891          valueChunk = stringToChunk('' + styleValue);
   1892        }
   1893      } else {
   1894        {
   1895          checkCSSPropertyStringCoercion(styleValue, styleName);
   1896        }
   1897
   1898        valueChunk = stringToChunk(escapeTextForBrowser(('' + styleValue).trim()));
   1899      }
   1900    }
   1901
   1902    if (isFirst) {
   1903      isFirst = false; // If it's first, we don't need any separators prefixed.
   1904
   1905      target.push(styleAttributeStart, nameChunk, styleAssign, valueChunk);
   1906    } else {
   1907      target.push(styleSeparator, nameChunk, styleAssign, valueChunk);
   1908    }
   1909  }
   1910
   1911  if (!isFirst) {
   1912    target.push(attributeEnd);
   1913  }
   1914}
   1915
   1916var attributeSeparator = stringToPrecomputedChunk(' ');
   1917var attributeAssign = stringToPrecomputedChunk('="');
   1918var attributeEnd = stringToPrecomputedChunk('"');
   1919var attributeEmptyString = stringToPrecomputedChunk('=""');
   1920
   1921function pushAttribute(target, responseState, name, value) {
   1922  switch (name) {
   1923    case 'style':
   1924      {
   1925        pushStyle(target, responseState, value);
   1926        return;
   1927      }
   1928
   1929    case 'defaultValue':
   1930    case 'defaultChecked': // These shouldn't be set as attributes on generic HTML elements.
   1931
   1932    case 'innerHTML': // Must use dangerouslySetInnerHTML instead.
   1933
   1934    case 'suppressContentEditableWarning':
   1935    case 'suppressHydrationWarning':
   1936      // Ignored. These are built-in to React on the client.
   1937      return;
   1938  }
   1939
   1940  if ( // shouldIgnoreAttribute
   1941  // We have already filtered out null/undefined and reserved words.
   1942  name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
   1943    return;
   1944  }
   1945
   1946  var propertyInfo = getPropertyInfo(name);
   1947
   1948  if (propertyInfo !== null) {
   1949    // shouldRemoveAttribute
   1950    switch (typeof value) {
   1951      case 'function': // $FlowIssue symbol is perfectly valid here
   1952
   1953      case 'symbol':
   1954        // eslint-disable-line
   1955        return;
   1956
   1957      case 'boolean':
   1958        {
   1959          if (!propertyInfo.acceptsBooleans) {
   1960            return;
   1961          }
   1962        }
   1963    }
   1964
   1965    var attributeName = propertyInfo.attributeName;
   1966    var attributeNameChunk = stringToChunk(attributeName); // TODO: If it's known we can cache the chunk.
   1967
   1968    switch (propertyInfo.type) {
   1969      case BOOLEAN:
   1970        if (value) {
   1971          target.push(attributeSeparator, attributeNameChunk, attributeEmptyString);
   1972        }
   1973
   1974        return;
   1975
   1976      case OVERLOADED_BOOLEAN:
   1977        if (value === true) {
   1978          target.push(attributeSeparator, attributeNameChunk, attributeEmptyString);
   1979        } else if (value === false) ; else {
   1980          target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
   1981        }
   1982
   1983        return;
   1984
   1985      case NUMERIC:
   1986        if (!isNaN(value)) {
   1987          target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
   1988        }
   1989
   1990        break;
   1991
   1992      case POSITIVE_NUMERIC:
   1993        if (!isNaN(value) && value >= 1) {
   1994          target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
   1995        }
   1996
   1997        break;
   1998
   1999      default:
   2000        if (propertyInfo.sanitizeURL) {
   2001          {
   2002            checkAttributeStringCoercion(value, attributeName);
   2003          }
   2004
   2005          value = '' + value;
   2006          sanitizeURL(value);
   2007        }
   2008
   2009        target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
   2010    }
   2011  } else if (isAttributeNameSafe(name)) {
   2012    // shouldRemoveAttribute
   2013    switch (typeof value) {
   2014      case 'function': // $FlowIssue symbol is perfectly valid here
   2015
   2016      case 'symbol':
   2017        // eslint-disable-line
   2018        return;
   2019
   2020      case 'boolean':
   2021        {
   2022          var prefix = name.toLowerCase().slice(0, 5);
   2023
   2024          if (prefix !== 'data-' && prefix !== 'aria-') {
   2025            return;
   2026          }
   2027        }
   2028    }
   2029
   2030    target.push(attributeSeparator, stringToChunk(name), attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
   2031  }
   2032}
   2033
   2034var endOfStartTag = stringToPrecomputedChunk('>');
   2035var endOfStartTagSelfClosing = stringToPrecomputedChunk('/>');
   2036
   2037function pushInnerHTML(target, innerHTML, children) {
   2038  if (innerHTML != null) {
   2039    if (children != null) {
   2040      throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
   2041    }
   2042
   2043    if (typeof innerHTML !== 'object' || !('__html' in innerHTML)) {
   2044      throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
   2045    }
   2046
   2047    var html = innerHTML.__html;
   2048
   2049    if (html !== null && html !== undefined) {
   2050      {
   2051        checkHtmlStringCoercion(html);
   2052      }
   2053
   2054      target.push(stringToChunk('' + html));
   2055    }
   2056  }
   2057} // TODO: Move these to ResponseState so that we warn for every request.
   2058// It would help debugging in stateful servers (e.g. service worker).
   2059
   2060
   2061var didWarnDefaultInputValue = false;
   2062var didWarnDefaultChecked = false;
   2063var didWarnDefaultSelectValue = false;
   2064var didWarnDefaultTextareaValue = false;
   2065var didWarnInvalidOptionChildren = false;
   2066var didWarnInvalidOptionInnerHTML = false;
   2067var didWarnSelectedSetOnOption = false;
   2068
   2069function checkSelectProp(props, propName) {
   2070  {
   2071    var value = props[propName];
   2072
   2073    if (value != null) {
   2074      var array = isArray(value);
   2075
   2076      if (props.multiple && !array) {
   2077        error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.', propName);
   2078      } else if (!props.multiple && array) {
   2079        error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.', propName);
   2080      }
   2081    }
   2082  }
   2083}
   2084
   2085function pushStartSelect(target, props, responseState) {
   2086  {
   2087    checkControlledValueProps('select', props);
   2088    checkSelectProp(props, 'value');
   2089    checkSelectProp(props, 'defaultValue');
   2090
   2091    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultSelectValue) {
   2092      error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components');
   2093
   2094      didWarnDefaultSelectValue = true;
   2095    }
   2096  }
   2097
   2098  target.push(startChunkForTag('select'));
   2099  var children = null;
   2100  var innerHTML = null;
   2101
   2102  for (var propKey in props) {
   2103    if (hasOwnProperty.call(props, propKey)) {
   2104      var propValue = props[propKey];
   2105
   2106      if (propValue == null) {
   2107        continue;
   2108      }
   2109
   2110      switch (propKey) {
   2111        case 'children':
   2112          children = propValue;
   2113          break;
   2114
   2115        case 'dangerouslySetInnerHTML':
   2116          // TODO: This doesn't really make sense for select since it can't use the controlled
   2117          // value in the innerHTML.
   2118          innerHTML = propValue;
   2119          break;
   2120
   2121        case 'defaultValue':
   2122        case 'value':
   2123          // These are set on the Context instead and applied to the nested options.
   2124          break;
   2125
   2126        default:
   2127          pushAttribute(target, responseState, propKey, propValue);
   2128          break;
   2129      }
   2130    }
   2131  }
   2132
   2133  target.push(endOfStartTag);
   2134  pushInnerHTML(target, innerHTML, children);
   2135  return children;
   2136}
   2137
   2138function flattenOptionChildren(children) {
   2139  var content = ''; // Flatten children and warn if they aren't strings or numbers;
   2140  // invalid types are ignored.
   2141
   2142  React.Children.forEach(children, function (child) {
   2143    if (child == null) {
   2144      return;
   2145    }
   2146
   2147    content += child;
   2148
   2149    {
   2150      if (!didWarnInvalidOptionChildren && typeof child !== 'string' && typeof child !== 'number') {
   2151        didWarnInvalidOptionChildren = true;
   2152
   2153        error('Cannot infer the option value of complex children. ' + 'Pass a `value` prop or use a plain string as children to <option>.');
   2154      }
   2155    }
   2156  });
   2157  return content;
   2158}
   2159
   2160var selectedMarkerAttribute = stringToPrecomputedChunk(' selected=""');
   2161
   2162function pushStartOption(target, props, responseState, formatContext) {
   2163  var selectedValue = formatContext.selectedValue;
   2164  target.push(startChunkForTag('option'));
   2165  var children = null;
   2166  var value = null;
   2167  var selected = null;
   2168  var innerHTML = null;
   2169
   2170  for (var propKey in props) {
   2171    if (hasOwnProperty.call(props, propKey)) {
   2172      var propValue = props[propKey];
   2173
   2174      if (propValue == null) {
   2175        continue;
   2176      }
   2177
   2178      switch (propKey) {
   2179        case 'children':
   2180          children = propValue;
   2181          break;
   2182
   2183        case 'selected':
   2184          // ignore
   2185          selected = propValue;
   2186
   2187          {
   2188            // TODO: Remove support for `selected` in <option>.
   2189            if (!didWarnSelectedSetOnOption) {
   2190              error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
   2191
   2192              didWarnSelectedSetOnOption = true;
   2193            }
   2194          }
   2195
   2196          break;
   2197
   2198        case 'dangerouslySetInnerHTML':
   2199          innerHTML = propValue;
   2200          break;
   2201        // eslint-disable-next-line-no-fallthrough
   2202
   2203        case 'value':
   2204          value = propValue;
   2205        // We intentionally fallthrough to also set the attribute on the node.
   2206        // eslint-disable-next-line-no-fallthrough
   2207
   2208        default:
   2209          pushAttribute(target, responseState, propKey, propValue);
   2210          break;
   2211      }
   2212    }
   2213  }
   2214
   2215  if (selectedValue != null) {
   2216    var stringValue;
   2217
   2218    if (value !== null) {
   2219      {
   2220        checkAttributeStringCoercion(value, 'value');
   2221      }
   2222
   2223      stringValue = '' + value;
   2224    } else {
   2225      {
   2226        if (innerHTML !== null) {
   2227          if (!didWarnInvalidOptionInnerHTML) {
   2228            didWarnInvalidOptionInnerHTML = true;
   2229
   2230            error('Pass a `value` prop if you set dangerouslyInnerHTML so React knows ' + 'which value should be selected.');
   2231          }
   2232        }
   2233      }
   2234
   2235      stringValue = flattenOptionChildren(children);
   2236    }
   2237
   2238    if (isArray(selectedValue)) {
   2239      // multiple
   2240      for (var i = 0; i < selectedValue.length; i++) {
   2241        {
   2242          checkAttributeStringCoercion(selectedValue[i], 'value');
   2243        }
   2244
   2245        var v = '' + selectedValue[i];
   2246
   2247        if (v === stringValue) {
   2248          target.push(selectedMarkerAttribute);
   2249          break;
   2250        }
   2251      }
   2252    } else {
   2253      {
   2254        checkAttributeStringCoercion(selectedValue, 'select.value');
   2255      }
   2256
   2257      if ('' + selectedValue === stringValue) {
   2258        target.push(selectedMarkerAttribute);
   2259      }
   2260    }
   2261  } else if (selected) {
   2262    target.push(selectedMarkerAttribute);
   2263  }
   2264
   2265  target.push(endOfStartTag);
   2266  pushInnerHTML(target, innerHTML, children);
   2267  return children;
   2268}
   2269
   2270function pushInput(target, props, responseState) {
   2271  {
   2272    checkControlledValueProps('input', props);
   2273
   2274    if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnDefaultChecked) {
   2275      error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', 'A component', props.type);
   2276
   2277      didWarnDefaultChecked = true;
   2278    }
   2279
   2280    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultInputValue) {
   2281      error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', 'A component', props.type);
   2282
   2283      didWarnDefaultInputValue = true;
   2284    }
   2285  }
   2286
   2287  target.push(startChunkForTag('input'));
   2288  var value = null;
   2289  var defaultValue = null;
   2290  var checked = null;
   2291  var defaultChecked = null;
   2292
   2293  for (var propKey in props) {
   2294    if (hasOwnProperty.call(props, propKey)) {
   2295      var propValue = props[propKey];
   2296
   2297      if (propValue == null) {
   2298        continue;
   2299      }
   2300
   2301      switch (propKey) {
   2302        case 'children':
   2303        case 'dangerouslySetInnerHTML':
   2304          throw new Error('input' + " is a self-closing tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
   2305        // eslint-disable-next-line-no-fallthrough
   2306
   2307        case 'defaultChecked':
   2308          defaultChecked = propValue;
   2309          break;
   2310
   2311        case 'defaultValue':
   2312          defaultValue = propValue;
   2313          break;
   2314
   2315        case 'checked':
   2316          checked = propValue;
   2317          break;
   2318
   2319        case 'value':
   2320          value = propValue;
   2321          break;
   2322
   2323        default:
   2324          pushAttribute(target, responseState, propKey, propValue);
   2325          break;
   2326      }
   2327    }
   2328  }
   2329
   2330  if (checked !== null) {
   2331    pushAttribute(target, responseState, 'checked', checked);
   2332  } else if (defaultChecked !== null) {
   2333    pushAttribute(target, responseState, 'checked', defaultChecked);
   2334  }
   2335
   2336  if (value !== null) {
   2337    pushAttribute(target, responseState, 'value', value);
   2338  } else if (defaultValue !== null) {
   2339    pushAttribute(target, responseState, 'value', defaultValue);
   2340  }
   2341
   2342  target.push(endOfStartTagSelfClosing);
   2343  return null;
   2344}
   2345
   2346function pushStartTextArea(target, props, responseState) {
   2347  {
   2348    checkControlledValueProps('textarea', props);
   2349
   2350    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultTextareaValue) {
   2351      error('Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components');
   2352
   2353      didWarnDefaultTextareaValue = true;
   2354    }
   2355  }
   2356
   2357  target.push(startChunkForTag('textarea'));
   2358  var value = null;
   2359  var defaultValue = null;
   2360  var children = null;
   2361
   2362  for (var propKey in props) {
   2363    if (hasOwnProperty.call(props, propKey)) {
   2364      var propValue = props[propKey];
   2365
   2366      if (propValue == null) {
   2367        continue;
   2368      }
   2369
   2370      switch (propKey) {
   2371        case 'children':
   2372          children = propValue;
   2373          break;
   2374
   2375        case 'value':
   2376          value = propValue;
   2377          break;
   2378
   2379        case 'defaultValue':
   2380          defaultValue = propValue;
   2381          break;
   2382
   2383        case 'dangerouslySetInnerHTML':
   2384          throw new Error('`dangerouslySetInnerHTML` does not make sense on <textarea>.');
   2385        // eslint-disable-next-line-no-fallthrough
   2386
   2387        default:
   2388          pushAttribute(target, responseState, propKey, propValue);
   2389          break;
   2390      }
   2391    }
   2392  }
   2393
   2394  if (value === null && defaultValue !== null) {
   2395    value = defaultValue;
   2396  }
   2397
   2398  target.push(endOfStartTag); // TODO (yungsters): Remove support for children content in <textarea>.
   2399
   2400  if (children != null) {
   2401    {
   2402      error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
   2403    }
   2404
   2405    if (value != null) {
   2406      throw new Error('If you supply `defaultValue` on a <textarea>, do not pass children.');
   2407    }
   2408
   2409    if (isArray(children)) {
   2410      if (children.length > 1) {
   2411        throw new Error('<textarea> can only have at most one child.');
   2412      } // TODO: remove the coercion and the DEV check below because it will
   2413      // always be overwritten by the coercion several lines below it. #22309
   2414
   2415
   2416      {
   2417        checkHtmlStringCoercion(children[0]);
   2418      }
   2419
   2420      value = '' + children[0];
   2421    }
   2422
   2423    {
   2424      checkHtmlStringCoercion(children);
   2425    }
   2426
   2427    value = '' + children;
   2428  }
   2429
   2430  if (typeof value === 'string' && value[0] === '\n') {
   2431    // text/html ignores the first character in these tags if it's a newline
   2432    // Prefer to break application/xml over text/html (for now) by adding
   2433    // a newline specifically to get eaten by the parser. (Alternately for
   2434    // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
   2435    // \r is normalized out by HTMLTextAreaElement#value.)
   2436    // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
   2437    // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
   2438    // See: <http://www.w3.org/TR/html5/syntax.html#newlines>
   2439    // See: Parsing of "textarea" "listing" and "pre" elements
   2440    //  from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
   2441    target.push(leadingNewline);
   2442  } // ToString and push directly instead of recurse over children.
   2443  // We don't really support complex children in the value anyway.
   2444  // This also currently avoids a trailing comment node which breaks textarea.
   2445
   2446
   2447  if (value !== null) {
   2448    {
   2449      checkAttributeStringCoercion(value, 'value');
   2450    }
   2451
   2452    target.push(stringToChunk(encodeHTMLTextNode('' + value)));
   2453  }
   2454
   2455  return null;
   2456}
   2457
   2458function pushSelfClosing(target, props, tag, responseState) {
   2459  target.push(startChunkForTag(tag));
   2460
   2461  for (var propKey in props) {
   2462    if (hasOwnProperty.call(props, propKey)) {
   2463      var propValue = props[propKey];
   2464
   2465      if (propValue == null) {
   2466        continue;
   2467      }
   2468
   2469      switch (propKey) {
   2470        case 'children':
   2471        case 'dangerouslySetInnerHTML':
   2472          throw new Error(tag + " is a self-closing tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
   2473        // eslint-disable-next-line-no-fallthrough
   2474
   2475        default:
   2476          pushAttribute(target, responseState, propKey, propValue);
   2477          break;
   2478      }
   2479    }
   2480  }
   2481
   2482  target.push(endOfStartTagSelfClosing);
   2483  return null;
   2484}
   2485
   2486function pushStartMenuItem(target, props, responseState) {
   2487  target.push(startChunkForTag('menuitem'));
   2488
   2489  for (var propKey in props) {
   2490    if (hasOwnProperty.call(props, propKey)) {
   2491      var propValue = props[propKey];
   2492
   2493      if (propValue == null) {
   2494        continue;
   2495      }
   2496
   2497      switch (propKey) {
   2498        case 'children':
   2499        case 'dangerouslySetInnerHTML':
   2500          throw new Error('menuitems cannot have `children` nor `dangerouslySetInnerHTML`.');
   2501        // eslint-disable-next-line-no-fallthrough
   2502
   2503        default:
   2504          pushAttribute(target, responseState, propKey, propValue);
   2505          break;
   2506      }
   2507    }
   2508  }
   2509
   2510  target.push(endOfStartTag);
   2511  return null;
   2512}
   2513
   2514function pushStartTitle(target, props, responseState) {
   2515  target.push(startChunkForTag('title'));
   2516  var children = null;
   2517
   2518  for (var propKey in props) {
   2519    if (hasOwnProperty.call(props, propKey)) {
   2520      var propValue = props[propKey];
   2521
   2522      if (propValue == null) {
   2523        continue;
   2524      }
   2525
   2526      switch (propKey) {
   2527        case 'children':
   2528          children = propValue;
   2529          break;
   2530
   2531        case 'dangerouslySetInnerHTML':
   2532          throw new Error('`dangerouslySetInnerHTML` does not make sense on <title>.');
   2533        // eslint-disable-next-line-no-fallthrough
   2534
   2535        default:
   2536          pushAttribute(target, responseState, propKey, propValue);
   2537          break;
   2538      }
   2539    }
   2540  }
   2541
   2542  target.push(endOfStartTag);
   2543
   2544  {
   2545    var child = Array.isArray(children) && children.length < 2 ? children[0] || null : children;
   2546
   2547    if (Array.isArray(children) && children.length > 1) {
   2548      error('A title element received an array with more than 1 element as children. ' + 'In browsers title Elements can only have Text Nodes as children. If ' + 'the children being rendered output more than a single text node in aggregate the browser ' + 'will display markup and comments as text in the title and hydration will likely fail and ' + 'fall back to client rendering');
   2549    } else if (child != null && child.$$typeof != null) {
   2550      error('A title element received a React element for children. ' + 'In the browser title Elements can only have Text Nodes as children. If ' + 'the children being rendered output more than a single text node in aggregate the browser ' + 'will display markup and comments as text in the title and hydration will likely fail and ' + 'fall back to client rendering');
   2551    } else if (child != null && typeof child !== 'string' && typeof child !== 'number') {
   2552      error('A title element received a value that was not a string or number for children. ' + 'In the browser title Elements can only have Text Nodes as children. If ' + 'the children being rendered output more than a single text node in aggregate the browser ' + 'will display markup and comments as text in the title and hydration will likely fail and ' + 'fall back to client rendering');
   2553    }
   2554  }
   2555
   2556  return children;
   2557}
   2558
   2559function pushStartGenericElement(target, props, tag, responseState) {
   2560  target.push(startChunkForTag(tag));
   2561  var children = null;
   2562  var innerHTML = null;
   2563
   2564  for (var propKey in props) {
   2565    if (hasOwnProperty.call(props, propKey)) {
   2566      var propValue = props[propKey];
   2567
   2568      if (propValue == null) {
   2569        continue;
   2570      }
   2571
   2572      switch (propKey) {
   2573        case 'children':
   2574          children = propValue;
   2575          break;
   2576
   2577        case 'dangerouslySetInnerHTML':
   2578          innerHTML = propValue;
   2579          break;
   2580
   2581        default:
   2582          pushAttribute(target, responseState, propKey, propValue);
   2583          break;
   2584      }
   2585    }
   2586  }
   2587
   2588  target.push(endOfStartTag);
   2589  pushInnerHTML(target, innerHTML, children);
   2590
   2591  if (typeof children === 'string') {
   2592    // Special case children as a string to avoid the unnecessary comment.
   2593    // TODO: Remove this special case after the general optimization is in place.
   2594    target.push(stringToChunk(encodeHTMLTextNode(children)));
   2595    return null;
   2596  }
   2597
   2598  return children;
   2599}
   2600
   2601function pushStartCustomElement(target, props, tag, responseState) {
   2602  target.push(startChunkForTag(tag));
   2603  var children = null;
   2604  var innerHTML = null;
   2605
   2606  for (var propKey in props) {
   2607    if (hasOwnProperty.call(props, propKey)) {
   2608      var propValue = props[propKey];
   2609
   2610      if (propValue == null) {
   2611        continue;
   2612      }
   2613
   2614      switch (propKey) {
   2615        case 'children':
   2616          children = propValue;
   2617          break;
   2618
   2619        case 'dangerouslySetInnerHTML':
   2620          innerHTML = propValue;
   2621          break;
   2622
   2623        case 'style':
   2624          pushStyle(target, responseState, propValue);
   2625          break;
   2626
   2627        case 'suppressContentEditableWarning':
   2628        case 'suppressHydrationWarning':
   2629          // Ignored. These are built-in to React on the client.
   2630          break;
   2631
   2632        default:
   2633          if (isAttributeNameSafe(propKey) && typeof propValue !== 'function' && typeof propValue !== 'symbol') {
   2634            target.push(attributeSeparator, stringToChunk(propKey), attributeAssign, stringToChunk(escapeTextForBrowser(propValue)), attributeEnd);
   2635          }
   2636
   2637          break;
   2638      }
   2639    }
   2640  }
   2641
   2642  target.push(endOfStartTag);
   2643  pushInnerHTML(target, innerHTML, children);
   2644  return children;
   2645}
   2646
   2647var leadingNewline = stringToPrecomputedChunk('\n');
   2648
   2649function pushStartPreformattedElement(target, props, tag, responseState) {
   2650  target.push(startChunkForTag(tag));
   2651  var children = null;
   2652  var innerHTML = null;
   2653
   2654  for (var propKey in props) {
   2655    if (hasOwnProperty.call(props, propKey)) {
   2656      var propValue = props[propKey];
   2657
   2658      if (propValue == null) {
   2659        continue;
   2660      }
   2661
   2662      switch (propKey) {
   2663        case 'children':
   2664          children = propValue;
   2665          break;
   2666
   2667        case 'dangerouslySetInnerHTML':
   2668          innerHTML = propValue;
   2669          break;
   2670
   2671        default:
   2672          pushAttribute(target, responseState, propKey, propValue);
   2673          break;
   2674      }
   2675    }
   2676  }
   2677
   2678  target.push(endOfStartTag); // text/html ignores the first character in these tags if it's a newline
   2679  // Prefer to break application/xml over text/html (for now) by adding
   2680  // a newline specifically to get eaten by the parser. (Alternately for
   2681  // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
   2682  // \r is normalized out by HTMLTextAreaElement#value.)
   2683  // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
   2684  // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
   2685  // See: <http://www.w3.org/TR/html5/syntax.html#newlines>
   2686  // See: Parsing of "textarea" "listing" and "pre" elements
   2687  //  from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
   2688  // TODO: This doesn't deal with the case where the child is an array
   2689  // or component that returns a string.
   2690
   2691  if (innerHTML != null) {
   2692    if (children != null) {
   2693      throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
   2694    }
   2695
   2696    if (typeof innerHTML !== 'object' || !('__html' in innerHTML)) {
   2697      throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
   2698    }
   2699
   2700    var html = innerHTML.__html;
   2701
   2702    if (html !== null && html !== undefined) {
   2703      if (typeof html === 'string' && html.length > 0 && html[0] === '\n') {
   2704        target.push(leadingNewline, stringToChunk(html));
   2705      } else {
   2706        {
   2707          checkHtmlStringCoercion(html);
   2708        }
   2709
   2710        target.push(stringToChunk('' + html));
   2711      }
   2712    }
   2713  }
   2714
   2715  if (typeof children === 'string' && children[0] === '\n') {
   2716    target.push(leadingNewline);
   2717  }
   2718
   2719  return children;
   2720} // We accept any tag to be rendered but since this gets injected into arbitrary
   2721// HTML, we want to make sure that it's a safe tag.
   2722// http://www.w3.org/TR/REC-xml/#NT-Name
   2723
   2724
   2725var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
   2726
   2727var validatedTagCache = new Map();
   2728
   2729function startChunkForTag(tag) {
   2730  var tagStartChunk = validatedTagCache.get(tag);
   2731
   2732  if (tagStartChunk === undefined) {
   2733    if (!VALID_TAG_REGEX.test(tag)) {
   2734      throw new Error("Invalid tag: " + tag);
   2735    }
   2736
   2737    tagStartChunk = stringToPrecomputedChunk('<' + tag);
   2738    validatedTagCache.set(tag, tagStartChunk);
   2739  }
   2740
   2741  return tagStartChunk;
   2742}
   2743
   2744var DOCTYPE = stringToPrecomputedChunk('<!DOCTYPE html>');
   2745function pushStartInstance(target, type, props, responseState, formatContext) {
   2746  {
   2747    validateProperties(type, props);
   2748    validateProperties$1(type, props);
   2749    validateProperties$2(type, props, null);
   2750
   2751    if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
   2752      error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');
   2753    }
   2754
   2755    if (formatContext.insertionMode !== SVG_MODE && formatContext.insertionMode !== MATHML_MODE) {
   2756      if (type.indexOf('-') === -1 && typeof props.is !== 'string' && type.toLowerCase() !== type) {
   2757        error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);
   2758      }
   2759    }
   2760  }
   2761
   2762  switch (type) {
   2763    // Special tags
   2764    case 'select':
   2765      return pushStartSelect(target, props, responseState);
   2766
   2767    case 'option':
   2768      return pushStartOption(target, props, responseState, formatContext);
   2769
   2770    case 'textarea':
   2771      return pushStartTextArea(target, props, responseState);
   2772
   2773    case 'input':
   2774      return pushInput(target, props, responseState);
   2775
   2776    case 'menuitem':
   2777      return pushStartMenuItem(target, props, responseState);
   2778
   2779    case 'title':
   2780      return pushStartTitle(target, props, responseState);
   2781    // Newline eating tags
   2782
   2783    case 'listing':
   2784    case 'pre':
   2785      {
   2786        return pushStartPreformattedElement(target, props, type, responseState);
   2787      }
   2788    // Omitted close tags
   2789
   2790    case 'area':
   2791    case 'base':
   2792    case 'br':
   2793    case 'col':
   2794    case 'embed':
   2795    case 'hr':
   2796    case 'img':
   2797    case 'keygen':
   2798    case 'link':
   2799    case 'meta':
   2800    case 'param':
   2801    case 'source':
   2802    case 'track':
   2803    case 'wbr':
   2804      {
   2805        return pushSelfClosing(target, props, type, responseState);
   2806      }
   2807    // These are reserved SVG and MathML elements, that are never custom elements.
   2808    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
   2809
   2810    case 'annotation-xml':
   2811    case 'color-profile':
   2812    case 'font-face':
   2813    case 'font-face-src':
   2814    case 'font-face-uri':
   2815    case 'font-face-format':
   2816    case 'font-face-name':
   2817    case 'missing-glyph':
   2818      {
   2819        return pushStartGenericElement(target, props, type, responseState);
   2820      }
   2821
   2822    case 'html':
   2823      {
   2824        if (formatContext.insertionMode === ROOT_HTML_MODE) {
   2825          // If we're rendering the html tag and we're at the root (i.e. not in foreignObject)
   2826          // then we also emit the DOCTYPE as part of the root content as a convenience for
   2827          // rendering the whole document.
   2828          target.push(DOCTYPE);
   2829        }
   2830
   2831        return pushStartGenericElement(target, props, type, responseState);
   2832      }
   2833
   2834    default:
   2835      {
   2836        if (type.indexOf('-') === -1 && typeof props.is !== 'string') {
   2837          // Generic element
   2838          return pushStartGenericElement(target, props, type, responseState);
   2839        } else {
   2840          // Custom element
   2841          return pushStartCustomElement(target, props, type, responseState);
   2842        }
   2843      }
   2844  }
   2845}
   2846var endTag1 = stringToPrecomputedChunk('</');
   2847var endTag2 = stringToPrecomputedChunk('>');
   2848function pushEndInstance(target, type, props) {
   2849  switch (type) {
   2850    // Omitted close tags
   2851    // TODO: Instead of repeating this switch we could try to pass a flag from above.
   2852    // That would require returning a tuple. Which might be ok if it gets inlined.
   2853    case 'area':
   2854    case 'base':
   2855    case 'br':
   2856    case 'col':
   2857    case 'embed':
   2858    case 'hr':
   2859    case 'img':
   2860    case 'input':
   2861    case 'keygen':
   2862    case 'link':
   2863    case 'meta':
   2864    case 'param':
   2865    case 'source':
   2866    case 'track':
   2867    case 'wbr':
   2868      {
   2869        // No close tag needed.
   2870        break;
   2871      }
   2872
   2873    default:
   2874      {
   2875        target.push(endTag1, stringToChunk(type), endTag2);
   2876      }
   2877  }
   2878}
   2879function writeCompletedRoot(destination, responseState) {
   2880  var bootstrapChunks = responseState.bootstrapChunks;
   2881  var i = 0;
   2882
   2883  for (; i < bootstrapChunks.length - 1; i++) {
   2884    writeChunk(destination, bootstrapChunks[i]);
   2885  }
   2886
   2887  if (i < bootstrapChunks.length) {
   2888    return writeChunkAndReturn(destination, bootstrapChunks[i]);
   2889  }
   2890
   2891  return true;
   2892} // Structural Nodes
   2893// A placeholder is a node inside a hidden partial tree that can be filled in later, but before
   2894// display. It's never visible to users. We use the template tag because it can be used in every
   2895// type of parent. <script> tags also work in every other tag except <colgroup>.
   2896
   2897var placeholder1 = stringToPrecomputedChunk('<template id="');
   2898var placeholder2 = stringToPrecomputedChunk('"></template>');
   2899function writePlaceholder(destination, responseState, id) {
   2900  writeChunk(destination, placeholder1);
   2901  writeChunk(destination, responseState.placeholderPrefix);
   2902  var formattedID = stringToChunk(id.toString(16));
   2903  writeChunk(destination, formattedID);
   2904  return writeChunkAndReturn(destination, placeholder2);
   2905} // Suspense boundaries are encoded as comments.
   2906
   2907var startCompletedSuspenseBoundary = stringToPrecomputedChunk('<!--$-->');
   2908var startPendingSuspenseBoundary1 = stringToPrecomputedChunk('<!--$?--><template id="');
   2909var startPendingSuspenseBoundary2 = stringToPrecomputedChunk('"></template>');
   2910var startClientRenderedSuspenseBoundary = stringToPrecomputedChunk('<!--$!-->');
   2911var endSuspenseBoundary = stringToPrecomputedChunk('<!--/$-->');
   2912var clientRenderedSuspenseBoundaryError1 = stringToPrecomputedChunk('<template');
   2913var clientRenderedSuspenseBoundaryErrorAttrInterstitial = stringToPrecomputedChunk('"');
   2914var clientRenderedSuspenseBoundaryError1A = stringToPrecomputedChunk(' data-dgst="');
   2915var clientRenderedSuspenseBoundaryError1B = stringToPrecomputedChunk(' data-msg="');
   2916var clientRenderedSuspenseBoundaryError1C = stringToPrecomputedChunk(' data-stck="');
   2917var clientRenderedSuspenseBoundaryError2 = stringToPrecomputedChunk('></template>');
   2918function writeStartCompletedSuspenseBoundary(destination, responseState) {
   2919  return writeChunkAndReturn(destination, startCompletedSuspenseBoundary);
   2920}
   2921function writeStartPendingSuspenseBoundary(destination, responseState, id) {
   2922  writeChunk(destination, startPendingSuspenseBoundary1);
   2923
   2924  if (id === null) {
   2925    throw new Error('An ID must have been assigned before we can complete the boundary.');
   2926  }
   2927
   2928  writeChunk(destination, id);
   2929  return writeChunkAndReturn(destination, startPendingSuspenseBoundary2);
   2930}
   2931function writeStartClientRenderedSuspenseBoundary(destination, responseState, errorDigest, errorMesssage, errorComponentStack) {
   2932  var result;
   2933  result = writeChunkAndReturn(destination, startClientRenderedSuspenseBoundary);
   2934  writeChunk(destination, clientRenderedSuspenseBoundaryError1);
   2935
   2936  if (errorDigest) {
   2937    writeChunk(destination, clientRenderedSuspenseBoundaryError1A);
   2938    writeChunk(destination, stringToChunk(escapeTextForBrowser(errorDigest)));
   2939    writeChunk(destination, clientRenderedSuspenseBoundaryErrorAttrInterstitial);
   2940  }
   2941
   2942  {
   2943    if (errorMesssage) {
   2944      writeChunk(destination, clientRenderedSuspenseBoundaryError1B);
   2945      writeChunk(destination, stringToChunk(escapeTextForBrowser(errorMesssage)));
   2946      writeChunk(destination, clientRenderedSuspenseBoundaryErrorAttrInterstitial);
   2947    }
   2948
   2949    if (errorComponentStack) {
   2950      writeChunk(destination, clientRenderedSuspenseBoundaryError1C);
   2951      writeChunk(destination, stringToChunk(escapeTextForBrowser(errorComponentStack)));
   2952      writeChunk(destination, clientRenderedSuspenseBoundaryErrorAttrInterstitial);
   2953    }
   2954  }
   2955
   2956  result = writeChunkAndReturn(destination, clientRenderedSuspenseBoundaryError2);
   2957  return result;
   2958}
   2959function writeEndCompletedSuspenseBoundary(destination, responseState) {
   2960  return writeChunkAndReturn(destination, endSuspenseBoundary);
   2961}
   2962function writeEndPendingSuspenseBoundary(destination, responseState) {
   2963  return writeChunkAndReturn(destination, endSuspenseBoundary);
   2964}
   2965function writeEndClientRenderedSuspenseBoundary(destination, responseState) {
   2966  return writeChunkAndReturn(destination, endSuspenseBoundary);
   2967}
   2968var startSegmentHTML = stringToPrecomputedChunk('<div hidden id="');
   2969var startSegmentHTML2 = stringToPrecomputedChunk('">');
   2970var endSegmentHTML = stringToPrecomputedChunk('</div>');
   2971var startSegmentSVG = stringToPrecomputedChunk('<svg aria-hidden="true" style="display:none" id="');
   2972var startSegmentSVG2 = stringToPrecomputedChunk('">');
   2973var endSegmentSVG = stringToPrecomputedChunk('</svg>');
   2974var startSegmentMathML = stringToPrecomputedChunk('<math aria-hidden="true" style="display:none" id="');
   2975var startSegmentMathML2 = stringToPrecomputedChunk('">');
   2976var endSegmentMathML = stringToPrecomputedChunk('</math>');
   2977var startSegmentTable = stringToPrecomputedChunk('<table hidden id="');
   2978var startSegmentTable2 = stringToPrecomputedChunk('">');
   2979var endSegmentTable = stringToPrecomputedChunk('</table>');
   2980var startSegmentTableBody = stringToPrecomputedChunk('<table hidden><tbody id="');
   2981var startSegmentTableBody2 = stringToPrecomputedChunk('">');
   2982var endSegmentTableBody = stringToPrecomputedChunk('</tbody></table>');
   2983var startSegmentTableRow = stringToPrecomputedChunk('<table hidden><tr id="');
   2984var startSegmentTableRow2 = stringToPrecomputedChunk('">');
   2985var endSegmentTableRow = stringToPrecomputedChunk('</tr></table>');
   2986var startSegmentColGroup = stringToPrecomputedChunk('<table hidden><colgroup id="');
   2987var startSegmentColGroup2 = stringToPrecomputedChunk('">');
   2988var endSegmentColGroup = stringToPrecomputedChunk('</colgroup></table>');
   2989function writeStartSegment(destination, responseState, formatContext, id) {
   2990  switch (formatContext.insertionMode) {
   2991    case ROOT_HTML_MODE:
   2992    case HTML_MODE:
   2993      {
   2994        writeChunk(destination, startSegmentHTML);
   2995        writeChunk(destination, responseState.segmentPrefix);
   2996        writeChunk(destination, stringToChunk(id.toString(16)));
   2997        return writeChunkAndReturn(destination, startSegmentHTML2);
   2998      }
   2999
   3000    case SVG_MODE:
   3001      {
   3002        writeChunk(destination, startSegmentSVG);
   3003        writeChunk(destination, responseState.segmentPrefix);
   3004        writeChunk(destination, stringToChunk(id.toString(16)));
   3005        return writeChunkAndReturn(destination, startSegmentSVG2);
   3006      }
   3007
   3008    case MATHML_MODE:
   3009      {
   3010        writeChunk(destination, startSegmentMathML);
   3011        writeChunk(destination, responseState.segmentPrefix);
   3012        writeChunk(destination, stringToChunk(id.toString(16)));
   3013        return writeChunkAndReturn(destination, startSegmentMathML2);
   3014      }
   3015
   3016    case HTML_TABLE_MODE:
   3017      {
   3018        writeChunk(destination, startSegmentTable);
   3019        writeChunk(destination, responseState.segmentPrefix);
   3020        writeChunk(destination, stringToChunk(id.toString(16)));
   3021        return writeChunkAndReturn(destination, startSegmentTable2);
   3022      }
   3023    // TODO: For the rest of these, there will be extra wrapper nodes that never
   3024    // get deleted from the document. We need to delete the table too as part
   3025    // of the injected scripts. They are invisible though so it's not too terrible
   3026    // and it's kind of an edge case to suspend in a table. Totally supported though.
   3027
   3028    case HTML_TABLE_BODY_MODE:
   3029      {
   3030        writeChunk(destination, startSegmentTableBody);
   3031        writeChunk(destination, responseState.segmentPrefix);
   3032        writeChunk(destination, stringToChunk(id.toString(16)));
   3033        return writeChunkAndReturn(destination, startSegmentTableBody2);
   3034      }
   3035
   3036    case HTML_TABLE_ROW_MODE:
   3037      {
   3038        writeChunk(destination, startSegmentTableRow);
   3039        writeChunk(destination, responseState.segmentPrefix);
   3040        writeChunk(destination, stringToChunk(id.toString(16)));
   3041        return writeChunkAndReturn(destination, startSegmentTableRow2);
   3042      }
   3043
   3044    case HTML_COLGROUP_MODE:
   3045      {
   3046        writeChunk(destination, startSegmentColGroup);
   3047        writeChunk(destination, responseState.segmentPrefix);
   3048        writeChunk(destination, stringToChunk(id.toString(16)));
   3049        return writeChunkAndReturn(destination, startSegmentColGroup2);
   3050      }
   3051
   3052    default:
   3053      {
   3054        throw new Error('Unknown insertion mode. This is a bug in React.');
   3055      }
   3056  }
   3057}
   3058function writeEndSegment(destination, formatContext) {
   3059  switch (formatContext.insertionMode) {
   3060    case ROOT_HTML_MODE:
   3061    case HTML_MODE:
   3062      {
   3063        return writeChunkAndReturn(destination, endSegmentHTML);
   3064      }
   3065
   3066    case SVG_MODE:
   3067      {
   3068        return writeChunkAndReturn(destination, endSegmentSVG);
   3069      }
   3070
   3071    case MATHML_MODE:
   3072      {
   3073        return writeChunkAndReturn(destination, endSegmentMathML);
   3074      }
   3075
   3076    case HTML_TABLE_MODE:
   3077      {
   3078        return writeChunkAndReturn(destination, endSegmentTable);
   3079      }
   3080
   3081    case HTML_TABLE_BODY_MODE:
   3082      {
   3083        return writeChunkAndReturn(destination, endSegmentTableBody);
   3084      }
   3085
   3086    case HTML_TABLE_ROW_MODE:
   3087      {
   3088        return writeChunkAndReturn(destination, endSegmentTableRow);
   3089      }
   3090
   3091    case HTML_COLGROUP_MODE:
   3092      {
   3093        return writeChunkAndReturn(destination, endSegmentColGroup);
   3094      }
   3095
   3096    default:
   3097      {
   3098        throw new Error('Unknown insertion mode. This is a bug in React.');
   3099      }
   3100  }
   3101} // Instruction Set
   3102// The following code is the source scripts that we then minify and inline below,
   3103// with renamed function names that we hope don't collide:
   3104// const COMMENT_NODE = 8;
   3105// const SUSPENSE_START_DATA = '$';
   3106// const SUSPENSE_END_DATA = '/$';
   3107// const SUSPENSE_PENDING_START_DATA = '$?';
   3108// const SUSPENSE_FALLBACK_START_DATA = '$!';
   3109//
   3110// function clientRenderBoundary(suspenseBoundaryID, errorDigest, errorMsg, errorComponentStack) {
   3111//   // Find the fallback's first element.
   3112//   const suspenseIdNode = document.getElementById(suspenseBoundaryID);
   3113//   if (!suspenseIdNode) {
   3114//     // The user must have already navigated away from this tree.
   3115//     // E.g. because the parent was hydrated.
   3116//     return;
   3117//   }
   3118//   // Find the boundary around the fallback. This is always the previous node.
   3119//   const suspenseNode = suspenseIdNode.previousSibling;
   3120//   // Tag it to be client rendered.
   3121//   suspenseNode.data = SUSPENSE_FALLBACK_START_DATA;
   3122//   // assign error metadata to first sibling
   3123//   let dataset = suspenseIdNode.dataset;
   3124//   if (errorDigest) dataset.dgst = errorDigest;
   3125//   if (errorMsg) dataset.msg = errorMsg;
   3126//   if (errorComponentStack) dataset.stck = errorComponentStack;
   3127//   // Tell React to retry it if the parent already hydrated.
   3128//   if (suspenseNode._reactRetry) {
   3129//     suspenseNode._reactRetry();
   3130//   }
   3131// }
   3132//
   3133// function completeBoundary(suspenseBoundaryID, contentID) {
   3134//   // Find the fallback's first element.
   3135//   const suspenseIdNode = document.getElementById(suspenseBoundaryID);
   3136//   const contentNode = document.getElementById(contentID);
   3137//   // We'll detach the content node so that regardless of what happens next we don't leave in the tree.
   3138//   // This might also help by not causing recalcing each time we move a child from here to the target.
   3139//   contentNode.parentNode.removeChild(contentNode);
   3140//   if (!suspenseIdNode) {
   3141//     // The user must have already navigated away from this tree.
   3142//     // E.g. because the parent was hydrated. That's fine there's nothing to do
   3143//     // but we have to make sure that we already deleted the container node.
   3144//     return;
   3145//   }
   3146//   // Find the boundary around the fallback. This is always the previous node.
   3147//   const suspenseNode = suspenseIdNode.previousSibling;
   3148//
   3149//   // Clear all the existing children. This is complicated because
   3150//   // there can be embedded Suspense boundaries in the fallback.
   3151//   // This is similar to clearSuspenseBoundary in ReactDOMHostConfig.
   3152//   // TODO: We could avoid this if we never emitted suspense boundaries in fallback trees.
   3153//   // They never hydrate anyway. However, currently we support incrementally loading the fallback.
   3154//   const parentInstance = suspenseNode.parentNode;
   3155//   let node = suspenseNode.nextSibling;
   3156//   let depth = 0;
   3157//   do {
   3158//     if (node && node.nodeType === COMMENT_NODE) {
   3159//       const data = node.data;
   3160//       if (data === SUSPENSE_END_DATA) {
   3161//         if (depth === 0) {
   3162//           break;
   3163//         } else {
   3164//           depth--;
   3165//         }
   3166//       } else if (
   3167//         data === SUSPENSE_START_DATA ||
   3168//         data === SUSPENSE_PENDING_START_DATA ||
   3169//         data === SUSPENSE_FALLBACK_START_DATA
   3170//       ) {
   3171//         depth++;
   3172//       }
   3173//     }
   3174//
   3175//     const nextNode = node.nextSibling;
   3176//     parentInstance.removeChild(node);
   3177//     node = nextNode;
   3178//   } while (node);
   3179//
   3180//   const endOfBoundary = node;
   3181//
   3182//   // Insert all the children from the contentNode between the start and end of suspense boundary.
   3183//   while (contentNode.firstChild) {
   3184//     parentInstance.insertBefore(contentNode.firstChild, endOfBoundary);
   3185//   }
   3186//   suspenseNode.data = SUSPENSE_START_DATA;
   3187//   if (suspenseNode._reactRetry) {
   3188//     suspenseNode._reactRetry();
   3189//   }
   3190// }
   3191//
   3192// function completeSegment(containerID, placeholderID) {
   3193//   const segmentContainer = document.getElementById(containerID);
   3194//   const placeholderNode = document.getElementById(placeholderID);
   3195//   // We always expect both nodes to exist here because, while we might
   3196//   // have navigated away from the main tree, we still expect the detached
   3197//   // tree to exist.
   3198//   segmentContainer.parentNode.removeChild(segmentContainer);
   3199//   while (segmentContainer.firstChild) {
   3200//     placeholderNode.parentNode.insertBefore(
   3201//       segmentContainer.firstChild,
   3202//       placeholderNode,
   3203//     );
   3204//   }
   3205//   placeholderNode.parentNode.removeChild(placeholderNode);
   3206// }
   3207
   3208var completeSegmentFunction = 'function $RS(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)}';
   3209var completeBoundaryFunction = 'function $RC(a,b){a=document.getElementById(a);b=document.getElementById(b);b.parentNode.removeChild(b);if(a){a=a.previousSibling;var f=a.parentNode,c=a.nextSibling,e=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d)if(0===e)break;else e--;else"$"!==d&&"$?"!==d&&"$!"!==d||e++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;b.firstChild;)f.insertBefore(b.firstChild,c);a.data="$";a._reactRetry&&a._reactRetry()}}';
   3210var clientRenderFunction = 'function $RX(b,c,d,e){var a=document.getElementById(b);a&&(b=a.previousSibling,b.data="$!",a=a.dataset,c&&(a.dgst=c),d&&(a.msg=d),e&&(a.stck=e),b._reactRetry&&b._reactRetry())}';
   3211var completeSegmentScript1Full = stringToPrecomputedChunk(completeSegmentFunction + ';$RS("');
   3212var completeSegmentScript1Partial = stringToPrecomputedChunk('$RS("');
   3213var completeSegmentScript2 = stringToPrecomputedChunk('","');
   3214var completeSegmentScript3 = stringToPrecomputedChunk('")</script>');
   3215function writeCompletedSegmentInstruction(destination, responseState, contentSegmentID) {
   3216  writeChunk(destination, responseState.startInlineScript);
   3217
   3218  if (!responseState.sentCompleteSegmentFunction) {
   3219    // The first time we write this, we'll need to include the full implementation.
   3220    responseState.sentCompleteSegmentFunction = true;
   3221    writeChunk(destination, completeSegmentScript1Full);
   3222  } else {
   3223    // Future calls can just reuse the same function.
   3224    writeChunk(destination, completeSegmentScript1Partial);
   3225  }
   3226
   3227  writeChunk(destination, responseState.segmentPrefix);
   3228  var formattedID = stringToChunk(contentSegmentID.toString(16));
   3229  writeChunk(destination, formattedID);
   3230  writeChunk(destination, completeSegmentScript2);
   3231  writeChunk(destination, responseState.placeholderPrefix);
   3232  writeChunk(destination, formattedID);
   3233  return writeChunkAndReturn(destination, completeSegmentScript3);
   3234}
   3235var completeBoundaryScript1Full = stringToPrecomputedChunk(completeBoundaryFunction + ';$RC("');
   3236var completeBoundaryScript1Partial = stringToPrecomputedChunk('$RC("');
   3237var completeBoundaryScript2 = stringToPrecomputedChunk('","');
   3238var completeBoundaryScript3 = stringToPrecomputedChunk('")</script>');
   3239function writeCompletedBoundaryInstruction(destination, responseState, boundaryID, contentSegmentID) {
   3240  writeChunk(destination, responseState.startInlineScript);
   3241
   3242  if (!responseState.sentCompleteBoundaryFunction) {
   3243    // The first time we write this, we'll need to include the full implementation.
   3244    responseState.sentCompleteBoundaryFunction = true;
   3245    writeChunk(destination, completeBoundaryScript1Full);
   3246  } else {
   3247    // Future calls can just reuse the same function.
   3248    writeChunk(destination, completeBoundaryScript1Partial);
   3249  }
   3250
   3251  if (boundaryID === null) {
   3252    throw new Error('An ID must have been assigned before we can complete the boundary.');
   3253  }
   3254
   3255  var formattedContentID = stringToChunk(contentSegmentID.toString(16));
   3256  writeChunk(destination, boundaryID);
   3257  writeChunk(destination, completeBoundaryScript2);
   3258  writeChunk(destination, responseState.segmentPrefix);
   3259  writeChunk(destination, formattedContentID);
   3260  return writeChunkAndReturn(destination, completeBoundaryScript3);
   3261}
   3262var clientRenderScript1Full = stringToPrecomputedChunk(clientRenderFunction + ';$RX("');
   3263var clientRenderScript1Partial = stringToPrecomputedChunk('$RX("');
   3264var clientRenderScript1A = stringToPrecomputedChunk('"');
   3265var clientRenderScript2 = stringToPrecomputedChunk(')</script>');
   3266var clientRenderErrorScriptArgInterstitial = stringToPrecomputedChunk(',');
   3267function writeClientRenderBoundaryInstruction(destination, responseState, boundaryID, errorDigest, errorMessage, errorComponentStack) {
   3268  writeChunk(destination, responseState.startInlineScript);
   3269
   3270  if (!responseState.sentClientRenderFunction) {
   3271    // The first time we write this, we'll need to include the full implementation.
   3272    responseState.sentClientRenderFunction = true;
   3273    writeChunk(destination, clientRenderScript1Full);
   3274  } else {
   3275    // Future calls can just reuse the same function.
   3276    writeChunk(destination, clientRenderScript1Partial);
   3277  }
   3278
   3279  if (boundaryID === null) {
   3280    throw new Error('An ID must have been assigned before we can complete the boundary.');
   3281  }
   3282
   3283  writeChunk(destination, boundaryID);
   3284  writeChunk(destination, clientRenderScript1A);
   3285
   3286  if (errorDigest || errorMessage || errorComponentStack) {
   3287    writeChunk(destination, clientRenderErrorScriptArgInterstitial);
   3288    writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorDigest || '')));
   3289  }
   3290
   3291  if (errorMessage || errorComponentStack) {
   3292    writeChunk(destination, clientRenderErrorScriptArgInterstitial);
   3293    writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorMessage || '')));
   3294  }
   3295
   3296  if (errorComponentStack) {
   3297    writeChunk(destination, clientRenderErrorScriptArgInterstitial);
   3298    writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorComponentStack)));
   3299  }
   3300
   3301  return writeChunkAndReturn(destination, clientRenderScript2);
   3302}
   3303var regexForJSStringsInScripts = /[<\u2028\u2029]/g;
   3304
   3305function escapeJSStringsForInstructionScripts(input) {
   3306  var escaped = JSON.stringify(input);
   3307  return escaped.replace(regexForJSStringsInScripts, function (match) {
   3308    switch (match) {
   3309      // santizing breaking out of strings and script tags
   3310      case '<':
   3311        return "\\u003c";
   3312
   3313      case "\u2028":
   3314        return "\\u2028";
   3315
   3316      case "\u2029":
   3317        return "\\u2029";
   3318
   3319      default:
   3320        {
   3321          // eslint-disable-next-line react-internal/prod-error-codes
   3322          throw new Error('escapeJSStringsForInstructionScripts encountered a match it does not know how to replace. this means the match regex and the replacement characters are no longer in sync. This is a bug in React');
   3323        }
   3324    }
   3325  });
   3326}
   3327
   3328function createResponseState$1(generateStaticMarkup, identifierPrefix) {
   3329  var responseState = createResponseState(identifierPrefix, undefined);
   3330  return {
   3331    // Keep this in sync with ReactDOMServerFormatConfig
   3332    bootstrapChunks: responseState.bootstrapChunks,
   3333    startInlineScript: responseState.startInlineScript,
   3334    placeholderPrefix: responseState.placeholderPrefix,
   3335    segmentPrefix: responseState.segmentPrefix,
   3336    boundaryPrefix: responseState.boundaryPrefix,
   3337    idPrefix: responseState.idPrefix,
   3338    nextSuspenseID: responseState.nextSuspenseID,
   3339    sentCompleteSegmentFunction: responseState.sentCompleteSegmentFunction,
   3340    sentCompleteBoundaryFunction: responseState.sentCompleteBoundaryFunction,
   3341    sentClientRenderFunction: responseState.sentClientRenderFunction,
   3342    // This is an extra field for the legacy renderer
   3343    generateStaticMarkup: generateStaticMarkup
   3344  };
   3345}
   3346function createRootFormatContext() {
   3347  return {
   3348    insertionMode: HTML_MODE,
   3349    // We skip the root mode because we don't want to emit the DOCTYPE in legacy mode.
   3350    selectedValue: null
   3351  };
   3352}
   3353function pushTextInstance$1(target, text, responseState, textEmbedded) {
   3354  if (responseState.generateStaticMarkup) {
   3355    target.push(stringToChunk(escapeTextForBrowser(text)));
   3356    return false;
   3357  } else {
   3358    return pushTextInstance(target, text, responseState, textEmbedded);
   3359  }
   3360}
   3361function pushSegmentFinale$1(target, responseState, lastPushedText, textEmbedded) {
   3362  if (responseState.generateStaticMarkup) {
   3363    return;
   3364  } else {
   3365    return pushSegmentFinale(target, responseState, lastPushedText, textEmbedded);
   3366  }
   3367}
   3368function writeStartCompletedSuspenseBoundary$1(destination, responseState) {
   3369  if (responseState.generateStaticMarkup) {
   3370    // A completed boundary is done and doesn't need a representation in the HTML
   3371    // if we're not going to be hydrating it.
   3372    return true;
   3373  }
   3374
   3375  return writeStartCompletedSuspenseBoundary(destination);
   3376}
   3377function writeStartClientRenderedSuspenseBoundary$1(destination, responseState, // flushing these error arguments are not currently supported in this legacy streaming format.
   3378errorDigest, errorMessage, errorComponentStack) {
   3379  if (responseState.generateStaticMarkup) {
   3380    // A client rendered boundary is done and doesn't need a representation in the HTML
   3381    // since we'll never hydrate it. This is arguably an error in static generation.
   3382    return true;
   3383  }
   3384
   3385  return writeStartClientRenderedSuspenseBoundary(destination, responseState, errorDigest, errorMessage, errorComponentStack);
   3386}
   3387function writeEndCompletedSuspenseBoundary$1(destination, responseState) {
   3388  if (responseState.generateStaticMarkup) {
   3389    return true;
   3390  }
   3391
   3392  return writeEndCompletedSuspenseBoundary(destination);
   3393}
   3394function writeEndClientRenderedSuspenseBoundary$1(destination, responseState) {
   3395  if (responseState.generateStaticMarkup) {
   3396    return true;
   3397  }
   3398
   3399  return writeEndClientRenderedSuspenseBoundary(destination);
   3400}
   3401
   3402var assign = Object.assign;
   3403
   3404// ATTENTION
   3405// When adding new symbols to this file,
   3406// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
   3407// The Symbol used to tag the ReactElement-like types.
   3408var REACT_ELEMENT_TYPE = Symbol.for('react.element');
   3409var REACT_PORTAL_TYPE = Symbol.for('react.portal');
   3410var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
   3411var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
   3412var REACT_PROFILER_TYPE = Symbol.for('react.profiler');
   3413var REACT_PROVIDER_TYPE = Symbol.for('react.provider');
   3414var REACT_CONTEXT_TYPE = Symbol.for('react.context');
   3415var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
   3416var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
   3417var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
   3418var REACT_MEMO_TYPE = Symbol.for('react.memo');
   3419var REACT_LAZY_TYPE = Symbol.for('react.lazy');
   3420var REACT_SCOPE_TYPE = Symbol.for('react.scope');
   3421var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode');
   3422var REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
   3423var REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = Symbol.for('react.default_value');
   3424var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
   3425var FAUX_ITERATOR_SYMBOL = '@@iterator';
   3426function getIteratorFn(maybeIterable) {
   3427  if (maybeIterable === null || typeof maybeIterable !== 'object') {
   3428    return null;
   3429  }
   3430
   3431  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
   3432
   3433  if (typeof maybeIterator === 'function') {
   3434    return maybeIterator;
   3435  }
   3436
   3437  return null;
   3438}
   3439
   3440function getWrappedName(outerType, innerType, wrapperName) {
   3441  var displayName = outerType.displayName;
   3442
   3443  if (displayName) {
   3444    return displayName;
   3445  }
   3446
   3447  var functionName = innerType.displayName || innerType.name || '';
   3448  return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName;
   3449} // Keep in sync with react-reconciler/getComponentNameFromFiber
   3450
   3451
   3452function getContextName(type) {
   3453  return type.displayName || 'Context';
   3454} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.
   3455
   3456
   3457function getComponentNameFromType(type) {
   3458  if (type == null) {
   3459    // Host root, text node or just invalid type.
   3460    return null;
   3461  }
   3462
   3463  {
   3464    if (typeof type.tag === 'number') {
   3465      error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');
   3466    }
   3467  }
   3468
   3469  if (typeof type === 'function') {
   3470    return type.displayName || type.name || null;
   3471  }
   3472
   3473  if (typeof type === 'string') {
   3474    return type;
   3475  }
   3476
   3477  switch (type) {
   3478    case REACT_FRAGMENT_TYPE:
   3479      return 'Fragment';
   3480
   3481    case REACT_PORTAL_TYPE:
   3482      return 'Portal';
   3483
   3484    case REACT_PROFILER_TYPE:
   3485      return 'Profiler';
   3486
   3487    case REACT_STRICT_MODE_TYPE:
   3488      return 'StrictMode';
   3489
   3490    case REACT_SUSPENSE_TYPE:
   3491      return 'Suspense';
   3492
   3493    case REACT_SUSPENSE_LIST_TYPE:
   3494      return 'SuspenseList';
   3495
   3496  }
   3497
   3498  if (typeof type === 'object') {
   3499    switch (type.$$typeof) {
   3500      case REACT_CONTEXT_TYPE:
   3501        var context = type;
   3502        return getContextName(context) + '.Consumer';
   3503
   3504      case REACT_PROVIDER_TYPE:
   3505        var provider = type;
   3506        return getContextName(provider._context) + '.Provider';
   3507
   3508      case REACT_FORWARD_REF_TYPE:
   3509        return getWrappedName(type, type.render, 'ForwardRef');
   3510
   3511      case REACT_MEMO_TYPE:
   3512        var outerName = type.displayName || null;
   3513
   3514        if (outerName !== null) {
   3515          return outerName;
   3516        }
   3517
   3518        return getComponentNameFromType(type.type) || 'Memo';
   3519
   3520      case REACT_LAZY_TYPE:
   3521        {
   3522          var lazyComponent = type;
   3523          var payload = lazyComponent._payload;
   3524          var init = lazyComponent._init;
   3525
   3526          try {
   3527            return getComponentNameFromType(init(payload));
   3528          } catch (x) {
   3529            return null;
   3530          }
   3531        }
   3532
   3533      // eslint-disable-next-line no-fallthrough
   3534    }
   3535  }
   3536
   3537  return null;
   3538}
   3539
   3540// Helpers to patch console.logs to avoid logging during side-effect free
   3541// replaying on render function. This currently only patches the object
   3542// lazily which won't cover if the log function was extracted eagerly.
   3543// We could also eagerly patch the method.
   3544var disabledDepth = 0;
   3545var prevLog;
   3546var prevInfo;
   3547var prevWarn;
   3548var prevError;
   3549var prevGroup;
   3550var prevGroupCollapsed;
   3551var prevGroupEnd;
   3552
   3553function disabledLog() {}
   3554
   3555disabledLog.__reactDisabledLog = true;
   3556function disableLogs() {
   3557  {
   3558    if (disabledDepth === 0) {
   3559      /* eslint-disable react-internal/no-production-logging */
   3560      prevLog = console.log;
   3561      prevInfo = console.info;
   3562      prevWarn = console.warn;
   3563      prevError = console.error;
   3564      prevGroup = console.group;
   3565      prevGroupCollapsed = console.groupCollapsed;
   3566      prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
   3567
   3568      var props = {
   3569        configurable: true,
   3570        enumerable: true,
   3571        value: disabledLog,
   3572        writable: true
   3573      }; // $FlowFixMe Flow thinks console is immutable.
   3574
   3575      Object.defineProperties(console, {
   3576        info: props,
   3577        log: props,
   3578        warn: props,
   3579        error: props,
   3580        group: props,
   3581        groupCollapsed: props,
   3582        groupEnd: props
   3583      });
   3584      /* eslint-enable react-internal/no-production-logging */
   3585    }
   3586
   3587    disabledDepth++;
   3588  }
   3589}
   3590function reenableLogs() {
   3591  {
   3592    disabledDepth--;
   3593
   3594    if (disabledDepth === 0) {
   3595      /* eslint-disable react-internal/no-production-logging */
   3596      var props = {
   3597        configurable: true,
   3598        enumerable: true,
   3599        writable: true
   3600      }; // $FlowFixMe Flow thinks console is immutable.
   3601
   3602      Object.defineProperties(console, {
   3603        log: assign({}, props, {
   3604          value: prevLog
   3605        }),
   3606        info: assign({}, props, {
   3607          value: prevInfo
   3608        }),
   3609        warn: assign({}, props, {
   3610          value: prevWarn
   3611        }),
   3612        error: assign({}, props, {
   3613          value: prevError
   3614        }),
   3615        group: assign({}, props, {
   3616          value: prevGroup
   3617        }),
   3618        groupCollapsed: assign({}, props, {
   3619          value: prevGroupCollapsed
   3620        }),
   3621        groupEnd: assign({}, props, {
   3622          value: prevGroupEnd
   3623        })
   3624      });
   3625      /* eslint-enable react-internal/no-production-logging */
   3626    }
   3627
   3628    if (disabledDepth < 0) {
   3629      error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
   3630    }
   3631  }
   3632}
   3633
   3634var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
   3635var prefix;
   3636function describeBuiltInComponentFrame(name, source, ownerFn) {
   3637  {
   3638    if (prefix === undefined) {
   3639      // Extract the VM specific prefix used by each line.
   3640      try {
   3641        throw Error();
   3642      } catch (x) {
   3643        var match = x.stack.trim().match(/\n( *(at )?)/);
   3644        prefix = match && match[1] || '';
   3645      }
   3646    } // We use the prefix to ensure our stacks line up with native stack frames.
   3647
   3648
   3649    return '\n' + prefix + name;
   3650  }
   3651}
   3652var reentry = false;
   3653var componentFrameCache;
   3654
   3655{
   3656  var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
   3657  componentFrameCache = new PossiblyWeakMap();
   3658}
   3659
   3660function describeNativeComponentFrame(fn, construct) {
   3661  // If something asked for a stack inside a fake render, it should get ignored.
   3662  if ( !fn || reentry) {
   3663    return '';
   3664  }
   3665
   3666  {
   3667    var frame = componentFrameCache.get(fn);
   3668
   3669    if (frame !== undefined) {
   3670      return frame;
   3671    }
   3672  }
   3673
   3674  var control;
   3675  reentry = true;
   3676  var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
   3677
   3678  Error.prepareStackTrace = undefined;
   3679  var previousDispatcher;
   3680
   3681  {
   3682    previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function
   3683    // for warnings.
   3684
   3685    ReactCurrentDispatcher.current = null;
   3686    disableLogs();
   3687  }
   3688
   3689  try {
   3690    // This should throw.
   3691    if (construct) {
   3692      // Something should be setting the props in the constructor.
   3693      var Fake = function () {
   3694        throw Error();
   3695      }; // $FlowFixMe
   3696
   3697
   3698      Object.defineProperty(Fake.prototype, 'props', {
   3699        set: function () {
   3700          // We use a throwing setter instead of frozen or non-writable props
   3701          // because that won't throw in a non-strict mode function.
   3702          throw Error();
   3703        }
   3704      });
   3705
   3706      if (typeof Reflect === 'object' && Reflect.construct) {
   3707        // We construct a different control for this case to include any extra
   3708        // frames added by the construct call.
   3709        try {
   3710          Reflect.construct(Fake, []);
   3711        } catch (x) {
   3712          control = x;
   3713        }
   3714
   3715        Reflect.construct(fn, [], Fake);
   3716      } else {
   3717        try {
   3718          Fake.call();
   3719        } catch (x) {
   3720          control = x;
   3721        }
   3722
   3723        fn.call(Fake.prototype);
   3724      }
   3725    } else {
   3726      try {
   3727        throw Error();
   3728      } catch (x) {
   3729        control = x;
   3730      }
   3731
   3732      fn();
   3733    }
   3734  } catch (sample) {
   3735    // This is inlined manually because closure doesn't do it for us.
   3736    if (sample && control && typeof sample.stack === 'string') {
   3737      // This extracts the first frame from the sample that isn't also in the control.
   3738      // Skipping one frame that we assume is the frame that calls the two.
   3739      var sampleLines = sample.stack.split('\n');
   3740      var controlLines = control.stack.split('\n');
   3741      var s = sampleLines.length - 1;
   3742      var c = controlLines.length - 1;
   3743
   3744      while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
   3745        // We expect at least one stack frame to be shared.
   3746        // Typically this will be the root most one. However, stack frames may be
   3747        // cut off due to maximum stack limits. In this case, one maybe cut off
   3748        // earlier than the other. We assume that the sample is longer or the same
   3749        // and there for cut off earlier. So we should find the root most frame in
   3750        // the sample somewhere in the control.
   3751        c--;
   3752      }
   3753
   3754      for (; s >= 1 && c >= 0; s--, c--) {
   3755        // Next we find the first one that isn't the same which should be the
   3756        // frame that called our sample function and the control.
   3757        if (sampleLines[s] !== controlLines[c]) {
   3758          // In V8, the first line is describing the message but other VMs don't.
   3759          // If we're about to return the first line, and the control is also on the same
   3760          // line, that's a pretty good indicator that our sample threw at same line as
   3761          // the control. I.e. before we entered the sample frame. So we ignore this result.
   3762          // This can happen if you passed a class to function component, or non-function.
   3763          if (s !== 1 || c !== 1) {
   3764            do {
   3765              s--;
   3766              c--; // We may still have similar intermediate frames from the construct call.
   3767              // The next one that isn't the same should be our match though.
   3768
   3769              if (c < 0 || sampleLines[s] !== controlLines[c]) {
   3770                // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
   3771                var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "<anonymous>"
   3772                // but we have a user-provided "displayName"
   3773                // splice it in to make the stack more readable.
   3774
   3775
   3776                if (fn.displayName && _frame.includes('<anonymous>')) {
   3777                  _frame = _frame.replace('<anonymous>', fn.displayName);
   3778                }
   3779
   3780                {
   3781                  if (typeof fn === 'function') {
   3782                    componentFrameCache.set(fn, _frame);
   3783                  }
   3784                } // Return the line we found.
   3785
   3786
   3787                return _frame;
   3788              }
   3789            } while (s >= 1 && c >= 0);
   3790          }
   3791
   3792          break;
   3793        }
   3794      }
   3795    }
   3796  } finally {
   3797    reentry = false;
   3798
   3799    {
   3800      ReactCurrentDispatcher.current = previousDispatcher;
   3801      reenableLogs();
   3802    }
   3803
   3804    Error.prepareStackTrace = previousPrepareStackTrace;
   3805  } // Fallback to just using the name if we couldn't make it throw.
   3806
   3807
   3808  var name = fn ? fn.displayName || fn.name : '';
   3809  var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
   3810
   3811  {
   3812    if (typeof fn === 'function') {
   3813      componentFrameCache.set(fn, syntheticFrame);
   3814    }
   3815  }
   3816
   3817  return syntheticFrame;
   3818}
   3819
   3820function describeClassComponentFrame(ctor, source, ownerFn) {
   3821  {
   3822    return describeNativeComponentFrame(ctor, true);
   3823  }
   3824}
   3825function describeFunctionComponentFrame(fn, source, ownerFn) {
   3826  {
   3827    return describeNativeComponentFrame(fn, false);
   3828  }
   3829}
   3830
   3831function shouldConstruct(Component) {
   3832  var prototype = Component.prototype;
   3833  return !!(prototype && prototype.isReactComponent);
   3834}
   3835
   3836function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
   3837
   3838  if (type == null) {
   3839    return '';
   3840  }
   3841
   3842  if (typeof type === 'function') {
   3843    {
   3844      return describeNativeComponentFrame(type, shouldConstruct(type));
   3845    }
   3846  }
   3847
   3848  if (typeof type === 'string') {
   3849    return describeBuiltInComponentFrame(type);
   3850  }
   3851
   3852  switch (type) {
   3853    case REACT_SUSPENSE_TYPE:
   3854      return describeBuiltInComponentFrame('Suspense');
   3855
   3856    case REACT_SUSPENSE_LIST_TYPE:
   3857      return describeBuiltInComponentFrame('SuspenseList');
   3858  }
   3859
   3860  if (typeof type === 'object') {
   3861    switch (type.$$typeof) {
   3862      case REACT_FORWARD_REF_TYPE:
   3863        return describeFunctionComponentFrame(type.render);
   3864
   3865      case REACT_MEMO_TYPE:
   3866        // Memo may contain any component type so we recursively resolve it.
   3867        return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
   3868
   3869      case REACT_LAZY_TYPE:
   3870        {
   3871          var lazyComponent = type;
   3872          var payload = lazyComponent._payload;
   3873          var init = lazyComponent._init;
   3874
   3875          try {
   3876            // Lazy may contain any component type so we recursively resolve it.
   3877            return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
   3878          } catch (x) {}
   3879        }
   3880    }
   3881  }
   3882
   3883  return '';
   3884}
   3885
   3886var loggedTypeFailures = {};
   3887var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
   3888
   3889function setCurrentlyValidatingElement(element) {
   3890  {
   3891    if (element) {
   3892      var owner = element._owner;
   3893      var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
   3894      ReactDebugCurrentFrame.setExtraStackFrame(stack);
   3895    } else {
   3896      ReactDebugCurrentFrame.setExtraStackFrame(null);
   3897    }
   3898  }
   3899}
   3900
   3901function checkPropTypes(typeSpecs, values, location, componentName, element) {
   3902  {
   3903    // $FlowFixMe This is okay but Flow doesn't know it.
   3904    var has = Function.call.bind(hasOwnProperty);
   3905
   3906    for (var typeSpecName in typeSpecs) {
   3907      if (has(typeSpecs, typeSpecName)) {
   3908        var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
   3909        // fail the render phase where it didn't fail before. So we log it.
   3910        // After these have been cleaned up, we'll let them throw.
   3911
   3912        try {
   3913          // This is intentionally an invariant that gets caught. It's the same
   3914          // behavior as without this statement except with a better message.
   3915          if (typeof typeSpecs[typeSpecName] !== 'function') {
   3916            // eslint-disable-next-line react-internal/prod-error-codes
   3917            var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
   3918            err.name = 'Invariant Violation';
   3919            throw err;
   3920          }
   3921
   3922          error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
   3923        } catch (ex) {
   3924          error$1 = ex;
   3925        }
   3926
   3927        if (error$1 && !(error$1 instanceof Error)) {
   3928          setCurrentlyValidatingElement(element);
   3929
   3930          error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
   3931
   3932          setCurrentlyValidatingElement(null);
   3933        }
   3934
   3935        if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
   3936          // Only monitor this failure once because there tends to be a lot of the
   3937          // same error.
   3938          loggedTypeFailures[error$1.message] = true;
   3939          setCurrentlyValidatingElement(element);
   3940
   3941          error('Failed %s type: %s', location, error$1.message);
   3942
   3943          setCurrentlyValidatingElement(null);
   3944        }
   3945      }
   3946    }
   3947  }
   3948}
   3949
   3950var warnedAboutMissingGetChildContext;
   3951
   3952{
   3953  warnedAboutMissingGetChildContext = {};
   3954}
   3955
   3956var emptyContextObject = {};
   3957
   3958{
   3959  Object.freeze(emptyContextObject);
   3960}
   3961
   3962function getMaskedContext(type, unmaskedContext) {
   3963  {
   3964    var contextTypes = type.contextTypes;
   3965
   3966    if (!contextTypes) {
   3967      return emptyContextObject;
   3968    }
   3969
   3970    var context = {};
   3971
   3972    for (var key in contextTypes) {
   3973      context[key] = unmaskedContext[key];
   3974    }
   3975
   3976    {
   3977      var name = getComponentNameFromType(type) || 'Unknown';
   3978      checkPropTypes(contextTypes, context, 'context', name);
   3979    }
   3980
   3981    return context;
   3982  }
   3983}
   3984function processChildContext(instance, type, parentContext, childContextTypes) {
   3985  {
   3986    // TODO (bvaughn) Replace this behavior with an invariant() in the future.
   3987    // It has only been added in Fiber to match the (unintentional) behavior in Stack.
   3988    if (typeof instance.getChildContext !== 'function') {
   3989      {
   3990        var componentName = getComponentNameFromType(type) || 'Unknown';
   3991
   3992        if (!warnedAboutMissingGetChildContext[componentName]) {
   3993          warnedAboutMissingGetChildContext[componentName] = true;
   3994
   3995          error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);
   3996        }
   3997      }
   3998
   3999      return parentContext;
   4000    }
   4001
   4002    var childContext = instance.getChildContext();
   4003
   4004    for (var contextKey in childContext) {
   4005      if (!(contextKey in childContextTypes)) {
   4006        throw new Error((getComponentNameFromType(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes.");
   4007      }
   4008    }
   4009
   4010    {
   4011      var name = getComponentNameFromType(type) || 'Unknown';
   4012      checkPropTypes(childContextTypes, childContext, 'child context', name);
   4013    }
   4014
   4015    return assign({}, parentContext, childContext);
   4016  }
   4017}
   4018
   4019var rendererSigil;
   4020
   4021{
   4022  // Use this to detect multiple renderers using the same context
   4023  rendererSigil = {};
   4024} // Used to store the parent path of all context overrides in a shared linked list.
   4025// Forming a reverse tree.
   4026
   4027
   4028var rootContextSnapshot = null; // We assume that this runtime owns the "current" field on all ReactContext instances.
   4029// This global (actually thread local) state represents what state all those "current",
   4030// fields are currently in.
   4031
   4032var currentActiveSnapshot = null;
   4033
   4034function popNode(prev) {
   4035  {
   4036    prev.context._currentValue2 = prev.parentValue;
   4037  }
   4038}
   4039
   4040function pushNode(next) {
   4041  {
   4042    next.context._currentValue2 = next.value;
   4043  }
   4044}
   4045
   4046function popToNearestCommonAncestor(prev, next) {
   4047  if (prev === next) ; else {
   4048    popNode(prev);
   4049    var parentPrev = prev.parent;
   4050    var parentNext = next.parent;
   4051
   4052    if (parentPrev === null) {
   4053      if (parentNext !== null) {
   4054        throw new Error('The stacks must reach the root at the same time. This is a bug in React.');
   4055      }
   4056    } else {
   4057      if (parentNext === null) {
   4058        throw new Error('The stacks must reach the root at the same time. This is a bug in React.');
   4059      }
   4060
   4061      popToNearestCommonAncestor(parentPrev, parentNext);
   4062    } // On the way back, we push the new ones that weren't common.
   4063
   4064
   4065    pushNode(next);
   4066  }
   4067}
   4068
   4069function popAllPrevious(prev) {
   4070  popNode(prev);
   4071  var parentPrev = prev.parent;
   4072
   4073  if (parentPrev !== null) {
   4074    popAllPrevious(parentPrev);
   4075  }
   4076}
   4077
   4078function pushAllNext(next) {
   4079  var parentNext = next.parent;
   4080
   4081  if (parentNext !== null) {
   4082    pushAllNext(parentNext);
   4083  }
   4084
   4085  pushNode(next);
   4086}
   4087
   4088function popPreviousToCommonLevel(prev, next) {
   4089  popNode(prev);
   4090  var parentPrev = prev.parent;
   4091
   4092  if (parentPrev === null) {
   4093    throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.');
   4094  }
   4095
   4096  if (parentPrev.depth === next.depth) {
   4097    // We found the same level. Now we just need to find a shared ancestor.
   4098    popToNearestCommonAncestor(parentPrev, next);
   4099  } else {
   4100    // We must still be deeper.
   4101    popPreviousToCommonLevel(parentPrev, next);
   4102  }
   4103}
   4104
   4105function popNextToCommonLevel(prev, next) {
   4106  var parentNext = next.parent;
   4107
   4108  if (parentNext === null) {
   4109    throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.');
   4110  }
   4111
   4112  if (prev.depth === parentNext.depth) {
   4113    // We found the same level. Now we just need to find a shared ancestor.
   4114    popToNearestCommonAncestor(prev, parentNext);
   4115  } else {
   4116    // We must still be deeper.
   4117    popNextToCommonLevel(prev, parentNext);
   4118  }
   4119
   4120  pushNode(next);
   4121} // Perform context switching to the new snapshot.
   4122// To make it cheap to read many contexts, while not suspending, we make the switch eagerly by
   4123// updating all the context's current values. That way reads, always just read the current value.
   4124// At the cost of updating contexts even if they're never read by this subtree.
   4125
   4126
   4127function switchContext(newSnapshot) {
   4128  // The basic algorithm we need to do is to pop back any contexts that are no longer on the stack.
   4129  // We also need to update any new contexts that are now on the stack with the deepest value.
   4130  // The easiest way to update new contexts is to just reapply them in reverse order from the
   4131  // perspective of the backpointers. To avoid allocating a lot when switching, we use the stack
   4132  // for that. Therefore this algorithm is recursive.
   4133  // 1) First we pop which ever snapshot tree was deepest. Popping old contexts as we go.
   4134  // 2) Then we find the nearest common ancestor from there. Popping old contexts as we go.
   4135  // 3) Then we reapply new contexts on the way back up the stack.
   4136  var prev = currentActiveSnapshot;
   4137  var next = newSnapshot;
   4138
   4139  if (prev !== next) {
   4140    if (prev === null) {
   4141      // $FlowFixMe: This has to be non-null since it's not equal to prev.
   4142      pushAllNext(next);
   4143    } else if (next === null) {
   4144      popAllPrevious(prev);
   4145    } else if (prev.depth === next.depth) {
   4146      popToNearestCommonAncestor(prev, next);
   4147    } else if (prev.depth > next.depth) {
   4148      popPreviousToCommonLevel(prev, next);
   4149    } else {
   4150      popNextToCommonLevel(prev, next);
   4151    }
   4152
   4153    currentActiveSnapshot = next;
   4154  }
   4155}
   4156function pushProvider(context, nextValue) {
   4157  var prevValue;
   4158
   4159  {
   4160    prevValue = context._currentValue2;
   4161    context._currentValue2 = nextValue;
   4162
   4163    {
   4164      if (context._currentRenderer2 !== undefined && context._currentRenderer2 !== null && context._currentRenderer2 !== rendererSigil) {
   4165        error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
   4166      }
   4167
   4168      context._currentRenderer2 = rendererSigil;
   4169    }
   4170  }
   4171
   4172  var prevNode = currentActiveSnapshot;
   4173  var newNode = {
   4174    parent: prevNode,
   4175    depth: prevNode === null ? 0 : prevNode.depth + 1,
   4176    context: context,
   4177    parentValue: prevValue,
   4178    value: nextValue
   4179  };
   4180  currentActiveSnapshot = newNode;
   4181  return newNode;
   4182}
   4183function popProvider(context) {
   4184  var prevSnapshot = currentActiveSnapshot;
   4185
   4186  if (prevSnapshot === null) {
   4187    throw new Error('Tried to pop a Context at the root of the app. This is a bug in React.');
   4188  }
   4189
   4190  {
   4191    if (prevSnapshot.context !== context) {
   4192      error('The parent context is not the expected context. This is probably a bug in React.');
   4193    }
   4194  }
   4195
   4196  {
   4197    var _value = prevSnapshot.parentValue;
   4198
   4199    if (_value === REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED) {
   4200      prevSnapshot.context._currentValue2 = prevSnapshot.context._defaultValue;
   4201    } else {
   4202      prevSnapshot.context._currentValue2 = _value;
   4203    }
   4204
   4205    {
   4206      if (context._currentRenderer2 !== undefined && context._currentRenderer2 !== null && context._currentRenderer2 !== rendererSigil) {
   4207        error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
   4208      }
   4209
   4210      context._currentRenderer2 = rendererSigil;
   4211    }
   4212  }
   4213
   4214  return currentActiveSnapshot = prevSnapshot.parent;
   4215}
   4216function getActiveContext() {
   4217  return currentActiveSnapshot;
   4218}
   4219function readContext(context) {
   4220  var value =  context._currentValue2;
   4221  return value;
   4222}
   4223
   4224/**
   4225 * `ReactInstanceMap` maintains a mapping from a public facing stateful
   4226 * instance (key) and the internal representation (value). This allows public
   4227 * methods to accept the user facing instance as an argument and map them back
   4228 * to internal methods.
   4229 *
   4230 * Note that this module is currently shared and assumed to be stateless.
   4231 * If this becomes an actual Map, that will break.
   4232 */
   4233function get(key) {
   4234  return key._reactInternals;
   4235}
   4236function set(key, value) {
   4237  key._reactInternals = value;
   4238}
   4239
   4240var didWarnAboutNoopUpdateForComponent = {};
   4241var didWarnAboutDeprecatedWillMount = {};
   4242var didWarnAboutUninitializedState;
   4243var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
   4244var didWarnAboutLegacyLifecyclesAndDerivedState;
   4245var didWarnAboutUndefinedDerivedState;
   4246var warnOnUndefinedDerivedState;
   4247var warnOnInvalidCallback;
   4248var didWarnAboutDirectlyAssigningPropsToState;
   4249var didWarnAboutContextTypeAndContextTypes;
   4250var didWarnAboutInvalidateContextType;
   4251
   4252{
   4253  didWarnAboutUninitializedState = new Set();
   4254  didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
   4255  didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
   4256  didWarnAboutDirectlyAssigningPropsToState = new Set();
   4257  didWarnAboutUndefinedDerivedState = new Set();
   4258  didWarnAboutContextTypeAndContextTypes = new Set();
   4259  didWarnAboutInvalidateContextType = new Set();
   4260  var didWarnOnInvalidCallback = new Set();
   4261
   4262  warnOnInvalidCallback = function (callback, callerName) {
   4263    if (callback === null || typeof callback === 'function') {
   4264      return;
   4265    }
   4266
   4267    var key = callerName + '_' + callback;
   4268
   4269    if (!didWarnOnInvalidCallback.has(key)) {
   4270      didWarnOnInvalidCallback.add(key);
   4271
   4272      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
   4273    }
   4274  };
   4275
   4276  warnOnUndefinedDerivedState = function (type, partialState) {
   4277    if (partialState === undefined) {
   4278      var componentName = getComponentNameFromType(type) || 'Component';
   4279
   4280      if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
   4281        didWarnAboutUndefinedDerivedState.add(componentName);
   4282
   4283        error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
   4284      }
   4285    }
   4286  };
   4287}
   4288
   4289function warnNoop(publicInstance, callerName) {
   4290  {
   4291    var _constructor = publicInstance.constructor;
   4292    var componentName = _constructor && getComponentNameFromType(_constructor) || 'ReactClass';
   4293    var warningKey = componentName + '.' + callerName;
   4294
   4295    if (didWarnAboutNoopUpdateForComponent[warningKey]) {
   4296      return;
   4297    }
   4298
   4299    error('%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op.\n\nPlease check the code for the %s component.', callerName, callerName, componentName);
   4300
   4301    didWarnAboutNoopUpdateForComponent[warningKey] = true;
   4302  }
   4303}
   4304
   4305var classComponentUpdater = {
   4306  isMounted: function (inst) {
   4307    return false;
   4308  },
   4309  enqueueSetState: function (inst, payload, callback) {
   4310    var internals = get(inst);
   4311
   4312    if (internals.queue === null) {
   4313      warnNoop(inst, 'setState');
   4314    } else {
   4315      internals.queue.push(payload);
   4316
   4317      {
   4318        if (callback !== undefined && callback !== null) {
   4319          warnOnInvalidCallback(callback, 'setState');
   4320        }
   4321      }
   4322    }
   4323  },
   4324  enqueueReplaceState: function (inst, payload, callback) {
   4325    var internals = get(inst);
   4326    internals.replace = true;
   4327    internals.queue = [payload];
   4328
   4329    {
   4330      if (callback !== undefined && callback !== null) {
   4331        warnOnInvalidCallback(callback, 'setState');
   4332      }
   4333    }
   4334  },
   4335  enqueueForceUpdate: function (inst, callback) {
   4336    var internals = get(inst);
   4337
   4338    if (internals.queue === null) {
   4339      warnNoop(inst, 'forceUpdate');
   4340    } else {
   4341      {
   4342        if (callback !== undefined && callback !== null) {
   4343          warnOnInvalidCallback(callback, 'setState');
   4344        }
   4345      }
   4346    }
   4347  }
   4348};
   4349
   4350function applyDerivedStateFromProps(instance, ctor, getDerivedStateFromProps, prevState, nextProps) {
   4351  var partialState = getDerivedStateFromProps(nextProps, prevState);
   4352
   4353  {
   4354    warnOnUndefinedDerivedState(ctor, partialState);
   4355  } // Merge the partial state and the previous state.
   4356
   4357
   4358  var newState = partialState === null || partialState === undefined ? prevState : assign({}, prevState, partialState);
   4359  return newState;
   4360}
   4361
   4362function constructClassInstance(ctor, props, maskedLegacyContext) {
   4363  var context = emptyContextObject;
   4364  var contextType = ctor.contextType;
   4365
   4366  {
   4367    if ('contextType' in ctor) {
   4368      var isValid = // Allow null for conditional declaration
   4369      contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
   4370
   4371      if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
   4372        didWarnAboutInvalidateContextType.add(ctor);
   4373        var addendum = '';
   4374
   4375        if (contextType === undefined) {
   4376          addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';
   4377        } else if (typeof contextType !== 'object') {
   4378          addendum = ' However, it is set to a ' + typeof contextType + '.';
   4379        } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
   4380          addendum = ' Did you accidentally pass the Context.Provider instead?';
   4381        } else if (contextType._context !== undefined) {
   4382          // <Context.Consumer>
   4383          addendum = ' Did you accidentally pass the Context.Consumer instead?';
   4384        } else {
   4385          addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
   4386        }
   4387
   4388        error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentNameFromType(ctor) || 'Component', addendum);
   4389      }
   4390    }
   4391  }
   4392
   4393  if (typeof contextType === 'object' && contextType !== null) {
   4394    context = readContext(contextType);
   4395  } else {
   4396    context = maskedLegacyContext;
   4397  }
   4398
   4399  var instance = new ctor(props, context);
   4400
   4401  {
   4402    if (typeof ctor.getDerivedStateFromProps === 'function' && (instance.state === null || instance.state === undefined)) {
   4403      var componentName = getComponentNameFromType(ctor) || 'Component';
   4404
   4405      if (!didWarnAboutUninitializedState.has(componentName)) {
   4406        didWarnAboutUninitializedState.add(componentName);
   4407
   4408        error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);
   4409      }
   4410    } // If new component APIs are defined, "unsafe" lifecycles won't be called.
   4411    // Warn about these lifecycles if they are present.
   4412    // Don't warn about react-lifecycles-compat polyfilled methods though.
   4413
   4414
   4415    if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
   4416      var foundWillMountName = null;
   4417      var foundWillReceivePropsName = null;
   4418      var foundWillUpdateName = null;
   4419
   4420      if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
   4421        foundWillMountName = 'componentWillMount';
   4422      } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
   4423        foundWillMountName = 'UNSAFE_componentWillMount';
   4424      }
   4425
   4426      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
   4427        foundWillReceivePropsName = 'componentWillReceiveProps';
   4428      } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
   4429        foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
   4430      }
   4431
   4432      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
   4433        foundWillUpdateName = 'componentWillUpdate';
   4434      } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
   4435        foundWillUpdateName = 'UNSAFE_componentWillUpdate';
   4436      }
   4437
   4438      if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
   4439        var _componentName = getComponentNameFromType(ctor) || 'Component';
   4440
   4441        var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
   4442
   4443        if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
   4444          didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
   4445
   4446          error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n  " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n  " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n  " + foundWillUpdateName : '');
   4447        }
   4448      }
   4449    }
   4450  }
   4451
   4452  return instance;
   4453}
   4454
   4455function checkClassInstance(instance, ctor, newProps) {
   4456  {
   4457    var name = getComponentNameFromType(ctor) || 'Component';
   4458    var renderPresent = instance.render;
   4459
   4460    if (!renderPresent) {
   4461      if (ctor.prototype && typeof ctor.prototype.render === 'function') {
   4462        error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
   4463      } else {
   4464        error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
   4465      }
   4466    }
   4467
   4468    if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
   4469      error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);
   4470    }
   4471
   4472    if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
   4473      error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);
   4474    }
   4475
   4476    if (instance.propTypes) {
   4477      error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);
   4478    }
   4479
   4480    if (instance.contextType) {
   4481      error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);
   4482    }
   4483
   4484    {
   4485      if (instance.contextTypes) {
   4486        error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);
   4487      }
   4488
   4489      if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
   4490        didWarnAboutContextTypeAndContextTypes.add(ctor);
   4491
   4492        error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
   4493      }
   4494    }
   4495
   4496    if (typeof instance.componentShouldUpdate === 'function') {
   4497      error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);
   4498    }
   4499
   4500    if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
   4501      error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentNameFromType(ctor) || 'A pure component');
   4502    }
   4503
   4504    if (typeof instance.componentDidUnmount === 'function') {
   4505      error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);
   4506    }
   4507
   4508    if (typeof instance.componentDidReceiveProps === 'function') {
   4509      error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);
   4510    }
   4511
   4512    if (typeof instance.componentWillRecieveProps === 'function') {
   4513      error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);
   4514    }
   4515
   4516    if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {
   4517      error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);
   4518    }
   4519
   4520    var hasMutatedProps = instance.props !== newProps;
   4521
   4522    if (instance.props !== undefined && hasMutatedProps) {
   4523      error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name);
   4524    }
   4525
   4526    if (instance.defaultProps) {
   4527      error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);
   4528    }
   4529
   4530    if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
   4531      didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
   4532
   4533      error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentNameFromType(ctor));
   4534    }
   4535
   4536    if (typeof instance.getDerivedStateFromProps === 'function') {
   4537      error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
   4538    }
   4539
   4540    if (typeof instance.getDerivedStateFromError === 'function') {
   4541      error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
   4542    }
   4543
   4544    if (typeof ctor.getSnapshotBeforeUpdate === 'function') {
   4545      error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);
   4546    }
   4547
   4548    var _state = instance.state;
   4549
   4550    if (_state && (typeof _state !== 'object' || isArray(_state))) {
   4551      error('%s.state: must be set to an object or null', name);
   4552    }
   4553
   4554    if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {
   4555      error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);
   4556    }
   4557  }
   4558}
   4559
   4560function callComponentWillMount(type, instance) {
   4561  var oldState = instance.state;
   4562
   4563  if (typeof instance.componentWillMount === 'function') {
   4564    {
   4565      if ( instance.componentWillMount.__suppressDeprecationWarning !== true) {
   4566        var componentName = getComponentNameFromType(type) || 'Unknown';
   4567
   4568        if (!didWarnAboutDeprecatedWillMount[componentName]) {
   4569          warn( // keep this warning in sync with ReactStrictModeWarning.js
   4570          'componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code from componentWillMount to componentDidMount (preferred in most cases) ' + 'or the constructor.\n' + '\nPlease update the following components: %s', componentName);
   4571
   4572          didWarnAboutDeprecatedWillMount[componentName] = true;
   4573        }
   4574      }
   4575    }
   4576
   4577    instance.componentWillMount();
   4578  }
   4579
   4580  if (typeof instance.UNSAFE_componentWillMount === 'function') {
   4581    instance.UNSAFE_componentWillMount();
   4582  }
   4583
   4584  if (oldState !== instance.state) {
   4585    {
   4586      error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentNameFromType(type) || 'Component');
   4587    }
   4588
   4589    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
   4590  }
   4591}
   4592
   4593function processUpdateQueue(internalInstance, inst, props, maskedLegacyContext) {
   4594  if (internalInstance.queue !== null && internalInstance.queue.length > 0) {
   4595    var oldQueue = internalInstance.queue;
   4596    var oldReplace = internalInstance.replace;
   4597    internalInstance.queue = null;
   4598    internalInstance.replace = false;
   4599
   4600    if (oldReplace && oldQueue.length === 1) {
   4601      inst.state = oldQueue[0];
   4602    } else {
   4603      var nextState = oldReplace ? oldQueue[0] : inst.state;
   4604      var dontMutate = true;
   4605
   4606      for (var i = oldReplace ? 1 : 0; i < oldQueue.length; i++) {
   4607        var partial = oldQueue[i];
   4608        var partialState = typeof partial === 'function' ? partial.call(inst, nextState, props, maskedLegacyContext) : partial;
   4609
   4610        if (partialState != null) {
   4611          if (dontMutate) {
   4612            dontMutate = false;
   4613            nextState = assign({}, nextState, partialState);
   4614          } else {
   4615            assign(nextState, partialState);
   4616          }
   4617        }
   4618      }
   4619
   4620      inst.state = nextState;
   4621    }
   4622  } else {
   4623    internalInstance.queue = null;
   4624  }
   4625} // Invokes the mount life-cycles on a previously never rendered instance.
   4626
   4627
   4628function mountClassInstance(instance, ctor, newProps, maskedLegacyContext) {
   4629  {
   4630    checkClassInstance(instance, ctor, newProps);
   4631  }
   4632
   4633  var initialState = instance.state !== undefined ? instance.state : null;
   4634  instance.updater = classComponentUpdater;
   4635  instance.props = newProps;
   4636  instance.state = initialState; // We don't bother initializing the refs object on the server, since we're not going to resolve them anyway.
   4637  // The internal instance will be used to manage updates that happen during this mount.
   4638
   4639  var internalInstance = {
   4640    queue: [],
   4641    replace: false
   4642  };
   4643  set(instance, internalInstance);
   4644  var contextType = ctor.contextType;
   4645
   4646  if (typeof contextType === 'object' && contextType !== null) {
   4647    instance.context = readContext(contextType);
   4648  } else {
   4649    instance.context = maskedLegacyContext;
   4650  }
   4651
   4652  {
   4653    if (instance.state === newProps) {
   4654      var componentName = getComponentNameFromType(ctor) || 'Component';
   4655
   4656      if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
   4657        didWarnAboutDirectlyAssigningPropsToState.add(componentName);
   4658
   4659        error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName);
   4660      }
   4661    }
   4662  }
   4663
   4664  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
   4665
   4666  if (typeof getDerivedStateFromProps === 'function') {
   4667    instance.state = applyDerivedStateFromProps(instance, ctor, getDerivedStateFromProps, initialState, newProps);
   4668  } // In order to support react-lifecycles-compat polyfilled components,
   4669  // Unsafe lifecycles should not be invoked for components using the new APIs.
   4670
   4671
   4672  if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
   4673    callComponentWillMount(ctor, instance); // If we had additional state updates during this life-cycle, let's
   4674    // process them now.
   4675
   4676    processUpdateQueue(internalInstance, instance, newProps, maskedLegacyContext);
   4677  }
   4678}
   4679
   4680// Ids are base 32 strings whose binary representation corresponds to the
   4681// position of a node in a tree.
   4682// Every time the tree forks into multiple children, we add additional bits to
   4683// the left of the sequence that represent the position of the child within the
   4684// current level of children.
   4685//
   4686//      00101       00010001011010101
   4687//      ╰─┬─╯       ╰───────┬───────╯
   4688//   Fork 5 of 20       Parent id
   4689//
   4690// The leading 0s are important. In the above example, you only need 3 bits to
   4691// represent slot 5. However, you need 5 bits to represent all the forks at
   4692// the current level, so we must account for the empty bits at the end.
   4693//
   4694// For this same reason, slots are 1-indexed instead of 0-indexed. Otherwise,
   4695// the zeroth id at a level would be indistinguishable from its parent.
   4696//
   4697// If a node has only one child, and does not materialize an id (i.e. does not
   4698// contain a useId hook), then we don't need to allocate any space in the
   4699// sequence. It's treated as a transparent indirection. For example, these two
   4700// trees produce the same ids:
   4701//
   4702// <>                          <>
   4703//   <Indirection>               <A />
   4704//     <A />                     <B />
   4705//   </Indirection>            </>
   4706//   <B />
   4707// </>
   4708//
   4709// However, we cannot skip any node that materializes an id. Otherwise, a parent
   4710// id that does not fork would be indistinguishable from its child id. For
   4711// example, this tree does not fork, but the parent and child must have
   4712// different ids.
   4713//
   4714// <Parent>
   4715//   <Child />
   4716// </Parent>
   4717//
   4718// To handle this scenario, every time we materialize an id, we allocate a
   4719// new level with a single slot. You can think of this as a fork with only one
   4720// prong, or an array of children with length 1.
   4721//
   4722// It's possible for the size of the sequence to exceed 32 bits, the max
   4723// size for bitwise operations. When this happens, we make more room by
   4724// converting the right part of the id to a string and storing it in an overflow
   4725// variable. We use a base 32 string representation, because 32 is the largest
   4726// power of 2 that is supported by toString(). We want the base to be large so
   4727// that the resulting ids are compact, and we want the base to be a power of 2
   4728// because every log2(base) bits corresponds to a single character, i.e. every
   4729// log2(32) = 5 bits. That means we can lop bits off the end 5 at a time without
   4730// affecting the final result.
   4731var emptyTreeContext = {
   4732  id: 1,
   4733  overflow: ''
   4734};
   4735function getTreeId(context) {
   4736  var overflow = context.overflow;
   4737  var idWithLeadingBit = context.id;
   4738  var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit);
   4739  return id.toString(32) + overflow;
   4740}
   4741function pushTreeContext(baseContext, totalChildren, index) {
   4742  var baseIdWithLeadingBit = baseContext.id;
   4743  var baseOverflow = baseContext.overflow; // The leftmost 1 marks the end of the sequence, non-inclusive. It's not part
   4744  // of the id; we use it to account for leading 0s.
   4745
   4746  var baseLength = getBitLength(baseIdWithLeadingBit) - 1;
   4747  var baseId = baseIdWithLeadingBit & ~(1 << baseLength);
   4748  var slot = index + 1;
   4749  var length = getBitLength(totalChildren) + baseLength; // 30 is the max length we can store without overflowing, taking into
   4750  // consideration the leading 1 we use to mark the end of the sequence.
   4751
   4752  if (length > 30) {
   4753    // We overflowed the bitwise-safe range. Fall back to slower algorithm.
   4754    // This branch assumes the length of the base id is greater than 5; it won't
   4755    // work for smaller ids, because you need 5 bits per character.
   4756    //
   4757    // We encode the id in multiple steps: first the base id, then the
   4758    // remaining digits.
   4759    //
   4760    // Each 5 bit sequence corresponds to a single base 32 character. So for
   4761    // example, if the current id is 23 bits long, we can convert 20 of those
   4762    // bits into a string of 4 characters, with 3 bits left over.
   4763    //
   4764    // First calculate how many bits in the base id represent a complete
   4765    // sequence of characters.
   4766    var numberOfOverflowBits = baseLength - baseLength % 5; // Then create a bitmask that selects only those bits.
   4767
   4768    var newOverflowBits = (1 << numberOfOverflowBits) - 1; // Select the bits, and convert them to a base 32 string.
   4769
   4770    var newOverflow = (baseId & newOverflowBits).toString(32); // Now we can remove those bits from the base id.
   4771
   4772    var restOfBaseId = baseId >> numberOfOverflowBits;
   4773    var restOfBaseLength = baseLength - numberOfOverflowBits; // Finally, encode the rest of the bits using the normal algorithm. Because
   4774    // we made more room, this time it won't overflow.
   4775
   4776    var restOfLength = getBitLength(totalChildren) + restOfBaseLength;
   4777    var restOfNewBits = slot << restOfBaseLength;
   4778    var id = restOfNewBits | restOfBaseId;
   4779    var overflow = newOverflow + baseOverflow;
   4780    return {
   4781      id: 1 << restOfLength | id,
   4782      overflow: overflow
   4783    };
   4784  } else {
   4785    // Normal path
   4786    var newBits = slot << baseLength;
   4787
   4788    var _id = newBits | baseId;
   4789
   4790    var _overflow = baseOverflow;
   4791    return {
   4792      id: 1 << length | _id,
   4793      overflow: _overflow
   4794    };
   4795  }
   4796}
   4797
   4798function getBitLength(number) {
   4799  return 32 - clz32(number);
   4800}
   4801
   4802function getLeadingBit(id) {
   4803  return 1 << getBitLength(id) - 1;
   4804} // TODO: Math.clz32 is supported in Node 12+. Maybe we can drop the fallback.
   4805
   4806
   4807var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros.
   4808// Based on:
   4809// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
   4810
   4811var log = Math.log;
   4812var LN2 = Math.LN2;
   4813
   4814function clz32Fallback(x) {
   4815  var asUint = x >>> 0;
   4816
   4817  if (asUint === 0) {
   4818    return 32;
   4819  }
   4820
   4821  return 31 - (log(asUint) / LN2 | 0) | 0;
   4822}
   4823
   4824/**
   4825 * inlined Object.is polyfill to avoid requiring consumers ship their own
   4826 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
   4827 */
   4828function is(x, y) {
   4829  return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
   4830  ;
   4831}
   4832
   4833var objectIs = typeof Object.is === 'function' ? Object.is : is;
   4834
   4835var currentlyRenderingComponent = null;
   4836var currentlyRenderingTask = null;
   4837var firstWorkInProgressHook = null;
   4838var workInProgressHook = null; // Whether the work-in-progress hook is a re-rendered hook
   4839
   4840var isReRender = false; // Whether an update was scheduled during the currently executing render pass.
   4841
   4842var didScheduleRenderPhaseUpdate = false; // Counts the number of useId hooks in this component
   4843
   4844var localIdCounter = 0; // Lazily created map of render-phase updates
   4845
   4846var renderPhaseUpdates = null; // Counter to prevent infinite loops.
   4847
   4848var numberOfReRenders = 0;
   4849var RE_RENDER_LIMIT = 25;
   4850var isInHookUserCodeInDev = false; // In DEV, this is the name of the currently executing primitive hook
   4851
   4852var currentHookNameInDev;
   4853
   4854function resolveCurrentlyRenderingComponent() {
   4855  if (currentlyRenderingComponent === null) {
   4856    throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.');
   4857  }
   4858
   4859  {
   4860    if (isInHookUserCodeInDev) {
   4861      error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks');
   4862    }
   4863  }
   4864
   4865  return currentlyRenderingComponent;
   4866}
   4867
   4868function areHookInputsEqual(nextDeps, prevDeps) {
   4869  if (prevDeps === null) {
   4870    {
   4871      error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);
   4872    }
   4873
   4874    return false;
   4875  }
   4876
   4877  {
   4878    // Don't bother comparing lengths in prod because these arrays should be
   4879    // passed inline.
   4880    if (nextDeps.length !== prevDeps.length) {
   4881      error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + nextDeps.join(', ') + "]", "[" + prevDeps.join(', ') + "]");
   4882    }
   4883  }
   4884
   4885  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
   4886    if (objectIs(nextDeps[i], prevDeps[i])) {
   4887      continue;
   4888    }
   4889
   4890    return false;
   4891  }
   4892
   4893  return true;
   4894}
   4895
   4896function createHook() {
   4897  if (numberOfReRenders > 0) {
   4898    throw new Error('Rendered more hooks than during the previous render');
   4899  }
   4900
   4901  return {
   4902    memoizedState: null,
   4903    queue: null,
   4904    next: null
   4905  };
   4906}
   4907
   4908function createWorkInProgressHook() {
   4909  if (workInProgressHook === null) {
   4910    // This is the first hook in the list
   4911    if (firstWorkInProgressHook === null) {
   4912      isReRender = false;
   4913      firstWorkInProgressHook = workInProgressHook = createHook();
   4914    } else {
   4915      // There's already a work-in-progress. Reuse it.
   4916      isReRender = true;
   4917      workInProgressHook = firstWorkInProgressHook;
   4918    }
   4919  } else {
   4920    if (workInProgressHook.next === null) {
   4921      isReRender = false; // Append to the end of the list
   4922
   4923      workInProgressHook = workInProgressHook.next = createHook();
   4924    } else {
   4925      // There's already a work-in-progress. Reuse it.
   4926      isReRender = true;
   4927      workInProgressHook = workInProgressHook.next;
   4928    }
   4929  }
   4930
   4931  return workInProgressHook;
   4932}
   4933
   4934function prepareToUseHooks(task, componentIdentity) {
   4935  currentlyRenderingComponent = componentIdentity;
   4936  currentlyRenderingTask = task;
   4937
   4938  {
   4939    isInHookUserCodeInDev = false;
   4940  } // The following should have already been reset
   4941  // didScheduleRenderPhaseUpdate = false;
   4942  // localIdCounter = 0;
   4943  // firstWorkInProgressHook = null;
   4944  // numberOfReRenders = 0;
   4945  // renderPhaseUpdates = null;
   4946  // workInProgressHook = null;
   4947
   4948
   4949  localIdCounter = 0;
   4950}
   4951function finishHooks(Component, props, children, refOrContext) {
   4952  // This must be called after every function component to prevent hooks from
   4953  // being used in classes.
   4954  while (didScheduleRenderPhaseUpdate) {
   4955    // Updates were scheduled during the render phase. They are stored in
   4956    // the `renderPhaseUpdates` map. Call the component again, reusing the
   4957    // work-in-progress hooks and applying the additional updates on top. Keep
   4958    // restarting until no more updates are scheduled.
   4959    didScheduleRenderPhaseUpdate = false;
   4960    localIdCounter = 0;
   4961    numberOfReRenders += 1; // Start over from the beginning of the list
   4962
   4963    workInProgressHook = null;
   4964    children = Component(props, refOrContext);
   4965  }
   4966
   4967  resetHooksState();
   4968  return children;
   4969}
   4970function checkDidRenderIdHook() {
   4971  // This should be called immediately after every finishHooks call.
   4972  // Conceptually, it's part of the return value of finishHooks; it's only a
   4973  // separate function to avoid using an array tuple.
   4974  var didRenderIdHook = localIdCounter !== 0;
   4975  return didRenderIdHook;
   4976} // Reset the internal hooks state if an error occurs while rendering a component
   4977
   4978function resetHooksState() {
   4979  {
   4980    isInHookUserCodeInDev = false;
   4981  }
   4982
   4983  currentlyRenderingComponent = null;
   4984  currentlyRenderingTask = null;
   4985  didScheduleRenderPhaseUpdate = false;
   4986  firstWorkInProgressHook = null;
   4987  numberOfReRenders = 0;
   4988  renderPhaseUpdates = null;
   4989  workInProgressHook = null;
   4990}
   4991
   4992function readContext$1(context) {
   4993  {
   4994    if (isInHookUserCodeInDev) {
   4995      error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
   4996    }
   4997  }
   4998
   4999  return readContext(context);
   5000}
   5001
   5002function useContext(context) {
   5003  {
   5004    currentHookNameInDev = 'useContext';
   5005  }
   5006
   5007  resolveCurrentlyRenderingComponent();
   5008  return readContext(context);
   5009}
   5010
   5011function basicStateReducer(state, action) {
   5012  // $FlowFixMe: Flow doesn't like mixed types
   5013  return typeof action === 'function' ? action(state) : action;
   5014}
   5015
   5016function useState(initialState) {
   5017  {
   5018    currentHookNameInDev = 'useState';
   5019  }
   5020
   5021  return useReducer(basicStateReducer, // useReducer has a special case to support lazy useState initializers
   5022  initialState);
   5023}
   5024function useReducer(reducer, initialArg, init) {
   5025  {
   5026    if (reducer !== basicStateReducer) {
   5027      currentHookNameInDev = 'useReducer';
   5028    }
   5029  }
   5030
   5031  currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
   5032  workInProgressHook = createWorkInProgressHook();
   5033
   5034  if (isReRender) {
   5035    // This is a re-render. Apply the new render phase updates to the previous
   5036    // current hook.
   5037    var queue = workInProgressHook.queue;
   5038    var dispatch = queue.dispatch;
   5039
   5040    if (renderPhaseUpdates !== null) {
   5041      // Render phase updates are stored in a map of queue -> linked list
   5042      var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
   5043
   5044      if (firstRenderPhaseUpdate !== undefined) {
   5045        renderPhaseUpdates.delete(queue);
   5046        var newState = workInProgressHook.memoizedState;
   5047        var update = firstRenderPhaseUpdate;
   5048
   5049        do {
   5050          // Process this render phase update. We don't have to check the
   5051          // priority because it will always be the same as the current
   5052          // render's.
   5053          var action = update.action;
   5054
   5055          {
   5056            isInHookUserCodeInDev = true;
   5057          }
   5058
   5059          newState = reducer(newState, action);
   5060
   5061          {
   5062            isInHookUserCodeInDev = false;
   5063          }
   5064
   5065          update = update.next;
   5066        } while (update !== null);
   5067
   5068        workInProgressHook.memoizedState = newState;
   5069        return [newState, dispatch];
   5070      }
   5071    }
   5072
   5073    return [workInProgressHook.memoizedState, dispatch];
   5074  } else {
   5075    {
   5076      isInHookUserCodeInDev = true;
   5077    }
   5078
   5079    var initialState;
   5080
   5081    if (reducer === basicStateReducer) {
   5082      // Special case for `useState`.
   5083      initialState = typeof initialArg === 'function' ? initialArg() : initialArg;
   5084    } else {
   5085      initialState = init !== undefined ? init(initialArg) : initialArg;
   5086    }
   5087
   5088    {
   5089      isInHookUserCodeInDev = false;
   5090    }
   5091
   5092    workInProgressHook.memoizedState = initialState;
   5093
   5094    var _queue = workInProgressHook.queue = {
   5095      last: null,
   5096      dispatch: null
   5097    };
   5098
   5099    var _dispatch = _queue.dispatch = dispatchAction.bind(null, currentlyRenderingComponent, _queue);
   5100
   5101    return [workInProgressHook.memoizedState, _dispatch];
   5102  }
   5103}
   5104
   5105function useMemo(nextCreate, deps) {
   5106  currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
   5107  workInProgressHook = createWorkInProgressHook();
   5108  var nextDeps = deps === undefined ? null : deps;
   5109
   5110  if (workInProgressHook !== null) {
   5111    var prevState = workInProgressHook.memoizedState;
   5112
   5113    if (prevState !== null) {
   5114      if (nextDeps !== null) {
   5115        var prevDeps = prevState[1];
   5116
   5117        if (areHookInputsEqual(nextDeps, prevDeps)) {
   5118          return prevState[0];
   5119        }
   5120      }
   5121    }
   5122  }
   5123
   5124  {
   5125    isInHookUserCodeInDev = true;
   5126  }
   5127
   5128  var nextValue = nextCreate();
   5129
   5130  {
   5131    isInHookUserCodeInDev = false;
   5132  }
   5133
   5134  workInProgressHook.memoizedState = [nextValue, nextDeps];
   5135  return nextValue;
   5136}
   5137
   5138function useRef(initialValue) {
   5139  currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
   5140  workInProgressHook = createWorkInProgressHook();
   5141  var previousRef = workInProgressHook.memoizedState;
   5142
   5143  if (previousRef === null) {
   5144    var ref = {
   5145      current: initialValue
   5146    };
   5147
   5148    {
   5149      Object.seal(ref);
   5150    }
   5151
   5152    workInProgressHook.memoizedState = ref;
   5153    return ref;
   5154  } else {
   5155    return previousRef;
   5156  }
   5157}
   5158
   5159function useLayoutEffect(create, inputs) {
   5160  {
   5161    currentHookNameInDev = 'useLayoutEffect';
   5162
   5163    error('useLayoutEffect does nothing on the server, because its effect cannot ' + "be encoded into the server renderer's output format. This will lead " + 'to a mismatch between the initial, non-hydrated UI and the intended ' + 'UI. To avoid this, useLayoutEffect should only be used in ' + 'components that render exclusively on the client. ' + 'See https://reactjs.org/link/uselayouteffect-ssr for common fixes.');
   5164  }
   5165}
   5166
   5167function dispatchAction(componentIdentity, queue, action) {
   5168  if (numberOfReRenders >= RE_RENDER_LIMIT) {
   5169    throw new Error('Too many re-renders. React limits the number of renders to prevent ' + 'an infinite loop.');
   5170  }
   5171
   5172  if (componentIdentity === currentlyRenderingComponent) {
   5173    // This is a render phase update. Stash it in a lazily-created map of
   5174    // queue -> linked list of updates. After this render pass, we'll restart
   5175    // and apply the stashed updates on top of the work-in-progress hook.
   5176    didScheduleRenderPhaseUpdate = true;
   5177    var update = {
   5178      action: action,
   5179      next: null
   5180    };
   5181
   5182    if (renderPhaseUpdates === null) {
   5183      renderPhaseUpdates = new Map();
   5184    }
   5185
   5186    var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
   5187
   5188    if (firstRenderPhaseUpdate === undefined) {
   5189      renderPhaseUpdates.set(queue, update);
   5190    } else {
   5191      // Append the update to the end of the list.
   5192      var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
   5193
   5194      while (lastRenderPhaseUpdate.next !== null) {
   5195        lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
   5196      }
   5197
   5198      lastRenderPhaseUpdate.next = update;
   5199    }
   5200  }
   5201}
   5202
   5203function useCallback(callback, deps) {
   5204  return useMemo(function () {
   5205    return callback;
   5206  }, deps);
   5207} // TODO Decide on how to implement this hook for server rendering.
   5208// If a mutation occurs during render, consider triggering a Suspense boundary
   5209// and falling back to client rendering.
   5210
   5211function useMutableSource(source, getSnapshot, subscribe) {
   5212  resolveCurrentlyRenderingComponent();
   5213  return getSnapshot(source._source);
   5214}
   5215
   5216function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
   5217  if (getServerSnapshot === undefined) {
   5218    throw new Error('Missing getServerSnapshot, which is required for ' + 'server-rendered content. Will revert to client rendering.');
   5219  }
   5220
   5221  return getServerSnapshot();
   5222}
   5223
   5224function useDeferredValue(value) {
   5225  resolveCurrentlyRenderingComponent();
   5226  return value;
   5227}
   5228
   5229function unsupportedStartTransition() {
   5230  throw new Error('startTransition cannot be called during server rendering.');
   5231}
   5232
   5233function useTransition() {
   5234  resolveCurrentlyRenderingComponent();
   5235  return [false, unsupportedStartTransition];
   5236}
   5237
   5238function useId() {
   5239  var task = currentlyRenderingTask;
   5240  var treeId = getTreeId(task.treeContext);
   5241  var responseState = currentResponseState;
   5242
   5243  if (responseState === null) {
   5244    throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component.');
   5245  }
   5246
   5247  var localId = localIdCounter++;
   5248  return makeId(responseState, treeId, localId);
   5249}
   5250
   5251function noop() {}
   5252
   5253var Dispatcher = {
   5254  readContext: readContext$1,
   5255  useContext: useContext,
   5256  useMemo: useMemo,
   5257  useReducer: useReducer,
   5258  useRef: useRef,
   5259  useState: useState,
   5260  useInsertionEffect: noop,
   5261  useLayoutEffect: useLayoutEffect,
   5262  useCallback: useCallback,
   5263  // useImperativeHandle is not run in the server environment
   5264  useImperativeHandle: noop,
   5265  // Effects are not run in the server environment.
   5266  useEffect: noop,
   5267  // Debugging effect
   5268  useDebugValue: noop,
   5269  useDeferredValue: useDeferredValue,
   5270  useTransition: useTransition,
   5271  useId: useId,
   5272  // Subscriptions are not setup in a server environment.
   5273  useMutableSource: useMutableSource,
   5274  useSyncExternalStore: useSyncExternalStore
   5275};
   5276
   5277var currentResponseState = null;
   5278function setCurrentResponseState(responseState) {
   5279  currentResponseState = responseState;
   5280}
   5281
   5282function getStackByComponentStackNode(componentStack) {
   5283  try {
   5284    var info = '';
   5285    var node = componentStack;
   5286
   5287    do {
   5288      switch (node.tag) {
   5289        case 0:
   5290          info += describeBuiltInComponentFrame(node.type, null, null);
   5291          break;
   5292
   5293        case 1:
   5294          info += describeFunctionComponentFrame(node.type, null, null);
   5295          break;
   5296
   5297        case 2:
   5298          info += describeClassComponentFrame(node.type, null, null);
   5299          break;
   5300      }
   5301
   5302      node = node.parent;
   5303    } while (node);
   5304
   5305    return info;
   5306  } catch (x) {
   5307    return '\nError generating stack: ' + x.message + '\n' + x.stack;
   5308  }
   5309}
   5310
   5311var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
   5312var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
   5313var PENDING = 0;
   5314var COMPLETED = 1;
   5315var FLUSHED = 2;
   5316var ABORTED = 3;
   5317var ERRORED = 4;
   5318var OPEN = 0;
   5319var CLOSING = 1;
   5320var CLOSED = 2;
   5321// This is a default heuristic for how to split up the HTML content into progressive
   5322// loading. Our goal is to be able to display additional new content about every 500ms.
   5323// Faster than that is unnecessary and should be throttled on the client. It also
   5324// adds unnecessary overhead to do more splits. We don't know if it's a higher or lower
   5325// end device but higher end suffer less from the overhead than lower end does from
   5326// not getting small enough pieces. We error on the side of low end.
   5327// We base this on low end 3G speeds which is about 500kbits per second. We assume
   5328// that there can be a reasonable drop off from max bandwidth which leaves you with
   5329// as little as 80%. We can receive half of that each 500ms - at best. In practice,
   5330// a little bandwidth is lost to processing and contention - e.g. CSS and images that
   5331// are downloaded along with the main content. So we estimate about half of that to be
   5332// the lower end throughput. In other words, we expect that you can at least show
   5333// about 12.5kb of content per 500ms. Not counting starting latency for the first
   5334// paint.
   5335// 500 * 1024 / 8 * .8 * 0.5 / 2
   5336var DEFAULT_PROGRESSIVE_CHUNK_SIZE = 12800;
   5337
   5338function defaultErrorHandler(error) {
   5339  console['error'](error); // Don't transform to our wrapper
   5340
   5341  return null;
   5342}
   5343
   5344function noop$1() {}
   5345
   5346function createRequest(children, responseState, rootFormatContext, progressiveChunkSize, onError, onAllReady, onShellReady, onShellError, onFatalError) {
   5347  var pingedTasks = [];
   5348  var abortSet = new Set();
   5349  var request = {
   5350    destination: null,
   5351    responseState: responseState,
   5352    progressiveChunkSize: progressiveChunkSize === undefined ? DEFAULT_PROGRESSIVE_CHUNK_SIZE : progressiveChunkSize,
   5353    status: OPEN,
   5354    fatalError: null,
   5355    nextSegmentId: 0,
   5356    allPendingTasks: 0,
   5357    pendingRootTasks: 0,
   5358    completedRootSegment: null,
   5359    abortableTasks: abortSet,
   5360    pingedTasks: pingedTasks,
   5361    clientRenderedBoundaries: [],
   5362    completedBoundaries: [],
   5363    partialBoundaries: [],
   5364    onError: onError === undefined ? defaultErrorHandler : onError,
   5365    onAllReady: onAllReady === undefined ? noop$1 : onAllReady,
   5366    onShellReady: onShellReady === undefined ? noop$1 : onShellReady,
   5367    onShellError: onShellError === undefined ? noop$1 : onShellError,
   5368    onFatalError: onFatalError === undefined ? noop$1 : onFatalError
   5369  }; // This segment represents the root fallback.
   5370
   5371  var rootSegment = createPendingSegment(request, 0, null, rootFormatContext, // Root segments are never embedded in Text on either edge
   5372  false, false); // There is no parent so conceptually, we're unblocked to flush this segment.
   5373
   5374  rootSegment.parentFlushed = true;
   5375  var rootTask = createTask(request, children, null, rootSegment, abortSet, emptyContextObject, rootContextSnapshot, emptyTreeContext);
   5376  pingedTasks.push(rootTask);
   5377  return request;
   5378}
   5379
   5380function pingTask(request, task) {
   5381  var pingedTasks = request.pingedTasks;
   5382  pingedTasks.push(task);
   5383
   5384  if (pingedTasks.length === 1) {
   5385    scheduleWork(function () {
   5386      return performWork(request);
   5387    });
   5388  }
   5389}
   5390
   5391function createSuspenseBoundary(request, fallbackAbortableTasks) {
   5392  return {
   5393    id: UNINITIALIZED_SUSPENSE_BOUNDARY_ID,
   5394    rootSegmentID: -1,
   5395    parentFlushed: false,
   5396    pendingTasks: 0,
   5397    forceClientRender: false,
   5398    completedSegments: [],
   5399    byteSize: 0,
   5400    fallbackAbortableTasks: fallbackAbortableTasks,
   5401    errorDigest: null
   5402  };
   5403}
   5404
   5405function createTask(request, node, blockedBoundary, blockedSegment, abortSet, legacyContext, context, treeContext) {
   5406  request.allPendingTasks++;
   5407
   5408  if (blockedBoundary === null) {
   5409    request.pendingRootTasks++;
   5410  } else {
   5411    blockedBoundary.pendingTasks++;
   5412  }
   5413
   5414  var task = {
   5415    node: node,
   5416    ping: function () {
   5417      return pingTask(request, task);
   5418    },
   5419    blockedBoundary: blockedBoundary,
   5420    blockedSegment: blockedSegment,
   5421    abortSet: abortSet,
   5422    legacyContext: legacyContext,
   5423    context: context,
   5424    treeContext: treeContext
   5425  };
   5426
   5427  {
   5428    task.componentStack = null;
   5429  }
   5430
   5431  abortSet.add(task);
   5432  return task;
   5433}
   5434
   5435function createPendingSegment(request, index, boundary, formatContext, lastPushedText, textEmbedded) {
   5436  return {
   5437    status: PENDING,
   5438    id: -1,
   5439    // lazily assigned later
   5440    index: index,
   5441    parentFlushed: false,
   5442    chunks: [],
   5443    children: [],
   5444    formatContext: formatContext,
   5445    boundary: boundary,
   5446    lastPushedText: lastPushedText,
   5447    textEmbedded: textEmbedded
   5448  };
   5449} // DEV-only global reference to the currently executing task
   5450
   5451
   5452var currentTaskInDEV = null;
   5453
   5454function getCurrentStackInDEV() {
   5455  {
   5456    if (currentTaskInDEV === null || currentTaskInDEV.componentStack === null) {
   5457      return '';
   5458    }
   5459
   5460    return getStackByComponentStackNode(currentTaskInDEV.componentStack);
   5461  }
   5462}
   5463
   5464function pushBuiltInComponentStackInDEV(task, type) {
   5465  {
   5466    task.componentStack = {
   5467      tag: 0,
   5468      parent: task.componentStack,
   5469      type: type
   5470    };
   5471  }
   5472}
   5473
   5474function pushFunctionComponentStackInDEV(task, type) {
   5475  {
   5476    task.componentStack = {
   5477      tag: 1,
   5478      parent: task.componentStack,
   5479      type: type
   5480    };
   5481  }
   5482}
   5483
   5484function pushClassComponentStackInDEV(task, type) {
   5485  {
   5486    task.componentStack = {
   5487      tag: 2,
   5488      parent: task.componentStack,
   5489      type: type
   5490    };
   5491  }
   5492}
   5493
   5494function popComponentStackInDEV(task) {
   5495  {
   5496    if (task.componentStack === null) {
   5497      error('Unexpectedly popped too many stack frames. This is a bug in React.');
   5498    } else {
   5499      task.componentStack = task.componentStack.parent;
   5500    }
   5501  }
   5502} // stash the component stack of an unwinding error until it is processed
   5503
   5504
   5505var lastBoundaryErrorComponentStackDev = null;
   5506
   5507function captureBoundaryErrorDetailsDev(boundary, error) {
   5508  {
   5509    var errorMessage;
   5510
   5511    if (typeof error === 'string') {
   5512      errorMessage = error;
   5513    } else if (error && typeof error.message === 'string') {
   5514      errorMessage = error.message;
   5515    } else {
   5516      // eslint-disable-next-line react-internal/safe-string-coercion
   5517      errorMessage = String(error);
   5518    }
   5519
   5520    var errorComponentStack = lastBoundaryErrorComponentStackDev || getCurrentStackInDEV();
   5521    lastBoundaryErrorComponentStackDev = null;
   5522    boundary.errorMessage = errorMessage;
   5523    boundary.errorComponentStack = errorComponentStack;
   5524  }
   5525}
   5526
   5527function logRecoverableError(request, error) {
   5528  // If this callback errors, we intentionally let that error bubble up to become a fatal error
   5529  // so that someone fixes the error reporting instead of hiding it.
   5530  var errorDigest = request.onError(error);
   5531
   5532  if (errorDigest != null && typeof errorDigest !== 'string') {
   5533    // eslint-disable-next-line react-internal/prod-error-codes
   5534    throw new Error("onError returned something with a type other than \"string\". onError should return a string and may return null or undefined but must not return anything else. It received something of type \"" + typeof errorDigest + "\" instead");
   5535  }
   5536
   5537  return errorDigest;
   5538}
   5539
   5540function fatalError(request, error) {
   5541  // This is called outside error handling code such as if the root errors outside
   5542  // a suspense boundary or if the root suspense boundary's fallback errors.
   5543  // It's also called if React itself or its host configs errors.
   5544  var onShellError = request.onShellError;
   5545  onShellError(error);
   5546  var onFatalError = request.onFatalError;
   5547  onFatalError(error);
   5548
   5549  if (request.destination !== null) {
   5550    request.status = CLOSED;
   5551    closeWithError(request.destination, error);
   5552  } else {
   5553    request.status = CLOSING;
   5554    request.fatalError = error;
   5555  }
   5556}
   5557
   5558function renderSuspenseBoundary(request, task, props) {
   5559  pushBuiltInComponentStackInDEV(task, 'Suspense');
   5560  var parentBoundary = task.blockedBoundary;
   5561  var parentSegment = task.blockedSegment; // Each time we enter a suspense boundary, we split out into a new segment for
   5562  // the fallback so that we can later replace that segment with the content.
   5563  // This also lets us split out the main content even if it doesn't suspend,
   5564  // in case it ends up generating a large subtree of content.
   5565
   5566  var fallback = props.fallback;
   5567  var content = props.children;
   5568  var fallbackAbortSet = new Set();
   5569  var newBoundary = createSuspenseBoundary(request, fallbackAbortSet);
   5570  var insertionIndex = parentSegment.chunks.length; // The children of the boundary segment is actually the fallback.
   5571
   5572  var boundarySegment = createPendingSegment(request, insertionIndex, newBoundary, parentSegment.formatContext, // boundaries never require text embedding at their edges because comment nodes bound them
   5573  false, false);
   5574  parentSegment.children.push(boundarySegment); // The parentSegment has a child Segment at this index so we reset the lastPushedText marker on the parent
   5575
   5576  parentSegment.lastPushedText = false; // This segment is the actual child content. We can start rendering that immediately.
   5577
   5578  var contentRootSegment = createPendingSegment(request, 0, null, parentSegment.formatContext, // boundaries never require text embedding at their edges because comment nodes bound them
   5579  false, false); // We mark the root segment as having its parent flushed. It's not really flushed but there is
   5580  // no parent segment so there's nothing to wait on.
   5581
   5582  contentRootSegment.parentFlushed = true; // Currently this is running synchronously. We could instead schedule this to pingedTasks.
   5583  // I suspect that there might be some efficiency benefits from not creating the suspended task
   5584  // and instead just using the stack if possible.
   5585  // TODO: Call this directly instead of messing with saving and restoring contexts.
   5586  // We can reuse the current context and task to render the content immediately without
   5587  // context switching. We just need to temporarily switch which boundary and which segment
   5588  // we're writing to. If something suspends, it'll spawn new suspended task with that context.
   5589
   5590  task.blockedBoundary = newBoundary;
   5591  task.blockedSegment = contentRootSegment;
   5592
   5593  try {
   5594    // We use the safe form because we don't handle suspending here. Only error handling.
   5595    renderNode(request, task, content);
   5596    pushSegmentFinale$1(contentRootSegment.chunks, request.responseState, contentRootSegment.lastPushedText, contentRootSegment.textEmbedded);
   5597    contentRootSegment.status = COMPLETED;
   5598    queueCompletedSegment(newBoundary, contentRootSegment);
   5599
   5600    if (newBoundary.pendingTasks === 0) {
   5601      // This must have been the last segment we were waiting on. This boundary is now complete.
   5602      // Therefore we won't need the fallback. We early return so that we don't have to create
   5603      // the fallback.
   5604      popComponentStackInDEV(task);
   5605      return;
   5606    }
   5607  } catch (error) {
   5608    contentRootSegment.status = ERRORED;
   5609    newBoundary.forceClientRender = true;
   5610    newBoundary.errorDigest = logRecoverableError(request, error);
   5611
   5612    {
   5613      captureBoundaryErrorDetailsDev(newBoundary, error);
   5614    } // We don't need to decrement any task numbers because we didn't spawn any new task.
   5615    // We don't need to schedule any task because we know the parent has written yet.
   5616    // We do need to fallthrough to create the fallback though.
   5617
   5618  } finally {
   5619    task.blockedBoundary = parentBoundary;
   5620    task.blockedSegment = parentSegment;
   5621  } // We create suspended task for the fallback because we don't want to actually work
   5622  // on it yet in case we finish the main content, so we queue for later.
   5623
   5624
   5625  var suspendedFallbackTask = createTask(request, fallback, parentBoundary, boundarySegment, fallbackAbortSet, task.legacyContext, task.context, task.treeContext);
   5626
   5627  {
   5628    suspendedFallbackTask.componentStack = task.componentStack;
   5629  } // TODO: This should be queued at a separate lower priority queue so that we only work
   5630  // on preparing fallbacks if we don't have any more main content to task on.
   5631
   5632
   5633  request.pingedTasks.push(suspendedFallbackTask);
   5634  popComponentStackInDEV(task);
   5635}
   5636
   5637function renderHostElement(request, task, type, props) {
   5638  pushBuiltInComponentStackInDEV(task, type);
   5639  var segment = task.blockedSegment;
   5640  var children = pushStartInstance(segment.chunks, type, props, request.responseState, segment.formatContext);
   5641  segment.lastPushedText = false;
   5642  var prevContext = segment.formatContext;
   5643  segment.formatContext = getChildFormatContext(prevContext, type, props); // We use the non-destructive form because if something suspends, we still
   5644  // need to pop back up and finish this subtree of HTML.
   5645
   5646  renderNode(request, task, children); // We expect that errors will fatal the whole task and that we don't need
   5647  // the correct context. Therefore this is not in a finally.
   5648
   5649  segment.formatContext = prevContext;
   5650  pushEndInstance(segment.chunks, type);
   5651  segment.lastPushedText = false;
   5652  popComponentStackInDEV(task);
   5653}
   5654
   5655function shouldConstruct$1(Component) {
   5656  return Component.prototype && Component.prototype.isReactComponent;
   5657}
   5658
   5659function renderWithHooks(request, task, Component, props, secondArg) {
   5660  var componentIdentity = {};
   5661  prepareToUseHooks(task, componentIdentity);
   5662  var result = Component(props, secondArg);
   5663  return finishHooks(Component, props, result, secondArg);
   5664}
   5665
   5666function finishClassComponent(request, task, instance, Component, props) {
   5667  var nextChildren = instance.render();
   5668
   5669  {
   5670    if (instance.props !== props) {
   5671      if (!didWarnAboutReassigningProps) {
   5672        error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentNameFromType(Component) || 'a component');
   5673      }
   5674
   5675      didWarnAboutReassigningProps = true;
   5676    }
   5677  }
   5678
   5679  {
   5680    var childContextTypes = Component.childContextTypes;
   5681
   5682    if (childContextTypes !== null && childContextTypes !== undefined) {
   5683      var previousContext = task.legacyContext;
   5684      var mergedContext = processChildContext(instance, Component, previousContext, childContextTypes);
   5685      task.legacyContext = mergedContext;
   5686      renderNodeDestructive(request, task, nextChildren);
   5687      task.legacyContext = previousContext;
   5688      return;
   5689    }
   5690  }
   5691
   5692  renderNodeDestructive(request, task, nextChildren);
   5693}
   5694
   5695function renderClassComponent(request, task, Component, props) {
   5696  pushClassComponentStackInDEV(task, Component);
   5697  var maskedContext =  getMaskedContext(Component, task.legacyContext) ;
   5698  var instance = constructClassInstance(Component, props, maskedContext);
   5699  mountClassInstance(instance, Component, props, maskedContext);
   5700  finishClassComponent(request, task, instance, Component, props);
   5701  popComponentStackInDEV(task);
   5702}
   5703
   5704var didWarnAboutBadClass = {};
   5705var didWarnAboutModulePatternComponent = {};
   5706var didWarnAboutContextTypeOnFunctionComponent = {};
   5707var didWarnAboutGetDerivedStateOnFunctionComponent = {};
   5708var didWarnAboutReassigningProps = false;
   5709var didWarnAboutGenerators = false;
   5710var didWarnAboutMaps = false;
   5711var hasWarnedAboutUsingContextAsConsumer = false; // This would typically be a function component but we still support module pattern
   5712// components for some reason.
   5713
   5714function renderIndeterminateComponent(request, task, Component, props) {
   5715  var legacyContext;
   5716
   5717  {
   5718    legacyContext = getMaskedContext(Component, task.legacyContext);
   5719  }
   5720
   5721  pushFunctionComponentStackInDEV(task, Component);
   5722
   5723  {
   5724    if (Component.prototype && typeof Component.prototype.render === 'function') {
   5725      var componentName = getComponentNameFromType(Component) || 'Unknown';
   5726
   5727      if (!didWarnAboutBadClass[componentName]) {
   5728        error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);
   5729
   5730        didWarnAboutBadClass[componentName] = true;
   5731      }
   5732    }
   5733  }
   5734
   5735  var value = renderWithHooks(request, task, Component, props, legacyContext);
   5736  var hasId = checkDidRenderIdHook();
   5737
   5738  {
   5739    // Support for module components is deprecated and is removed behind a flag.
   5740    // Whether or not it would crash later, we want to show a good message in DEV first.
   5741    if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
   5742      var _componentName = getComponentNameFromType(Component) || 'Unknown';
   5743
   5744      if (!didWarnAboutModulePatternComponent[_componentName]) {
   5745        error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);
   5746
   5747        didWarnAboutModulePatternComponent[_componentName] = true;
   5748      }
   5749    }
   5750  }
   5751
   5752  if ( // Run these checks in production only if the flag is off.
   5753  // Eventually we'll delete this branch altogether.
   5754   typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
   5755    {
   5756      var _componentName2 = getComponentNameFromType(Component) || 'Unknown';
   5757
   5758      if (!didWarnAboutModulePatternComponent[_componentName2]) {
   5759        error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName2, _componentName2, _componentName2);
   5760
   5761        didWarnAboutModulePatternComponent[_componentName2] = true;
   5762      }
   5763    }
   5764
   5765    mountClassInstance(value, Component, props, legacyContext);
   5766    finishClassComponent(request, task, value, Component, props);
   5767  } else {
   5768
   5769    {
   5770      validateFunctionComponentInDev(Component);
   5771    } // We're now successfully past this task, and we don't have to pop back to
   5772    // the previous task every again, so we can use the destructive recursive form.
   5773
   5774
   5775    if (hasId) {
   5776      // This component materialized an id. We treat this as its own level, with
   5777      // a single "child" slot.
   5778      var prevTreeContext = task.treeContext;
   5779      var totalChildren = 1;
   5780      var index = 0;
   5781      task.treeContext = pushTreeContext(prevTreeContext, totalChildren, index);
   5782
   5783      try {
   5784        renderNodeDestructive(request, task, value);
   5785      } finally {
   5786        task.treeContext = prevTreeContext;
   5787      }
   5788    } else {
   5789      renderNodeDestructive(request, task, value);
   5790    }
   5791  }
   5792
   5793  popComponentStackInDEV(task);
   5794}
   5795
   5796function validateFunctionComponentInDev(Component) {
   5797  {
   5798    if (Component) {
   5799      if (Component.childContextTypes) {
   5800        error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');
   5801      }
   5802    }
   5803
   5804    if (typeof Component.getDerivedStateFromProps === 'function') {
   5805      var _componentName3 = getComponentNameFromType(Component) || 'Unknown';
   5806
   5807      if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) {
   5808        error('%s: Function components do not support getDerivedStateFromProps.', _componentName3);
   5809
   5810        didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true;
   5811      }
   5812    }
   5813
   5814    if (typeof Component.contextType === 'object' && Component.contextType !== null) {
   5815      var _componentName4 = getComponentNameFromType(Component) || 'Unknown';
   5816
   5817      if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) {
   5818        error('%s: Function components do not support contextType.', _componentName4);
   5819
   5820        didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true;
   5821      }
   5822    }
   5823  }
   5824}
   5825
   5826function resolveDefaultProps(Component, baseProps) {
   5827  if (Component && Component.defaultProps) {
   5828    // Resolve default props. Taken from ReactElement
   5829    var props = assign({}, baseProps);
   5830    var defaultProps = Component.defaultProps;
   5831
   5832    for (var propName in defaultProps) {
   5833      if (props[propName] === undefined) {
   5834        props[propName] = defaultProps[propName];
   5835      }
   5836    }
   5837
   5838    return props;
   5839  }
   5840
   5841  return baseProps;
   5842}
   5843
   5844function renderForwardRef(request, task, type, props, ref) {
   5845  pushFunctionComponentStackInDEV(task, type.render);
   5846  var children = renderWithHooks(request, task, type.render, props, ref);
   5847  var hasId = checkDidRenderIdHook();
   5848
   5849  if (hasId) {
   5850    // This component materialized an id. We treat this as its own level, with
   5851    // a single "child" slot.
   5852    var prevTreeContext = task.treeContext;
   5853    var totalChildren = 1;
   5854    var index = 0;
   5855    task.treeContext = pushTreeContext(prevTreeContext, totalChildren, index);
   5856
   5857    try {
   5858      renderNodeDestructive(request, task, children);
   5859    } finally {
   5860      task.treeContext = prevTreeContext;
   5861    }
   5862  } else {
   5863    renderNodeDestructive(request, task, children);
   5864  }
   5865
   5866  popComponentStackInDEV(task);
   5867}
   5868
   5869function renderMemo(request, task, type, props, ref) {
   5870  var innerType = type.type;
   5871  var resolvedProps = resolveDefaultProps(innerType, props);
   5872  renderElement(request, task, innerType, resolvedProps, ref);
   5873}
   5874
   5875function renderContextConsumer(request, task, context, props) {
   5876  // The logic below for Context differs depending on PROD or DEV mode. In
   5877  // DEV mode, we create a separate object for Context.Consumer that acts
   5878  // like a proxy to Context. This proxy object adds unnecessary code in PROD
   5879  // so we use the old behaviour (Context.Consumer references Context) to
   5880  // reduce size and overhead. The separate object references context via
   5881  // a property called "_context", which also gives us the ability to check
   5882  // in DEV mode if this property exists or not and warn if it does not.
   5883  {
   5884    if (context._context === undefined) {
   5885      // This may be because it's a Context (rather than a Consumer).
   5886      // Or it may be because it's older React where they're the same thing.
   5887      // We only want to warn if we're sure it's a new React.
   5888      if (context !== context.Consumer) {
   5889        if (!hasWarnedAboutUsingContextAsConsumer) {
   5890          hasWarnedAboutUsingContextAsConsumer = true;
   5891
   5892          error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
   5893        }
   5894      }
   5895    } else {
   5896      context = context._context;
   5897    }
   5898  }
   5899
   5900  var render = props.children;
   5901
   5902  {
   5903    if (typeof render !== 'function') {
   5904      error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');
   5905    }
   5906  }
   5907
   5908  var newValue = readContext(context);
   5909  var newChildren = render(newValue);
   5910  renderNodeDestructive(request, task, newChildren);
   5911}
   5912
   5913function renderContextProvider(request, task, type, props) {
   5914  var context = type._context;
   5915  var value = props.value;
   5916  var children = props.children;
   5917  var prevSnapshot;
   5918
   5919  {
   5920    prevSnapshot = task.context;
   5921  }
   5922
   5923  task.context = pushProvider(context, value);
   5924  renderNodeDestructive(request, task, children);
   5925  task.context = popProvider(context);
   5926
   5927  {
   5928    if (prevSnapshot !== task.context) {
   5929      error('Popping the context provider did not return back to the original snapshot. This is a bug in React.');
   5930    }
   5931  }
   5932}
   5933
   5934function renderLazyComponent(request, task, lazyComponent, props, ref) {
   5935  pushBuiltInComponentStackInDEV(task, 'Lazy');
   5936  var payload = lazyComponent._payload;
   5937  var init = lazyComponent._init;
   5938  var Component = init(payload);
   5939  var resolvedProps = resolveDefaultProps(Component, props);
   5940  renderElement(request, task, Component, resolvedProps, ref);
   5941  popComponentStackInDEV(task);
   5942}
   5943
   5944function renderElement(request, task, type, props, ref) {
   5945  if (typeof type === 'function') {
   5946    if (shouldConstruct$1(type)) {
   5947      renderClassComponent(request, task, type, props);
   5948      return;
   5949    } else {
   5950      renderIndeterminateComponent(request, task, type, props);
   5951      return;
   5952    }
   5953  }
   5954
   5955  if (typeof type === 'string') {
   5956    renderHostElement(request, task, type, props);
   5957    return;
   5958  }
   5959
   5960  switch (type) {
   5961    // TODO: LegacyHidden acts the same as a fragment. This only works
   5962    // because we currently assume that every instance of LegacyHidden is
   5963    // accompanied by a host component wrapper. In the hidden mode, the host
   5964    // component is given a `hidden` attribute, which ensures that the
   5965    // initial HTML is not visible. To support the use of LegacyHidden as a
   5966    // true fragment, without an extra DOM node, we would have to hide the
   5967    // initial HTML in some other way.
   5968    // TODO: Add REACT_OFFSCREEN_TYPE here too with the same capability.
   5969    case REACT_LEGACY_HIDDEN_TYPE:
   5970    case REACT_DEBUG_TRACING_MODE_TYPE:
   5971    case REACT_STRICT_MODE_TYPE:
   5972    case REACT_PROFILER_TYPE:
   5973    case REACT_FRAGMENT_TYPE:
   5974      {
   5975        renderNodeDestructive(request, task, props.children);
   5976        return;
   5977      }
   5978
   5979    case REACT_SUSPENSE_LIST_TYPE:
   5980      {
   5981        pushBuiltInComponentStackInDEV(task, 'SuspenseList'); // TODO: SuspenseList should control the boundaries.
   5982
   5983        renderNodeDestructive(request, task, props.children);
   5984        popComponentStackInDEV(task);
   5985        return;
   5986      }
   5987
   5988    case REACT_SCOPE_TYPE:
   5989      {
   5990
   5991        throw new Error('ReactDOMServer does not yet support scope components.');
   5992      }
   5993    // eslint-disable-next-line-no-fallthrough
   5994
   5995    case REACT_SUSPENSE_TYPE:
   5996      {
   5997        {
   5998          renderSuspenseBoundary(request, task, props);
   5999        }
   6000
   6001        return;
   6002      }
   6003  }
   6004
   6005  if (typeof type === 'object' && type !== null) {
   6006    switch (type.$$typeof) {
   6007      case REACT_FORWARD_REF_TYPE:
   6008        {
   6009          renderForwardRef(request, task, type, props, ref);
   6010          return;
   6011        }
   6012
   6013      case REACT_MEMO_TYPE:
   6014        {
   6015          renderMemo(request, task, type, props, ref);
   6016          return;
   6017        }
   6018
   6019      case REACT_PROVIDER_TYPE:
   6020        {
   6021          renderContextProvider(request, task, type, props);
   6022          return;
   6023        }
   6024
   6025      case REACT_CONTEXT_TYPE:
   6026        {
   6027          renderContextConsumer(request, task, type, props);
   6028          return;
   6029        }
   6030
   6031      case REACT_LAZY_TYPE:
   6032        {
   6033          renderLazyComponent(request, task, type, props);
   6034          return;
   6035        }
   6036    }
   6037  }
   6038
   6039  var info = '';
   6040
   6041  {
   6042    if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
   6043      info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.';
   6044    }
   6045  }
   6046
   6047  throw new Error('Element type is invalid: expected a string (for built-in ' + 'components) or a class/function (for composite components) ' + ("but got: " + (type == null ? type : typeof type) + "." + info));
   6048}
   6049
   6050function validateIterable(iterable, iteratorFn) {
   6051  {
   6052    // We don't support rendering Generators because it's a mutation.
   6053    // See https://github.com/facebook/react/issues/12995
   6054    if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
   6055    iterable[Symbol.toStringTag] === 'Generator') {
   6056      if (!didWarnAboutGenerators) {
   6057        error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');
   6058      }
   6059
   6060      didWarnAboutGenerators = true;
   6061    } // Warn about using Maps as children
   6062
   6063
   6064    if (iterable.entries === iteratorFn) {
   6065      if (!didWarnAboutMaps) {
   6066        error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
   6067      }
   6068
   6069      didWarnAboutMaps = true;
   6070    }
   6071  }
   6072}
   6073
   6074function renderNodeDestructive(request, task, node) {
   6075  {
   6076    // In Dev we wrap renderNodeDestructiveImpl in a try / catch so we can capture
   6077    // a component stack at the right place in the tree. We don't do this in renderNode
   6078    // becuase it is not called at every layer of the tree and we may lose frames
   6079    try {
   6080      return renderNodeDestructiveImpl(request, task, node);
   6081    } catch (x) {
   6082      if (typeof x === 'object' && x !== null && typeof x.then === 'function') ; else {
   6083        // This is an error, stash the component stack if it is null.
   6084        lastBoundaryErrorComponentStackDev = lastBoundaryErrorComponentStackDev !== null ? lastBoundaryErrorComponentStackDev : getCurrentStackInDEV();
   6085      } // rethrow so normal suspense logic can handle thrown value accordingly
   6086
   6087
   6088      throw x;
   6089    }
   6090  }
   6091} // This function by it self renders a node and consumes the task by mutating it
   6092// to update the current execution state.
   6093
   6094
   6095function renderNodeDestructiveImpl(request, task, node) {
   6096  // Stash the node we're working on. We'll pick up from this task in case
   6097  // something suspends.
   6098  task.node = node; // Handle object types
   6099
   6100  if (typeof node === 'object' && node !== null) {
   6101    switch (node.$$typeof) {
   6102      case REACT_ELEMENT_TYPE:
   6103        {
   6104          var element = node;
   6105          var type = element.type;
   6106          var props = element.props;
   6107          var ref = element.ref;
   6108          renderElement(request, task, type, props, ref);
   6109          return;
   6110        }
   6111
   6112      case REACT_PORTAL_TYPE:
   6113        throw new Error('Portals are not currently supported by the server renderer. ' + 'Render them conditionally so that they only appear on the client render.');
   6114      // eslint-disable-next-line-no-fallthrough
   6115
   6116      case REACT_LAZY_TYPE:
   6117        {
   6118          var lazyNode = node;
   6119          var payload = lazyNode._payload;
   6120          var init = lazyNode._init;
   6121          var resolvedNode;
   6122
   6123          {
   6124            try {
   6125              resolvedNode = init(payload);
   6126            } catch (x) {
   6127              if (typeof x === 'object' && x !== null && typeof x.then === 'function') {
   6128                // this Lazy initializer is suspending. push a temporary frame onto the stack so it can be
   6129                // popped off in spawnNewSuspendedTask. This aligns stack behavior between Lazy in element position
   6130                // vs Component position. We do not want the frame for Errors so we exclusively do this in
   6131                // the wakeable branch
   6132                pushBuiltInComponentStackInDEV(task, 'Lazy');
   6133              }
   6134
   6135              throw x;
   6136            }
   6137          }
   6138
   6139          renderNodeDestructive(request, task, resolvedNode);
   6140          return;
   6141        }
   6142    }
   6143
   6144    if (isArray(node)) {
   6145      renderChildrenArray(request, task, node);
   6146      return;
   6147    }
   6148
   6149    var iteratorFn = getIteratorFn(node);
   6150
   6151    if (iteratorFn) {
   6152      {
   6153        validateIterable(node, iteratorFn);
   6154      }
   6155
   6156      var iterator = iteratorFn.call(node);
   6157
   6158      if (iterator) {
   6159        // We need to know how many total children are in this set, so that we
   6160        // can allocate enough id slots to acommodate them. So we must exhaust
   6161        // the iterator before we start recursively rendering the children.
   6162        // TODO: This is not great but I think it's inherent to the id
   6163        // generation algorithm.
   6164        var step = iterator.next(); // If there are not entries, we need to push an empty so we start by checking that.
   6165
   6166        if (!step.done) {
   6167          var children = [];
   6168
   6169          do {
   6170            children.push(step.value);
   6171            step = iterator.next();
   6172          } while (!step.done);
   6173
   6174          renderChildrenArray(request, task, children);
   6175          return;
   6176        }
   6177
   6178        return;
   6179      }
   6180    }
   6181
   6182    var childString = Object.prototype.toString.call(node);
   6183    throw new Error("Objects are not valid as a React child (found: " + (childString === '[object Object]' ? 'object with keys {' + Object.keys(node).join(', ') + '}' : childString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.');
   6184  }
   6185
   6186  if (typeof node === 'string') {
   6187    var segment = task.blockedSegment;
   6188    segment.lastPushedText = pushTextInstance$1(task.blockedSegment.chunks, node, request.responseState, segment.lastPushedText);
   6189    return;
   6190  }
   6191
   6192  if (typeof node === 'number') {
   6193    var _segment = task.blockedSegment;
   6194    _segment.lastPushedText = pushTextInstance$1(task.blockedSegment.chunks, '' + node, request.responseState, _segment.lastPushedText);
   6195    return;
   6196  }
   6197
   6198  {
   6199    if (typeof node === 'function') {
   6200      error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');
   6201    }
   6202  }
   6203}
   6204
   6205function renderChildrenArray(request, task, children) {
   6206  var totalChildren = children.length;
   6207
   6208  for (var i = 0; i < totalChildren; i++) {
   6209    var prevTreeContext = task.treeContext;
   6210    task.treeContext = pushTreeContext(prevTreeContext, totalChildren, i);
   6211
   6212    try {
   6213      // We need to use the non-destructive form so that we can safely pop back
   6214      // up and render the sibling if something suspends.
   6215      renderNode(request, task, children[i]);
   6216    } finally {
   6217      task.treeContext = prevTreeContext;
   6218    }
   6219  }
   6220}
   6221
   6222function spawnNewSuspendedTask(request, task, x) {
   6223  // Something suspended, we'll need to create a new segment and resolve it later.
   6224  var segment = task.blockedSegment;
   6225  var insertionIndex = segment.chunks.length;
   6226  var newSegment = createPendingSegment(request, insertionIndex, null, segment.formatContext, // Adopt the parent segment's leading text embed
   6227  segment.lastPushedText, // Assume we are text embedded at the trailing edge
   6228  true);
   6229  segment.children.push(newSegment); // Reset lastPushedText for current Segment since the new Segment "consumed" it
   6230
   6231  segment.lastPushedText = false;
   6232  var newTask = createTask(request, task.node, task.blockedBoundary, newSegment, task.abortSet, task.legacyContext, task.context, task.treeContext);
   6233
   6234  {
   6235    if (task.componentStack !== null) {
   6236      // We pop one task off the stack because the node that suspended will be tried again,
   6237      // which will add it back onto the stack.
   6238      newTask.componentStack = task.componentStack.parent;
   6239    }
   6240  }
   6241
   6242  var ping = newTask.ping;
   6243  x.then(ping, ping);
   6244} // This is a non-destructive form of rendering a node. If it suspends it spawns
   6245// a new task and restores the context of this task to what it was before.
   6246
   6247
   6248function renderNode(request, task, node) {
   6249  // TODO: Store segment.children.length here and reset it in case something
   6250  // suspended partially through writing something.
   6251  // Snapshot the current context in case something throws to interrupt the
   6252  // process.
   6253  var previousFormatContext = task.blockedSegment.formatContext;
   6254  var previousLegacyContext = task.legacyContext;
   6255  var previousContext = task.context;
   6256  var previousComponentStack = null;
   6257
   6258  {
   6259    previousComponentStack = task.componentStack;
   6260  }
   6261
   6262  try {
   6263    return renderNodeDestructive(request, task, node);
   6264  } catch (x) {
   6265    resetHooksState();
   6266
   6267    if (typeof x === 'object' && x !== null && typeof x.then === 'function') {
   6268      spawnNewSuspendedTask(request, task, x); // Restore the context. We assume that this will be restored by the inner
   6269      // functions in case nothing throws so we don't use "finally" here.
   6270
   6271      task.blockedSegment.formatContext = previousFormatContext;
   6272      task.legacyContext = previousLegacyContext;
   6273      task.context = previousContext; // Restore all active ReactContexts to what they were before.
   6274
   6275      switchContext(previousContext);
   6276
   6277      {
   6278        task.componentStack = previousComponentStack;
   6279      }
   6280
   6281      return;
   6282    } else {
   6283      // Restore the context. We assume that this will be restored by the inner
   6284      // functions in case nothing throws so we don't use "finally" here.
   6285      task.blockedSegment.formatContext = previousFormatContext;
   6286      task.legacyContext = previousLegacyContext;
   6287      task.context = previousContext; // Restore all active ReactContexts to what they were before.
   6288
   6289      switchContext(previousContext);
   6290
   6291      {
   6292        task.componentStack = previousComponentStack;
   6293      } // We assume that we don't need the correct context.
   6294      // Let's terminate the rest of the tree and don't render any siblings.
   6295
   6296
   6297      throw x;
   6298    }
   6299  }
   6300}
   6301
   6302function erroredTask(request, boundary, segment, error) {
   6303  // Report the error to a global handler.
   6304  var errorDigest = logRecoverableError(request, error);
   6305
   6306  if (boundary === null) {
   6307    fatalError(request, error);
   6308  } else {
   6309    boundary.pendingTasks--;
   6310
   6311    if (!boundary.forceClientRender) {
   6312      boundary.forceClientRender = true;
   6313      boundary.errorDigest = errorDigest;
   6314
   6315      {
   6316        captureBoundaryErrorDetailsDev(boundary, error);
   6317      } // Regardless of what happens next, this boundary won't be displayed,
   6318      // so we can flush it, if the parent already flushed.
   6319
   6320
   6321      if (boundary.parentFlushed) {
   6322        // We don't have a preference where in the queue this goes since it's likely
   6323        // to error on the client anyway. However, intentionally client-rendered
   6324        // boundaries should be flushed earlier so that they can start on the client.
   6325        // We reuse the same queue for errors.
   6326        request.clientRenderedBoundaries.push(boundary);
   6327      }
   6328    }
   6329  }
   6330
   6331  request.allPendingTasks--;
   6332
   6333  if (request.allPendingTasks === 0) {
   6334    var onAllReady = request.onAllReady;
   6335    onAllReady();
   6336  }
   6337}
   6338
   6339function abortTaskSoft(task) {
   6340  // This aborts task without aborting the parent boundary that it blocks.
   6341  // It's used for when we didn't need this task to complete the tree.
   6342  // If task was needed, then it should use abortTask instead.
   6343  var request = this;
   6344  var boundary = task.blockedBoundary;
   6345  var segment = task.blockedSegment;
   6346  segment.status = ABORTED;
   6347  finishedTask(request, boundary, segment);
   6348}
   6349
   6350function abortTask(task, request, reason) {
   6351  // This aborts the task and aborts the parent that it blocks, putting it into
   6352  // client rendered mode.
   6353  var boundary = task.blockedBoundary;
   6354  var segment = task.blockedSegment;
   6355  segment.status = ABORTED;
   6356
   6357  if (boundary === null) {
   6358    request.allPendingTasks--; // We didn't complete the root so we have nothing to show. We can close
   6359    // the request;
   6360
   6361    if (request.status !== CLOSED) {
   6362      request.status = CLOSED;
   6363
   6364      if (request.destination !== null) {
   6365        close(request.destination);
   6366      }
   6367    }
   6368  } else {
   6369    boundary.pendingTasks--;
   6370
   6371    if (!boundary.forceClientRender) {
   6372      boundary.forceClientRender = true;
   6373
   6374      var _error = reason === undefined ? new Error('The render was aborted by the server without a reason.') : reason;
   6375
   6376      boundary.errorDigest = request.onError(_error);
   6377
   6378      {
   6379        var errorPrefix = 'The server did not finish this Suspense boundary: ';
   6380
   6381        if (_error && typeof _error.message === 'string') {
   6382          _error = errorPrefix + _error.message;
   6383        } else {
   6384          // eslint-disable-next-line react-internal/safe-string-coercion
   6385          _error = errorPrefix + String(_error);
   6386        }
   6387
   6388        var previousTaskInDev = currentTaskInDEV;
   6389        currentTaskInDEV = task;
   6390
   6391        try {
   6392          captureBoundaryErrorDetailsDev(boundary, _error);
   6393        } finally {
   6394          currentTaskInDEV = previousTaskInDev;
   6395        }
   6396      }
   6397
   6398      if (boundary.parentFlushed) {
   6399        request.clientRenderedBoundaries.push(boundary);
   6400      }
   6401    } // If this boundary was still pending then we haven't already cancelled its fallbacks.
   6402    // We'll need to abort the fallbacks, which will also error that parent boundary.
   6403
   6404
   6405    boundary.fallbackAbortableTasks.forEach(function (fallbackTask) {
   6406      return abortTask(fallbackTask, request, reason);
   6407    });
   6408    boundary.fallbackAbortableTasks.clear();
   6409    request.allPendingTasks--;
   6410
   6411    if (request.allPendingTasks === 0) {
   6412      var onAllReady = request.onAllReady;
   6413      onAllReady();
   6414    }
   6415  }
   6416}
   6417
   6418function queueCompletedSegment(boundary, segment) {
   6419  if (segment.chunks.length === 0 && segment.children.length === 1 && segment.children[0].boundary === null) {
   6420    // This is an empty segment. There's nothing to write, so we can instead transfer the ID
   6421    // to the child. That way any existing references point to the child.
   6422    var childSegment = segment.children[0];
   6423    childSegment.id = segment.id;
   6424    childSegment.parentFlushed = true;
   6425
   6426    if (childSegment.status === COMPLETED) {
   6427      queueCompletedSegment(boundary, childSegment);
   6428    }
   6429  } else {
   6430    var completedSegments = boundary.completedSegments;
   6431    completedSegments.push(segment);
   6432  }
   6433}
   6434
   6435function finishedTask(request, boundary, segment) {
   6436  if (boundary === null) {
   6437    if (segment.parentFlushed) {
   6438      if (request.completedRootSegment !== null) {
   6439        throw new Error('There can only be one root segment. This is a bug in React.');
   6440      }
   6441
   6442      request.completedRootSegment = segment;
   6443    }
   6444
   6445    request.pendingRootTasks--;
   6446
   6447    if (request.pendingRootTasks === 0) {
   6448      // We have completed the shell so the shell can't error anymore.
   6449      request.onShellError = noop$1;
   6450      var onShellReady = request.onShellReady;
   6451      onShellReady();
   6452    }
   6453  } else {
   6454    boundary.pendingTasks--;
   6455
   6456    if (boundary.forceClientRender) ; else if (boundary.pendingTasks === 0) {
   6457      // This must have been the last segment we were waiting on. This boundary is now complete.
   6458      if (segment.parentFlushed) {
   6459        // Our parent segment already flushed, so we need to schedule this segment to be emitted.
   6460        // If it is a segment that was aborted, we'll write other content instead so we don't need
   6461        // to emit it.
   6462        if (segment.status === COMPLETED) {
   6463          queueCompletedSegment(boundary, segment);
   6464        }
   6465      }
   6466
   6467      if (boundary.parentFlushed) {
   6468        // The segment might be part of a segment that didn't flush yet, but if the boundary's
   6469        // parent flushed, we need to schedule the boundary to be emitted.
   6470        request.completedBoundaries.push(boundary);
   6471      } // We can now cancel any pending task on the fallback since we won't need to show it anymore.
   6472      // This needs to happen after we read the parentFlushed flags because aborting can finish
   6473      // work which can trigger user code, which can start flushing, which can change those flags.
   6474
   6475
   6476      boundary.fallbackAbortableTasks.forEach(abortTaskSoft, request);
   6477      boundary.fallbackAbortableTasks.clear();
   6478    } else {
   6479      if (segment.parentFlushed) {
   6480        // Our parent already flushed, so we need to schedule this segment to be emitted.
   6481        // If it is a segment that was aborted, we'll write other content instead so we don't need
   6482        // to emit it.
   6483        if (segment.status === COMPLETED) {
   6484          queueCompletedSegment(boundary, segment);
   6485          var completedSegments = boundary.completedSegments;
   6486
   6487          if (completedSegments.length === 1) {
   6488            // This is the first time since we last flushed that we completed anything.
   6489            // We can schedule this boundary to emit its partially completed segments early
   6490            // in case the parent has already been flushed.
   6491            if (boundary.parentFlushed) {
   6492              request.partialBoundaries.push(boundary);
   6493            }
   6494          }
   6495        }
   6496      }
   6497    }
   6498  }
   6499
   6500  request.allPendingTasks--;
   6501
   6502  if (request.allPendingTasks === 0) {
   6503    // This needs to be called at the very end so that we can synchronously write the result
   6504    // in the callback if needed.
   6505    var onAllReady = request.onAllReady;
   6506    onAllReady();
   6507  }
   6508}
   6509
   6510function retryTask(request, task) {
   6511  var segment = task.blockedSegment;
   6512
   6513  if (segment.status !== PENDING) {
   6514    // We completed this by other means before we had a chance to retry it.
   6515    return;
   6516  } // We restore the context to what it was when we suspended.
   6517  // We don't restore it after we leave because it's likely that we'll end up
   6518  // needing a very similar context soon again.
   6519
   6520
   6521  switchContext(task.context);
   6522  var prevTaskInDEV = null;
   6523
   6524  {
   6525    prevTaskInDEV = currentTaskInDEV;
   6526    currentTaskInDEV = task;
   6527  }
   6528
   6529  try {
   6530    // We call the destructive form that mutates this task. That way if something
   6531    // suspends again, we can reuse the same task instead of spawning a new one.
   6532    renderNodeDestructive(request, task, task.node);
   6533    pushSegmentFinale$1(segment.chunks, request.responseState, segment.lastPushedText, segment.textEmbedded);
   6534    task.abortSet.delete(task);
   6535    segment.status = COMPLETED;
   6536    finishedTask(request, task.blockedBoundary, segment);
   6537  } catch (x) {
   6538    resetHooksState();
   6539
   6540    if (typeof x === 'object' && x !== null && typeof x.then === 'function') {
   6541      // Something suspended again, let's pick it back up later.
   6542      var ping = task.ping;
   6543      x.then(ping, ping);
   6544    } else {
   6545      task.abortSet.delete(task);
   6546      segment.status = ERRORED;
   6547      erroredTask(request, task.blockedBoundary, segment, x);
   6548    }
   6549  } finally {
   6550    {
   6551      currentTaskInDEV = prevTaskInDEV;
   6552    }
   6553  }
   6554}
   6555
   6556function performWork(request) {
   6557  if (request.status === CLOSED) {
   6558    return;
   6559  }
   6560
   6561  var prevContext = getActiveContext();
   6562  var prevDispatcher = ReactCurrentDispatcher$1.current;
   6563  ReactCurrentDispatcher$1.current = Dispatcher;
   6564  var prevGetCurrentStackImpl;
   6565
   6566  {
   6567    prevGetCurrentStackImpl = ReactDebugCurrentFrame$1.getCurrentStack;
   6568    ReactDebugCurrentFrame$1.getCurrentStack = getCurrentStackInDEV;
   6569  }
   6570
   6571  var prevResponseState = currentResponseState;
   6572  setCurrentResponseState(request.responseState);
   6573
   6574  try {
   6575    var pingedTasks = request.pingedTasks;
   6576    var i;
   6577
   6578    for (i = 0; i < pingedTasks.length; i++) {
   6579      var task = pingedTasks[i];
   6580      retryTask(request, task);
   6581    }
   6582
   6583    pingedTasks.splice(0, i);
   6584
   6585    if (request.destination !== null) {
   6586      flushCompletedQueues(request, request.destination);
   6587    }
   6588  } catch (error) {
   6589    logRecoverableError(request, error);
   6590    fatalError(request, error);
   6591  } finally {
   6592    setCurrentResponseState(prevResponseState);
   6593    ReactCurrentDispatcher$1.current = prevDispatcher;
   6594
   6595    {
   6596      ReactDebugCurrentFrame$1.getCurrentStack = prevGetCurrentStackImpl;
   6597    }
   6598
   6599    if (prevDispatcher === Dispatcher) {
   6600      // This means that we were in a reentrant work loop. This could happen
   6601      // in a renderer that supports synchronous work like renderToString,
   6602      // when it's called from within another renderer.
   6603      // Normally we don't bother switching the contexts to their root/default
   6604      // values when leaving because we'll likely need the same or similar
   6605      // context again. However, when we're inside a synchronous loop like this
   6606      // we'll to restore the context to what it was before returning.
   6607      switchContext(prevContext);
   6608    }
   6609  }
   6610}
   6611
   6612function flushSubtree(request, destination, segment) {
   6613  segment.parentFlushed = true;
   6614
   6615  switch (segment.status) {
   6616    case PENDING:
   6617      {
   6618        // We're emitting a placeholder for this segment to be filled in later.
   6619        // Therefore we'll need to assign it an ID - to refer to it by.
   6620        var segmentID = segment.id = request.nextSegmentId++; // When this segment finally completes it won't be embedded in text since it will flush separately
   6621
   6622        segment.lastPushedText = false;
   6623        segment.textEmbedded = false;
   6624        return writePlaceholder(destination, request.responseState, segmentID);
   6625      }
   6626
   6627    case COMPLETED:
   6628      {
   6629        segment.status = FLUSHED;
   6630        var r = true;
   6631        var chunks = segment.chunks;
   6632        var chunkIdx = 0;
   6633        var children = segment.children;
   6634
   6635        for (var childIdx = 0; childIdx < children.length; childIdx++) {
   6636          var nextChild = children[childIdx]; // Write all the chunks up until the next child.
   6637
   6638          for (; chunkIdx < nextChild.index; chunkIdx++) {
   6639            writeChunk(destination, chunks[chunkIdx]);
   6640          }
   6641
   6642          r = flushSegment(request, destination, nextChild);
   6643        } // Finally just write all the remaining chunks
   6644
   6645
   6646        for (; chunkIdx < chunks.length - 1; chunkIdx++) {
   6647          writeChunk(destination, chunks[chunkIdx]);
   6648        }
   6649
   6650        if (chunkIdx < chunks.length) {
   6651          r = writeChunkAndReturn(destination, chunks[chunkIdx]);
   6652        }
   6653
   6654        return r;
   6655      }
   6656
   6657    default:
   6658      {
   6659        throw new Error('Aborted, errored or already flushed boundaries should not be flushed again. This is a bug in React.');
   6660      }
   6661  }
   6662}
   6663
   6664function flushSegment(request, destination, segment) {
   6665  var boundary = segment.boundary;
   6666
   6667  if (boundary === null) {
   6668    // Not a suspense boundary.
   6669    return flushSubtree(request, destination, segment);
   6670  }
   6671
   6672  boundary.parentFlushed = true; // This segment is a Suspense boundary. We need to decide whether to
   6673  // emit the content or the fallback now.
   6674
   6675  if (boundary.forceClientRender) {
   6676    // Emit a client rendered suspense boundary wrapper.
   6677    // We never queue the inner boundary so we'll never emit its content or partial segments.
   6678    writeStartClientRenderedSuspenseBoundary$1(destination, request.responseState, boundary.errorDigest, boundary.errorMessage, boundary.errorComponentStack); // Flush the fallback.
   6679
   6680    flushSubtree(request, destination, segment);
   6681    return writeEndClientRenderedSuspenseBoundary$1(destination, request.responseState);
   6682  } else if (boundary.pendingTasks > 0) {
   6683    // This boundary is still loading. Emit a pending suspense boundary wrapper.
   6684    // Assign an ID to refer to the future content by.
   6685    boundary.rootSegmentID = request.nextSegmentId++;
   6686
   6687    if (boundary.completedSegments.length > 0) {
   6688      // If this is at least partially complete, we can queue it to be partially emitted early.
   6689      request.partialBoundaries.push(boundary);
   6690    } /// This is the first time we should have referenced this ID.
   6691
   6692
   6693    var id = boundary.id = assignSuspenseBoundaryID(request.responseState);
   6694    writeStartPendingSuspenseBoundary(destination, request.responseState, id); // Flush the fallback.
   6695
   6696    flushSubtree(request, destination, segment);
   6697    return writeEndPendingSuspenseBoundary(destination, request.responseState);
   6698  } else if (boundary.byteSize > request.progressiveChunkSize) {
   6699    // This boundary is large and will be emitted separately so that we can progressively show
   6700    // other content. We add it to the queue during the flush because we have to ensure that
   6701    // the parent flushes first so that there's something to inject it into.
   6702    // We also have to make sure that it's emitted into the queue in a deterministic slot.
   6703    // I.e. we can't insert it here when it completes.
   6704    // Assign an ID to refer to the future content by.
   6705    boundary.rootSegmentID = request.nextSegmentId++;
   6706    request.completedBoundaries.push(boundary); // Emit a pending rendered suspense boundary wrapper.
   6707
   6708    writeStartPendingSuspenseBoundary(destination, request.responseState, boundary.id); // Flush the fallback.
   6709
   6710    flushSubtree(request, destination, segment);
   6711    return writeEndPendingSuspenseBoundary(destination, request.responseState);
   6712  } else {
   6713    // We can inline this boundary's content as a complete boundary.
   6714    writeStartCompletedSuspenseBoundary$1(destination, request.responseState);
   6715    var completedSegments = boundary.completedSegments;
   6716
   6717    if (completedSegments.length !== 1) {
   6718      throw new Error('A previously unvisited boundary must have exactly one root segment. This is a bug in React.');
   6719    }
   6720
   6721    var contentSegment = completedSegments[0];
   6722    flushSegment(request, destination, contentSegment);
   6723    return writeEndCompletedSuspenseBoundary$1(destination, request.responseState);
   6724  }
   6725}
   6726
   6727function flushClientRenderedBoundary(request, destination, boundary) {
   6728  return writeClientRenderBoundaryInstruction(destination, request.responseState, boundary.id, boundary.errorDigest, boundary.errorMessage, boundary.errorComponentStack);
   6729}
   6730
   6731function flushSegmentContainer(request, destination, segment) {
   6732  writeStartSegment(destination, request.responseState, segment.formatContext, segment.id);
   6733  flushSegment(request, destination, segment);
   6734  return writeEndSegment(destination, segment.formatContext);
   6735}
   6736
   6737function flushCompletedBoundary(request, destination, boundary) {
   6738  var completedSegments = boundary.completedSegments;
   6739  var i = 0;
   6740
   6741  for (; i < completedSegments.length; i++) {
   6742    var segment = completedSegments[i];
   6743    flushPartiallyCompletedSegment(request, destination, boundary, segment);
   6744  }
   6745
   6746  completedSegments.length = 0;
   6747  return writeCompletedBoundaryInstruction(destination, request.responseState, boundary.id, boundary.rootSegmentID);
   6748}
   6749
   6750function flushPartialBoundary(request, destination, boundary) {
   6751  var completedSegments = boundary.completedSegments;
   6752  var i = 0;
   6753
   6754  for (; i < completedSegments.length; i++) {
   6755    var segment = completedSegments[i];
   6756
   6757    if (!flushPartiallyCompletedSegment(request, destination, boundary, segment)) {
   6758      i++;
   6759      completedSegments.splice(0, i); // Only write as much as the buffer wants. Something higher priority
   6760      // might want to write later.
   6761
   6762      return false;
   6763    }
   6764  }
   6765
   6766  completedSegments.splice(0, i);
   6767  return true;
   6768}
   6769
   6770function flushPartiallyCompletedSegment(request, destination, boundary, segment) {
   6771  if (segment.status === FLUSHED) {
   6772    // We've already flushed this inline.
   6773    return true;
   6774  }
   6775
   6776  var segmentID = segment.id;
   6777
   6778  if (segmentID === -1) {
   6779    // This segment wasn't previously referred to. This happens at the root of
   6780    // a boundary. We make kind of a leap here and assume this is the root.
   6781    var rootSegmentID = segment.id = boundary.rootSegmentID;
   6782
   6783    if (rootSegmentID === -1) {
   6784      throw new Error('A root segment ID must have been assigned by now. This is a bug in React.');
   6785    }
   6786
   6787    return flushSegmentContainer(request, destination, segment);
   6788  } else {
   6789    flushSegmentContainer(request, destination, segment);
   6790    return writeCompletedSegmentInstruction(destination, request.responseState, segmentID);
   6791  }
   6792}
   6793
   6794function flushCompletedQueues(request, destination) {
   6795
   6796  try {
   6797    // The structure of this is to go through each queue one by one and write
   6798    // until the sink tells us to stop. When we should stop, we still finish writing
   6799    // that item fully and then yield. At that point we remove the already completed
   6800    // items up until the point we completed them.
   6801    // TODO: Emit preloading.
   6802    // TODO: It's kind of unfortunate to keep checking this array after we've already
   6803    // emitted the root.
   6804    var completedRootSegment = request.completedRootSegment;
   6805
   6806    if (completedRootSegment !== null && request.pendingRootTasks === 0) {
   6807      flushSegment(request, destination, completedRootSegment);
   6808      request.completedRootSegment = null;
   6809      writeCompletedRoot(destination, request.responseState);
   6810    } // We emit client rendering instructions for already emitted boundaries first.
   6811    // This is so that we can signal to the client to start client rendering them as
   6812    // soon as possible.
   6813
   6814
   6815    var clientRenderedBoundaries = request.clientRenderedBoundaries;
   6816    var i;
   6817
   6818    for (i = 0; i < clientRenderedBoundaries.length; i++) {
   6819      var boundary = clientRenderedBoundaries[i];
   6820
   6821      if (!flushClientRenderedBoundary(request, destination, boundary)) {
   6822        request.destination = null;
   6823        i++;
   6824        clientRenderedBoundaries.splice(0, i);
   6825        return;
   6826      }
   6827    }
   6828
   6829    clientRenderedBoundaries.splice(0, i); // Next we emit any complete boundaries. It's better to favor boundaries
   6830    // that are completely done since we can actually show them, than it is to emit
   6831    // any individual segments from a partially complete boundary.
   6832
   6833    var completedBoundaries = request.completedBoundaries;
   6834
   6835    for (i = 0; i < completedBoundaries.length; i++) {
   6836      var _boundary = completedBoundaries[i];
   6837
   6838      if (!flushCompletedBoundary(request, destination, _boundary)) {
   6839        request.destination = null;
   6840        i++;
   6841        completedBoundaries.splice(0, i);
   6842        return;
   6843      }
   6844    }
   6845
   6846    completedBoundaries.splice(0, i); // Allow anything written so far to flush to the underlying sink before
   6847    // we continue with lower priorities.
   6848
   6849    completeWriting(destination);
   6850    beginWriting(destination); // TODO: Here we'll emit data used by hydration.
   6851    // Next we emit any segments of any boundaries that are partially complete
   6852    // but not deeply complete.
   6853
   6854    var partialBoundaries = request.partialBoundaries;
   6855
   6856    for (i = 0; i < partialBoundaries.length; i++) {
   6857      var _boundary2 = partialBoundaries[i];
   6858
   6859      if (!flushPartialBoundary(request, destination, _boundary2)) {
   6860        request.destination = null;
   6861        i++;
   6862        partialBoundaries.splice(0, i);
   6863        return;
   6864      }
   6865    }
   6866
   6867    partialBoundaries.splice(0, i); // Next we check the completed boundaries again. This may have had
   6868    // boundaries added to it in case they were too larged to be inlined.
   6869    // New ones might be added in this loop.
   6870
   6871    var largeBoundaries = request.completedBoundaries;
   6872
   6873    for (i = 0; i < largeBoundaries.length; i++) {
   6874      var _boundary3 = largeBoundaries[i];
   6875
   6876      if (!flushCompletedBoundary(request, destination, _boundary3)) {
   6877        request.destination = null;
   6878        i++;
   6879        largeBoundaries.splice(0, i);
   6880        return;
   6881      }
   6882    }
   6883
   6884    largeBoundaries.splice(0, i);
   6885  } finally {
   6886
   6887    if (request.allPendingTasks === 0 && request.pingedTasks.length === 0 && request.clientRenderedBoundaries.length === 0 && request.completedBoundaries.length === 0 // We don't need to check any partially completed segments because
   6888    // either they have pending task or they're complete.
   6889    ) {
   6890        {
   6891          if (request.abortableTasks.size !== 0) {
   6892            error('There was still abortable task at the root when we closed. This is a bug in React.');
   6893          }
   6894        } // We're done.
   6895
   6896
   6897        close(destination);
   6898      }
   6899  }
   6900}
   6901
   6902function startWork(request) {
   6903  scheduleWork(function () {
   6904    return performWork(request);
   6905  });
   6906}
   6907function startFlowing(request, destination) {
   6908  if (request.status === CLOSING) {
   6909    request.status = CLOSED;
   6910    closeWithError(destination, request.fatalError);
   6911    return;
   6912  }
   6913
   6914  if (request.status === CLOSED) {
   6915    return;
   6916  }
   6917
   6918  if (request.destination !== null) {
   6919    // We're already flowing.
   6920    return;
   6921  }
   6922
   6923  request.destination = destination;
   6924
   6925  try {
   6926    flushCompletedQueues(request, destination);
   6927  } catch (error) {
   6928    logRecoverableError(request, error);
   6929    fatalError(request, error);
   6930  }
   6931} // This is called to early terminate a request. It puts all pending boundaries in client rendered state.
   6932
   6933function abort(request, reason) {
   6934  try {
   6935    var abortableTasks = request.abortableTasks;
   6936    abortableTasks.forEach(function (task) {
   6937      return abortTask(task, request, reason);
   6938    });
   6939    abortableTasks.clear();
   6940
   6941    if (request.destination !== null) {
   6942      flushCompletedQueues(request, request.destination);
   6943    }
   6944  } catch (error) {
   6945    logRecoverableError(request, error);
   6946    fatalError(request, error);
   6947  }
   6948}
   6949
   6950function onError() {// Non-fatal errors are ignored.
   6951}
   6952
   6953function renderToStringImpl(children, options, generateStaticMarkup, abortReason) {
   6954  var didFatal = false;
   6955  var fatalError = null;
   6956  var result = '';
   6957  var destination = {
   6958    push: function (chunk) {
   6959      if (chunk !== null) {
   6960        result += chunk;
   6961      }
   6962
   6963      return true;
   6964    },
   6965    destroy: function (error) {
   6966      didFatal = true;
   6967      fatalError = error;
   6968    }
   6969  };
   6970  var readyToStream = false;
   6971
   6972  function onShellReady() {
   6973    readyToStream = true;
   6974  }
   6975
   6976  var request = createRequest(children, createResponseState$1(generateStaticMarkup, options ? options.identifierPrefix : undefined), createRootFormatContext(), Infinity, onError, undefined, onShellReady, undefined, undefined);
   6977  startWork(request); // If anything suspended and is still pending, we'll abort it before writing.
   6978  // That way we write only client-rendered boundaries from the start.
   6979
   6980  abort(request, abortReason);
   6981  startFlowing(request, destination);
   6982
   6983  if (didFatal) {
   6984    throw fatalError;
   6985  }
   6986
   6987  if (!readyToStream) {
   6988    // Note: This error message is the one we use on the client. It doesn't
   6989    // really make sense here. But this is the legacy server renderer, anyway.
   6990    // We're going to delete it soon.
   6991    throw new Error('A component suspended while responding to synchronous input. This ' + 'will cause the UI to be replaced with a loading indicator. To fix, ' + 'updates that suspend should be wrapped with startTransition.');
   6992  }
   6993
   6994  return result;
   6995}
   6996
   6997function _inheritsLoose(subClass, superClass) {
   6998  subClass.prototype = Object.create(superClass.prototype);
   6999  subClass.prototype.constructor = subClass;
   7000  subClass.__proto__ = superClass;
   7001}
   7002
   7003var ReactMarkupReadableStream = /*#__PURE__*/function (_Readable) {
   7004  _inheritsLoose(ReactMarkupReadableStream, _Readable);
   7005
   7006  function ReactMarkupReadableStream() {
   7007    var _this;
   7008
   7009    // Calls the stream.Readable(options) constructor. Consider exposing built-in
   7010    // features like highWaterMark in the future.
   7011    _this = _Readable.call(this, {}) || this;
   7012    _this.request = null;
   7013    _this.startedFlowing = false;
   7014    return _this;
   7015  }
   7016
   7017  var _proto = ReactMarkupReadableStream.prototype;
   7018
   7019  _proto._destroy = function _destroy(err, callback) {
   7020    abort(this.request); // $FlowFixMe: The type definition for the callback should allow undefined and null.
   7021
   7022    callback(err);
   7023  };
   7024
   7025  _proto._read = function _read(size) {
   7026    if (this.startedFlowing) {
   7027      startFlowing(this.request, this);
   7028    }
   7029  };
   7030
   7031  return ReactMarkupReadableStream;
   7032}(stream.Readable);
   7033
   7034function onError$1() {// Non-fatal errors are ignored.
   7035}
   7036
   7037function renderToNodeStreamImpl(children, options, generateStaticMarkup) {
   7038  function onAllReady() {
   7039    // We wait until everything has loaded before starting to write.
   7040    // That way we only end up with fully resolved HTML even if we suspend.
   7041    destination.startedFlowing = true;
   7042    startFlowing(request, destination);
   7043  }
   7044
   7045  var destination = new ReactMarkupReadableStream();
   7046  var request = createRequest(children, createResponseState$1(false, options ? options.identifierPrefix : undefined), createRootFormatContext(), Infinity, onError$1, onAllReady, undefined, undefined);
   7047  destination.request = request;
   7048  startWork(request);
   7049  return destination;
   7050}
   7051
   7052function renderToNodeStream(children, options) {
   7053  {
   7054    error('renderToNodeStream is deprecated. Use renderToPipeableStream instead.');
   7055  }
   7056
   7057  return renderToNodeStreamImpl(children, options);
   7058}
   7059
   7060function renderToStaticNodeStream(children, options) {
   7061  return renderToNodeStreamImpl(children, options);
   7062}
   7063
   7064function renderToString(children, options) {
   7065  return renderToStringImpl(children, options, false, 'The server used "renderToString" which does not support Suspense. If you intended for this Suspense boundary to render the fallback content on the server consider throwing an Error somewhere within the Suspense boundary. If you intended to have the server wait for the suspended component please switch to "renderToPipeableStream" which supports Suspense on the server');
   7066}
   7067
   7068function renderToStaticMarkup(children, options) {
   7069  return renderToStringImpl(children, options, true, 'The server used "renderToStaticMarkup" which does not support Suspense. If you intended to have the server wait for the suspended component please switch to "renderToPipeableStream" which supports Suspense on the server');
   7070}
   7071
   7072exports.renderToNodeStream = renderToNodeStream;
   7073exports.renderToStaticMarkup = renderToStaticMarkup;
   7074exports.renderToStaticNodeStream = renderToStaticNodeStream;
   7075exports.renderToString = renderToString;
   7076exports.version = ReactVersion;
   7077  })();
   7078}